python-openstackclient 8.1.0__py3-none-any.whl → 8.3.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 (241) hide show
  1. openstackclient/api/compute_v2.py +2 -2
  2. openstackclient/api/object_store_v1.py +4 -1
  3. openstackclient/api/volume_v2.py +60 -0
  4. openstackclient/api/volume_v3.py +60 -0
  5. openstackclient/command.py +27 -0
  6. openstackclient/common/availability_zone.py +1 -1
  7. openstackclient/common/clientmanager.py +59 -21
  8. openstackclient/common/configuration.py +1 -1
  9. openstackclient/common/extension.py +1 -1
  10. openstackclient/common/limits.py +1 -1
  11. openstackclient/common/module.py +4 -2
  12. openstackclient/common/project_cleanup.py +10 -8
  13. openstackclient/common/quota.py +23 -6
  14. openstackclient/common/versions.py +1 -2
  15. openstackclient/compute/v2/agent.py +1 -1
  16. openstackclient/compute/v2/aggregate.py +6 -5
  17. openstackclient/compute/v2/console.py +5 -3
  18. openstackclient/compute/v2/console_connection.py +1 -1
  19. openstackclient/compute/v2/flavor.py +15 -2
  20. openstackclient/compute/v2/host.py +1 -1
  21. openstackclient/compute/v2/hypervisor.py +1 -1
  22. openstackclient/compute/v2/hypervisor_stats.py +1 -1
  23. openstackclient/compute/v2/keypair.py +1 -1
  24. openstackclient/compute/v2/server.py +77 -30
  25. openstackclient/compute/v2/server_backup.py +1 -1
  26. openstackclient/compute/v2/server_event.py +1 -1
  27. openstackclient/compute/v2/server_group.py +4 -2
  28. openstackclient/compute/v2/server_image.py +1 -1
  29. openstackclient/compute/v2/server_migration.py +1 -1
  30. openstackclient/compute/v2/server_volume.py +1 -1
  31. openstackclient/compute/v2/service.py +1 -1
  32. openstackclient/compute/v2/usage.py +6 -4
  33. openstackclient/identity/common.py +10 -14
  34. openstackclient/identity/v2_0/catalog.py +3 -2
  35. openstackclient/identity/v2_0/ec2creds.py +1 -1
  36. openstackclient/identity/v2_0/endpoint.py +1 -1
  37. openstackclient/identity/v2_0/project.py +17 -7
  38. openstackclient/identity/v2_0/role.py +1 -1
  39. openstackclient/identity/v2_0/role_assignment.py +3 -3
  40. openstackclient/identity/v2_0/service.py +1 -1
  41. openstackclient/identity/v2_0/token.py +1 -1
  42. openstackclient/identity/v2_0/user.py +2 -2
  43. openstackclient/identity/v3/access_rule.py +16 -4
  44. openstackclient/identity/v3/application_credential.py +116 -95
  45. openstackclient/identity/v3/catalog.py +3 -3
  46. openstackclient/identity/v3/consumer.py +1 -1
  47. openstackclient/identity/v3/credential.py +1 -1
  48. openstackclient/identity/v3/domain.py +15 -10
  49. openstackclient/identity/v3/ec2creds.py +1 -1
  50. openstackclient/identity/v3/endpoint.py +33 -12
  51. openstackclient/identity/v3/endpoint_group.py +1 -1
  52. openstackclient/identity/v3/federation_protocol.py +1 -1
  53. openstackclient/identity/v3/group.py +11 -5
  54. openstackclient/identity/v3/identity_provider.py +12 -10
  55. openstackclient/identity/v3/implied_role.py +1 -1
  56. openstackclient/identity/v3/limit.py +1 -1
  57. openstackclient/identity/v3/mapping.py +1 -1
  58. openstackclient/identity/v3/policy.py +1 -1
  59. openstackclient/identity/v3/project.py +34 -22
  60. openstackclient/identity/v3/region.py +1 -1
  61. openstackclient/identity/v3/registered_limit.py +16 -11
  62. openstackclient/identity/v3/role.py +27 -41
  63. openstackclient/identity/v3/role_assignment.py +12 -23
  64. openstackclient/identity/v3/service.py +1 -1
  65. openstackclient/identity/v3/service_provider.py +1 -1
  66. openstackclient/identity/v3/tag.py +3 -2
  67. openstackclient/identity/v3/token.py +3 -2
  68. openstackclient/identity/v3/trust.py +4 -2
  69. openstackclient/identity/v3/unscoped_saml.py +1 -1
  70. openstackclient/identity/v3/user.py +22 -13
  71. openstackclient/image/v1/image.py +35 -17
  72. openstackclient/image/v2/cache.py +11 -7
  73. openstackclient/image/v2/image.py +62 -12
  74. openstackclient/image/v2/info.py +1 -1
  75. openstackclient/image/v2/metadef_namespaces.py +1 -1
  76. openstackclient/image/v2/metadef_objects.py +9 -3
  77. openstackclient/image/v2/metadef_properties.py +11 -3
  78. openstackclient/image/v2/metadef_resource_type_association.py +1 -1
  79. openstackclient/image/v2/metadef_resource_types.py +1 -1
  80. openstackclient/image/v2/task.py +1 -1
  81. openstackclient/network/common.py +10 -9
  82. openstackclient/network/v2/address_group.py +4 -3
  83. openstackclient/network/v2/address_scope.py +8 -6
  84. openstackclient/network/v2/default_security_group_rule.py +9 -8
  85. openstackclient/network/v2/floating_ip.py +16 -9
  86. openstackclient/network/v2/floating_ip_port_forwarding.py +9 -6
  87. openstackclient/network/v2/ip_availability.py +7 -4
  88. openstackclient/network/v2/l3_conntrack_helper.py +11 -4
  89. openstackclient/network/v2/local_ip.py +13 -7
  90. openstackclient/network/v2/local_ip_association.py +7 -4
  91. openstackclient/network/v2/ndp_proxy.py +13 -6
  92. openstackclient/network/v2/network.py +33 -16
  93. openstackclient/network/v2/network_agent.py +5 -5
  94. openstackclient/network/v2/network_auto_allocated_topology.py +1 -1
  95. openstackclient/network/v2/network_flavor.py +1 -1
  96. openstackclient/network/v2/network_flavor_profile.py +1 -1
  97. openstackclient/network/v2/network_meter.py +1 -1
  98. openstackclient/network/v2/network_meter_rule.py +1 -1
  99. openstackclient/network/v2/network_qos_policy.py +7 -5
  100. openstackclient/network/v2/network_qos_rule.py +1 -1
  101. openstackclient/network/v2/network_qos_rule_type.py +1 -1
  102. openstackclient/network/v2/network_rbac.py +8 -5
  103. openstackclient/network/v2/network_segment.py +2 -2
  104. openstackclient/network/v2/network_segment_range.py +13 -6
  105. openstackclient/network/v2/network_service_provider.py +1 -1
  106. openstackclient/network/v2/network_trunk.py +65 -42
  107. openstackclient/network/v2/port.py +38 -20
  108. openstackclient/network/v2/router.py +19 -8
  109. openstackclient/network/v2/security_group.py +52 -7
  110. openstackclient/network/v2/security_group_rule.py +27 -4
  111. openstackclient/network/v2/subnet.py +17 -18
  112. openstackclient/network/v2/subnet_pool.py +11 -9
  113. openstackclient/network/v2/taas/__init__.py +0 -0
  114. openstackclient/network/v2/taas/tap_flow.py +245 -0
  115. openstackclient/network/v2/taas/tap_mirror.py +237 -0
  116. openstackclient/network/v2/taas/tap_service.py +211 -0
  117. openstackclient/object/v1/account.py +1 -1
  118. openstackclient/object/v1/container.py +1 -1
  119. openstackclient/object/v1/object.py +1 -1
  120. openstackclient/shell.py +18 -8
  121. openstackclient/tests/functional/identity/v3/test_access_rule.py +1 -1
  122. openstackclient/tests/functional/identity/v3/test_application_credential.py +7 -7
  123. openstackclient/tests/functional/identity/v3/test_catalog.py +42 -23
  124. openstackclient/tests/functional/identity/v3/test_role_assignment.py +174 -0
  125. openstackclient/tests/functional/image/v2/test_cache.py +54 -0
  126. openstackclient/tests/functional/image/v2/test_image.py +36 -14
  127. openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
  128. openstackclient/tests/functional/volume/v2/test_volume.py +1 -1
  129. openstackclient/tests/functional/volume/v3/test_volume.py +2 -2
  130. openstackclient/tests/unit/api/test_volume_v2.py +124 -0
  131. openstackclient/tests/unit/api/test_volume_v3.py +124 -0
  132. openstackclient/tests/unit/common/test_command.py +1 -1
  133. openstackclient/tests/unit/common/test_extension.py +2 -3
  134. openstackclient/tests/unit/common/test_module.py +14 -7
  135. openstackclient/tests/unit/common/test_quota.py +20 -0
  136. openstackclient/tests/unit/compute/v2/test_aggregate.py +5 -3
  137. openstackclient/tests/unit/compute/v2/test_console.py +1 -4
  138. openstackclient/tests/unit/compute/v2/test_flavor.py +160 -177
  139. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -9
  140. openstackclient/tests/unit/compute/v2/test_server.py +406 -81
  141. openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -3
  142. openstackclient/tests/unit/compute/v2/test_service.py +1 -3
  143. openstackclient/tests/unit/fakes.py +35 -134
  144. openstackclient/tests/unit/identity/test_common.py +100 -0
  145. openstackclient/tests/unit/identity/v2_0/test_project.py +4 -4
  146. openstackclient/tests/unit/identity/v3/fakes.py +10 -2
  147. openstackclient/tests/unit/identity/v3/test_application_credential.py +50 -44
  148. openstackclient/tests/unit/identity/v3/test_domain.py +3 -3
  149. openstackclient/tests/unit/identity/v3/test_endpoint.py +1 -1
  150. openstackclient/tests/unit/identity/v3/test_group.py +4 -2
  151. openstackclient/tests/unit/identity/v3/test_identity_provider.py +10 -10
  152. openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
  153. openstackclient/tests/unit/identity/v3/test_project.py +31 -54
  154. openstackclient/tests/unit/identity/v3/test_registered_limit.py +2 -2
  155. openstackclient/tests/unit/identity/v3/test_role.py +3 -90
  156. openstackclient/tests/unit/identity/v3/test_user.py +7 -51
  157. openstackclient/tests/unit/image/v1/test_image.py +47 -0
  158. openstackclient/tests/unit/image/v2/test_image.py +190 -9
  159. openstackclient/tests/unit/image/v2/test_metadef_objects.py +22 -0
  160. openstackclient/tests/unit/image/v2/test_metadef_properties.py +24 -10
  161. openstackclient/tests/unit/network/test_common.py +9 -13
  162. openstackclient/tests/unit/network/v2/fakes.py +1 -0
  163. openstackclient/tests/unit/network/v2/taas/__init__.py +0 -0
  164. openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py +276 -0
  165. openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py +288 -0
  166. openstackclient/tests/unit/network/v2/taas/test_osc_tap_service.py +271 -0
  167. openstackclient/tests/unit/network/v2/test_address_group.py +19 -22
  168. openstackclient/tests/unit/network/v2/test_address_scope.py +10 -15
  169. openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +38 -49
  170. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +21 -27
  171. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +21 -18
  172. openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -8
  173. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +6 -15
  174. openstackclient/tests/unit/network/v2/test_local_ip.py +12 -23
  175. openstackclient/tests/unit/network/v2/test_local_ip_association.py +13 -18
  176. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +13 -23
  177. openstackclient/tests/unit/network/v2/test_network.py +41 -37
  178. openstackclient/tests/unit/network/v2/test_network_agent.py +13 -20
  179. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +5 -8
  180. openstackclient/tests/unit/network/v2/test_network_flavor.py +14 -26
  181. openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +14 -17
  182. openstackclient/tests/unit/network/v2/test_network_meter.py +7 -17
  183. openstackclient/tests/unit/network/v2/test_network_meter_rule.py +10 -20
  184. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +7 -13
  185. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +44 -54
  186. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +2 -7
  187. openstackclient/tests/unit/network/v2/test_network_rbac.py +21 -36
  188. openstackclient/tests/unit/network/v2/test_network_segment.py +13 -29
  189. openstackclient/tests/unit/network/v2/test_network_segment_range.py +20 -19
  190. openstackclient/tests/unit/network/v2/test_network_service_provider.py +1 -4
  191. openstackclient/tests/unit/network/v2/test_network_trunk.py +52 -47
  192. openstackclient/tests/unit/network/v2/test_port.py +113 -84
  193. openstackclient/tests/unit/network/v2/test_router.py +104 -126
  194. openstackclient/tests/unit/network/v2/test_security_group_network.py +25 -26
  195. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +66 -18
  196. openstackclient/tests/unit/network/v2/test_subnet.py +35 -46
  197. openstackclient/tests/unit/network/v2/test_subnet_pool.py +21 -33
  198. openstackclient/tests/unit/volume/test_find_resource.py +4 -13
  199. openstackclient/tests/unit/volume/v2/test_volume.py +358 -305
  200. openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
  201. openstackclient/tests/unit/volume/v3/test_volume.py +443 -415
  202. openstackclient/tests/unit/volume/v3/test_volume_backup.py +9 -0
  203. openstackclient/volume/client.py +7 -17
  204. openstackclient/volume/v2/backup_record.py +1 -1
  205. openstackclient/volume/v2/consistency_group.py +1 -1
  206. openstackclient/volume/v2/consistency_group_snapshot.py +1 -1
  207. openstackclient/volume/v2/qos_specs.py +1 -1
  208. openstackclient/volume/v2/service.py +2 -2
  209. openstackclient/volume/v2/volume.py +80 -54
  210. openstackclient/volume/v2/volume_backend.py +1 -1
  211. openstackclient/volume/v2/volume_backup.py +5 -3
  212. openstackclient/volume/v2/volume_host.py +1 -2
  213. openstackclient/volume/v2/volume_snapshot.py +2 -2
  214. openstackclient/volume/v2/volume_transfer_request.py +1 -1
  215. openstackclient/volume/v2/volume_type.py +11 -6
  216. openstackclient/volume/v3/block_storage_cleanup.py +1 -1
  217. openstackclient/volume/v3/block_storage_cluster.py +1 -1
  218. openstackclient/volume/v3/block_storage_log_level.py +1 -1
  219. openstackclient/volume/v3/block_storage_manage.py +1 -1
  220. openstackclient/volume/v3/block_storage_resource_filter.py +1 -1
  221. openstackclient/volume/v3/service.py +2 -2
  222. openstackclient/volume/v3/volume.py +104 -77
  223. openstackclient/volume/v3/volume_attachment.py +6 -5
  224. openstackclient/volume/v3/volume_backup.py +18 -3
  225. openstackclient/volume/v3/volume_group.py +2 -2
  226. openstackclient/volume/v3/volume_group_snapshot.py +1 -1
  227. openstackclient/volume/v3/volume_group_type.py +1 -1
  228. openstackclient/volume/v3/volume_message.py +1 -1
  229. openstackclient/volume/v3/volume_snapshot.py +2 -2
  230. openstackclient/volume/v3/volume_transfer_request.py +1 -1
  231. openstackclient/volume/v3/volume_type.py +15 -9
  232. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/METADATA +19 -17
  233. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/RECORD +239 -224
  234. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/WHEEL +1 -1
  235. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/entry_points.txt +15 -0
  236. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/AUTHORS +15 -0
  237. python_openstackclient-8.3.0.dist-info/pbr.json +1 -0
  238. openstackclient/tests/unit/common/test_logs.py +0 -221
  239. python_openstackclient-8.1.0.dist-info/pbr.json +0 -1
  240. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/LICENSE +0 -0
  241. {python_openstackclient-8.1.0.dist-info → python_openstackclient-8.3.0.dist-info}/top_level.txt +0 -0
