diff --git a/library/cloud/quantum_floating_ip b/library/cloud/quantum_floating_ip index 54e1c68d79..531ddfe2b8 100644 --- a/library/cloud/quantum_floating_ip +++ b/library/cloud/quantum_floating_ip @@ -67,7 +67,7 @@ options: default: present network_name: description: - - Name of the network from which IP has to be assigned to VM. Please make sure the network is an external network + - Name of the network from which IP has to be assigned to VM. Please make sure the network is an external network required: true default: None instance_name: @@ -75,6 +75,11 @@ options: - The name of the instance to which the IP address should be assigned required: true default: None + internal_network_name: + description: + - The name of the network of the port to associate with the floating ip. Necessary when VM multiple networks. + required: false + default: None requirements: ["novaclient", "quantumclient", "neutronclient", "keystoneclient"] ''' @@ -82,7 +87,7 @@ EXAMPLES = ''' # Assign a floating ip to the instance from an external network - quantum_floating_ip: state=present login_username=admin login_password=admin login_tenant_name=admin network_name=external_network - instance_name=vm1 + instance_name=vm1 internal_network_name=internal_network ''' def _get_ksclient(module, kwargs): @@ -135,7 +140,13 @@ def _get_server_state(module, nova): module.fail_json(msg = "Error in getting the server list: %s" % e.message) return server_info, server -def _get_port_info(neutron, module, instance_id): +def _get_port_info(neutron, module, instance_id, internal_network_name=None): + if internal_network_name: + kwargs = { + 'name': internal_network_name, + } + networks = neutron.list_networks(**kwargs) + subnet_id = networks['networks'][0]['subnets'][0] kwargs = { 'device_id': instance_id, } @@ -143,9 +154,16 @@ def _get_port_info(neutron, module, instance_id): ports = neutron.list_ports(**kwargs) except Exception as e: module.fail_json( msg = "Error in listing ports: %s" % e.message) + if subnet_id: + port = next(port for port in ports['ports'] if port['fixed_ips'][0]['subnet_id'] == subnet_id) + port_id = port['id'] + fixed_ip_address = port['fixed_ips'][0]['ip_address'] + else: + port_id = ports['ports'][0]['id'] + fixed_ip_address = ports['ports'][0]['fixed_ips'][0]['ip_address'] if not ports['ports']: return None, None - return ports['ports'][0]['fixed_ips'][0]['ip_address'], ports['ports'][0]['id'] + return fixed_ip_address, port_id def _get_floating_ip(module, neutron, fixed_ip_address): kwargs = { @@ -204,7 +222,8 @@ def main(): region_name = dict(default=None), network_name = dict(required=True), instance_name = dict(required=True), - state = dict(default='present', choices=['absent', 'present']) + state = dict(default='present', choices=['absent', 'present']), + internal_network_name = dict(default=None), ), ) @@ -219,7 +238,7 @@ def main(): if not server_info: module.fail_json(msg="The instance name provided cannot be found") - fixed_ip, port_id = _get_port_info(neutron, module, server_info['id']) + fixed_ip, port_id = _get_port_info(neutron, module, server_info['id'], module.params['internal_network_name']) if not port_id: module.fail_json(msg="Cannot find a port for this instance, maybe fixed ip is not assigned")