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.
pull/18777/head
Jesse Keating 9 years ago committed by Matt Clay
parent c0eedc6e87
commit a913370687

@ -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']
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): 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…
Cancel
Save