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(self.os_creds)
104 # Initialize for cleanup
105 self.project_creator = None
109 Cleans the image and downloaded image file
111 if self.project_creator:
112 self.project_creator.clean()
114 def test_create_project_bad_domain(self):
116 Tests the creation of an OpenStack project with an invalid domain
117 value. This test will not do anything with a keystone v2.0 client.
119 if self.keystone.version != keystone_utils.V2_VERSION_STR:
120 self.project_settings.domain_name = 'foo'
121 self.project_creator = OpenStackProject(self.os_creds,
122 self.project_settings)
124 with self.assertRaises(BadRequest):
125 self.project_creator.create()
127 def test_create_project(self):
129 Tests the creation of an OpenStack project.
131 self.project_creator = OpenStackProject(self.os_creds,
132 self.project_settings)
133 created_project = self.project_creator.create()
134 self.assertIsNotNone(created_project)
136 retrieved_project = keystone_utils.get_project(
137 keystone=self.keystone, project_settings=self.project_settings)
138 self.assertIsNotNone(retrieved_project)
139 self.assertEqual(created_project, retrieved_project)
140 self.assertTrue(validate_project(self.keystone, self.project_settings,
143 def test_create_project_2x(self):
145 Tests the creation of an OpenStack project twice to ensure it only
148 self.project_creator = OpenStackProject(self.os_creds,
149 self.project_settings)
150 created_project = self.project_creator.create()
151 self.assertIsNotNone(created_project)
153 retrieved_project = keystone_utils.get_project(
154 keystone=self.keystone, project_settings=self.project_settings)
155 self.assertIsNotNone(retrieved_project)
156 self.assertEqual(created_project, retrieved_project)
158 project2 = OpenStackProject(self.os_creds,
159 self.project_settings).create()
160 self.assertEqual(retrieved_project, project2)
161 self.assertTrue(validate_project(self.keystone, self.project_settings,
164 def test_create_delete_project(self):
166 Tests the creation of an OpenStack project, it's deletion, then cleanup
169 self.project_creator = OpenStackProject(self.os_creds,
170 self.project_settings)
171 created_project = self.project_creator.create()
172 self.assertIsNotNone(created_project)
174 keystone_utils.delete_project(self.keystone, created_project)
176 self.project_creator.clean()
178 self.assertIsNone(self.project_creator.get_project())
180 self.assertTrue(validate_project(self.keystone, self.project_settings,
183 def test_update_quotas(self):
185 Tests the creation of an OpenStack project where the quotas get
188 self.project_creator = OpenStackProject(self.os_creds,
189 self.project_settings)
190 created_project = self.project_creator.create()
191 self.assertIsNotNone(created_project)
193 retrieved_project = keystone_utils.get_project(
194 keystone=self.keystone, project_settings=self.project_settings)
195 self.assertIsNotNone(retrieved_project)
196 self.assertEqual(created_project, retrieved_project)
197 self.assertTrue(validate_project(self.keystone, self.project_settings,
200 update_compute_quotas = ComputeQuotas(
201 **{'metadata_items': 64, 'cores': 5, 'instances': 5,
202 'injected_files': 3, 'injected_file_content_bytes': 5120,
203 'ram': 25600, 'fixed_ips': 100, 'key_pairs': 50})
204 self.project_creator.update_compute_quotas(update_compute_quotas)
206 update_network_quotas = NetworkQuotas(
207 **{'security_group': 5, 'security_group_rule': 50,
208 'floatingip': 25, 'network': 5, 'port': 25, 'router': 6,
210 self.project_creator.update_network_quotas(update_network_quotas)
212 self.assertEqual(update_compute_quotas,
213 self.project_creator.get_compute_quotas())
214 self.assertEqual(update_network_quotas,
215 self.project_creator.get_network_quotas())
217 nova = nova_utils.nova_client(self.os_creds)
218 new_compute_quotas = nova_utils.get_compute_quotas(
219 nova, self.project_creator.get_project().id)
220 self.assertEqual(update_compute_quotas, new_compute_quotas)
222 neutron = neutron_utils.neutron_client(self.os_creds)
223 new_network_quotas = neutron_utils.get_network_quotas(
224 neutron, self.project_creator.get_project().id)
225 self.assertEqual(update_network_quotas, new_network_quotas)
228 class CreateProjectUserTests(OSComponentTestCase):
230 Test for the CreateImage class defined in create_image.py
235 Instantiates the CreateImage object that is responsible for downloading
236 and creating an OS image file within OpenStack
238 guid = str(uuid.uuid4())[:-19]
239 self.guid = self.__class__.__name__ + '-' + guid
240 self.project_settings = ProjectConfig(
241 name=self.guid + '-name',
242 domain=self.os_creds.project_domain_name)
244 self.keystone = keystone_utils.keystone_client(self.os_creds)
246 # Initialize for cleanup
247 self.project_creator = None
248 self.user_creators = list()
250 self.sec_grp_creators = list()
254 Cleans the image and downloaded image file
256 for sec_grp_creator in self.sec_grp_creators:
257 sec_grp_creator.clean()
259 for user_creator in self.user_creators:
262 if self.project_creator:
263 self.project_creator.clean()
265 def test_create_project_sec_grp_one_user(self):
267 Tests the creation of an OpenStack object to a project with a new users
268 and to create a security group
270 self.project_creator = OpenStackProject(self.os_creds,
271 self.project_settings)
272 created_project = self.project_creator.create()
273 self.assertIsNotNone(created_project)
275 user_creator = OpenStackUser(
276 self.os_creds, UserConfig(
277 name=self.guid + '-user',
279 roles={'admin': self.project_settings.name},
280 domain_name=self.os_creds.user_domain_name))
281 self.project_creator.assoc_user(user_creator.create())
282 self.user_creators.append(user_creator)
284 sec_grp_os_creds = user_creator.get_os_creds(
285 self.project_creator.get_project().name)
286 sec_grp_creator = OpenStackSecurityGroup(
287 sec_grp_os_creds, SecurityGroupConfig(
288 name=self.guid + '-name', description='hello group'))
289 sec_grp = sec_grp_creator.create()
290 self.assertIsNotNone(sec_grp)
291 self.sec_grp_creators.append(sec_grp_creator)
293 self.assertEqual(self.project_creator.get_project().id,
296 def test_create_project_sec_grp_two_users(self):
298 Tests the creation of an OpenStack object to a project with two new
299 users and use each user to create a security group
301 self.project_creator = OpenStackProject(self.os_creds,
302 self.project_settings)
303 created_project = self.project_creator.create()
304 self.assertIsNotNone(created_project)
306 user_creator_1 = OpenStackUser(
307 self.os_creds, UserConfig(
308 name=self.guid + '-user1', password=self.guid,
309 roles={'admin': self.project_settings.name},
310 domain_name=self.os_creds.user_domain_name))
311 self.project_creator.assoc_user(user_creator_1.create())
312 self.user_creators.append(user_creator_1)
314 user_creator_2 = OpenStackUser(
315 self.os_creds, UserConfig(
316 name=self.guid + '-user2', password=self.guid,
317 roles={'admin': self.project_settings.name},
318 domain_name=self.os_creds.user_domain_name))
319 self.project_creator.assoc_user(user_creator_2.create())
320 self.user_creators.append(user_creator_2)
323 for user_creator in self.user_creators:
325 sec_grp_os_creds = user_creator.get_os_creds(
326 self.project_creator.get_project().name)
328 sec_grp_creator = OpenStackSecurityGroup(
331 name=self.guid + '-name', description='hello group'))
332 sec_grp = sec_grp_creator.create()
333 self.assertIsNotNone(sec_grp)
334 self.sec_grp_creators.append(sec_grp_creator)
336 self.assertEqual(self.project_creator.get_project().id,
340 def validate_project(keystone, project_settings, project):
342 Validates that the project_settings used to create the project have been
344 :param keystone: the keystone client for version checking
345 :param project_settings: the settings used to create the project
346 :param project: the SNAPS-OO Project domain object
349 if keystone.version == keystone_utils.V2_VERSION_STR:
350 return project_settings.name == project.name
352 domain = keystone_utils.get_domain_by_id(keystone, project.domain_id)
353 return (project_settings.name == project.name and
354 project_settings.domain_name == domain.name)