Added functionality for OpenStackSecurityGroup#initialize() not to accept
[snaps.git] / snaps / openstack / tests / os_source_file_test.py
index af75381..f1f90ec 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 import logging
+import pkg_resources
 import uuid
 import unittest
 
 from snaps import file_utils
-from snaps.openstack.create_project import ProjectSettings
-from snaps.openstack.create_user import UserSettings
+from snaps.config.project import ProjectConfig
+from snaps.config.user import UserConfig
 from snaps.openstack.tests import openstack_tests
 from snaps.openstack.utils import deploy_utils, keystone_utils
 
-dev_os_env_file = 'openstack/tests/conf/os_env.yaml'
 
-# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-# To run these tests from an IDE, the CWD must be set to the snaps directory of this project
-# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+dev_os_env_file = pkg_resources.resource_filename(
+    'snaps.openstack.tests.conf', 'os_env.yaml')
 
 
 class OSComponentTestCase(unittest.TestCase):
 
-    def __init__(self, method_name='runTest', os_creds=None, ext_net_name=None, log_level=logging.DEBUG):
+    def __init__(self, method_name='runTest', os_creds=None, ext_net_name=None,
+                 image_metadata=None, log_level=logging.DEBUG):
         """
         Super for test classes requiring a connection to OpenStack
         :param method_name: default 'runTest'
-        :param os_creds: the OSCreds object, when null it searches for the file {cwd}/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 os_creds: the OSCreds object, when null it searches for the file
+                         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 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)
         """
         super(OSComponentTestCase, self).__init__(method_name)
@@ -46,7 +50,8 @@ class OSComponentTestCase(unittest.TestCase):
         if os_creds:
             self.os_creds = os_creds
         else:
-            self.os_creds = openstack_tests.get_credentials(dev_os_env_file=dev_os_env_file)
+            self.os_creds = openstack_tests.get_credentials(
+                dev_os_env_file=dev_os_env_file)
 
         self.ext_net_name = ext_net_name
 
@@ -54,8 +59,15 @@ class OSComponentTestCase(unittest.TestCase):
             test_conf = file_utils.read_yaml(dev_os_env_file)
             self.ext_net_name = test_conf.get('ext_net')
 
+        self.image_metadata = image_metadata
+
+        keystone = keystone_utils.keystone_client(self.os_creds)
+        self.project_id = keystone_utils.get_project(
+            keystone=keystone, project_name=self.os_creds.project_name)
+
     @staticmethod
-    def parameterize(testcase_klass, os_creds, ext_net_name, log_level=logging.DEBUG):
+    def parameterize(testcase_klass, os_creds, ext_net_name,
+                     image_metadata=None, log_level=logging.DEBUG):
         """ Create a suite containing all tests taken from the given
             subclass, passing them the parameter 'param'.
         """
@@ -63,38 +75,51 @@ 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, log_level))
+            suite.addTest(testcase_klass(name, os_creds, ext_net_name,
+                                         image_metadata, log_level))
         return suite
 
 
 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, log_level=logging.DEBUG):
+    def __init__(self, method_name='runTest', os_creds=None, ext_net_name=None,
+                 use_keystone=True, flavor_metadata=None, image_metadata=None,
+                 netconf_override=None, log_level=logging.DEBUG):
         """
         Super for integration tests requiring a connection to OpenStack
         :param method_name: default 'runTest'
-        :param os_creds: the OSCreds object, when null it searches for the file {cwd}/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 use_keystone: when true, these tests will create a new user/project under which to run the test
-        :param image_metadata: dict() containing the URLs for the disk, kernel, and ramdisk images when multi-part
-                               images are required.
-            image_metadata={'disk_url': 'http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img',
-                            'kernel_url': 'http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-kernel',
-                            'ramdisk_url': 'http://download.cirros-cloud.net/0.3.4/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 os_creds: the OSCreds object, when null it searches for the file
+                         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 use_keystone: when true, these tests will create a new
+                             user/project under which to run the test
+        :param image_metadata: dict() containing the URLs for the disk, kernel,
+                               and ramdisk images when multi-part images are
+                               required. See below for a simple example
+        image_metadata={'disk_url': '{URI}/cirros-0.3.4-x86_64-disk.img',
+                        'kernel_url': '{URI}/cirros-0.3.4-x86_64-kernel',
+                        '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, log_level=log_level)
+        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)
+        self.netconf_override = netconf_override
         self.use_keystone = use_keystone
         self.keystone = None
         self.flavor_metadata = flavor_metadata
-        self.image_metadata = image_metadata
 
     @staticmethod
-    def parameterize(testcase_klass, os_creds, ext_net_name, use_keystone=False, flavor_metadata=None,
-                     image_metadata=None, log_level=logging.DEBUG):
+    def parameterize(testcase_klass, os_creds, ext_net_name,
+                     use_keystone=False, 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'.
@@ -103,17 +128,21 @@ class OSIntegrationTestCase(OSComponentTestCase):
         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, use_keystone, flavor_metadata, image_metadata,
+            suite.addTest(testcase_klass(name, os_creds, ext_net_name,
+                                         use_keystone, flavor_metadata,
+                                         image_metadata, netconf_override,
                                          log_level))
         return suite
 
     """
-    Super for test classes that should be run within their own project/tenant as they can run for quite some time
+    Super for test classes that should be run within their own project/tenant
+    as they can run for quite some time
     """
     def __start__(self):
         """
-        Creates a project and user to be leveraged by subclass test methods. If implementing class uses this method,
-        it must call __clean__() else you will be left with unwanted users and tenants
+        Creates a project and user to be leveraged by subclass test methods. If
+        implementing class uses this method, it must call __clean__() else you
+        will be left with unwanted users and tenants
         """
         self.project_creator = None
         self.user_creator = None
@@ -121,14 +150,23 @@ class OSIntegrationTestCase(OSComponentTestCase):
         self.role = None
 
         if self.use_keystone:
-            self.keystone = keystone_utils.keystone_client(self.os_creds)
+            self.keystone = keystone_utils.keystone_client(self.admin_os_creds)
             guid = self.__class__.__name__ + '-' + str(uuid.uuid4())[:-19]
             project_name = guid + '-proj'
-            self.project_creator = deploy_utils.create_project(self.admin_os_creds, ProjectSettings(name=project_name))
+            self.project_creator = deploy_utils.create_project(
+                self.admin_os_creds, ProjectConfig(
+                    name=project_name,
+                    domain=self.admin_os_creds.project_domain_name))
 
             self.user_creator = deploy_utils.create_user(
-                self.admin_os_creds, UserSettings(name=guid + '-user', password=guid, project_name=project_name))
-            self.os_creds = self.user_creator.get_os_creds(self.project_creator.project_settings.name)
+                self.admin_os_creds, UserConfig(
+                    name=guid + '-user', password=guid,
+                    project_name=project_name, roles={
+                        'admin': self.project_creator.project_settings.name},
+                    domain_name=self.admin_os_creds.user_domain_name))
+
+            self.os_creds = self.user_creator.get_os_creds(
+                self.project_creator.project_settings.name)
 
             # add user to project
             self.project_creator.assoc_user(self.user_creator.get_user())
@@ -136,8 +174,9 @@ class OSIntegrationTestCase(OSComponentTestCase):
     def __clean__(self):
         """
         Cleans up test user and project.
-        Must be called at the end of child classes tearDown() if __start__() is called during setUp() else these
-        objects will persist after the test is run
+        Must be called at the end of child classes tearDown() if __start__() is
+        called during setUp() else these objects will persist after the test is
+        run
         """
         if self.role:
             keystone_utils.delete_role(self.keystone, self.role)