python-openstackclient 9.0.0__py3-none-any.whl → 10.0.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 (284) hide show
  1. openstackclient/__init__.py +2 -6
  2. openstackclient/api/api.py +41 -23
  3. openstackclient/api/compute_v2.py +44 -25
  4. openstackclient/api/object_store_v1.py +75 -97
  5. openstackclient/api/volume_v2.py +2 -1
  6. openstackclient/api/volume_v3.py +2 -1
  7. openstackclient/common/availability_zone.py +58 -42
  8. openstackclient/common/clientmanager.py +56 -29
  9. openstackclient/common/configuration.py +10 -3
  10. openstackclient/common/envvars.py +2 -2
  11. openstackclient/common/extension.py +14 -5
  12. openstackclient/common/limits.py +10 -5
  13. openstackclient/common/module.py +14 -6
  14. openstackclient/common/pagination.py +8 -2
  15. openstackclient/common/progressbar.py +7 -6
  16. openstackclient/common/project_cleanup.py +13 -7
  17. openstackclient/common/quota.py +97 -99
  18. openstackclient/common/versions.py +8 -2
  19. openstackclient/compute/client.py +7 -3
  20. openstackclient/compute/v2/agent.py +17 -10
  21. openstackclient/compute/v2/aggregate.py +36 -22
  22. openstackclient/compute/v2/console.py +14 -8
  23. openstackclient/compute/v2/console_connection.py +11 -3
  24. openstackclient/compute/v2/flavor.py +39 -21
  25. openstackclient/compute/v2/host.py +14 -6
  26. openstackclient/compute/v2/hypervisor.py +14 -5
  27. openstackclient/compute/v2/hypervisor_stats.py +10 -2
  28. openstackclient/compute/v2/keypair.py +29 -14
  29. openstackclient/compute/v2/server.py +249 -169
  30. openstackclient/compute/v2/server_backup.py +10 -4
  31. openstackclient/compute/v2/server_event.py +21 -12
  32. openstackclient/compute/v2/server_group.py +21 -11
  33. openstackclient/compute/v2/server_image.py +19 -10
  34. openstackclient/compute/v2/server_migration.py +24 -10
  35. openstackclient/compute/v2/server_share.py +274 -0
  36. openstackclient/compute/v2/server_volume.py +10 -4
  37. openstackclient/compute/v2/service.py +14 -7
  38. openstackclient/compute/v2/usage.py +26 -21
  39. openstackclient/identity/client.py +8 -3
  40. openstackclient/identity/common.py +78 -47
  41. openstackclient/identity/v2_0/catalog.py +14 -7
  42. openstackclient/identity/v2_0/ec2creds.py +21 -10
  43. openstackclient/identity/v2_0/endpoint.py +23 -11
  44. openstackclient/identity/v2_0/project.py +25 -14
  45. openstackclient/identity/v2_0/role.py +28 -14
  46. openstackclient/identity/v2_0/role_assignment.py +9 -3
  47. openstackclient/identity/v2_0/service.py +23 -11
  48. openstackclient/identity/v2_0/token.py +12 -5
  49. openstackclient/identity/v2_0/user.py +26 -15
  50. openstackclient/identity/v3/access_rule.py +26 -12
  51. openstackclient/identity/v3/application_credential.py +59 -24
  52. openstackclient/identity/v3/catalog.py +14 -7
  53. openstackclient/identity/v3/consumer.py +22 -11
  54. openstackclient/identity/v3/credential.py +36 -16
  55. openstackclient/identity/v3/domain.py +37 -18
  56. openstackclient/identity/v3/ec2creds.py +25 -12
  57. openstackclient/identity/v3/endpoint.py +42 -20
  58. openstackclient/identity/v3/endpoint_group.py +28 -17
  59. openstackclient/identity/v3/federation_protocol.py +38 -16
  60. openstackclient/identity/v3/group.py +55 -32
  61. openstackclient/identity/v3/identity_provider.py +92 -57
  62. openstackclient/identity/v3/implied_role.py +21 -9
  63. openstackclient/identity/v3/limit.py +38 -16
  64. openstackclient/identity/v3/mapping.py +26 -13
  65. openstackclient/identity/v3/policy.py +23 -12
  66. openstackclient/identity/v3/project.py +43 -23
  67. openstackclient/identity/v3/region.py +36 -16
  68. openstackclient/identity/v3/registered_limit.py +40 -16
  69. openstackclient/identity/v3/role.py +61 -31
  70. openstackclient/identity/v3/role_assignment.py +23 -6
  71. openstackclient/identity/v3/service.py +36 -16
  72. openstackclient/identity/v3/service_provider.py +37 -15
  73. openstackclient/identity/v3/tag.py +23 -6
  74. openstackclient/identity/v3/token.py +30 -14
  75. openstackclient/identity/v3/trust.py +32 -14
  76. openstackclient/identity/v3/unscoped_saml.py +10 -2
  77. openstackclient/identity/v3/user.py +49 -26
  78. openstackclient/image/client.py +7 -3
  79. openstackclient/image/v1/image.py +33 -26
  80. openstackclient/image/v2/cache.py +14 -9
  81. openstackclient/image/v2/image.py +74 -48
  82. openstackclient/image/v2/info.py +7 -1
  83. openstackclient/image/v2/metadef_namespaces.py +109 -13
  84. openstackclient/image/v2/metadef_objects.py +28 -15
  85. openstackclient/image/v2/metadef_properties.py +24 -13
  86. openstackclient/image/v2/metadef_resource_type_association.py +14 -7
  87. openstackclient/image/v2/metadef_resource_types.py +7 -1
  88. openstackclient/image/v2/task.py +15 -6
  89. openstackclient/locale/tr_TR/LC_MESSAGES/openstackclient.po +7 -192
  90. openstackclient/network/client.py +7 -2
  91. openstackclient/network/common.py +16 -241
  92. openstackclient/network/utils.py +36 -22
  93. openstackclient/network/v2/address_group.py +27 -16
  94. openstackclient/network/v2/address_scope.py +24 -13
  95. openstackclient/network/v2/bgpvpn/bgpvpn.py +463 -0
  96. openstackclient/network/v2/bgpvpn/constants.py +30 -0
  97. openstackclient/network/v2/bgpvpn/network_association.py +214 -0
  98. openstackclient/network/v2/bgpvpn/port_association.py +490 -0
  99. openstackclient/network/v2/bgpvpn/router_association.py +288 -0
  100. openstackclient/network/v2/default_security_group_rule.py +19 -10
  101. openstackclient/network/v2/floating_ip.py +110 -159
  102. openstackclient/network/v2/floating_ip_port_forwarding.py +30 -18
  103. openstackclient/network/v2/fwaas/__init__.py +0 -0
  104. openstackclient/network/v2/fwaas/group.py +466 -0
  105. openstackclient/network/v2/fwaas/policy.py +518 -0
  106. openstackclient/network/v2/fwaas/rule.py +574 -0
  107. openstackclient/network/v2/ip_availability.py +13 -5
  108. openstackclient/network/v2/l3_conntrack_helper.py +22 -13
  109. openstackclient/network/v2/local_ip.py +24 -13
  110. openstackclient/network/v2/local_ip_association.py +14 -7
  111. openstackclient/network/v2/ndp_proxy.py +20 -11
  112. openstackclient/network/v2/network.py +129 -196
  113. openstackclient/network/v2/network_agent.py +46 -25
  114. openstackclient/network/v2/network_auto_allocated_topology.py +22 -11
  115. openstackclient/network/v2/network_flavor.py +27 -16
  116. openstackclient/network/v2/network_flavor_profile.py +23 -12
  117. openstackclient/network/v2/network_meter.py +21 -10
  118. openstackclient/network/v2/network_meter_rule.py +21 -11
  119. openstackclient/network/v2/network_qos_policy.py +25 -15
  120. openstackclient/network/v2/network_qos_rule.py +32 -17
  121. openstackclient/network/v2/network_qos_rule_type.py +13 -5
  122. openstackclient/network/v2/network_rbac.py +23 -12
  123. openstackclient/network/v2/network_segment.py +20 -11
  124. openstackclient/network/v2/network_segment_range.py +56 -29
  125. openstackclient/network/v2/network_service_provider.py +7 -1
  126. openstackclient/network/v2/network_trunk.py +38 -22
  127. openstackclient/network/v2/port.py +54 -29
  128. openstackclient/network/v2/router.py +75 -52
  129. openstackclient/network/v2/security_group.py +87 -157
  130. openstackclient/network/v2/security_group_rule.py +100 -280
  131. openstackclient/network/v2/subnet.py +49 -28
  132. openstackclient/network/v2/subnet_pool.py +30 -17
  133. openstackclient/network/v2/taas/tap_flow.py +22 -11
  134. openstackclient/network/v2/taas/tap_mirror.py +22 -11
  135. openstackclient/network/v2/taas/tap_service.py +23 -12
  136. openstackclient/object/client.py +7 -2
  137. openstackclient/object/v1/account.py +13 -6
  138. openstackclient/object/v1/container.py +25 -15
  139. openstackclient/object/v1/object.py +25 -15
  140. openstackclient/py.typed +0 -0
  141. openstackclient/shell.py +46 -10
  142. openstackclient/tests/functional/base.py +55 -20
  143. openstackclient/tests/functional/common/test_extension.py +4 -0
  144. openstackclient/tests/functional/common/test_quota.py +3 -1
  145. openstackclient/tests/functional/compute/v2/common.py +14 -13
  146. openstackclient/tests/functional/compute/v2/test_flavor.py +3 -1
  147. openstackclient/tests/functional/compute/v2/test_server.py +3 -0
  148. openstackclient/tests/functional/identity/v2/common.py +10 -6
  149. openstackclient/tests/functional/identity/v2/test_role.py +4 -4
  150. openstackclient/tests/functional/identity/v3/common.py +25 -19
  151. openstackclient/tests/functional/identity/v3/test_group.py +20 -20
  152. openstackclient/tests/functional/identity/v3/test_idp.py +3 -1
  153. openstackclient/tests/functional/identity/v3/test_project.py +10 -10
  154. openstackclient/tests/functional/identity/v3/test_role.py +18 -18
  155. openstackclient/tests/functional/identity/v3/test_role_assignment.py +12 -12
  156. openstackclient/tests/functional/identity/v3/test_user.py +8 -8
  157. openstackclient/tests/functional/image/base.py +1 -6
  158. openstackclient/tests/functional/network/v2/common.py +5 -2
  159. openstackclient/tests/functional/network/v2/test_floating_ip.py +10 -4
  160. openstackclient/tests/functional/network/v2/test_ip_availability.py +4 -0
  161. openstackclient/tests/functional/network/v2/test_network_meter_rule.py +3 -2
  162. openstackclient/tests/functional/network/v2/test_network_segment.py +5 -0
  163. openstackclient/tests/functional/network/v2/test_subnet.py +13 -9
  164. openstackclient/tests/functional/object/v1/common.py +4 -0
  165. openstackclient/tests/functional/volume/v2/common.py +4 -0
  166. openstackclient/tests/functional/volume/v2/test_volume_snapshot.py +27 -11
  167. openstackclient/tests/functional/volume/v2/test_volume_type.py +2 -2
  168. openstackclient/tests/functional/volume/v3/common.py +4 -0
  169. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +11 -7
  170. openstackclient/tests/functional/volume/v3/test_volume_type.py +2 -2
  171. openstackclient/tests/unit/common/test_availability_zone.py +35 -49
  172. openstackclient/tests/unit/common/test_extension.py +2 -2
  173. openstackclient/tests/unit/common/test_module.py +12 -7
  174. openstackclient/tests/unit/common/test_project_cleanup.py +3 -1
  175. openstackclient/tests/unit/common/test_quota.py +6 -26
  176. openstackclient/tests/unit/compute/v2/fakes.py +25 -0
  177. openstackclient/tests/unit/compute/v2/test_flavor.py +28 -2
  178. openstackclient/tests/unit/compute/v2/test_keypair.py +6 -6
  179. openstackclient/tests/unit/compute/v2/test_server.py +11 -96
  180. openstackclient/tests/unit/compute/v2/test_server_share.py +287 -0
  181. openstackclient/tests/unit/identity/v3/fakes.py +3 -0
  182. openstackclient/tests/unit/identity/v3/test_group.py +4 -14
  183. openstackclient/tests/unit/identity/v3/test_identity_provider.py +303 -299
  184. openstackclient/tests/unit/identity/v3/test_user.py +4 -4
  185. openstackclient/tests/unit/image/v2/test_image.py +11 -11
  186. openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +105 -6
  187. openstackclient/tests/unit/network/test_common.py +0 -155
  188. openstackclient/tests/unit/network/v2/bgpvpn/__init__.py +0 -0
  189. openstackclient/tests/unit/network/v2/bgpvpn/fakes.py +179 -0
  190. openstackclient/tests/unit/network/v2/bgpvpn/test_bgpvpn.py +584 -0
  191. openstackclient/tests/unit/network/v2/bgpvpn/test_network_association.py +285 -0
  192. openstackclient/tests/unit/network/v2/bgpvpn/test_port_association.py +384 -0
  193. openstackclient/tests/unit/network/v2/bgpvpn/test_router_association.py +297 -0
  194. openstackclient/tests/unit/network/v2/fwaas/__init__.py +0 -0
  195. openstackclient/tests/unit/network/v2/fwaas/test_group.py +897 -0
  196. openstackclient/tests/unit/network/v2/fwaas/test_policy.py +869 -0
  197. openstackclient/tests/unit/network/v2/fwaas/test_rule.py +980 -0
  198. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_flow.py → test_tap_flow.py} +18 -25
  199. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_mirror.py → test_tap_mirror.py} +19 -29
  200. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_service.py → test_tap_service.py} +19 -29
  201. openstackclient/tests/unit/network/v2/test_address_group.py +2 -2
  202. openstackclient/tests/unit/network/v2/{test_floating_ip_network.py → test_floating_ip.py} +3 -2
  203. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +13 -13
  204. openstackclient/tests/unit/network/v2/test_network_agent.py +8 -4
  205. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +3 -3
  206. openstackclient/tests/unit/network/v2/test_network_flavor.py +2 -2
  207. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +1 -1
  208. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +2 -2
  209. openstackclient/tests/unit/network/v2/test_network_rbac.py +1 -1
  210. openstackclient/tests/unit/network/v2/test_network_segment.py +1 -1
  211. openstackclient/tests/unit/network/v2/test_network_segment_range.py +7 -10
  212. openstackclient/tests/unit/network/v2/test_network_trunk.py +1 -1
  213. openstackclient/tests/unit/network/v2/test_router.py +8 -9
  214. openstackclient/tests/unit/network/v2/{test_security_group_network.py → test_security_group.py} +1 -20
  215. openstackclient/tests/unit/network/v2/{test_security_group_rule_network.py → test_security_group_rule.py} +7 -41
  216. openstackclient/tests/unit/network/v2/test_subnet.py +2 -1
  217. openstackclient/tests/unit/network/v2/test_subnet_pool.py +2 -1
  218. openstackclient/tests/unit/object/v1/fakes.py +8 -7
  219. openstackclient/tests/unit/object/v1/test_container.py +65 -101
  220. openstackclient/tests/unit/object/v1/test_container_all.py +8 -1
  221. openstackclient/tests/unit/object/v1/test_object.py +44 -84
  222. openstackclient/tests/unit/object/v1/test_object_all.py +8 -1
  223. openstackclient/tests/unit/test_hacking.py +108 -0
  224. openstackclient/tests/unit/volume/v2/fakes.py +1 -0
  225. openstackclient/tests/unit/volume/v2/test_volume_backup.py +1 -5
  226. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +2 -1
  227. openstackclient/tests/unit/volume/v2/test_volume_type.py +2 -4
  228. openstackclient/tests/unit/volume/v3/fakes.py +1 -0
  229. openstackclient/tests/unit/volume/v3/test_volume.py +60 -3
  230. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
  231. openstackclient/tests/unit/volume/v3/test_volume_backup.py +1 -5
  232. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +55 -1
  233. openstackclient/tests/unit/volume/v3/test_volume_type.py +2 -4
  234. openstackclient/volume/client.py +7 -3
  235. openstackclient/volume/v2/backup_record.py +15 -6
  236. openstackclient/volume/v2/consistency_group.py +29 -17
  237. openstackclient/volume/v2/consistency_group_snapshot.py +25 -10
  238. openstackclient/volume/v2/qos_specs.py +28 -17
  239. openstackclient/volume/v2/service.py +17 -6
  240. openstackclient/volume/v2/volume.py +57 -29
  241. openstackclient/volume/v2/volume_backend.py +19 -6
  242. openstackclient/volume/v2/volume_backup.py +46 -20
  243. openstackclient/volume/v2/volume_host.py +6 -4
  244. openstackclient/volume/v2/volume_snapshot.py +50 -24
  245. openstackclient/volume/v2/volume_transfer_request.py +31 -13
  246. openstackclient/volume/v2/volume_type.py +43 -24
  247. openstackclient/volume/v3/block_storage_cleanup.py +11 -3
  248. openstackclient/volume/v3/block_storage_cluster.py +19 -7
  249. openstackclient/volume/v3/block_storage_log_level.py +15 -6
  250. openstackclient/volume/v3/block_storage_manage.py +10 -4
  251. openstackclient/volume/v3/block_storage_resource_filter.py +17 -5
  252. openstackclient/volume/v3/service.py +16 -6
  253. openstackclient/volume/v3/volume.py +89 -39
  254. openstackclient/volume/v3/volume_attachment.py +43 -21
  255. openstackclient/volume/v3/volume_backup.py +53 -24
  256. openstackclient/volume/v3/volume_group.py +23 -13
  257. openstackclient/volume/v3/volume_group_snapshot.py +32 -13
  258. openstackclient/volume/v3/volume_group_type.py +26 -13
  259. openstackclient/volume/v3/volume_message.py +15 -7
  260. openstackclient/volume/v3/volume_snapshot.py +69 -32
  261. openstackclient/volume/v3/volume_transfer_request.py +31 -13
  262. openstackclient/volume/v3/volume_type.py +42 -24
  263. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/METADATA +6 -6
  264. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/RECORD +271 -260
  265. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/WHEEL +1 -1
  266. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/entry_points.txt +53 -1
  267. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/AUTHORS +4 -0
  268. python_openstackclient-10.0.0.dist-info/pbr.json +1 -0
  269. openstackclient/api/image_v1.py +0 -69
  270. openstackclient/api/image_v2.py +0 -79
  271. openstackclient/network/v2/floating_ip_pool.py +0 -38
  272. openstackclient/tests/functional/image/v1/test_image.py +0 -97
  273. openstackclient/tests/unit/api/test_image_v1.py +0 -96
  274. openstackclient/tests/unit/api/test_image_v2.py +0 -96
  275. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +0 -248
  276. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +0 -49
  277. openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +0 -39
  278. openstackclient/tests/unit/network/v2/test_network_compute.py +0 -404
  279. openstackclient/tests/unit/network/v2/test_security_group_compute.py +0 -392
  280. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +0 -555
  281. python_openstackclient-9.0.0.dist-info/pbr.json +0 -1
  282. /openstackclient/{tests/functional/image/v1 → network/v2/bgpvpn}/__init__.py +0 -0
  283. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/LICENSE +0 -0
  284. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/top_level.txt +0 -0
