Added MTU network config and updated flavor_metadata test support
[snaps.git] / snaps / openstack / tests / os_source_file_test.py
index ef4fcfa..bd98ad3 100644 (file)
@@ -31,7 +31,8 @@ dev_os_env_file = pkg_resources.resource_filename(
 class OSComponentTestCase(unittest.TestCase):
 
     def __init__(self, method_name='runTest', os_creds=None, ext_net_name=None,
-                 image_metadata=None, log_level=logging.DEBUG):
+                 flavor_metadata=None, image_metadata=None,
+                 log_level=logging.DEBUG):
         """
         Super for test classes requiring a connection to OpenStack
         :param method_name: default 'runTest'
@@ -39,6 +40,8 @@ class OSComponentTestCase(unittest.TestCase):
                          in the package snaps.openstack.tests.conf.os_env.yaml
         :param ext_net_name: the name of the external network that is used for
                              creating routers for floating IPs
+        :param flavor_metadata: dict() to be sent directly into the Nova client
+                                generally used for page sizes
         :param image_metadata: ability to override images being used in the
                                tests (see examples/image-metadata)
         :param log_level: the logging level of your test run (default DEBUG)
@@ -53,17 +56,26 @@ class OSComponentTestCase(unittest.TestCase):
             self.os_creds = openstack_tests.get_credentials(
                 dev_os_env_file=dev_os_env_file)
 
+        self.os_session = keystone_utils.keystone_session(self.os_creds)
         self.ext_net_name = ext_net_name
 
         if not self.ext_net_name and file_utils.file_exists(dev_os_env_file):
             test_conf = file_utils.read_yaml(dev_os_env_file)
             self.ext_net_name = test_conf.get('ext_net')
 
+        if flavor_metadata:
+            self.flavor_metadata = flavor_metadata
+        else:
+            os_env_dict = file_utils.read_yaml(dev_os_env_file)
+            flavor_metadata = os_env_dict.get('flavor_metadata')
+            if flavor_metadata:
+                self.flavor_metadata = {'metadata': flavor_metadata}
         self.image_metadata = image_metadata
 
     @staticmethod
     def parameterize(testcase_klass, os_creds, ext_net_name,
-                     image_metadata=None, log_level=logging.DEBUG):
+                     flavor_metadata=None, image_metadata=None,
+                     log_level=logging.DEBUG):
         """ Create a suite containing all tests taken from the given
             subclass, passing them the parameter 'param'.
         """
@@ -71,16 +83,24 @@ class OSComponentTestCase(unittest.TestCase):
         test_names = test_loader.getTestCaseNames(testcase_klass)
         suite = unittest.TestSuite()
         for name in test_names:
-            suite.addTest(testcase_klass(name, os_creds, ext_net_name,
-                                         image_metadata, log_level))
+            suite.addTest(testcase_klass(
+                name, os_creds, ext_net_name, flavor_metadata, image_metadata,
+                log_level))
         return suite
 
+    def __clean__(self):
+        """
+        Cleans up keystone session.
+        """
+        if self.os_session:
+            keystone_utils.close_session(self.os_session)
+
 
 class OSIntegrationTestCase(OSComponentTestCase):
 
     def __init__(self, method_name='runTest', os_creds=None, ext_net_name=None,
                  use_keystone=True, flavor_metadata=None, image_metadata=None,
-                 log_level=logging.DEBUG):
+                 netconf_override=None, log_level=logging.DEBUG):
         """
         Super for integration tests requiring a connection to OpenStack
         :param method_name: default 'runTest'
@@ -98,20 +118,25 @@ class OSIntegrationTestCase(OSComponentTestCase):
                         'ramdisk_url': '{URI}/cirros-0.3.4-x86_64-initramfs'})
         :param flavor_metadata: dict() to be sent directly into the Nova client
                                 generally used for page sizes
