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.config.security_group import SecurityGroupConfig
21 from snaps.config.user import UserConfig
22 from snaps.config.project import ProjectConfigError, ProjectConfig
23 from snaps.domain.project import ComputeQuotas, NetworkQuotas
24 from snaps.openstack.create_project import (
25 OpenStackProject, ProjectSettings)
26 from snaps.openstack.create_security_group import OpenStackSecurityGroup
27 from snaps.openstack.create_user import OpenStackUser
28 from snaps.openstack.tests.os_source_file_test import OSComponentTestCase
29 from snaps.openstack.utils import keystone_utils, nova_utils, neutron_utils
31 __author__ = 'spisarski'
34 class ProjectSettingsUnitTests(unittest.TestCase):
36 Tests the construction of the ProjectSettings class
39 def test_no_params(self):
40 with self.assertRaises(ProjectConfigError):
43 def test_empty_config(self):
44 with self.assertRaises(ProjectConfigError):
45 ProjectSettings(**dict())
47 def test_name_only(self):
48 settings = ProjectSettings(name='foo')
49 self.assertEqual('foo', settings.name)
50 self.assertEqual('Default', settings.domain_name)
51 self.assertIsNone(settings.description)
52 self.assertTrue(settings.enabled)
53 self.assertEqual(list(), settings.users)
55 def test_config_with_name_only(self):
56 settings = ProjectSettings(**{'name': 'foo'})
57 self.assertEqual('foo', settings.name)
58 self.assertEqual('Default', settings.domain_name)
59 self.assertIsNone(settings.description)
60 self.assertTrue(settings.enabled)
61 self.assertEqual(list(), settings.users)
64 users = ['test1', 'test2']
65 settings = ProjectSettings(
66 name='foo', domain='bar', description='foobar', enabled=False,
68 self.assertEqual('foo', settings.name)
69 self.assertEqual('bar', settings.domain_name)
70 self.assertEqual('foobar', settings.description)
71 self.assertFalse(settings.enabled)
72 self.assertEqual(users, settings.users)
74 def test_config_all(self):
75 users = ['test1', 'test2']
76 settings = ProjectSettings(
77 **{'name': 'foo', 'domain': 'bar', 'description': 'foobar',
78 'enabled': False, 'users': users})
79 self.assertEqual('foo', settings.name)
80 self.assertEqual('bar', settings.domain_name)
81 self.assertEqual('foobar', settings.description)
82 self.assertFalse(settings.enabled)
83 self.assertEqual(users, settings.users)
86 class CreateProjectSuccessTests(OSComponentTestCase):
88 Test for the CreateImage class defined in create_image.py
93 Instantiates the CreateImage object that is responsible for downloading
94 and creating an OS image file within OpenStack
96 guid = str(uuid.uuid4())[:-19]
97 guid = self.__class__.__name__ + '-' + guid
98 self.project_settings = ProjectConfig(
100 domain=self.os_creds.project_domain_name)
102 self.keystone = keystone_utils.keystone_client(
103 self.os_creds, self.os_session)
105 # Initialize for cleanup
106 self.project_creator = None
110 Cleans the image and downloaded image file
112 if self.project_creator:
113 self.project_creator.clean()
115 super(self.__class__, self).__clean__()
117 def test_create_project_bad_domain(self):
119 Tests the creation of an OpenStack project with an invalid domain
120 value. This test will not do anything with a keystone v2.0 client.
122 if self.keystone.version != keystone_utils.V2_VERSION_STR:
123 self.project_settings.domain_name = 'foo'
124 self.project_creator = OpenStackProject(self.os_creds,
125 self.project_settings)
127 with self.assertRaises(BadRequest):
128 self.project_creator.create()
130 def test_create_project(self):
132 Tests the creation of an OpenStack project.
134 self.project_creator = OpenStackProject(self.os_creds,
135 self.project_settings)
136 created_project = self.project_creator.create()
137 self.assertIsNotNone(created_project)
139 retrieved_project = keystone_utils.get_project(
140 keystone=self.keystone, project_settings=self.project_settings)
141 self.assertIsNotNone(retrieved_project)
142 self.assertEqual(created_project, retrieved_project)
143 self.assertTrue(validate_project(self.keystone, self.project_settings,
146 def test_create_project_quota_override(self):
148 Tests the creation of an OpenStack project with new quotas.
151 'cores': 4, 'instances': 5, 'injected_files': 6,
152 'injected_file_content_bytes': 60000, 'ram': 70000, 'fixed_ips': 7,
154 self.project_settings.quotas = quotas
155 self.project_creator = OpenStackProject(self.os_creds,
156 self.project_settings)
157 created_project = self.project_creator.create()
158 self.assertIsNotNone(created_project)
160 retrieved_project = keystone_utils.get_project(
161 keystone=self.keystone, project_settings=self.project_settings)
162 self.assertIsNotNone(retrieved_project)
163 self.assertEqual(created_project, retrieved_project)
164 self.assertTrue(validate_project(self.keystone, self.project_settings,
167 nova = nova_utils.nova_client(self.os_creds, self.os_session)
168 new_quotas = nova_utils.get_compute_quotas(nova, created_project.id)
170 self.assertEqual(4, new_quotas.cores)
171 self.assertEqual(5, new_quotas.instances)
172 self.assertEqual(6, new_quotas.injected_files)
173 self.assertEqual(60000, new_quotas.injected_file_content_bytes)
174 self.assertEqual(70000, new_quotas.ram)
175 self.assertEqual(7, new_quotas.fixed_ips)
176 self.assertEqual(8, new_quotas.key_pairs)
178 def test_create_project_2x(self):
180 Tests the creation of an OpenStack project twice to ensure it only
183 self.project_creator = OpenStackProject(self.os_creds,
184 self.project_settings)
185 created_project = self.project_creator.create()
186 self.assertIsNotNone(created_project)
188 retrieved_project = keystone_utils.get_project(
189 keystone=self.keystone, project_settings=self.project_settings)
190 self.assertIsNotNone(retrieved_project)
191 self.assertEqual(created_project, retrieved_project)
193 project2 = OpenStackProject(self.os_creds,
194 self.project_settings).create()
195 self.assertEqual(retrieved_project, project2)
196 self.assertTrue(validate_project(self.keystone, self.project_settings,
199 def test_create_delete_project(self):
201 Tests the creation of an OpenStack project, it's deletion, then cleanup
204 self.project_creator = OpenStackProject(self.os_creds,
205 self.project_settings)
206 created_project = self.project_creator.create()
207 self.assertIsNotNone(created_project)
209 keystone_utils.delete_project(self.keystone, created_project)
211 self.project_creator.clean()
213 self.assertIsNone(self.project_creator.get_project())
215 self.assertTrue(validate_project(self.keystone, self.project_settings,
218 def test_update_quotas(self):
220 Tests the creation of an OpenStack project where the quotas get
223 self.project_creator = OpenStackProject(self.os_creds,
224 self.project_settings)
225 created_project = self.project_creator.create()
226 self.assertIsNotNone(created_project)
228 retrieved_project = keystone_utils.get_project(
229 keystone=self.keystone, project_settings=self.project_settings)
230 self.assertIsNotNone(retrieved_project)
231 self.assertEqual(created_project, retrieved_project)
232 self.assertTrue(validate_project(self.keystone, self.project_settings,
235 update_compute_quotas = ComputeQuotas(
236 **{'metadata_items': 64, 'cores': 5, 'instances': 5,
237 'injected_files': 3, 'injected_file_content_bytes': 5120,
238 'ram': 25600, 'fixed_ips': 100, 'key_pairs': 50})
239 self.project_creator.update_compute_quotas(update_compute_quotas)
241 update_network_quotas = NetworkQuotas(
242 **{'security_group': 5, 'security_group_rule': 50,
243 'floatingip': 25, 'network': 5, 'port': 25, 'router': 6,
245 self.project_creator.update_network_quotas(update_network_quotas)
247 self.assertEqual(update_compute_quotas,
248 self.project_creator.get_compute_quotas())
249 self.assertEqual(update_network_quotas,
250 self.project_creator.get_network_quotas())
252 nova = nova_utils.nova_client(self.os_creds, self.os_session)
253 new_compute_quotas = nova_utils.get_compute_quotas(
254 nova, self.project_creator.get_project().id)
255 self.assertEqual(update_compute_quotas, new_compute_quotas)
257 neutron = neutron_utils.neutron_client(self.os_creds, self.os_session)
258 new_network_quotas = neutron_utils.get_network_quotas(
259 neutron, self.project_creator.get_project().id)
260 self.assertEqual(update_network_quotas, new_network_quotas)
263 class CreateProjectUserTests(OSComponentTestCase):
265 Test for the CreateImage class defined in create_image.py
270 Instantiates the CreateImage object that is responsible for downloading
271 and creating an OS image file within OpenStack
273 guid = str(uuid.uuid4())[:-19]
274 self.guid = self.__class__.__name__ + '-' + guid
275 self.project_settings = ProjectConfig(
276 name=self.guid + '-name',
277 domain=self.os_creds.project_domain_name)
279 self.keystone = keystone_utils.keystone_client(
280 self.os_creds, self.os_session)
282 # Initialize for cleanup
283 self.project_creator = None
284 self.user_creators = list()
286 self.sec_grp_creators = list()
290 Cleans the image and downloaded image file
292 for sec_grp_creator in self.sec_grp_creators:
293 sec_grp_creator.clean()
295 for user_creator in self.user_creators:
298 if self.project_creator:
299 self.project_creator.clean()
301 super(self.__class__, self).__clean__()
303 def test_create_project_sec_grp_one_user(self):
305 Tests the creation of an OpenStack object to a project with a new users
306 and to create a security group
308 self.project_creator = OpenStackProject(self.os_creds,
309 self.project_settings)
310 created_project = self.project_creator.create()
311 self.assertIsNotNone(created_project)
313 user_creator = OpenStackUser(
314 self.os_creds, UserConfig(
315 name=self.guid + '-user',
317 roles={'admin': self.project_settings.name},
318 domain_name=self.os_creds.user_domain_name))
319 self.project_creator.assoc_user(user_creator.create())
320 self.user_creators.append(user_creator)
322 sec_grp_os_creds = user_creator.get_os_creds(
323 self.project_creator.get_project().name)
324 sec_grp_creator = OpenStackSecurityGroup(
325 sec_grp_os_creds, SecurityGroupConfig(
326 name=self.guid + '-name', description='hello group'))
327 sec_grp = sec_grp_creator.create()
328 self.assertIsNotNone(sec_grp)
329 self.sec_grp_creators.append(sec_grp_creator)
331 self.assertEqual(self.project_creator.get_project().id,
334 def test_create_project_sec_grp_two_users(self):
336 Tests the creation of an OpenStack object to a project with two new
337 users and use each user to create a security group
339 self.project_creator = OpenStackProject(self.os_creds,
340 self.project_settings)
341 created_project = self.project_creator.create()
342 self.assertIsNotNone(created_project)
344 user_creator_1 = OpenStackUser(
345 self.os_creds, UserConfig(
346 name=self.guid + '-user1', password=self.guid,
347 roles={'admin': self.project_settings.name},
348 domain_name=self.os_creds.user_domain_name))
349 self.project_creator.assoc_user(user_creator_1.create())
350 self.user_creators.append(user_creator_1)
352 user_creator_2 = OpenStackUser(
353 self.os_creds, UserConfig(
354 name=self.guid + '-user2', password=self.guid,
355 roles={'admin': self.project_settings.name},
356 domain_name=self.os_creds.user_domain_name))
357 self.project_creator.assoc_user(user_creator_2.create())
358 self.user_creators.append(user_creator_2)
361 for user_creator in self.user_creators:
363 sec_grp_os_creds = user_creator.get_os_creds(
364 self.project_creator.get_project().name)
366 sec_grp_creator = OpenStackSecurityGroup(
369 name=self.guid + '-name', description='hello group'))
370 sec_grp = sec_grp_creator.create()
371 self.assertIsNotNone(sec_grp)
372 self.sec_grp_creators.append(sec_grp_creator)
374 self.assertEqual(self.project_creator.get_project().id,
378 def validate_project(keystone, project_settings, project):
380 Validates that the project_settings used to create the project have been
382 :param keystone: the keystone client for version checking
383 :param project_settings: the settings used to create the project
384 :param project: the SNAPS-OO Project domain object
387 if keystone.version == keystone_utils.V2_VERSION_STR:
388 return project_settings.name == project.name
390 domain = keystone_utils.get_domain_by_id(keystone, project.domain_id)
391 return (project_settings.name == project.name and
392 project_settings.domain_name == domain.name)