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
@@ -18,10 +18,10 @@
18
18
  import logging
19
19
 
20
20
  from openstack import exceptions as sdk_exc
21
- from osc_lib.command import command
22
21
  from osc_lib import exceptions
23
22
  from osc_lib import utils
24
23
 
24
+ from openstackclient import command
25
25
  from openstackclient.i18n import _
26
26
  from openstackclient.identity import common
27
27
 
@@ -82,32 +82,12 @@ def _add_identity_and_resource_options_to_parser(parser):
82
82
  common.add_inherited_option_to_parser(parser)
83
83
 
84
84
 
85
- def _find_sdk_id(
86
- find_command, name_or_id, validate_actor_existence=True, **kwargs
87
- ):
88
- try:
89
- resource = find_command(
90
- name_or_id=name_or_id, ignore_missing=False, **kwargs
91
- )
92
-
93
- # Mimic the behavior of
94
- # openstackclient.identity.common._find_identity_resource()
95
- # and ignore if we don't have permission to find a resource.
96
- except sdk_exc.ForbiddenException:
97
- return name_or_id
98
- except sdk_exc.ResourceNotFound as exc:
99
- if not validate_actor_existence:
100
- return name_or_id
101
- raise exceptions.CommandError from exc
102
- return resource.id
103
-
104
-
105
85
  def _process_identity_and_resource_options(
106
86
  parsed_args, identity_client, validate_actor_existence=True
107
87
  ):
108
88
  def _find_user():
