diff options
-rw-r--r-- | snaps/openstack/create_instance.py | 10 | ||||
-rw-r--r-- | snaps/openstack/create_project.py | 15 | ||||
-rw-r--r-- | snaps/openstack/create_router.py | 4 | ||||
-rw-r--r-- | snaps/openstack/tests/create_instance_tests.py | 8 | ||||
-rw-r--r-- | snaps/openstack/tests/create_router_tests.py | 7 | ||||
-rw-r--r-- | snaps/openstack/tests/os_source_file_test.py | 9 | ||||
-rw-r--r-- | snaps/openstack/utils/neutron_utils.py | 35 | ||||
-rw-r--r-- | snaps/openstack/utils/nova_utils.py | 31 | ||||
-rw-r--r-- | snaps/openstack/utils/tests/keystone_utils_tests.py | 15 |
9 files changed, 96 insertions, 38 deletions
diff --git a/snaps/openstack/create_instance.py b/snaps/openstack/create_instance.py index 02f1a44..2fdff25 100644 --- a/snaps/openstack/create_instance.py +++ b/snaps/openstack/create_instance.py @@ -91,9 +91,9 @@ class OpenStackVmInstance: VM with the same name already exists within the project """ - servers = nova_utils.get_servers_by_name(self.__nova, - self.instance_settings.name) - for server in servers: + server = nova_utils.get_server( + self.__nova, vm_inst_settings=self.instance_settings) + if server: if server.name == self.instance_settings.name: self.__vm = server logger.info( @@ -260,8 +260,8 @@ class OpenStackVmInstance: ports = list() for port_setting in port_settings: - port = neutron_utils.get_port_by_name(self.__neutron, - port_setting.name) + port = neutron_utils.get_port( + self.__neutron, port_settings=port_setting) if port: ports.append((port_setting.name, port)) elif not cleanup: diff --git a/snaps/openstack/create_project.py b/snaps/openstack/create_project.py index bc80789..6b06db4 100644 --- a/snaps/openstack/create_project.py +++ b/snaps/openstack/create_project.py @@ -15,7 +15,7 @@ import logging from keystoneclient.exceptions import NotFound -from snaps.openstack.utils import keystone_utils +from snaps.openstack.utils import keystone_utils, neutron_utils __author__ = 'spisarski' @@ -66,6 +66,19 @@ class OpenStackProject: :return: void """ if self.__project: + # Delete security group 'default' if exists + neutron = neutron_utils.neutron_client(self.__os_creds) + default_sec_grp = neutron_utils.get_security_group( + neutron, 'default', + tenant_id=self.__project.id) + if default_sec_grp: + try: + neutron_utils.delete_security_group( + neutron, default_sec_grp) + except: + pass + + # Delete Project try: keystone_utils.delete_project(self.__keystone, self.__project) except NotFound: diff --git a/snaps/openstack/create_router.py b/snaps/openstack/create_router.py index cf77b9f..877e064 100644 --- a/snaps/openstack/create_router.py +++ b/snaps/openstack/create_router.py @@ -89,8 +89,8 @@ class OpenStackRouter: 'Subnet not found with name ' + internal_subnet_name) for port_setting in self.router_settings.port_settings: - port = neutron_utils.get_port_by_name(self.__neutron, - port_setting.name) + port = neutron_utils.get_port( + self.__neutron, port_settings=port_setting) logger.info( 'Retrieved port %s for router - %s', port_setting.name, self.router_settings.name) diff --git a/snaps/openstack/tests/create_instance_tests.py b/snaps/openstack/tests/create_instance_tests.py index 54b6e53..560a2fc 100644 --- a/snaps/openstack/tests/create_instance_tests.py +++ b/snaps/openstack/tests/create_instance_tests.py @@ -475,15 +475,15 @@ class CreateInstanceSimpleTests(OSIntegrationTestCase): self.image_creator.image_settings) vm_inst = self.inst_creator.create() - self.assertEqual(1, len( - nova_utils.get_servers_by_name(self.nova, instance_settings.name))) + self.assertIsNotNone(nova_utils.get_server( + self.nova, vm_inst_settings=instance_settings)) # Delete instance nova_utils.delete_vm_instance(self.nova, vm_inst) self.assertTrue(self.inst_creator.vm_deleted(block=True)) - self.assertEqual(0, len( - nova_utils.get_servers_by_name(self.nova, instance_settings.name))) + self.assertIsNone(nova_utils.get_server( + self.nova, vm_inst_settings=instance_settings)) # Exception should not be thrown self.inst_creator.clean() diff --git a/snaps/openstack/tests/create_router_tests.py b/snaps/openstack/tests/create_router_tests.py index 6e10d66..6f37445 100644 --- a/snaps/openstack/tests/create_router_tests.py +++ b/snaps/openstack/tests/create_router_tests.py @@ -326,6 +326,13 @@ class CreateRouterSuccessTests(OSIntegrationTestCase): self.assertTrue(verify_router_attributes(router, self.router_creator)) + # Instantiate second identical creator to ensure a second router + # has not been created + router_creator2 = create_router.OpenStackRouter( + self.os_creds, router_settings) + router2 = router_creator2.create() + self.assertIsNotNone(self.router_creator.get_router(), router2) + def test_create_router_external_network(self): """ Test creation of a router connected to an external network and a diff --git a/snaps/openstack/tests/os_source_file_test.py b/snaps/openstack/tests/os_source_file_test.py index da474a2..1617f91 100644 --- a/snaps/openstack/tests/os_source_file_test.py +++ b/snaps/openstack/tests/os_source_file_test.py @@ -145,17 +145,20 @@ class OSIntegrationTestCase(OSComponentTestCase): self.role = None if self.use_keystone: - self.keystone = keystone_utils.keystone_client(self.os_creds) + self.keystone = keystone_utils.keystone_client(self.admin_os_creds) guid = self.__class__.__name__ + '-' + str(uuid.uuid4())[:-19] project_name = guid + '-proj' self.project_creator = deploy_utils.create_project( - self.admin_os_creds, ProjectSettings(name=project_name)) + self.admin_os_creds, ProjectSettings( + name=project_name, + domain=self.admin_os_creds.project_domain_name)) self.user_creator = deploy_utils.create_user( self.admin_os_creds, UserSettings( name=guid + '-user', password=guid, project_name=project_name, roles={ - 'admin': self.project_creator.project_settings.name})) + 'admin': self.project_creator.project_settings.name}, + domain_name=self.admin_os_creds.user_domain_name)) self.os_creds = self.user_creator.get_os_creds( self.project_creator.project_settings.name) diff --git a/snaps/openstack/utils/neutron_utils.py b/snaps/openstack/utils/neutron_utils.py index 6916033..01408fe 100644 --- a/snaps/openstack/utils/neutron_utils.py +++ b/snaps/openstack/utils/neutron_utils.py @@ -332,18 +332,32 @@ def delete_port(neutron, port): neutron.delete_port(port.id) -def get_port_by_name(neutron, port_name): +def get_port(neutron, port_settings=None, port_name=None): """ - Returns the first port object (dictionary) found with a given name + Returns the first port object (dictionary) found for the given query :param neutron: the client - :param port_name: the name of the port to retrieve + :param port_settings: the PortSettings object used for generating the query + :param port_name: if port_settings is None, this name is the value to place + into the query :return: a SNAPS-OO Port domain object """ - ports = neutron.list_ports(**{'name': port_name}) + port_filter = dict() + + if port_settings: + port_filter['name'] = port_settings.name + if port_settings.admin_state_up: + port_filter['admin_state_up'] = port_settings.admin_state_up + if port_settings.device_id: + port_filter['device_id'] = port_settings.device_id + if port_settings.mac_address: + port_filter['mac_address'] = port_settings.mac_address + elif port_name: + port_filter['name'] = port_name + + ports = neutron.list_ports(**port_filter) for port in ports['ports']: - if port['name'] == port_name: - return Port(name=port['name'], id=port['id'], - ips=port['fixed_ips'], mac_address=port['mac_address']) + return Port(name=port['name'], id=port['id'], + ips=port['fixed_ips'], mac_address=port['mac_address']) return None @@ -372,7 +386,7 @@ def delete_security_group(neutron, sec_grp): neutron.delete_security_group(sec_grp.id) -def get_security_group(neutron, name): +def get_security_group(neutron, name, tenant_id=None): """ Returns the first security group object of the given name else None :param neutron: the client @@ -381,7 +395,10 @@ def get_security_group(neutron, name): """ logger.info('Retrieving security group with name - ' + name) - groups = neutron.list_security_groups(**{'name': name}) + filter = {'name': name} + if tenant_id: + filter['tenant_id'] = tenant_id + groups = neutron.list_security_groups(**filter) for group in groups['security_groups']: if group['name'] == name: return SecurityGroup(**group) diff --git a/snaps/openstack/utils/nova_utils.py b/snaps/openstack/utils/nova_utils.py index a0c028a..5222712 100644 --- a/snaps/openstack/utils/nova_utils.py +++ b/snaps/openstack/utils/nova_utils.py @@ -65,8 +65,8 @@ def create_server(nova, neutron, glance, instance_settings, image_settings, ports = list() for port_setting in instance_settings.port_settings: - ports.append(neutron_utils.get_port_by_name( - neutron, port_setting.name)) + ports.append(neutron_utils.get_port( + neutron, port_settings=port_setting)) nics = [] for port in ports: kv = dict() @@ -106,19 +106,26 @@ def create_server(nova, neutron, glance, instance_settings, image_settings, image_settings.name) -def get_servers_by_name(nova, name): +def get_server(nova, vm_inst_settings=None, server_name=None): """ - Returns a list of servers with a given name + Returns a VmInst object for the first server instance found. :param nova: the Nova client - :param name: the server name - :return: the list of snaps.domain.VmInst objects - """ - out = list() - servers = nova.servers.list(search_opts={'name': name}) + :param vm_inst_settings: the VmInstanceSettings object from which to build + the query if not None + :param server_name: the server with this name to return if vm_inst_settings + is not None + :return: a snaps.domain.VmInst object or None if not found + """ + search_opts = dict() + if vm_inst_settings: + search_opts['name'] = vm_inst_settings.name + elif server_name: + search_opts['name'] = server_name + + servers = nova.servers.list(search_opts=search_opts) for server in servers: - out.append(VmInst(name=server.name, inst_id=server.id, - networks=server.networks)) - return out + return VmInst(name=server.name, inst_id=server.id, + networks=server.networks) def __get_latest_server_os_object(nova, server): diff --git a/snaps/openstack/utils/tests/keystone_utils_tests.py b/snaps/openstack/utils/tests/keystone_utils_tests.py index a46cbd1..29cd8af 100644 --- a/snaps/openstack/utils/tests/keystone_utils_tests.py +++ b/snaps/openstack/utils/tests/keystone_utils_tests.py @@ -17,7 +17,7 @@ import uuid from snaps.openstack.create_project import ProjectSettings from snaps.openstack.create_user import UserSettings from snaps.openstack.tests.os_source_file_test import OSComponentTestCase -from snaps.openstack.utils import keystone_utils +from snaps.openstack.utils import keystone_utils, neutron_utils __author__ = 'spisarski' @@ -73,7 +73,18 @@ class KeystoneUtilsTests(OSComponentTestCase): Cleans the remote OpenStack objects """ if self.project: - keystone_utils.delete_project(self.keystone, self.project) + neutron = neutron_utils.neutron_client(self.os_creds) + default_sec_grp = neutron_utils.get_security_group( + neutron, 'default', + tenant_id=self.project.id) + if default_sec_grp: + try: + neutron_utils.delete_security_group( + neutron, default_sec_grp) + except: + pass + + keystone_utils.delete_project(self.keystone, self.project) if self.user: keystone_utils.delete_user(self.keystone, self.user) |