mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-07-02 14:40:19 -07:00
Add support for neutronclient
The quantum_* modules will now try neutronclient first, and fall back to quantumclient. If that fails, error out. The code now references neutron instead of quantum in all internal cases.
This commit is contained in:
parent
60e7a72829
commit
ab52efc7fb
7 changed files with 249 additions and 227 deletions
|
@ -18,11 +18,14 @@
|
|||
|
||||
try:
|
||||
from novaclient.v1_1 import client as nova_client
|
||||
from quantumclient.quantum import client
|
||||
try:
|
||||
from neutronclient.neutron import client
|
||||
except ImportError:
|
||||
from quantumclient.quantum import client
|
||||
from keystoneclient.v2_0 import client as ksclient
|
||||
import time
|
||||
except ImportError:
|
||||
print("failed=True msg='glanceclient,keystoneclient and quantumclient client are required'")
|
||||
print("failed=True msg='novaclient,keystoneclient and quantumclient (or neutronclient) are required'")
|
||||
|
||||
DOCUMENTATION = '''
|
||||
---
|
||||
|
@ -72,7 +75,7 @@ options:
|
|||
- The name of the instance to which the IP address should be assigned
|
||||
required: true
|
||||
default: None
|
||||
requirements: ["novaclient", "quantumclient", "keystoneclient"]
|
||||
requirements: ["novaclient", "quantumclient", "neutronclient", "keystoneclient"]
|
||||
'''
|
||||
|
||||
EXAMPLES = '''
|
||||
|
@ -99,10 +102,10 @@ def _get_endpoint(module, ksclient):
|
|||
try:
|
||||
endpoint = ksclient.service_catalog.url_for(service_type='network', endpoint_type='publicURL')
|
||||
except Exception as e:
|
||||
module.fail_json(msg = "Error getting endpoint for glance: %s" % e.message)
|
||||
module.fail_json(msg = "Error getting network endpoint: %s" % e.message)
|
||||
return endpoint
|
||||
|
||||
def _get_quantum_client(module, kwargs):
|
||||
def _get_neutron_client(module, kwargs):
|
||||
_ksclient = _get_ksclient(module, kwargs)
|
||||
token = _ksclient.auth_token
|
||||
endpoint = _get_endpoint(module, _ksclient)
|
||||
|
@ -111,10 +114,10 @@ def _get_quantum_client(module, kwargs):
|
|||
'endpoint_url': endpoint
|
||||
}
|
||||
try:
|
||||
quantum = client.Client('2.0', **kwargs)
|
||||
neutron = client.Client('2.0', **kwargs)
|
||||
except Exception as e:
|
||||
module.fail_json(msg = "Error in connecting to quantum: %s " % e.message)
|
||||
return quantum
|
||||
module.fail_json(msg = "Error in connecting to neutron: %s " % e.message)
|
||||
return neutron
|
||||
|
||||
def _get_server_state(module, nova):
|
||||
server_info = None
|
||||
|
@ -130,68 +133,68 @@ def _get_server_state(module, nova):
|
|||
break
|
||||
except Exception as e:
|
||||
module.fail_json(msg = "Error in getting the server list: %s" % e.message)
|
||||
return server_info, server
|
||||
|
||||
def _get_port_info(quantum, module, instance_id):
|
||||
return server_info, server
|
||||
|
||||
def _get_port_info(neutron, module, instance_id):
|
||||
kwargs = {
|
||||
'device_id': instance_id,
|
||||
}
|
||||
try:
|
||||
ports = quantum.list_ports(**kwargs)
|
||||
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, None
|
||||
return ports['ports'][0]['fixed_ips'][0]['ip_address'], ports['ports'][0]['id']
|
||||
|
||||
def _get_floating_ip(module, quantum, fixed_ip_address):
|
||||
|
||||
def _get_floating_ip(module, neutron, fixed_ip_address):
|
||||
kwargs = {
|
||||
'fixed_ip_address': fixed_ip_address
|
||||
}
|
||||
try:
|
||||
ips = quantum.list_floatingips(**kwargs)
|
||||
ips = neutron.list_floatingips(**kwargs)
|
||||
except Exception as e:
|
||||
module.fail_json(msg = "error in fetching the floatingips's %s" % e.message)
|
||||
if not ips['floatingips']:
|
||||
return None, None
|
||||
return ips['floatingips'][0]['id'], ips['floatingips'][0]['floating_ip_address']
|
||||
|
||||
def _create_floating_ip(quantum, module, port_id, net_id):
|
||||
def _create_floating_ip(neutron, module, port_id, net_id):
|
||||
kwargs = {
|
||||
'port_id': port_id,
|
||||
'floating_network_id': net_id
|
||||
}
|
||||
try:
|
||||
result = quantum.create_floatingip({'floatingip': kwargs})
|
||||
result = neutron.create_floatingip({'floatingip': kwargs})
|
||||
except Exception as e:
|
||||
module.fail_json(msg="There was an error in updating the floating ip address: %s" % e.message)
|
||||
module.exit_json(changed=True, result=result, public_ip=result['floatingip']['floating_ip_address'])
|
||||
|
||||
def _get_net_id(quantum, module):
|
||||
def _get_net_id(neutron, module):
|
||||
kwargs = {
|
||||
'name': module.params['network_name'],
|
||||
}
|
||||
try:
|
||||
networks = quantum.list_networks(**kwargs)
|
||||
networks = neutron.list_networks(**kwargs)
|
||||
except Exception as e:
|
||||
module.fail_json("Error in listing quantum networks: %s" % e.message)
|
||||
module.fail_json("Error in listing neutron networks: %s" % e.message)
|
||||
if not networks['networks']:
|
||||
return None
|
||||
return networks['networks'][0]['id']
|
||||
|
||||
def _update_floating_ip(quantum, module, port_id, floating_ip_id):
|
||||
def _update_floating_ip(neutron, module, port_id, floating_ip_id):
|
||||
kwargs = {
|
||||
'port_id': port_id
|
||||
}
|
||||
try:
|
||||
result = quantum.update_floatingip(floating_ip_id, {'floatingip': kwargs})
|
||||
result = neutron.update_floatingip(floating_ip_id, {'floatingip': kwargs})
|
||||
except Exception as e:
|
||||
module.fail_json(msg="There was an error in updating the floating ip address: %s" % e.message)
|
||||
module.exit_json(changed=True, result=result)
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
|
||||
module = AnsibleModule(
|
||||
argument_spec = dict(
|
||||
login_username = dict(default='admin'),
|
||||
|
@ -200,39 +203,39 @@ def main():
|
|||
auth_url = dict(default='http://127.0.0.1:35357/v2.0/'),
|
||||
region_name = dict(default=None),
|
||||
network_name = dict(required=True),
|
||||
instance_name = dict(required=True),
|
||||
instance_name = dict(required=True),
|
||||
state = dict(default='present', choices=['absent', 'present'])
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
try:
|
||||
nova = nova_client.Client(module.params['login_username'], module.params['login_password'],
|
||||
nova = nova_client.Client(module.params['login_username'], module.params['login_password'],
|
||||
module.params['login_tenant_name'], module.params['auth_url'], service_type='compute')
|
||||
quantum = _get_quantum_client(module, module.params)
|
||||
neutron = _get_neutron_client(module, module.params)
|
||||
except Exception as e:
|
||||
module.fail_json(msg="Error in authenticating to nova: %s" % e.message)
|
||||
|
||||
|
||||
server_info, server_obj = _get_server_state(module, nova)
|
||||
if not server_info:
|
||||
module.fail_json(msg="The instance name provided cannot be found")
|
||||
|
||||
fixed_ip, port_id = _get_port_info(quantum, module, server_info['id'])
|
||||
fixed_ip, port_id = _get_port_info(neutron, module, server_info['id'])
|
||||
if not port_id:
|
||||
module.fail_json(msg="Cannot find a port for this instance, maybe fixed ip is not assigned")
|
||||
|
||||
floating_id, floating_ip = _get_floating_ip(module, quantum, fixed_ip)
|
||||
floating_id, floating_ip = _get_floating_ip(module, neutron, fixed_ip)
|
||||
|
||||
if module.params['state'] == 'present':
|
||||
if floating_ip:
|
||||
module.exit_json(changed = False, public_ip=floating_ip)
|
||||
net_id = _get_net_id(quantum, module)
|
||||
net_id = _get_net_id(neutron, module)
|
||||
if not net_id:
|
||||
module.fail_json(msg = "cannot find the network specified, please check")
|
||||
_create_floating_ip(quantum, module, port_id, net_id)
|
||||
_create_floating_ip(neutron, module, port_id, net_id)
|
||||
|
||||
if module.params['state'] == 'absent':
|
||||
if floating_ip:
|
||||
_update_floating_ip(quantum, module, None, floating_id)
|
||||
_update_floating_ip(neutron, module, None, floating_id)
|
||||
module.exit_json(changed=False)
|
||||
|
||||
# this is magic, see lib/ansible/module.params['common.py
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue