diff --git a/octodns/manager.py b/octodns/manager.py index 2545e71..11a675b 100644 --- a/octodns/manager.py +++ b/octodns/manager.py @@ -273,12 +273,18 @@ class Manager(object): for target, plan in plans: plan.raise_if_unsafe() - if dry_run or config.get('always-dry-run', False): + if dry_run: return 0 total_changes = 0 self.log.debug('sync: applying') + zones = self.config['zones'] for target, plan in plans: + zone_name = plan.existing.name + if zones[zone_name].get('always-dry-run', False): + self.log.info('sync: zone=%s skipping always-dry-run', + zone_name) + continue total_changes += target.apply(plan) self.log.info('sync: %d total changes', total_changes) diff --git a/octodns/provider/route53.py b/octodns/provider/route53.py index 3849561..4d1b2e9 100644 --- a/octodns/provider/route53.py +++ b/octodns/provider/route53.py @@ -253,10 +253,13 @@ class Route53Provider(BaseProvider): _data_for_PTR = _data_for_single _data_for_CNAME = _data_for_single + _fix_semicolons = re.compile(r'(? creates for every record in expected @@ -103,8 +104,8 @@ class TestPowerDnsProvider(TestCase): mock.patch(ANY, status_code=201, text=assert_rrsets_callback) plan = provider.plan(expected) - self.assertEquals(len(expected.records), len(plan.changes)) - self.assertEquals(len(expected.records), provider.apply(plan)) + self.assertEquals(expected_n, len(plan.changes)) + self.assertEquals(expected_n, provider.apply(plan)) # Non-existent zone -> creates for every record in expected # OMG this is fucking ugly, probably better to ditch requests_mocks and @@ -121,8 +122,8 @@ class TestPowerDnsProvider(TestCase): mock.post(ANY, status_code=201, text=assert_rrsets_callback) plan = provider.plan(expected) - self.assertEquals(len(expected.records), len(plan.changes)) - self.assertEquals(len(expected.records), provider.apply(plan)) + self.assertEquals(expected_n, len(plan.changes)) + self.assertEquals(expected_n, provider.apply(plan)) with requests_mock() as mock: # get 422's, unknown zone @@ -166,7 +167,7 @@ class TestPowerDnsProvider(TestCase): expected = Zone('unit.tests.', []) source = YamlProvider('test', join(dirname(__file__), 'config')) source.populate(expected) - self.assertEquals(14, len(expected.records)) + self.assertEquals(15, len(expected.records)) # A small change to a single record with requests_mock() as mock: diff --git a/tests/test_octodns_provider_route53.py b/tests/test_octodns_provider_route53.py index e1a73f8..b05c0fc 100644 --- a/tests/test_octodns_provider_route53.py +++ b/tests/test_octodns_provider_route53.py @@ -1217,3 +1217,23 @@ class TestRoute53Provider(TestCase): with self.assertRaises(Exception) as ctx: provider.apply(plan) self.assertTrue('modifications' in ctx.exception.message) + + def test_semicolon_fixup(self): + provider = Route53Provider('test', 'abc', '123') + + self.assertEquals({ + 'type': 'TXT', + 'ttl': 30, + 'values': [ + 'abcd\\; ef\\;g', + 'hij\\; klm\\;n', + ], + }, provider._data_for_quoted({ + 'ResourceRecords': [{ + 'Value': '"abcd; ef;g"', + }, { + 'Value': '"hij\\; klm\\;n"', + }], + 'TTL': 30, + 'Type': 'TXT', + })) diff --git a/tests/test_octodns_provider_yaml.py b/tests/test_octodns_provider_yaml.py index a557bb3..05c5248 100644 --- a/tests/test_octodns_provider_yaml.py +++ b/tests/test_octodns_provider_yaml.py @@ -30,7 +30,7 @@ class TestYamlProvider(TestCase): # without it we see everything source.populate(zone) - self.assertEquals(14, len(zone.records)) + self.assertEquals(15, len(zone.records)) # Assumption here is that a clean round-trip means that everything # worked as expected, data that went in came back out and could be diff --git a/tests/test_octodns_zone.py b/tests/test_octodns_zone.py index da83dfc..88bbb68 100644 --- a/tests/test_octodns_zone.py +++ b/tests/test_octodns_zone.py @@ -172,3 +172,36 @@ class TestZone(TestCase): with self.assertRaises(SubzoneRecordException) as ctx: zone.add_record(record) self.assertTrue('under a managed sub-zone', ctx.exception.message) + + def test_ignored_records(self): + zone_normal = Zone('unit.tests.', []) + zone_ignored = Zone('unit.tests.', []) + zone_missing = Zone('unit.tests.', []) + + normal = Record.new(zone_normal, 'www', { + 'ttl': 60, + 'type': 'A', + 'value': '9.9.9.9', + }) + zone_normal.add_record(normal) + + ignored = Record.new(zone_ignored, 'www', { + 'octodns': { + 'ignored': True + }, + 'ttl': 60, + 'type': 'A', + 'value': '9.9.9.9', + }) + zone_ignored.add_record(ignored) + + provider = SimpleProvider() + + self.assertFalse(zone_normal.changes(zone_ignored, provider)) + self.assertTrue(zone_normal.changes(zone_missing, provider)) + + self.assertFalse(zone_ignored.changes(zone_normal, provider)) + self.assertFalse(zone_ignored.changes(zone_missing, provider)) + + self.assertTrue(zone_missing.changes(zone_normal, provider)) + self.assertFalse(zone_missing.changes(zone_ignored, provider))