diff --git a/lib/ansible/module_utils/openstack.py b/lib/ansible/module_utils/openstack.py index c70eb9fbfa8..7f955a112d3 100644 --- a/lib/ansible/module_utils/openstack.py +++ b/lib/ansible/module_utils/openstack.py @@ -54,3 +54,16 @@ def openstack_argument_spec(): else: spec['login_tenant_name'] = dict(required=True) return spec + + +def openstack_find_nova_addresses(addresses, ext_tag, key_name=None): + + ret = [] + for (k, v) in addresses.iteritems(): + if key_name and k == key_name: + ret.extend([addrs['addr'] for addrs in v]) + else: + for interface_spec in v: + if 'OS-EXT-IPS:type' in interface_spec and interface_spec['OS-EXT-IPS:type'] == ext_tag: + ret.append(interface_spec['addr']) + return ret diff --git a/library/cloud/nova_compute b/library/cloud/nova_compute index 933d5714930..2358d7cb639 100644 --- a/library/cloud/nova_compute +++ b/library/cloud/nova_compute @@ -382,19 +382,6 @@ def _add_floating_ip(module, nova, server): return server -def _get_ips(addresses, ext_tag, key_name=None): - - ret = [] - for (k, v) in addresses.iteritems(): - if key_name and k == key_name: - ret.extend([addrs['addr'] for addrs in v]) - else: - for interface_spec in v: - if 'OS-EXT-IPS:type' in interface_spec and interface_spec['OS-EXT-IPS:type'] == ext_tag: - ret.append(interface_spec['addr']) - return ret - - def _get_image_id(module, nova): if module.params['image_name']: for image in nova.images.list(): @@ -446,8 +433,8 @@ def _create_server(module, nova): if server.status == 'ACTIVE': server = _add_floating_ip(module, nova, server) - private = _get_ips(getattr(server, 'addresses'), 'fixed', 'private') - public = _get_ips(getattr(server, 'addresses'), 'floating', 'public') + private = openstack_find_nova_addresses(getattr(server, 'addresses'), 'fixed', 'private') + public = openstack_find_nova_addresses(getattr(server, 'addresses'), 'floating', 'public') # now exit with info module.exit_json(changed = True, id = server.id, private_ip=''.join(private), public_ip=''.join(public), status = server.status, info = server._info) @@ -459,8 +446,8 @@ def _create_server(module, nova): module.fail_json(msg = "Timeout waiting for the server to come up.. Please check manually") if server.status == 'ERROR': module.fail_json(msg = "Error in creating the server.. Please check manually") - private = _get_ips(getattr(server, 'addresses'), 'fixed', 'private') - public = _get_ips(getattr(server, 'addresses'), 'floating', 'public') + private = openstack_find_nova_addresses(getattr(server, 'addresses'), 'fixed', 'private') + public = openstack_find_nova_addresses(getattr(server, 'addresses'), 'floating', 'public') module.exit_json(changed = True, id = info['id'], private_ip=''.join(private), public_ip=''.join(public), status = server.status, info = server._info) @@ -473,7 +460,7 @@ def _delete_floating_ip_list(module, nova, server, extra_ips): def _check_floating_ips(module, nova, server): changed = False if module.params['floating_ip_pools'] or module.params['floating_ips'] or module.params['auto_floating_ip']: - ips = _get_ips(server.addresses, 'floating') + ips = openstack_find_nova_addresses(server.addresses, 'floating') if not ips: # If we're configured to have a floating but we don't have one, # let's add one @@ -516,8 +503,8 @@ def _get_server_state(module, nova): if server.status != 'ACTIVE': module.fail_json( msg="The VM is available but not Active. state:" + server.status) (ip_changed, server) = _check_floating_ips(module, nova, server) - private = _get_ips(getattr(server, 'addresses'), 'fixed', 'private') - public = _get_ips(getattr(server, 'addresses'), 'floating', 'public') + private = openstack_find_nova_addresses(getattr(server, 'addresses'), 'fixed', 'private') + public = openstack_find_nova_addresses(getattr(server, 'addresses'), 'floating', 'public') module.exit_json(changed = ip_changed, id = server.id, public_ip = ''.join(public), private_ip = ''.join(private), info = server._info) if server and module.params['state'] == 'absent': return True diff --git a/plugins/inventory/nova.py b/plugins/inventory/nova.py index 3ae19d0d177..585e26732ed 100755 --- a/plugins/inventory/nova.py +++ b/plugins/inventory/nova.py @@ -28,6 +28,8 @@ try: except: import simplejson as json +from ansible.module_utils.openstack import * + ################################################### # executed with no parameters, return the list of # all groups and hosts @@ -57,12 +59,12 @@ if not config: sys.exit('Unable to find configfile in %s' % ', '.join(NOVA_CONFIG_FILES)) client = nova_client.Client( - version = config.get('openstack', 'version'), - username = config.get('openstack', 'username'), - api_key = config.get('openstack', 'api_key'), - auth_url = config.get('openstack', 'auth_url'), + config.get('openstack', 'version'), + config.get('openstack', 'username'), + config.get('openstack', 'api_key'), + config.get('openstack', 'project_id'), + config.get('openstack', 'auth_url'), region_name = config.get('openstack', 'region_name'), - project_id = config.get('openstack', 'project_id'), auth_system = config.get('openstack', 'auth_system') ) @@ -70,20 +72,20 @@ if len(sys.argv) == 2 and (sys.argv[1] == '--list'): groups = {} # Cycle on servers - for f in client.servers.list(): - private = [ x['addr'] for x in getattr(f, 'addresses').itervalues().next() if x['OS-EXT-IPS:type'] == 'fixed'] - public = [ x['addr'] for x in getattr(f, 'addresses').itervalues().next() if x['OS-EXT-IPS:type'] == 'floating'] + for server in client.servers.list(): + private = openstack_find_nova_addresses(getattr(server, 'addresses'), 'fixed', 'private') + public = openstack_find_nova_addresses(getattr(server, 'addresses'), 'floating', 'public') # Define group (or set to empty string) - group = f.metadata['group'] if f.metadata.has_key('group') else 'undefined' + group = server.metadata['group'] if server.metadata.has_key('group') else 'undefined' # Create group if not exist if group not in groups: groups[group] = [] # Append group to list - if f.accessIPv4: - groups[group].append(f.accessIPv4) + if server.accessIPv4: + groups[group].append(server.accessIPv4) continue if public: groups[group].append(''.join(public)) @@ -104,8 +106,8 @@ elif len(sys.argv) == 3 and (sys.argv[1] == '--host'): results = {} ips = [] for instance in client.servers.list(): - private = [ x['addr'] for x in getattr(instance, 'addresses').itervalues().next() if x['OS-EXT-IPS:type'] == 'fixed'] - public = [ x['addr'] for x in getattr(instance, 'addresses').itervalues().next() if x['OS-EXT-IPS:type'] == 'floating'] + private = openstack_find_nova_addresses(getattr(instance, 'addresses'), 'fixed', 'private') + public = openstack_find_nova_addresses(getattr(instance, 'addresses'), 'floating', 'public') ips.append( instance.accessIPv4) ips.append(''.join(private)) ips.append(''.join(public))