From 0a1a8de0f1f45579a7d440bcd389a613307b3203 Mon Sep 17 00:00:00 2001 From: Davide Guerri Date: Tue, 21 Apr 2015 14:54:51 +0100 Subject: make router_gateway module idempotent list_ports() won't return gateway ports unless its performed by an admin. Using router info, we can also save 1 query. --- neutron_router_gateway | 60 +++++++++++++++++++++----------------------------- 1 file changed, 25 insertions(+), 35 deletions(-) diff --git a/neutron_router_gateway b/neutron_router_gateway index fec2e1b..3a9b7ce 100644 --- a/neutron_router_gateway +++ b/neutron_router_gateway @@ -93,7 +93,7 @@ def _get_ksclient(module, kwargs): global _os_keystone _os_keystone = kclient return kclient - + def _get_endpoint(module, ksclient): try: @@ -116,7 +116,7 @@ def _get_neutron_client(module, kwargs): module.fail_json(msg = "Error in connecting to neutron: %s " % e.message) return neutron -def _get_router_id(module, neutron): +def _get_router(module, neutron): kwargs = { 'name': module.params['router_name'], } @@ -126,7 +126,7 @@ def _get_router_id(module, neutron): module.fail_json(msg = "Error in getting the router list: %s " % e.message) if not routers['routers']: return None - return routers['routers'][0]['id'] + return routers['routers'][0] def _get_net_id(neutron, module): kwargs = { @@ -141,19 +141,6 @@ def _get_net_id(neutron, module): return None return networks['networks'][0]['id'] -def _get_port_id(neutron, module, router_id, network_id): - kwargs = { - 'device_id': router_id, - 'network_id': network_id, - } - try: - ports = neutron.list_ports(**kwargs) - except Exception as e: - module.fail_json( msg = "Error in listing ports: %s" % e.message) - if not ports['ports']: - return None - return ports['ports'][0]['id'] - def _add_gateway_router(neutron, module, router_id, network_id): kwargs = { 'network_id': network_id @@ -163,16 +150,16 @@ def _add_gateway_router(neutron, module, router_id, network_id): except Exception as e: module.fail_json(msg = "Error in adding gateway to router: %s" % e.message) return True - + def _remove_gateway_router(neutron, module, router_id): try: neutron.remove_gateway_router(router_id) except Exception as e: module.fail_json(msg = "Error in removing gateway to router: %s" % e.message) return True - + def main(): - + module = AnsibleModule( argument_spec = dict( login_username = dict(default='admin'), @@ -185,33 +172,36 @@ def main(): state = dict(default='present', choices=['absent', 'present']), ), ) - + neutron = _get_neutron_client(module, module.params) - router_id = _get_router_id(module, neutron) + router = _get_router(module, neutron) - if not router_id: + if not router: module.fail_json(msg="failed to get the router id, please check the router name") network_id = _get_net_id(neutron, module) if not network_id: module.fail_json(msg="failed to get the network id, please check the network name and make sure it is external") - + if module.params['state'] == 'present': - port_id = _get_port_id(neutron, module, router_id, network_id) - if not port_id: - _add_gateway_router(neutron, module, router_id, network_id) - module.exit_json(changed=True, result="created") - module.exit_json(changed=False, result="success") + if router.get('external_gateway_info') is None: + _add_gateway_router(neutron, module, router['id'], network_id) + module.exit_json(changed=True, updated=False, result="created") + else: + if router['external_gateway_info']['network_id'] == network_id: + module.exit_json(changed=False, updated=False, result="success") + else: + _remove_gateway_router(neutron, module, router['id']) + _add_gateway_router(neutron, module, router['id'], network_id) + module.exit_json(changed=True, updated=True, result="created") if module.params['state'] == 'absent': - port_id = _get_port_id(neutron, module, router_id, network_id) - if not port_id: - module.exit_json(changed=False, result="Success") - _remove_gateway_router(neutron, module, router_id) - module.exit_json(changed=True, result="Deleted") + if router.get('external_gateway_info') is None: + module.exit_json(changed=False, updated=False, result="success") + else: + _remove_gateway_router(neutron, module, router['id']) + module.exit_json(changed=True, updated=False, result="deleted") # this is magic, see lib/ansible/module.params['common.py from ansible.module_utils.basic import * main() - - -- cgit v1.2.1