summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavide Guerri <davide.guerri@gmail.com>2015-04-21 14:54:51 +0100
committerDavide Guerri <davide.guerri@gmail.com>2015-04-21 14:54:51 +0100
commit0a1a8de0f1f45579a7d440bcd389a613307b3203 (patch)
treeb1397801d3cc16f50f68dea7546a99e2cc4d4d27
parentee72221527b96155426da413235a47469e3b4fbd (diff)
downloadopenstack-ansible-modules-0a1a8de0f1f45579a7d440bcd389a613307b3203.tar.gz
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.
-rw-r--r--neutron_router_gateway60
1 files 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()
-
-