python-openstackclient 8.2.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 (226) hide show
  1. openstackclient/api/object_store_v1.py +4 -1
  2. openstackclient/command.py +27 -0
  3. openstackclient/common/availability_zone.py +1 -1
  4. openstackclient/common/clientmanager.py +59 -21
  5. openstackclient/common/configuration.py +1 -1
  6. openstackclient/common/extension.py +1 -1
  7. openstackclient/common/limits.py +1 -1
  8. openstackclient/common/module.py +4 -2
  9. openstackclient/common/project_cleanup.py +10 -8
  10. openstackclient/common/quota.py +23 -6
  11. openstackclient/common/versions.py +1 -2
  12. openstackclient/compute/v2/agent.py +1 -1
  13. openstackclient/compute/v2/aggregate.py +6 -5
  14. openstackclient/compute/v2/console.py +5 -3
  15. openstackclient/compute/v2/console_connection.py +1 -1
  16. openstackclient/compute/v2/flavor.py +1 -1
  17. openstackclient/compute/v2/host.py +1 -1
  18. openstackclient/compute/v2/hypervisor.py +1 -1
  19. openstackclient/compute/v2/hypervisor_stats.py +1 -1
  20. openstackclient/compute/v2/keypair.py +1 -1
  21. openstackclient/compute/v2/server.py +76 -27
  22. openstackclient/compute/v2/server_backup.py +1 -1
  23. openstackclient/compute/v2/server_event.py +1 -1
  24. openstackclient/compute/v2/server_group.py +4 -2
  25. openstackclient/compute/v2/server_image.py +1 -1
  26. openstackclient/compute/v2/server_migration.py +1 -1
  27. openstackclient/compute/v2/server_volume.py +1 -1
  28. openstackclient/compute/v2/service.py +1 -1
  29. openstackclient/compute/v2/usage.py +6 -4
  30. openstackclient/identity/common.py +2 -1
  31. openstackclient/identity/v2_0/catalog.py +3 -2
  32. openstackclient/identity/v2_0/ec2creds.py +1 -1
  33. openstackclient/identity/v2_0/endpoint.py +1 -1
  34. openstackclient/identity/v2_0/project.py +17 -7
  35. openstackclient/identity/v2_0/role.py +1 -1
  36. openstackclient/identity/v2_0/role_assignment.py +3 -3
  37. openstackclient/identity/v2_0/service.py +1 -1
  38. openstackclient/identity/v2_0/token.py +1 -1
  39. openstackclient/identity/v2_0/user.py +2 -2
  40. openstackclient/identity/v3/access_rule.py +16 -4
  41. openstackclient/identity/v3/application_credential.py +30 -10
  42. openstackclient/identity/v3/catalog.py +3 -3
  43. openstackclient/identity/v3/consumer.py +1 -1
  44. openstackclient/identity/v3/credential.py +1 -1
  45. openstackclient/identity/v3/domain.py +10 -4
  46. openstackclient/identity/v3/ec2creds.py +1 -1
  47. openstackclient/identity/v3/endpoint.py +33 -12
  48. openstackclient/identity/v3/endpoint_group.py +1 -1
  49. openstackclient/identity/v3/federation_protocol.py +1 -1
  50. openstackclient/identity/v3/group.py +11 -5
  51. openstackclient/identity/v3/identity_provider.py +12 -10
  52. openstackclient/identity/v3/implied_role.py +1 -1
  53. openstackclient/identity/v3/limit.py +1 -1
  54. openstackclient/identity/v3/mapping.py +1 -1
  55. openstackclient/identity/v3/policy.py +1 -1
  56. openstackclient/identity/v3/project.py +10 -3
  57. openstackclient/identity/v3/region.py +1 -1
  58. openstackclient/identity/v3/registered_limit.py +16 -11
  59. openstackclient/identity/v3/role.py +20 -39
  60. openstackclient/identity/v3/role_assignment.py +12 -23
  61. openstackclient/identity/v3/service.py +1 -1
  62. openstackclient/identity/v3/service_provider.py +1 -1
  63. openstackclient/identity/v3/tag.py +3 -2
  64. openstackclient/identity/v3/token.py +3 -2
  65. openstackclient/identity/v3/trust.py +4 -2
  66. openstackclient/identity/v3/unscoped_saml.py +1 -1
  67. openstackclient/identity/v3/user.py +22 -13
  68. openstackclient/image/v1/image.py +19 -16
  69. openstackclient/image/v2/cache.py +1 -1
  70. openstackclient/image/v2/image.py +14 -11
  71. openstackclient/image/v2/info.py +1 -1
  72. openstackclient/image/v2/metadef_namespaces.py +1 -1
  73. openstackclient/image/v2/metadef_objects.py +1 -1
  74. openstackclient/image/v2/metadef_properties.py +3 -2
  75. openstackclient/image/v2/metadef_resource_type_association.py +1 -1
  76. openstackclient/image/v2/metadef_resource_types.py +1 -1
  77. openstackclient/image/v2/task.py +1 -1
  78. openstackclient/network/common.py +10 -9
  79. openstackclient/network/v2/address_group.py +4 -3
  80. openstackclient/network/v2/address_scope.py +8 -6
  81. openstackclient/network/v2/default_security_group_rule.py +9 -8
  82. openstackclient/network/v2/floating_ip.py +16 -9
  83. openstackclient/network/v2/floating_ip_port_forwarding.py +9 -6
  84. openstackclient/network/v2/ip_availability.py +7 -4
  85. openstackclient/network/v2/l3_conntrack_helper.py +11 -4
  86. openstackclient/network/v2/local_ip.py +13 -7
  87. openstackclient/network/v2/local_ip_association.py +7 -4
  88. openstackclient/network/v2/ndp_proxy.py +13 -6
  89. openstackclient/network/v2/network.py +33 -16
  90. openstackclient/network/v2/network_agent.py +5 -5
  91. openstackclient/network/v2/network_auto_allocated_topology.py +1 -1
  92. openstackclient/network/v2/network_flavor.py +1 -1
  93. openstackclient/network/v2/network_flavor_profile.py +1 -1
  94. openstackclient/network/v2/network_meter.py +1 -1
  95. openstackclient/network/v2/network_meter_rule.py +1 -1
  96. openstackclient/network/v2/network_qos_policy.py +7 -5
  97. openstackclient/network/v2/network_qos_rule.py +1 -1
  98. openstackclient/network/v2/network_qos_rule_type.py +1 -1
  99. openstackclient/network/v2/network_rbac.py +8 -5
  100. openstackclient/network/v2/network_segment.py +2 -2
  101. openstackclient/network/v2/network_segment_range.py +13 -6
  102. openstackclient/network/v2/network_service_provider.py +1 -1
  103. openstackclient/network/v2/network_trunk.py +65 -42
  104. openstackclient/network/v2/port.py +22 -20
  105. openstackclient/network/v2/router.py +19 -8
  106. openstackclient/network/v2/security_group.py +10 -6
  107. openstackclient/network/v2/security_group_rule.py +11 -5
  108. openstackclient/network/v2/subnet.py +17 -18
  109. openstackclient/network/v2/subnet_pool.py +11 -9
  110. openstackclient/network/v2/taas/__init__.py +0 -0
  111. openstackclient/network/v2/taas/tap_flow.py +245 -0
  112. openstackclient/network/v2/taas/tap_mirror.py +237 -0
  113. openstackclient/network/v2/taas/tap_service.py +211 -0
  114. openstackclient/object/v1/account.py +1 -1
  115. openstackclient/object/v1/container.py +1 -1
  116. openstackclient/object/v1/object.py +1 -1
  117. openstackclient/shell.py +18 -8
  118. openstackclient/tests/functional/identity/v3/test_catalog.py +42 -23
  119. openstackclient/tests/functional/identity/v3/test_role_assignment.py +174 -0
  120. openstackclient/tests/functional/image/v2/test_cache.py +54 -0
  121. openstackclient/tests/functional/image/v2/test_metadef_resource_type.py +55 -0
  122. openstackclient/tests/unit/common/test_command.py +1 -1
  123. openstackclient/tests/unit/common/test_extension.py +2 -3
  124. openstackclient/tests/unit/common/test_module.py +14 -7
  125. openstackclient/tests/unit/common/test_quota.py +20 -0
  126. openstackclient/tests/unit/compute/v2/test_aggregate.py +5 -3
  127. openstackclient/tests/unit/compute/v2/test_console.py +1 -4
  128. openstackclient/tests/unit/compute/v2/test_flavor.py +1 -3
  129. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -9
  130. openstackclient/tests/unit/compute/v2/test_server.py +364 -30
  131. openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -3
  132. openstackclient/tests/unit/compute/v2/test_service.py +1 -3
  133. openstackclient/tests/unit/fakes.py +35 -134
  134. openstackclient/tests/unit/identity/test_common.py +100 -0
  135. openstackclient/tests/unit/identity/v2_0/test_project.py +4 -4
  136. openstackclient/tests/unit/identity/v3/fakes.py +10 -2
  137. openstackclient/tests/unit/identity/v3/test_application_credential.py +3 -3
  138. openstackclient/tests/unit/identity/v3/test_domain.py +1 -1
  139. openstackclient/tests/unit/identity/v3/test_endpoint.py +1 -1
  140. openstackclient/tests/unit/identity/v3/test_group.py +4 -2
  141. openstackclient/tests/unit/identity/v3/test_identity_provider.py +10 -10
  142. openstackclient/tests/unit/identity/v3/test_oauth.py +1 -1
  143. openstackclient/tests/unit/identity/v3/test_project.py +1 -1
  144. openstackclient/tests/unit/identity/v3/test_registered_limit.py +2 -2
  145. openstackclient/tests/unit/identity/v3/test_role.py +1 -82
  146. openstackclient/tests/unit/identity/v3/test_user.py +7 -51
  147. openstackclient/tests/unit/image/v2/test_image.py +111 -0
  148. openstackclient/tests/unit/network/test_common.py +9 -13
  149. openstackclient/tests/unit/network/v2/taas/__init__.py +0 -0
  150. openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py +276 -0
  151. openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py +288 -0
  152. openstackclient/tests/unit/network/v2/taas/test_osc_tap_service.py +271 -0
  153. openstackclient/tests/unit/network/v2/test_address_group.py +19 -22
  154. openstackclient/tests/unit/network/v2/test_address_scope.py +10 -15
  155. openstackclient/tests/unit/network/v2/test_default_security_group_rule.py +38 -49
  156. openstackclient/tests/unit/network/v2/test_floating_ip_network.py +21 -27
  157. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +21 -18
  158. openstackclient/tests/unit/network/v2/test_ip_availability.py +6 -8
  159. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +6 -15
  160. openstackclient/tests/unit/network/v2/test_local_ip.py +12 -23
  161. openstackclient/tests/unit/network/v2/test_local_ip_association.py +13 -18
  162. openstackclient/tests/unit/network/v2/test_ndp_proxy.py +11 -21
  163. openstackclient/tests/unit/network/v2/test_network.py +41 -37
  164. openstackclient/tests/unit/network/v2/test_network_agent.py +13 -20
  165. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +5 -8
  166. openstackclient/tests/unit/network/v2/test_network_flavor.py +14 -26
  167. openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +14 -17
  168. openstackclient/tests/unit/network/v2/test_network_meter.py +7 -17
  169. openstackclient/tests/unit/network/v2/test_network_meter_rule.py +10 -20
  170. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +7 -13
  171. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +44 -54
  172. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +2 -7
  173. openstackclient/tests/unit/network/v2/test_network_rbac.py +21 -36
  174. openstackclient/tests/unit/network/v2/test_network_segment.py +13 -29
  175. openstackclient/tests/unit/network/v2/test_network_segment_range.py +20 -19
  176. openstackclient/tests/unit/network/v2/test_network_service_provider.py +1 -4
  177. openstackclient/tests/unit/network/v2/test_network_trunk.py +52 -47
  178. openstackclient/tests/unit/network/v2/test_port.py +75 -86
  179. openstackclient/tests/unit/network/v2/test_router.py +104 -126
  180. openstackclient/tests/unit/network/v2/test_security_group_network.py +19 -26
  181. openstackclient/tests/unit/network/v2/test_security_group_rule_network.py +17 -18
  182. openstackclient/tests/unit/network/v2/test_subnet.py +35 -46
  183. openstackclient/tests/unit/network/v2/test_subnet_pool.py +21 -33
  184. openstackclient/tests/unit/volume/test_find_resource.py +4 -13
  185. openstackclient/tests/unit/volume/v2/test_volume_backup.py +3 -1
  186. openstackclient/tests/unit/volume/v3/test_volume.py +4 -0
  187. openstackclient/tests/unit/volume/v3/test_volume_backup.py +9 -0
  188. openstackclient/volume/client.py +7 -17
  189. openstackclient/volume/v2/backup_record.py +1 -1
  190. openstackclient/volume/v2/consistency_group.py +1 -1
  191. openstackclient/volume/v2/consistency_group_snapshot.py +1 -1
  192. openstackclient/volume/v2/qos_specs.py +1 -1
  193. openstackclient/volume/v2/service.py +1 -1
  194. openstackclient/volume/v2/volume.py +2 -2
  195. openstackclient/volume/v2/volume_backend.py +1 -1
  196. openstackclient/volume/v2/volume_backup.py +5 -3
  197. openstackclient/volume/v2/volume_host.py +1 -2
  198. openstackclient/volume/v2/volume_snapshot.py +2 -2
  199. openstackclient/volume/v2/volume_transfer_request.py +1 -1
  200. openstackclient/volume/v2/volume_type.py +11 -6
  201. openstackclient/volume/v3/block_storage_cleanup.py +1 -1
  202. openstackclient/volume/v3/block_storage_cluster.py +1 -1
  203. openstackclient/volume/v3/block_storage_log_level.py +1 -1
  204. openstackclient/volume/v3/block_storage_manage.py +1 -1
  205. openstackclient/volume/v3/block_storage_resource_filter.py +1 -1
  206. openstackclient/volume/v3/service.py +1 -1
  207. openstackclient/volume/v3/volume.py +2 -2
  208. openstackclient/volume/v3/volume_attachment.py +6 -5
  209. openstackclient/volume/v3/volume_backup.py +18 -3
  210. openstackclient/volume/v3/volume_group.py +1 -1
  211. openstackclient/volume/v3/volume_group_snapshot.py +1 -1
  212. openstackclient/volume/v3/volume_group_type.py +1 -1
  213. openstackclient/volume/v3/volume_message.py +1 -1
  214. openstackclient/volume/v3/volume_snapshot.py +2 -2
  215. openstackclient/volume/v3/volume_transfer_request.py +1 -1
  216. openstackclient/volume/v3/volume_type.py +15 -9
  217. {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/METADATA +15 -13
  218. {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/RECORD +224 -213
  219. {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/WHEEL +1 -1
  220. {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/entry_points.txt +15 -0
  221. {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/AUTHORS +10 -0
  222. python_openstackclient-8.3.0.dist-info/pbr.json +1 -0
  223. openstackclient/tests/unit/common/test_logs.py +0 -221
  224. python_openstackclient-8.2.0.dist-info/pbr.json +0 -1
  225. {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info/licenses}/LICENSE +0 -0
  226. {python_openstackclient-8.2.0.dist-info → python_openstackclient-8.3.0.dist-info}/top_level.txt +0 -0
@@ -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
 
@@ -120,7 +120,7 @@ class TestApplicationCredentialCreate(identity_fakes.TestIdentityv3):
120
120
  verifylist = [
121
121
  ('name', self.application_credential.name),
122
122
  ('secret', 'moresecuresecret'),
123
- ('role', [self.roles.id]),
123
+ ('roles', [self.roles.id]),
124
124
  ('expiration', '2024-01-01T00:00:00'),
125
125
  ('description', 'credential for testing'),
126
126
  ]
@@ -302,7 +302,7 @@ class TestApplicationCredentialDelete(identity_fakes.TestIdentityv3):
302
302
 
303
303
  calls = []
304
304
  for a in arglist:
305
- calls.append(call(user_id, a))
305
+ calls.append(call(user_id, a, ignore_missing=False))
306
306
 
307
307
  self.identity_sdk_client.find_application_credential.assert_has_calls(
308
308
  calls
@@ -457,7 +457,7 @@ class TestApplicationCredentialShow(identity_fakes.TestIdentityv3):
457
457
  columns, data = self.cmd.take_action(parsed_args)
458
458
 
459
459
  self.identity_sdk_client.find_application_credential.assert_called_with(
460
- user_id, self.application_credential.id
460
+ user_id, self.application_credential.id, ignore_missing=False
461
461
  )
462
462
 
463
463
  self.assertEqual(self.columns, columns)
@@ -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 = (
@@ -127,7 +127,7 @@ class TestIdentityProviderCreate(TestIdentityProvider):
127
127
  ]
128
128
  verifylist = [
129
129
  ('identity_provider_id', identity_fakes.idp_id),
130
- ('remote_id', identity_fakes.idp_remote_ids[:1]),
130
+ ('remote_ids', identity_fakes.idp_remote_ids[:1]),
131
131
  ]
132
132
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
133
133
  columns, data = self.cmd.take_action(parsed_args)
@@ -157,7 +157,7 @@ class TestIdentityProviderCreate(TestIdentityProvider):
157
157
  ]
158
158
  verifylist = [
159
159
  ('identity_provider_id', identity_fakes.idp_id),
160
- ('remote_id', identity_fakes.idp_remote_ids),
160
+ ('remote_ids', identity_fakes.idp_remote_ids),
161
161
  ]
162
162
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
163
163
  columns, data = self.cmd.take_action(parsed_args)
@@ -561,7 +561,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
561
561
  ('description', new_description),
562
562
  ('enable', False),
563
563
  ('disable', False),
564
- ('remote_id', None),
564
+ ('remote_ids', None),
565
565
  ]
566
566
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
567
567
  self.cmd.take_action(parsed_args)
@@ -597,7 +597,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
597
597
  ('description', None),
598
598
  ('enable', False),
599
599
  ('disable', True),
600
- ('remote_id', identity_fakes.idp_remote_ids),
600
+ ('remote_ids', identity_fakes.idp_remote_ids),
601
601
  ]
602
602
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
603
603
 
@@ -637,7 +637,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
637
637
  ('description', None),
638
638
  ('enable', True),
639
639
  ('disable', False),
640
- ('remote_id', identity_fakes.idp_remote_ids),
640
+ ('remote_ids', identity_fakes.idp_remote_ids),
641
641
  ]
642
642
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
643
643
 
@@ -675,7 +675,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
675
675
  ('description', None),
676
676
  ('enable', True),
677
677
  ('disable', False),
678
- ('remote_id', [self.new_remote_id]),
678
+ ('remote_ids', [self.new_remote_id]),
679
679
  ]
680
680
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
681
681
 
@@ -756,7 +756,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
756
756
  ('identity_provider', identity_fakes.idp_id),
757
757
  ('enable', False),
758
758
  ('disable', False),
759
- ('remote_id', None),
759
+ ('remote_ids', None),
760
760
  ]