@@ -161,9 +161,7 @@ class TestServerBackupCreate(compute_fakes.TestComputev2):
161
161
 
162
162
  @mock.patch.object(common_utils, 'wait_for_status', return_value=True)
163
163
  def test_server_backup_wait_ok(self, mock_wait_for_status):
164
- self.image_client.get_image = mock.Mock(
165
- side_effect=self.image,
166
- )
164
+ self.image_client.get_image.side_effect = (self.image,)
167
165
 
168
166
  arglist = [
169
167
  '--name',
@@ -77,9 +77,7 @@ class TestServiceDelete(compute_fakes.TestComputev2):
77
77
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
78
78
 
79
79
  delete_mock_result = [None, exceptions.CommandError]
80
- self.compute_client.delete_service = mock.Mock(
81
- side_effect=delete_mock_result
82
- )
80
+ self.compute_client.delete_service.side_effect = delete_mock_result
83
81
 
84
82
  try:
85
83
  self.cmd.take_action(parsed_args)
@@ -12,13 +12,43 @@
12
12
  # License for the specific language governing permissions and limitations
13
13
  # under the License.
14
14
 
15
+ # TODO(stephenfin): Remove the contents of this module in favour of the osc_lib
16
+ # version once our min version is bumped to 4.3.0
17
+
15
18
  import json
16
- import sys
17
19
  from unittest import mock
18
20
 
19
21
  from keystoneauth1 import fixture
22
+ from osc_lib.tests.fakes import (
23
+ FakeApp,
24
+ FakeClientManager as BaseFakeClientManager,
25
+ FakeLog,
26
+ FakeOptions,
27
+ FakeResource as BaseFakeResource,
28
+ FakeStdout,
29
+ )
20
30
  import requests
21
31
 
32
+ __all__ = [
33
+ 'AUTH_TOKEN',
34
+ 'AUTH_URL',
35
+ 'INTERFACE',
36
+ 'PASSWORD',
37
+ 'PROJECT_NAME',
38
+ 'REGION_NAME',
39
+ 'TEST_RESPONSE_DICT',
40
+ 'TEST_RESPONSE_DICT_V3',
41
+ 'TEST_VERSIONS',
42
+ 'USERNAME',
43
+ 'VERSION',
44
+ 'FakeApp',
45
+ 'FakeClientManager',
46
+ 'FakeLog',
47
+ 'FakeOptions',
48
+ 'FakeResource',
49
+ 'FakeResponse',
50
+ 'FakeStdout',
51
+ ]
22
52
 
23
53
  AUTH_TOKEN = "foobar"
24
54
  AUTH_URL = "http://0.0.0.0"
@@ -47,79 +77,15 @@ TEST_RESPONSE_DICT_V3.set_project_scope()
47
77
  TEST_VERSIONS = fixture.DiscoveryList(href=AUTH_URL)
48
78
 
49
79
 
50
- class FakeStdout:
51
- def __init__(self):
52
- self.content = []
53
-
54
- def write(self, text):
55
- self.content.append(text)
56
-
57
- def make_string(self):
58
- result = ''
59
- for line in self.content:
60
- result = result + line
61
- return result
62
-
63
-
64
- class FakeLog:
65
- def __init__(self):
66
- self.messages = {}
67
-
68
- def debug(self, msg):
69
- self.messages['debug'] = msg
70
-
71
- def info(self, msg):
72
- self.messages['info'] = msg
73
-
74
- def warning(self, msg):
75
- self.messages['warning'] = msg
76
-
77
- def error(self, msg):
78
- self.messages['error'] = msg
79
-
80
- def critical(self, msg):
81
- self.messages['critical'] = msg
82
-
83
-
84
- class FakeApp:
85
- def __init__(self, _stdout, _log):
86
- self.stdout = _stdout
87
- self.client_manager = None
88
- self.api_version = {}
89
- self.stdin = sys.stdin
90
- self.stdout = _stdout or sys.stdout
91
- self.stderr = sys.stderr
92
- self.log = _log
93
-
94
-
95
- class FakeOptions:
96
- def __init__(self, **kwargs):
97
- self.os_beta_command = False
98
-
99
-
100
- class FakeClient:
101
- def __init__(self, **kwargs):
102
- self.endpoint = kwargs['endpoint']
103
- self.token = kwargs['token']
104
-
105
-
106
- class FakeClientManager:
80
+ class FakeClientManager(BaseFakeClientManager):
107
81
  _api_version = {
108
82
  'image': '2',
109
83
  }
110
84
 
111
85
  def __init__(self):
112
- self.compute = None
113
- self.identity = None
114
- self.image = None
115
- self.object_store = None
116
- self.volume = None
117
- self.network = None
118
- self.sdk_connection = mock.Mock()
86
+ super().__init__()
119
87
 
120
- self.session = None
121
- self.auth_ref = None
122
- self.auth_plugin_name = None
88
+ self.sdk_connection = mock.Mock()
123
89
 
124
90
  self.network_endpoint_enabled = True
125
91
  self.compute_endpoint_enabled = True
@@ -158,64 +124,7 @@ class FakeClientManager:
158
124
  return self.volume_endpoint_enabled
159
125
 
160
126
 
161
- class FakeModule:
162
- def __init__(self, name, version):
163
- self.name = name
164
- self.__version__ = version
165
- # Workaround for openstacksdk case
166
- self.version = mock.Mock()
167
- self.version.__version__ = version
168
-
169
-
170
- class FakeResource:
171
- def __init__(self, manager=None, info=None, loaded=False, methods=None):
172
- """Set attributes and methods for a resource.
173
-
174
- :param manager:
175
- The resource manager
176
- :param Dictionary info:
177
- A dictionary with all attributes
178
- :param bool loaded:
179
- True if the resource is loaded in memory
180
- :param Dictionary methods:
181
- A dictionary with all methods
182
- """
183
- info = info or {}
184
- methods = methods or {}
185
-
186
- self.__name__ = type(self).__name__
187
- self.manager = manager
188
- self._info = info
189
- self._add_details(info)
190
- self._add_methods(methods)
191
- self._loaded = loaded
192
-
193
- def _add_details(self, info):
194
- for k, v in info.items():
195
- setattr(self, k, v)
196
-
197
- def _add_methods(self, methods):
198
- """Fake methods with MagicMock objects.
199
-
200
- For each <@key, @value> pairs in methods, add an callable MagicMock
201
- object named @key as an attribute, and set the mock's return_value to
202
- @value. When users access the attribute with (), @value will be
203
- returned, which looks like a function call.
204
- """
205
- for name, ret in methods.items():
206
- method = mock.Mock(return_value=ret)
207
- setattr(self, name, method)
208
-
209
- def __repr__(self):
210
- reprkeys = sorted(
211
- k for k in self.__dict__.keys() if k[0] != '_' and k != 'manager'
212
- )
213
- info = ", ".join(f"{k}={getattr(self, k)}" for k in reprkeys)
214
- return f"<{self.__class__.__name__} {info}>"
215
-
216
- def keys(self):
217
- return self._info.keys()
218
-
127
+ class FakeResource(BaseFakeResource):
219
128
  def to_dict(self):
220
129
  return self._info
221
130
 
@@ -247,11 +156,3 @@ class FakeResponse(requests.Response):
247
156
  self._content = json.dumps(data)
248
157
  if not isinstance(self._content, bytes):
249
158
  self._content = self._content.encode()
250
-
251
-
252
- class FakeModel(dict):
253
- def __getattr__(self, key):
254
- try:
255
- return self[key]
256
- except KeyError:
257
- raise AttributeError(key)
@@ -0,0 +1,100 @@
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
+ from unittest import mock
14
+
15
+ from openstack import exceptions as sdk_exc
16
+ from openstack.identity.v3 import user as _user
17
+ from openstack.test import fakes as sdk_fakes
18
+ from osc_lib import exceptions
19
+
20
+ from openstackclient.identity import common
21
+ from openstackclient.tests.unit import utils as test_utils
22
+
23
+
24
+ class TestFindSDKId(test_utils.TestCase):
25
+ def setUp(self):
26
+ super().setUp()
27
+ self.user = sdk_fakes.generate_fake_resource(_user.User)
28
+ self.identity_sdk_client = mock.Mock()
29
+ self.identity_sdk_client.find_user = mock.Mock()
30
+
31
+ def test_find_sdk_id_validate(self):
32
+ self.identity_sdk_client.find_user.side_effect = [self.user]
33
+
34
+ result = common._find_sdk_id(
35
+ self.identity_sdk_client.find_user,
36
+ name_or_id=self.user.id,
37
+ validate_actor_existence=True,
38
+ )
39
+ self.assertEqual(self.user.id, result)
40
+
41
+ def test_find_sdk_id_no_validate(self):
42
+ self.identity_sdk_client.find_user.side_effect = [self.user]
43
+
44
+ result = common._find_sdk_id(
45
+ self.identity_sdk_client.find_user,
46
+ name_or_id=self.user.id,
47
+ validate_actor_existence=False,
48
+ )
49
+ self.assertEqual(self.user.id, result)
50
+
51
+ def test_find_sdk_id_not_found_validate(self):
52
+ self.identity_sdk_client.find_user.side_effect = [
53
+ sdk_exc.ResourceNotFound,
54
+ ]
55
+
56
+ self.assertRaises(
57
+ exceptions.CommandError,
58
+ common._find_sdk_id,
59
+ self.identity_sdk_client.find_user,
60
+ name_or_id=self.user.id,
61
+ validate_actor_existence=True,
62
+ )
63
+
64
+ def test_find_sdk_id_not_found_no_validate(self):
65
+ self.identity_sdk_client.find_user.side_effect = [
66
+ sdk_exc.ResourceNotFound,
67
+ ]
68
+
69
+ result = common._find_sdk_id(
70
+ self.identity_sdk_client.find_user,
71
+ name_or_id=self.user.id,
72
+ validate_actor_existence=False,
73
+ )
74
+ self.assertEqual(self.user.id, result)
75
+
76
+ def test_find_sdk_id_forbidden_validate(self):
77
+ self.identity_sdk_client.find_user.side_effect = [
78
+ sdk_exc.ForbiddenException,
79
+ ]
80
+
81
+ result = common._find_sdk_id(
82
+ self.identity_sdk_client.find_user,
83
+ name_or_id=self.user.id,
84
+ validate_actor_existence=True,
85
+ )
86
+
87
+ self.assertEqual(self.user.id, result)
88
+
89
+ def test_find_sdk_id_forbidden_no_validate(self):
90
+ self.identity_sdk_client.find_user.side_effect = [
91
+ sdk_exc.ForbiddenException,
92
+ ]
93
+
94
+ result = common._find_sdk_id(
95
+ self.identity_sdk_client.find_user,
96
+ name_or_id=self.user.id,
97
+ validate_actor_existence=False,
98
+ )
99
+
100
+ self.assertEqual(self.user.id, result)
@@ -195,7 +195,7 @@ class TestProjectCreate(TestProject):
195
195
  self.fake_project.name,
196
196
  ]
