summaryrefslogtreecommitdiffstats
path: root/snaps/openstack/utils/nova_utils.py
diff options
context:
space:
mode:
authorspisarski <s.pisarski@cablelabs.com>2018-02-22 11:42:52 -0700
committerspisarski <s.pisarski@cablelabs.com>2018-02-22 11:42:52 -0700
commitc711acf8ae3e4ad6f746500747857bcc9fd6f7be (patch)
tree4eeba467b4f42b37e935ccfff6b547bd11c65778 /snaps/openstack/utils/nova_utils.py
parentf3553913925b8ee5869c8e06047d6e4161a968c7 (diff)
Changed pattern on how objects lookup themselves by name and project.
The pattern being replaced has unwittingly added the requirement that all creator credentials must be of type 'admin' as when looking up the associated project ID required a call to keystone.projects.list(). As the SNAPS integration tests were always creating users with an 'admin' role, this issue was not caught. As part of this patch, integration test users will no longer be admin. JIRA: SNAPS-274 Change-Id: I02957f69e31a9d4dfa63362d371f061687e59fbf Signed-off-by: spisarski <s.pisarski@cablelabs.com>
Diffstat (limited to 'snaps/openstack/utils/nova_utils.py')
-rw-r--r--snaps/openstack/utils/nova_utils.py66
1 files changed, 43 insertions, 23 deletions
diff --git a/snaps/openstack/utils/nova_utils.py b/snaps/openstack/utils/nova_utils.py
index b37e0a4..5e6a037 100644
--- a/snaps/openstack/utils/nova_utils.py
+++ b/snaps/openstack/utils/nova_utils.py
@@ -55,16 +55,17 @@ def nova_client(os_creds):
region_name=os_creds.region_name)
-def create_server(nova, neutron, glance, instance_config, image_config,
- project_id, keypair_config=None):
+def create_server(nova, keystone, neutron, glance, instance_config,
+ image_config, project_name, keypair_config=None):
"""
Creates a VM instance
:param nova: the nova client (required)
+ :param keystone: the keystone client for retrieving projects (required)
:param neutron: the neutron client for retrieving ports (required)
:param glance: the glance client (required)
:param instance_config: the VMInstConfig object (required)
:param image_config: the VM's ImageConfig object (required)
- :param project_id: the associated project ID (required)
+ :param project_name: the associated project name (required)
:param keypair_config: the VM's KeypairConfig object (optional)
:return: a snaps.domain.VmInst object
"""
@@ -73,7 +74,8 @@ def create_server(nova, neutron, glance, instance_config, image_config,
for port_setting in instance_config.port_settings:
port = neutron_utils.get_port(
- neutron, port_settings=port_setting, project_id=project_id)
+ neutron, keystone, port_settings=port_setting,
+ project_name=project_name)
if port:
ports.append(port)
else:
@@ -122,19 +124,21 @@ def create_server(nova, neutron, glance, instance_config, image_config,
server = nova.servers.create(**args)
- return __map_os_server_obj_to_vm_inst(neutron, server, project_id)
+ return __map_os_server_obj_to_vm_inst(
+ neutron, keystone, server, project_name)
else:
raise NovaException(
'Cannot create instance, image cannot be located with name %s',
image_config.name)
-def get_server(nova, neutron, vm_inst_settings=None, server_name=None,
- project_id=None):
+def get_server(nova, neutron, keystone, vm_inst_settings=None,
+ server_name=None, project_id=None):
"""
Returns a VmInst object for the first server instance found.
:param nova: the Nova client
:param neutron: the Neutron client
+ :param keystone: the Keystone client
:param vm_inst_settings: the VmInstanceConfig object from which to build
the query if not None
:param server_name: the server with this name to return if vm_inst_settings
@@ -150,7 +154,8 @@ def get_server(nova, neutron, vm_inst_settings=None, server_name=None,
servers = nova.servers.list(search_opts=search_opts)
for server in servers:
- return __map_os_server_obj_to_vm_inst(neutron, server, project_id)
+ return __map_os_server_obj_to_vm_inst(
+ neutron, keystone, server, project_id)
def get_server_connection(nova, vm_inst_settings=None, server_name=None):
@@ -174,11 +179,14 @@ def get_server_connection(nova, vm_inst_settings=None, server_name=None):
return server.links[0]
-def __map_os_server_obj_to_vm_inst(neutron, os_server, project_id):
+def __map_os_server_obj_to_vm_inst(neutron, keystone, os_server,
+ project_name=None):
"""
Returns a VmInst object for an OpenStack Server object
- :param neutron: the Neutron client (when None, ports will be empty)
+ :param neutron: the Neutron client
+ :param keystone: the Keystone client
:param os_server: the OpenStack server object
+ :param project_name: the associated project name
:return: an equivalent SNAPS-OO VmInst domain object
"""
sec_grp_names = list()
@@ -192,7 +200,8 @@ def __map_os_server_obj_to_vm_inst(neutron, os_server, project_id):
if len(os_server.networks) > 0:
for net_name, ips in os_server.networks.items():
network = neutron_utils.get_network(
- neutron, network_name=net_name, project_id=project_id)
+ neutron, keystone, network_name=net_name,
+ project_name=project_name)
ports = neutron_utils.get_ports(neutron, network, ips)
for port in ports:
out_ports.append(port)
@@ -254,30 +263,35 @@ def get_server_console_output(nova, server):
return None
-def get_latest_server_object(nova, neutron, server, project_id):
+def get_latest_server_object(nova, neutron, keystone, server, project_name):
"""
Returns a server with a given id
:param nova: the Nova client
:param neutron: the Neutron client
+ :param keystone: the Keystone client
:param server: the old server object
- :param project_id: the associated project ID
+ :param project_name: the associated project name
:return: the list of servers or None if not found
"""
server = __get_latest_server_os_object(nova, server)
- return __map_os_server_obj_to_vm_inst(neutron, server, project_id)
+ return __map_os_server_obj_to_vm_inst(
+ neutron, keystone, server, project_name)
-def get_server_object_by_id(nova, neutron, server_id, project_id):
+def get_server_object_by_id(nova, neutron, keystone, server_id,
+ project_name=None):
"""
Returns a server with a given id
:param nova: the Nova client
:param neutron: the Neutron client
+ :param keystone: the Keystone client
:param server_id: the server's id
- :param project_id: the associated project ID
+ :param project_name: the associated project name
:return: an SNAPS-OO VmInst object or None if not found
"""
server = __get_latest_server_os_object_by_id(nova, server_id)
- return __map_os_server_obj_to_vm_inst(neutron, server, project_id)
+ return __map_os_server_obj_to_vm_inst(
+ neutron, keystone, server, project_name)
def get_server_security_group_names(nova, server):
@@ -720,16 +734,18 @@ def update_quotas(nova, project_id, compute_quotas):
return nova.quotas.update(project_id, **update_values)
-def attach_volume(nova, neutron, server, volume, project_id, timeout=120):
+def attach_volume(nova, neutron, keystone, server, volume, project_name,
+ timeout=120):
"""
Attaches a volume to a server. When the timeout parameter is used, a VmInst
object with the proper volume updates is returned unless it has not been
updated in the allotted amount of time then an Exception will be raised.
:param nova: the nova client
:param neutron: the neutron client
+ :param keystone: the neutron client
:param server: the VMInst domain object
:param volume: the Volume domain object
- :param project_id: the associated project ID
+ :param project_name: the associated project name
:param timeout: denotes the amount of time to block to determine if the
has been properly attached.
:return: updated VmInst object
@@ -738,7 +754,8 @@ def attach_volume(nova, neutron, server, volume, project_id, timeout=120):
start_time = time.time()
while time.time() < start_time + timeout:
- vm = get_server_object_by_id(nova, neutron, server.id, project_id)
+ vm = get_server_object_by_id(
+ nova, neutron, keystone, server.id, project_name)
for vol_dict in vm.volume_ids:
if volume.id == vol_dict['id']:
return vm
@@ -749,16 +766,18 @@ def attach_volume(nova, neutron, server, volume, project_id, timeout=120):
volume.id, server.id))
-def detach_volume(nova, neutron, server, volume, project_id, timeout=120):
+def detach_volume(nova, neutron, keystone, server, volume, project_name,
+ timeout=120):
"""
Detaches a volume to a server. When the timeout parameter is used, a VmInst
object with the proper volume updates is returned unless it has not been
updated in the allotted amount of time then an Exception will be raised.
:param nova: the nova client
:param neutron: the neutron client
+ :param keystone: the keystone client
:param server: the VMInst domain object
:param volume: the Volume domain object
- :param project_id: the associated project ID
+ :param project_name: the associated project name
:param timeout: denotes the amount of time to block to determine if the
has been properly detached.
:return: updated VmInst object
@@ -767,7 +786,8 @@ def detach_volume(nova, neutron, server, volume, project_id, timeout=120):
start_time = time.time()
while time.time() < start_time + timeout:
- vm = get_server_object_by_id(nova, neutron, server.id, project_id)
+ vm = get_server_object_by_id(
+ nova, neutron, keystone, server.id, project_name)
if len(vm.volume_ids) == 0:
return vm
else: