python-openstackclient 8.0.0__py3-none-any.whl → 8.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. openstackclient/api/compute_v2.py +2 -2
  2. openstackclient/api/volume_v2.py +60 -0
  3. openstackclient/api/volume_v3.py +60 -0
  4. openstackclient/compute/client.py +5 -0
  5. openstackclient/compute/v2/console.py +7 -0
  6. openstackclient/compute/v2/console_connection.py +48 -0
  7. openstackclient/compute/v2/flavor.py +14 -1
  8. openstackclient/compute/v2/keypair.py +10 -3
  9. openstackclient/compute/v2/server.py +76 -13
  10. openstackclient/compute/v2/server_event.py +1 -1
  11. openstackclient/identity/common.py +85 -11
  12. openstackclient/identity/v3/application_credential.py +88 -87
  13. openstackclient/identity/v3/domain.py +67 -49
  14. openstackclient/identity/v3/group.py +113 -68
  15. openstackclient/identity/v3/project.py +42 -20
  16. openstackclient/identity/v3/role.py +7 -2
  17. openstackclient/identity/v3/user.py +38 -5
  18. openstackclient/image/client.py +5 -0
  19. openstackclient/image/v1/image.py +16 -1
  20. openstackclient/image/v2/cache.py +10 -6
  21. openstackclient/image/v2/image.py +59 -12
  22. openstackclient/image/v2/metadef_objects.py +8 -2
  23. openstackclient/image/v2/metadef_properties.py +9 -2
  24. openstackclient/network/client.py +0 -6
  25. openstackclient/network/v2/floating_ip.py +58 -29
  26. openstackclient/network/v2/network_qos_rule.py +3 -11
  27. openstackclient/network/v2/port.py +16 -0
  28. openstackclient/network/v2/router.py +1 -1
  29. openstackclient/network/v2/security_group.py +49 -7
  30. openstackclient/network/v2/security_group_rule.py +18 -1
  31. openstackclient/shell.py +1 -1
  32. openstackclient/tests/functional/base.py +5 -1
  33. openstackclient/tests/functional/compute/v2/test_keypair.py +41 -5
  34. openstackclient/tests/functional/identity/v3/test_access_rule.py +1 -1
  35. openstackclient/tests/functional/identity/v3/test_application_credential.py +7 -7
  36. openstackclient/tests/functional/image/v2/test_image.py +36 -14
  37. openstackclient/tests/functional/volume/v2/test_volume.py +1 -1
  38. openstackclient/tests/functional/volume/v3/test_volume.py +2 -2
  39. openstackclient/tests/unit/api/test_volume_v2.py +124 -0
  40. openstackclient/tests/unit/api/test_volume_v3.py +124 -0
  41. openstackclient/tests/unit/compute/v2/fakes.py +81 -305
  42. openstackclient/tests/unit/compute/v2/test_console.py +18 -1
  43. openstackclient/tests/unit/compute/v2/test_console_connection.py +72 -0
  44. openstackclient/tests/unit/compute/v2/test_flavor.py +160 -175
  45. openstackclient/tests/unit/compute/v2/test_keypair.py +12 -5
  46. openstackclient/tests/unit/compute/v2/test_server.py +211 -97
  47. openstackclient/tests/unit/compute/v2/test_server_backup.py +32 -71
  48. openstackclient/tests/unit/compute/v2/test_server_event.py +2 -2
  49. openstackclient/tests/unit/compute/v2/test_server_image.py +33 -72
  50. openstackclient/tests/unit/compute/v2/test_server_migration.py +4 -4
  51. openstackclient/tests/unit/identity/v3/test_application_credential.py +93 -65
  52. openstackclient/tests/unit/identity/v3/test_domain.py +117 -107
  53. openstackclient/tests/unit/identity/v3/test_group.py +353 -202
  54. openstackclient/tests/unit/identity/v3/test_project.py +46 -53
  55. openstackclient/tests/unit/identity/v3/test_role.py +2 -8
  56. openstackclient/tests/unit/identity/v3/test_user.py +86 -6
  57. openstackclient/tests/unit/image/v1/test_image.py +55 -9
  58. openstackclient/tests/unit/image/v2/test_image.py +128 -58
  59. openstackclient/tests/unit/image/v2/test_metadef_objects.py +22 -0
  60. openstackclient/tests/unit/image/v2/test_metadef_properties.py +24 -10
  61. openstackclient/tests/unit/network/v2/fakes.py +406 -485
  62. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +13 -19
  63. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +2 -2
  64. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +3 -5
  65. openstackclient/tests/unit/network/v2/test_network.py +4 -4
  66. openstackclient/tests/unit/network/v2/test_network_agent.py +15 -29
  67. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +16 -19
  68. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +79 -152
  69. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +4 -6
  70. openstackclient/tests/unit/network/v2/test_network_rbac.py +2 -2
  71. openstackclient/tests/unit/network/v2/test_port.py +57 -17
  72. openstackclient/tests/unit/network/v2/test_router.py +73 -57
  73. openstackclient/tests/unit/network/v2/test_security_group_network.py +31 -27
  74. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +1 -3
  75. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +82 -39
  76. openstackclient/tests/unit/volume/v2/fakes.py +1 -2
  77. openstackclient/tests/unit/volume/v2/test_service.py +57 -91
  78. openstackclient/tests/unit/volume/v2/test_volume.py +466 -410
  79. openstackclient/tests/unit/volume/v2/test_volume_backup.py +141 -148
  80. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +293 -283
  81. openstackclient/tests/unit/volume/v3/test_block_storage_log_level.py +61 -71
  82. openstackclient/tests/unit/volume/v3/test_service.py +221 -141
  83. openstackclient/tests/unit/volume/v3/test_volume.py +569 -534
  84. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
  85. openstackclient/tests/unit/volume/v3/test_volume_backup.py +198 -203
  86. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +682 -47
  87. openstackclient/volume/v2/service.py +41 -38
  88. openstackclient/volume/v2/volume.py +140 -88
  89. openstackclient/volume/v2/volume_backup.py +9 -3
  90. openstackclient/volume/v2/volume_snapshot.py +121 -84
  91. openstackclient/volume/v3/block_storage_log_level.py +22 -28
  92. openstackclient/volume/v3/service.py +105 -14
  93. openstackclient/volume/v3/volume.py +287 -99
  94. openstackclient/volume/v3/volume_backup.py +24 -19
  95. openstackclient/volume/v3/volume_group.py +1 -1
  96. openstackclient/volume/v3/volume_snapshot.py +485 -10
  97. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/AUTHORS +13 -0
  98. python_openstackclient-8.2.0.dist-info/METADATA +264 -0
  99. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/RECORD +104 -98
  100. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/entry_points.txt +7 -6
  101. python_openstackclient-8.2.0.dist-info/pbr.json +1 -0
  102. python_openstackclient-8.0.0.dist-info/METADATA +0 -166
  103. python_openstackclient-8.0.0.dist-info/pbr.json +0 -1
  104. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/LICENSE +0 -0
  105. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/WHEEL +0 -0
  106. {python_openstackclient-8.0.0.dist-info → python_openstackclient-8.2.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,72 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may
2
+ # not use this file except in compliance with the License. You may obtain
3
+ # a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10
+ # License for the specific language governing permissions and limitations
11
+ # under the License.
12
+
13
+ import uuid
14
+
15
+ from openstack.compute.v2 import console_auth_token as _console_auth_token
16
+ from openstack.test import fakes as sdk_fakes
17
+
18
+ from openstackclient.compute.v2 import console_connection
19
+ from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
20
+
21
+
22
+ class TestConsoleTokens(compute_fakes.TestComputev2):
23
+ def setUp(self):
24
+ super().setUp()
25
+
26
+ self._console_auth_token = sdk_fakes.generate_fake_resource(
27
+ _console_auth_token.ConsoleAuthToken,
28
+ host='127.0.0.1',
29
+ instance_uuid=uuid.uuid4().hex,
30
+ internal_access_path=None,
31
+ port=5900,
32
+ tls_port=5901,
33
+ )
34
+ self.compute_client.validate_console_auth_token.return_value = (
35
+ self._console_auth_token
36
+ )
37
+
38
+ self.columns = (
39
+ 'host',
40
+ 'instance_uuid',
41
+ 'internal_access_path',
42
+ 'port',
43
+ 'tls_port',
44
+ )
45
+ self.data = (
46
+ self._console_auth_token.host,
47
+ self._console_auth_token.instance_uuid,
48
+ self._console_auth_token.internal_access_path,
49
+ self._console_auth_token.port,
50
+ self._console_auth_token.tls_port,
51
+ )
52
+
53
+ self.cmd = console_connection.ShowConsoleConnectionInformation(
54
+ self.app, None
55
+ )
56
+
57
+ def test_console_connection_show(self):
58
+ arglist = [
59
+ 'token',
60
+ ]
61
+ verifylist = [
62
+ ('token', 'token'),
63
+ ]
64
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
65
+
66
+ columns, data = self.cmd.take_action(parsed_args)
67
+
68
+ self.compute_client.validate_console_auth_token.assert_called_once_with(
69
+ 'token'
70
+ )
71
+ self.assertEqual(self.columns, columns)
72
+ self.assertEqual(self.data, data)
@@ -16,12 +16,13 @@ from unittest import mock
16
16
 
17
17
  from openstack.compute.v2 import flavor as _flavor
18
18
  from openstack import exceptions as sdk_exceptions
19
+ from openstack.identity.v3 import project as _project
20
+ from openstack.test import fakes as sdk_fakes
19
21
  from osc_lib.cli import format_columns
20
22
  from osc_lib import exceptions
21
23
 
22
24
  from openstackclient.compute.v2 import flavor
23
25
  from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
24
- from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
25
26
  from openstackclient.tests.unit import utils as tests_utils
26
27
 
27
28
 
@@ -34,59 +35,60 @@ class TestFlavor(compute_fakes.TestComputev2):
34
35
 
35
36
 
36
37
  class TestFlavorCreate(TestFlavor):
37
- flavor = compute_fakes.create_one_flavor(attrs={'links': 'flavor-links'})
38
- project = identity_fakes.FakeProject.create_one_project()
39
-
40
- columns = (
41
- 'OS-FLV-DISABLED:disabled',
42
- 'OS-FLV-EXT-DATA:ephemeral',
43
- 'description',
44
- 'disk',
45
- 'id',
46
- 'name',
47
- 'os-flavor-access:is_public',
48
- 'properties',
49
- 'ram',
50
- 'rxtx_factor',
51
- 'swap',
52
- 'vcpus',
53
- )
54
-
55
- data = (
56
- flavor.is_disabled,
57
- flavor.ephemeral,
58
- flavor.description,
59
- flavor.disk,
60
- flavor.id,
61
- flavor.name,
62
- flavor.is_public,
63
- format_columns.DictColumn(flavor.extra_specs),
64
- flavor.ram,
65
- flavor.rxtx_factor,
66
- flavor.swap,
67
- flavor.vcpus,
68
- )
69
- data_private = (
70
- flavor.is_disabled,
71
- flavor.ephemeral,
72
- flavor.description,
73
- flavor.disk,
74
- flavor.id,
75
- flavor.name,
76
- False,
77
- format_columns.DictColumn(flavor.extra_specs),
78
- flavor.ram,
79
- flavor.rxtx_factor,
80
- flavor.swap,
81
- flavor.vcpus,
82
- )
83
-
84
38
  def setUp(self):
85
39
  super().setUp()
86
40
 
87
- # Return a project
41
+ self.flavor = sdk_fakes.generate_fake_resource(
42
+ _flavor.Flavor, links='flavor-links'
43
+ )
44
+ self.project = sdk_fakes.generate_fake_resource(_project.Project)
45
+
46
+ self.columns = (
47
+ 'OS-FLV-DISABLED:disabled',
48
+ 'OS-FLV-EXT-DATA:ephemeral',
49
+ 'description',
50
+ 'disk',
51
+ 'id',
52
+ 'name',
53
+ 'os-flavor-access:is_public',
54
+ 'properties',
55
+ 'ram',
56
+ 'rxtx_factor',
57
+ 'swap',
58
+ 'vcpus',
59
+ )
60
+ self.data = (
61
+ self.flavor.is_disabled,
62
+ self.flavor.ephemeral,
63
+ self.flavor.description,
64
+ self.flavor.disk,
65
+ self.flavor.id,
66
+ self.flavor.name,
67
+ self.flavor.is_public,
68
+ format_columns.DictColumn(self.flavor.extra_specs),
69
+ self.flavor.ram,
70
+ self.flavor.rxtx_factor,
71
+ self.flavor.swap,
72
+ self.flavor.vcpus,
73
+ )
74
+ self.data_private = (
75
+ self.flavor.is_disabled,
76
+ self.flavor.ephemeral,
77
+ self.flavor.description,
78
+ self.flavor.disk,
79
+ self.flavor.id,
80
+ self.flavor.name,
81
+ False,
82
+ format_columns.DictColumn(self.flavor.extra_specs),
83
+ self.flavor.ram,
84
+ self.flavor.rxtx_factor,
85
+ self.flavor.swap,
86
+ self.flavor.vcpus,
87
+ )
88
+
88
89
  self.projects_mock.get.return_value = self.project
89
90
  self.compute_client.create_flavor.return_value = self.flavor
91
+
90
92
  self.cmd = flavor.CreateFlavor(self.app, None)
91
93
 
92
94
  def test_flavor_create_default_options(self):
@@ -233,7 +235,7 @@ class TestFlavorCreate(TestFlavor):
233
235
  ('vcpus', self.flavor.vcpus),
234
236
  ('rxtx_factor', self.flavor.rxtx_factor),
235
237
  ('public', False),
236
- ('description', 'description'),
238
+ ('description', self.flavor.description),
237
239
  ('project', self.project.id),
238
240
  ('properties', {'key1': 'value1', 'key2': 'value2'}),
239
241
  ('name', self.flavor.name),
@@ -245,7 +247,7 @@ class TestFlavorCreate(TestFlavor):
245
247
  'ram': self.flavor.ram,
246
248
  'vcpus': self.flavor.vcpus,
247
249
  'disk': self.flavor.disk,
248
- 'id': 'auto',
250
+ 'id': None,
249
251
  'ephemeral': self.flavor.ephemeral,
250
252
  'swap': self.flavor.swap,
251
253
  'rxtx_factor': self.flavor.rxtx_factor,
@@ -328,7 +330,7 @@ class TestFlavorCreate(TestFlavor):
328
330
  str(self.flavor.vcpus),
329
331
  '--rxtx-factor',
330
332
  str(self.flavor.rxtx_factor),
331
- '--private',
333
+ '--public',
332
334
  '--description',
333
335
  'fake description',
334
336
  self.flavor.name,
@@ -341,7 +343,7 @@ class TestFlavorCreate(TestFlavor):
341
343
  ('swap', self.flavor.swap),
342
344
  ('vcpus', self.flavor.vcpus),
343
345
  ('rxtx_factor', self.flavor.rxtx_factor),
344
- ('public', False),
346
+ ('public', True),
345
347
  ('description', 'fake description'),
346
348
  ('name', self.flavor.name),
347
349
  ]
