Fixed problems when setting the OpenStack project ID. 05/38005/1
authorspisarski <s.pisarski@cablelabs.com>
Mon, 24 Jul 2017 17:27:59 +0000 (11:27 -0600)
committerspisarski <s.pisarski@cablelabs.com>
Mon, 24 Jul 2017 17:27:59 +0000 (11:27 -0600)
There were several calls to retrieve the project ID that required
named parameters which was causing the utility function to always
return None. Additionally, when creating the dict() required by the
Neutron create API 'body' parameter key 'project_id' is not supported
and still uses 'tenant_id'.

As these problems should have been found earlier, this patch also
extends the tests for networks, subnets, ports, and security groups
to use 'tenant_id' rather than 'project_id'.

JIRA: SNAPS-143

Change-Id: Ic69e56145ea6070718d821edd22a1d0f9970995d
Signed-off-by: spisarski <s.pisarski@cablelabs.com>
snaps/openstack/create_network.py
snaps/openstack/create_router.py
snaps/openstack/create_security_group.py
snaps/openstack/tests/create_network_tests.py
snaps/openstack/tests/create_router_tests.py
snaps/openstack/tests/create_security_group_tests.py
snaps/openstack/tests/os_source_file_test.py

index 4f27eec..2f26c43 100644 (file)
@@ -190,7 +190,6 @@ class NetworkSettings:
 
         if not self.name or len(self.name) < 1:
             raise NetworkSettingsError('Name required for networks')
