def test_process(self): f = OffHour({"opt-out": True}) instances = [ instance(Tags=[]), instance(Tags=[{"Key": "maid_offhours", "Value": ""}]), instance(Tags=[{"Key": "maid_offhours", "Value": "on"}]), instance(Tags=[{"Key": "maid_offhours", "Value": "off"}]), instance( Tags=[ { "Key": "maid_offhours", "Value": "off=(m-f,5);zebrablue,on=(t-w,5)", } ] ), ] t = datetime.datetime( year=2015, month=12, day=1, hour=19, minute=5, tzinfo=tzutil.gettz("America/New_York"), ) with mock_datetime_now(t, datetime): self.assertEqual( f.process(instances), [instances[0], instances[1], instances[2]] )
def test_offhours_get_value(self): off = OffHour({"default_tz": "ct"}) i = instance(Tags=[{"Key": "maid_offhours", "Value": "Offhours tz=PT"}]) self.assertEqual(off.get_tag_value(i), "offhours tz=pt") self.assertFalse(off.parser.has_resource_schedule(off.get_tag_value(i), "off")) self.assertTrue(off.parser.keys_are_valid(off.get_tag_value(i))) self.assertEqual(off.parser.raw_data(off.get_tag_value(i)), {"tz": "pt"})
def test_validate(self): self.assertRaises( FilterValidationError, OffHour({'default_tz': 'zmta'}).validate) self.assertRaises( FilterValidationError, OffHour({'offhour': 25}).validate) i = OffHour({}) self.assertEqual(i.validate(), i)
def test_process(self): f = OffHour({"opt-out": True}) instances = [ instance(Tags=[]), instance(Tags=[{ "Key": "maid_offhours", "Value": "" }]), instance(Tags=[{ "Key": "maid_offhours", "Value": "on" }]), instance(Tags=[{ "Key": "maid_offhours", "Value": "off" }]), instance(Tags=[{ "Key": "maid_offhours", "Value": "off=(m-f,5);zebrablue,on=(t-w,5)", }]), ] t = datetime.datetime( year=2015, month=12, day=1, hour=19, minute=5, tzinfo=zoneinfo.gettz("America/New_York"), ) with mock_datetime_now(t, datetime): self.assertEqual(f.process(instances), [instances[0], instances[1], instances[2]])
def test_process(self): f = OffHour({'opt-out': True}) instances = [ instance(Tags=[]), instance(Tags=[{ 'Key': 'maid_offhours', 'Value': '' }]), instance(Tags=[{ 'Key': 'maid_offhours', 'Value': 'on' }]), instance(Tags=[{ 'Key': 'maid_offhours', 'Value': 'off' }]), instance(Tags=[{ 'Key': 'maid_offhours', 'Value': "off=(m-f,5);zebrablue,on=(t-w,5)" }]) ] t = datetime.datetime(year=2015, month=12, day=1, hour=19, minute=5, tzinfo=zoneinfo.gettz('America/New_York')) with mock_datetime_now(t, datetime): self.assertEqual(f.process(instances), [instances[0], instances[1], instances[2]])
def test_custom_bad_hours(self): t = datetime.datetime.now(zoneinfo.gettz('America/New_York')) t = t.replace(year=2016, month=5, day=26, hour=19, minute=00) # default error handling is to exclude the resource with mock_datetime_now(t, datetime): # This isn't considered a bad value, its basically omitted. i = instance(Tags=[{ 'Key': 'maid_offhours', 'Value': 'off=();tz=et' }]) self.assertEqual(OffHour({})(i), True) i = instance(Tags=[{ 'Key': 'maid_offhours', 'Value': 'off=(m-f,90);on=(m-f,7);tz=et' }]) #malformed value self.assertEqual(OffHour({})(i), False) t = t.replace(year=2016, month=5, day=26, hour=13, minute=00) with mock_datetime_now(t, datetime): i = instance(Tags=[{ 'Key': 'maid_offhours', 'Value': 'off=();tz=et' }]) #will go to default values, but not work due to default time self.assertEqual(OffHour({})(i), False) i = instance(Tags=[{ 'Key': 'maid_offhours', 'Value': 'off=(m-f,90);on=(m-f,7);tz=et' }]) self.assertEqual(OffHour({})(i), False)
def test_resource_schedule_error(self): t = datetime.datetime.now(tzutil.gettz("America/New_York")) t = t.replace(year=2015, month=12, day=1, hour=19, minute=5) f = OffHour({}) f.process_resource_schedule = lambda: False with mock_datetime_now(t, datetime): i = instance(Tags=[{"Key": "maid_offhours", "Value": "tz=est"}]) self.assertEqual(f(i), False)
def test_resource_schedule_error(self): t = datetime.datetime.now(zoneinfo.gettz('America/New_York')) t = t.replace(year=2015, month=12, day=1, hour=19, minute=5) f = OffHour({}) f.process_resource_schedule = lambda: False with mock_datetime_now(t, datetime): i = instance(Tags=[{'Key': 'maid_offhours', 'Value': 'tz=est'}]) self.assertEqual(f(i), False)
def test_resource_schedule_error(self): t = datetime.datetime.now(zoneinfo.gettz('America/New_York')) t = t.replace(year=2015, month=12, day=1, hour=19, minute=5) f = OffHour({}) f.process_resource_schedule = lambda: False with mock_datetime_now(t, datetime): i = instance(Tags=[ {'Key': 'maid_offhours', 'Value': 'tz=est'}]) self.assertEqual(f(i), False)
def test_validate(self): url_test = 's3://test-dest/holidays.csv' self.assertRaises( FilterValidationError, OffHour({'default_tz': 'zmta'}).validate) self.assertRaises( FilterValidationError, OffHour({'offhour': 25}).validate) self.assertRaises( FilterValidationError, OffHour({'skip-days': ['2017-01-01'], 'skip-days-from': {'expr': 0, 'format': 'csv', 'url': url_test}}).validate) i = OffHour({}) self.assertEqual(i.validate(), i)
def test_offhours_get_value(self): off = OffHour({'default_tz': 'ct'}) i = instance(Tags=[ {'Key': 'maid_offhours', 'Value': 'Offhours tz=PT'}]) self.assertEqual(off.get_tag_value(i), "offhours tz=pt") self.assertFalse(off.parser.has_resource_schedule( off.get_tag_value(i), 'off')) self.assertTrue(off.parser.keys_are_valid( off.get_tag_value(i))) self.assertEqual(off.parser.raw_data( off.get_tag_value(i)), {'tz': 'pt'})
def test_current_time_test(self): t = datetime.datetime.now(zoneinfo.gettz('America/New_York')) t = t.replace(year=2015, month=12, day=1, hour=19, minute=5) with mock_datetime_now(t, datetime): i = instance(Tags=[{'Key': 'maid_offhours', 'Value': 'tz=est'}]) f = OffHour({}) p = f.get_tag_value(i) self.assertEqual(p, 'tz=est') tz = f.get_tz('est') self.assertEqual(str(tz), "tzfile('America/New_York')") self.assertEqual(datetime.datetime.now(tz), t) self.assertEqual(t.hour, 19)
def test_current_time_test(self): t = datetime.datetime.now(tzutil.gettz("America/New_York")) t = t.replace(year=2015, month=12, day=1, hour=19, minute=5) with mock_datetime_now(t, datetime): i = instance(Tags=[{"Key": "maid_offhours", "Value": "tz=est"}]) f = OffHour({}) p = f.get_tag_value(i) self.assertEqual(p, "tz=est") tz = f.get_tz("est") self.assertTrue('America/New_York' in str(tz) or 'US/Eastern' in str(tz)) self.assertEqual(datetime.datetime.now(tz), t) self.assertEqual(t.hour, 19)
def test_offhours_skip(self): t = datetime.datetime(year=2015, month=12, day=1, hour=19, minute=5, tzinfo=zoneinfo.gettz('America/New_York')) with mock_datetime_now(t, datetime): i = instance(Tags=[{'Key': 'maid_offhours', 'Value': 'tz=est'}]) self.assertEqual(OffHour({})(i), True) self.assertEqual(OffHour({'skip-days': ['2015-12-01']})(i), False) self.assertEqual( OffHour({'skip-days': ['2017-01-01', '2015-12-01']})(i), False) self.assertEqual(OffHour({'skip-days': ['2015-12-02']})(i), True)
def test_current_time_test(self): t = datetime.datetime.now(zoneinfo.gettz('America/New_York')) t = t.replace(year=2015, month=12, day=1, hour=19, minute=5) with mock_datetime_now(t, datetime): i = instance(Tags=[ {'Key': 'maid_offhours', 'Value': 'tz=est'}]) f = OffHour({}) p = f.get_tag_value(i) self.assertEqual(p, 'tz=est') tz = f.get_tz('est') self.assertEqual(str(tz), "tzfile('America/New_York')") self.assertEqual( datetime.datetime.now(tz), t) self.assertEqual(t.hour, 19)
def test_current_time_test(self): t = datetime.datetime.now(tzutil.gettz("America/New_York")) t = t.replace(year=2015, month=12, day=1, hour=19, minute=5) with mock_datetime_now(t, datetime): i = instance(Tags=[{"Key": "maid_offhours", "Value": "tz=est"}]) f = OffHour({}) p = f.get_tag_value(i) self.assertEqual(p, "tz=est") tz = f.get_tz("est") self.assertTrue( 'America/New_York' in str(tz) or 'US/Eastern' in str(tz)) self.assertEqual(datetime.datetime.now(tz), t) self.assertEqual(t.hour, 19)
def test_process(self): f = OffHour({'opt-out': True}) instances = [ instance(Tags=[]), instance( Tags=[{'Key': 'maid_offhours', 'Value': 'off'}]), instance( Tags=[ {'Key': 'maid_offhours', 'Value': "off=(m-f,5);zebrablue,on=(t-w,5)"}])] t = datetime.datetime( year=2015, month=12, day=1, hour=19, minute=5, tzinfo=zoneinfo.gettz('America/New_York')) with mock_datetime_now(t, datetime): self.assertEqual(f.process(instances), [instances[0]])
def test_opt_in_behavior(self): # Given the addition of opt out behavior, verify if its # not configured that we don't touch an instance that # has no downtime tag i = instance(Tags=[]) i2 = instance(Tags=[{'Key': 'maid_offhours', 'Value': ''}]) i3 = instance(Tags=[{'Key': 'maid_offhours', 'Value': 'on'}]) t = datetime.datetime( year=2015, month=12, day=1, hour=19, minute=5, tzinfo=zoneinfo.gettz('America/New_York')) f = OffHour({}) with mock_datetime_now(t, datetime): self.assertEqual(f(i), False) self.assertEqual(f(i2), True) self.assertEqual(f(i3), True) t = datetime.datetime( year=2015, month=12, day=1, hour=7, minute=5, tzinfo=zoneinfo.gettz('America/New_York')) f = OnHour({}) with mock_datetime_now(t, datetime): self.assertEqual(f(i), False) self.assertEqual(f(i2), True) self.assertEqual(f(i3), True)
def test_custom_offhours(self): t = datetime.datetime.now(tzutil.gettz("America/New_York")) t = t.replace(year=2016, month=5, day=26, hour=19, minute=00) results = [] with mock_datetime_now(t, datetime): for i in [ instance( Tags=[ { "Key": "maid_offhours", "Value": "off=(m-f,19);on=(m-f,7);tz=et", } ] ), instance( Tags=[ { "Key": "maid_offhours", "Value": "off=(m-f,20);on=(m-f,7);tz=et", } ] ), ]: results.append(OffHour({})(i)) self.assertEqual(results, [True, False])
def test_offhours_real_world_values(self): t = datetime.datetime.now(zoneinfo.gettz("America/New_York")) t = t.replace(year=2015, month=12, day=1, hour=19, minute=5) with mock_datetime_now(t, datetime): results = [ OffHour({})(i) for i in [ instance(Tags=[{ "Key": "maid_offhours", "Value": "" }]), instance(Tags=[{ "Key": "maid_offhours", "Value": "on" }]), instance(Tags=[{ "Key": "maid_offhours", "Value": '"Offhours tz=ET"' }]), instance(Tags=[{ "Key": "maid_offhours", "Value": "Offhours tz=PT" }]), ] ] # unclear what this is really checking self.assertEqual(results, [True, True, True, True])
def test_offhours_skip(self): t = datetime.datetime( year=2015, month=12, day=1, hour=19, minute=5, tzinfo=zoneinfo.gettz("America/New_York"), ) with mock_datetime_now(t, datetime): i = instance(Tags=[{"Key": "maid_offhours", "Value": "tz=est"}]) self.assertEqual(OffHour({})(i), True) self.assertEqual(OffHour({"skip-days": ["2015-12-01"]})(i), False) self.assertEqual( OffHour({"skip-days": ["2017-01-01", "2015-12-01"]})(i), False) self.assertEqual(OffHour({"skip-days": ["2015-12-02"]})(i), True)
def test_validate(self): url_test = "s3://test-dest/holidays.csv" self.assertRaises( PolicyValidationError, OffHour({"default_tz": "zmta"}).validate ) self.assertRaises(PolicyValidationError, OffHour({"offhour": 25}).validate) self.assertRaises( PolicyValidationError, OffHour( { "skip-days": ["2017-01-01"], "skip-days-from": {"expr": 0, "format": "csv", "url": url_test}, } ).validate, ) i = OffHour({}) self.assertEqual(i.validate(), i)
def test_offhour_weekend_support(self): start_day = 26 t = datetime.datetime(year=2016, day=start_day, month=2, hour=19, minute=20) i = instance(Tags=[{"Key": "maid_offhours", "Value": "tz=est"}]) f = OffHour({}) results = [] with mock_datetime_now(t, datetime) as dt: for n in range(0, 4): dt.target = t.replace(day=start_day + n) results.append(f(i)) self.assertEqual(results, [True, False, False, True])
def test_custom_offhours(self): t = datetime.datetime.now(zoneinfo.gettz('America/New_York')) t = t.replace(year=2016, month=5, day=26, hour=19, minute=00) results = [] with mock_datetime_now(t, datetime): for i in [instance(Tags=[{'Key': 'maid_offhours', 'Value': 'off=(m-f,19);on=(m-f,7);tz=et'}]), instance(Tags=[{'Key': 'maid_offhours', 'Value': 'off=(m-f,20);on=(m-f,7);tz=et'}])]: results.append(OffHour({})(i)) self.assertEqual(results, [True, False])
def test_offhours(self): t = datetime.datetime( year=2015, month=12, day=1, hour=19, minute=5, tzinfo=tzutil.gettz("America/New_York"), ) with mock_datetime_now(t, datetime): i = instance(Tags=[{"Key": "maid_offhours", "Value": "tz=est"}]) self.assertEqual(OffHour({})(i), True)
def test_offhours_real_world_values(self): t = datetime.datetime.now(zoneinfo.gettz('America/New_York')) t = t.replace(year=2015, month=12, day=1, hour=19, minute=5) with mock_datetime_now(t, datetime): for i in [ instance(Tags=[ {'Key': 'maid_offhours', 'Value': ''}]), instance(Tags=[ {'Key': 'maid_offhours', 'Value': '"Offhours tz=ET"'}]), instance(Tags=[ {'Key': 'maid_offhours', 'Value': 'Offhours tz=PT'}])]: self.assertEqual(OffHour({})(i), True)
def test_everyday_offhour(self): # weekends on means we match times on the weekend start_day = 14 # sunday t = datetime.datetime(year=2016, day=start_day, month=8, hour=19, minute=20) i = instance(Tags=[{"Key": "maid_offhours", "Value": "tz=est"}]) f = OffHour({"weekends": False}) results = [] with mock_datetime_now(t, datetime) as dt: for n in range(7): dt.target = t.replace(day=start_day + n) results.append(f(i)) self.assertEqual(results, [True] * 7)
def test_onhour_weekend_support(self): start_day = 14 t = datetime.datetime( year=2016, day=start_day, month=2, hour=19, minute=20) i = instance(Tags=[{'Key': 'maid_offhours', 'Value': 'tz=est'}]) f = OffHour({'weekends-only': True}) results = [] with mock_datetime_now(t, datetime) as dt: for n in range(7): dt.target = t.replace(day=start_day + n) results.append(f(i)) self.assertEqual( results, [False, False, False, False, False, True, False])
def test_opt_out_behavior(self): # Some users want to match based on policy filters to # a resource subset with default opt out behavior t = datetime.datetime( year=2015, month=12, day=1, hour=19, minute=5, tzinfo=zoneinfo.gettz('America/New_York')) f = OffHour({'opt-out': True}) with mock_datetime_now(t, datetime): i = instance(Tags=[]) self.assertEqual(f(i), True) i = instance( Tags=[{'Key': 'maid_offhours', 'Value': 'off'}]) self.assertEqual(f(i), False) self.assertEqual(f.opted_out, [i])
def test_offhours_get_value_fallback(self): sched = "off=[(S,1)];on=[(M,6)];tz=pst" off = OffHour({"default_tz": "ct", "fallback-schedule": sched}) i = instance(Tags=[]) self.assertEqual(off.get_tag_value(i), sched.lower()) self.assertTrue( off.parser.has_resource_schedule(off.get_tag_value(i), "off")) self.assertTrue( off.parser.has_resource_schedule(off.get_tag_value(i), "on")) self.assertTrue(off.parser.keys_are_valid(off.get_tag_value(i))) self.assertEqual(off.parser.raw_data(off.get_tag_value(i)), { 'off': '[(s,1)]', 'on': '[(m,6)]', 'tz': 'pst' })
def test_opt_out_behavior(self): # Some users want to match based on policy filters to # a resource subset with default opt out behavior t = datetime.datetime( year=2015, month=12, day=1, hour=19, minute=5, tzinfo=tzutil.gettz("America/New_York"), ) f = OffHour({"opt-out": True}) with mock_datetime_now(t, datetime): i = instance(Tags=[]) self.assertEqual(f(i), True) i = instance(Tags=[{"Key": "maid_offhours", "Value": ""}]) self.assertEqual(f(i), True) i = instance(Tags=[{"Key": "maid_offhours", "Value": "on"}]) self.assertEqual(f(i), True) i = instance(Tags=[{"Key": "maid_offhours", "Value": "off"}]) self.assertEqual(f(i), False) self.assertEqual(f.opted_out, [i])
def test_validate(self): url_test = 's3://test-dest/holidays.csv' self.assertRaises(FilterValidationError, OffHour({ 'default_tz': 'zmta' }).validate) self.assertRaises(FilterValidationError, OffHour({ 'offhour': 25 }).validate) self.assertRaises( FilterValidationError, OffHour({ 'skip-days': ['2017-01-01'], 'skip-days-from': { 'expr': 0, 'format': 'csv', 'url': url_test } }).validate) i = OffHour({}) self.assertEqual(i.validate(), i)
def test_cant_parse_tz(self): i = instance(Tags=[{'Key': 'maid_offhours', 'Value': 'tz=evt'}]) self.assertEqual(OffHour({})(i), False)
def test_cant_parse_tz(self): i = instance(Tags=[{"Key": "maid_offhours", "Value": "tz=evt"}]) self.assertEqual(OffHour({})(i), False)