@@ -358,14 +360,14 @@ class TestFlavorCreate(TestFlavor):
358
360
  'ephemeral': self.flavor.ephemeral,
359
361
  'swap': self.flavor.swap,
360
362
  'rxtx_factor': self.flavor.rxtx_factor,
361
- 'is_public': self.flavor.is_public,
363
+ 'is_public': True,
362
364
  'description': 'fake description',
363
365
  }
364
366
 
365
367
  self.compute_client.create_flavor.assert_called_once_with(**args)
366
368
 
367
369
  self.assertEqual(self.columns, columns)
368
- self.assertCountEqual(self.data_private, data)
370
+ self.assertCountEqual(self.data, data)
369
371
 
370
372
  def test_flavor_create_with_description_pre_v255(self):
371
373
  self.set_compute_api_version('2.54')
@@ -395,11 +397,13 @@ class TestFlavorCreate(TestFlavor):
395
397
 
396
398
 
397
399
  class TestFlavorDelete(TestFlavor):
398
- flavors = compute_fakes.create_flavors(count=2)
399
-
400
400
  def setUp(self):
401
401
  super().setUp()
402
402
 
403
+ self.flavors = list(
404
+ sdk_fakes.generate_fake_resources(_flavor.Flavor, 2)
405
+ )
406
+
403
407
  self.compute_client.delete_flavor.return_value = None