761
761
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
762
762
 
@@ -776,7 +776,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
776
776
  ('identity_provider', identity_fakes.idp_id),
777
777
  ('enable', False),
778
778
  ('disable', False),
779
- ('remote_id', None),
779
+ ('remote_ids', None),
780
780
  ('authorization_ttl', 60),
781
781
  ]
782
782
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -800,7 +800,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
800
800
  ('identity_provider', identity_fakes.idp_id),
801
801
  ('enable', False),
802
802
  ('disable', False),
803
- ('remote_id', None),
803
+ ('remote_ids', None),
804
804
  ('authorization_ttl', 0),
805
805
  ]
806
806
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -816,7 +816,7 @@ class TestIdentityProviderSet(TestIdentityProvider):
816
816
  ('identity_provider', identity_fakes.idp_id),
817
817
  ('enable', False),
818
818
  ('disable', False),
819
- ('remote_id', None),
819
+ ('remote_ids', None),
820
820
  ('authorization_ttl', -1),
821
821
  ]
822
822
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -109,7 +109,7 @@ class TestRequestTokenAuthorize(TestOAuth1):
109
109
  ]
110
110
  verifylist = [
111
111
  ('request_key', identity_fakes.request_token_id),
112
- ('role', [identity_fakes.role_name]),
112
+ ('roles', [identity_fakes.role_name]),
113
113
  ]
