Handle non-updatable openstack subnet details
Some things cannot be updated via the API, so check for those and fail if the user is wanting to update them. Also don't try to update ipv6 stuff, as that doesn't work and will cause a traceback.
This commit is contained in:
parent
c0eedc6e87
commit
a913370687
1 changed files with 36 additions and 8 deletions
|
@ -144,9 +144,38 @@ EXAMPLES = '''
|
||||||
ipv6_address_mode: dhcpv6-stateless
|
ipv6_address_mode: dhcpv6-stateless
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
def _can_update(subnet, module, cloud):
|
||||||
|
"""Check for differences in non-updatable values"""
|
||||||
|
network_name = module.params['network_name']
|
||||||
|
cidr = module.params['cidr']
|
||||||
|
ip_version = int(module.params['ip_version'])
|
||||||
|
ipv6_ra_mode = module.params['ipv6_ra_mode']
|
||||||
|
ipv6_a_mode = module.params['ipv6_address_mode']
|
||||||
|
|
||||||
def _needs_update(subnet, module):
|
if network_name:
|
||||||
|
network = cloud.get_network(network_name)
|
||||||
|
if network:
|
||||||
|
netid = network['id']
|
||||||
|
else:
|
||||||
|
module.fail_json(msg='No network found for %s' % network_name)
|
||||||
|
if netid != subnet['network_id']:
|
||||||
|
module.fail_json(msg='Cannot update network_name in existing \
|
||||||
|
subnet')
|
||||||
|
if ip_version and subnet['ip_version'] != ip_version:
|
||||||
|
module.fail_json(msg='Cannot update ip_version in existing subnet')
|
||||||
|
if ipv6_ra_mode and subnet.get('ipv6_ra_mode', None) != ip_version:
|
||||||
|
module.fail_json(msg='Cannot update ipv6_ra_mode in existing subnet')
|
||||||
|
if ipv6_a_mode and subnet.get('ipv6_address_mode', None) != ipv6_a_mode:
|
||||||
|
module.fail_json(msg='Cannot update ipv6_address_mode in existing \
|
||||||
|
subnet')
|
||||||
|
|
||||||
|
def _needs_update(subnet, module, cloud):
|
||||||
"""Check for differences in the updatable values."""
|
"""Check for differences in the updatable values."""
|
||||||
|
|
||||||
|
# First check if we are trying to update something we're not allowed to
|
||||||
|
_can_update(subnet, module, cloud)
|
||||||
|
|
||||||
|
# now check for the things we are allowed to update
|
||||||
enable_dhcp = module.params['enable_dhcp']
|
enable_dhcp = module.params['enable_dhcp']
|
||||||
subnet_name = module.params['name']
|
subnet_name = module.params['name']
|
||||||
pool_start = module.params['allocation_pool_start']
|
pool_start = module.params['allocation_pool_start']
|
||||||
|
@ -176,12 +205,12 @@ def _needs_update(subnet, module):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def _system_state_change(module, subnet):
|
def _system_state_change(module, subnet, cloud):
|
||||||
state = module.params['state']
|
state = module.params['state']
|
||||||
if state == 'present':
|
if state == 'present':
|
||||||
if not subnet:
|
if not subnet:
|
||||||
return True
|
return True
|
||||||
return _needs_update(subnet, module)
|
return _needs_update(subnet, module, cloud)
|
||||||
if state == 'absent' and subnet:
|
if state == 'absent' and subnet:
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
@ -245,7 +274,8 @@ def main():
|
||||||
subnet = cloud.get_subnet(subnet_name)
|
subnet = cloud.get_subnet(subnet_name)
|
||||||
|
|
||||||
if module.check_mode:
|
if module.check_mode:
|
||||||
module.exit_json(changed=_system_state_change(module, subnet))
|
module.exit_json(changed=_system_state_change(module, subnet,
|
||||||
|
cloud))
|
||||||
|
|
||||||
if state == 'present':
|
if state == 'present':
|
||||||
if not subnet:
|
if not subnet:
|
||||||
|
@ -261,16 +291,14 @@ def main():
|
||||||
ipv6_address_mode=ipv6_a_mode)
|
ipv6_address_mode=ipv6_a_mode)
|
||||||
changed = True
|
changed = True
|
||||||
else:
|
else:
|
||||||
if _needs_update(subnet, module):
|
if _needs_update(subnet, module, cloud):
|
||||||
cloud.update_subnet(subnet['id'],
|
cloud.update_subnet(subnet['id'],
|
||||||
subnet_name=subnet_name,
|
subnet_name=subnet_name,
|
||||||
enable_dhcp=enable_dhcp,
|
enable_dhcp=enable_dhcp,
|
||||||
gateway_ip=gateway_ip,
|
gateway_ip=gateway_ip,
|
||||||
dns_nameservers=dns,
|
dns_nameservers=dns,
|
||||||
allocation_pools=pool,
|
allocation_pools=pool,
|
||||||
host_routes=host_routes,
|
host_routes=host_routes)
|
||||||
ipv6_ra_mode=ipv6_ra_mode,
|
|
||||||
ipv6_address_mode=ipv6_a_mode)
|
|
||||||
changed = True
|
changed = True
|
||||||
else:
|
else:
|
||||||
changed = False
|
changed = False
|
||||||
|
|
Loading…
Reference in a new issue