1 # Copyright (c) 2016 Cable Television Laboratories, Inc. ("CableLabs")
2 # and others. All rights reserved.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at:
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
18 from requests.packages.urllib3.exceptions import InsecureRequestWarning
22 from snaps import file_utils
23 from snaps.openstack.create_project import ProjectSettings
24 from snaps.openstack.create_user import UserSettings
25 from snaps.openstack.tests import openstack_tests
26 from snaps.openstack.utils import deploy_utils, keystone_utils
29 dev_os_env_file = pkg_resources.resource_filename(
30 'snaps.openstack.tests.conf', 'os_env.yaml')
32 requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
35 class OSComponentTestCase(unittest.TestCase):
37 def __init__(self, method_name='runTest', os_creds=None, ext_net_name=None,
38 image_metadata=None, log_level=logging.DEBUG):
40 Super for test classes requiring a connection to OpenStack
41 :param method_name: default 'runTest'
42 :param os_creds: the OSCreds object, when null it searches for the file
43 in the package snaps.openstack.tests.conf.os_env.yaml
44 :param ext_net_name: the name of the external network that is used for
45 creating routers for floating IPs
46 :param image_metadata: ability to override images being used in the
47 tests (see examples/image-metadata)
48 :param log_level: the logging level of your test run (default DEBUG)
50 super(OSComponentTestCase, self).__init__(method_name)
52 logging.basicConfig(level=log_level)
55 self.os_creds = os_creds
57 self.os_creds = openstack_tests.get_credentials(
58 dev_os_env_file=dev_os_env_file)
60 self.ext_net_name = ext_net_name
62 if not self.ext_net_name and file_utils.file_exists(dev_os_env_file):
63 test_conf = file_utils.read_yaml(dev_os_env_file)
64 self.ext_net_name = test_conf.get('ext_net')
66 self.image_metadata = image_metadata
69 def parameterize(testcase_klass, os_creds, ext_net_name,
70 image_metadata=None, log_level=logging.DEBUG):
71 """ Create a suite containing all tests taken from the given
72 subclass, passing them the parameter 'param'.
74 test_loader = unittest.TestLoader()
75 test_names = test_loader.getTestCaseNames(testcase_klass)
76 suite = unittest.TestSuite()
77 for name in test_names:
78 suite.addTest(testcase_klass(name, os_creds, ext_net_name,
79 image_metadata, log_level))
83 class OSIntegrationTestCase(OSComponentTestCase):
85 def __init__(self, method_name='runTest', os_creds=None, ext_net_name=None,
86 use_keystone=True, flavor_metadata=None, image_metadata=None,
87 log_level=logging.DEBUG):
89 Super for integration tests requiring a connection to OpenStack
90 :param method_name: default 'runTest'
91 :param os_creds: the OSCreds object, when null it searches for the file
92 in the package snaps.openstack.tests.conf.os_env.yaml
93 :param ext_net_name: the name of the external network that is used for
94 creating routers for floating IPs
95 :param use_keystone: when true, these tests will create a new
96 user/project under which to run the test
97 :param image_metadata: dict() containing the URLs for the disk, kernel,
98 and ramdisk images when multi-part images are
99 required. See below for a simple example
100 image_metadata={'disk_url': '{URI}/cirros-0.3.4-x86_64-disk.img',
101 'kernel_url': '{URI}/cirros-0.3.4-x86_64-kernel',
102 'ramdisk_url': '{URI}/cirros-0.3.4-x86_64-initramfs'})
103 :param flavor_metadata: dict() to be sent directly into the Nova client
104 generally used for page sizes
105 :param log_level: the logging level of your test run (default DEBUG)
107 super(OSIntegrationTestCase, self).__init__(
108 method_name=method_name, os_creds=os_creds,
109 ext_net_name=ext_net_name, image_metadata=image_metadata,
111 self.use_keystone = use_keystone
113 self.flavor_metadata = flavor_metadata
116 def parameterize(testcase_klass, os_creds, ext_net_name,
117 use_keystone=False, flavor_metadata=None,
118 image_metadata=None, log_level=logging.DEBUG):
120 Create a suite containing all tests taken from the given
121 subclass, passing them the parameter 'param'.
123 test_loader = unittest.TestLoader()
124 test_names = test_loader.getTestCaseNames(testcase_klass)
125 suite = unittest.TestSuite()
126 for name in test_names:
127 suite.addTest(testcase_klass(name, os_creds, ext_net_name,
128 use_keystone, flavor_metadata,
129 image_metadata, log_level))
133 Super for test classes that should be run within their own project/tenant
134 as they can run for quite some time
138 Creates a project and user to be leveraged by subclass test methods. If
139 implementing class uses this method, it must call __clean__() else you
140 will be left with unwanted users and tenants
142 self.project_creator = None
143 self.user_creator = None
144 self.admin_os_creds = self.os_creds
147 if self.use_keystone:
148 self.keystone = keystone_utils.keystone_client(self.admin_os_creds)
149 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())[:-19]
150 project_name = guid + '-proj'
151 self.project_creator = deploy_utils.create_project(
152 self.admin_os_creds, ProjectSettings(
154 domain=self.admin_os_creds.project_domain_name))
156 self.user_creator = deploy_utils.create_user(
157 self.admin_os_creds, UserSettings(
158 name=guid + '-user', password=guid,
159 project_name=project_name, roles={
160 'admin': self.project_creator.project_settings.name},
161 domain_name=self.admin_os_creds.user_domain_name))
163 self.os_creds = self.user_creator.get_os_creds(
164 self.project_creator.project_settings.name)
166 # add user to project
167 self.project_creator.assoc_user(self.user_creator.get_user())
171 Cleans up test user and project.
172 Must be called at the end of child classes tearDown() if __start__() is
173 called during setUp() else these objects will persist after the test is
177 keystone_utils.delete_role(self.keystone, self.role)
179 if self.project_creator:
180 self.project_creator.clean()
182 if self.user_creator:
183 self.user_creator.clean()