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.openstack.create_project import (
21 OpenStackProject, ProjectSettings, ProjectSettingsError)
22 from snaps.openstack.create_security_group import OpenStackSecurityGroup
23 from snaps.openstack.create_security_group import SecurityGroupSettings
24 from snaps.openstack.create_user import OpenStackUser
25 from snaps.openstack.create_user import UserSettings
26 from snaps.openstack.tests.os_source_file_test import OSComponentTestCase
27 from snaps.openstack.utils import keystone_utils
29 __author__ = 'spisarski'
32 class ProjectSettingsUnitTests(unittest.TestCase):
34 Tests the construction of the ProjectSettings class
37 def test_no_params(self):
38 with self.assertRaises(ProjectSettingsError):
41 def test_empty_config(self):
42 with self.assertRaises(ProjectSettingsError):
43 ProjectSettings(**dict())
45 def test_name_only(self):
46 settings = ProjectSettings(name='foo')
47 self.assertEqual('foo', settings.name)
48 self.assertEqual('Default', settings.domain_name)
49 self.assertIsNone(settings.description)
50 self.assertTrue(settings.enabled)
52 def test_config_with_name_only(self):
53 settings = ProjectSettings(**{'name': 'foo'})
54 self.assertEqual('foo', settings.name)
55 self.assertEqual('Default', settings.domain_name)
56 self.assertIsNone(settings.description)
57 self.assertTrue(settings.enabled)
60 settings = ProjectSettings(name='foo', domain='bar',
61 description='foobar', enabled=False)
62 self.assertEqual('foo', settings.name)
63 self.assertEqual('bar', settings.domain_name)
64 self.assertEqual('foobar', settings.description)
65 self.assertFalse(settings.enabled)
67 def test_config_all(self):
68 settings = ProjectSettings(
69 **{'name': 'foo', 'domain': 'bar', 'description': 'foobar',
71 self.assertEqual('foo', settings.name)
72 self.assertEqual('bar', settings.domain_name)
73 self.assertEqual('foobar', settings.description)
74 self.assertFalse(settings.enabled)
77 class CreateProjectSuccessTests(OSComponentTestCase):
79 Test for the CreateImage class defined in create_image.py
84 Instantiates the CreateImage object that is responsible for downloading
85 and creating an OS image file within OpenStack
87 guid = str(uuid.uuid4())[:-19]
88 guid = self.__class__.__name__ + '-' + guid
89 self.project_settings = ProjectSettings(
91 domain=self.os_creds.project_domain_name)
93 self.keystone = keystone_utils.keystone_client(self.os_creds)
95 # Initialize for cleanup
96 self.project_creator = None
100 Cleans the image and downloaded image file
102 if self.project_creator:
103 self.project_creator.clean()
105 def test_create_project_bad_domain(self):
107 Tests the creation of an OpenStack project with an invalid domain
108 value. This test will not do anything with a keystone v2.0 client.
110 if self.keystone.version != keystone_utils.V2_VERSION_STR:
111 self.project_settings.domain_name = 'foo'
112 self.project_creator = OpenStackProject(self.os_creds,
113 self.project_settings)
115 with self.assertRaises(BadRequest):
116 self.project_creator.create()
118 def test_create_project(self):
120 Tests the creation of an OpenStack project.
122 self.project_creator = OpenStackProject(self.os_creds,
123 self.project_settings)
124 created_project = self.project_creator.create()
125 self.assertIsNotNone(created_project)
127 retrieved_project = keystone_utils.get_project(
128 keystone=self.keystone, project_settings=self.project_settings)
129 self.assertIsNotNone(retrieved_project)
130 self.assertEqual(created_project, retrieved_project)
131 self.assertTrue(validate_project(self.keystone, self.project_settings,
134 def test_create_project_2x(self):
136 Tests the creation of an OpenStack project twice to ensure it only
139 self.project_creator = OpenStackProject(self.os_creds,
140 self.project_settings)
141 created_project = self.project_creator.create()
142 self.assertIsNotNone(created_project)
144 retrieved_project = keystone_utils.get_project(
145 keystone=self.keystone, project_settings=self.project_settings)
146 self.assertIsNotNone(retrieved_project)
147 self.assertEqual(created_project, retrieved_project)
149 project2 = OpenStackProject(self.os_creds,
150 self.project_settings).create()
151 self.assertEqual(retrieved_project, project2)
152 self.assertTrue(validate_project(self.keystone, self.project_settings,
155 def test_create_delete_project(self):
157 Tests the creation of an OpenStack project, it's deletion, then cleanup
160 self.project_creator = OpenStackProject(self.os_creds,
161 self.project_settings)
162 created_project = self.project_creator.create()
163 self.assertIsNotNone(created_project)
165 keystone_utils.delete_project(self.keystone, created_project)
167 self.project_creator.clean()
169 self.assertIsNone(self.project_creator.get_project())
171 self.assertTrue(validate_project(self.keystone, self.project_settings,
175 class CreateProjectUserTests(OSComponentTestCase):
177 Test for the CreateImage class defined in create_image.py
182 Instantiates the CreateImage object that is responsible for downloading
183 and creating an OS image file within OpenStack
185 guid = str(uuid.uuid4())[:-19]
186 self.guid = self.__class__.__name__ + '-' + guid
187 self.project_settings = ProjectSettings(
188 name=self.guid + '-name',
189 domain=self.os_creds.project_domain_name)
191 self.keystone = keystone_utils.keystone_client(self.os_creds)
193 # Initialize for cleanup
194 self.project_creator = None
195 self.user_creators = list()
197 self.sec_grp_creators = list()
201 Cleans the image and downloaded image file
203 for sec_grp_creator in self.sec_grp_creators:
204 sec_grp_creator.clean()
206 for user_creator in self.user_creators:
209 if self.project_creator:
210 self.project_creator.clean()
212 def test_create_project_sec_grp_one_user(self):
214 Tests the creation of an OpenStack object to a project with a new users
215 and to create a security group
217 self.project_creator = OpenStackProject(self.os_creds,
218 self.project_settings)
219 created_project = self.project_creator.create()
220 self.assertIsNotNone(created_project)
222 user_creator = OpenStackUser(
223 self.os_creds, UserSettings(
224 name=self.guid + '-user',
225 password=self.guid, roles={'admin': 'admin'},
226 domain_name=self.os_creds.user_domain_name))
227 self.project_creator.assoc_user(user_creator.create())
228 self.user_creators.append(user_creator)
230 sec_grp_os_creds = user_creator.get_os_creds(
231 self.project_creator.get_project().name)
232 sec_grp_creator = OpenStackSecurityGroup(
233 sec_grp_os_creds, SecurityGroupSettings(name=self.guid + '-name',
234 description='hello group'))
235 sec_grp = sec_grp_creator.create()
236 self.assertIsNotNone(sec_grp)
237 self.sec_grp_creators.append(sec_grp_creator)
239 self.assertEqual(self.project_creator.get_project().id,
242 def test_create_project_sec_grp_two_users(self):
244 Tests the creation of an OpenStack object to a project with two new
245 users and use each user to create a security group
247 self.project_creator = OpenStackProject(self.os_creds,
248 self.project_settings)
249 created_project = self.project_creator.create()
250 self.assertIsNotNone(created_project)
252 user_creator_1 = OpenStackUser(
253 self.os_creds, UserSettings(
254 name=self.guid + '-user1', password=self.guid,
255 roles={'admin': 'admin'},
256 domain_name=self.os_creds.user_domain_name))
257 self.project_creator.assoc_user(user_creator_1.create())
258 self.user_creators.append(user_creator_1)
260 user_creator_2 = OpenStackUser(
261 self.os_creds, UserSettings(
262 name=self.guid + '-user2', password=self.guid,
263 roles={'admin': 'admin'},
264 domain_name=self.os_creds.user_domain_name))
265 self.project_creator.assoc_user(user_creator_2.create())
266 self.user_creators.append(user_creator_2)
269 for user_creator in self.user_creators:
271 sec_grp_os_creds = user_creator.get_os_creds(
272 self.project_creator.get_project().name)
274 sec_grp_creator = OpenStackSecurityGroup(
276 SecurityGroupSettings(name=self.guid + '-name',
277 description='hello group'))
278 sec_grp = sec_grp_creator.create()
279 self.assertIsNotNone(sec_grp)
280 self.sec_grp_creators.append(sec_grp_creator)
282 self.assertEqual(self.project_creator.get_project().id,
286 def validate_project(keystone, project_settings, project):
288 Validates that the project_settings used to create the project have been
290 :param keystone: the keystone client for version checking
291 :param project_settings: the settings used to create the project
292 :param project: the SNAPS-OO Project domain object
295 if keystone.version == keystone_utils.V2_VERSION_STR:
296 return project_settings.name == project.name
298 domain = keystone_utils.get_domain_by_id(keystone, project.domain_id)
299 return (project_settings.name == project.name and
300 project_settings.domain_name == domain.name)