197
197
  verifylist = [
198
- ('property', {'fee': 'fi', 'fo': 'fum'}),
198
+ ('properties', {'fee': 'fi', 'fo': 'fum'}),
199
199
  ('name', self.fake_project.name),
200
200
  ]
201
201
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -464,7 +464,7 @@ class TestProjectSet(TestProject):
464
464
  ('description', None),
465
465
  ('enable', False),
466
466
  ('disable', False),
467
- ('property', None),
467
+ ('properties', None),
468
468
  ]
469
469
  self.projects_mock.get.side_effect = exceptions.NotFound(None)
470
470
  self.projects_mock.find.side_effect = exceptions.NotFound(None)
@@ -588,7 +588,7 @@ class TestProjectSet(TestProject):
588
588
  self.fake_project.name,
589
589
  ]
590
590
  verifylist = [
591
- ('property', {'fee': 'fi', 'fo': 'fum'}),
591
+ ('properties', {'fee': 'fi', 'fo': 'fum'}),
592
592
  ('project', self.fake_project.name),
593
593
  ]
594
594
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -683,7 +683,7 @@ class TestProjectUnset(TestProject):
683
683
  self.fake_proj.name,
684
684
  ]
685
685
  verifylist = [
686
- ('property', ['fee', 'fo']),
686
+ ('properties', ['fee', 'fo']),
687
687
  ]