+        :param netconf_override: dict() containing the configured network_type,
+                               physical_network and segmentation_id
         :param log_level: the logging level of your test run (default DEBUG)
         """
         super(OSIntegrationTestCase, self).__init__(
             method_name=method_name, os_creds=os_creds,
-            ext_net_name=ext_net_name, image_metadata=image_metadata,
-            log_level=log_level)
+            ext_net_name=ext_net_name, flavor_metadata=flavor_metadata,
+            image_metadata=image_metadata, log_level=log_level)
+        self.netconf_override = netconf_override
         self.use_keystone = use_keystone
         self.keystone = None
-        self.flavor_metadata = flavor_metadata
+        self.user_roles = None
+        self.proj_users = None
 
     @staticmethod
     def parameterize(testcase_klass, os_creds, ext_net_name,
-                     use_keystone=False, flavor_metadata=None,
-                     image_metadata=None, log_level=logging.DEBUG):
+                     use_keystone=True, flavor_metadata=None,
+                     image_metadata=None, netconf_override=None,
+                     log_level=logging.DEBUG):
         """
         Create a suite containing all tests taken from the given
         subclass, passing them the parameter 'param'.
@@ -122,7 +147,8 @@ class OSIntegrationTestCase(OSComponentTestCase):
         for name in test_names:
             suite.addTest(testcase_klass(name, os_creds, ext_net_name,
                                          use_keystone, flavor_metadata,
-                                         image_metadata, log_level))
+                                         image_metadata, netconf_override,
+                                         log_level))
         return suite
 
     """
@@ -138,10 +164,11 @@ class OSIntegrationTestCase(OSComponentTestCase):
         self.project_creator = None
         self.user_creator = None
         self.admin_os_creds = self.os_creds
-        self.role = None
+        self.admin_os_session = self.os_session
+        self.keystone = keystone_utils.keystone_client(
+            self.admin_os_creds, self.admin_os_session)
 
         if self.use_keystone:
-            self.keystone = keystone_utils.keystone_client(self.admin_os_creds)
             guid = self.__class__.__name__ + '-' + str(uuid.uuid4())[:-19]
             project_name = guid + '-proj'
             self.project_creator = deploy_utils.create_project(
@@ -149,19 +176,31 @@ class OSIntegrationTestCase(OSComponentTestCase):
                     name=project_name,
                     domain=self.admin_os_creds.project_domain_name))
 
+            # Set by implementing class for setting the user's roles
+            roles = dict()
+            if self.user_roles and isinstance(self.user_roles, list):
+                for user_role in self.user_roles:
+                    roles[user_role] = project_name
+
             self.user_creator = deploy_utils.create_user(
                 self.admin_os_creds, UserConfig(
                     name=guid + '-user', password=guid,
-                    project_name=project_name, roles={
-                        'admin': self.project_creator.project_settings.name},
+                    project_name=project_name, roles=roles,
                     domain_name=self.admin_os_creds.user_domain_name))
 
             self.os_creds = self.user_creator.get_os_creds(
                 self.project_creator.project_settings.name)
+            self.os_session = keystone_utils.keystone_session(self.os_creds)
 
             # add user to project
             self.project_creator.assoc_user(self.user_creator.get_user())
 
+            if self.proj_users and isinstance(self.proj_users, list):
+                for user_name in self.proj_users:
+                    user = keystone_utils.get_user(self.keystone, user_name)
+                    if user:
+                        self.project_creator.assoc_user(user)
+
     def __clean__(self):
         """
         Cleans up test user and project.
@@ -169,11 +208,13 @@ class OSIntegrationTestCase(OSComponentTestCase):
         called during setUp() else these objects will persist after the test is
         run
         """
-        if self.role:
-            keystone_utils.delete_role(self.keystone, self.role)
-
         if self.project_creator:
             self.project_creator.clean()
 
         if self.user_creator:
             self.user_creator.clean()
+
+        if self.admin_os_session:
+            keystone_utils.close_session(self.admin_os_session)
+
+        super(OSIntegrationTestCase, self).__clean__()