Browse Source

Update Route53 extra change to handle status=up case

pull/819/head
Ross McFarland 4 years ago
parent
commit
ad17e4cbe8
No known key found for this signature in database GPG Key ID: 943B179E15D3B22A
2 changed files with 63 additions and 3 deletions
  1. +21
    -3
      octodns/provider/route53.py
  2. +42
    -0
      tests/test_octodns_provider_route53.py

+ 21
- 3
octodns/provider/route53.py View File

@ -1338,10 +1338,11 @@ class Route53Provider(BaseProvider):
self._gc_health_checks(change.existing, []) self._gc_health_checks(change.existing, [])
return self._gen_mods('DELETE', existing_records, existing_rrsets) return self._gen_mods('DELETE', existing_records, existing_rrsets)
def _extra_changes_update_needed(self, record, rrset):
def _extra_changes_update_needed(self, record, rrset, statuses={}):
value = rrset['ResourceRecords'][0]['Value']
if record._type == 'CNAME': if record._type == 'CNAME':
# For CNAME, healthcheck host by default points to the CNAME value # For CNAME, healthcheck host by default points to the CNAME value
healthcheck_host = rrset['ResourceRecords'][0]['Value']
healthcheck_host = value
else: else:
healthcheck_host = record.healthcheck_host() healthcheck_host = record.healthcheck_host()
@ -1351,6 +1352,17 @@ class Route53Provider(BaseProvider):
healthcheck_latency = self._healthcheck_measure_latency(record) healthcheck_latency = self._healthcheck_measure_latency(record)
healthcheck_interval = self._healthcheck_request_interval(record) healthcheck_interval = self._healthcheck_request_interval(record)
status = statuses.get(value, 'obey')
if status == 'up':
if 'HealthCheckId' in rrset:
self.log.info('_extra_changes_update_needed: health-check '
'found for status="up", causing update of %s:%s',
record.fqdn, record._type)
return True
else:
# No health check needed
return False
try: try:
health_check_id = rrset['HealthCheckId'] health_check_id = rrset['HealthCheckId']
health_check = self.health_checks[health_check_id] health_check = self.health_checks[health_check_id]
@ -1406,6 +1418,12 @@ class Route53Provider(BaseProvider):
fqdn = record.fqdn fqdn = record.fqdn
_type = record._type _type = record._type
# map values to statuses
statuses = {}
for pool in record.dynamic.pools.values():
for value in pool.data['values']:
statuses[value['value']] = value.get('status', 'obey')
# loop through all the r53 rrsets # loop through all the r53 rrsets
for rrset in self._load_records(zone_id): for rrset in self._load_records(zone_id):
name = rrset['Name'] name = rrset['Name']
@ -1424,7 +1442,7 @@ class Route53Provider(BaseProvider):
# rrset isn't for the current record # rrset isn't for the current record
continue continue
if self._extra_changes_update_needed(record, rrset):
if self._extra_changes_update_needed(record, rrset, statuses):
# no good, doesn't have the right health check, needs an update # no good, doesn't have the right health check, needs an update
self.log.info('_extra_changes_dynamic_needs_update: ' self.log.info('_extra_changes_dynamic_needs_update: '
'health-check caused update of %s:%s', 'health-check caused update of %s:%s',


+ 42
- 0
tests/test_octodns_provider_route53.py View File

@ -2567,6 +2567,48 @@ class TestRoute53Provider(TestCase):
self.assertEquals(1, len(extra)) self.assertEquals(1, len(extra))
stubber.assert_no_pending_responses() stubber.assert_no_pending_responses()
def test_extra_change_dyamic_status_up(self):
provider, stubber = self._get_stubbed_provider()
zone = Zone('unit.tests.', [])
record = Record.new(zone, 'a', {
'ttl': 30,
'type': 'A',
'value': '1.1.1.1',
'dynamic': {
'pools': {
'one': {
'values': [{
'status': 'up',
'value': '1.2.3.4',
}],
},
},
'rules': [{
'pool': 'one',
}],
},
})
# status up and no health check so we're good
rrset = {
'ResourceRecords': [{'Value': '1.2.3.4'}],
}
statuses = {'1.2.3.4': 'up'}
self.assertFalse(
provider._extra_changes_update_needed(record, rrset, statuses)
)
# status up and has a health check so update needed
rrset = {
'ResourceRecords': [{'Value': '1.2.3.4'}],
'HealthCheckId': 'foo',
}
statuses = {'1.2.3.4': 'up'}
self.assertTrue(
provider._extra_changes_update_needed(record, rrset, statuses)
)
def test_extra_change_dynamic_has_health_check_cname(self): def test_extra_change_dynamic_has_health_check_cname(self):
provider, stubber = self._get_stubbed_provider() provider, stubber = self._get_stubbed_provider()


Loading…
Cancel
Save