688
688
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
689
689
 
@@ -693,6 +693,14 @@ class TestIdentityv3(
693
693
  ): ...
694
694
 
695
695
 
696
+ class FakeModel(dict):
697
+ def __getattr__(self, key):
698
+ try:
699
+ return self[key]
700
+ except KeyError:
701
+ raise AttributeError(key)
702
+
703
+
696
704
  # We don't use FakeClientMixin since we want a different fake legacy client
697
705
  class TestFederatedIdentity(utils.TestCommand):
698
706
  def setUp(self):
@@ -1075,7 +1083,7 @@ class FakeEndpoint:
1075
1083
  # Overwrite default attributes if there are some attributes set
1076
1084
  endpoint_filter_info.update(attrs)
1077
1085
 
1078
- endpoint_filter = fakes.FakeModel(copy.deepcopy(endpoint_filter_info))
1086
+ endpoint_filter = FakeModel(copy.deepcopy(endpoint_filter_info))
1079
1087
 
1080
1088
  return endpoint_filter
1081
1089
 
@@ -1133,7 +1141,7 @@ class FakeEndpointGroup:
1133
1141
  # Overwrite default attributes if there are some attributes set
1134
1142
  endpointgroup_filter_info.update(attrs)
1135
1143
 
1136
- endpointgroup_filter = fakes.FakeModel(
1144
+ endpointgroup_filter = FakeModel(
1137
1145
  copy.deepcopy(endpointgroup_filter_info)
1138
1146
  )
1139
1147
 
@@ -31,18 +31,6 @@ from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
31
31
 
32
32
 
33
33
  class TestApplicationCredentialCreate(identity_fakes.TestIdentityv3):
34
- columns = (
35
- 'id',
36
- 'name',
37
- 'description',
38
- 'project_id',
39
- 'roles',
40
- 'unrestricted',
41
- 'access_rules',
42
- 'expires_at',
43
- 'secret',
44
- )
45
-
46
34
  def setUp(self):
47
35
  super().setUp()
48
36
 
@@ -52,12 +40,25 @@ class TestApplicationCredentialCreate(identity_fakes.TestIdentityv3):
52
40
  roles=[],
53
41
  )