109
89
  domain_id = (
110
- _find_sdk_id(
90
+ common._find_sdk_id(
111
91
  identity_client.find_domain,
112
92
  name_or_id=parsed_args.user_domain,
113
93
  validate_actor_existence=validate_actor_existence,
@@ -115,7 +95,7 @@ def _process_identity_and_resource_options(
115
95
  if parsed_args.user_domain
116
96
  else None
117
97
  )
118
- return _find_sdk_id(
98
+ return common._find_sdk_id(
119
99
  identity_client.find_user,
120
100
  name_or_id=parsed_args.user,
121
101
  validate_actor_existence=validate_actor_existence,
@@ -124,7 +104,7 @@ def _process_identity_and_resource_options(
124
104
 
125
105
  def _find_group():
126
106
  domain_id = (
127
- _find_sdk_id(
107
+ common._find_sdk_id(
128
108
  identity_client.find_domain,
129
109
  name_or_id=parsed_args.group_domain,
130
110
  validate_actor_existence=validate_actor_existence,
@@ -132,7 +112,7 @@ def _process_identity_and_resource_options(
132
112
  if parsed_args.group_domain
133
113
  else None
134
114
  )
135
- return _find_sdk_id(
115
+ return common._find_sdk_id(
136
116
  identity_client.find_group,
137
117
  name_or_id=parsed_args.group,
138
118
  validate_actor_existence=validate_actor_existence,
@@ -141,7 +121,7 @@ def _process_identity_and_resource_options(
141
121
 
142
122
  def _find_project():
143
123
  domain_id = (
144
- _find_sdk_id(
124
+ common._find_sdk_id(
145
125
  identity_client.find_domain,
146
126
  name_or_id=parsed_args.project_domain,
147
127
  validate_actor_existence=validate_actor_existence,
@@ -149,7 +129,7 @@ def _process_identity_and_resource_options(
149
129
  if parsed_args.project_domain
150
130
  else None
151
131
  )
152
- return _find_sdk_id(
132
+ return common._find_sdk_id(
153
133
  identity_client.find_project,
154
134
  name_or_id=parsed_args.project,
155
135
  validate_actor_existence=validate_actor_existence,
@@ -162,7 +142,7 @@ def _process_identity_and_resource_options(
162
142
  kwargs['system'] = parsed_args.system
163
143
  elif parsed_args.user and parsed_args.domain:
164
144
  kwargs['user'] = _find_user()
165
- kwargs['domain'] = _find_sdk_id(
145
+ kwargs['domain'] = common._find_sdk_id(
166
146
  identity_client.find_domain,
167
147
  name_or_id=parsed_args.domain,
168
148
  validate_actor_existence=validate_actor_existence,
@@ -175,7 +155,7 @@ def _process_identity_and_resource_options(
175
155
  kwargs['system'] = parsed_args.system
176
156
  elif parsed_args.group and parsed_args.domain:
177
157
  kwargs['group'] = _find_group()
178
- kwargs['domain'] = _find_sdk_id(
158
+ kwargs['domain'] = common._find_sdk_id(
179
159
  identity_client.find_domain,
180
160
  name_or_id=parsed_args.domain,
181
161
  validate_actor_existence=validate_actor_existence,
@@ -228,10 +208,10 @@ class AddRole(command.Command):
228
208
 
229
209
  domain_id = None
230
210
  if parsed_args.role_domain:
231
- domain_id = _find_sdk_id(
211
+ domain_id = common._find_sdk_id(
232
212
  identity_client.find_domain, name_or_id=parsed_args.role_domain
233
213
  )
234
- role = _find_sdk_id(
214
+ role = common._find_sdk_id(
235
215
  identity_client.find_role,
236
216
  name_or_id=parsed_args.role,
237
217
  domain_id=domain_id,
@@ -328,7 +308,7 @@ class CreateRole(command.ShowOne):
328
308
 
329
309
  create_kwargs = {}
330
310
  if parsed_args.domain:
331
- create_kwargs['domain_id'] = _find_sdk_id(
311
+ create_kwargs['domain_id'] = common._find_sdk_id(
332
312
  identity_client.find_domain, name_or_id=parsed_args.domain
333
313
  )
334
314
 
@@ -381,13 +361,13 @@ class DeleteRole(command.Command):
381
361
 
382
362
  domain_id = None
383
363
  if parsed_args.domain:
384
- domain_id = _find_sdk_id(
364
+ domain_id = common._find_sdk_id(
385
365
  identity_client.find_domain, parsed_args.domain
386
366
  )
387
367
  errors = 0
388
368
  for role in parsed_args.roles:
389
369
  try:
390
- role_id = _find_sdk_id(
370
+ role_id = common._find_sdk_id(
391
371
  identity_client.find_role,
392
372
  name_or_id=role,
393
373
  domain_id=domain_id,
@@ -430,6 +410,7 @@ class ListRole(command.Lister):
430
410
  if parsed_args.domain:
431
411
  domain = identity_client.find_domain(
432
412
  name_or_id=parsed_args.domain,
413
+ ignore_missing=False,
433
414
  )
434
415
  data = identity_client.roles(domain_id=domain.id)
435
416
  return (
@@ -482,11 +463,11 @@ class RemoveRole(command.Command):
482
463
 
483
464
  domain_id = None
484
465
  if parsed_args.role_domain:
485
- domain_id = _find_sdk_id(
466
+ domain_id = common._find_sdk_id(
486
467
  identity_client.find_domain,
487
468
  name_or_id=parsed_args.role_domain,
488
469
  )
489
- role = _find_sdk_id(
470
+ role = common._find_sdk_id(
490
471
  identity_client.find_role,
491
472
  name_or_id=parsed_args.role,
492
473
  domain_id=domain_id,
@@ -582,7 +563,7 @@ class SetRole(command.Command):
582
563
 
583
564
  domain_id = None
584
565
  if parsed_args.domain:
585
- domain_id = _find_sdk_id(
566
+ domain_id = common._find_sdk_id(
586
567
  identity_client.find_domain,
587
568
  name_or_id=parsed_args.domain,
588
569
  )
@@ -591,7 +572,7 @@ class SetRole(command.Command):
591
572
  if parsed_args.immutable is not None:
592
573
  update_kwargs["options"] = {"immutable": parsed_args.immutable}
593
574
 
594
- role = _find_sdk_id(
575
+ role = common._find_sdk_id(
595
576
  identity_client.find_role,
596
577
  name_or_id=parsed_args.role,
597
578
  domain_id=domain_id,
@@ -623,7 +604,7 @@ class ShowRole(command.ShowOne):
623
604
 
624
605
  domain_id = None
625
606
  if parsed_args.domain:
626
- domain_id = _find_sdk_id(
607
+ domain_id = common._find_sdk_id(
627
608
  identity_client.find_domain,
628
609
  name_or_id=parsed_args.domain,
629
610
  )
@@ -13,9 +13,7 @@
13
13
 
14
14
  """Identity v3 Assignment action implementations"""
15
15
 
16
- from openstack import exceptions as sdk_exceptions
17
- from osc_lib.command import command
18
-
16
+ from openstackclient import command
19
17
  from openstackclient.i18n import _
20
18
  from openstackclient.identity import common
21
19
 
@@ -51,15 +49,6 @@ def _format_role_assignment_(assignment, include_names):
51
49
  )
52
50
 
53
51
 
54
- def _find_sdk_id(find_command, name_or_id, **kwargs):
55
- try:
56
- return find_command(
57
- name_or_id=name_or_id, ignore_missing=False, **kwargs
58
- ).id
59
- except sdk_exceptions.ForbiddenException:
60
- return name_or_id
61
-
62
-
63
52
  class ListRoleAssignment(command.Lister):
64
53
  _description = _("List role assignments")
65
54
 
@@ -135,12 +124,12 @@ class ListRoleAssignment(command.Lister):
135
124
  role_id = None
136
125
  role_domain_id = None
137
126
  if parsed_args.role_domain:
138
- role_domain_id = _find_sdk_id(
127
+ role_domain_id = common._find_sdk_id(
139
128
  identity_client.find_domain,
140
129
  name_or_id=parsed_args.role_domain,
141
130
  )
142
131
  if parsed_args.role:
143
- role_id = _find_sdk_id(
132
+ role_id = common._find_sdk_id(
144
133
  identity_client.find_role,
145
134
  name_or_id=parsed_args.role,
146
135
  domain_id=role_domain_id,
@@ -148,21 +137,21 @@ class ListRoleAssignment(command.Lister):
148
137
 
149
138
  user_domain_id = None
150
139
  if parsed_args.user_domain:
151
- user_domain_id = _find_sdk_id(
140
+ user_domain_id = common._find_sdk_id(
152
141
  identity_client.find_domain,
153
142
  name_or_id=parsed_args.user_domain,
154
143
  )
155
144
 
156
145
  user_id = None
157
146
  if parsed_args.user:
158
- user_id = _find_sdk_id(
147
+ user_id = common._find_sdk_id(
159
148
  identity_client.find_user,
160
149
  name_or_id=parsed_args.user,
161
150
  domain_id=user_domain_id,
162
151
  )
163
152
  elif parsed_args.authuser:
164
153
  if auth_ref:
165
- user_id = _find_sdk_id(
154
+ user_id = common._find_sdk_id(
166
155
  identity_client.find_user,
167
156
  name_or_id=auth_ref.user_id,
168
157
  )
@@ -173,21 +162,21 @@ class ListRoleAssignment(command.Lister):
173
162
 
174
163
  domain_id = None
175
164
  if parsed_args.domain:
176
- domain_id = _find_sdk_id(
165
+ domain_id = common._find_sdk_id(
177
166
  identity_client.find_domain,
178
167
  name_or_id=parsed_args.domain,
179
168
  )
180
169
 
181
170
  project_domain_id = None
182
171
  if parsed_args.project_domain:
183
- project_domain_id = _find_sdk_id(
172
+ project_domain_id = common._find_sdk_id(
184
173
  identity_client.find_domain,
185
174
  name_or_id=parsed_args.project_domain,
186
175
  )
187
176
 
188
177
  project_id = None
189
178
  if parsed_args.project:
190
- project_id = _find_sdk_id(
179
+ project_id = common._find_sdk_id(
191
180
  identity_client.find_project,
192
181
  name_or_id=common._get_token_resource(
193
182
  identity_client, 'project', parsed_args.project
@@ -196,21 +185,21 @@ class ListRoleAssignment(command.Lister):
196
185
  )
197
186
  elif parsed_args.authproject:
198
187
  if auth_ref:
199
- project_id = _find_sdk_id(
188
+ project_id = common._find_sdk_id(
200
189
  identity_client.find_project,
201
190
  name_or_id=auth_ref.project_id,
202
191
  )
203
192
 
204
193
  group_domain_id = None
205
194
  if parsed_args.group_domain:
206
- group_domain_id = _find_sdk_id(
195
+ group_domain_id = common._find_sdk_id(
207
196
  identity_client.find_domain,
208
197
  name_or_id=parsed_args.group_domain,
209
198
  )
210
199
 
211
200
  group_id = None
212
201
  if parsed_args.group:
213
- group_id = _find_sdk_id(
202
+ group_id = common._find_sdk_id(
214
203
  identity_client.find_group,
215
204
  name_or_id=parsed_args.group,
216
205
  domain_id=group_domain_id,
@@ -17,10 +17,10 @@
17
17
 
18
18
  import logging
19
19
 
20
- from osc_lib.command import command
21
20
  from osc_lib import exceptions
22
21
  from osc_lib import utils
23
22
 
23
+ from openstackclient import command
24
24
  from openstackclient.i18n import _
25
25
  from openstackclient.identity import common
26
26
 
@@ -15,10 +15,10 @@
15
15
 
16
16
  import logging
17
17
 
18
- from osc_lib.command import command
19
18
  from osc_lib import exceptions
20
19
  from osc_lib import utils
21
20
 
21
+ from openstackclient import command
22
22
  from openstackclient.i18n import _
23
23
 
24
24
 
@@ -114,6 +114,7 @@ def add_tag_option_to_parser_for_set(parser, resource_name):
114
114
  parser.add_argument(
115
115
  '--remove-tag',
116
116
  action='append',
117
+ dest='remove_tags',
117
118
  metavar='<tag>',
118
119
  default=[],
119
120
  help=_(
@@ -128,8 +129,8 @@ def update_tags_in_args(parsed_args, obj, args):
128
129
  if parsed_args.clear_tags:
129
130
  args['tags'] = []
130
131
  obj.tags = []
131
- if parsed_args.remove_tag:
132
- args['tags'] = sorted(set(obj.tags) - set(parsed_args.remove_tag))
132
+ if parsed_args.remove_tags:
133
+ args['tags'] = sorted(set(obj.tags) - set(parsed_args.remove_tags))
133
134
  return
134
135
  if parsed_args.tags:
135
136
  args['tags'] = sorted(set(obj.tags).union(set(parsed_args.tags)))
@@ -15,10 +15,10 @@
15
15
 
16
16
  """Identity v3 Token action implementations"""
17
17
 
18
- from osc_lib.command import command
19
18
  from osc_lib import exceptions
20
19
  from osc_lib import utils
21
20
 
21
+ from openstackclient import command
22
22
  from openstackclient.i18n import _
23
23
  from openstackclient.identity import common
24
24
 
@@ -37,6 +37,7 @@ class AuthorizeRequestToken(command.ShowOne):
37
37
  parser.add_argument(
38
38
  '--role',
39
39
  metavar='<role>',
40
+ dest='roles',
40
41
  action='append',
41
42
  default=[],
42
43
  required=True,
@@ -52,7 +53,7 @@ class AuthorizeRequestToken(command.ShowOne):
52
53
 
53
54
  # NOTE(stevemar): We want a list of role ids
54
55
  roles = []
55
- for role in parsed_args.role:
56
+ for role in parsed_args.roles:
56
57
  role_id = utils.find_resource(
57
58
  identity_client.roles,
58
59
  role,
@@ -18,10 +18,10 @@ import itertools
18
18
  import logging
19
19
 
20
20
  from openstack import exceptions as sdk_exceptions
21
- from osc_lib.command import command
22
21
  from osc_lib import exceptions
23
22
  from osc_lib import utils
24
23
 
24
+ from openstackclient import command
25
25
  from openstackclient.i18n import _
26
26
  from openstackclient.identity import common
27
27
 
@@ -179,7 +179,9 @@ class CreateTrust(command.ShowOne):
179
179
  roles = []
180
180
  for role in parsed_args.roles:
181
181
  try:
182
- role_id = identity_client.find_role(role).id
182
+ role_id = identity_client.find_role(
183
+ role, ignore_missing=False
184
+ ).id
183
185
  except sdk_exceptions.ForbiddenException:
184
186
  role_id = role
185
187
  roles.append({"id": role_id})
@@ -17,9 +17,9 @@ The first step of federated auth is to fetch an unscoped token. From there,
17
17
  the user can list domains and projects they are allowed to access, and request
18
18
  a scoped token."""
19
19
 
20
- from osc_lib.command import command
21
20
  from osc_lib import utils
22
21
 
22
+ from openstackclient import command
23
23
  from openstackclient.i18n import _
24
24
 
25
25
 
@@ -20,10 +20,10 @@ import logging
20
20
  import typing as ty
21
21
 
22
22
  from openstack import exceptions as sdk_exc
23
- from osc_lib.command import command
24
23
  from osc_lib import exceptions
25
24
  from osc_lib import utils
26
25
 
26
+ from openstackclient import command
27
27
  from openstackclient.i18n import _
28
28
  from openstackclient.identity import common
29
29
 
@@ -82,9 +82,9 @@ def _get_options_for_user(identity_client, parsed_args):
82
82
  options['multi_factor_auth_enabled'] = True
83
83
  if parsed_args.disable_multi_factor_auth:
84
84
  options['multi_factor_auth_enabled'] = False
85
- if parsed_args.multi_factor_auth_rule:
85
+ if parsed_args.multi_factor_auth_rules:
86
86
  auth_rules = [
87
- rule.split(",") for rule in parsed_args.multi_factor_auth_rule
87
+ rule.split(",") for rule in parsed_args.multi_factor_auth_rules
88
88
  ]
89
89
  if auth_rules:
90
90
  options['multi_factor_auth_rules'] = auth_rules
@@ -175,7 +175,8 @@ def _add_user_options(parser):
175
175
  parser.add_argument(
176
176
  '--multi-factor-auth-rule',
177
177
  metavar='<rule>',
178
- action="append",
178
+ dest='multi_factor_auth_rules',
179
+ action='append',
179
180
  default=[],
180
181
  help=_(
181
182
  'Set multi-factor auth rules. For example, to set a rule '
@@ -298,6 +299,9 @@ class CreateUser(command.ShowOne):
298
299
  "when a user does not have a password."
299
300
  )
300
301
  )
302
+ else:
303
+ kwargs['password'] = password
304
+
301
305
  options = _get_options_for_user(identity_client, parsed_args)
302
306
  if options:
303
307
  kwargs['options'] = options
@@ -306,7 +310,6 @@ class CreateUser(command.ShowOne):
306
310
  user = identity_client.create_user(
307
311
  is_enabled=is_enabled,
308
312
  name=parsed_args.name,
309
- password=password,
310
313
  **kwargs,
311
314
  )
312
315
  except sdk_exc.ConflictException:
@@ -420,7 +423,8 @@ class ListUser(command.Lister):
420
423
  dest='is_enabled',
421
424
  default=None,
422
425
  help=_(
423
- 'List only enabled users, does nothing with --project and --group'
426
+ 'List only enabled users, does nothing with '
427
+ '--project and --group'
424
428
  ),
425
429
  )
426
430
  parser.add_argument(
@@ -429,7 +433,8 @@ class ListUser(command.Lister):
429
433
  dest='is_enabled',
430
434
  default=None,
431
435
  help=_(
432
- 'List only disabled users, does nothing with --project and --group'
436
+ 'List only disabled users, does nothing with '
437
+ '--project and --group'
433
438
  ),
434
439
  )
435
440
  return parser
@@ -441,6 +446,7 @@ class ListUser(command.Lister):
441
446
  if parsed_args.domain:
442
447
  domain = identity_client.find_domain(
443
448
  name_or_id=parsed_args.domain,
449
+ ignore_missing=False,
444
450
  ).id
445
451
 
446
452
  group = None
@@ -467,15 +473,13 @@ class ListUser(command.Lister):
467
473
  ignore_missing=False,
468
474
  ).id
469
475
 
470
- assignments = identity_client.role_assignments_filter(
471
- project=project
472
- )
473
-
474
476
  # NOTE(stevemar): If a user has more than one role on a project
475
477
  # then they will have two entries in the returned data. Since we
476
478
  # are looking for any role, let's just track unique user IDs.
477
479
  user_ids = set()
478
- for assignment in assignments:
480
+ for assignment in identity_client.role_assignments(
481
+ scope_project_id=project
482
+ ):
479
483
  if assignment.user:
480
484
  user_ids.add(assignment.user['id'])
481
485
 
@@ -689,7 +693,12 @@ class SetPasswordUser(command.Command):
689
693
  def take_action(self, parsed_args):
690
694
  identity_client = self.app.client_manager.sdk_connection.identity
691
695
  conn = self.app.client_manager.sdk_connection
692
- user_id = conn.config.get_auth().get_user_id(conn.identity)
696
+ auth = conn.config.get_auth()
697
+ if auth is None:
698
+ # this will never happen
699
+ raise exceptions.CommandError('invalid authentication info')
700
+
701
+ user_id = auth.get_user_id(conn.identity)
693
702
 
694
703
  # FIXME(gyee): there are two scenarios:
695
704
  #
@@ -19,15 +19,16 @@ import argparse
19
19
  import logging
20
20
  import os
21
21
  import sys
22
+ import typing as ty
22
23
 
23
24
  from cliff import columns as cliff_columns
24
25
  from osc_lib.api import utils as api_utils
25
26
  from osc_lib.cli import format_columns
26
27
  from osc_lib.cli import parseractions
27
- from osc_lib.command import command
28
28
  from osc_lib import exceptions
29
29
  from osc_lib import utils
30
30
 
31
+ from openstackclient import command
31
32
  from openstackclient.i18n import _
32
33
 
33
34
  CONTAINER_CHOICES = ["ami", "ari", "aki", "bare", "docker", "ova", "ovf"]
@@ -67,10 +68,7 @@ def _get_columns(item):
67
68
  )
68
69
 
69
70
 
70
- _formatters = {}
71
-
72
-
73
- class HumanReadableSizeColumn(cliff_columns.FormattableColumn):
71
+ class HumanReadableSizeColumn(cliff_columns.FormattableColumn[int]):
74
72
  def human_readable(self):
75
73
  """Return a formatted visibility string
76
74
 
@@ -84,7 +82,7 @@ class HumanReadableSizeColumn(cliff_columns.FormattableColumn):
84
82
  return ''
85
83
 
86
84
 
87
- class VisibilityColumn(cliff_columns.FormattableColumn):
85
+ class VisibilityColumn(cliff_columns.FormattableColumn[bool]):
88
86
  def human_readable(self):
89
87
  """Return a formatted visibility string
90
88
 
@@ -340,9 +338,12 @@ class CreateImage(command.ShowOne):
340
338
 
341
339
  if image:
342
340
  display_columns, columns = _get_columns(image)
343
- _formatters['properties'] = format_columns.DictColumn
344
341
  data = utils.get_item_properties(
345
- image, columns, formatters=_formatters
342
+ image,
343
+ columns,
344
+ formatters={
345
+ 'properties': format_columns.DictColumn,
346
+ },
346
347
  )
347
348
  return (display_columns, data)
348
349
  elif info:
@@ -493,19 +494,19 @@ class ListImage(command.Lister):
493
494
  column_headers = columns
494
495
 
495
496
  # List of image data received
496
- data = list(image_client.images(**kwargs))
497
+ images = list(image_client.images(**kwargs))
497
498
 
498
499
  if parsed_args.property:
499
500
  # NOTE(dtroyer): coerce to a list to subscript it in py3
500
501
  attr, value = list(parsed_args.property.items())[0]
501
502
  api_utils.simple_filter(
502
- data,
503
+ images,
503
504
  attr=attr,
504
505
  value=value,
505
506
  property_field='properties',
506
507
  )
507
508
 
508
- data = utils.sort_items(data, parsed_args.sort)
509
+ data = utils.sort_items(images, parsed_args.sort)
509
510
 
510
511
  return (
511
512
  column_headers,
@@ -839,11 +840,13 @@ class ShowImage(command.ShowOne):
839
840
  parsed_args.image, ignore_missing=False
840
841
  )
841
842
 
843
+ formatters: dict[
844
+ str, type[cliff_columns.FormattableColumn[ty.Any]]
845
+ ] = {
846
+ 'properties': format_columns.DictColumn,
847
+ }
842
848
  if parsed_args.human_readable:
843
- _formatters['size'] = HumanReadableSizeColumn
849
+ formatters['size'] = HumanReadableSizeColumn
844
850
  display_columns, columns = _get_columns(image)
845
- _formatters['properties'] = format_columns.DictColumn
846
- data = utils.get_item_properties(
847
- image, columns, formatters=_formatters
848
- )
851
+ data = utils.get_item_properties(image, columns, formatters=formatters)
849
852
  return (display_columns, data)
@@ -17,10 +17,10 @@ import copy
17
17
  import datetime
18
18
  import logging
19
19
 
20
- from osc_lib.command import command
21
20
  from osc_lib import exceptions
22
21
  from osc_lib import utils
23
22
 
23
+ from openstackclient import command
24
24
  from openstackclient.i18n import _
25
25
 
26
26