-            raise NetworkSettingsError('Name required for networks')
 
     def get_project_id(self, os_creds):
         """
@@ -203,8 +202,8 @@ class NetworkSettings:
         else:
             if self.project_name:
                 keystone = keystone_utils.keystone_client(os_creds)
-                project = keystone_utils.get_project(keystone,
-                                                     self.project_name)
+                project = keystone_utils.get_project(
+                    keystone=keystone, project_name=self.project_name)
                 if project:
                     return project.id
 
@@ -231,7 +230,7 @@ class NetworkSettings:
         if self.project_name:
             project_id = self.get_project_id(os_creds)
             if project_id:
-                out['project_id'] = project_id
+                out['tenant_id'] = project_id
             else:
                 raise NetworkSettingsError(
                     'Could not find project ID for project named - ' +
@@ -345,12 +344,13 @@ class SubnetSettings:
             out['name'] = self.name
         if self.project_name:
             keystone = keystone_utils.keystone_client(os_creds)
-            project = keystone_utils.get_project(keystone, self.project_name)
+            project = keystone_utils.get_project(
+                keystone=keystone, project_name=self.project_name)
             project_id = None
             if project:
                 project_id = project.id
             if project_id:
-                out['project_id'] = project_id
+                out['tenant_id'] = project_id
             else:
                 raise SubnetSettingsError(
                     'Could not find project ID for project named - ' +
@@ -492,7 +492,8 @@ class PortSettings:
         project_id = None
         if self.project_name:
             keystone = keystone_utils.keystone_client(os_creds)
-            project = keystone_utils.get_project(keystone, self.project_name)
+            project = keystone_utils.get_project(
+                keystone=keystone, project_name=self.project_name)
             if project:
                 project_id = project.id
 
@@ -512,7 +513,7 @@ class PortSettings:
             out['name'] = self.name
         if self.project_name:
             if project_id:
-                out['project_id'] = project_id
+                out['tenant_id'] = project_id
             else:
                 raise PortSettingsError(
                     'Could not find project ID for project named - ' +
index e50009c..acf6602 100644 (file)
@@ -238,12 +238,13 @@ class RouterSettings:
             out['name'] = self.name
         if self.project_name:
             keystone = keystone_utils.keystone_client(os_creds)
-            project = keystone_utils.get_project(keystone, self.project_name)
+            project = keystone_utils.get_project(
+                keystone=keystone, project_name=self.project_name)
             project_id = None
             if project:
                 project_id = project.id
             if project_id:
-                out['project_id'] = project_id
+                out['tenant_id'] = project_id
             else:
                 raise RouterSettingsError(
                     'Could not find project ID for project named - ' +
index 4291796..bde5d01 100644 (file)
@@ -265,12 +265,13 @@ class SecurityGroupSettings:
         if self.description:
             out['description'] = self.description
         if self.project_name:
-            project = keystone_utils.get_project(keystone, self.project_name)
+            project = keystone_utils.get_project(
+                keystone=keystone, project_name=self.project_name)
             project_id = None
             if project:
                 project_id = project.id
             if project_id:
-                out['project_id'] = project_id
+                out['tenant_id'] = project_id
             else:
                 raise SecurityGroupSettingsError(
                     'Could not find project ID for project named - ' +
index 322d383..bd373f1 100644 (file)
@@ -464,6 +464,66 @@ class CreateNetworkSuccessTests(OSIntegrationTestCase):
         self.assertEqual(self.net_creator.get_network().id,
                          self.net_creator2.get_network().id)
 
+    def test_create_network_router_admin_user_to_new_project(self):
+        """
+        Tests the creation of an OpenStack network and router with the current
+        user to the admin project.
+        """
+        # Create Network/Subnet where the project names have been changed
+        admin_project_name = self.admin_os_creds.project_name
+        self.net_config.network_settings.project_name = admin_project_name
+        self.net_config.network_settings.subnet_settings[0].project_name = \
+            admin_project_name
+        self.net_creator = OpenStackNetwork(self.os_creds,
+                                            self.net_config.network_settings)
+        self.net_creator.create()
+
+        retrieved_net = neutron_utils.get_network(
+            self.neutron, self.net_config.network_settings.name)
+
+        self.assertEqual(self.net_creator.get_network().id, retrieved_net.id)
+
+        # Create Router
+        self.net_config.router_settings.project_name = admin_project_name
+        self.router_creator = create_router.OpenStackRouter(
+            self.os_creds, self.net_config.router_settings)
+        self.router_creator.create()
+
+        retrieved_router = neutron_utils.get_router_by_name(
+            self.neutron, self.router_creator.get_router().name)
+        self.assertEqual(
+            self.router_creator.get_router().id, retrieved_router.id)
+
+    def test_create_network_router_new_user_to_admin_project(self):
+        """
+        Tests the creation of an OpenStack network and router with the admin
+        user to the new project.
+        """
+        # Create Network/Subnet where the project names have been changed
+        new_project_name = self.os_creds.project_name
+        self.net_config.network_settings.project_name = new_project_name
+        self.net_config.network_settings.subnet_settings[0].project_name = \
+            new_project_name
+        self.net_creator = OpenStackNetwork(self.admin_os_creds,
+                                            self.net_config.network_settings)
+        self.net_creator.create()
+
+        retrieved_net = neutron_utils.get_network(
+            self.neutron, self.net_config.network_settings.name)
+
+        self.assertEqual(self.net_creator.get_network().id, retrieved_net.id)
+
+        # Create Router
+        self.net_config.router_settings.project_name = new_project_name
+        self.router_creator = create_router.OpenStackRouter(
+            self.admin_os_creds, self.net_config.router_settings)
+        self.router_creator.create()
+
+        retrieved_router = neutron_utils.get_router_by_name(
+            self.neutron, self.router_creator.get_router().name)
+        self.assertEqual(
+            self.router_creator.get_router().id, retrieved_router.id)
+
 
 class CreateNetworkTypeTests(OSComponentTestCase):
     """
index efa0993..6e10d66 100644 (file)
@@ -21,7 +21,7 @@ from snaps.openstack.create_network import (
     NetworkSettings, PortSettings)
 from snaps.openstack.create_network import OpenStackNetwork
 from snaps.openstack.create_router import (
-    RouterSettings, RouterSettingsError, RouterCreationError)
+    RouterSettings, RouterSettingsError)
 from snaps.openstack.tests.os_source_file_test import OSIntegrationTestCase
 from snaps.openstack.utils import neutron_utils
 
@@ -169,6 +169,46 @@ class CreateRouterSuccessTests(OSIntegrationTestCase):
         self.assertTrue(verify_router_attributes(
             router, self.router_creator, ext_gateway=self.ext_net_name))
 