54
42
 
55
- self.datalist = (
43
+ self.columns = (
44
+ 'ID',
45
+ 'Name',
46
+ 'Description',
47
+ 'Project ID',
48
+ 'Roles',
49
+ 'Unrestricted',
50
+ 'Access Rules',
51
+ 'Expires At',
52
+ 'Secret',
53
+ )
54
+ self.data = (
56
55
  self.application_credential.id,
57
56
  self.application_credential.name,
58
57
  self.application_credential.description,
59
58
  self.application_credential.project_id,
60
- self.application_credential.roles,
59
+ application_credential.RolesColumn(
60
+ self.application_credential.roles
61
+ ),
61
62
  self.application_credential.unrestricted,
62
63
  self.application_credential.access_rules,
63
64
  self.application_credential.expires_at,
@@ -101,7 +102,7 @@ class TestApplicationCredentialCreate(identity_fakes.TestIdentityv3):
101
102
  )
102
103
 
103
104
  self.assertEqual(self.columns, columns)
104
- self.assertEqual(self.datalist, data)
105
+ self.assertEqual(self.data, data)
105
106
 
106
107
  def test_application_credential_create_with_options(self):
107
108
  name = self.application_credential.name
@@ -119,7 +120,7 @@ class TestApplicationCredentialCreate(identity_fakes.TestIdentityv3):
119
120
  verifylist = [
120
121
  ('name', self.application_credential.name),
121
122
  ('secret', 'moresecuresecret'),
122
- ('role', [self.roles.id]),
123
+ ('roles', [self.roles.id]),
123
124
  ('expiration', '2024-01-01T00:00:00'),
124
125
  ('description', 'credential for testing'),
125
126
  ]
@@ -147,7 +148,7 @@ class TestApplicationCredentialCreate(identity_fakes.TestIdentityv3):
147
148
  )
