blob: 5ec9720c1b0cb948eb3edc7f9ce1d5c431aaabb4 [file] [log] [blame]
Joe H. Rahmefe75f932015-03-19 11:30:05 +01001#!/usr/bin/env python
2#
3# Licensed under the Apache License, Version 2.0 (the "License"); you may
4# not use this file except in compliance with the License. You may obtain
5# a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12# License for the specific language governing permissions and limitations
13# under the License.
14
15import mock
16from oslotest import mockpatch
Joe H. Rahmefe75f932015-03-19 11:30:05 +010017
18from tempest.cmd import javelin
Andrea Frittoli (andreaf)db9672e2016-02-23 14:07:24 -050019from tempest.lib import exceptions as lib_exc
Matthew Treinishffad78a2016-04-16 14:39:52 -040020from tempest.tests import base
Joe H. Rahmefe75f932015-03-19 11:30:05 +010021
22
23class JavelinUnitTest(base.TestCase):
24
25 def setUp(self):
26 super(JavelinUnitTest, self).setUp()
Joe H. Rahme9aefd792016-01-05 17:16:02 +010027 javelin.LOG = mock.MagicMock()
Joe H. Rahmefe75f932015-03-19 11:30:05 +010028 self.fake_client = mock.MagicMock()
29 self.fake_object = mock.MagicMock()
30
Joe H. Rahmeb8658f42015-05-22 14:39:37 +020031 def test_load_resources(self):
32 with mock.patch('six.moves.builtins.open', mock.mock_open(),
33 create=True) as open_mock:
34 with mock.patch('yaml.load', mock.MagicMock(),
35 create=True) as load_mock:
36 javelin.load_resources(self.fake_object)
37 load_mock.assert_called_once_with(open_mock(self.fake_object))
38
39 def test_keystone_admin(self):
40 self.useFixture(mockpatch.PatchObject(javelin, "OSClient"))
41 javelin.OPTS = self.fake_object
42 javelin.keystone_admin()
43 javelin.OSClient.assert_called_once_with(
44 self.fake_object.os_username,
45 self.fake_object.os_password,
46 self.fake_object.os_tenant_name)
47
48 def test_client_for_user(self):
49 fake_user = mock.MagicMock()
50 javelin.USERS = {fake_user['name']: fake_user}
51 self.useFixture(mockpatch.PatchObject(javelin, "OSClient"))
52 javelin.client_for_user(fake_user['name'])
53 javelin.OSClient.assert_called_once_with(
54 fake_user['name'], fake_user['pass'], fake_user['tenant'])
55
56 def test_client_for_non_existing_user(self):
57 fake_non_existing_user = self.fake_object
58 fake_user = mock.MagicMock()
59 javelin.USERS = {fake_user['name']: fake_user}
60 self.useFixture(mockpatch.PatchObject(javelin, "OSClient"))
61 javelin.client_for_user(fake_non_existing_user['name'])
62 self.assertFalse(javelin.OSClient.called)
63
Joe H. Rahme5a4da642015-06-09 17:24:12 +020064 def test_attach_volumes(self):
65 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
66 return_value=self.fake_client))
67
68 self.useFixture(mockpatch.PatchObject(
69 javelin, "_get_volume_by_name",
70 return_value=self.fake_object.volume))
71
72 self.useFixture(mockpatch.PatchObject(
73 javelin, "_get_server_by_name",
74 return_value=self.fake_object.server))
75
76 javelin.attach_volumes([self.fake_object])
77
78 mocked_function = self.fake_client.volumes.attach_volume
79 mocked_function.assert_called_once_with(
80 self.fake_object.volume['id'],
Ghanshyam8fc0ed22015-12-18 10:25:14 +090081 instance_uuid=self.fake_object.server['id'],
82 mountpoint=self.fake_object['device'])
Joe H. Rahme5a4da642015-06-09 17:24:12 +020083
Joe H. Rahmefe75f932015-03-19 11:30:05 +010084
85class TestCreateResources(JavelinUnitTest):
86 def test_create_tenants(self):
87
Daniel Melladob04da902015-11-20 17:43:12 +010088 self.fake_client.tenants.list_tenants.return_value = {'tenants': []}
Joe H. Rahmefe75f932015-03-19 11:30:05 +010089 self.useFixture(mockpatch.PatchObject(javelin, "keystone_admin",
90 return_value=self.fake_client))
91
92 javelin.create_tenants([self.fake_object['name']])
93
Daniel Melladob04da902015-11-20 17:43:12 +010094 mocked_function = self.fake_client.tenants.create_tenant
ghanshyam7668fad2016-06-15 18:17:39 +090095 mocked_function.assert_called_once_with(name=self.fake_object['name'])
Joe H. Rahmefe75f932015-03-19 11:30:05 +010096
97 def test_create_duplicate_tenant(self):
Daniel Melladob04da902015-11-20 17:43:12 +010098 self.fake_client.tenants.list_tenants.return_value = {'tenants': [
John Warrenacf00512015-08-06 16:13:58 -040099 {'name': self.fake_object['name']}]}
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100100 self.useFixture(mockpatch.PatchObject(javelin, "keystone_admin",
101 return_value=self.fake_client))
102
103 javelin.create_tenants([self.fake_object['name']])
104
Daniel Melladob04da902015-11-20 17:43:12 +0100105 mocked_function = self.fake_client.tenants.create_tenant
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100106 self.assertFalse(mocked_function.called)
107
108 def test_create_users(self):
Ken'ichi Ohmichi6ea3f982015-11-09 12:41:13 +0000109 self.useFixture(mockpatch.Patch(
110 'tempest.common.identity.get_tenant_by_name',
111 return_value=self.fake_object['tenant']))
Ken'ichi Ohmichid9fed312015-11-09 13:05:32 +0000112 self.useFixture(mockpatch.Patch(
113 'tempest.common.identity.get_user_by_username',
114 side_effect=lib_exc.NotFound("user is not found")))
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100115 self.useFixture(mockpatch.PatchObject(javelin, "keystone_admin",
116 return_value=self.fake_client))
117
118 javelin.create_users([self.fake_object])
119
120 fake_tenant_id = self.fake_object['tenant']['id']
121 fake_email = "%s@%s" % (self.fake_object['user'], fake_tenant_id)
Daniel Mellado82c83a52015-12-09 15:16:49 +0000122 mocked_function = self.fake_client.users.create_user
ghanshyame1c6c1c2016-06-15 14:50:41 +0900123 mocked_function.assert_called_once_with(
124 name=self.fake_object['name'],
125 password=self.fake_object['password'],
126 tenantId=fake_tenant_id,
127 email=fake_email,
128 enabled=True)
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100129
130 def test_create_user_missing_tenant(self):
Ken'ichi Ohmichi6ea3f982015-11-09 12:41:13 +0000131 self.useFixture(mockpatch.Patch(
132 'tempest.common.identity.get_tenant_by_name',
133 side_effect=lib_exc.NotFound("tenant is not found")))
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100134 self.useFixture(mockpatch.PatchObject(javelin, "keystone_admin",
135 return_value=self.fake_client))
136
137 javelin.create_users([self.fake_object])
138
Daniel Mellado82c83a52015-12-09 15:16:49 +0000139 mocked_function = self.fake_client.users.create_user
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100140 self.assertFalse(mocked_function.called)
141
142 def test_create_objects(self):
143
144 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
145 return_value=self.fake_client))
146 self.useFixture(mockpatch.PatchObject(javelin, "_assign_swift_role"))
147 self.useFixture(mockpatch.PatchObject(javelin, "_file_contents",
148 return_value=self.fake_object.content))
149
150 javelin.create_objects([self.fake_object])
151
152 mocked_function = self.fake_client.containers.create_container
153 mocked_function.assert_called_once_with(self.fake_object['container'])
154 mocked_function = self.fake_client.objects.create_object
155 mocked_function.assert_called_once_with(self.fake_object['container'],
156 self.fake_object['name'],
157 self.fake_object.content)
158
159 def test_create_images(self):
160 self.fake_client.images.create_image.return_value = \
161 self.fake_object['body']
162
163 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
164 return_value=self.fake_client))
165 self.useFixture(mockpatch.PatchObject(javelin, "_get_image_by_name",
166 return_value=[]))
167 self.useFixture(mockpatch.PatchObject(javelin, "_resolve_image",
168 return_value=(None, None)))
169
170 with mock.patch('six.moves.builtins.open', mock.mock_open(),
171 create=True) as open_mock:
172 javelin.create_images([self.fake_object])
173
174 mocked_function = self.fake_client.images.create_image
175 mocked_function.assert_called_once_with(self.fake_object['name'],
176 self.fake_object['format'],
177 self.fake_object['format'])
178
Ken'ichi Ohmichi66494e92015-06-08 04:28:10 +0000179 mocked_function = self.fake_client.images.store_image_file
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100180 fake_image_id = self.fake_object['body'].get('id')
181 mocked_function.assert_called_once_with(fake_image_id, open_mock())
182
183 def test_create_networks(self):
184 self.fake_client.networks.list_networks.return_value = {
185 'networks': []}
186
187 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
188 return_value=self.fake_client))
189
190 javelin.create_networks([self.fake_object])
191
192 mocked_function = self.fake_client.networks.create_network
193 mocked_function.assert_called_once_with(name=self.fake_object['name'])
194
195 def test_create_subnet(self):
196
197 fake_network = self.fake_object['network']
198
199 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
200 return_value=self.fake_client))
201 self.useFixture(mockpatch.PatchObject(javelin, "_get_resource_by_name",
202 return_value=fake_network))
203
204 fake_netaddr = mock.MagicMock()
205 self.useFixture(mockpatch.PatchObject(javelin, "netaddr",
206 return_value=fake_netaddr))
207 fake_version = javelin.netaddr.IPNetwork().version
208
209 javelin.create_subnets([self.fake_object])
210
211 mocked_function = self.fake_client.networks.create_subnet
212 mocked_function.assert_called_once_with(network_id=fake_network['id'],
213 cidr=self.fake_object['range'],
214 name=self.fake_object['name'],
215 ip_version=fake_version)
216
Yaroslav Lobankoved3a35b2016-03-24 22:41:30 -0500217 @mock.patch("tempest.common.waiters.wait_for_volume_status")
218 def test_create_volumes(self, mock_wait_for_volume_status):
Joe H. Rahme5a4da642015-06-09 17:24:12 +0200219 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
220 return_value=self.fake_client))
221 self.useFixture(mockpatch.PatchObject(javelin, "_get_volume_by_name",
222 return_value=None))
223 self.fake_client.volumes.create_volume.return_value = \
224 self.fake_object.body
225
226 javelin.create_volumes([self.fake_object])
227
228 mocked_function = self.fake_client.volumes.create_volume
229 mocked_function.assert_called_once_with(
230 size=self.fake_object['gb'],
231 display_name=self.fake_object['name'])
Yaroslav Lobankoved3a35b2016-03-24 22:41:30 -0500232 mock_wait_for_volume_status.assert_called_once_with(
233 self.fake_client.volumes, self.fake_object.body['volume']['id'],
Joe H. Rahme5a4da642015-06-09 17:24:12 +0200234 'available')
235
Yaroslav Lobankoved3a35b2016-03-24 22:41:30 -0500236 @mock.patch("tempest.common.waiters.wait_for_volume_status")
237 def test_create_volume_existing(self, mock_wait_for_volume_status):
Joe H. Rahme5a4da642015-06-09 17:24:12 +0200238 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
239 return_value=self.fake_client))
240 self.useFixture(mockpatch.PatchObject(javelin, "_get_volume_by_name",
241 return_value=self.fake_object))
242 self.fake_client.volumes.create_volume.return_value = \
243 self.fake_object.body
244
245 javelin.create_volumes([self.fake_object])
246
247 mocked_function = self.fake_client.volumes.create_volume
248 self.assertFalse(mocked_function.called)
Yaroslav Lobankoved3a35b2016-03-24 22:41:30 -0500249 self.assertFalse(mock_wait_for_volume_status.called)
Joe H. Rahme5a4da642015-06-09 17:24:12 +0200250
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200251 def test_create_router(self):
252
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000253 self.fake_client.routers.list_routers.return_value = {'routers': []}
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200254 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
255 return_value=self.fake_client))
256
257 javelin.create_routers([self.fake_object])
258
259 mocked_function = self.fake_client.networks.create_router
Ken'ichi Ohmichi6665c972016-02-24 13:09:09 -0800260 mocked_function.assert_called_once_with(name=self.fake_object['name'])
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200261
262 def test_create_router_existing(self):
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000263 self.fake_client.routers.list_routers.return_value = {
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200264 'routers': [self.fake_object]}
265 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
266 return_value=self.fake_client))
267
268 javelin.create_routers([self.fake_object])
269
270 mocked_function = self.fake_client.networks.create_router
271 self.assertFalse(mocked_function.called)
272
273 def test_create_secgroup(self):
274 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
275 return_value=self.fake_client))
ghanshyamb610b772015-08-24 17:29:38 +0900276 self.fake_client.secgroups.list_security_groups.return_value = (
277 {'security_groups': []})
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200278 self.fake_client.secgroups.create_security_group.return_value = \
ghanshyamb610b772015-08-24 17:29:38 +0900279 {'security_group': {'id': self.fake_object['secgroup_id']}}
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200280
281 javelin.create_secgroups([self.fake_object])
282
283 mocked_function = self.fake_client.secgroups.create_security_group
284 mocked_function.assert_called_once_with(
Ken'ichi Ohmichi34563cc2015-07-21 00:53:17 +0000285 name=self.fake_object['name'],
286 description=self.fake_object['description'])
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200287
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100288
289class TestDestroyResources(JavelinUnitTest):
290
291 def test_destroy_tenants(self):
292
293 fake_tenant = self.fake_object['tenant']
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200294 fake_auth = self.fake_client
Ken'ichi Ohmichi6ea3f982015-11-09 12:41:13 +0000295 self.useFixture(mockpatch.Patch(
296 'tempest.common.identity.get_tenant_by_name',
297 return_value=fake_tenant))
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100298 self.useFixture(mockpatch.PatchObject(javelin, "keystone_admin",
299 return_value=fake_auth))
300 javelin.destroy_tenants([fake_tenant])
301
Daniel Melladob04da902015-11-20 17:43:12 +0100302 mocked_function = fake_auth.tenants.delete_tenant
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100303 mocked_function.assert_called_once_with(fake_tenant['id'])
304
305 def test_destroy_users(self):
306
307 fake_user = self.fake_object['user']
308 fake_tenant = self.fake_object['tenant']
309
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200310 fake_auth = self.fake_client
Daniel Melladob04da902015-11-20 17:43:12 +0100311 fake_auth.tenants.list_tenants.return_value = \
Ken'ichi Ohmichi6ea3f982015-11-09 12:41:13 +0000312 {'tenants': [fake_tenant]}
Daniel Mellado82c83a52015-12-09 15:16:49 +0000313 fake_auth.users.list_users.return_value = {'users': [fake_user]}
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100314
Ken'ichi Ohmichid9fed312015-11-09 13:05:32 +0000315 self.useFixture(mockpatch.Patch(
316 'tempest.common.identity.get_user_by_username',
317 return_value=fake_user))
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100318 self.useFixture(mockpatch.PatchObject(javelin, "keystone_admin",
319 return_value=fake_auth))
320
321 javelin.destroy_users([fake_user])
322
Daniel Mellado82c83a52015-12-09 15:16:49 +0000323 mocked_function = fake_auth.users.delete_user
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100324 mocked_function.assert_called_once_with(fake_user['id'])
325
326 def test_destroy_objects(self):
327
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200328 self.fake_client.objects.delete_object.return_value = \
329 {'status': "200"}, ""
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100330 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200331 return_value=self.fake_client))
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100332 javelin.destroy_objects([self.fake_object])
333
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200334 mocked_function = self.fake_client.objects.delete_object
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100335 mocked_function.asswert_called_once(self.fake_object['container'],
336 self.fake_object['name'])
337
338 def test_destroy_images(self):
339
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100340 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200341 return_value=self.fake_client))
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100342 self.useFixture(mockpatch.PatchObject(javelin, "_get_image_by_name",
343 return_value=self.fake_object['image']))
344
345 javelin.destroy_images([self.fake_object])
346
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200347 mocked_function = self.fake_client.images.delete_image
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100348 mocked_function.assert_called_once_with(
349 self.fake_object['image']['id'])
350
351 def test_destroy_networks(self):
352
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100353 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200354 return_value=self.fake_client))
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100355 self.useFixture(mockpatch.PatchObject(
356 javelin, "_get_resource_by_name",
357 return_value=self.fake_object['resource']))
358
359 javelin.destroy_networks([self.fake_object])
360
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200361 mocked_function = self.fake_client.networks.delete_network
Joe H. Rahmefe75f932015-03-19 11:30:05 +0100362 mocked_function.assert_called_once_with(
363 self.fake_object['resource']['id'])
Joe H. Rahme5a4da642015-06-09 17:24:12 +0200364
365 def test_destroy_volumes(self):
366 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
367 return_value=self.fake_client))
368
369 self.useFixture(mockpatch.PatchObject(
370 javelin, "_get_volume_by_name",
371 return_value=self.fake_object.volume))
372
373 javelin.destroy_volumes([self.fake_object])
374
375 mocked_function = self.fake_client.volumes.detach_volume
376 mocked_function.assert_called_once_with(self.fake_object.volume['id'])
377 mocked_function = self.fake_client.volumes.delete_volume
378 mocked_function.assert_called_once_with(self.fake_object.volume['id'])
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200379
380 def test_destroy_subnets(self):
381
382 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
383 return_value=self.fake_client))
384 fake_subnet_id = self.fake_object['subnet_id']
385 self.useFixture(mockpatch.PatchObject(javelin, "_get_resource_by_name",
386 return_value={
387 'id': fake_subnet_id}))
388
389 javelin.destroy_subnets([self.fake_object])
390
John Warren3961acd2015-10-02 14:38:53 -0400391 mocked_function = self.fake_client.subnets.delete_subnet
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200392 mocked_function.assert_called_once_with(fake_subnet_id)
393
394 def test_destroy_routers(self):
395 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
396 return_value=self.fake_client))
397
398 # this function is used on 2 different occasions in the code
399 def _fake_get_resource_by_name(*args):
400 if args[1] == "routers":
401 return {"id": self.fake_object['router_id']}
402 elif args[1] == "subnets":
403 return {"id": self.fake_object['subnet_id']}
404 javelin._get_resource_by_name = _fake_get_resource_by_name
405
406 javelin.destroy_routers([self.fake_object])
407
Ken'ichi Ohmichie35f4722015-12-22 04:57:11 +0000408 mocked_function = self.fake_client.routers.delete_router
Joe H. Rahme94fd9692015-05-22 16:55:25 +0200409 mocked_function.assert_called_once_with(
410 self.fake_object['router_id'])
411
412 def test_destroy_secgroup(self):
413 self.useFixture(mockpatch.PatchObject(javelin, "client_for_user",
414 return_value=self.fake_client))
415 fake_secgroup = {'id': self.fake_object['id']}
416 self.useFixture(mockpatch.PatchObject(javelin, "_get_resource_by_name",
417 return_value=fake_secgroup))
418
419 javelin.destroy_secgroups([self.fake_object])
420
421 mocked_function = self.fake_client.secgroups.delete_security_group
422 mocked_function.assert_called_once_with(self.fake_object['id'])