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.
20 from snaps import file_utils
21 from snaps.config.project import ProjectConfig
22 from snaps.config.user import UserConfig
23 from snaps.openstack.tests import openstack_tests
24 from snaps.openstack.utils import deploy_utils, keystone_utils
27 dev_os_env_file = pkg_resources.resource_filename(
28 'snaps.openstack.tests.conf', 'os_env.yaml')
31 class OSComponentTestCase(unittest.TestCase):
33 def __init__(self, method_name='runTest', os_creds=None, ext_net_name=None,
34 flavor_metadata=None, image_metadata=None,
35 log_level=logging.DEBUG):
37 Super for test classes requiring a connection to OpenStack
38 :param method_name: default 'runTest'
39 :param os_creds: the OSCreds object, when null it searches for the file
40 in the package snaps.openstack.tests.conf.os_env.yaml
41 :param ext_net_name: the name of the external network that is used for
42 creating routers for floating IPs
43 :param flavor_metadata: dict() to be sent directly into the Nova client
44 generally used for page sizes
45 :param image_metadata: ability to override images being used in the
46 tests (see examples/image-metadata)
47 :param log_level: the logging level of your test run (default DEBUG)
49 super(OSComponentTestCase, self).__init__(method_name)
51 logging.basicConfig(level=log_level)
54 self.os_creds = os_creds
56 self.os_creds = openstack_tests.get_credentials(
57 dev_os_env_file=dev_os_env_file)
59 self.os_session = keystone_utils.keystone_session(self.os_creds)
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')
67 self.flavor_metadata = flavor_metadata
69 os_env_dict = file_utils.read_yaml(dev_os_env_file)
70 flavor_metadata = os_env_dict.get('flavor_metadata')
72 self.flavor_metadata = {'metadata': flavor_metadata}
73 self.image_metadata = image_metadata
76 def parameterize(testcase_klass, os_creds, ext_net_name,
77 flavor_metadata=None, image_metadata=None,
78 log_level=logging.DEBUG):
79 """ Create a suite containing all tests taken from the given
80 subclass, passing them the parameter 'param'.
82 test_loader = unittest.TestLoader()
83 test_names = test_loader.getTestCaseNames(testcase_klass)
84 suite = unittest.TestSuite()
85 for name in test_names:
86 suite.addTest(testcase_klass(
87 name, os_creds, ext_net_name, flavor_metadata, image_metadata,
93 Cleans up keystone session.
96 keystone_utils.close_session(self.os_session)
99 class OSIntegrationTestCase(OSComponentTestCase):
101 def __init__(self, method_name='runTest', os_creds=None, ext_net_name=None,
102 use_keystone=True, flavor_metadata=None, image_metadata=None,
103 netconf_override=None, log_level=logging.DEBUG):
105 Super for integration tests requiring a connection to OpenStack
106 :param method_name: default 'runTest'
107 :param os_creds: the OSCreds object, when null it searches for the file
108 in the package snaps.openstack.tests.conf.os_env.yaml
109 :param ext_net_name: the name of the external network that is used for
110 creating routers for floating IPs
111 :param use_keystone: when true, these tests will create a new
112 user/project under which to run the test
113 :param image_metadata: dict() containing the URLs for the disk, kernel,
114 and ramdisk images when multi-part images are
115 required. See below for a simple example
116 image_metadata={'disk_url': '{URI}/cirros-0.3.4-x86_64-disk.img',
117 'kernel_url': '{URI}/cirros-0.3.4-x86_64-kernel',
118 'ramdisk_url': '{URI}/cirros-0.3.4-x86_64-initramfs'})
119 :param flavor_metadata: dict() to be sent directly into the Nova client
120 generally used for page sizes
121 :param netconf_override: dict() containing the configured network_type,
122 physical_network and segmentation_id
123 :param log_level: the logging level of your test run (default DEBUG)
125 super(OSIntegrationTestCase, self).__init__(
126 method_name=method_name, os_creds=os_creds,
127 ext_net_name=ext_net_name, flavor_metadata=flavor_metadata,
128 image_metadata=image_metadata, log_level=log_level)
129 self.netconf_override = netconf_override
130 self.use_keystone = use_keystone
132 self.user_roles = None
133 self.proj_users = None
136 def parameterize(testcase_klass, os_creds, ext_net_name,
137 use_keystone=True, flavor_metadata=None,
138 image_metadata=None, netconf_override=None,
139 log_level=logging.DEBUG):
141 Create a suite containing all tests taken from the given
142 subclass, passing them the parameter 'param'.
144 test_loader = unittest.TestLoader()
145 test_names = test_loader.getTestCaseNames(testcase_klass)
146 suite = unittest.TestSuite()
147 for name in test_names:
148 suite.addTest(testcase_klass(name, os_creds, ext_net_name,
149 use_keystone, flavor_metadata,
150 image_metadata, netconf_override,
155 Super for test classes that should be run within their own project/tenant
156 as they can run for quite some time
160 Creates a project and user to be leveraged by subclass test methods. If
161 implementing class uses this method, it must call __clean__() else you
162 will be left with unwanted users and tenants
164 self.project_creator = None
165 self.user_creator = None
166 self.admin_os_creds = self.os_creds
167 self.admin_os_session = self.os_session
168 self.keystone = keystone_utils.keystone_client(
169 self.admin_os_creds, self.admin_os_session)
171 if self.use_keystone:
172 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())[:-19]
173 project_name = guid + '-proj'
174 self.project_creator = deploy_utils.create_project(
175 self.admin_os_creds, ProjectConfig(
177 domain=self.admin_os_creds.project_domain_name))
179 # Set by implementing class for setting the user's roles
181 if self.user_roles and isinstance(self.user_roles, list):
182 for user_role in self.user_roles:
183 roles[user_role] = project_name
185 self.user_creator = deploy_utils.create_user(
186 self.admin_os_creds, UserConfig(
187 name=guid + '-user', password=guid,
188 project_name=project_name, roles=roles,
189 domain_name=self.admin_os_creds.user_domain_name))
191 self.os_creds = self.user_creator.get_os_creds(
192 self.project_creator.project_settings.name)
193 self.os_session = keystone_utils.keystone_session(self.os_creds)
195 # add user to project
196 self.project_creator.assoc_user(self.user_creator.get_user())
198 if self.proj_users and isinstance(self.proj_users, list):
199 for user_name in self.proj_users:
200 user = keystone_utils.get_user(self.keystone, user_name)
202 self.project_creator.assoc_user(user)
206 Cleans up test user and project.
207 Must be called at the end of child classes tearDown() if __start__() is
208 called during setUp() else these objects will persist after the test is
211 if self.project_creator:
212 self.project_creator.clean()
214 if self.user_creator:
215 self.user_creator.clean()
217 if self.admin_os_session:
218 keystone_utils.close_session(self.admin_os_session)
220 super(OSIntegrationTestCase, self).__clean__()