Ensure project IDs are handled correctly for Network/Subnets 45/52245/1
authorspisarski <s.pisarski@cablelabs.com>
Fri, 16 Feb 2018 15:35:07 +0000 (08:35 -0700)
committerspisarski <s.pisarski@cablelabs.com>
Fri, 16 Feb 2018 15:35:07 +0000 (08:35 -0700)
JIRA: SNAPS-265

Change-Id: If58f5817e52e21be377d2b06a5f7c3a413454350
Signed-off-by: spisarski <s.pisarski@cablelabs.com>
20 files changed:
docs/how-to-use/IntegrationTests.rst
snaps/config/router.py
snaps/domain/network.py
snaps/domain/test/network_tests.py
snaps/openstack/create_instance.py
snaps/openstack/create_network.py
snaps/openstack/create_router.py
snaps/openstack/create_stack.py
snaps/openstack/tests/create_instance_tests.py
snaps/openstack/tests/create_network_tests.py
snaps/openstack/tests/create_stack_tests.py
snaps/openstack/tests/os_source_file_test.py
snaps/openstack/utils/heat_utils.py
snaps/openstack/utils/neutron_utils.py
snaps/openstack/utils/nova_utils.py
snaps/openstack/utils/settings_utils.py
snaps/openstack/utils/tests/heat_utils_tests.py
snaps/openstack/utils/tests/neutron_utils_tests.py
snaps/openstack/utils/tests/nova_utils_tests.py
snaps/openstack/utils/tests/settings_utils_tests.py

index c376f8c..cdadd96 100644 (file)
@@ -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
 -------------------------------------------------
 
index 72164f2..ae84038 100644 (file)
@@ -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:
index 2d02966..aabec21 100644 (file)
@@ -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
index 3003326..5f70c3f 100644 (file)
@@ -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)
index 73cdf8a..dcb73cd 100644 (file)
@@ -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)
index 984eedd..b57e108 100644 (file)
@@ -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)
index c9ccdd6..765f7a3 100644 (file)
@@ -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)
index d4a6b10..99d2925 100644 (file)
@@ -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(
index c713794..4ff9fce 100644 (file)
@@ -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,
index 62d9bd9..af5160b 100644 (file)
@@ -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)
index 7155a29..e04ae07 100644 (file)
@@ -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)
 
 
index f1f90ec..58c9e4e 100644 (file)
@@ -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):
         """
index e440717..6e54dc6 100644 (file)
@@ -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)
 
index d297c8c..a2957a6 100644 (file)
@@ -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
 
 
index ba902f9..b37e0a4 100644 (file)
@@ -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:
index 2cf6047..c14437d 100644 (file)
@@ -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)
index 67fbdec..ee95a63 100644 (file)
@@ -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))
 
index 4dfff87..22c6a33 100644 (file)
@@ -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:
index 9383088..560a9f3 100644 (file)
@@ -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)
index cbd78d8..5dabe38 100644 (file)
@@ -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)