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:
Jesse Keating 2015-07-24 15:41:19 -07:00 committed by Matt Clay
parent c0eedc6e87
commit a913370687

View file

@ -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