148
149
 
149
150
  self.assertEqual(self.columns, columns)
150
- self.assertEqual(self.datalist, data)
151
+ self.assertEqual(self.data, data)
151
152
 
152
153
  def test_application_credential_create_with_access_rules_string(self):
153
154
  name = self.application_credential.name
@@ -191,7 +192,7 @@ class TestApplicationCredentialCreate(identity_fakes.TestIdentityv3):
191
192
  )
192
193
 
193
194
  self.assertEqual(self.columns, columns)
194
- self.assertEqual(self.datalist, data)
195
+ self.assertEqual(self.data, data)
195
196
 
196
197
  @mock.patch('openstackclient.identity.v3.application_credential.json.load')
197
198
  @mock.patch('openstackclient.identity.v3.application_credential.open')
@@ -231,7 +232,7 @@ class TestApplicationCredentialCreate(identity_fakes.TestIdentityv3):
231
232
  )
232
233
 
233
234
  self.assertEqual(self.columns, columns)
234
- self.assertEqual(self.datalist, data)
235
+ self.assertEqual(self.data, data)
235
236
 
236
237
 
237
238
  class TestApplicationCredentialDelete(identity_fakes.TestIdentityv3):
@@ -301,7 +302,7 @@ class TestApplicationCredentialDelete(identity_fakes.TestIdentityv3):
301
302
 
