Browse Source

Fix repetitive updates due to endpoint name overwrite

Also add _extra_changes to dynamic record tests to make them more
exhausitve.
Simplify root profile's endpoint names.
pull/735/head
Viranch Mehta 5 years ago
parent
commit
1d55124a5c
No known key found for this signature in database GPG Key ID: D83D1392AE9F93B4
2 changed files with 89 additions and 34 deletions
  1. +13
    -14
      octodns/provider/azuredns.py
  2. +76
    -20
      tests/test_octodns_provider_azuredns.py

+ 13
- 14
octodns/provider/azuredns.py View File

@ -748,7 +748,10 @@ class AzureProvider(BaseProvider):
if root_profile.traffic_routing_method != 'Geographic': if root_profile.traffic_routing_method != 'Geographic':
# This record does not use geo fencing, so we skip the Geographic # This record does not use geo fencing, so we skip the Geographic
# profile hop; let's pretend to be a geo-profile's only endpoint # profile hop; let's pretend to be a geo-profile's only endpoint
geo_ep = Endpoint(target_resource_id=root_profile.id)
geo_ep = Endpoint(
name=root_profile.endpoints[0].name.split('--', 1)[0],
target_resource_id=root_profile.id
)
geo_ep.target_resource = root_profile geo_ep.target_resource = root_profile
endpoints = [geo_ep] endpoints = [geo_ep]
else: else:
@ -799,18 +802,14 @@ class AzureProvider(BaseProvider):
geos.append(GeoCodes.country_to_code(code)) geos.append(GeoCodes.country_to_code(code))
# build fallback chain from second level priority profile # build fallback chain from second level priority profile
if geo_ep.target_resource_id:
target = geo_ep.target_resource
if target.traffic_routing_method == 'Priority':
rule_endpoints = target.endpoints
rule_endpoints.sort(key=lambda e: e.priority)
else:
# Weighted
geo_ep.name = target.endpoints[0].name.split('--', 1)[0]
rule_endpoints = [geo_ep]
if geo_ep.target_resource_id and \
geo_ep.target_resource.traffic_routing_method == 'Priority':
rule_endpoints = geo_ep.target_resource.endpoints
rule_endpoints.sort(key=lambda e: e.priority)
else: else:
# this geo directly points to the default, so we skip the
# Priority profile hop and directly use an external endpoint;
# this geo directly points to a pool containing the default
# so we skip the Priority profile hop and directly use an
# external endpoint or Weighted profile
# let's pretend to be a Priority profile's only endpoint # let's pretend to be a Priority profile's only endpoint
rule_endpoints = [geo_ep] rule_endpoints = [geo_ep]
@ -1133,7 +1132,7 @@ class AzureProvider(BaseProvider):
# append rule profile to top-level geo profile # append rule profile to top-level geo profile
geo_endpoints.append(Endpoint( geo_endpoints.append(Endpoint(
name='rule-{}'.format(rule.data['pool']),
name=rule.data['pool'],
target_resource_id=rule_profile.id, target_resource_id=rule_profile.id,
geo_mapping=geos, geo_mapping=geos,
)) ))
@ -1144,7 +1143,7 @@ class AzureProvider(BaseProvider):
if rule_ep.target_resource_id: if rule_ep.target_resource_id:
# point directly to the Weighted pool profile # point directly to the Weighted pool profile
geo_endpoints.append(Endpoint( geo_endpoints.append(Endpoint(
name='rule-{}'.format(rule.data['pool']),
name=rule_ep.name,
target_resource_id=rule_ep.target_resource_id, target_resource_id=rule_ep.target_resource_id,
geo_mapping=geos, geo_mapping=geos,
)) ))


+ 76
- 20
tests/test_octodns_provider_azuredns.py View File

