mirror of
https://github.com/github/octodns.git
synced 2024-05-11 05:55:00 +00:00
Force enable/disable pool values
This commit is contained in:
@@ -807,9 +807,16 @@ class AzureProvider(BaseProvider):
|
||||
defaults.add(val)
|
||||
ep_name = ep_name[:-len('--default--')]
|
||||
|
||||
up = None
|
||||
if pool_ep.endpoint_status == 'Disabled':
|
||||
up = False
|
||||
elif ep_name.endswith('--UP'):
|
||||
up = True
|
||||
|
||||
values.append({
|
||||
'value': val,
|
||||
'weight': pool_ep.weight or 1,
|
||||
'up': up,
|
||||
})
|
||||
|
||||
return values
|
||||
@@ -898,6 +905,22 @@ class AzureProvider(BaseProvider):
|
||||
|
||||
return data
|
||||
|
||||
def _process_desired_zone(self, desired):
|
||||
# check for support of force up/down values
|
||||
for record in desired.records:
|
||||
if not getattr(record, 'dynamic', False):
|
||||
continue
|
||||
for name, pool in record.dynamic.pools.items():
|
||||
for value in pool.data['values']:
|
||||
if value['up']:
|
||||
# Azure only supports up=None & up=False, not up=True
|
||||
msg = 'up=True is not supported for "{}" pool in {}' \
|
||||
.format(name, record.fqdn)
|
||||
fallback = 'ignoring it'
|
||||
self.supports_warn_or_except(msg, fallback)
|
||||
|
||||
return super()._process_desired_zone(desired)
|
||||
|
||||
def _extra_changes(self, existing, desired, changes):
|
||||
changed = set(c.record for c in changes)
|
||||
|
||||
@@ -1033,16 +1056,21 @@ class AzureProvider(BaseProvider):
|
||||
if record._type == 'CNAME':
|
||||
target = target[:-1]
|
||||
ep_name = f'{pool_name}--{target}'
|
||||
if val['up']:
|
||||
ep_name += '--UP'
|
||||
# Endpoint names cannot have colons, drop them from IPv6 addresses
|
||||
ep_name = ep_name.replace(':', '-')
|
||||
if target in defaults:
|
||||
# mark default
|
||||
ep_name += '--default--'
|
||||
default_seen = True
|
||||
ep_status = 'Disabled' if val['up'] == False else \
|
||||
'Enabled'
|
||||
endpoints.append(Endpoint(
|
||||
name=ep_name,
|
||||
target=target,
|
||||
weight=val.get('weight', 1),
|
||||
endpoint_status=ep_status,
|
||||
))
|
||||
|
||||
pool_profile = self._generate_tm_profile(
|
||||
|
||||
@@ -591,6 +591,9 @@ class Ns1Provider(BaseProvider):
|
||||
'value': value,
|
||||
'weight': int(meta.get('weight', 1)),
|
||||
}
|
||||
if isinstance(meta['up'], bool):
|
||||
value_dict['up'] = meta['up']
|
||||
|
||||
if value_dict not in pool['values']:
|
||||
# If we haven't seen this value before add it to the pool
|
||||
pool['values'].append(value_dict)
|
||||
@@ -1141,6 +1144,10 @@ class Ns1Provider(BaseProvider):
|
||||
pool = pools[current_pool_name]
|
||||
for answer in pool_answers[current_pool_name]:
|
||||
fallback = pool.data['fallback']
|
||||
if answer['feed_id']:
|
||||
up = {'feed': answer['feed_id']}
|
||||
else:
|
||||
up = answer['up']
|
||||
answer = {
|
||||
'answer': answer['answer'],
|
||||
'meta': {
|
||||
@@ -1150,9 +1157,7 @@ class Ns1Provider(BaseProvider):
|
||||
'pool': current_pool_name,
|
||||
'fallback': fallback or '',
|
||||
}),
|
||||
'up': {
|
||||
'feed': answer['feed_id'],
|
||||
},
|
||||
'up': up,
|
||||
'weight': answer['weight'],
|
||||
},
|
||||
'region': pool_label, # the one we're answering
|
||||
@@ -1273,20 +1278,25 @@ class Ns1Provider(BaseProvider):
|
||||
for pool_name, pool in sorted(pools.items()):
|
||||
for value in pool.data['values']:
|
||||
weight = value['weight']
|
||||
up = value['up']
|
||||
value = value['value']
|
||||
feed_id = value_feed.get(value)
|
||||
# check for identical monitor and skip creating one if found
|
||||
if not feed_id:
|
||||
existing = existing_monitors.get(value)
|
||||
monitor_id, feed_id = self._monitor_sync(record, value,
|
||||
existing)
|
||||
value_feed[value] = feed_id
|
||||
active_monitors.add(monitor_id)
|
||||
feed_id = None
|
||||
if up is None:
|
||||
# state is not forced, let's find a monitor
|
||||
feed_id = value_feed.get(value)
|
||||
# check for identical monitor and skip creating one if found
|
||||
if not feed_id:
|
||||
existing = existing_monitors.get(value)
|
||||
monitor_id, feed_id = self._monitor_sync(record, value,
|
||||
existing)
|
||||
value_feed[value] = feed_id
|
||||
active_monitors.add(monitor_id)
|
||||
|
||||
pool_answers[pool_name].append({
|
||||
'answer': [value],
|
||||
'weight': weight,
|
||||
'feed_id': feed_id,
|
||||
'up': up,
|
||||
})
|
||||
|
||||
if record._type == 'CNAME':
|
||||
|
||||
@@ -941,6 +941,16 @@ class Route53Provider(BaseProvider):
|
||||
rule.data['geos'] = filtered_geos
|
||||
rules.append(rule)
|
||||
|
||||
# check for use of 'up' flag and warn/except if used
|
||||
for name, pool in dynamic.pools.items():
|
||||
for value in pool.data['values']:
|
||||
if value['up'] is not None:
|
||||
msg = '"up" flag is not supported for "{}" pool' \
|
||||
' in {}'.format(name, record.fqdn)
|
||||
fallback = 'ignoring it, octodns-sync command ' \
|
||||
'will keep showing changes'
|
||||
self.supports_warn_or_except(msg, fallback)
|
||||
|
||||
if rules != dynamic.rules:
|
||||
record = record.copy()
|
||||
record.dynamic.rules = rules
|
||||
|
||||
@@ -418,6 +418,7 @@ class _DynamicPool(object):
|
||||
{
|
||||
'value': d['value'],
|
||||
'weight': d.get('weight', 1),
|
||||
'up': d.get('up'), # TODO: add validation on this field
|
||||
} for d in data['values']
|
||||
]
|
||||
values.sort(key=lambda d: d['value'])
|
||||
|
||||
Reference in New Issue
Block a user