@@ -15,9 +15,13 @@
15
15
 
16
16
  """Identity v3 Role action implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable, Sequence
18
20
  import logging
21
+ from typing import Any
19
22
 
20
23
  from openstack import exceptions as sdk_exc
24
+ from openstack import utils as sdk_utils
21
25
  from osc_lib import exceptions
22
26
  from osc_lib import utils
23
27
 
@@ -29,7 +33,7 @@ from openstackclient.identity import common
29
33
  LOG = logging.getLogger(__name__)
30
34
 
31
35
 
32
- def _format_role(role):
36
+ def _format_role(role: Any) -> tuple[tuple[str, ...], Any]:
33
37
  columns = (
34
38
  "id",
35
39
  "name",
@@ -48,7 +52,9 @@ def _format_role(role):
48
52
  )
49
53
 
50
54
 
51
- def _add_identity_and_resource_options_to_parser(parser):
55
+ def _add_identity_and_resource_options_to_parser(
56
+ parser: argparse.ArgumentParser,
57
+ ) -> None:
52
58
  system_or_domain_or_project = parser.add_mutually_exclusive_group()
53
59
  system_or_domain_or_project.add_argument(
54
60
  '--system',
@@ -83,9 +89,11 @@ def _add_identity_and_resource_options_to_parser(parser):
83
89
 
84
90
 
85
91
  def _process_identity_and_resource_options(
86
- parsed_args, identity_client, validate_actor_existence=True
87
- ):
88
- def _find_user():
92
+ parsed_args: argparse.Namespace,
93
+ identity_client: Any,
94
+ validate_actor_existence: bool = True,
95
+ ) -> dict[str, Any]:
96
+ def _find_user() -> Any:
89
97
  domain_id = (
90
98
  common._find_sdk_id(
91
99
  identity_client.find_domain,
@@ -102,7 +110,7 @@ def _process_identity_and_resource_options(
102
110
  domain_id=domain_id,
103
111
  )
104
112
 
105
- def _find_group():
113
+ def _find_group() -> Any:
106
114
  domain_id = (
107
115
  common._find_sdk_id(
108
116
  identity_client.find_domain,
@@ -119,7 +127,7 @@ def _process_identity_and_resource_options(
119
127
  domain_id=domain_id,
120
128
  )
121
129
 
122
- def _find_project():
130
+ def _find_project() -> Any:
123
131
  domain_id = (
124
132
  common._find_sdk_id(
125
133
  identity_client.find_domain,
@@ -180,7 +188,7 @@ class AddRole(command.Command):
180
188
  "system, a domain, or a project"
181
189
  )
182
190
 
183
- def get_parser(self, prog_name):
191
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
184
192
  parser = super().get_parser(prog_name)
185
193
  parser.add_argument(
186
194
  'role',
@@ -191,8 +199,10 @@ class AddRole(command.Command):
191
199
  common.add_role_domain_option_to_parser(parser)
192
200
  return parser
193
201
 
194
- def take_action(self, parsed_args):
195
- identity_client = self.app.client_manager.sdk_connection.identity
202
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
203
+ identity_client = sdk_utils.ensure_service_version(
204
+ self.app.client_manager.sdk_connection.identity, '3'
205
+ )
196
206
 
197
207
  if (
198
208
  not parsed_args.user
@@ -278,7 +288,7 @@ class AddRole(command.Command):
278
288
  class CreateRole(command.ShowOne):
279
289
  _description = _("Create new role")
280
290
 
281
- def get_parser(self, prog_name):
291
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
282
292
  parser = super().get_parser(prog_name)
283
293
  parser.add_argument(
284
294
  'name',
@@ -303,10 +313,14 @@ class CreateRole(command.ShowOne):
303
313
  common.add_resource_option_to_parser(parser)
304
314
  return parser
305
315
 
306
- def take_action(self, parsed_args):
307
- identity_client = self.app.client_manager.sdk_connection.identity
316
+ def take_action(
317
+ self, parsed_args: argparse.Namespace
318
+ ) -> tuple[Sequence[str], Iterable[Any]]:
319
+ identity_client = sdk_utils.ensure_service_version(
320
+ self.app.client_manager.sdk_connection.identity, '3'
321
+ )
308
322
 
309
- create_kwargs = {}
323
+ create_kwargs: dict[str, Any] = {}
310
324
  if parsed_args.domain:
311
325
  create_kwargs['domain_id'] = common._find_sdk_id(
312
326
  identity_client.find_domain, name_or_id=parsed_args.domain
@@ -341,7 +355,7 @@ class CreateRole(command.ShowOne):
341
355
  class DeleteRole(command.Command):
342
356
  _description = _("Delete role(s)")
343
357
 
344
- def get_parser(self, prog_name):
358
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
345
359
  parser = super().get_parser(prog_name)
346
360
  parser.add_argument(
347
361
  'roles',
@@ -356,8 +370,10 @@ class DeleteRole(command.Command):
356
370
  )
357
371
  return parser
358
372
 
359
- def take_action(self, parsed_args):
360
- identity_client = self.app.client_manager.sdk_connection.identity
373
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
374
+ identity_client = sdk_utils.ensure_service_version(
375
+ self.app.client_manager.sdk_connection.identity, '3'
376
+ )
361
377
 
362
378
  domain_id = None
363
379
  if parsed_args.domain:
@@ -395,7 +411,7 @@ class DeleteRole(command.Command):
395
411
  class ListRole(command.Lister):
396
412
  _description = _("List roles")
397
413
 
398
- def get_parser(self, prog_name):
414
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
399
415
  parser = super().get_parser(prog_name)
400
416
  parser.add_argument(
401
417
  '--domain',
@@ -404,8 +420,12 @@ class ListRole(command.Lister):
404
420
  )
405
421
  return parser
406
422
 
407
- def take_action(self, parsed_args):
408
- identity_client = self.app.client_manager.sdk_connection.identity
423
+ def take_action(
424
+ self, parsed_args: argparse.Namespace
425
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
426
+ identity_client = sdk_utils.ensure_service_version(
427
+ self.app.client_manager.sdk_connection.identity, '3'
428
+ )
409
429
 
410
430
  if parsed_args.domain:
411
431
  domain = identity_client.find_domain(
@@ -416,8 +436,10 @@ class ListRole(command.Lister):
416
436
  return (
417
437
  ('ID', 'Name', 'Domain'),
418
438
  (
419
- utils.get_item_properties(s, ('id', 'name'))
420
- + (domain.name,)
439
+ (
440
+ *utils.get_item_properties(s, ('id', 'name')),
441
+ domain.name,
442
+ )
421
443
  for s in data
422
444
  ),
423
445
  )
@@ -435,7 +457,7 @@ class RemoveRole(command.Command):
435
457
  "Removes a role assignment from system/domain/project : user/group"
436
458
  )
437
459
 
438
- def get_parser(self, prog_name):
460
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
439
461
  parser = super().get_parser(prog_name)
440
462
  parser.add_argument(
441
463
  'role',
@@ -447,8 +469,10 @@ class RemoveRole(command.Command):
447
469
 
448
470
  return parser
449
471
 
450
- def take_action(self, parsed_args):
451
- identity_client = self.app.client_manager.sdk_connection.identity
472
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
473
+ identity_client = sdk_utils.ensure_service_version(
474
+ self.app.client_manager.sdk_connection.identity, '3'
475
+ )
452
476
  if (
453
477
  not parsed_args.user
454
478
  and not parsed_args.domain
@@ -527,7 +551,7 @@ class RemoveRole(command.Command):
527
551
  class SetRole(command.Command):
528
552
  _description = _("Set role properties")
529
553
 
530
- def get_parser(self, prog_name):
554
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
531
555
  parser = super().get_parser(prog_name)
532
556
  parser.add_argument(
533
557
  'role',
@@ -552,8 +576,10 @@ class SetRole(command.Command):
552
576
  common.add_resource_option_to_parser(parser)
553
577
  return parser
554
578
 
555
- def take_action(self, parsed_args):
556
- identity_client = self.app.client_manager.sdk_connection.identity
579
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
580
+ identity_client = sdk_utils.ensure_service_version(
581
+ self.app.client_manager.sdk_connection.identity, '3'
582
+ )
557
583
 
558
584
  update_kwargs = {}
559
585
  if parsed_args.description:
@@ -585,7 +611,7 @@ class SetRole(command.Command):
585
611
  class ShowRole(command.ShowOne):
586
612
  _description = _("Display role details")
587
613
 
588
- def get_parser(self, prog_name):
614
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
589
615
  parser = super().get_parser(prog_name)
590
616
  parser.add_argument(
591
617
  'role',
@@ -599,8 +625,12 @@ class ShowRole(command.ShowOne):
599
625
  )
600
626
  return parser
601
627
 
602
- def take_action(self, parsed_args):
603
- identity_client = self.app.client_manager.sdk_connection.identity
628
+ def take_action(
629
+ self, parsed_args: argparse.Namespace
630
+ ) -> tuple[Sequence[str], Iterable[Any]]:
631
+ identity_client = sdk_utils.ensure_service_version(
632
+ self.app.client_manager.sdk_connection.identity, '3'
633
+ )
604
634
 
605
635
  domain_id = None
606
636
  if parsed_args.domain:
@@ -13,13 +13,22 @@
13
13
 
14
14
  """Identity v3 Assignment action implementations"""
15
15
 
16
+ import argparse
17
+ from collections.abc import Iterable
18
+ from typing import Any
19
+
20
+ from openstack import utils as sdk_utils
21
+ from osc_lib import exceptions
22
+
16
23
  from openstackclient import command
17
24
  from openstackclient.i18n import _
18
25
  from openstackclient.identity import common
19
26
 
20
27
 
21
- def _format_role_assignment_(assignment, include_names):
22
- def _get_names(attr):
28
+ def _format_role_assignment_(
29
+ assignment: Any, include_names: Any
30
+ ) -> tuple[Any, ...]:
31
+ def _get_names(attr: Any) -> str:
23
32
  return (
24
33
  (
25
34
  attr['name']
@@ -34,7 +43,7 @@ def _format_role_assignment_(assignment, include_names):
34
43
  else ''
35
44
  )
36
45
 
37
- def _get_ids(attr):
46
+ def _get_ids(attr: Any) -> str:
38
47
  return attr['id'] or '' if attr else ''
39
48
 
40
49
  func = _get_names if include_names else _get_ids
@@ -52,7 +61,7 @@ def _format_role_assignment_(assignment, include_names):
52
61
  class ListRoleAssignment(command.Lister):
53
62
  _description = _("List role assignments")
54
63
 
55
- def get_parser(self, prog_name):
64
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
56
65
  parser = super().get_parser(prog_name)
57
66
  parser.add_argument(
58
67
  '--effective',
@@ -117,8 +126,12 @@ class ListRoleAssignment(command.Lister):
117
126
  )
118
127
  return parser
119
128
 
120
- def take_action(self, parsed_args):
121
- identity_client = self.app.client_manager.sdk_connection.identity
129
+ def take_action(
130
+ self, parsed_args: argparse.Namespace
131
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
132
+ identity_client = sdk_utils.ensure_service_version(
133
+ self.app.client_manager.sdk_connection.identity, '3'
134
+ )
122
135
  auth_ref = self.app.client_manager.auth_ref
123
136
 
124
137
  role_id = None
@@ -151,6 +164,8 @@ class ListRoleAssignment(command.Lister):
151
164
  )
152
165
  elif parsed_args.authuser:
153
166
  if auth_ref:
167
+ if auth_ref.user_id is None:
168
+ raise exceptions.CommandError('missing auth info')
154
169
  user_id = common._find_sdk_id(
155
170
  identity_client.find_user,
156
171
  name_or_id=auth_ref.user_id,
@@ -185,6 +200,8 @@ class ListRoleAssignment(command.Lister):
185
200
  )
186
201
  elif parsed_args.authproject:
187
202
  if auth_ref:
203
+ if auth_ref.project_id is None:
204
+ raise exceptions.CommandError('missing auth info')
188
205
  project_id = common._find_sdk_id(
189
206
  identity_client.find_project,
190
207
  name_or_id=auth_ref.project_id,
@@ -15,8 +15,12 @@
15
15
 
16
16
  """Identity v3 Service action implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable, Sequence