404
408
 
405
409
  self.cmd = flavor.DeleteFlavor(self.app, None)
@@ -474,51 +478,50 @@ class TestFlavorDelete(TestFlavor):
474
478
 
475
479
 
476
480
  class TestFlavorList(TestFlavor):
477
- _flavor = compute_fakes.create_one_flavor()
478
-
479
- columns = (
480
- 'ID',
481
- 'Name',
482
- 'RAM',
483
- 'Disk',
484
- 'Ephemeral',
485
- 'VCPUs',
486
- 'Is Public',
487
- )
488
- columns_long = columns + ('Swap', 'RXTX Factor', 'Properties')
489
-
490
- data = (
491
- (
492
- _flavor.id,
493
- _flavor.name,
494
- _flavor.ram,
495
- _flavor.disk,
496
- _flavor.ephemeral,
497
- _flavor.vcpus,
498
- _flavor.is_public,
499
- ),
500
- )
501
- data_long = (
502
- data[0]
503
- + (
504
- _flavor.swap,
505
- _flavor.rxtx_factor,
506
- format_columns.DictColumn(_flavor.extra_specs),
507
- ),
508
- )
509
-
510
481
  def setUp(self):
511
482
  super().setUp()
512
483
 
513
- self.api_mock = mock.Mock()
514
- self.api_mock.side_effect = [
515
- [self._flavor],
516
- [],
517
- ]
484
+ self._flavor = sdk_fakes.generate_fake_resource(
485
+ _flavor.Flavor, extra_specs={'property': 'value'}
486
+ )
487
+
488
+ self.columns = (
489
+ 'ID',
490
+ 'Name',
491
+ 'RAM',
492
+ 'Disk',
493
+ 'Ephemeral',
494
+ 'VCPUs',
495
+ 'Is Public',
496
+ )
497
+ self.columns_long = self.columns + (
498
+ 'Swap',
499
+ 'RXTX Factor',
500
+ 'Properties',
501
+ )
502
+
503
+ self.data = (
504
+ (
505
+ self._flavor.id,
506
+ self._flavor.name,
507
+ self._flavor.ram,
508
+ self._flavor.disk,
509
+ self._flavor.ephemeral,
510
+ self._flavor.vcpus,
511
+ self._flavor.is_public,
512
+ ),
513
+ )
514
+ self.data_long = (
515
+ self.data[0]
516
+ + (
517
+ self._flavor.swap,
518
+ self._flavor.rxtx_factor,
519
+ format_columns.DictColumn(self._flavor.extra_specs),
520
+ ),
521
+ )
518
522
 