@ -697,13 +697,13 @@ class TestAzureDnsProvider(TestCase):
endpoints=[ endpoints=[
Endpoint( Endpoint(
geo_mapping=['GEO-AF', 'DE', 'US-CA', 'GEO-AP'], geo_mapping=['GEO-AF', 'DE', 'US-CA', 'GEO-AP'],
name='rule-one',
name='one',
type=nested, type=nested,
target_resource_id=id_format.format('rule-one'), target_resource_id=id_format.format('rule-one'),
), ),
Endpoint( Endpoint(
geo_mapping=['WORLD'], geo_mapping=['WORLD'],
name='rule-two',
name='two',
type=nested, type=nested,
target_resource_id=id_format.format('rule-two'), target_resource_id=id_format.format('rule-two'),
), ),
@ -1231,6 +1231,12 @@ class TestAzureDnsProvider(TestCase):
record2 = provider._populate_record(zone, azrecord) record2 = provider._populate_record(zone, azrecord)
self.assertEqual(record2.dynamic._data(), record.dynamic._data()) self.assertEqual(record2.dynamic._data(), record.dynamic._data())
# test that extra changes doesn't show any changes
desired = Zone(zone.name, sub_zones=[])
desired.add_record(record)
changes = provider._extra_changes(zone, desired, [])
self.assertEqual(len(changes), 0)
def test_generate_traffic_managers_middle_east(self): def test_generate_traffic_managers_middle_east(self):
# check Asia/Middle East test case # check Asia/Middle East test case
provider, zone, record = self._get_dynamic_package() provider, zone, record = self._get_dynamic_package()
@ -1336,6 +1342,12 @@ class TestAzureDnsProvider(TestCase):
record2 = provider._populate_record(zone, azrecord) record2 = provider._populate_record(zone, azrecord)
self.assertEqual(record2.dynamic._data(), record.dynamic._data()) self.assertEqual(record2.dynamic._data(), record.dynamic._data())
# test that extra changes doesn't show any changes
desired = Zone(zone.name, sub_zones=[])
desired.add_record(record)
changes = provider._extra_changes(zone, desired, [])
self.assertEqual(len(changes), 0)
def test_dynamic_fallback_is_default(self): def test_dynamic_fallback_is_default(self):
# test that traffic managers are generated as expected # test that traffic managers are generated as expected
provider = self._get_provider() provider = self._get_provider()
@ -1389,6 +1401,12 @@ class TestAzureDnsProvider(TestCase):
record2 = provider._populate_record(zone, azrecord) record2 = provider._populate_record(zone, azrecord)
self.assertEqual(record2.dynamic._data(), record.dynamic._data()) self.assertEqual(record2.dynamic._data(), record.dynamic._data())
# test that extra changes doesn't show any changes
desired = Zone(zone.name, sub_zones=[])
desired.add_record(record)
changes = provider._extra_changes(zone, desired, [])
self.assertEqual(len(changes), 0)
def test_dynamic_pool_contains_default(self): def test_dynamic_pool_contains_default(self):
# test that traffic managers are generated as expected # test that traffic managers are generated as expected
provider = self._get_provider() provider = self._get_provider()
@ -1459,7 +1477,7 @@ class TestAzureDnsProvider(TestCase):
monitor_config=_get_monitor(record), monitor_config=_get_monitor(record),
endpoints=[ endpoints=[
Endpoint( Endpoint(
name='rule-rr',
name='rr',
type=nested, type=nested,
target_resource_id=profiles[0].id, target_resource_id=profiles[0].id,
geo_mapping=['GEO-AF'], geo_mapping=['GEO-AF'],
@ -1479,6 +1497,12 @@ class TestAzureDnsProvider(TestCase):
record2 = provider._populate_record(zone, azrecord) record2 = provider._populate_record(zone, azrecord)
self.assertEqual(record2.dynamic._data(), record.dynamic._data()) self.assertEqual(record2.dynamic._data(), record.dynamic._data())
# test that extra changes doesn't show any changes
desired = Zone(zone.name, sub_zones=[])
desired.add_record(record)
changes = provider._extra_changes(zone, desired, [])
self.assertEqual(len(changes), 0)
def test_dynamic_pool_contains_default_no_geo(self): def test_dynamic_pool_contains_default_no_geo(self):
# test that traffic managers are generated as expected # test that traffic managers are generated as expected
provider = self._get_provider() provider = self._get_provider()
@ -1553,6 +1577,12 @@ class TestAzureDnsProvider(TestCase):
record2 = provider._populate_record(zone, azrecord) record2 = provider._populate_record(zone, azrecord)
self.assertEqual(record2.dynamic._data(), record.dynamic._data()) self.assertEqual(record2.dynamic._data(), record.dynamic._data())
# test that extra changes doesn't show any changes
desired = Zone(zone.name, sub_zones=[])
desired.add_record(record)
changes = provider._extra_changes(zone, desired, [])
self.assertEqual(len(changes), 0)
def test_dynamic_last_pool_contains_default_no_geo(self): def test_dynamic_last_pool_contains_default_no_geo(self):
# test that traffic managers are generated as expected # test that traffic managers are generated as expected
provider = self._get_provider() provider = self._get_provider()
@ -1655,6 +1685,12 @@ class TestAzureDnsProvider(TestCase):
record2 = provider._populate_record(zone, azrecord) record2 = provider._populate_record(zone, azrecord)
self.assertEqual(record2.dynamic._data(), record.dynamic._data()) self.assertEqual(record2.dynamic._data(), record.dynamic._data())
# test that extra changes doesn't show any changes
desired = Zone(zone.name, sub_zones=[])
desired.add_record(record)
changes = provider._extra_changes(zone, desired, [])
self.assertEqual(len(changes), 0)
def test_dynamic_unique_traffic_managers(self): def test_dynamic_unique_traffic_managers(self):
record = self._get_dynamic_record(zone) record = self._get_dynamic_record(zone)
data = { data = {
@ -1724,19 +1760,19 @@ class TestAzureDnsProvider(TestCase):
monitor_config=_get_monitor(record), monitor_config=_get_monitor(record),
endpoints=[ endpoints=[
Endpoint( Endpoint(
name='rule-iad',
name='iad',
type=nested, type=nested,
target_resource_id=profiles[0].id, target_resource_id=profiles[0].id,
geo_mapping=['GEO-EU'], geo_mapping=['GEO-EU'],
), ),
Endpoint( Endpoint(
name='rule-lhr',
name='lhr',
type=nested, type=nested,
target_resource_id=profiles[1].id, target_resource_id=profiles[1].id,
geo_mapping=['GB', 'WORLD'], geo_mapping=['GB', 'WORLD'],
), ),
Endpoint( Endpoint(
name='rule-sto',
name='sto',
type=nested, type=nested,
target_resource_id=profiles[2].id, target_resource_id=profiles[2].id,
geo_mapping=['SE'], geo_mapping=['SE'],
@ -1756,6 +1792,12 @@ class TestAzureDnsProvider(TestCase):
record2 = provider._populate_record(zone, azrecord) record2 = provider._populate_record(zone, azrecord)
self.assertEqual(record2.dynamic._data(), record.dynamic._data()) self.assertEqual(record2.dynamic._data(), record.dynamic._data())
# test that extra changes doesn't show any changes
desired = Zone(zone.name, sub_zones=[])
desired.add_record(record)
changes = provider._extra_changes(zone, desired, [])
self.assertEqual(len(changes), 0)
def test_dynamic_A_geo(self): def test_dynamic_A_geo(self):
provider = self._get_provider() provider = self._get_provider()
external = 'Microsoft.Network/trafficManagerProfiles/externalEndpoints' external = 'Microsoft.Network/trafficManagerProfiles/externalEndpoints'
@ -1790,10 +1832,6 @@ class TestAzureDnsProvider(TestCase):
} }
}) })
# test that extra_changes doesn't complain
changes = [Create(record)]
provider._extra_changes(zone, zone, changes)
profiles = provider._generate_traffic_managers(record) profiles = provider._generate_traffic_managers(record)
self.assertEqual(len(profiles), 1) self.assertEqual(len(profiles), 1)
@ -1828,7 +1866,7 @@ class TestAzureDnsProvider(TestCase):
# test that the record and ATM profile gets created # test that the record and ATM profile gets created
tm_sync = provider._tm_client.profiles.create_or_update tm_sync = provider._tm_client.profiles.create_or_update
create = provider._dns_client.record_sets.create_or_update create = provider._dns_client.record_sets.create_or_update
provider._apply_Create(changes[0])
provider._apply_Create(Create(record))
# A dynamic record can only have 1 profile # A dynamic record can only have 1 profile
tm_sync.assert_called_once() tm_sync.assert_called_once()
create.assert_called_once() create.assert_called_once()
@ -1853,6 +1891,12 @@ class TestAzureDnsProvider(TestCase):
record2 = provider._populate_record(zone, azrecord) record2 = provider._populate_record(zone, azrecord)
self.assertEqual(record2.dynamic._data(), record.dynamic._data()) self.assertEqual(record2.dynamic._data(), record.dynamic._data())
# test that extra changes doesn't show any changes
desired = Zone(zone.name, sub_zones=[])
desired.add_record(record)
changes = provider._extra_changes(zone, desired, [])
self.assertEqual(len(changes), 0)
def test_dynamic_A_fallback(self): def test_dynamic_A_fallback(self):
provider = self._get_provider() provider = self._get_provider()
external = 'Microsoft.Network/trafficManagerProfiles/externalEndpoints' external = 'Microsoft.Network/trafficManagerProfiles/externalEndpoints'
@ -1860,7 +1904,7 @@ class TestAzureDnsProvider(TestCase):
record = Record.new(zone, 'foo', data={ record = Record.new(zone, 'foo', data={
'type': 'A', 'type': 'A',
'ttl': 60, 'ttl': 60,
'values': ['8.8.8.8'],
'values': ['1.1.1.1', '2.2.2.2'],
'dynamic': { 'dynamic': {
'pools': { 'pools': {
'one': { 'one': {
@ -1891,23 +1935,17 @@ class TestAzureDnsProvider(TestCase):
monitor_config=_get_monitor(record), monitor_config=_get_monitor(record),
endpoints=[ endpoints=[
Endpoint( Endpoint(
name='one',
name='one--default--',
type=external, type=external,
target='1.1.1.1', target='1.1.1.1',
priority=1, priority=1,
), ),
Endpoint( Endpoint(
name='two',
name='two--default--',
type=external, type=external,
target='2.2.2.2', target='2.2.2.2',
priority=2, priority=2,
), ),
Endpoint(
name='--default--',
type=external,
target='8.8.8.8',
priority=3,
),
], ],
))) )))
@ -1923,6 +1961,12 @@ class TestAzureDnsProvider(TestCase):
record2 = provider._populate_record(zone, azrecord) record2 = provider._populate_record(zone, azrecord)
self.assertEqual(record2.dynamic._data(), record.dynamic._data()) self.assertEqual(record2.dynamic._data(), record.dynamic._data())
# test that extra changes doesn't show any changes
desired = Zone(zone.name, sub_zones=[])
desired.add_record(record)
changes = provider._extra_changes(zone, desired, [])
self.assertEqual(len(changes), 0)
def test_dynamic_A_weighted_rr(self): def test_dynamic_A_weighted_rr(self):
provider = self._get_provider() provider = self._get_provider()
external = 'Microsoft.Network/trafficManagerProfiles/externalEndpoints' external = 'Microsoft.Network/trafficManagerProfiles/externalEndpoints'
@ -1982,6 +2026,12 @@ class TestAzureDnsProvider(TestCase):
record2 = provider._populate_record(zone, azrecord) record2 = provider._populate_record(zone, azrecord)
self.assertEqual(record2.dynamic._data(), record.dynamic._data()) self.assertEqual(record2.dynamic._data(), record.dynamic._data())
# test that extra changes doesn't show any changes
desired = Zone(zone.name, sub_zones=[])
desired.add_record(record)
changes = provider._extra_changes(zone, desired, [])
self.assertEqual(len(changes), 0)
def test_dynamic_AAAA(self): def test_dynamic_AAAA(self):
provider = self._get_provider() provider = self._get_provider()
external = 'Microsoft.Network/trafficManagerProfiles/externalEndpoints' external = 'Microsoft.Network/trafficManagerProfiles/externalEndpoints'
@ -2050,6 +2100,12 @@ class TestAzureDnsProvider(TestCase):
record2 = provider._populate_record(zone, azrecord) record2 = provider._populate_record(zone, azrecord)
self.assertEqual(record2.dynamic._data(), record.dynamic._data()) self.assertEqual(record2.dynamic._data(), record.dynamic._data())
# test that extra changes doesn't show any changes
desired = Zone(zone.name, sub_zones=[])
desired.add_record(record)
changes = provider._extra_changes(zone, desired, [])
self.assertEqual(len(changes), 0)
def test_sync_traffic_managers(self): def test_sync_traffic_managers(self):
provider, zone, record = self._get_dynamic_package() provider, zone, record = self._get_dynamic_package()
provider._populate_traffic_managers() provider._populate_traffic_managers()


Loading…
Cancel
Save