18
20
  import logging
21
+ from typing import Any
19
22
 
23
+ from openstack import utils as sdk_utils
20
24
  from osc_lib import exceptions
21
25
  from osc_lib import utils
22
26
 
@@ -28,7 +32,7 @@ from openstackclient.identity import common
28
32
  LOG = logging.getLogger(__name__)
29
33
 
30
34
 
31
- def _format_service(service):
35
+ def _format_service(service: Any) -> tuple[tuple[str, ...], Any]:
32
36
  columns = (
33
37
  'id',
34
38
  'name',
@@ -56,7 +60,7 @@ def _format_service(service):
56
60
  class CreateService(command.ShowOne):
57
61
  _description = _("Create new service")
58
62
 
59
- def get_parser(self, prog_name):
63
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
60
64
  parser = super().get_parser(prog_name)
61
65
  parser.add_argument(
62
66
  'type',
@@ -90,8 +94,12 @@ class CreateService(command.ShowOne):
90
94
  )
91
95
  return parser
92
96
 
93
- def take_action(self, parsed_args):
94
- identity_client = self.app.client_manager.sdk_connection.identity
97
+ def take_action(
98
+ self, parsed_args: argparse.Namespace
99
+ ) -> tuple[Sequence[str], Iterable[Any]]:
100
+ identity_client = sdk_utils.ensure_service_version(
101
+ self.app.client_manager.sdk_connection.identity, '3'
102
+ )
95
103
 
96
104
  service = identity_client.create_service(
97
105
  name=parsed_args.name,
@@ -106,7 +114,7 @@ class CreateService(command.ShowOne):
106
114
  class DeleteService(command.Command):
107
115
  _description = _("Delete service(s)")
108
116
 
109
- def get_parser(self, prog_name):
117
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
110
118
  parser = super().get_parser(prog_name)
111
119
  parser.add_argument(
112
120
  'service',
@@ -116,8 +124,10 @@ class DeleteService(command.Command):
116
124
  )
117
125
  return parser
118
126
 
119
- def take_action(self, parsed_args):
120
- identity_client = self.app.client_manager.sdk_connection.identity
127
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
128
+ identity_client = sdk_utils.ensure_service_version(
129
+ self.app.client_manager.sdk_connection.identity, '3'
130
+ )
121
131
  result = 0
122
132
  for i in parsed_args.service:
123
133
  try:
@@ -145,7 +155,7 @@ class DeleteService(command.Command):
145
155
  class ListService(command.Lister):
146
156
  _description = _("List services")
147
157
 
148
- def get_parser(self, prog_name):
158
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
149
159
  parser = super().get_parser(prog_name)
150
160
  parser.add_argument(
151
161
  '--long',
@@ -155,8 +165,12 @@ class ListService(command.Lister):
155
165
  )
156
166
  return parser
157
167
 
158
- def take_action(self, parsed_args):
159
- identity_client = self.app.client_manager.sdk_connection.identity
168
+ def take_action(
169
+ self, parsed_args: argparse.Namespace
170
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
171
+ identity_client = sdk_utils.ensure_service_version(
172
+ self.app.client_manager.sdk_connection.identity, '3'
173
+ )
160
174
 
161
175
  columns: tuple[str, ...] = ('id', 'name', 'type')
162
176
  column_headers: tuple[str, ...] = ('ID', 'Name', 'Type')
@@ -175,7 +189,7 @@ class ListService(command.Lister):
175
189
  class SetService(command.Command):
176
190
  _description = _("Set service properties")
177
191
 
178
- def get_parser(self, prog_name):
192
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
179
193
  parser = super().get_parser(prog_name)
180
194
  parser.add_argument(
181
195
  'service',
@@ -214,8 +228,10 @@ class SetService(command.Command):
214
228
  )
215
229
  return parser
216
230
 
217
- def take_action(self, parsed_args):
218
- identity_client = self.app.client_manager.sdk_connection.identity
231
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
232
+ identity_client = sdk_utils.ensure_service_version(
233
+ self.app.client_manager.sdk_connection.identity, '3'
234
+ )
219
235
 
220
236
  service = common.find_service_sdk(identity_client, parsed_args.service)
221
237
  kwargs = {}
@@ -234,7 +250,7 @@ class SetService(command.Command):
234
250
  class ShowService(command.ShowOne):
235
251
  _description = _("Display service details")
236
252
 
237
- def get_parser(self, prog_name):
253
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
238
254
  parser = super().get_parser(prog_name)
239
255
  parser.add_argument(
240
256
  'service',
@@ -243,8 +259,12 @@ class ShowService(command.ShowOne):
243
259
  )
244
260
  return parser
245
261
 
246
- def take_action(self, parsed_args):
247
- identity_client = self.app.client_manager.sdk_connection.identity
262
+ def take_action(
263
+ self, parsed_args: argparse.Namespace
264
+ ) -> tuple[Sequence[str], Iterable[Any]]:
265
+ identity_client = sdk_utils.ensure_service_version(
266
+ self.app.client_manager.sdk_connection.identity, '3'
267
+ )
248
268
 
249
269
  service = common.find_service_sdk(identity_client, parsed_args.service)
250
270
 
@@ -13,8 +13,12 @@
13
13
 
14
14
  """Service Provider action implementations"""
15
15
 
16
+ import argparse
17
+ from collections.abc import Iterable, Sequence
16
18
  import logging
19
+ from typing import Any
17
20
 
21
+ from openstack import utils as sdk_utils
18
22
  from osc_lib import exceptions
19
23
  from osc_lib import utils
20
24
 
@@ -25,7 +29,7 @@ from openstackclient.i18n import _
25
29
  LOG = logging.getLogger(__name__)
26
30
 
27
31
 
28
- def _format_service_provider(sp):
32
+ def _format_service_provider(sp: Any) -> tuple[tuple[str, ...], Any]:
29
33
  column_headers = (
30
34
  'id',
31
35
  'enabled',
@@ -51,7 +55,7 @@ def _format_service_provider(sp):
51
55
  class CreateServiceProvider(command.ShowOne):
52
56
  _description = _("Create new service provider")
53
57
 
54
- def get_parser(self, prog_name):
58
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
55
59
  parser = super().get_parser(prog_name)
56
60
  parser.add_argument(
57
61
  'service_provider_id',
@@ -98,8 +102,12 @@ class CreateServiceProvider(command.ShowOne):
98
102
 
99
103
  return parser
100
104
 
101
- def take_action(self, parsed_args):
102
- service_client = self.app.client_manager.sdk_connection.identity
105
+ def take_action(
106
+ self, parsed_args: argparse.Namespace
107
+ ) -> tuple[Sequence[str], Iterable[Any]]:
108
+ service_client = sdk_utils.ensure_service_version(
109
+ self.app.client_manager.sdk_connection.identity, '3'
110
+ )
103
111
 
104
112
  kwargs = {}
105
113
 
@@ -125,7 +133,7 @@ class CreateServiceProvider(command.ShowOne):
125
133
  class DeleteServiceProvider(command.Command):
126
134
  _description = _("Delete service provider(s)")
127
135
 
128
- def get_parser(self, prog_name):
136
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
129
137
  parser = super().get_parser(prog_name)
130
138
  parser.add_argument(
131
139
  'service_provider',
@@ -135,8 +143,10 @@ class DeleteServiceProvider(command.Command):
135
143
  )
136
144
  return parser
137
145
 
138
- def take_action(self, parsed_args):
139
- service_client = self.app.client_manager.sdk_connection.identity
146
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
147
+ service_client = sdk_utils.ensure_service_version(
148
+ self.app.client_manager.sdk_connection.identity, '3'
149
+ )
140
150
  result = 0
141
151
  for i in parsed_args.service_provider:
142
152
  try:
@@ -162,8 +172,12 @@ class DeleteServiceProvider(command.Command):
162
172
  class ListServiceProvider(command.Lister):
163
173
  _description = _("List service providers")
164
174
 
165
- def take_action(self, parsed_args):
166
- service_client = self.app.client_manager.sdk_connection.identity
175
+ def take_action(
176
+ self, parsed_args: argparse.Namespace
177
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
178
+ service_client = sdk_utils.ensure_service_version(
179
+ self.app.client_manager.sdk_connection.identity, '3'
180
+ )
167
181
  data = service_client.service_providers()
168
182
 
169
183
  column_headers = (
@@ -191,7 +205,7 @@ class ListServiceProvider(command.Lister):
191
205
  class SetServiceProvider(command.ShowOne):
192
206
  _description = _("Set service provider properties")
193
207
 
194
- def get_parser(self, prog_name):
208
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
195
209
  parser = super().get_parser(prog_name)
196
210
  parser.add_argument(
197
211
  'service_provider',
@@ -233,8 +247,12 @@ class SetServiceProvider(command.ShowOne):
233
247
  )
234
248
  return parser
235
249
 
236
- def take_action(self, parsed_args):
237
- service_client = self.app.client_manager.sdk_connection.identity
250
+ def take_action(
251
+ self, parsed_args: argparse.Namespace
252
+ ) -> tuple[Sequence[str], Iterable[Any]]:
253
+ service_client = sdk_utils.ensure_service_version(
254
+ self.app.client_manager.sdk_connection.identity, '3'
255
+ )
238
256
 
239
257
  kwargs = {}
240
258
 
@@ -261,7 +279,7 @@ class SetServiceProvider(command.ShowOne):
261
279
  class ShowServiceProvider(command.ShowOne):
262
280
  _description = _("Display service provider details")
263
281
 
264
- def get_parser(self, prog_name):
282
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
265
283
  parser = super().get_parser(prog_name)
266
284
  parser.add_argument(
267
285
  'service_provider',
@@ -270,8 +288,12 @@ class ShowServiceProvider(command.ShowOne):
270
288
  )
271
289
  return parser
272
290
 
273
- def take_action(self, parsed_args):
274
- service_client = self.app.client_manager.sdk_connection.identity
291
+ def take_action(
292
+ self, parsed_args: argparse.Namespace
293
+ ) -> tuple[Sequence[str], Iterable[Any]]:
294
+ service_client = sdk_utils.ensure_service_version(
295
+ self.app.client_manager.sdk_connection.identity, '3'
296
+ )
275
297
  service_provider = service_client.find_service_provider(
276
298
  parsed_args.service_provider,
277
299
  ignore_missing=False,
@@ -11,16 +11,27 @@
11
11
  # under the License.
12
12
 
13
13
  import argparse
14
+ from collections.abc import Sequence
15
+ from typing import Any
14
16
 
15
17
  from openstackclient.i18n import _
16
18
 
17
19
 
18
20
  class _CommaListAction(argparse.Action):
19
- def __call__(self, parser, namespace, values, option_string=None):
20
- setattr(namespace, self.dest, values.split(','))
21
+ def __call__(
22
+ self,
23
+ parser: argparse.ArgumentParser,
24
+ namespace: argparse.Namespace,
25
+ values: str | Sequence[Any] | None,
26
+ option_string: str | None = None,
27
+ ) -> None:
28
+ values = values.split(',') if isinstance(values, str) else values
29
+ setattr(namespace, self.dest, values)
21
30
 
22
31
 
23
- def add_tag_filtering_option_to_parser(parser, collection_name):
32
+ def add_tag_filtering_option_to_parser(
33
+ parser: argparse.ArgumentParser, collection_name: str
34
+ ) -> None:
24
35
  parser.add_argument(
25
36
  '--tags',
26
37
  metavar='<tag>[,<tag>,...]',
@@ -63,7 +74,9 @@ def add_tag_filtering_option_to_parser(parser, collection_name):
63
74
  )
64
75
 
65
76
 
66
- def get_tag_filtering_args(parsed_args, args):
77
+ def get_tag_filtering_args(
78
+ parsed_args: argparse.Namespace, args: dict[str, Any]
79
+ ) -> None:
67
80
  if parsed_args.tags:
68
81
  args['tags'] = ','.join(parsed_args.tags)
69
82
  if parsed_args.tags_any:
@@ -74,7 +87,9 @@ def get_tag_filtering_args(parsed_args, args):
74
87
  args['not-tags-any'] = ','.join(parsed_args.not_tags_any)
75
88
 
76
89
 
77
- def add_tag_option_to_parser_for_create(parser, resource_name):
90
+ def add_tag_option_to_parser_for_create(
91
+ parser: argparse.ArgumentParser, resource_name: str
92
+ ) -> None:
78
93
  tag_group = parser.add_mutually_exclusive_group()
79
94
  tag_group.add_argument(
80
95
  '--tag',
@@ -89,7 +104,9 @@ def add_tag_option_to_parser_for_create(parser, resource_name):
89
104
  )
90
105
 
91
106
 
92
- def add_tag_option_to_parser_for_set(parser, resource_name):
107
+ def add_tag_option_to_parser_for_set(
108
+ parser: argparse.ArgumentParser, resource_name: str
109
+ ) -> None:
93
110
  parser.add_argument(
94
111
  '--tag',
95
112
  action='append',