519
- self.compute_client.flavors = self.api_mock
523
+ self.compute_client.flavors.side_effect = [[self._flavor], []]
520
524
 
521
- # Get the command object to test
522
525
  self.cmd = flavor.ListFlavor(self.app, None)
523
526
 
524
527
  def test_flavor_list_no_options(self):
@@ -653,7 +656,9 @@ class TestFlavorList(TestFlavor):
653
656
 
654
657
  def test_flavor_list_long_no_extra_specs(self):
655
658
  # use flavor with no extra specs for this test
656
- flavor = compute_fakes.create_one_flavor(attrs={"extra_specs": {}})
659
+ flavor = sdk_fakes.generate_fake_resource(
660
+ _flavor.Flavor, extra_specs={}
661
+ )
657
662
  self.data = (
658
663
  (
659
664
  flavor.id,
@@ -673,12 +678,8 @@ class TestFlavorList(TestFlavor):
673
678
  format_columns.DictColumn(flavor.extra_specs),
674
679
  ),
675
680
  )
676
- self.api_mock.side_effect = [
677
- [flavor],
678
- [],
679
- ]
680
681
 
681
- self.compute_client.flavors = self.api_mock
682
+ self.compute_client.flavors.side_effect = [[flavor], []]
682
683
  self.compute_client.fetch_flavor_extra_specs = mock.Mock(
683
684
  return_value=None
684
685
  )
