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)
52 self.assertEqual(list(), settings.users)
54 def test_config_with_name_only(self):
55 settings = ProjectSettings(**{'name': 'foo'})
56 self.assertEqual('foo', settings.name)
57 self.assertEqual('Default', settings.domain_name)
58 self.assertIsNone(settings.description)
59 self.assertTrue(settings.enabled)
60 self.assertEqual(list(), settings.users)
63 users = ['test1', 'test2']
64 settings = ProjectSettings(
65 name='foo', domain='bar', description='foobar', enabled=False,
67 self.assertEqual('foo', settings.name)
68 self.assertEqual('bar', settings.domain_name)
69 self.assertEqual('foobar', settings.description)
70 self.assertFalse(settings.enabled)
71 self.assertEqual(users, settings.users)
73 def test_config_all(self):
74 users = ['test1', 'test2']
75 settings = ProjectSettings(
76 **{'name': 'foo', 'domain': 'bar', 'description': 'foobar',
77 'enabled': False, 'users': users})
78 self.assertEqual('foo', settings.name)
79 self.assertEqual('bar', settings.domain_name)
80 self.assertEqual('foobar', settings.description)
81 self.assertFalse(settings.enabled)
82 self.assertEqual(users, settings.users)
85 class CreateProjectSuccessTests(OSComponentTestCase):
87 Test for the CreateImage class defined in create_image.py
92 Instantiates the CreateImage object that is responsible for downloading
93 and creating an OS image file within OpenStack
95 guid = str(uuid.uuid4())[:-19]
96 guid = self.__class__.__name__ + '-' + guid
97 self.project_settings = ProjectSettings(
99 domain=self.os_creds.project_domain_name)
101 self.keystone = keystone_utils.keystone_client(self.os_creds)
103 # Initialize for cleanup
104 self.project_creator = None
108 Cleans the image and downloaded image file
110 if self.project_creator:
111 self.project_creator.clean()
113 def test_create_project_bad_domain(self):
115 Tests the creation of an OpenStack project with an invalid domain
116 value. This test will not do anything with a keystone v2.0 client.
118 if self.keystone.version != keystone_utils.V2_VERSION_STR:
119 self.project_settings.domain_name = 'foo'
120 self.project_creator = OpenStackProject(self.os_creds,
121 self.project_settings)
123 with self.assertRaises(BadRequest):
124 self.project_creator.create()
126 def test_create_project(self):
128 Tests the creation of an OpenStack project.
130 self.project_creator = OpenStackProject(self.os_creds,
131 self.project_settings)
132 created_project = self.project_creator.create()
133 self.assertIsNotNone(created_project)
135 retrieved_project = keystone_utils.get_project(
136 keystone=self.keystone, project_settings=self.project_settings)
137 self.assertIsNotNone(retrieved_project)
138 self.assertEqual(created_project, retrieved_project)
139 self.assertTrue(validate_project(self.keystone, self.project_settings,
142 def test_create_project_2x(self):
144 Tests the creation of an OpenStack project twice to ensure it only
147 self.project_creator = OpenStackProject(self.os_creds,
148 self.project_settings)
149 created_project = self.project_creator.create()
150 self.assertIsNotNone(created_project)
152 retrieved_project = keystone_utils.get_project(
153 keystone=self.keystone, project_settings=self.project_settings)
154 self.assertIsNotNone(retrieved_project)
155 self.assertEqual(created_project, retrieved_project)
157 project2 = OpenStackProject(self.os_creds,
158 self.project_settings).create()
159 self.assertEqual(retrieved_project, project2)
160 self.assertTrue(validate_project(self.keystone, self.project_settings,
163 def test_create_delete_project(self):
165 Tests the creation of an OpenStack project, it's deletion, then cleanup
168 self.project_creator = OpenStackProject(self.os_creds,
169 self.project_settings)
170 created_project = self.project_creator.create()
171 self.assertIsNotNone(created_project)
173 keystone_utils.delete_project(self.keystone, created_project)
175 self.project_creator.clean()
177 self.assertIsNone(self.project_creator.get_project())
179 self.assertTrue(validate_project(self.keystone, self.project_settings,
182 def test_update_quotas(self):
184 Tests the creation of an OpenStack project where the quotas get
187 self.project_creator = OpenStackProject(self.os_creds,
188 self.project_settings)
189 created_project = self.project_creator.create()
190 self.assertIsNotNone(created_project)
192 retrieved_project = keystone_utils.get_project(
193 keystone=self.keystone, project_settings=self.project_settings)
194 self.assertIsNotNone(retrieved_project)
195 self.assertEqual(created_project, retrieved_project)
196 self.assertTrue(validate_project(self.keystone, self.project_settings,
199 update_compute_quotas = ComputeQuotas(
200 **{'metadata_items': 64, 'cores': 5, 'instances': 5,
201 'injected_files': 3, 'injected_file_content_bytes': 5120,
202 'ram': 25600, 'fixed_ips': 100, 'key_pairs': 50})
203 self.project_creator.update_compute_quotas(update_compute_quotas)
205 update_network_quotas = NetworkQuotas(
206 **{'security_group': 5, 'security_group_rule': 50,
207 'floatingip': 25, 'network': 5, 'port': 25, 'router': 6,
209 self.project_creator.update_network_quotas(update_network_quotas)
211 self.assertEqual(update_compute_quotas,
212 self.project_creator.get_compute_quotas())
213 self.assertEqual(update_network_quotas,
214 self.project_creator.get_network_quotas())
216 nova = nova_utils.nova_client(self.os_creds)
217 new_compute_quotas = nova_utils.get_compute_quotas(
218 nova, self.project_creator.get_project().id)
219 self.assertEqual(update_compute_quotas, new_compute_quotas)
221 neutron = neutron_utils.neutron_client(self.os_creds)
222 new_network_quotas = neutron_utils.get_network_quotas(
223 neutron, self.project_creator.get_project().id)
224 self.assertEqual(update_network_quotas, new_network_quotas)
227 class CreateProjectUserTests(OSComponentTestCase):
229 Test for the CreateImage class defined in create_image.py
234 Instantiates the CreateImage object that is responsible for downloading
235 and creating an OS image file within OpenStack
237 guid = str(uuid.uuid4())[:-19]
238 self.guid = self.__class__.__name__ + '-' + guid
239 self.project_settings = ProjectSettings(
240 name=self.guid + '-name',
241 domain=self.os_creds.project_domain_name)
243 self.keystone = keystone_utils.keystone_client(self.os_creds)
245 # Initialize for cleanup
246 self.project_creator = None
247 self.user_creators = list()
249 self.sec_grp_creators = list()
253 Cleans the image and downloaded image file
255 for sec_grp_creator in self.sec_grp_creators:
256 sec_grp_creator.clean()
258 for user_creator in self.user_creators:
261 if self.project_creator:
262 self.project_creator.clean()
264 def test_create_project_sec_grp_one_user(self):
266 Tests the creation of an OpenStack object to a project with a new users
267 and to create a security group
269 self.project_creator = OpenStackProject(self.os_creds,
270 self.project_settings)
271 created_project = self.project_creator.create()
272 self.assertIsNotNone(created_project)
274 user_creator = OpenStackUser(
275 self.os_creds, UserSettings(
276 name=self.guid + '-user',
277 password=self.guid, roles={'admin': self.project_settings.name},
278 domain_name=self.os_creds.user_domain_name))
279 self.project_creator.assoc_user(user_creator.create())
280 self.user_creators.append(user_creator)
282 sec_grp_os_creds = user_creator.get_os_creds(
283 self.project_creator.get_project().name)
284 sec_grp_creator = OpenStackSecurityGroup(
285 sec_grp_os_creds, SecurityGroupSettings(name=self.guid + '-name',
286 description='hello group'))
287 sec_grp = sec_grp_creator.create()
288 self.assertIsNotNone(sec_grp)
289 self.sec_grp_creators.append(sec_grp_creator)
291 self.assertEqual(self.project_creator.get_project().id,
294 def test_create_project_sec_grp_two_users(self):
296 Tests the creation of an OpenStack object to a project with two new
297 users and use each user to create a security group
299 self.project_creator = OpenStackProject(self.os_creds,
300 self.project_settings)
301 created_project = self.project_creator.create()
302 self.assertIsNotNone(created_project)
304 user_creator_1 = OpenStackUser(
305 self.os_creds, UserSettings(
306 name=self.guid + '-user1', password=self.guid,
307 roles={'admin': self.project_settings.name},
308 domain_name=self.os_creds.user_domain_name))
309 self.project_creator.assoc_user(user_creator_1.create())
310 self.user_creators.append(user_creator_1)
312 user_creator_2 = OpenStackUser(
313 self.os_creds, UserSettings(
314 name=self.guid + '-user2', password=self.guid,
315 roles={'admin': self.project_settings.name},
316 domain_name=self.os_creds.user_domain_name))
317 self.project_creator.assoc_user(user_creator_2.create())
318 self.user_creators.append(user_creator_2)
321 for user_creator in self.user_creators:
323 sec_grp_os_creds = user_creator.get_os_creds(
324 self.project_creator.get_project().name)
326 sec_grp_creator = OpenStackSecurityGroup(
328 SecurityGroupSettings(name=self.guid + '-name',
329 description='hello group'))
330 sec_grp = sec_grp_creator.create()
331 self.assertIsNotNone(sec_grp)
332 self.sec_grp_creators.append(sec_grp_creator)
334 self.assertEqual(self.project_creator.get_project().id,
338 def validate_project(keystone, project_settings, project):
340 Validates that the project_settings used to create the project have been
342 :param keystone: the keystone client for version checking
343 :param project_settings: the settings used to create the project
344 :param project: the SNAPS-OO Project domain object
347 if keystone.version == keystone_utils.V2_VERSION_STR:
348 return project_settings.name == project.name
350 domain = keystone_utils.get_domain_by_id(keystone, project.domain_id)
351 return (project_settings.name == project.name and
352 project_settings.domain_name == domain.name)