From 20902078a98bfb76c12919b92cd0345dd3c06f8c Mon Sep 17 00:00:00 2001 From: spisarski Date: Fri, 16 Feb 2018 08:35:07 -0700 Subject: [PATCH] Ensure project IDs are handled correctly for Network/Subnets JIRA: SNAPS-265 Change-Id: If58f5817e52e21be377d2b06a5f7c3a413454350 Signed-off-by: spisarski --- docs/how-to-use/IntegrationTests.rst | 15 +++ snaps/config/router.py | 9 +- snaps/domain/network.py | 6 ++ snaps/domain/test/network_tests.py | 38 ++++--- snaps/openstack/create_instance.py | 23 ++-- snaps/openstack/create_network.py | 3 +- snaps/openstack/create_router.py | 9 +- snaps/openstack/create_stack.py | 4 +- snaps/openstack/tests/create_instance_tests.py | 8 +- snaps/openstack/tests/create_network_tests.py | 118 +++++++++++++++++++-- snaps/openstack/tests/create_stack_tests.py | 14 ++- snaps/openstack/tests/os_source_file_test.py | 3 +- snaps/openstack/utils/heat_utils.py | 7 +- snaps/openstack/utils/neutron_utils.py | 67 +++++++----- snaps/openstack/utils/nova_utils.py | 39 ++++--- snaps/openstack/utils/settings_utils.py | 12 ++- snaps/openstack/utils/tests/heat_utils_tests.py | 9 +- snaps/openstack/utils/tests/neutron_utils_tests.py | 63 +++++++---- snaps/openstack/utils/tests/nova_utils_tests.py | 23 ++-- .../openstack/utils/tests/settings_utils_tests.py | 2 +- 20 files changed, 335 insertions(+), 137 deletions(-) diff --git a/docs/how-to-use/IntegrationTests.rst b/docs/how-to-use/IntegrationTests.rst index c376f8c..cdadd96 100644 --- a/docs/how-to-use/IntegrationTests.rst +++ b/docs/how-to-use/IntegrationTests.rst @@ -208,6 +208,21 @@ create_network_tests.py - CreateNetworkIPv6Tests | | | IPv6 subnet | +---------------------------------------+---------------+-----------------------------------------------------------+ +create_network_tests.py - CreateMultipleNetworkTests +---------------------------------------------------- + ++---------------------------------------+---------------+-----------------------------------------------------------+ +| Test Name | Neutron API | Description | ++=======================================+===============+===========================================================+ +| test_network_same_name_diff_proj | 2 | Ensures that a network with the same name can be created | +| | | against different projects | ++---------------------------------------+---------------+-----------------------------------------------------------+ +| test_network_create_by_admin_to | 2 | Ensures that a network can be created by the admin user | +| _different_project | | to another project and that a creator with the credentials| +| | | to the other project will not create a new network with | +| | | the same name | ++---------------------------------------+---------------+-----------------------------------------------------------+ + create_router_tests.py - CreateRouterSuccessTests ------------------------------------------------- diff --git a/snaps/config/router.py b/snaps/config/router.py index 72164f2..ae84038 100644 --- a/snaps/config/router.py +++ b/snaps/config/router.py @@ -61,7 +61,7 @@ class RouterConfig(object): if not self.name: raise RouterConfigError('Name is required') - def dict_for_neutron(self, neutron, os_creds): + def dict_for_neutron(self, neutron, os_creds, project_id): """ Returns a dictionary object representing this object. This is meant to be converted into JSON designed for use by the Neutron @@ -70,7 +70,11 @@ class RouterConfig(object): TODO - expand automated testing to exercise all parameters :param neutron: The neutron client to retrieve external network information if necessary - :param os_creds: The OpenStack credentials + :param os_creds: The OpenStack credentials for retrieving the keystone + client for looking up the project ID when the + self.project_name is not None + :param project_id: the associated project ID to use when + self.project_name is None :return: the dictionary object """ out = dict() @@ -82,7 +86,6 @@ class RouterConfig(object): keystone = keystone_utils.keystone_client(os_creds) project = keystone_utils.get_project( keystone=keystone, project_name=self.project_name) - project_id = None if project: project_id = project.id if project_id: diff --git a/snaps/domain/network.py b/snaps/domain/network.py index 2d02966..aabec21 100644 --- a/snaps/domain/network.py +++ b/snaps/domain/network.py @@ -24,6 +24,7 @@ class Network: Constructor :param name: the network's name :param id: the network's ID + :param project_id: the associated project ID :param admin_state_up: T/F - network is up when True :param shared: T/F - network can be shared amongst other project's :param external: T/F - network is deemed to be external @@ -32,6 +33,7 @@ class Network: """ self.name = kwargs.get('name') self.id = kwargs.get('id') + self.project_id = kwargs.get('project_id') self.admin_state_up = kwargs.get('admin_state_up') self.shared = kwargs.get('shared') self.external = kwargs.get('router:external', kwargs.get('external')) @@ -40,6 +42,7 @@ class Network: def __eq__(self, other): return (self.name == other.name and self.id == other.id and + self.project_id == other.project_id and self.admin_state_up == other.admin_state_up and self.shared == other.shared and self.external == other.external and @@ -57,6 +60,7 @@ class Subnet: Constructor :param name: the network's name :param id: the subnet's ID + :param project_id: the associated project ID :param network_id: the network's ID :param cidr: the CIDR :param ip_version: the IP version @@ -71,6 +75,7 @@ class Subnet: """ self.name = kwargs.get('name') self.id = kwargs.get('id') + self.project_id = kwargs.get('project_id') self.network_id = kwargs.get('network_id') self.cidr = kwargs.get('cidr') self.ip_version = kwargs.get('ip_version') @@ -95,6 +100,7 @@ class Subnet: def __eq__(self, other): return (self.name == other.name and self.id == other.id and + self.project_id == other.project_id and self.network_id == other.network_id and self.cidr == other.cidr and self.ip_version == other.ip_version and diff --git a/snaps/domain/test/network_tests.py b/snaps/domain/test/network_tests.py index 3003326..5f70c3f 100644 --- a/snaps/domain/test/network_tests.py +++ b/snaps/domain/test/network_tests.py @@ -26,13 +26,15 @@ class NetworkObjectTests(unittest.TestCase): def test_construction_kwargs_1(self): subnet = Subnet( - **{'name': 'foo', 'id': 'bar', 'network_id': 'foo-bar'}) + **{'name': 'foo', 'id': 'bar', 'project_id': 'proj1', + 'network_id': 'foo-bar'}) network = Network( - **{'name': 'foo', 'id': 'bar', 'provider:network_type': 'flat', - 'admin_state_up': False, 'shared': True, - 'router:external': False, 'subnets': [subnet]}) + **{'name': 'foo', 'id': 'bar', 'project_id': 'proj1', + 'provider:network_type': 'flat', 'admin_state_up': False, + 'shared': True, 'router:external': False, 'subnets': [subnet]}) self.assertEqual('foo', network.name) self.assertEqual('bar', network.id) + self.assertEqual('proj1', network.project_id) self.assertEqual('flat', network.type) self.assertFalse(network.admin_state_up) self.assertFalse(network.external) @@ -41,13 +43,15 @@ class NetworkObjectTests(unittest.TestCase): def test_construction_kwargs_2(self): subnet = Subnet( - **{'name': 'foo', 'id': 'bar', 'network_id': 'foo-bar'}) + **{'name': 'foo', 'id': 'bar', 'project_id': 'proj1', + 'network_id': 'foo-bar'}) network = Network( - **{'name': 'foo', 'id': 'bar', 'type': 'flat', - 'admin_state_up': False, 'shared': True, 'external': False, - 'subnets': [subnet]}) + **{'name': 'foo', 'id': 'bar', 'project_id': 'proj1', + 'type': 'flat', 'admin_state_up': False, 'shared': True, + 'external': False, 'subnets': [subnet]}) self.assertEqual('foo', network.name) self.assertEqual('bar', network.id) + self.assertEqual('proj1', network.project_id) self.assertEqual('flat', network.type) self.assertFalse(network.admin_state_up) self.assertFalse(network.external) @@ -56,12 +60,15 @@ class NetworkObjectTests(unittest.TestCase): def test_construction_named(self): subnet = Subnet( - **{'name': 'foo', 'id': 'bar', 'network_id': 'foo-bar'}) + **{'name': 'foo', 'id': 'bar', 'project_id': 'proj1', + 'network_id': 'foo-bar'}) network = Network( - name='foo', id='bar', type='flat', admin_state_up=False, - shared=True, external=False, subnets=[subnet]) + name='foo', id='bar', project_id='proj1', type='flat', + admin_state_up=False, shared=True, external=False, + subnets=[subnet]) self.assertEqual('foo', network.name) self.assertEqual('bar', network.id) + self.assertEqual('proj1', network.project_id) self.assertEqual('flat', network.type) self.assertFalse(network.admin_state_up) self.assertFalse(network.external) @@ -76,12 +83,14 @@ class SubnetObjectTests(unittest.TestCase): def test_construction_kwargs(self): subnet = Subnet( - **{'name': 'foo', 'id': 'bar', 'cidr': '10.0.0.0/24', - 'ip_version': 4, 'gateway_ip': '10.0.0.1', 'enable_dhcp': True, + **{'name': 'foo', 'id': 'bar', 'project_id': 'proj1', + 'cidr': '10.0.0.0/24', 'ip_version': 4, + 'gateway_ip': '10.0.0.1', 'enable_dhcp': True, 'dns_nameservers': ['8.8.8.8'], 'host_routes': list(), 'ipv6_ra_mode': 'hello', 'ipv6_address_mode': 'world'}) self.assertEqual('foo', subnet.name) self.assertEqual('bar', subnet.id) + self.assertEqual('proj1', subnet.project_id) self.assertEqual('10.0.0.0/24', subnet.cidr) self.assertEqual(4, subnet.ip_version) self.assertEqual('10.0.0.1', subnet.gateway_ip) @@ -94,12 +103,13 @@ class SubnetObjectTests(unittest.TestCase): def test_construction_named(self): subnet = Subnet( - name='foo', id='bar', cidr='10.0.0.0/24', + name='foo', id='bar', project_id='proj1', cidr='10.0.0.0/24', ip_version=4, gateway_ip='10.0.0.1', enable_dhcp=True, dns_nameservers=['8.8.8.8'], host_routes=list(), ipv6_ra_mode='hello', ipv6_address_mode='world') self.assertEqual('foo', subnet.name) self.assertEqual('bar', subnet.id) + self.assertEqual('proj1', subnet.project_id) self.assertEqual('10.0.0.0/24', subnet.cidr) self.assertEqual(4, subnet.ip_version) self.assertEqual('10.0.0.1', subnet.gateway_ip) diff --git a/snaps/openstack/create_instance.py b/snaps/openstack/create_instance.py index 73cdf8a..dcb73cd 100644 --- a/snaps/openstack/create_instance.py +++ b/snaps/openstack/create_instance.py @@ -113,8 +113,8 @@ class OpenStackVmInstance(OpenStackComputeObject): 'Found existing machine with name - %s', self.instance_settings.name) - fips = neutron_utils.get_floating_ips(self.__neutron, - self.__ports) + fips = neutron_utils.get_port_floating_ips( + self.__neutron, self.__ports) for port_id, fip in fips: settings = self.instance_settings.floating_ip_settings for fip_setting in settings: @@ -136,7 +136,7 @@ class OpenStackVmInstance(OpenStackComputeObject): glance = glance_utils.glance_client(self._os_creds) self.__vm = nova_utils.create_server( self._nova, self.__neutron, glance, self.instance_settings, - self.image_settings, self.keypair_settings) + self.image_settings, self.project_id, self.keypair_settings) logger.info('Created instance with name - %s', self.instance_settings.name) @@ -167,7 +167,7 @@ class OpenStackVmInstance(OpenStackComputeObject): if volume and self.vm_active(block=True): vm = nova_utils.attach_volume( self._nova, self.__neutron, self.__vm, volume, - VOL_DETACH_TIMEOUT) + self.project_id, timeout=VOL_DETACH_TIMEOUT) if vm: self.__vm = vm @@ -273,7 +273,7 @@ class OpenStackVmInstance(OpenStackComputeObject): if volume: vm = nova_utils.detach_volume( self._nova, self.__neutron, self.__vm, volume, - VOL_DETACH_TIMEOUT) + self.project_id, timeout=VOL_DETACH_TIMEOUT) if vm: self.__vm = vm else: @@ -318,7 +318,8 @@ class OpenStackVmInstance(OpenStackComputeObject): for port_setting in port_settings: port = neutron_utils.get_port( - self.__neutron, port_settings=port_setting) + self.__neutron, port_settings=port_setting, + project_id=self.project_id) if port: ports.append((port_setting.name, port)) @@ -358,7 +359,7 @@ class OpenStackVmInstance(OpenStackComputeObject): :return: Server object """ return nova_utils.get_server_object_by_id( - self._nova, self.__neutron, self.__vm.id) + self._nova, self.__neutron, self.__vm.id, self.project_id) def get_console_output(self): """ @@ -506,7 +507,7 @@ class OpenStackVmInstance(OpenStackComputeObject): STATUS_ACTIVE, block, self.instance_settings.vm_boot_timeout, poll_interval): self.__vm = nova_utils.get_server_object_by_id( - self._nova, self.__neutron, self.__vm.id) + self._nova, self.__neutron, self.__vm.id, self.project_id) return True return False @@ -773,19 +774,21 @@ class OpenStackVmInstance(OpenStackComputeObject): self._nova, self.__vm, reboot_type=reboot_type) -def generate_creator(os_creds, vm_inst, image_config, keypair_config=None): +def generate_creator(os_creds, vm_inst, image_config, project_id, + keypair_config=None): """ Initializes an OpenStackVmInstance object :param os_creds: the OpenStack credentials :param vm_inst: the SNAPS-OO VmInst domain object :param image_config: the associated ImageConfig object + :param project_id: the associated project ID :param keypair_config: the associated KeypairConfig object (optional) :return: an initialized OpenStackVmInstance object """ nova = nova_utils.nova_client(os_creds) neutron = neutron_utils.neutron_client(os_creds) derived_inst_config = settings_utils.create_vm_inst_config( - nova, neutron, vm_inst) + nova, neutron, vm_inst, project_id) derived_inst_creator = OpenStackVmInstance( os_creds, derived_inst_config, image_config, keypair_config) diff --git a/snaps/openstack/create_network.py b/snaps/openstack/create_network.py index 984eedd..b57e108 100644 --- a/snaps/openstack/create_network.py +++ b/snaps/openstack/create_network.py @@ -54,8 +54,7 @@ class OpenStackNetwork(OpenStackNetworkObject): try: self.__network = neutron_utils.get_network( self._neutron, network_settings=self.network_settings, - project_id=self.network_settings.get_project_id( - self._os_creds)) + project_id=self.project_id, os_creds=self._os_creds) except Unauthorized as e: logger.warn('Unable to lookup network with name %s - %s', self.network_settings.name, e) diff --git a/snaps/openstack/create_router.py b/snaps/openstack/create_router.py index c9ccdd6..765f7a3 100644 --- a/snaps/openstack/create_router.py +++ b/snaps/openstack/create_router.py @@ -80,7 +80,8 @@ class OpenStackRouter(OpenStackNetworkObject): for port_setting in self.router_settings.port_settings: port = neutron_utils.get_port( - self._neutron, port_settings=port_setting) + self._neutron, port_settings=port_setting, + project_id=self.project_id) if port: self.__ports.append(port) @@ -95,7 +96,8 @@ class OpenStackRouter(OpenStackNetworkObject): if not self.__router: self.__router = neutron_utils.create_router( - self._neutron, self._os_creds, self.router_settings) + self._neutron, self._os_creds, self.router_settings, + self.project_id) for internal_subnet_name in self.router_settings.internal_subnets: internal_subnet = neutron_utils.get_subnet( @@ -114,7 +116,8 @@ class OpenStackRouter(OpenStackNetworkObject): for port_setting in self.router_settings.port_settings: port = neutron_utils.get_port( - self._neutron, port_settings=port_setting) + self._neutron, port_settings=port_setting, + project_id=self.project_id) logger.info( 'Retrieved port %s for router - %s', port_setting.name, self.router_settings.name) diff --git a/snaps/openstack/create_stack.py b/snaps/openstack/create_stack.py index d4a6b10..99d2925 100644 --- a/snaps/openstack/create_stack.py +++ b/snaps/openstack/create_stack.py @@ -287,13 +287,13 @@ class OpenStackHeatStack(OpenStackCloudObject, object): neutron = neutron_utils.neutron_client(self._os_creds) stack_servers = heat_utils.get_stack_servers( - self.__heat_cli, nova, neutron, self.__stack) + self.__heat_cli, nova, neutron, self.__stack, self.project_id) glance = glance_utils.glance_client(self._os_creds) for stack_server in stack_servers: vm_inst_settings = settings_utils.create_vm_inst_config( - nova, neutron, stack_server) + nova, neutron, stack_server, self.project_id) image_settings = settings_utils.determine_image_config( glance, stack_server, self.image_settings) keypair_settings = settings_utils.determine_keypair_config( diff --git a/snaps/openstack/tests/create_instance_tests.py b/snaps/openstack/tests/create_instance_tests.py index c713794..4ff9fce 100644 --- a/snaps/openstack/tests/create_instance_tests.py +++ b/snaps/openstack/tests/create_instance_tests.py @@ -816,19 +816,19 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): # Test default reboot which should be 'SOFT' inst_creator.reboot() # Lag time to allow for shutdown routine to take effect - time.sleep(10) + time.sleep(15) self.assertTrue(check_dhcp_lease(inst_creator, ip)) self.assertTrue(validate_ssh_client(inst_creator)) # Test 'SOFT' reboot inst_creator.reboot(reboot_type=RebootType.soft) - time.sleep(10) + time.sleep(15) self.assertTrue(check_dhcp_lease(inst_creator, ip)) self.assertTrue(validate_ssh_client(inst_creator)) # Test 'HARD' reboot inst_creator.reboot(reboot_type=RebootType.hard) - time.sleep(10) + time.sleep(15) self.assertTrue(check_dhcp_lease(inst_creator, ip)) self.assertTrue(validate_ssh_client(inst_creator)) @@ -899,7 +899,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): derived_inst_creator = create_instance.generate_creator( self.os_creds, vm_inst, self.image_creator.image_settings, - self.keypair_creator.keypair_settings) + self.project_id, self.keypair_creator.keypair_settings) derived_inst_creator.add_floating_ip(FloatingIpConfig( name=self.floating_ip_name, port_name=self.port_1_name, diff --git a/snaps/openstack/tests/create_network_tests.py b/snaps/openstack/tests/create_network_tests.py index 62d9bd9..af5160b 100644 --- a/snaps/openstack/tests/create_network_tests.py +++ b/snaps/openstack/tests/create_network_tests.py @@ -396,7 +396,8 @@ class CreateNetworkSuccessTests(OSIntegrationTestCase): # Validate network was created self.assertTrue(neutron_utils_tests.validate_network( - self.neutron, self.net_creator.network_settings.name, True)) + self.neutron, self.net_creator.network_settings.name, True, + project_id=self.project_id)) # Validate subnets self.assertTrue(neutron_utils_tests.validate_subnet( @@ -415,12 +416,14 @@ class CreateNetworkSuccessTests(OSIntegrationTestCase): # Validate network was created self.assertTrue(neutron_utils_tests.validate_network( - self.neutron, self.net_creator.network_settings.name, True)) + self.neutron, self.net_creator.network_settings.name, True, + self.project_id)) neutron_utils.delete_network(self.neutron, self.net_creator.get_network()) self.assertIsNone(neutron_utils.get_network( - self.neutron, network_settings=self.net_creator.network_settings)) + self.neutron, network_settings=self.net_creator.network_settings, + os_creds=self.os_creds, project_id=self.project_id)) # This shall not throw an exception here self.net_creator.clean() @@ -441,7 +444,8 @@ class CreateNetworkSuccessTests(OSIntegrationTestCase): # Validate network was created self.assertTrue(neutron_utils_tests.validate_network( - self.neutron, self.net_creator.network_settings.name, True)) + self.neutron, self.net_creator.network_settings.name, True, + self.project_id)) # Validate subnets self.assertTrue(neutron_utils_tests.validate_subnet( @@ -490,7 +494,8 @@ class CreateNetworkSuccessTests(OSIntegrationTestCase): self.net_creator.create() retrieved_net = neutron_utils.get_network( - self.neutron, network_settings=self.net_config.network_settings) + self.neutron, network_settings=self.net_config.network_settings, + os_creds=self.os_creds, project_id=self.project_id) self.assertEqual(self.net_creator.get_network().id, retrieved_net.id) @@ -520,7 +525,8 @@ class CreateNetworkSuccessTests(OSIntegrationTestCase): self.net_creator.create() retrieved_net = neutron_utils.get_network( - self.neutron, network_settings=self.net_config.network_settings) + self.neutron, network_settings=self.net_config.network_settings, + os_creds=self.os_creds, project_id=self.project_id) self.assertEqual(self.net_creator.get_network().id, retrieved_net.id) @@ -578,7 +584,8 @@ class CreateNetworkIPv6Tests(OSIntegrationTestCase): # Validate network was created self.assertTrue(neutron_utils_tests.validate_network( - self.neutron, self.net_creator.network_settings.name, True)) + self.neutron, self.net_creator.network_settings.name, True, + self.project_id)) network = self.net_creator.get_network() self.assertEqual(1, len(network.subnets)) @@ -678,7 +685,8 @@ class CreateNetworkTypeTests(OSComponentTestCase): # Validate network was created self.assertTrue(neutron_utils_tests.validate_network( - self.neutron, net_settings.name, True)) + self.neutron, net_settings.name, True, + self.net_creator.project_id)) self.assertEquals(network_type, network.type) @@ -707,7 +715,8 @@ class CreateNetworkTypeTests(OSComponentTestCase): # Validate network was created self.assertTrue(neutron_utils_tests.validate_network( - self.neutron, net_settings.name, True)) + self.neutron, net_settings.name, True, + self.net_creator.project_id)) self.assertEquals(network_type, network.type) @@ -728,7 +737,7 @@ class CreateNetworkTypeTests(OSComponentTestCase): # Validate network was created self.assertTrue(neutron_utils_tests.validate_network( - self.neutron, net_settings.name, True)) + self.neutron, net_settings.name, True, project_id=self.project_id)) self.assertEqual(network_type, network.type) @@ -769,3 +778,92 @@ class CreateNetworkTypeTests(OSComponentTestCase): self.net_creator = OpenStackNetwork(self.os_creds, net_settings) with self.assertRaises(Exception): self.net_creator.create() + + +class CreateMultipleNetworkTests(OSIntegrationTestCase): + """ + Test for the CreateNetwork class and how it interacts with networks + groups within other projects with the same name + """ + + def setUp(self): + """ + Sets up object for test + """ + super(self.__class__, self).__start__() + + guid = self.__class__.__name__ + '-' + str(uuid.uuid4()) + self.net_config = openstack_tests.get_pub_net_config( + net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet') + + self.neutron = neutron_utils.neutron_client(self.os_creds) + + # Initialize for cleanup + self.admin_net_creator = None + self.proj_net_creator = None + + def tearDown(self): + """ + Cleans the network + """ + if self.admin_net_creator: + self.admin_net_creator.clean() + if self.proj_net_creator: + self.proj_net_creator.clean() + + super(self.__class__, self).__clean__() + + def test_network_same_name_diff_proj(self): + """ + Tests the creation of an OpenStackNetwork with the same name + within a different project/tenant when not configured but implied by + the OSCreds. + """ + # Create Network + + self.admin_net_creator = OpenStackNetwork( + self.admin_os_creds, self.net_config.network_settings) + self.admin_net_creator.create() + + self.proj_net_creator = OpenStackNetwork( + self.os_creds, self.net_config.network_settings) + self.proj_net_creator.create() + + self.assertNotEqual( + self.admin_net_creator.get_network().id, + self.proj_net_creator.get_network().id) + + admin_creator2 = OpenStackNetwork( + self.admin_os_creds, self.net_config.network_settings) + admin_creator2.create() + self.assertEqual( + self.admin_net_creator.get_network(), admin_creator2.get_network()) + + proj_creator2 = OpenStackNetwork( + self.os_creds, self.net_config.network_settings) + proj_creator2.create() + self.assertEqual(self.proj_net_creator.get_network(), + proj_creator2.get_network()) + + def test_network_create_by_admin_to_different_project(self): + """ + Tests the creation of an OpenStackNetwork by the admin user and + initialize again with tenant credentials. + """ + # Create Network + + net_settings = self.net_config.network_settings + + net_settings.project_name = self.os_creds.project_name + + self.admin_net_creator = OpenStackNetwork( + self.admin_os_creds, net_settings) + self.admin_net_creator.create() + + self.proj_net_creator = OpenStackNetwork( + self.os_creds, self.net_config.network_settings) + self.proj_net_creator.create() + + self.assertEqual( + self.admin_net_creator.get_network().id, + self.proj_net_creator.get_network().id) diff --git a/snaps/openstack/tests/create_stack_tests.py b/snaps/openstack/tests/create_stack_tests.py index 7155a29..e04ae07 100644 --- a/snaps/openstack/tests/create_stack_tests.py +++ b/snaps/openstack/tests/create_stack_tests.py @@ -39,7 +39,8 @@ from snaps.openstack.create_stack import ( StackSettings, StackCreationError, StackError, OpenStackHeatStack) from snaps.openstack.tests import openstack_tests, create_instance_tests from snaps.openstack.tests.os_source_file_test import OSIntegrationTestCase -from snaps.openstack.utils import heat_utils, neutron_utils, nova_utils +from snaps.openstack.utils import (heat_utils, neutron_utils, nova_utils, + keystone_utils) __author__ = 'spisarski' @@ -351,8 +352,11 @@ class CreateStackSuccessTests(OSIntegrationTestCase): self.assertEqual(self.network_name, net_creators[0].get_network().name) neutron = neutron_utils.neutron_client(self.os_creds) + admin_proj_id = keystone_utils.get_project( + self.keystone, self.admin_os_creds.project_name) net_by_name = neutron_utils.get_network( - neutron, network_name=net_creators[0].get_network().name) + neutron, network_name=net_creators[0].get_network().name, + project_id=admin_proj_id) self.assertEqual(net_creators[0].get_network(), net_by_name) self.assertIsNotNone(neutron_utils.get_network_by_id( neutron, net_creators[0].get_network().id)) @@ -393,7 +397,8 @@ class CreateStackSuccessTests(OSIntegrationTestCase): nova, neutron, server_name=vm_inst_creators[0].get_vm_inst().name) self.assertEqual(vm_inst_creators[0].get_vm_inst(), vm_inst_by_name) self.assertIsNotNone(nova_utils.get_server_object_by_id( - nova, neutron, vm_inst_creators[0].get_vm_inst().id)) + nova, neutron, vm_inst_creators[0].get_vm_inst().id, + vm_inst_creators[0].project_id)) class CreateStackFloatingIpTests(OSIntegrationTestCase): @@ -684,7 +689,8 @@ class CreateStackRouterTests(OSIntegrationTestCase): router = creator.get_router() ext_net = neutron_utils.get_network( - self.neutron, network_name=self.ext_net_name) + self.neutron, network_name=self.ext_net_name, + project_id=self.project_id) self.assertEqual(ext_net.id, router.external_network_id) diff --git a/snaps/openstack/tests/os_source_file_test.py b/snaps/openstack/tests/os_source_file_test.py index f1f90ec..58c9e4e 100644 --- a/snaps/openstack/tests/os_source_file_test.py +++ b/snaps/openstack/tests/os_source_file_test.py @@ -63,7 +63,7 @@ class OSComponentTestCase(unittest.TestCase): keystone = keystone_utils.keystone_client(self.os_creds) self.project_id = keystone_utils.get_project( - keystone=keystone, project_name=self.os_creds.project_name) + keystone=keystone, project_name=self.os_creds.project_name).id @staticmethod def parameterize(testcase_klass, os_creds, ext_net_name, @@ -170,6 +170,7 @@ class OSIntegrationTestCase(OSComponentTestCase): # add user to project self.project_creator.assoc_user(self.user_creator.get_user()) + self.project_id = self.project_creator.get_project().id def __clean__(self): """ diff --git a/snaps/openstack/utils/heat_utils.py b/snaps/openstack/utils/heat_utils.py index e440717..6e54dc6 100644 --- a/snaps/openstack/utils/heat_utils.py +++ b/snaps/openstack/utils/heat_utils.py @@ -257,13 +257,14 @@ def get_stack_security_groups(heat_cli, neutron, stack): return out -def get_stack_servers(heat_cli, nova, neutron, stack): +def get_stack_servers(heat_cli, nova, neutron, stack, project_id): """ Returns a list of VMInst domain objects associated with a Stack :param heat_cli: the OpenStack heat client object :param nova: the OpenStack nova client object :param neutron: the OpenStack neutron client object :param stack: the SNAPS-OO Stack domain object + :param project_id: the associated project ID :return: a list of VMInst domain objects """ @@ -272,7 +273,7 @@ def get_stack_servers(heat_cli, nova, neutron, stack): for resource in srvr_res: try: server = nova_utils.get_server_object_by_id( - nova, neutron, resource.id) + nova, neutron, resource.id, project_id) if server: out.append(server) except NotFound: @@ -286,7 +287,7 @@ def get_stack_servers(heat_cli, nova, neutron, stack): heat_cli, res_res.id, 'OS::Nova::Server') for res_srvr in res_res_srvrs: server = nova_utils.get_server_object_by_id( - nova, neutron, res_srvr.id) + nova, neutron, res_srvr.id, project_id) if server: out.append(server) diff --git a/snaps/openstack/utils/neutron_utils.py b/snaps/openstack/utils/neutron_utils.py index d297c8c..a2957a6 100644 --- a/snaps/openstack/utils/neutron_utils.py +++ b/snaps/openstack/utils/neutron_utils.py @@ -102,7 +102,7 @@ def delete_network(neutron, network): def get_network(neutron, network_settings=None, network_name=None, - project_id=None): + project_id=None, os_creds=None): """ Returns Network SNAPS-OO domain object the first network found with either the given attributes from the network_settings object if not None, @@ -112,6 +112,7 @@ def get_network(neutron, network_settings=None, network_name=None, :param network_settings: the NetworkConfig object used to create filter :param network_name: the name of the network to retrieve :param project_id: the id of the network's project + :param os_creds: the OpenStack credentials for retrieving the project :return: a SNAPS-OO Network domain object """ net_filter = dict() @@ -120,7 +121,10 @@ def get_network(neutron, network_settings=None, network_name=None, elif network_name: net_filter['name'] = network_name - if project_id: + if network_settings and network_settings.project_name and os_creds: + net_filter['project_id'] = keystone_utils.get_project( + os_creds=os_creds, project_name=network_settings.project_name).id + elif project_id: net_filter['project_id'] = project_id networks = neutron.list_networks(**net_filter) @@ -278,7 +282,7 @@ def get_subnets_by_network_id(neutron, network_id): return out -def create_router(neutron, os_creds, router_settings): +def create_router(neutron, os_creds, router_settings, project_id): """ Creates a router for OpenStack :param neutron: the client @@ -286,10 +290,16 @@ def create_router(neutron, os_creds, router_settings): :param router_settings: A dictionary containing the router configuration and is responsible for creating the subnet request JSON body + :param project_id: the associated project ID :return: a SNAPS-OO Router domain object """ if neutron: - json_body = router_settings.dict_for_neutron(neutron, os_creds) + if router_settings and router_settings.project_name: + keystone = keystone_utils.keystone_client(os_creds) + project_id = keystone_utils.get_project( + keystone=keystone, project_name=router_settings.project_name) + json_body = router_settings.dict_for_neutron( + neutron, os_creds, project_id) logger.info('Creating router with name - ' + router_settings.name) os_router = neutron.create_router(json_body) return __map_router(neutron, os_router['router']) @@ -460,10 +470,7 @@ def create_port(neutron, os_creds, port_settings): logger.info('Creating port for network with name - %s', port_settings.network_name) os_port = neutron.create_port(body=json_body)['port'] - return Port(name=os_port['name'], id=os_port['id'], - ips=os_port['fixed_ips'], - mac_address=os_port['mac_address'], - allowed_address_pairs=os_port['allowed_address_pairs']) + return Port(**os_port) def delete_port(neutron, port): @@ -476,13 +483,14 @@ def delete_port(neutron, port): neutron.delete_port(port.id) -def get_port(neutron, port_settings=None, port_name=None): +def get_port(neutron, port_settings=None, port_name=None, project_id=None): """ Returns the first port object (dictionary) found for the given query :param neutron: the client :param port_settings: the PortConfig object used for generating the query :param port_name: if port_settings is None, this name is the value to place into the query + :param project_id: the associated project ID :return: a SNAPS-OO Port domain object """ port_filter = dict() @@ -497,13 +505,17 @@ def get_port(neutron, port_settings=None, port_name=None): if port_settings.mac_address: port_filter['mac_address'] = port_settings.mac_address if port_settings.network_name: - network = get_network(neutron, - network_name=port_settings.network_name) + network = get_network( + neutron, network_name=port_settings.network_name, + project_id=project_id) if network: port_filter['network_id'] = network.id elif port_name: port_filter['name'] = port_name + if project_id: + port_filter['project_id'] = project_id + ports = neutron.list_ports(**port_filter) for port in ports['ports']: return Port(**port) @@ -718,14 +730,11 @@ def get_external_networks(neutron): return out -def get_floating_ips(neutron, ports=None): +def get_port_floating_ips(neutron, ports): """ - Returns all of the floating IPs - When ports is not None, FIPs returned must be associated with one of the - ports in the list and a tuple 2 where the first element being the port's - ID and the second being the FloatingIp SNAPS-OO domain object. - When ports is None, all known FloatingIp SNAPS-OO domain objects will be - returned in a list + Returns all of the floating IPs associated with the ports returned in a + list of tuples where the port object is in the first position and the + floating IP object is in the second :param neutron: the Neutron client :param ports: a list of tuple 2 where index 0 is the port name and index 1 is the SNAPS-OO Port object @@ -735,14 +744,22 @@ def get_floating_ips(neutron, ports=None): out = list() fips = neutron.list_floatingips() for fip in fips['floatingips']: - if ports: - for port_name, port in ports: - if port and port.id == fip['port_id']: - out.append((port.id, FloatingIp(**fip))) - break - else: - out.append(FloatingIp(**fip)) + for port_name, port in ports: + if port and port.id == fip['port_id']: + out.append((port.id, FloatingIp(**fip))) + break + return out + +def get_floating_ips(neutron): + """ + Returns a list of all of the floating IPs + :param neutron: the Neutron client + """ + out = list() + fips = neutron.list_floatingips() + for fip in fips['floatingips']: + out.append(FloatingIp(**fip)) return out diff --git a/snaps/openstack/utils/nova_utils.py b/snaps/openstack/utils/nova_utils.py index ba902f9..b37e0a4 100644 --- a/snaps/openstack/utils/nova_utils.py +++ b/snaps/openstack/utils/nova_utils.py @@ -56,7 +56,7 @@ def nova_client(os_creds): def create_server(nova, neutron, glance, instance_config, image_config, - keypair_config=None): + project_id, keypair_config=None): """ Creates a VM instance :param nova: the nova client (required) @@ -64,6 +64,7 @@ def create_server(nova, neutron, glance, instance_config, image_config, :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 keypair_config: the VM's KeypairConfig object (optional) :return: a snaps.domain.VmInst object """ @@ -71,7 +72,8 @@ def create_server(nova, neutron, glance, instance_config, image_config, ports = list() for port_setting in instance_config.port_settings: - port = neutron_utils.get_port(neutron, port_settings=port_setting) + port = neutron_utils.get_port( + neutron, port_settings=port_setting, project_id=project_id) if port: ports.append(port) else: @@ -120,14 +122,15 @@ 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) + return __map_os_server_obj_to_vm_inst(neutron, server, project_id) 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): +def get_server(nova, neutron, 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 @@ -136,6 +139,7 @@ def get_server(nova, neutron, vm_inst_settings=None, server_name=None): the query if not None :param server_name: the server with this name to return if vm_inst_settings is not None + :param project_id: the assocaited project ID :return: a snaps.domain.VmInst object or None if not found """ search_opts = dict() @@ -146,7 +150,7 @@ 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) + return __map_os_server_obj_to_vm_inst(neutron, server, project_id) def get_server_connection(nova, vm_inst_settings=None, server_name=None): @@ -170,7 +174,7 @@ 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): +def __map_os_server_obj_to_vm_inst(neutron, os_server, project_id): """ Returns a VmInst object for an OpenStack Server object :param neutron: the Neutron client (when None, ports will be empty) @@ -187,7 +191,8 @@ def __map_os_server_obj_to_vm_inst(neutron, os_server): out_ports = list() 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) + network = neutron_utils.get_network( + neutron, network_name=net_name, project_id=project_id) ports = neutron_utils.get_ports(neutron, network, ips) for port in ports: out_ports.append(port) @@ -249,28 +254,30 @@ def get_server_console_output(nova, server): return None -def get_latest_server_object(nova, neutron, server): +def get_latest_server_object(nova, neutron, server, project_id): """ Returns a server with a given id :param nova: the Nova client :param neutron: the Neutron client :param server: the old server object + :param project_id: the associated project ID :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) + return __map_os_server_obj_to_vm_inst(neutron, server, project_id) -def get_server_object_by_id(nova, neutron, server_id): +def get_server_object_by_id(nova, neutron, server_id, project_id): """ Returns a server with a given id :param nova: the Nova client :param neutron: the Neutron client :param server_id: the server's id + :param project_id: the associated project ID :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) + return __map_os_server_obj_to_vm_inst(neutron, server, project_id) def get_server_security_group_names(nova, server): @@ -713,7 +720,7 @@ def update_quotas(nova, project_id, compute_quotas): return nova.quotas.update(project_id, **update_values) -def attach_volume(nova, neutron, server, volume, timeout=120): +def attach_volume(nova, neutron, server, volume, project_id, 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 @@ -722,6 +729,7 @@ def attach_volume(nova, neutron, server, volume, timeout=120): :param neutron: the neutron client :param server: the VMInst domain object :param volume: the Volume domain object + :param project_id: the associated project ID :param timeout: denotes the amount of time to block to determine if the has been properly attached. :return: updated VmInst object @@ -730,7 +738,7 @@ def attach_volume(nova, neutron, server, volume, timeout=120): start_time = time.time() while time.time() < start_time + timeout: - vm = get_server_object_by_id(nova, neutron, server.id) + vm = get_server_object_by_id(nova, neutron, server.id, project_id) for vol_dict in vm.volume_ids: if volume.id == vol_dict['id']: return vm @@ -741,7 +749,7 @@ def attach_volume(nova, neutron, server, volume, timeout=120): volume.id, server.id)) -def detach_volume(nova, neutron, server, volume, timeout=120): +def detach_volume(nova, neutron, server, volume, project_id, 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 @@ -750,6 +758,7 @@ def detach_volume(nova, neutron, server, volume, timeout=120): :param neutron: the neutron client :param server: the VMInst domain object :param volume: the Volume domain object + :param project_id: the associated project ID :param timeout: denotes the amount of time to block to determine if the has been properly detached. :return: updated VmInst object @@ -758,7 +767,7 @@ def detach_volume(nova, neutron, server, volume, timeout=120): start_time = time.time() while time.time() < start_time + timeout: - vm = get_server_object_by_id(nova, neutron, server.id) + vm = get_server_object_by_id(nova, neutron, server.id, project_id) if len(vm.volume_ids) == 0: return vm else: diff --git a/snaps/openstack/utils/settings_utils.py b/snaps/openstack/utils/settings_utils.py index 2cf6047..c14437d 100644 --- a/snaps/openstack/utils/settings_utils.py +++ b/snaps/openstack/utils/settings_utils.py @@ -224,7 +224,7 @@ def create_keypair_config(heat_cli, stack, keypair, pk_output_key): return KeypairConfig(name=keypair.name) -def create_vm_inst_config(nova, neutron, server): +def create_vm_inst_config(nova, neutron, server, project_id): """ Returns a VmInstanceConfig object note: if the server instance is not active, the PortSettings objects will @@ -232,6 +232,7 @@ def create_vm_inst_config(nova, neutron, server): :param nova: the nova client :param neutron: the neutron client :param server: a SNAPS-OO VmInst domain object + :param project_id: the associated project ID :return: """ @@ -244,7 +245,7 @@ def create_vm_inst_config(nova, neutron, server): kwargs['port_settings'] = __create_port_configs(neutron, server.ports) kwargs['security_group_names'] = server.sec_grp_names kwargs['floating_ip_settings'] = __create_floatingip_config( - neutron, kwargs['port_settings']) + neutron, kwargs['port_settings'], project_id) return VmInstanceConfig(**kwargs) @@ -281,7 +282,7 @@ def __create_port_configs(neutron, ports): return out -def __create_floatingip_config(neutron, port_settings): +def __create_floatingip_config(neutron, port_settings, project_id): """ Returns a list of FloatingIpConfig objects as they pertain to an existing deployed server instance @@ -296,7 +297,8 @@ def __create_floatingip_config(neutron, port_settings): fip_ports = list() for port_setting in port_settings: - setting_port = neutron_utils.get_port(neutron, port_setting) + setting_port = neutron_utils.get_port( + neutron, port_setting, project_id=project_id) if setting_port: network = neutron_utils.get_network( neutron, network_name=port_setting.network_name) @@ -307,7 +309,7 @@ def __create_floatingip_config(neutron, port_settings): fip_ports.append((port_setting.name, setting_port)) break - floating_ips = neutron_utils.get_floating_ips(neutron, fip_ports) + floating_ips = neutron_utils.get_port_floating_ips(neutron, fip_ports) for port_id, floating_ip in floating_ips: router = neutron_utils.get_router_by_id(neutron, floating_ip.router_id) diff --git a/snaps/openstack/utils/tests/heat_utils_tests.py b/snaps/openstack/utils/tests/heat_utils_tests.py index 67fbdec..ee95a63 100644 --- a/snaps/openstack/utils/tests/heat_utils_tests.py +++ b/snaps/openstack/utils/tests/heat_utils_tests.py @@ -187,7 +187,7 @@ class HeatUtilsCreateSimpleStackTests(OSComponentTestCase): nova = nova_utils.nova_client(self.os_creds) servers = heat_utils.get_stack_servers( - self.heat_client, nova, neutron, self.stack1) + self.heat_client, nova, neutron, self.stack1, self.project_id) self.assertIsNotNone(servers) self.assertEqual(1, len(servers)) self.assertEqual(self.vm_inst_name, servers[0].name) @@ -311,10 +311,11 @@ class HeatUtilsCreateComplexStackTests(OSComponentTestCase): neutron = neutron_utils.neutron_client(self.os_creds) glance = glance_utils.glance_client(self.os_creds) servers = heat_utils.get_stack_servers( - self.heat_client, nova, neutron, self.stack) + self.heat_client, nova, neutron, self.stack, + self.project_id) for server in servers: vm_settings = settings_utils.create_vm_inst_config( - nova, neutron, server) + nova, neutron, server, self.project_id) img_settings = settings_utils.determine_image_config( glance, server, [self.image_creator1.image_settings, @@ -383,7 +384,7 @@ class HeatUtilsCreateComplexStackTests(OSComponentTestCase): glance = glance_utils.glance_client(self.os_creds) servers = heat_utils.get_stack_servers( - self.heat_client, nova, neutron, self.stack) + self.heat_client, nova, neutron, self.stack, self.project_id) self.assertIsNotNone(servers) self.assertEqual(2, len(servers)) diff --git a/snaps/openstack/utils/tests/neutron_utils_tests.py b/snaps/openstack/utils/tests/neutron_utils_tests.py index 4dfff87..22c6a33 100644 --- a/snaps/openstack/utils/tests/neutron_utils_tests.py +++ b/snaps/openstack/utils/tests/neutron_utils_tests.py @@ -109,7 +109,8 @@ class NeutronUtilsNetworkTests(OSComponentTestCase): self.assertEqual(self.net_config.network_settings.name, self.network.name) self.assertTrue(validate_network( - self.neutron, self.net_config.network_settings.name, True)) + self.neutron, self.net_config.network_settings.name, True, + self.project_id)) self.assertEqual(len(self.net_config.network_settings.subnet_settings), len(self.network.subnets)) @@ -167,7 +168,8 @@ class NeutronUtilsSubnetTests(OSComponentTestCase): self.assertEqual(self.net_config.network_settings.name, self.network.name) self.assertTrue(validate_network( - self.neutron, self.net_config.network_settings.name, True)) + self.neutron, self.net_config.network_settings.name, True, + self.project_id)) subnet_setting = self.net_config.network_settings.subnet_settings[0] self.assertTrue(validate_subnet( @@ -193,7 +195,8 @@ class NeutronUtilsSubnetTests(OSComponentTestCase): self.assertEqual(self.net_config.network_settings.name, self.network.name) self.assertTrue(validate_network( - self.neutron, self.net_config.network_settings.name, True)) + self.neutron, self.net_config.network_settings.name, True, + self.project_id)) with self.assertRaises(Exception): SubnetConfig(cidr=self.net_config.subnet_cidr) @@ -208,7 +211,8 @@ class NeutronUtilsSubnetTests(OSComponentTestCase): self.assertEqual(self.net_config.network_settings.name, self.network.name) self.assertTrue(validate_network( - self.neutron, self.net_config.network_settings.name, True)) + self.neutron, self.net_config.network_settings.name, True, + self.project_id)) subnet_setting = self.net_config.network_settings.subnet_settings[0] self.assertTrue(validate_subnet( @@ -525,7 +529,8 @@ class NeutronUtilsRouterTests(OSComponentTestCase): Tests the neutron_utils.create_router() """ self.router = neutron_utils.create_router( - self.neutron, self.os_creds, self.net_config.router_settings) + self.neutron, self.os_creds, self.net_config.router_settings, + self.project_id) validate_router(self.neutron, self.net_config.router_settings.name, True) @@ -541,7 +546,8 @@ class NeutronUtilsRouterTests(OSComponentTestCase): self.net_config.router_settings.name, self.ext_net_name) self.router = neutron_utils.create_router( - self.neutron, self.os_creds, self.net_config.router_settings) + self.neutron, self.os_creds, self.net_config.router_settings, + self.project_id) validate_router(self.neutron, self.net_config.router_settings.name, True) @@ -558,14 +564,16 @@ class NeutronUtilsRouterTests(OSComponentTestCase): self.assertEqual(self.net_config.network_settings.name, self.network.name) self.assertTrue(validate_network( - self.neutron, self.net_config.network_settings.name, True)) + self.neutron, self.net_config.network_settings.name, True, + self.project_id)) subnet_setting = self.net_config.network_settings.subnet_settings[0] self.assertTrue(validate_subnet( self.neutron, subnet_setting.name, subnet_setting.cidr, True)) self.router = neutron_utils.create_router( - self.neutron, self.os_creds, self.net_config.router_settings) + self.neutron, self.os_creds, self.net_config.router_settings, + self.project_id) validate_router(self.neutron, self.net_config.router_settings.name, True) @@ -584,7 +592,8 @@ class NeutronUtilsRouterTests(OSComponentTestCase): self.assertEqual(self.net_config.network_settings.name, self.network.name) self.assertTrue(validate_network( - self.neutron, self.net_config.network_settings.name, True)) + self.neutron, self.net_config.network_settings.name, True, + self.project_id)) subnet_setting = self.net_config.network_settings.subnet_settings[0] self.assertTrue(validate_subnet( @@ -604,10 +613,12 @@ class NeutronUtilsRouterTests(OSComponentTestCase): self.assertEqual(self.net_config.network_settings.name, self.network.name) self.assertTrue(validate_network( - self.neutron, self.net_config.network_settings.name, True)) + self.neutron, self.net_config.network_settings.name, True, + self.project_id)) self.router = neutron_utils.create_router( - self.neutron, self.os_creds, self.net_config.router_settings) + self.neutron, self.os_creds, self.net_config.router_settings, + self.project_id) validate_router(self.neutron, self.net_config.router_settings.name, True) @@ -625,10 +636,12 @@ class NeutronUtilsRouterTests(OSComponentTestCase): self.assertEqual(self.net_config.network_settings.name, self.network.name) self.assertTrue(validate_network( - self.neutron, self.net_config.network_settings.name, True)) + self.neutron, self.net_config.network_settings.name, True, + self.project_id)) self.router = neutron_utils.create_router( - self.neutron, self.os_creds, self.net_config.router_settings) + self.neutron, self.os_creds, self.net_config.router_settings, + self.project_id) validate_router(self.neutron, self.net_config.router_settings.name, True) @@ -648,7 +661,8 @@ class NeutronUtilsRouterTests(OSComponentTestCase): self.assertEqual(self.net_config.network_settings.name, self.network.name) self.assertTrue(validate_network( - self.neutron, self.net_config.network_settings.name, True)) + self.neutron, self.net_config.network_settings.name, True, + self.project_id)) subnet_setting = self.net_config.network_settings.subnet_settings[0] self.assertTrue(validate_subnet( @@ -672,7 +686,8 @@ class NeutronUtilsRouterTests(OSComponentTestCase): self.assertEqual(self.net_config.network_settings.name, self.network.name) self.assertTrue(validate_network( - self.neutron, self.net_config.network_settings.name, True)) + self.neutron, self.net_config.network_settings.name, True, + self.project_id)) subnet_setting = self.net_config.network_settings.subnet_settings[0] self.assertTrue(validate_subnet(self.neutron, subnet_setting.name, @@ -696,7 +711,8 @@ class NeutronUtilsRouterTests(OSComponentTestCase): self.assertEqual(self.net_config.network_settings.name, self.network.name) self.assertTrue(validate_network( - self.neutron, self.net_config.network_settings.name, True)) + self.neutron, self.net_config.network_settings.name, True, + self.project_id)) subnet_setting = self.net_config.network_settings.subnet_settings[0] self.assertTrue(validate_subnet( @@ -740,7 +756,8 @@ class NeutronUtilsRouterTests(OSComponentTestCase): self.assertEqual(self.net_config.network_settings.name, self.network.name) self.assertTrue(validate_network( - self.neutron, self.net_config.network_settings.name, True)) + self.neutron, self.net_config.network_settings.name, True, + self.project_id)) subnet_setting = self.net_config.network_settings.subnet_settings[0] self.assertTrue(validate_subnet( @@ -766,7 +783,8 @@ class NeutronUtilsRouterTests(OSComponentTestCase): self.assertEqual(self.net_config.network_settings.name, self.network.name) self.assertTrue(validate_network( - self.neutron, self.net_config.network_settings.name, True)) + self.neutron, self.net_config.network_settings.name, True, + self.project_id)) subnet_setting = self.net_config.network_settings.subnet_settings[0] self.assertTrue(validate_subnet( @@ -792,7 +810,8 @@ class NeutronUtilsRouterTests(OSComponentTestCase): self.assertEqual(self.net_config.network_settings.name, self.network.name) self.assertTrue(validate_network( - self.neutron, self.net_config.network_settings.name, True)) + self.neutron, self.net_config.network_settings.name, True, + self.project_id)) subnet_setting = self.net_config.network_settings.subnet_settings[0] self.assertTrue(validate_subnet( @@ -1007,7 +1026,7 @@ Validation routines """ -def validate_network(neutron, name, exists): +def validate_network(neutron, name, exists, project_id): """ Returns true if a network for a given name DOES NOT exist if the exists parameter is false conversely true. Returns false if a network for a given @@ -1015,9 +1034,11 @@ def validate_network(neutron, name, exists): :param neutron: The neutron client :param name: The expected network name :param exists: Whether or not the network name should exist or not + :param project_id: the associated project ID :return: True/False """ - network = neutron_utils.get_network(neutron, network_name=name) + network = neutron_utils.get_network(neutron, network_name=name, + project_id=project_id) if exists and network: return True if not exists and not network: diff --git a/snaps/openstack/utils/tests/nova_utils_tests.py b/snaps/openstack/utils/tests/nova_utils_tests.py index 9383088..560a9f3 100644 --- a/snaps/openstack/utils/tests/nova_utils_tests.py +++ b/snaps/openstack/utils/tests/nova_utils_tests.py @@ -323,7 +323,7 @@ class NovaUtilsInstanceTests(OSComponentTestCase): self.vm_inst = nova_utils.create_server( self.nova, self.neutron, self.glance, self.instance_settings, - self.image_creator.image_settings) + self.image_creator.image_settings, self.project_id) self.assertIsNotNone(self.vm_inst) @@ -341,7 +341,7 @@ class NovaUtilsInstanceTests(OSComponentTestCase): self.assertTrue(active) vm_inst = nova_utils.get_latest_server_object( - self.nova, self.neutron, self.vm_inst) + self.nova, self.neutron, self.vm_inst, self.project_id) self.assertEqual(self.vm_inst.name, vm_inst.name) self.assertEqual(self.vm_inst.id, vm_inst.id) @@ -453,7 +453,7 @@ class NovaUtilsInstanceVolumeTests(OSComponentTestCase): neutron = neutron_utils.neutron_client(self.os_creds) self.assertIsNotNone(nova_utils.attach_volume( self.nova, neutron, self.instance_creator.get_vm_inst(), - self.volume_creator.get_volume())) + self.volume_creator.get_volume(), self.project_id)) vol_attach = None attached = False @@ -472,7 +472,8 @@ class NovaUtilsInstanceVolumeTests(OSComponentTestCase): self.assertIsNotNone(vol_attach) vm_attach = nova_utils.get_server_object_by_id( - self.nova, neutron, self.instance_creator.get_vm_inst().id) + self.nova, neutron, self.instance_creator.get_vm_inst().id, + self.project_id) # Validate Attachment self.assertIsNotNone(vol_attach) @@ -484,12 +485,13 @@ class NovaUtilsInstanceVolumeTests(OSComponentTestCase): # Detach volume to VM self.assertIsNotNone(nova_utils.detach_volume( self.nova, neutron, self.instance_creator.get_vm_inst(), - self.volume_creator.get_volume())) + self.volume_creator.get_volume(), self.project_id)) vol_detach = cinder_utils.get_volume_by_id( self.cinder, self.volume_creator.get_volume().id) vm_detach = nova_utils.get_server_object_by_id( - self.nova, neutron, self.instance_creator.get_vm_inst().id) + self.nova, neutron, self.instance_creator.get_vm_inst().id, + self.project_id) # Validate Detachment self.assertIsNotNone(vol_detach) @@ -517,7 +519,7 @@ class NovaUtilsInstanceVolumeTests(OSComponentTestCase): with self.assertRaises(NovaException): nova_utils.attach_volume( self.nova, neutron, self.instance_creator.get_vm_inst(), - self.volume_creator.get_volume(), 0) + self.volume_creator.get_volume(), self.project_id, 0) def test_detach_volume_nowait(self): """ @@ -533,11 +535,12 @@ class NovaUtilsInstanceVolumeTests(OSComponentTestCase): neutron = neutron_utils.neutron_client(self.os_creds) nova_utils.attach_volume( self.nova, neutron, self.instance_creator.get_vm_inst(), - self.volume_creator.get_volume()) + self.volume_creator.get_volume(), self.project_id) # Check VmInst for attachment latest_vm = nova_utils.get_server_object_by_id( - self.nova, neutron, self.instance_creator.get_vm_inst().id) + self.nova, neutron, self.instance_creator.get_vm_inst().id, + self.project_id) self.assertEqual(1, len(latest_vm.volume_ids)) # Check Volume for attachment @@ -561,4 +564,4 @@ class NovaUtilsInstanceVolumeTests(OSComponentTestCase): with self.assertRaises(NovaException): nova_utils.detach_volume( self.nova, neutron, self.instance_creator.get_vm_inst(), - self.volume_creator.get_volume(), 0) + self.volume_creator.get_volume(), self.project_id, 0) diff --git a/snaps/openstack/utils/tests/settings_utils_tests.py b/snaps/openstack/utils/tests/settings_utils_tests.py index cbd78d8..5dabe38 100644 --- a/snaps/openstack/utils/tests/settings_utils_tests.py +++ b/snaps/openstack/utils/tests/settings_utils_tests.py @@ -327,7 +327,7 @@ class SettingsUtilsVmInstTests(OSComponentTestCase): self.nova, self.neutron, vm_inst_settings=self.inst_creator.instance_settings) derived_vm_settings = settings_utils.create_vm_inst_config( - self.nova, self.neutron, server) + self.nova, self.neutron, server, self.project_id) self.assertIsNotNone(derived_vm_settings) self.assertIsNotNone(derived_vm_settings.port_settings) self.assertIsNotNone(derived_vm_settings.floating_ip_settings) -- 2.16.6