@@ -744,17 +745,15 @@ class TestFlavorList(TestFlavor):
744
745
 
745
746
 
746
747
  class TestFlavorSet(TestFlavor):
747
- # Return value of self.compute_client.find_flavor().
748
- flavor = compute_fakes.create_one_flavor(
749
- attrs={'os-flavor-access:is_public': False}
750
- )
751
- project = identity_fakes.FakeProject.create_one_project()
752
-
753
748
  def setUp(self):
754
749
  super().setUp()
755
750
 
751
+ self.flavor = sdk_fakes.generate_fake_resource(
752
+ _flavor.Flavor, is_public=False, extra_specs={'property': 'value'}
753
+ )
754
+ self.project = sdk_fakes.generate_fake_resource(_project.Project)
755
+
756
756
  self.compute_client.find_flavor.return_value = self.flavor
757
- # Return a project
758
757
  self.projects_mock.get.return_value = self.project
759
758
  self.cmd = flavor.SetFlavor(self.app, None)
760
759
 
@@ -960,46 +959,42 @@ class TestFlavorSet(TestFlavor):
960
959
 
961
960
 
962
961
  class TestFlavorShow(TestFlavor):
963
- # Return value of self.compute_client.find_flavor().
964
- flavor_access = compute_fakes.create_one_flavor_access()
965
- flavor = compute_fakes.create_one_flavor()
966
-
967
- columns = (
968
- 'OS-FLV-DISABLED:disabled',
969
- 'OS-FLV-EXT-DATA:ephemeral',
970
- 'access_project_ids',
971
- 'description',
972
- 'disk',
973
- 'id',
974
- 'name',
975
- 'os-flavor-access:is_public',
976
- 'properties',
977
- 'ram',
978
- 'rxtx_factor',
979
- 'swap',
980
- 'vcpus',
981
- )
982
-
983
- data = (
984
- flavor.is_disabled,
985
- flavor.ephemeral,
986
- None,
987
- flavor.description,
988
- flavor.disk,
989
- flavor.id,
990
- flavor.name,
991
- flavor.is_public,
992
- format_columns.DictColumn(flavor.extra_specs),
993
- flavor.ram,
994
- flavor.rxtx_factor,
995
- flavor.swap,
996
- flavor.vcpus,
997
- )
998
-
999
962
  def setUp(self):