+    def test_create_router_admin_user_to_new_project(self):
+        """
+        Test creation of a most basic router with the admin user pointing
+        to the new project.
+        """
+        router_settings = RouterSettings(
+            name=self.guid + '-pub-router', external_gateway=self.ext_net_name,
+            project_name=self.os_creds.project_name)
+
+        self.router_creator = create_router.OpenStackRouter(
+            self.admin_os_creds, router_settings)
+        self.router_creator.create()
+
+        router = neutron_utils.get_router_by_name(self.neutron,
+                                                  router_settings.name)
+        self.assertIsNotNone(router)
+
+        self.assertTrue(verify_router_attributes(
+            router, self.router_creator, ext_gateway=self.ext_net_name))
+
+    def test_create_router_new_user_to_admin_project(self):
+        """
+        Test creation of a most basic router with the new user pointing
+        to the admin project.
+        """
+        router_settings = RouterSettings(
+            name=self.guid + '-pub-router', external_gateway=self.ext_net_name,
+            project_name=self.admin_os_creds.project_name)
+
+        self.router_creator = create_router.OpenStackRouter(
+            self.os_creds, router_settings)
+        self.router_creator.create()
+
+        router = neutron_utils.get_router_by_name(self.neutron,
+                                                  router_settings.name)
+        self.assertIsNotNone(router)
+
+        self.assertTrue(verify_router_attributes(
+            router, self.router_creator, ext_gateway=self.ext_net_name))
+
     def test_create_delete_router(self):
         """
         Test that clean() will not raise an exception if the router is deleted
@@ -257,14 +297,23 @@ class CreateRouterSuccessTests(OSIntegrationTestCase):
         self.network_creator2.create()
 
         port_settings = [
-            create_network.PortSettings(name=self.guid + '-port1', ip_addrs=[
-                {'subnet_name': network_settings1.subnet_settings[0].name,
-                 'ip': static_gateway_ip1}],
-                                        network_name=network_settings1.name),
-            create_network.PortSettings(name=self.guid + '-port2', ip_addrs=[
-                {'subnet_name': network_settings2.subnet_settings[0].name,
-                 'ip': static_gateway_ip2}],
-                                          network_name=network_settings2.name)]
+            create_network.PortSettings(
+                name=self.guid + '-port1',
+                ip_addrs=[{
+                    'subnet_name':
+                        network_settings1.subnet_settings[0].name,
+                    'ip': static_gateway_ip1
+                }],
+                network_name=network_settings1.name,
+                project_name=self.os_creds.project_name),
+            create_network.PortSettings(
+                name=self.guid + '-port2',
+                ip_addrs=[{
+                    'subnet_name': network_settings2.subnet_settings[0].name,
+                    'ip': static_gateway_ip2
+                }],
+                network_name=network_settings2.name,
+                project_name=self.os_creds.project_name)]
 
         router_settings = RouterSettings(name=self.guid + '-pub-router',
                                          port_settings=port_settings)
@@ -293,14 +342,17 @@ class CreateRouterSuccessTests(OSIntegrationTestCase):
         self.network_creator1.create()
 
         port_settings = [
-            create_network.PortSettings(name=self.guid + '-port1', ip_addrs=[
-                {'subnet_name': network_settings.subnet_settings[0].name,
-                 'ip': static_gateway_ip1}],
-                                        network_name=network_settings.name)]
-
-        router_settings = RouterSettings(name=self.guid + '-pub-router',
-                                         external_gateway=self.ext_net_name,
-                                         port_settings=port_settings)
+            create_network.PortSettings(
+                name=self.guid + '-port1',
+                ip_addrs=[{
+                    'subnet_name': network_settings.subnet_settings[0].name,
+                    'ip': static_gateway_ip1}],
+                network_name=network_settings.name,
+                project_name=self.os_creds.project_name)]
+
+        router_settings = RouterSettings(
+            name=self.guid + '-pub-router', external_gateway=self.ext_net_name,
+            port_settings=port_settings)
         self.router_creator = create_router.OpenStackRouter(self.os_creds,
                                                             router_settings)
         self.router_creator.create()
index dd28d7d..7cae62b 100644 (file)
@@ -16,12 +16,9 @@ import unittest
 import uuid
 
 from snaps.openstack import create_security_group
-from snaps.openstack.create_security_group import (SecurityGroupSettings,
-                                                   SecurityGroupRuleSettings,
-                                                   Direction, Ethertype,
-                                                   Protocol,
-                                                   SecurityGroupRuleSettingsError,
-                                                   SecurityGroupSettingsError)
+from snaps.openstack.create_security_group import (
+    SecurityGroupSettings, SecurityGroupRuleSettings, Direction, Ethertype,
+    Protocol, SecurityGroupRuleSettingsError, SecurityGroupSettingsError)
 from snaps.openstack.tests import validation_utils
 from snaps.openstack.tests.os_source_file_test import OSIntegrationTestCase
 from snaps.openstack.utils import neutron_utils
@@ -212,6 +209,54 @@ class CreateSecurityGroupTests(OSIntegrationTestCase):
         validation_utils.objects_equivalent(self.sec_grp_creator.get_rules(),
                                             rules)
 
+    def test_create_group_admin_user_to_new_project(self):
+        """
+        Tests the creation of an OpenStack Security Group without custom rules.
+        """
+        # Create Image
+        sec_grp_settings = SecurityGroupSettings(
+            name=self.sec_grp_name, description='hello group',
+            project_name=self.admin_os_creds.project_name)
+        self.sec_grp_creator = create_security_group.OpenStackSecurityGroup(
+            self.os_creds, sec_grp_settings)
+        self.sec_grp_creator.create()
+
+        sec_grp = neutron_utils.get_security_group(self.neutron,
+                                                   self.sec_grp_name)
+        self.assertIsNotNone(sec_grp)
+
+        validation_utils.objects_equivalent(
+            self.sec_grp_creator.get_security_group(), sec_grp)
+        rules = neutron_utils.get_rules_by_security_group(
+            self.neutron, self.sec_grp_creator.get_security_group())
+        self.assertEqual(len(self.sec_grp_creator.get_rules()), len(rules))
+        validation_utils.objects_equivalent(self.sec_grp_creator.get_rules(),
+                                            rules)
+
+    def test_create_group_new_user_to_admin_project(self):
+        """
+        Tests the creation of an OpenStack Security Group without custom rules.
+        """
+        # Create Image
+        sec_grp_settings = SecurityGroupSettings(
+            name=self.sec_grp_name, description='hello group',
+            project_name=self.os_creds.project_name)
+        self.sec_grp_creator = create_security_group.OpenStackSecurityGroup(
+            self.admin_os_creds, sec_grp_settings)
+        self.sec_grp_creator.create()
+
+        sec_grp = neutron_utils.get_security_group(self.neutron,
+                                                   self.sec_grp_name)
+        self.assertIsNotNone(sec_grp)
+
+        validation_utils.objects_equivalent(
+            self.sec_grp_creator.get_security_group(), sec_grp)
+        rules = neutron_utils.get_rules_by_security_group(
+            self.neutron, self.sec_grp_creator.get_security_group())
+        self.assertEqual(len(self.sec_grp_creator.get_rules()), len(rules))
+        validation_utils.objects_equivalent(self.sec_grp_creator.get_rules(),
+                                            rules)
+
     def test_create_delete_group(self):
         """
         Tests the creation of an OpenStack Security Group without custom rules.
index 2ccee3f..da474a2 100644 (file)
@@ -31,6 +31,7 @@ dev_os_env_file = pkg_resources.resource_filename(
 
 requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
 
+
 class OSComponentTestCase(unittest.TestCase):
 
     def __init__(self, method_name='runTest', os_creds=None, ext_net_name=None,
@@ -82,7 +83,7 @@ class OSComponentTestCase(unittest.TestCase):
 class OSIntegrationTestCase(OSComponentTestCase):
 
     def __init__(self, method_name='runTest', os_creds=None, ext_net_name=None,
-                 use_keystone=False, flavor_metadata=None, image_metadata=None,
+                 use_keystone=True, flavor_metadata=None, image_metadata=None,
                  log_level=logging.DEBUG):
         """
         Super for integration tests requiring a connection to OpenStack