114
114
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
115
115
  columns, data = self.cmd.take_action(parsed_args)
@@ -1142,7 +1142,7 @@ class TestProjectSet(TestProject):
1142
1142
  verifylist = [
1143
1143
  ('enabled', None),
1144
1144
  ('project', self.project.name),
1145
- ('remove_tag', ['tag1', 'tag2']),
1145
+ ('remove_tags', ['tag1', 'tag2']),
1146
1146
  ]
1147
1147
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1148
1148
 
@@ -168,7 +168,7 @@ class TestRegisteredLimitDelete(TestRegisteredLimit):
168
168
 
169
169
  arglist = [identity_fakes.registered_limit_id]
170
170
  verifylist = [
171
- ('registered_limit_id', [identity_fakes.registered_limit_id])
171
+ ('registered_limits', [identity_fakes.registered_limit_id])
172
172
  ]
173
173
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
174
174
 
@@ -184,7 +184,7 @@ class TestRegisteredLimitDelete(TestRegisteredLimit):
184
184
  self.registered_limit_mock.delete.side_effect = return_value
185
185
 
186
186
  arglist = ['fake-registered-limit-id']
187
- verifylist = [('registered_limit_id', ['fake-registered-limit-id'])]
187
+ verifylist = [('registered_limits', ['fake-registered-limit-id'])]
188
188
  parsed_args = self.check_parser(self.cmd, arglist, verifylist)