302
303
  calls = []
303
304
  for a in arglist:
304
- calls.append(call(user_id, a))
305
+ calls.append(call(user_id, a, ignore_missing=False))
305
306
 
306
307
  self.identity_sdk_client.find_application_credential.assert_has_calls(
307
308
  calls
@@ -345,7 +346,9 @@ class TestApplicationCredentialList(identity_fakes.TestIdentityv3):
345
346
  self.application_credential.name,
346
347
  self.application_credential.description,
347
348
  self.application_credential.project_id,
348
- '',
349
+ application_credential.RolesColumn(
350
+ self.application_credential.roles
351
+ ),
349
352
  self.application_credential.unrestricted,
350
353
  self.application_credential.access_rules,
351
354
  self.application_credential.expires_at,
@@ -408,6 +411,29 @@ class TestApplicationCredentialShow(identity_fakes.TestIdentityv3):
408
411
  self.application_credential
409
412
  )
410
413
 
414
+ self.columns = (
415
+ 'ID',
416
+ 'Name',
417
+ 'Description',
418
+ 'Project ID',
419
+ 'Roles',
420
+ 'Unrestricted',
421
+ 'Access Rules',
422
+ 'Expires At',
423
+ )
424
+ self.data = (
425
+ self.application_credential.id,
426
+ self.application_credential.name,
427
+ self.application_credential.description,
428
+ self.application_credential.project_id,
429
+ application_credential.RolesColumn(
430
+ self.application_credential.roles
431
+ ),
432
+ self.application_credential.unrestricted,
433
+ self.application_credential.access_rules,
434
+ self.application_credential.expires_at,
435
+ )
436
+
411
437
  # Get the command object to test
