blob: ae08d029d3f9a86d5811e78e7a04d01f84dec238 [file] [log] [blame]
nh202bc67bb192018-06-29 17:07:50 -07001# Copyright 2018 AT&T Corporation.
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# 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, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
16import fixtures
17
18from oslo_serialization import jsonutils as json
19from tempest import clients
20from tempest.cmd import cleanup_service
21from tempest import config
Martin Kopec97857942019-06-12 15:23:21 +000022from tempest.lib import exceptions
nh202bc67bb192018-06-29 17:07:50 -070023from tempest.tests import base
24from tempest.tests import fake_config
25from tempest.tests.lib import fake_credentials
26from tempest.tests.lib import fake_http
27
28
Martin Kopec470aca72019-02-18 00:05:13 +000029class TestBaseService(base.TestCase):
30
Martin Kopec97857942019-06-12 15:23:21 +000031 class TestException(cleanup_service.BaseService):
32 def delete(self):
33 raise exceptions.NotImplemented
34
35 def dry_run(self):
36 raise exceptions.NotImplemented
37
38 def save_state(self):
39 raise exceptions.NotImplemented
40
Martin Kopec470aca72019-02-18 00:05:13 +000041 def test_base_service_init(self):
42 kwargs = {'data': {'data': 'test'},
43 'is_dry_run': False,
44 'saved_state_json': {'saved': 'data'},
45 'is_preserve': False,
46 'is_save_state': True,
Martin Kopec97857942019-06-12 15:23:21 +000047 'tenant_id': 'project_id',
48 'got_exceptions': []}
Martin Kopec470aca72019-02-18 00:05:13 +000049 base = cleanup_service.BaseService(kwargs)
50 self.assertEqual(base.data, kwargs['data'])
51 self.assertFalse(base.is_dry_run)
52 self.assertEqual(base.saved_state_json, kwargs['saved_state_json'])
53 self.assertFalse(base.is_preserve)
54 self.assertTrue(base.is_save_state)
55 self.assertEqual(base.tenant_filter['project_id'], kwargs['tenant_id'])
Martin Kopec97857942019-06-12 15:23:21 +000056 self.assertEqual(base.got_exceptions, kwargs['got_exceptions'])
57
58 def test_not_implemented_ex(self):
59 kwargs = {'data': {'data': 'test'},
60 'is_dry_run': False,
61 'saved_state_json': {'saved': 'data'},
62 'is_preserve': False,
63 'is_save_state': False,
64 'tenant_id': 'project_id',
65 'got_exceptions': []}
66 base = self.TestException(kwargs)
67 # delete
68 base.run()
69 self.assertEqual(len(base.got_exceptions), 1)
70 # save_state
71 base.save_state = True
72 base.run()
73 self.assertEqual(len(base.got_exceptions), 2)
74 # dry_run
75 base.is_dry_run = True
76 base.run()
77 self.assertEqual(len(base.got_exceptions), 3)
Martin Kopec470aca72019-02-18 00:05:13 +000078
79
nh202bc67bb192018-06-29 17:07:50 -070080class MockFunctionsBase(base.TestCase):
81
82 def _create_response(self, body, status, headers):
83 if status:
84 if body:
85 body = json.dumps(body)
86 resp = fake_http.fake_http_response(headers, status=status), body
87 return resp
88 else:
89 return body
90
91 def _create_fixtures(self, fixtures_to_make):
92 mocked_fixtures = []
93 for fixture in fixtures_to_make:
94 func, body, status = fixture
95 mocked_response = self._create_response(body, status, None)
96 if mocked_response == 'error':
97 mocked_func = self.useFixture(fixtures.MockPatch(
98 func, side_effect=Exception("error")))
99 else:
100 mocked_func = self.useFixture(fixtures.MockPatch(
101 func, return_value=mocked_response))
102 mocked_fixtures.append(mocked_func)
103 return mocked_fixtures
104
105 def run_function_with_mocks(self, function_to_run, functions_to_mock):
106 """Mock a service client function for testing.
107
108 :param function_to_run: The service client function to call.
109 :param functions_to_mock: a list of tuples containing the function
110 to mock, the response body, and the response status.
111 EX:
112 ('tempest.lib.common.rest_client.RestClient.get',
113 {'users': ['']},
114 200)
115 """
116 mocked_fixtures = self._create_fixtures(functions_to_mock)
117 func_return = function_to_run()
118 return func_return, mocked_fixtures
119
120
121class BaseCmdServiceTests(MockFunctionsBase):
122
123 def setUp(self):
124 super(BaseCmdServiceTests, self).setUp()
125 self.useFixture(fake_config.ConfigFixture())
126 self.patchobject(config, 'TempestConfigPrivate',
127 fake_config.FakePrivate)
128 self.useFixture(fixtures.MockPatch(
129 'tempest.cmd.cleanup_service._get_network_id',
130 return_value=''))
131 cleanup_service.init_conf()
132 self.conf_values = {"flavors": cleanup_service.CONF_FLAVORS[0],
133 "images": cleanup_service.CONF_IMAGES[0],
134 "projects": cleanup_service.CONF_PROJECTS[0],
135 "users": cleanup_service.CONF_USERS[0],
Martin Kopec470aca72019-02-18 00:05:13 +0000136 "networks": cleanup_service.CONF_PUB_NETWORK,
137 "security_groups":
138 cleanup_service.CONF_PROJECTS[0],
139 "ports": cleanup_service.CONF_PUB_NETWORK,
140 "routers": cleanup_service.CONF_PUB_ROUTER,
Martin Kopece6819982019-02-18 12:34:52 +0000141 "subnetpools": cleanup_service.CONF_PROJECTS[0],
nh202bc67bb192018-06-29 17:07:50 -0700142 }
143
Martin Kopec470aca72019-02-18 00:05:13 +0000144 saved_state = {
145 # Static list to ensure global service saved items are not deleted
146 "users": {u'32rwef64245tgr20121qw324bgg': u'Lightning'},
147 "flavors": {u'42': u'm1.tiny'},
148 "images": {u'34yhwr-4t3q': u'stratus-0.3.2-x86_64-disk'},
149 "roles": {u'3efrt74r45hn': u'president'},
150 "projects": {u'f38ohgp93jj032': u'manhattan'},
151 "domains": {u'default': u'Default'},
152 # Static list to ensure project service saved items are not deleted
153 "snapshots": {u'1ad4c789-7e8w-4dwg-afc5': u'saved-snapshot'},
154 "servers": {u'7a6d4v7w-36ds-4216': u'saved-server'},
155 "server_groups": {u'as6d5f7g-46ca-475e': u'saved-server-group'},
156 "keypairs": {u'saved-key-pair': {
157 u'fingerprint': u'7e:eb:ab:24',
158 u'name': u'saved-key-pair'
159 }},
160 "volumes": {u'aa77asdf-1234': u'saved-volume'},
161 "networks": {u'6722fc13-4319': {
162 u'id': u'6722fc13-4319',
163 u'name': u'saved-network'
164 }},
165 "floatingips": {u'9e82d248-408a': {
166 u'id': u'9e82d248-408a',
167 u'status': u'ACTIVE'
168 }},
169 "routers": {u'4s5w34hj-id44': u'saved-router'},
170 "metering_label_rules": {u'93a973ce-4dc5': {
171 u'direction': u'ingress',
172 u'id': u'93a973ce-4dc5'
173 }},
174 "metering_labels": {u'723b346ce866-4c7q': u'saved-label'},
175 "ports": {u'aa74aa4v-741a': u'saved-port'},
176 "security_groups": {u'7q844add-3697': u'saved-sec-group'},
Martin Kopece6819982019-02-18 12:34:52 +0000177 "subnets": {u'55ttda4a-2584': u'saved-subnet'},
Lukas Piwowarski3b1311f2019-11-12 10:43:40 +0000178 "subnetpools": {u'8acf64c1-43fc': u'saved-subnet-pool'},
179 "regions": {u'RegionOne': {}}
Martin Kopec470aca72019-02-18 00:05:13 +0000180 }
nh202bc67bb192018-06-29 17:07:50 -0700181 # Mocked methods
182 get_method = 'tempest.lib.common.rest_client.RestClient.get'
183 delete_method = 'tempest.lib.common.rest_client.RestClient.delete'
184 log_method = 'tempest.cmd.cleanup_service.LOG.exception'
185 # Override parameters
186 service_class = 'BaseService'
187 response = None
188 service_name = 'default'
189
190 def _create_cmd_service(self, service_type, is_save_state=False,
191 is_preserve=False, is_dry_run=False):
192 creds = fake_credentials.FakeKeystoneV3Credentials()
193 os = clients.Manager(creds)
194 return getattr(cleanup_service, service_type)(
195 os,
196 is_save_state=is_save_state,
197 is_preserve=is_preserve,
198 is_dry_run=is_dry_run,
199 data={},
200 saved_state_json=self.saved_state
201 )
202
203 def _test_delete(self, mocked_fixture_tuple_list, fail=False):
204 serv = self._create_cmd_service(self.service_class)
205 resp, fixtures = self.run_function_with_mocks(
206 serv.run,
207 mocked_fixture_tuple_list,
208 )
209 for fixture in fixtures:
Martin Kopec470aca72019-02-18 00:05:13 +0000210 if fixture.mock.return_value == 'validate':
211 fixture.mock.assert_called()
212 elif fail is False and fixture.mock.return_value == 'exception':
nh202bc67bb192018-06-29 17:07:50 -0700213 fixture.mock.assert_not_called()
214 elif self.service_name in self.saved_state.keys():
215 fixture.mock.assert_called_once()
216 for key in self.saved_state[self.service_name].keys():
217 self.assertNotIn(key, fixture.mock.call_args[0][0])
218 else:
219 fixture.mock.assert_called_once()
220 self.assertFalse(serv.data)
221
222 def _test_dry_run_true(self, mocked_fixture_tuple_list):
223 serv = self._create_cmd_service(self.service_class, is_dry_run=True)
224 _, fixtures = self.run_function_with_mocks(
225 serv.run,
226 mocked_fixture_tuple_list
227 )
228 for fixture in fixtures:
229 if fixture.mock.return_value == 'delete':
230 fixture.mock.assert_not_called()
231 elif self.service_name in self.saved_state.keys():
232 fixture.mock.assert_called_once()
233 for key in self.saved_state[self.service_name].keys():
234 self.assertNotIn(key, fixture.mock.call_args[0][0])
235 else:
236 fixture.mock.assert_called_once()
237
238 def _test_saved_state_true(self, mocked_fixture_tuple_list):
239 serv = self._create_cmd_service(self.service_class, is_save_state=True)
240 _, fixtures = self.run_function_with_mocks(
241 serv.run,
242 mocked_fixture_tuple_list
243 )
244 for item in self.response[self.service_name]:
245 self.assertIn(item['id'],
246 serv.data[self.service_name])
247 for fixture in fixtures:
248 fixture.mock.assert_called_once()
249
250 def _test_is_preserve_true(self, mocked_fixture_tuple_list):
251 serv = self._create_cmd_service(self.service_class, is_preserve=True)
252 resp, fixtures = self.run_function_with_mocks(
253 serv.list,
254 mocked_fixture_tuple_list
255 )
256 for fixture in fixtures:
257 fixture.mock.assert_called_once()
258 self.assertIn(resp[0], self.response[self.service_name])
259 for rsp in resp:
260 self.assertNotIn(rsp['id'], self.conf_values.values())
261 self.assertNotIn(rsp['name'], self.conf_values.values())
262
263
Martin Kopec470aca72019-02-18 00:05:13 +0000264class TestSnapshotService(BaseCmdServiceTests):
265
266 service_class = 'SnapshotService'
267 service_name = 'snapshots'
268 response = {
269 "snapshots": [
270 {
271 "status": "available",
272 "metadata": {
273 "name": "test"
274 },
275 "name": "test-volume-snapshot",
276 "user_id": "40c2102f4a554b848d96b14f3eec39ed",
277 "volume_id": "173f7b48-c4c1-4e70-9acc-086b39073506",
278 "created_at": "2015-11-29T02:25:51.000000",
279 "size": 1,
280 "updated_at": "2015-11-20T05:36:40.000000",
281 "os-extended-snapshot-attributes:progress": "100%",
282 "id": "b1323cda-8e4b-41c1-afc5-2fc791809c8c",
283 "description": "volume snapshot"
284 },
285 {
286 "status": "available",
287 "name": "saved-snapshot",
288 "id": "1ad4c789-7e8w-4dwg-afc5",
289 "description": "snapshot in saved state"
290 }
291 ]
292 }
293
294 def test_delete_fail(self):
295 delete_mock = [(self.get_method, self.response, 200),
296 (self.delete_method, 'error', None),
297 (self.log_method, 'exception', None)]
298 self._test_delete(delete_mock, fail=True)
299
300 def test_delete_pass(self):
301 delete_mock = [(self.get_method, self.response, 200),
302 (self.delete_method, None, 202),
303 (self.log_method, 'exception', None)]
304 self._test_delete(delete_mock)
305
306 def test_dry_run(self):
307 dry_mock = [(self.get_method, self.response, 200),
308 (self.delete_method, "delete", None)]
309 self._test_dry_run_true(dry_mock)
310
311 def test_save_state(self):
312 self._test_saved_state_true([(self.get_method, self.response, 200)])
313
314
315class TestServerService(BaseCmdServiceTests):
316
317 service_class = 'ServerService'
318 service_name = 'servers'
319 response = {
320 "servers": [
321 {
322 "id": "22c91117-08de-4894-9aa9-6ef382400985",
323 "links": [
324 {
325 "href": "http://openstack.example.com/v2/6f70-6ef0985",
326 "rel": "self"
327 },
328 {
329 "href": "http://openstack.example.com/6f70656e7-6ef35",
330 "rel": "bookmark"
331 }
332 ],
333 "name": "new-server-test"
334 },
335 {
336 "id": "7a6d4v7w-36ds-4216",
337 "links": [
338 {
339 "href": "http://openstack.example.com/v2/6f70-6ef0985",
340 "rel": "self"
341 },
342 {
343 "href": "http://openstack.example.com/6f70656e7-6ef35",
344 "rel": "bookmark"
345 }
346 ],
347 "name": "saved-server"
348 }
349 ]
350 }
351
352 def test_delete_fail(self):
353 delete_mock = [(self.get_method, self.response, 200),
354 (self.delete_method, 'error', None),
355 (self.log_method, 'exception', None)]
356 self._test_delete(delete_mock, fail=True)
357
358 def test_delete_pass(self):
359 delete_mock = [(self.get_method, self.response, 200),
360 (self.delete_method, None, 204),
361 (self.log_method, 'exception', None)]
362 self._test_delete(delete_mock)
363
364 def test_dry_run(self):
365 dry_mock = [(self.get_method, self.response, 200),
366 (self.delete_method, "delete", None)]
367 self._test_dry_run_true(dry_mock)
368
369 def test_save_state(self):
370 self._test_saved_state_true([(self.get_method, self.response, 200)])
371
372
373class TestServerGroupService(BaseCmdServiceTests):
374
375 service_class = 'ServerGroupService'
376 service_name = 'server_groups'
377 validate_response = ('tempest.lib.services.compute.server_groups_client'
378 '.ServerGroupsClient.validate_response')
379
380 response = {
381 "server_groups": [
382 {
383 "id": "616fb98f-46ca-475e-917e-2563e5a8cd19",
384 "name": "test",
385 "policy": "anti-affinity",
386 "rules": {"max_server_per_host": 3},
387 "members": [],
388 "project_id": "6f70656e737461636b20342065766572",
389 "user_id": "fake"
390 },
391 {
392 "id": "as6d5f7g-46ca-475e",
393 "name": "saved-server-group"
394 }
395 ]
396 }
397
398 def test_delete_fail(self):
399 delete_mock = [(self.get_method, self.response, 200),
400 (self.validate_response, 'validate', None),
401 (self.delete_method, 'error', None),
402 (self.log_method, 'exception', None)]
403 self._test_delete(delete_mock, fail=True)
404
405 def test_delete_pass(self):
406 delete_mock = [(self.get_method, self.response, 200),
407 (self.validate_response, 'validate', None),
408 (self.delete_method, None, 204),
409 (self.log_method, 'exception', None)]
410 self._test_delete(delete_mock)
411
412 def test_dry_run(self):
413 dry_mock = [(self.get_method, self.response, 200),
414 (self.validate_response, 'validate', None),
415 (self.delete_method, "delete", None)]
416 self._test_dry_run_true(dry_mock)
417
418 def test_save_state(self):
419 self._test_saved_state_true([(self.get_method, self.response, 200),
420 (self.validate_response, 'validate', None)
421 ])
422
423
424class TestKeyPairService(BaseCmdServiceTests):
425
426 service_class = 'KeyPairService'
427 service_name = 'keypairs'
428 validate_response = ('tempest.lib.services.compute.keypairs_client'
429 '.KeyPairsClient.validate_response')
430 response = {
431 "keypairs": [
432 {
433 "keypair": {
434 "fingerprint": "7e:eb:ab:24:ba:d1:e1:88:ae:9a:fb:66:53:bd",
435 "name": "keypair-5d935425-31d5-48a7-a0f1-e76e9813f2c3",
436 "type": "ssh",
437 "public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCkF\n"
438 }
439 },
440 {
441 "keypair": {
442 "fingerprint": "7e:eb:ab:24",
443 "name": "saved-key-pair"
444 }
445 }
446 ]
447 }
448
449 def _test_saved_state_true(self, mocked_fixture_tuple_list):
450 serv = self._create_cmd_service(self.service_class, is_save_state=True)
451 _, fixtures = self.run_function_with_mocks(
452 serv.run,
453 mocked_fixture_tuple_list
454 )
455 for item in self.response[self.service_name]:
456 self.assertTrue(item['keypair']['name'],
457 serv.data[self.service_name])
458 for fixture in fixtures:
459 fixture.mock.assert_called_once()
460
461 def test_delete_fail(self):
462 delete_mock = [(self.get_method, self.response, 200),
463 (self.validate_response, 'validate', None),
464 (self.delete_method, 'error', None),
465 (self.log_method, 'exception', None)]
466 self._test_delete(delete_mock, fail=True)
467
468 def test_delete_pass(self):
469 delete_mock = [(self.get_method, self.response, 200),
470 (self.validate_response, 'validate', None),
471 (self.delete_method, None, 204),
472 (self.log_method, 'exception', None)]
473 self._test_delete(delete_mock)
474
475 def test_dry_run(self):
476 dry_mock = [(self.get_method, self.response, 200),
477 (self.validate_response, 'validate', None),
478 (self.delete_method, "delete", None)]
479 self._test_dry_run_true(dry_mock)
480
481 def test_save_state(self):
482 self._test_saved_state_true([
483 (self.get_method, self.response, 200),
484 (self.validate_response, 'validate', None)
485 ])
486
487
488class TestVolumeService(BaseCmdServiceTests):
489
490 service_class = 'VolumeService'
491 service_name = 'volumes'
492 response = {
493 "volumes": [
494 {
495 "id": "efa54464-8fab-47cd-a05a-be3e6b396188",
496 "links": [
497 {
498 "href": "http://127.0.0.1:37097/v3/89af/volumes/efa54",
499 "rel": "self"
500 },
501 {
502 "href": "http://127.0.0.1:37097/89af/volumes/efa54464",
503 "rel": "bookmark"
504 }
505 ],
506 "name": "volume-name"
507 },
508 {
509 "id": "aa77asdf-1234",
510 "name": "saved-volume"
511 }
512 ]
513 }
514
515 def test_delete_fail(self):
516 delete_mock = [(self.get_method, self.response, 200),
517 (self.delete_method, 'error', None),
518 (self.log_method, 'exception', None)]
519 self._test_delete(delete_mock, fail=True)
520
521 def test_delete_pass(self):
522 delete_mock = [(self.get_method, self.response, 200),
523 (self.delete_method, None, 202),
524 (self.log_method, 'exception', None)]
525 self._test_delete(delete_mock)
526
527 def test_dry_run(self):
528 dry_mock = [(self.get_method, self.response, 200),
529 (self.delete_method, "delete", None)]
530 self._test_dry_run_true(dry_mock)
531
532 def test_save_state(self):
533 self._test_saved_state_true([(self.get_method, self.response, 200)])
534
535
536# Begin network service classes
537class TestNetworkService(BaseCmdServiceTests):
538
539 service_class = 'NetworkService'
540 service_name = 'networks'
541 response = {
542 "networks": [
543 {
544 "admin_state_up": True,
545 "availability_zone_hints": [],
546 "availability_zones": [
547 "nova"
548 ],
549 "created_at": "2016-03-08T20:19:41",
550 "dns_domain": "my-domain.org.",
551 "id": "d32019d3-bc6e-4319-9c1d-6722fc136a22",
552 "l2_adjacency": False,
553 "mtu": 1500,
554 "name": "net1",
555 "port_security_enabled": True,
556 "project_id": "4fd44f30292945e481c7b8a0c8908869",
557 "qos_policy_id": "6a8454ade84346f59e8d40665f878b2e",
558 "revision_number": 1,
559 "router:external": False,
560 "shared": False,
561 "status": "ACTIVE",
562 "subnets": [
563 "54d6f61d-db07-451c-9ab3-b9609b6b6f0b"
564 ],
565 "tenant_id": "4fd44f30292945e481c7b8a0c8908869",
566 "updated_at": "2016-03-08T20:19:41",
567 "vlan_transparent": True,
568 "description": "",
569 "is_default": False
570 },
571 {
572 "id": "6722fc13-4319",
573 "name": "saved-network"
574 }
575 ]
576 }
577
578 def test_delete_fail(self):
579 delete_mock = [(self.get_method, self.response, 200),
580 (self.delete_method, 'error', None),
581 (self.log_method, 'exception', None)]
582 self._test_delete(delete_mock, fail=True)
583
584 def test_delete_pass(self):
585 delete_mock = [(self.get_method, self.response, 200),
586 (self.delete_method, None, 204),
587 (self.log_method, 'exception', None)]
588 self._test_delete(delete_mock)
589
590 def test_dry_run(self):
591 dry_mock = [(self.get_method, self.response, 200),
592 (self.delete_method, "delete", None)]
593 self._test_dry_run_true(dry_mock)
594
595 def test_save_state(self):
596 self._test_saved_state_true([(self.get_method, self.response, 200)])
597
598 def test_preserve_list(self):
599 self.response['networks'].append(
600 {
601 "admin_state_up": True,
602 "availability_zone_hints": [],
603 "availability_zones": [
604 "nova"
605 ],
606 "created_at": "2017-03-08T20:19:41",
607 "dns_domain": "my-domain.org.",
608 "id": cleanup_service.CONF_PUB_NETWORK,
609 "name": "net2",
610 "port_security_enabled": True,
611 "project_id": "4fd44f30292945e481c7b8a0c8908869",
612 "qos_policy_id": "6a8454ade84346f59e8d40665f878b2e",
613 "revision_number": 1,
614 "status": "ACTIVE",
615 "subnets": [
616 "54d6f61d-db07-451c-9ab3-b9609b6b6f0b"
617 ],
618 "tenant_id": "4fd44f30292945e481c7b8a0c8908869",
619 "updated_at": "2018-03-08T20:19:41",
620 "vlan_transparent": True,
621 "is_default": False
622 })
623 self._test_is_preserve_true([(self.get_method, self.response, 200)])
624
625
626class TestNetworkFloatingIpService(BaseCmdServiceTests):
627
628 service_class = 'NetworkFloatingIpService'
629 service_name = 'floatingips'
630 response = {
631 "floatingips": [
632 {
633 "router_id": "d23abc8d-2991-4a55-ba98-2aaea84cc72f",
634 "description": "for test",
635 "dns_domain": "my-domain.org.",
636 "dns_name": "myfip",
637 "created_at": "2016-12-21T10:55:50Z",
638 "updated_at": "2016-12-21T10:55:53Z",
639 "revision_number": 1,
640 "project_id": "4969c491a3c74ee4af974e6d800c62de",
641 "tenant_id": "4969c491a3c74ee4af974e6d800c62de",
642 "floating_network_id": "376da547-b977-4cfe-9cba-275c80debf57",
643 "fixed_ip_address": "10.0.0.3",
644 "floating_ip_address": "172.24.4.228",
645 "port_id": "ce705c24-c1ef-408a-bda3-7bbd946164ab",
646 "id": "2f245a7b-796b-4f26-9cf9-9e82d248fda7",
647 "status": "ACTIVE",
648 "port_details": {
649 "status": "ACTIVE",
650 "name": "",
651 "admin_state_up": True,
652 "network_id": "02dd8479-ef26-4398-a102-d19d0a7b3a1f",
653 "device_owner": "compute:nova",
654 "mac_address": "fa:16:3e:b1:3b:30",
655 "device_id": "8e3941b4-a6e9-499f-a1ac-2a4662025cba"
656 },
657 "tags": ["tag1,tag2"],
658 "port_forwardings": []
659 },
660 {
661 "id": "9e82d248-408a",
662 "status": "ACTIVE"
663 }
664 ]
665 }
666
667 def test_delete_fail(self):
668 delete_mock = [(self.get_method, self.response, 200),
669 (self.delete_method, 'error', None),
670 (self.log_method, 'exception', None)]
671 self._test_delete(delete_mock, fail=True)
672
673 def test_delete_pass(self):
674 delete_mock = [(self.get_method, self.response, 200),
675 (self.delete_method, None, 204),
676 (self.log_method, 'exception', None)]
677 self._test_delete(delete_mock)
678
679 def test_dry_run(self):
680 dry_mock = [(self.get_method, self.response, 200),
681 (self.delete_method, "delete", None)]
682 self._test_dry_run_true(dry_mock)
683
684 def test_save_state(self):
685 self._test_saved_state_true([(self.get_method, self.response, 200)])
686
687
688class TestNetworkRouterService(BaseCmdServiceTests):
689
690 service_class = 'NetworkRouterService'
691 service_name = 'routers'
692 validate_response = ('tempest.lib.services.network.routers_client'
693 '.RoutersClient.validate_response')
694 response = {
695 "routers": [
696 {
697 "admin_state_up": True,
698 "availability_zone_hints": [],
699 "availability_zones": [
700 "nova"
701 ],
702 "created_at": "2018-03-19T19:17:04Z",
703 "description": "",
704 "distributed": False,
705 "external_gateway_info": {
706 "enable_snat": True,
707 "external_fixed_ips": [
708 {
709 "ip_address": "172.24.4.3",
710 "subnet_id": "b930d7f6-ceb7-40a0-8b81-a425dd994ccf"
711 },
712 {
713 "ip_address": "2001:db8::c",
714 "subnet_id": "0c56df5d-ace5-46c8-8f4c-45fa4e334d18"
715 }
716 ],
717 "network_id": "ae34051f-aa6c-4c75-abf5-50dc9ac99ef3"
718 },
719 "flavor_id": "f7b14d9a-b0dc-4fbe-bb14-a0f4970a69e0",
720 "ha": False,
721 "id": "915a14a6-867b-4af7-83d1-70efceb146f9",
722 "name": "router2",
723 "revision_number": 1,
724 "routes": [
725 {
726 "destination": "179.24.1.0/24",
727 "nexthop": "172.24.3.99"
728 }
729 ],
730 "status": "ACTIVE",
731 "updated_at": "2018-03-19T19:17:22Z",
732 "project_id": "0bd18306d801447bb457a46252d82d13",
733 "tenant_id": "0bd18306d801447bb457a46252d82d13",
734 "tags": ["tag1,tag2"]
735 },
736 {
737 "id": "4s5w34hj-id44",
738 "name": "saved-router"
739 }
740 ],
741 # "ports" key is added to the response in order to simplify unit
742 # testing - it's because NetworkRouterService's delete method lists
743 # ports before deleting any router
744 "ports": []
745 }
746
747 def _test_delete(self, mocked_fixture_tuple_list, fail=False):
748 serv = self._create_cmd_service(self.service_class)
749 resp, fixtures = self.run_function_with_mocks(
750 serv.run,
751 mocked_fixture_tuple_list,
752 )
753 for fixture in fixtures:
754 if fail is False and fixture.mock.return_value == 'exception':
755 fixture.mock.assert_not_called()
756 elif self.service_name in self.saved_state.keys():
757 fixture.mock.assert_called()
758 for key in self.saved_state[self.service_name].keys():
759 self.assertNotIn(key, fixture.mock.call_args[0][0])
760 self.assertFalse(serv.data)
761
762 def test_delete_fail(self):
763 delete_mock = [(self.get_method, self.response, 200),
764 (self.delete_method, 'error', None),
765 (self.log_method, 'exception', None)]
766 self._test_delete(delete_mock, fail=True)
767
768 def test_delete_pass(self):
769 delete_mock = [(self.get_method, self.response, 200),
770 (self.delete_method, None, 204),
771 (self.log_method, 'exception', None)]
772 self._test_delete(delete_mock)
773
774 def test_dry_run(self):
775 dry_mock = [(self.get_method, self.response, 200),
776 (self.delete_method, "delete", None)]
777 self._test_dry_run_true(dry_mock)
778
779 def test_save_state(self):
780 self._test_saved_state_true([(self.get_method, self.response, 200)])
781
782 def test_preserve_list(self):
783 self.response['routers'].append(
784 {
785 "admin_state_up": True,
786 "availability_zone_hints": [],
787 "availability_zones": [
788 "nova"
789 ],
790 "created_at": "2018-03-19T19:17:04Z",
791 "id": cleanup_service.CONF_PUB_ROUTER,
792 "name": "router-preserve",
793 "status": "ACTIVE",
794 "updated_at": "2018-03-19T19:17:22Z",
795 "project_id": "0bd18306d801447bb457a46252d82d13",
796 "tenant_id": "0bd18306d801447bb457a46252d82d13",
797 "tags": ["tag1,tag2"]
798 })
799 self._test_is_preserve_true([(self.get_method, self.response, 200)])
800
801
802class TestNetworkMeteringLabelRuleService(BaseCmdServiceTests):
803
804 service_class = 'NetworkMeteringLabelRuleService'
805 service_name = 'metering_label_rules'
806 response = {
807 "metering_label_rules": [
808 {
809 "remote_ip_prefix": "20.0.0.0/24",
810 "direction": "ingress",
811 "metering_label_id": "e131d186-b02d-4c0b-83d5-0c0725c4f812",
812 "id": "9536641a-7d14-4dc5-afaf-93a973ce0eb8",
813 "excluded": False
814 },
815 {
816 "direction": "ingress",
817 "id": "93a973ce-4dc5"
818 }
819 ]
820 }
821
822 def test_delete_fail(self):
823 delete_mock = [(self.get_method, self.response, 200),
824 (self.delete_method, 'error', None),
825 (self.log_method, 'exception', None)]
826 self._test_delete(delete_mock, fail=True)
827
828 def test_delete_pass(self):
829 delete_mock = [(self.get_method, self.response, 200),
830 (self.delete_method, None, 204),
831 (self.log_method, 'exception', None)]
832 self._test_delete(delete_mock)
833
834 def test_dry_run(self):
835 dry_mock = [(self.get_method, self.response, 200),
836 (self.delete_method, "delete", None)]
837 self._test_dry_run_true(dry_mock)
838
839 def test_save_state(self):
840 self._test_saved_state_true([(self.get_method, self.response, 200)])
841
842
843class TestNetworkMeteringLabelService(BaseCmdServiceTests):
844
845 service_class = 'NetworkMeteringLabelService'
846 service_name = 'metering_labels'
847 response = {
848 "metering_labels": [
849 {
850 "project_id": "45345b0ee1ea477fac0f541b2cb79cd4",
851 "tenant_id": "45345b0ee1ea477fac0f541b2cb79cd4",
852 "description": "label1 description",
853 "name": "label1",
854 "id": "a6700594-5b7a-4105-8bfe-723b346ce866",
855 "shared": False
856 },
857 {
858 "name": "saved-label",
859 "id": "723b346ce866-4c7q",
860 }
861 ]
862 }
863
864 def test_delete_fail(self):
865 delete_mock = [(self.get_method, self.response, 200),
866 (self.delete_method, 'error', None),
867 (self.log_method, 'exception', None)]
868 self._test_delete(delete_mock, fail=True)
869
870 def test_delete_pass(self):
871 delete_mock = [(self.get_method, self.response, 200),
872 (self.delete_method, None, 204),
873 (self.log_method, 'exception', None)]
874 self._test_delete(delete_mock)
875
876 def test_dry_run(self):
877 dry_mock = [(self.get_method, self.response, 200),
878 (self.delete_method, "delete", None)]
879 self._test_dry_run_true(dry_mock)
880
881 def test_save_state(self):
882 self._test_saved_state_true([(self.get_method, self.response, 200)])
883
884
885class TestNetworkPortService(BaseCmdServiceTests):
886
887 service_class = 'NetworkPortService'
888 service_name = 'ports'
889 response = {
890 "ports": [
891 {
892 "admin_state_up": True,
893 "allowed_address_pairs": [],
894 "created_at": "2016-03-08T20:19:41",
895 "description": "",
896 "device_id": "9ae135f4-b6e0-4dad-9e91-3c223e385824",
897 "device_owner": "",
898 "dns_assignment": {
899 "hostname": "myport",
900 "ip_address": "172.24.4.2",
901 "fqdn": "myport.my-domain.org"
902 },
903 "dns_domain": "my-domain.org.",
904 "dns_name": "myport",
905 "extra_dhcp_opts": [
906 {
907 "opt_value": "pxelinux.0",
908 "ip_version": 4,
909 "opt_name": "bootfile-name"
910 }
911 ],
912 "fixed_ips": [
913 {
914 "ip_address": "172.24.4.2",
915 "subnet_id": "008ba151-0b8c-4a67-98b5-0d2b87666062"
916 }
917 ],
918 "id": "d80b1a3b-4fc1-49f3-952e-1e2ab7081d8b",
919 "ip_allocation": "immediate",
920 "mac_address": "fa:16:3e:58:42:ed",
921 "name": "test_port",
922 "network_id": "70c1db1f-b701-45bd-96e0-a313ee3430b3",
923 "project_id": "",
924 "revision_number": 1,
925 "security_groups": [],
926 "status": "ACTIVE",
927 "tags": ["tag1,tag2"],
928 "tenant_id": "",
929 "updated_at": "2016-03-08T20:19:41",
930 "qos_policy_id": "29d5e02e-d5ab-4929-bee4-4a9fc12e22ae",
931 "port_security_enabled": False
932 },
933 {
934 "id": "aa74aa4v-741a",
935 "name": "saved-port",
936 "device_owner": ""
937 }
938 ]
939 }
940
941 def test_delete_fail(self):
942 delete_mock = [(self.get_method, self.response, 200),
943 (self.delete_method, 'error', None),
944 (self.log_method, 'exception', None)]
945 self._test_delete(delete_mock, fail=True)
946
947 def test_delete_pass(self):
948 delete_mock = [(self.get_method, self.response, 200),
949 (self.delete_method, None, 204),
950 (self.log_method, 'exception', None)]
951 self._test_delete(delete_mock)
952
953 def test_dry_run(self):
954 dry_mock = [(self.get_method, self.response, 200),
955 (self.delete_method, "delete", None)]
956 self._test_dry_run_true(dry_mock)
957
958 def test_save_state(self):
959 self._test_saved_state_true([(self.get_method, self.response, 200)])
960
961 def test_preserve_list(self):
962 self.response['ports'].append(
963 {
964 "created_at": "2018-03-08T20:19:41",
965 "description": "",
966 "device_id": "9ae135f4-b6e0-4dad-9e91-3c223e385824",
967 "device_owner": "compute:router_gateway",
968 "id": "d80b1a3b-4fc1-49f3-952e-1fdy1ws542",
969 "ip_allocation": "immediate",
970 "mac_address": "fa:16:3e:58:42:ed",
971 "name": "preserve_port",
972 "network_id": cleanup_service.CONF_PUB_NETWORK,
973 "project_id": "",
974 "security_groups": [],
975 "status": "ACTIVE",
976 "tags": ["tag1,tag2"],
977 "tenant_id": "",
978 "updated_at": "2018-03-08T20:19:41",
979 })
980 self._test_is_preserve_true([(self.get_method, self.response, 200)])
981
982
983class TestNetworkSecGroupService(BaseCmdServiceTests):
984
985 service_class = 'NetworkSecGroupService'
986 service_name = 'security_groups'
987 response = {
988 "security_groups": [
989 {
990 "description": "default",
991 "id": "85cc3048-abc3-43cc-89b3-377341426ac5",
992 "name": "test",
993 "security_group_rules": [
994 {
995 "direction": "egress",
996 "ethertype": "IPv6",
997 "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
998 "security_group_id": "85cc3048-abc3-43cc-89b3-3773414",
999 "project_id": "e4f50856753b4dc6afee5fa6b9b6c550",
1000 "revision_number": 1,
1001 "tags": ["tag1,tag2"],
1002 "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550",
1003 "created_at": "2018-03-19T19:16:56Z",
1004 "updated_at": "2018-03-19T19:16:56Z",
1005 "description": ""
1006 }
1007 ]
1008 },
1009 {
1010 "id": "7q844add-3697",
1011 "name": "saved-sec-group"
1012 }
1013 ]
1014 }
1015
1016 def test_delete_fail(self):
1017 delete_mock = [(self.get_method, self.response, 200),
1018 (self.delete_method, 'error', None),
1019 (self.log_method, 'exception', None)]
1020 self._test_delete(delete_mock, fail=True)
1021
1022 def test_delete_pass(self):
1023 delete_mock = [(self.get_method, self.response, 200),
1024 (self.delete_method, None, 204),
1025 (self.log_method, 'exception', None)]
1026 self._test_delete(delete_mock)
1027
1028 def test_dry_run(self):
1029 dry_mock = [(self.get_method, self.response, 200),
1030 (self.delete_method, "delete", None)]
1031 self._test_dry_run_true(dry_mock)
1032
1033 def test_save_state(self):
1034 self._test_saved_state_true([(self.get_method, self.response, 200)])
1035
1036 def test_preserve_list(self):
1037 self.response['security_groups'].append(
1038 {
1039 "description": "default",
1040 "id": "85cc3048-abc3-43cc-89b3-377341426ac5",
1041 "name": "test",
1042 "security_group_rules": [
1043 {
1044 "direction": "egress",
1045 "ethertype": "IPv6",
1046 "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
1047 "security_group_id": "85cc3048-abc3-43cc-89b3-3773414",
1048 "project_id": cleanup_service.CONF_PROJECTS[0],
1049 "revision_number": 1,
1050 "tags": ["tag1,tag2"],
1051 "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550",
1052 "created_at": "2018-03-19T19:16:56Z",
1053 "updated_at": "2018-03-19T19:16:56Z",
1054 "description": ""
1055 }
1056 ]
1057 })
1058 self._test_is_preserve_true([(self.get_method, self.response, 200)])
1059
1060
1061class TestNetworkSubnetService(BaseCmdServiceTests):
1062
1063 service_class = 'NetworkSubnetService'
1064 service_name = 'subnets'
1065 response = {
1066 "subnets": [
1067 {
1068 "name": "private-subnet",
1069 "enable_dhcp": True,
1070 "network_id": "db193ab3-96e3-4cb3-8fc5-05f4296d0324",
1071 "project_id": "26a7980765d0414dbc1fc1f88cdb7e6e",
1072 "tenant_id": "26a7980765d0414dbc1fc1f88cdb7e6e",
1073 "dns_nameservers": [],
1074 "allocation_pools": [
1075 {
1076 "start": "10.0.0.2",
1077 "end": "10.0.0.254"
1078 }
1079 ],
1080 "host_routes": [],
1081 "ip_version": 4,
1082 "gateway_ip": "10.0.0.1",
1083 "cidr": "10.0.0.0/24",
1084 "id": "08eae331-0402-425a-923c-34f7cfe39c1b",
1085 "created_at": "2016-10-10T14:35:34Z",
1086 "revision_number": 2,
1087 "service_types": [],
1088 "tags": ["tag1,tag2"],
1089 "updated_at": "2016-10-10T14:35:34Z"
1090 },
1091 {
1092 "id": "55ttda4a-2584",
1093 "name": "saved-subnet"
1094 }
1095 ]
1096 }
1097
1098 def test_delete_fail(self):
1099 delete_mock = [(self.get_method, self.response, 200),
1100 (self.delete_method, 'error', None),
1101 (self.log_method, 'exception', None)]
1102 self._test_delete(delete_mock, fail=True)
1103
1104 def test_delete_pass(self):
1105 delete_mock = [(self.get_method, self.response, 200),
1106 (self.delete_method, None, 204),
1107 (self.log_method, 'exception', None)]
1108 self._test_delete(delete_mock)
1109
1110 def test_dry_run(self):
1111 dry_mock = [(self.get_method, self.response, 200),
1112 (self.delete_method, "delete", None)]
1113 self._test_dry_run_true(dry_mock)
1114
1115 def test_save_state(self):
1116 self._test_saved_state_true([(self.get_method, self.response, 200)])
1117
1118 def test_preserve_list(self):
1119 self.response['subnets'].append(
1120 {
1121 "name": "public-subnet",
1122 "network_id": cleanup_service.CONF_PUB_NETWORK,
1123 "project_id": "26a7980765d0414dbc1fc1f88cdb7e6e",
1124 "tenant_id": "26a7980765d0414dbc1fc1f88cdb7e6e",
1125 "ip_version": 4,
1126 "gateway_ip": "10.0.0.1",
1127 "cidr": "10.0.0.0/24",
1128 "id": "08eae331-0402-425a-923c-34f7cfe39c1b",
1129 "created_at": "2018-10-10T14:35:34Z",
1130 "service_types": [],
1131 "tags": ["tag1,tag2"],
1132 "updated_at": "2018-10-10T14:35:34Z"
1133 })
1134 self._test_is_preserve_true([(self.get_method, self.response, 200)])
1135
1136
Martin Kopece6819982019-02-18 12:34:52 +00001137class TestNetworkSubnetPoolsService(BaseCmdServiceTests):
1138
1139 service_class = 'NetworkSubnetPoolsService'
1140 service_name = 'subnetpools'
1141 response = {
1142 "subnetpools": [
1143 {
1144 "min_prefixlen": "64",
1145 "default_prefixlen": "64",
1146 "id": "03f761e6-eee0-43fc-a921-8acf64c14988",
1147 "max_prefixlen": "64",
1148 "name": "my-subnet-pool-ipv6",
1149 "is_default": False,
1150 "project_id": "9fadcee8aa7c40cdb2114fff7d569c08",
1151 "tenant_id": "9fadcee8aa7c40cdb2114fff7d569c08",
1152 "prefixes": [
1153 "2001:db8:0:2::/64",
1154 "2001:db8::/63"
1155 ],
1156 "ip_version": 6,
1157 "shared": False,
1158 "description": "",
1159 "created_at": "2016-03-08T20:19:41",
1160 "updated_at": "2016-03-08T20:19:41",
1161 "revision_number": 2,
1162 "tags": ["tag1,tag2"]
1163 },
1164 {
1165 "id": "8acf64c1-43fc",
1166 "name": "saved-subnet-pool"
1167 }
1168 ]
1169 }
1170
1171 def test_delete_fail(self):
1172 delete_mock = [(self.get_method, self.response, 200),
1173 (self.delete_method, 'error', None),
1174 (self.log_method, 'exception', None)]
1175 self._test_delete(delete_mock, fail=True)
1176
1177 def test_delete_pass(self):
1178 delete_mock = [(self.get_method, self.response, 200),
1179 (self.delete_method, None, 204),
1180 (self.log_method, 'exception', None)]
1181 self._test_delete(delete_mock)
1182
1183 def test_dry_run(self):
1184 dry_mock = [(self.get_method, self.response, 200),
1185 (self.delete_method, "delete", None)]
1186 self._test_dry_run_true(dry_mock)
1187
1188 def test_save_state(self):
1189 self._test_saved_state_true([(self.get_method, self.response, 200)])
1190
1191 def test_preserve_list(self):
1192 self.response['subnetpools'].append(
1193 {
1194 "min_prefixlen": "64",
1195 "default_prefixlen": "64",
1196 "id": "9acf64c1-43fc",
1197 "name": "preserve-pool",
1198 "project_id": cleanup_service.CONF_PROJECTS[0],
1199 "created_at": "2016-03-08T20:19:41",
1200 "updated_at": "2016-03-08T20:19:41"
1201 })
1202 self._test_is_preserve_true([(self.get_method, self.response, 200)])
1203
1204
Martin Kopec470aca72019-02-18 00:05:13 +00001205# begin global services
Lukas Piwowarski3b1311f2019-11-12 10:43:40 +00001206class TestRegionService(BaseCmdServiceTests):
1207 service_class = 'RegionService'
1208 service_name = 'regions'
1209 response = {
1210 "regions": [{
1211 "parent_region_id": None,
1212 "id": "RegionOne",
1213 "links": {
1214 "self":
1215 "http://10.0.145.61:5000/v3/regions/RegionOne"
1216 },
1217 "description": ""
1218 },
1219 {
1220 "parent_region_id": None,
1221 "id": "RegionTwo",
1222 "links": {
1223 "self":
1224 "http://10.0.145.61:5000/v3/regions/RegionTwo"
1225 },
1226 "description": ""
1227 }],
1228 "links": {
1229 "self":
1230 "http://10.0.145.61:5000/v3/regions",
1231 "next": None,
1232 "previous": None
1233 }
1234 }
1235
1236 def test_delete_pass(self):
1237 delete_mock = [(self.get_method, self.response, 200),
1238 (self.delete_method, None, 204),
1239 (self.log_method, "exception", None)]
1240 self._test_delete(delete_mock)
1241
1242 def test_delete_fail(self):
1243 delete_mock = [(self.get_method, self.response, 200),
1244 (self.delete_method, 'error', None),
1245 (self.log_method, "exception", None)]
1246 self._test_delete(delete_mock, fail=True)
1247
1248 def test_dry_run(self):
1249 dry_mock = [(self.get_method, self.response, 200),
1250 (self.delete_method, "delete", None)]
1251 self._test_dry_run_true(dry_mock)
1252
1253 def test_save_state(self):
1254 self._test_saved_state_true([(self.get_method, self.response, 200)])
1255
1256
nh202bc67bb192018-06-29 17:07:50 -07001257class TestDomainService(BaseCmdServiceTests):
1258
1259 service_class = 'DomainService'
1260 service_name = 'domains'
1261 response = {
1262 "domains": [
1263 {
1264 "description": "Destroy all humans",
1265 "enabled": True,
1266 "id": "5a75994a3",
1267 "links": {
1268 "self": "http://example.com/identity/v3/domains/5a75994a3"
1269 },
1270 "name": "Sky_net"
1271 },
1272 {
1273 "description": "Owns users and tenants on Identity API",
1274 "enabled": False,
1275 "id": "default",
1276 "links": {
1277 "self": "http://example.com/identity/v3/domains/default"
1278 },
1279 "name": "Default"
1280 }
1281 ]
1282 }
1283
1284 mock_update = ("tempest.lib.services.identity.v3."
1285 "domains_client.DomainsClient.update_domain")
1286
1287 def test_delete_fail(self):
1288 delete_mock = [(self.get_method, self.response, 200),
1289 (self.delete_method, 'error', None),
1290 (self.log_method, 'exception', None),
1291 (self.mock_update, 'update', None)]
1292 self._test_delete(delete_mock, fail=True)
1293
1294 def test_delete_pass(self):
1295 delete_mock = [(self.get_method, self.response, 200),
1296 (self.delete_method, None, 204),
1297 (self.log_method, 'exception', None),
1298 (self.mock_update, 'update', None)]
1299 self._test_delete(delete_mock)
1300
1301 def test_dry_run(self):
1302 dry_mock = [(self.get_method, self.response, 200),
1303 (self.delete_method, "delete", None)]
1304 self._test_dry_run_true(dry_mock)
1305
1306 def test_save_state(self):
1307 self._test_saved_state_true([(self.get_method, self.response, 200)])
1308
1309
1310class TestProjectsService(BaseCmdServiceTests):
1311
1312 service_class = 'ProjectService'
1313 service_name = 'projects'
1314 response = {
1315 "projects": [
1316 {
1317 "is_domain": False,
1318 "description": None,
1319 "domain_id": "default",
1320 "enabled": True,
1321 "id": "f38ohgp93jj032",
1322 "links": {
1323 "self": "http://example.com/identity/v3/projects"
1324 "/f38ohgp93jj032"
1325 },
1326 "name": "manhattan",
1327 "parent_id": None
1328 },
1329 {
1330 "is_domain": False,
1331 "description": None,
1332 "domain_id": "default",
1333 "enabled": True,
1334 "id": "098f89d3292ri4jf4",
1335 "links": {
1336 "self": "http://example.com/identity/v3/projects"
1337 "/098f89d3292ri4jf4"
1338 },
1339 "name": "Apollo",
1340 "parent_id": None
1341 }
1342 ]
1343 }
1344
1345 def test_delete_fail(self):
1346 delete_mock = [(self.get_method, self.response, 200),
1347 (self.delete_method, 'error', None),
1348 (self.log_method, 'exception', None)]
1349 self._test_delete(delete_mock, fail=True)
1350
1351 def test_delete_pass(self):
1352 delete_mock = [(self.get_method, self.response, 200),
1353 (self.delete_method, None, 204),
1354 (self.log_method, 'exception', None)]
1355 self._test_delete(delete_mock)
1356
1357 def test_dry_run(self):
1358 dry_mock = [(self.get_method, self.response, 200),
1359 (self.delete_method, "delete", None)]
1360 self._test_dry_run_true(dry_mock)
1361
1362 def test_save_state(self):
1363 self._test_saved_state_true([(self.get_method, self.response, 200)])
1364
1365 def test_preserve_list(self):
1366 self.response['projects'].append(
1367 {
1368 "is_domain": False,
1369 "description": None,
1370 "domain_id": "default",
1371 "enabled": True,
1372 "id": "r343q98h09f3092",
1373 "links": {
1374 "self": "http://example.com/identity/v3/projects"
1375 "/r343q98h09f3092"
1376 },
1377 "name": cleanup_service.CONF_PROJECTS[0],
1378 "parent_id": None
1379 })
1380 self._test_is_preserve_true([(self.get_method, self.response, 200)])
1381
1382
1383class TestImagesService(BaseCmdServiceTests):
1384
1385 service_class = 'ImageService'
1386 service_name = 'images'
1387 response = {
1388 "images": [
1389 {
1390 "status": "ACTIVE",
1391 "name": "stratus-0.3.2-x86_64-disk",
1392 "id": "34yhwr-4t3q",
1393 "updated": "2014-11-03T16:40:10Z",
1394 "links": [{
1395 "href": "http://openstack.ex.com/v2/openstack/images/"
1396 "34yhwr-4t3q",
1397 "rel": "self"}],
1398 "created": "2014-10-30T08:23:39Z",
1399 "minDisk": 0,
1400 "minRam": 0,
1401 "progress": 0,
1402 "metadata": {},
1403 },
1404 {
1405 "status": "ACTIVE",
1406 "name": "cirros-0.3.2-x86_64-disk",
1407 "id": "1bea47ed-f6a9",
1408 "updated": "2014-11-03T16:40:10Z",
1409 "links": [{
1410 "href": "http://openstack.ex.com/v2/openstack/images/"
1411 "1bea47ed-f6a9",
1412 "rel": "self"}],
1413 "created": "2014-10-30T08:23:39Z",
1414 "minDisk": 0,
1415 "minRam": 0,
1416 "progress": 0,
1417 "metadata": {},
1418 }
1419 ]
1420 }
1421
1422 def test_delete_fail(self):
1423 delete_mock = [(self.get_method, self.response, 200),
1424 (self.delete_method, 'error', None),
1425 (self.log_method, 'exception', None)]
1426 self._test_delete(delete_mock, fail=True)
1427
1428 def test_delete_pass(self):
1429 delete_mock = [(self.get_method, self.response, 200),
1430 (self.delete_method, None, 204),
1431 (self.log_method, 'exception', None)]
1432 self._test_delete(delete_mock)
1433
1434 def test_dry_run(self):
1435 dry_mock = [(self.get_method, self.response, 200),
1436 (self.delete_method, "delete", None)]
1437 self._test_dry_run_true(dry_mock)
1438
1439 def test_save_state(self):
1440 self._test_saved_state_true([(self.get_method, self.response, 200)])
1441
1442 def test_preserve_list(self):
1443 self.response['images'].append(
1444 {
1445 "status": "ACTIVE",
1446 "name": "cirros-0.3.2-x86_64-disk",
1447 "id": cleanup_service.CONF_IMAGES[0],
1448 "updated": "2014-11-03T16:40:10Z",
1449 "links": [{
1450 "href": "http://openstack.ex.com/v2/openstack/images/"
1451 "None",
1452 "rel": "self"}],
1453 "created": "2014-10-30T08:23:39Z",
1454 "minDisk": 0,
1455 "minRam": 0,
1456 "progress": 0,
1457 "metadata": {},
1458 })
1459 self._test_is_preserve_true([(self.get_method, self.response, 200)])
1460
1461
1462class TestFlavorService(BaseCmdServiceTests):
1463
1464 service_class = 'FlavorService'
1465 service_name = 'flavors'
1466 response = {
1467 "flavors": [
1468 {
1469 "disk": 1,
1470 "id": "42",
1471 "links": [{
1472 "href": "http://openstack.ex.com/v2/openstack/flavors/1",
1473 "rel": "self"}, {
1474 "href": "http://openstack.ex.com/openstack/flavors/1",
1475 "rel": "bookmark"}],
1476 "name": "m1.tiny",
1477 "ram": 512,
1478 "swap": 1,
1479 "vcpus": 1
1480 },
1481 {
1482 "disk": 2,
1483 "id": "13",
1484 "links": [{
1485 "href": "http://openstack.ex.com/v2/openstack/flavors/2",
1486 "rel": "self"}, {
1487 "href": "http://openstack.ex.com/openstack/flavors/2",
1488 "rel": "bookmark"}],
1489 "name": "m1.tiny",
1490 "ram": 512,
1491 "swap": 1,
1492 "vcpus": 1
1493 }
1494 ]
1495 }
1496
1497 def test_delete_fail(self):
1498 delete_mock = [(self.get_method, self.response, 200),
1499 (self.delete_method, 'error', None),
1500 (self.log_method, 'exception', None)]
1501 self._test_delete(delete_mock, fail=True)
1502
1503 def test_delete_pass(self):
1504 delete_mock = [(self.get_method, self.response, 200),
1505 (self.delete_method, None, 202),
1506 (self.log_method, 'exception', None)]
1507 self._test_delete(delete_mock)
1508
1509 def test_dry_run(self):
1510 dry_mock = [(self.get_method, self.response, 200),
1511 (self.delete_method, "delete", None)]
1512 self._test_dry_run_true(dry_mock)
1513
1514 def test_save_state(self):
1515 self._test_saved_state_true([(self.get_method, self.response, 200)])
1516
1517 def test_preserve_list(self):
1518 self.response['flavors'].append(
1519 {
1520 "disk": 3,
1521 "id": cleanup_service.CONF_FLAVORS[0],
1522 "links": [{
1523 "href": "http://openstack.ex.com/v2/openstack/flavors/3",
1524 "rel": "self"}, {
1525 "href": "http://openstack.ex.com/openstack/flavors/3",
1526 "rel": "bookmark"}],
1527 "name": "m1.tiny",
1528 "ram": 512,
1529 "swap": 1,
1530 "vcpus": 1
1531 })
1532 self._test_is_preserve_true([(self.get_method, self.response, 200)])
1533
1534
1535class TestRoleService(BaseCmdServiceTests):
1536
1537 service_class = 'RoleService'
1538 service_name = 'roles'
1539 response = {
1540 "roles": [
1541 {
1542 "domain_id": "FakeDomain",
1543 "id": "3efrt74r45hn",
1544 "name": "president",
1545 "links": {
1546 "self": "http://ex.com/identity/v3/roles/3efrt74r45hn"
1547 }
1548 },
1549 {
1550 "domain_id": 'FakeDomain',
1551 "id": "39ruo5sdk040",
1552 "name": "vice-p",
1553 "links": {
1554 "self": "http://ex.com/identity/v3/roles/39ruo5sdk040"
1555 }
1556 }
1557 ]
1558 }
1559
1560 def test_delete_fail(self):
1561 delete_mock = [(self.get_method, self.response, 200),
1562 (self.delete_method, 'error', None),
1563 (self.log_method, 'exception', None)]
1564 self._test_delete(delete_mock, fail=True)
1565
1566 def test_delete_pass(self):
1567 delete_mock = [(self.get_method, self.response, 200),
1568 (self.delete_method, None, 204),
1569 (self.log_method, 'exception', None)]
1570 self._test_delete(delete_mock)
1571
1572 def test_dry_run(self):
1573 dry_mock = [(self.get_method, self.response, 200),
1574 (self.delete_method, "delete", None)]
1575 self._test_dry_run_true(dry_mock)
1576
1577 def test_save_state(self):
1578 self._test_saved_state_true([(self.get_method, self.response, 200)])
1579
1580
1581class TestUserService(BaseCmdServiceTests):
1582
1583 service_class = 'UserService'
1584 service_name = 'users'
1585 response = {
1586 "users": [
1587 {
1588 "domain_id": "TempestDomain",
1589 "enabled": True,
1590 "id": "e812fb332456423fdv1b1320121qwe2",
1591 "links": {
1592 "self": "http://example.com/identity/v3/users/"
1593 "e812fb332456423fdv1b1320121qwe2",
1594 },
1595 "name": "Thunder",
1596 "password_expires_at": "3102-11-06T15:32:17.000000",
1597 },
1598 {
1599 "domain_id": "TempestDomain",
1600 "enabled": True,
1601 "id": "32rwef64245tgr20121qw324bgg",
1602 "links": {
1603 "self": "http://example.com/identity/v3/users/"
1604 "32rwef64245tgr20121qw324bgg",
1605 },
1606 "name": "Lightning",
1607 "password_expires_at": "1893-11-06T15:32:17.000000",
1608 }
1609 ]
1610 }
1611
1612 def test_delete_fail(self):
1613 delete_mock = [(self.get_method, self.response, 200),
1614 (self.delete_method, 'error', None),
1615 (self.log_method, 'exception', None)]
1616 self._test_delete(delete_mock, fail=True)
1617
1618 def test_delete_pass(self):
1619 delete_mock = [(self.get_method, self.response, 200),
1620 (self.delete_method, None, 204),
1621 (self.log_method, 'exception', None)]
1622 self._test_delete(delete_mock)
1623
1624 def test_dry_run(self):
1625 dry_mock = [(self.get_method, self.response, 200),
1626 (self.delete_method, "delete", None)]
1627 self._test_dry_run_true(dry_mock)
1628
1629 def test_save_state(self):
1630 self._test_saved_state_true([(self.get_method, self.response, 200)])
1631
1632 def test_preserve_list(self):
1633 self.response['users'].append(
1634 {
1635 "domain_id": "TempestDomain",
1636 "enabled": True,
1637 "id": "23ads5tg3rtrhe30121qwhyth",
1638 "links": {
1639 "self": "http://example.com/identity/v3/users/"
1640 "23ads5tg3rtrhe30121qwhyth",
1641 },
1642 "name": cleanup_service.CONF_USERS[0],
1643 "password_expires_at": "1893-11-06T15:32:17.000000",
1644 })
1645 self._test_is_preserve_true([(self.get_method, self.response, 200)])