1 # Copyright (c) 2017 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 keystoneclient.exceptions import BadRequest
20 from snaps.domain.project import ComputeQuotas, NetworkQuotas
21 from snaps.openstack.create_project import (
22 OpenStackProject, ProjectSettings, ProjectSettingsError)
23 from snaps.openstack.create_security_group import OpenStackSecurityGroup
24 from snaps.openstack.create_security_group import SecurityGroupSettings
25 from snaps.openstack.create_user import OpenStackUser
26 from snaps.openstack.create_user import UserSettings
27 from snaps.openstack.tests.os_source_file_test import OSComponentTestCase
28 from snaps.openstack.utils import keystone_utils, nova_utils, neutron_utils
30 __author__ = 'spisarski'
33 class ProjectSettingsUnitTests(unittest.TestCase):
35 Tests the construction of the ProjectSettings class
38 def test_no_params(self):
39 with self.assertRaises(ProjectSettingsError):
42 def test_empty_config(self):
43 with self.assertRaises(ProjectSettingsError):
44 ProjectSettings(**dict())
46 def test_name_only(self):
47 settings = ProjectSettings(name='foo')
48 self.assertEqual('foo', settings.name)
49 self.assertEqual('Default', settings.domain_name)
50 self.assertIsNone(settings.description)
51 self.assertTrue(settings.enabled)
53 def test_config_with_name_only(self):
54 settings = ProjectSettings(**{'name': 'foo'})
55 self.assertEqual('foo', settings.name)
56 self.assertEqual('Default', settings.domain_name)
57 self.assertIsNone(settings.description)
58 self.assertTrue(settings.enabled)
61 settings = ProjectSettings(name='foo', domain='bar',
62 description='foobar', enabled=False)
63 self.assertEqual('foo', settings.name)
64 self.assertEqual('bar', settings.domain_name)
65 self.assertEqual('foobar', settings.description)
66 self.assertFalse(settings.enabled)
68 def test_config_all(self):
69 settings = ProjectSettings(
70 **{'name': 'foo', 'domain': 'bar', 'description': 'foobar',
72 self.assertEqual('foo', settings.name)
73 self.assertEqual('bar', settings.domain_name)
74 self.assertEqual('foobar', settings.description)
75 self.assertFalse(settings.enabled)
78 class CreateProjectSuccessTests(OSComponentTestCase):
80 Test for the CreateImage class defined in create_image.py
85 Instantiates the CreateImage object that is responsible for downloading
86 and creating an OS image file within OpenStack
88 guid = str(uuid.uuid4())[:-19]
89 guid = self.__class__.__name__ + '-' + guid
90 self.project_settings = ProjectSettings(
92 domain=self.os_creds.project_domain_name)
94 self.keystone = keystone_utils.keystone_client(self.os_creds)
96 # Initialize for cleanup
97 self.project_creator = None
101 Cleans the image and downloaded image file
103 if self.project_creator:
104 self.project_creator.clean()
106 def test_create_project_bad_domain(self):
108 Tests the creation of an OpenStack project with an invalid domain
109 value. This test will not do anything with a keystone v2.0 client.
111 if self.keystone.version != keystone_utils.V2_VERSION_STR:
112 self.project_settings.domain_name = 'foo'
113 self.project_creator = OpenStackProject(self.os_creds,
114 self.project_settings)
116 with self.assertRaises(BadRequest):
117 self.project_creator.create()
119 def test_create_project(self):
121 Tests the creation of an OpenStack project.
123 self.project_creator = OpenStackProject(self.os_creds,
124 self.project_settings)
125 created_project = self.project_creator.create()
126 self.assertIsNotNone(created_project)
128 retrieved_project = keystone_utils.get_project(
129 keystone=self.keystone, project_settings=self.project_settings)
130 self.assertIsNotNone(retrieved_project)
131 self.assertEqual(created_project, retrieved_project)
132 self.assertTrue(validate_project(self.keystone, self.project_settings,
135 def test_create_project_2x(self):
137 Tests the creation of an OpenStack project twice to ensure it only
140 self.project_creator = OpenStackProject(self.os_creds,
141 self.project_settings)
142 created_project = self.project_creator.create()
143 self.assertIsNotNone(created_project)
145 retrieved_project = keystone_utils.get_project(
146 keystone=self.keystone, project_settings=self.project_settings)
147 self.assertIsNotNone(retrieved_project)
148 self.assertEqual(created_project, retrieved_project)
150 project2 = OpenStackProject(self.os_creds,
151 self.project_settings).create()
152 self.assertEqual(retrieved_project, project2)
153 self.assertTrue(validate_project(self.keystone, self.project_settings,
156 def test_create_delete_project(self):
158 Tests the creation of an OpenStack project, it's deletion, then cleanup
161 self.project_creator = OpenStackProject(self.os_creds,
162 self.project_settings)
163 created_project = self.project_creator.create()
164 self.assertIsNotNone(created_project)
166 keystone_utils.delete_project(self.keystone, created_project)
168 self.project_creator.clean()
170 self.assertIsNone(self.project_creator.get_project())
172 self.assertTrue(validate_project(self.keystone, self.project_settings,
175 def test_update_quotas(self):
177 Tests the creation of an OpenStack project where the quotas get
180 self.project_creator = OpenStackProject(self.os_creds,
181 self.project_settings)
182 created_project = self.project_creator.create()
183 self.assertIsNotNone(created_project)
185 retrieved_project = keystone_utils.get_project(
186 keystone=self.keystone, project_settings=self.project_settings)
187 self.assertIsNotNone(retrieved_project)
188 self.assertEqual(created_project, retrieved_project)
189 self.assertTrue(validate_project(self.keystone, self.project_settings,
192 update_compute_quotas = ComputeQuotas(
193 **{'metadata_items': 64, 'cores': 5, 'instances': 5,
194 'injected_files': 3, 'injected_file_content_bytes': 5120,
195 'ram': 25600, 'fixed_ips': 100, 'key_pairs': 50})
196 self.project_creator.update_compute_quotas(update_compute_quotas)
198 update_network_quotas = NetworkQuotas(
199 **{'security_group': 5, 'security_group_rule': 50,
200 'floatingip': 25, 'network': 5, 'port': 25, 'router': 6,
202 self.project_creator.update_network_quotas(update_network_quotas)
204 self.assertEqual(update_compute_quotas,
205 self.project_creator.get_compute_quotas())
206 self.assertEqual(update_network_quotas,
207 self.project_creator.get_network_quotas())
209 nova = nova_utils.nova_client(self.os_creds)
210 new_compute_quotas = nova_utils.get_compute_quotas(
211 nova, self.project_creator.get_project().id)
212 self.assertEqual(update_compute_quotas, new_compute_quotas)
214 neutron = neutron_utils.neutron_client(self.os_creds)
215 new_network_quotas = neutron_utils.get_network_quotas(
216 neutron, self.project_creator.get_project().id)
217 self.assertEqual(update_network_quotas, new_network_quotas)
220 class CreateProjectUserTests(OSComponentTestCase):
222 Test for the CreateImage class defined in create_image.py
227 Instantiates the CreateImage object that is responsible for downloading
228 and creating an OS image file within OpenStack
230 guid = str(uuid.uuid4())[:-19]
231 self.guid = self.__class__.__name__ + '-' + guid
232 self.project_settings = ProjectSettings(
233 name=self.guid + '-name',
234 domain=self.os_creds.project_domain_name)
236 self.keystone = keystone_utils.keystone_client(self.os_creds)
238 # Initialize for cleanup
239 self.project_creator = None
240 self.user_creators = list()
242 self.sec_grp_creators = list()
246 Cleans the image and downloaded image file
248 for sec_grp_creator in self.sec_grp_creators:
249 sec_grp_creator.clean()
251 for user_creator in self.user_creators:
254 if self.project_creator:
255 self.project_creator.clean()
257 def test_create_project_sec_grp_one_user(self):
259 Tests the creation of an OpenStack object to a project with a new users
260 and to create a security group
262 self.project_creator = OpenStackProject(self.os_creds,
263 self.project_settings)
264 created_project = self.project_creator.create()
265 self.assertIsNotNone(created_project)
267 user_creator = OpenStackUser(
268 self.os_creds, UserSettings(
269 name=self.guid + '-user',
270 password=self.guid, roles={'admin': self.project_settings.name},
271 domain_name=self.os_creds.user_domain_name))
272 self.project_creator.assoc_user(user_creator.create())
273 self.user_creators.append(user_creator)
275 sec_grp_os_creds = user_creator.get_os_creds(
276 self.project_creator.get_project().name)
277 sec_grp_creator = OpenStackSecurityGroup(
278 sec_grp_os_creds, SecurityGroupSettings(name=self.guid + '-name',
279 description='hello group'))
280 sec_grp = sec_grp_creator.create()
281 self.assertIsNotNone(sec_grp)
282 self.sec_grp_creators.append(sec_grp_creator)
284 self.assertEqual(self.project_creator.get_project().id,
287 def test_create_project_sec_grp_two_users(self):
289 Tests the creation of an OpenStack object to a project with two new
290 users and use each user to create a security group
292 self.project_creator = OpenStackProject(self.os_creds,
293 self.project_settings)
294 created_project = self.project_creator.create()
295 self.assertIsNotNone(created_project)
297 user_creator_1 = OpenStackUser(
298 self.os_creds, UserSettings(
299 name=self.guid + '-user1', password=self.guid,
300 roles={'admin': self.project_settings.name},
301 domain_name=self.os_creds.user_domain_name))
302 self.project_creator.assoc_user(user_creator_1.create())
303 self.user_creators.append(user_creator_1)
305 user_creator_2 = OpenStackUser(
306 self.os_creds, UserSettings(
307 name=self.guid + '-user2', password=self.guid,
308 roles={'admin': self.project_settings.name},
309 domain_name=self.os_creds.user_domain_name))
310 self.project_creator.assoc_user(user_creator_2.create())
311 self.user_creators.append(user_creator_2)
314 for user_creator in self.user_creators:
316 sec_grp_os_creds = user_creator.get_os_creds(
317 self.project_creator.get_project().name)
319 sec_grp_creator = OpenStackSecurityGroup(
321 SecurityGroupSettings(name=self.guid + '-name',
322 description='hello group'))
323 sec_grp = sec_grp_creator.create()
324 self.assertIsNotNone(sec_grp)
325 self.sec_grp_creators.append(sec_grp_creator)
327 self.assertEqual(self.project_creator.get_project().id,
331 def validate_project(keystone, project_settings, project):
333 Validates that the project_settings used to create the project have been
335 :param keystone: the keystone client for version checking
336 :param project_settings: the settings used to create the project
337 :param project: the SNAPS-OO Project domain object
340 if keystone.version == keystone_utils.V2_VERSION_STR:
341 return project_settings.name == project.name
343 domain = keystone_utils.get_domain_by_id(keystone, project.domain_id)
344 return (project_settings.name == project.name and
345 project_settings.domain_name == domain.name)