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