Make os_floating_ip module idempotent
Current module fails when tries to assign floating-ips to server that already have them and either fails or reports "changed=True" when no ip was added Removing floating-ip doesn't require address Server name/id is enough to remove a floating ip.
This commit is contained in:
parent
3945794704
commit
6b20645b40
1 changed files with 38 additions and 10 deletions
|
@ -163,10 +163,33 @@ def main():
|
||||||
msg="server {0} not found".format(server_name_or_id))
|
msg="server {0} not found".format(server_name_or_id))
|
||||||
|
|
||||||
if state == 'present':
|
if state == 'present':
|
||||||
fip_address = cloud.get_server_public_ip(server)
|
# If f_ip already assigned to server, check that it matches
|
||||||
f_ip = _get_floating_ip(cloud, fip_address)
|
# requirements.
|
||||||
|
f_ip = cloud.get_server_public_ip(server)
|
||||||
|
f_ip = _get_floating_ip(cloud, f_ip) if f_ip else f_ip
|
||||||
if f_ip:
|
if f_ip:
|
||||||
module.exit_json(changed=False, floating_ip=f_ip)
|
if network:
|
||||||
|
network_id = cloud.get_network(name_or_id=network)["id"]
|
||||||
|
else:
|
||||||
|
network_id = None
|
||||||
|
if all([fixed_address, f_ip.fixed_ip_address == fixed_address,
|
||||||
|
network, f_ip.network != network_id]):
|
||||||
|
# Current state definitely conflicts with requirements
|
||||||
|
module.fail_json(msg="server {server} already has a "
|
||||||
|
"floating-ip on requested "
|
||||||
|
"interface but it doesn't match "
|
||||||
|
"requested network {network: {fip}"
|
||||||
|
.format(server=server_name_or_id,
|
||||||
|
network=network,
|
||||||
|
fip=remove_values(f_ip,
|
||||||
|
module.no_log_values)))
|
||||||
|
if not network or f_ip.network == network_id:
|
||||||
|
# Requirements are met
|
||||||
|
module.exit_json(changed=False, floating_ip=f_ip)
|
||||||
|
|
||||||
|
# Requirments are vague enough to ignore exisitng f_ip and try
|
||||||
|
# to create a new f_ip to the server.
|
||||||
|
|
||||||
server = cloud.add_ips_to_server(
|
server = cloud.add_ips_to_server(
|
||||||
server=server, ips=floating_ip_address, ip_pool=network,
|
server=server, ips=floating_ip_address, ip_pool=network,
|
||||||
reuse=reuse, fixed_address=fixed_address, wait=wait,
|
reuse=reuse, fixed_address=fixed_address, wait=wait,
|
||||||
|
@ -178,22 +201,27 @@ def main():
|
||||||
|
|
||||||
elif state == 'absent':
|
elif state == 'absent':
|
||||||
if floating_ip_address is None:
|
if floating_ip_address is None:
|
||||||
module.fail_json(msg="floating_ip_address is required")
|
if not server_name_or_id:
|
||||||
|
module.fail_json(msg="either server or floating_ip_address are required")
|
||||||
|
server = cloud.get_server(server_name_or_id)
|
||||||
|
floating_ip_address = cloud.get_server_public_ip(server)
|
||||||
|
|
||||||
f_ip = _get_floating_ip(cloud, floating_ip_address)
|
f_ip = _get_floating_ip(cloud, floating_ip_address)
|
||||||
|
|
||||||
if not f_ip:
|
if not f_ip:
|
||||||
# Nothing to detach
|
# Nothing to detach
|
||||||
module.exit_json(changed=False)
|
module.exit_json(changed=False)
|
||||||
|
changed = False
|
||||||
cloud.detach_ip_from_server(
|
if f_ip["fixed_ip_address"]:
|
||||||
server_id=server['id'], floating_ip_id=f_ip['id'])
|
cloud.detach_ip_from_server(
|
||||||
# Update the floating IP status
|
server_id=server['id'], floating_ip_id=f_ip['id'])
|
||||||
f_ip = cloud.get_floating_ip(id=f_ip['id'])
|
# Update the floating IP status
|
||||||
|
f_ip = cloud.get_floating_ip(id=f_ip['id'])
|
||||||
|
changed = True
|
||||||
if purge:
|
if purge:
|
||||||
cloud.delete_floating_ip(f_ip['id'])
|
cloud.delete_floating_ip(f_ip['id'])
|
||||||
module.exit_json(changed=True)
|
module.exit_json(changed=True)
|
||||||
module.exit_json(changed=True, floating_ip=f_ip)
|
module.exit_json(changed=changed, floating_ip=f_ip)
|
||||||
|
|
||||||
except shade.OpenStackCloudException as e:
|
except shade.OpenStackCloudException as e:
|
||||||
module.fail_json(msg=str(e), extra_data=e.extra_data)
|
module.fail_json(msg=str(e), extra_data=e.extra_data)
|
||||||
|
|
Loading…
Reference in a new issue