1000
963
  super().setUp()
1001
964
 
1002
- # Return value of _find_resource()
965
+ self.flavor_access = compute_fakes.create_one_flavor_access()
966
+ self.flavor = sdk_fakes.generate_fake_resource(_flavor.Flavor)
967
+
968
+ self.columns = (
969
+ 'OS-FLV-DISABLED:disabled',
970
+ 'OS-FLV-EXT-DATA:ephemeral',
971
+ 'access_project_ids',
972
+ 'description',
973
+ 'disk',
974
+ 'id',
975
+ 'name',
976
+ 'os-flavor-access:is_public',
977
+ 'properties',
978
+ 'ram',
979
+ 'rxtx_factor',
980
+ 'swap',
981
+ 'vcpus',
982
+ )
983
+ self.data = (
984
+ self.flavor.is_disabled,
985
+ self.flavor.ephemeral,
986
+ None,
987
+ self.flavor.description,
988
+ self.flavor.disk,
989
+ self.flavor.id,
990
+ self.flavor.name,
991
+ self.flavor.is_public,
992
+ format_columns.DictColumn(self.flavor.extra_specs),
993
+ self.flavor.ram,
994
+ self.flavor.rxtx_factor,
995
+ self.flavor.swap,
996
+ self.flavor.vcpus,
997
+ )
1003
998
  self.compute_client.find_flavor.return_value = self.flavor