189
189
 
190
190
  try:
@@ -15,8 +15,6 @@
15
15
 
16
16
  from unittest import mock
17
17
 
18
- from osc_lib import exceptions
19
-
20
18
  from openstack import exceptions as sdk_exc
21
19
  from openstack.identity.v3 import domain as _domain
22
20
  from openstack.identity.v3 import group as _group
@@ -25,10 +23,10 @@ from openstack.identity.v3 import role as _role
25
23
  from openstack.identity.v3 import system as _system
26
24
  from openstack.identity.v3 import user as _user
27
25
  from openstack.test import fakes as sdk_fakes
26
+ from osc_lib import exceptions
28
27
 
29
28
  from openstackclient.identity.v3 import role
30
29
  from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
31
- from openstackclient.tests.unit import utils as test_utils
32
30
 
33
31
 
34
32
  class TestRoleInherited(identity_fakes.TestIdentityv3):
@@ -36,85 +34,6 @@ class TestRoleInherited(identity_fakes.TestIdentityv3):
36
34
  return True
37
35
 
38
36
 
39
- class TestFindSDKId(test_utils.TestCase):
40
- def setUp(self):
41
- super().setUp()
42
- self.user = sdk_fakes.generate_fake_resource(_user.User)
43
- self.identity_sdk_client = mock.Mock()
44
- self.identity_sdk_client.find_user = mock.Mock()
45
-
46
- def test_find_sdk_id_validate(self):
47
- self.identity_sdk_client.find_user.side_effect = [self.user]
48
-
49
- result = role._find_sdk_id(
50
- self.identity_sdk_client.find_user,
51
- name_or_id=self.user.id,
52
- validate_actor_existence=True,
53
- )
54
- self.assertEqual(self.user.id, result)
55
-
56
- def test_find_sdk_id_no_validate(self):
57
- self.identity_sdk_client.find_user.side_effect = [self.user]
58
-
59
- result = role._find_sdk_id(
60
- self.identity_sdk_client.find_user,
61
- name_or_id=self.user.id,
62
- validate_actor_existence=False,
63
- )
64
- self.assertEqual(self.user.id, result)
65
-
66
- def test_find_sdk_id_not_found_validate(self):
67
- self.identity_sdk_client.find_user.side_effect = [
68
- sdk_exc.ResourceNotFound,
69
- ]
70
-
71
- self.assertRaises(
72
- exceptions.CommandError,
73
- role._find_sdk_id,
74
- self.identity_sdk_client.find_user,
75
- name_or_id=self.user.id,
76
- validate_actor_existence=True,
77
- )
78
-
79
- def test_find_sdk_id_not_found_no_validate(self):
80
- self.identity_sdk_client.find_user.side_effect = [
81
- sdk_exc.ResourceNotFound,
82
- ]
83
-
84
- result = role._find_sdk_id(
85
- self.identity_sdk_client.find_user,
86
- name_or_id=self.user.id,
87
- validate_actor_existence=False,
88
- )
89
- self.assertEqual(self.user.id, result)
90
-
91
- def test_find_sdk_id_forbidden_validate(self):
92
- self.identity_sdk_client.find_user.side_effect = [
93
- sdk_exc.ForbiddenException,
94
- ]
95
-
96
- result = role._find_sdk_id(
97
- self.identity_sdk_client.find_user,
98
- name_or_id=self.user.id,
99
- validate_actor_existence=True,
100
- )
101
-
102
- self.assertEqual(self.user.id, result)
103
-
104
- def test_find_sdk_id_forbidden_no_validate(self):
105
- self.identity_sdk_client.find_user.side_effect = [
106
- sdk_exc.ForbiddenException,
107
- ]
108
-
109
- result = role._find_sdk_id(
110
- self.identity_sdk_client.find_user,
111
- name_or_id=self.user.id,
112
- validate_actor_existence=False,
113
- )
114
-
115
- self.assertEqual(self.user.id, result)
116
-
117
-
118
37
  class TestRoleAdd(identity_fakes.TestIdentityv3):
119
38
  def _is_inheritance_testcase(self):
120
39
  return False