9d534676b05ba28c9c385a8e803f4af483765a12
[snaps.git] / snaps / openstack / tests / create_project_tests.py
1 # Copyright (c) 2016 Cable Television Laboratories, Inc. ("CableLabs")
2 #                    and others.  All rights reserved.
3 #
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:
7 #
8 #     http://www.apache.org/licenses/LICENSE-2.0
9 #
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.
15 import uuid
16 import unittest
17
18 from snaps.openstack.create_project import OpenStackProject, ProjectSettings
19 from snaps.openstack.create_security_group import OpenStackSecurityGroup
20 from snaps.openstack.create_security_group import SecurityGroupSettings
21 from snaps.openstack.create_user import OpenStackUser
22 from snaps.openstack.create_user import UserSettings
23 from snaps.openstack.tests.os_source_file_test import OSComponentTestCase
24 from snaps.openstack.utils import keystone_utils
25
26 __author__ = 'spisarski'
27
28
29 class ProjectSettingsUnitTests(unittest.TestCase):
30     """
31     Tests the construction of the ProjectSettings class
32     """
33
34     def test_no_params(self):
35         with self.assertRaises(Exception):
36             ProjectSettings()
37
38     def test_empty_config(self):
39         with self.assertRaises(Exception):
40             ProjectSettings(config=dict())
41
42     def test_name_only(self):
43         settings = ProjectSettings(name='foo')
44         self.assertEquals('foo', settings.name)
45         self.assertEquals('default', settings.domain)
46         self.assertIsNone(settings.description)
47         self.assertTrue(settings.enabled)
48
49     def test_config_with_name_only(self):
50         settings = ProjectSettings(config={'name': 'foo'})
51         self.assertEquals('foo', settings.name)
52         self.assertEquals('default', settings.domain)
53         self.assertIsNone(settings.description)
54         self.assertTrue(settings.enabled)
55
56     def test_all(self):
57         settings = ProjectSettings(name='foo', domain='bar', description='foobar', enabled=False)
58         self.assertEquals('foo', settings.name)
59         self.assertEquals('bar', settings.domain)
60         self.assertEquals('foobar', settings.description)
61         self.assertFalse(settings.enabled)
62
63     def test_config_all(self):
64         settings = ProjectSettings(config={'name': 'foo', 'domain': 'bar', 'description': 'foobar', 'enabled': False})
65         self.assertEquals('foo', settings.name)
66         self.assertEquals('bar', settings.domain)
67         self.assertEquals('foobar', settings.description)
68         self.assertFalse(settings.enabled)
69
70
71 class CreateProjectSuccessTests(OSComponentTestCase):
72     """
73     Test for the CreateImage class defined in create_image.py
74     """
75
76     def setUp(self):
77         """
78         Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
79         within OpenStack
80         """
81         guid = str(uuid.uuid4())[:-19]
82         guid = self.__class__.__name__ + '-' + guid
83         self.project_settings = ProjectSettings(name=guid + '-name')
84
85         self.keystone = keystone_utils.keystone_client(self.os_creds)
86
87         # Initialize for cleanup
88         self.project_creator = None
89
90     def tearDown(self):
91         """
92         Cleans the image and downloaded image file
93         """
94         if self.project_creator:
95             self.project_creator.clean()
96
97     def test_create_project(self):
98         """
99         Tests the creation of an OpenStack project.
100         """
101         self.project_creator = OpenStackProject(self.os_creds, self.project_settings)
102         created_project = self.project_creator.create()
103         self.assertIsNotNone(created_project)
104
105         retrieved_project = keystone_utils.get_project(keystone=self.keystone, project_name=self.project_settings.name)
106         self.assertIsNotNone(retrieved_project)
107         self.assertEquals(created_project, retrieved_project)
108
109     def test_create_project_2x(self):
110         """
111         Tests the creation of an OpenStack project twice to ensure it only creates one.
112         """
113         self.project_creator = OpenStackProject(self.os_creds, self.project_settings)
114         created_project = self.project_creator.create()
115         self.assertIsNotNone(created_project)
116
117         retrieved_project = keystone_utils.get_project(keystone=self.keystone, project_name=self.project_settings.name)
118         self.assertIsNotNone(retrieved_project)
119         self.assertEquals(created_project, retrieved_project)
120
121         project2 = OpenStackProject(self.os_creds, self.project_settings).create()
122         self.assertEquals(retrieved_project, project2)
123
124     def test_create_delete_project(self):
125         """
126         Tests the creation of an OpenStack project, it's deletion, then cleanup.
127         """
128         # Create Image
129         self.project_creator = OpenStackProject(self.os_creds, self.project_settings)
130         created_project = self.project_creator.create()
131         self.assertIsNotNone(created_project)
132
133         keystone_utils.delete_project(self.keystone, created_project)
134
135         self.project_creator.clean()
136
137         self.assertIsNone(self.project_creator.get_project())
138
139         # TODO - Expand tests
140
141
142 class CreateProjectUserTests(OSComponentTestCase):
143     """
144     Test for the CreateImage class defined in create_image.py
145     """
146
147     def setUp(self):
148         """
149         Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
150         within OpenStack
151         """
152         guid = str(uuid.uuid4())[:-19]
153         self.guid = self.__class__.__name__ + '-' + guid
154         self.project_settings = ProjectSettings(name=self.guid + '-name')
155
156         self.keystone = keystone_utils.keystone_client(self.os_creds)
157
158         # Initialize for cleanup
159         self.project_creator = None
160         self.user_creators = list()
161
162         self.sec_grp_creators = list()
163
164     def tearDown(self):
165         """
166         Cleans the image and downloaded image file
167         """
168         for sec_grp_creator in self.sec_grp_creators:
169             sec_grp_creator.clean()
170
171         for user_creator in self.user_creators:
172             user_creator.clean()
173
174         if self.project_creator:
175             self.project_creator.clean()
176
177     def test_create_project_sec_grp_one_user(self):
178         """
179         Tests the creation of an OpenStack object to a project with a new users and to create a security group
180         """
181         self.project_creator = OpenStackProject(self.os_creds, self.project_settings)
182         created_project = self.project_creator.create()
183         self.assertIsNotNone(created_project)
184
185         user_creator = OpenStackUser(self.os_creds, UserSettings(name=self.guid + '-user', password=self.guid))
186         self.project_creator.assoc_user(user_creator.create())
187         self.user_creators.append(user_creator)
188
189         sec_grp_os_creds = user_creator.get_os_creds(self.project_creator.get_project().name)
190         sec_grp_creator = OpenStackSecurityGroup(
191             sec_grp_os_creds, SecurityGroupSettings(name=self.guid + '-name', description='hello group'))
192         sec_grp = sec_grp_creator.create()
193         self.assertIsNotNone(sec_grp)
194         self.sec_grp_creators.append(sec_grp_creator)
195
196         if self.keystone.version == keystone_utils.V2_VERSION:
197             self.assertEquals(self.project_creator.get_project().id, sec_grp['security_group']['tenant_id'])
198         else:
199             self.assertEquals(self.project_creator.get_project().id, sec_grp['security_group']['project_id'])
200
201     def test_create_project_sec_grp_two_users(self):
202         """
203         Tests the creation of an OpenStack object to a project with two new users and use each user to create a
204         security group
205         """
206         self.project_creator = OpenStackProject(self.os_creds, self.project_settings)
207         created_project = self.project_creator.create()
208         self.assertIsNotNone(created_project)
209
210         user_creator_1 = OpenStackUser(self.os_creds, UserSettings(name=self.guid + '-user1', password=self.guid))
211         self.project_creator.assoc_user(user_creator_1.create())
212         self.user_creators.append(user_creator_1)
213
214         user_creator_2 = OpenStackUser(self.os_creds, UserSettings(name=self.guid + '-user2', password=self.guid))
215         self.project_creator.assoc_user(user_creator_2.create())
216         self.user_creators.append(user_creator_2)
217
218         ctr = 0
219         for user_creator in self.user_creators:
220             ctr += 1
221             sec_grp_os_creds = user_creator.get_os_creds(self.project_creator.get_project().name)
222
223             sec_grp_creator = OpenStackSecurityGroup(
224                 sec_grp_os_creds, SecurityGroupSettings(name=self.guid + '-name', description='hello group'))
225             sec_grp = sec_grp_creator.create()
226             self.assertIsNotNone(sec_grp)
227             self.sec_grp_creators.append(sec_grp_creator)
228             self.assertEquals(self.project_creator.get_project().id, sec_grp['security_group']['tenant_id'])