412
438
  self.cmd = application_credential.ShowApplicationCredential(
413
439
  self.app, None
@@ -431,28 +457,8 @@ class TestApplicationCredentialShow(identity_fakes.TestIdentityv3):
431
457
  columns, data = self.cmd.take_action(parsed_args)
432
458
 
433
459
  self.identity_sdk_client.find_application_credential.assert_called_with(
434
- user_id, self.application_credential.id
460
+ user_id, self.application_credential.id, ignore_missing=False
435
461
  )
436
462
 
437
- collist = (
438
- 'id',
439
- 'name',
440
- 'description',
441
- 'project_id',
442
- 'roles',
443
- 'unrestricted',
444
- 'access_rules',
445
- 'expires_at',
446
- )
447
- self.assertEqual(collist, columns)
448
- datalist = (
449
- self.application_credential.id,
450
- self.application_credential.name,
451
- self.application_credential.description,
452
- self.application_credential.project_id,
453
- self.application_credential.roles,
454
- self.application_credential.unrestricted,
455
- self.application_credential.access_rules,
456
- self.application_credential.expires_at,
457
- )
458
- self.assertEqual(datalist, data)
463
+ self.assertEqual(self.columns, columns)
464
+ self.assertEqual(self.data, data)
@@ -186,7 +186,7 @@ class TestDomainCreate(identity_fakes.TestIdentityv3):
186
186
  self.domain.name,
187
187
  ]
188
188
  verifylist = [
189
- ('no_immutable', True),
189
+ ('immutable', False),
190
190
  ('name', self.domain.name),
191
191
  ]
192
192
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -461,7 +461,7 @@ class TestDomainSet(identity_fakes.TestIdentityv3):
461
461
  self.domain.id,
462
462
  ]
463
463
  verifylist = [
464
- ('no_immutable', True),
464
+ ('immutable', False),
465
465
  ('domain', self.domain.id),
466
466
  ]
467
467
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -520,7 +520,7 @@ class TestDomainShow(identity_fakes.TestIdentityv3):
520
520
  # data to be shown.
521
521
  columns, data = self.cmd.take_action(parsed_args)
522
522
  self.identity_sdk_client.find_domain.assert_called_with(
523
- self.domain.id,
523
+ self.domain.id, ignore_missing=False
524
524
  )
525
525
 
526
526
  self.assertEqual(self.columns, columns)
@@ -678,7 +678,7 @@ class TestEndpointShow(identity_fakes.TestIdentityv3):
678
678
  # data to be shown.
679
679
  columns, data = self.cmd.take_action(parsed_args)
680
680
  self.identity_sdk_client.find_endpoint.assert_called_with(
681
- self.endpoint.id,
681
+ self.endpoint.id, ignore_missing=False
682
682
  )
683
683
 
684
684
  collist = (
@@ -253,7 +253,7 @@ class TestGroupCreate(identity_fakes.TestIdentityv3):
253
253
 
254
254
  columns, data = self.cmd.take_action(parsed_args)
255
255
  self.identity_sdk_client.find_group.assert_called_once_with(
256
- self.group.name
256
+ self.group.name, ignore_missing=False
257
257
  )
258
258
  self.assertEqual(self.columns, columns)
259
259
  datalist = (
@@ -286,7 +286,9 @@ class TestGroupCreate(identity_fakes.TestIdentityv3):
286
286
 
287
287
  columns, data = self.cmd.take_action(parsed_args)
288
288
  self.identity_sdk_client.find_group.assert_called_once_with(
289
- self.group_with_options.name, domain_id=self.domain.id
289
+ self.group_with_options.name,
290
+ domain_id=self.domain.id,
291
+ ignore_missing=False,
290
292
  )
291
293
  self.assertEqual(self.columns, columns)
292
294
  datalist = (