1004
999
  self.compute_client.get_flavor_access.return_value = [
1005
1000
  self.flavor_access
@@ -1035,10 +1030,8 @@ class TestFlavorShow(TestFlavor):
1035
1030
  self.assertCountEqual(self.data, data)
1036
1031
 
1037
1032
  def test_private_flavor_show(self):
1038
- private_flavor = compute_fakes.create_one_flavor(
1039
- attrs={
1040
- 'os-flavor-access:is_public': False,
1041
- }
1033
+ private_flavor = sdk_fakes.generate_fake_resource(
1034
+ _flavor.Flavor, is_public=False
1042
1035
  )
1043
1036
  self.compute_client.find_flavor.return_value = private_flavor
1044
1037
 
@@ -1052,7 +1045,7 @@ class TestFlavorShow(TestFlavor):
1052
1045
  data_with_project = (
1053
1046
  private_flavor.is_disabled,
1054
1047
  private_flavor.ephemeral,
1055
- [self.flavor_access.tenant_id],
1048
+ [self.flavor_access['tenant_id']],
1056
1049
  private_flavor.description,
1057
1050
  private_flavor.disk,
1058
1051
  private_flavor.id,
@@ -1077,23 +1070,18 @@ class TestFlavorShow(TestFlavor):
1077
1070
 
1078
1071
 
1079
1072
  class TestFlavorUnset(TestFlavor):
1080
- # Return value of self.compute_client.find_flavor().
1081
- flavor = compute_fakes.create_one_flavor(
1082
- attrs={'os-flavor-access:is_public': False}
1083
- )
1084
- project = identity_fakes.FakeProject.create_one_project()
1085
-
1086
1073
  def setUp(self):
1087
1074
  super().setUp()
1088
1075
 
1076
+ self.flavor = sdk_fakes.generate_fake_resource(
1077
+ _flavor.Flavor, is_public=False
1078
+ )
1079
+ self.project = sdk_fakes.generate_fake_resource(_project.Project)
1080
+
1089
1081
  self.compute_client.find_flavor.return_value = self.flavor
1090
- # Return a project
1091
1082
  self.projects_mock.get.return_value = self.project
1092
- self.cmd = flavor.UnsetFlavor(self.app, None)
1093
1083
 
1094
- self.mock_shortcut = (
1095
- self.compute_client.delete_flavor_extra_specs_property
1096
- )
1084
+ self.cmd = flavor.UnsetFlavor(self.app, None)
1097
1085
 
1098
1086
  def test_flavor_unset_property(self):
1099
1087
  arglist = ['--property', 'property', 'baremetal']
@@ -1107,7 +1095,9 @@ class TestFlavorUnset(TestFlavor):
1107
1095
  self.compute_client.find_flavor.assert_called_with(
1108
1096
  parsed_args.flavor, get_extra_specs=True, ignore_missing=False
1109
1097
  )
1110
- self.mock_shortcut.assert_called_with(self.flavor.id, 'property')
1098
+ self.compute_client.delete_flavor_extra_specs_property.assert_called_with(
1099
+ self.flavor.id, 'property'
1100
+ )
1111
1101
  self.compute_client.flavor_remove_tenant_access.assert_not_called()
1112
1102
  self.assertIsNone(result)
1113
1103
 
@@ -1126,21 +1116,16 @@ class TestFlavorUnset(TestFlavor):
1126
1116
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1127
1117
 
1128
1118
  self.cmd.take_action(parsed_args)
1119
+
1129
1120
  self.compute_client.find_flavor.assert_called_with(
1130
1121
  parsed_args.flavor, get_extra_specs=True, ignore_missing=False
1131
1122
  )
1132
- calls = [
1133
- mock.call(self.flavor.id, 'property1'),
1134
- mock.call(self.flavor.id, 'property2'),
1135
- ]
1136
- self.mock_shortcut.assert_has_calls(calls)
1137
-
1138
- # A bit tricky way to ensure we do not unset other properties
1139
- calls.append(mock.call(self.flavor.id, 'property'))
1140
- self.assertRaises(
1141
- AssertionError, self.mock_shortcut.assert_has_calls, calls
1123
+ self.compute_client.delete_flavor_extra_specs_property.assert_has_calls(
1124
+ [
1125
+ mock.call(self.flavor.id, 'property1'),
1126
+ mock.call(self.flavor.id, 'property2'),
1127
+ ]
1142
1128
  )
1143
-
1144
1129
  self.compute_client.flavor_remove_tenant_access.assert_not_called()
1145
1130
 
1146
1131
  def test_flavor_unset_project(self):
@@ -18,6 +18,7 @@ import uuid
18
18
 
19
19
  from openstack.compute.v2 import keypair as _keypair
20
20
  from openstack.identity.v3 import project as _project
21
+ from openstack.identity.v3 import role_assignment as _role_assignment
21
22
  from openstack.identity.v3 import user as _user
22
23
  from openstack.test import fakes as sdk_fakes
23
24
  from osc_lib import exceptions
@@ -529,13 +530,17 @@ class TestKeypairList(TestKeypair):
529
530
  def test_keypair_list_with_project(self):
530
531
  self.set_compute_api_version('2.35')
531
532
 
532
- projects_mock = self.identity_client.tenants
533
+ projects_mock = self.identity_client.projects
533
534
  projects_mock.reset_mock()
534
535
  projects_mock.get.return_value = self._project
535
536
 
536
- users_mock = self.identity_client.users
537
- users_mock.reset_mock()
538
- users_mock.list.return_value = [self._user]
537
+ role_assignments_mock = self.identity_sdk_client.role_assignments
538
+ role_assignments_mock.reset_mock()
539
+ assignment = sdk_fakes.generate_fake_resource(
540
+ _role_assignment.RoleAssignment
541
+ )
542
+ assignment.user = self._user
543
+ role_assignments_mock.return_value = [assignment]
539
544
 
540
545
  arglist = ['--project', self._project.name]
541
546
  verifylist = [('project', self._project.name)]
@@ -544,7 +549,9 @@ class TestKeypairList(TestKeypair):
544
549
  columns, data = self.cmd.take_action(parsed_args)
545
550
 
546
551
  projects_mock.get.assert_called_with(self._project.name)
547
- users_mock.list.assert_called_with(tenant_id=self._project.id)
552
+ role_assignments_mock.assert_called_with(
553
+ scope_project_id=self._project.id
554
+ )
548
555
  self.compute_client.keypairs.assert_called_with(
549
556
  user_id=self._user.id,
550
557
  )