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,7 +15,10 @@
15
15
 
16
16
  """Identity v3 Policy 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 osc_lib import exceptions
21
24
  from osc_lib import utils
@@ -30,7 +33,7 @@ LOG = logging.getLogger(__name__)
30
33
  class CreatePolicy(command.ShowOne):
31
34
  _description = _("Create new policy")
32
35
 
33
- def get_parser(self, prog_name):
36
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
34
37
  parser = super().get_parser(prog_name)
35
38
  parser.add_argument(
36
39
  '--type',
@@ -48,7 +51,9 @@ class CreatePolicy(command.ShowOne):
48
51
  )
49
52
  return parser
50
53
 
51
- def take_action(self, parsed_args):
54
+ def take_action(
55
+ self, parsed_args: argparse.Namespace
56
+ ) -> tuple[Sequence[str], Iterable[Any]]:
52
57
  blob = utils.read_blob_file_contents(parsed_args.rules)
53
58
 
54
59
  identity_client = self.app.client_manager.identity
@@ -58,13 +63,14 @@ class CreatePolicy(command.ShowOne):
58
63
 
59
64
  policy._info.pop('links')
60
65
  policy._info.update({'rules': policy._info.pop('blob')})
61
- return zip(*sorted(policy._info.items()))
66
+ col_headers, col_data = zip(*sorted(policy._info.items()))
67
+ return col_headers, col_data
62
68
 
63
69
 
64
70
  class DeletePolicy(command.Command):
65
71
  _description = _("Delete policy(s)")
66
72
 
67
- def get_parser(self, prog_name):
73
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
68
74
  parser = super().get_parser(prog_name)
69
75
  parser.add_argument(
70
76
  'policy',
@@ -74,7 +80,7 @@ class DeletePolicy(command.Command):
74
80
  )
75
81
  return parser
76
82
 
77
- def take_action(self, parsed_args):
83
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
78
84
  identity_client = self.app.client_manager.identity
79
85
  result = 0
80
86
  for i in parsed_args.policy:
@@ -102,7 +108,7 @@ class DeletePolicy(command.Command):
102
108
  class ListPolicy(command.Lister):
103
109
  _description = _("List policies")
104
110
 
105
- def get_parser(self, prog_name):
111
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
106
112
  parser = super().get_parser(prog_name)
107
113
  parser.add_argument(
108
114
  '--long',
@@ -112,7 +118,9 @@ class ListPolicy(command.Lister):
112
118
  )
113
119
  return parser
114
120
 
115
- def take_action(self, parsed_args):
121
+ def take_action(
122
+ self, parsed_args: argparse.Namespace
123
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
116
124
  columns: tuple[str, ...] = ('ID', 'Type')
117
125
  column_headers: tuple[str, ...] = columns
118
126
  if parsed_args.long:
@@ -135,7 +143,7 @@ class ListPolicy(command.Lister):
135
143
  class SetPolicy(command.Command):
136
144
  _description = _("Set policy properties")
137
145
 
138
- def get_parser(self, prog_name):
146
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
139
147
  parser = super().get_parser(prog_name)
140
148
  parser.add_argument(
141
149
  'policy',
@@ -154,7 +162,7 @@ class SetPolicy(command.Command):
154
162
  )
155
163
  return parser
156
164
 
157
- def take_action(self, parsed_args):
165
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
158
166
  identity_client = self.app.client_manager.identity
159
167
  blob = None
160
168
 
@@ -173,7 +181,7 @@ class SetPolicy(command.Command):
173
181
  class ShowPolicy(command.ShowOne):
174
182
  _description = _("Display policy details")
175
183
 
176
- def get_parser(self, prog_name):
184
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
177
185
  parser = super().get_parser(prog_name)
178
186
  parser.add_argument(
179
187
  'policy',
@@ -182,7 +190,9 @@ class ShowPolicy(command.ShowOne):
182
190
  )
183
191
  return parser
184
192
 
185
- def take_action(self, parsed_args):
193
+ def take_action(
194
+ self, parsed_args: argparse.Namespace
195
+ ) -> tuple[Sequence[str], Iterable[Any]]:
186
196
  identity_client = self.app.client_manager.identity
187
197
  policy = utils.find_resource(
188
198
  identity_client.policies, parsed_args.policy
@@ -190,4 +200,5 @@ class ShowPolicy(command.ShowOne):
190
200
 
191
201
  policy._info.pop('links')
192
202
  policy._info.update({'rules': policy._info.pop('blob')})
193
- return zip(*sorted(policy._info.items()))
203
+ col_headers, col_data = zip(*sorted(policy._info.items()))
204
+ return col_headers, col_data
@@ -15,9 +15,13 @@
15
15
 
16
16
  """Project 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.cli import parseractions
22
26
  from osc_lib import exceptions
23
27
  from osc_lib import utils
@@ -30,7 +34,7 @@ from openstackclient.identity.v3 import tag
30
34
  LOG = logging.getLogger(__name__)
31
35
 
32
36
 
33
- def _format_project(project):
37
+ def _format_project(project: Any) -> tuple[tuple[str, ...], Any]:
34
38
  # NOTE(0weng): Projects allow unknown attributes in the body, so extract
35
39
  # the column names separately.
36
40
  (column_headers, columns) = utils.get_osc_show_columns_for_sdk_resource(
@@ -48,7 +52,7 @@ def _format_project(project):
48
52
  class CreateProject(command.ShowOne):
49
53
  _description = _("Create new project")
50
54
 
51
- def get_parser(self, prog_name):
55
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
52
56
  parser = super().get_parser(prog_name)
53
57
  parser.add_argument(
54
58
  'name',
@@ -104,8 +108,12 @@ class CreateProject(command.ShowOne):
104
108
  tag.add_tag_option_to_parser_for_create(parser, _('project'))
105
109
  return parser
106
110
 
107
- def take_action(self, parsed_args):
108
- identity_client = self.app.client_manager.sdk_connection.identity
111
+ def take_action(
112
+ self, parsed_args: argparse.Namespace
113
+ ) -> tuple[Sequence[str], Iterable[Any]]:
114
+ identity_client = sdk_utils.ensure_service_version(
115
+ self.app.client_manager.sdk_connection.identity, '3'
116
+ )
109
117
 
110
118
  kwargs = {}
111
119
 
@@ -181,7 +189,7 @@ class DeleteProject(command.Command):
181
189
  "regardless."
182
190
  )
183
191
 
184
- def get_parser(self, prog_name):
192
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
185
193
  parser = super().get_parser(prog_name)
186
194
  parser.add_argument(
187
195
  'projects',
@@ -196,8 +204,10 @@ class DeleteProject(command.Command):
196
204
  )
197
205
  return parser
198
206
 
199
- def take_action(self, parsed_args):
200
- identity_client = self.app.client_manager.sdk_connection.identity
207
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
208
+ identity_client = sdk_utils.ensure_service_version(
209
+ self.app.client_manager.sdk_connection.identity, '3'
210
+ )
201
211
 
202
212
  errors = 0
203
213
  for project in parsed_args.projects:
@@ -232,7 +242,7 @@ class DeleteProject(command.Command):
232
242
  class ListProject(command.Lister):
233
243
  _description = _("List projects")
234
244
 
235
- def get_parser(self, prog_name):
245
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
236
246
  parser = super().get_parser(prog_name)
237
247
  parser.add_argument(
238
248
  '--domain',
@@ -289,8 +299,12 @@ class ListProject(command.Lister):
289
299
  tag.add_tag_filtering_option_to_parser(parser, _('projects'))
290
300
  return parser
291
301
 
292
- def take_action(self, parsed_args):
293
- identity_client = self.app.client_manager.sdk_connection.identity
302
+ def take_action(
303
+ self, parsed_args: argparse.Namespace
304
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
305
+ identity_client = sdk_utils.ensure_service_version(
306
+ self.app.client_manager.sdk_connection.identity, '3'
307
+ )
294
308
 
295
309
  column_headers: tuple[str, ...] = ('ID', 'Name')
296
310
  if parsed_args.long:
@@ -342,21 +356,21 @@ class ListProject(command.Lister):
342
356
  user = self.app.client_manager.auth_ref.user_id
343
357
 
344
358
  if user:
345
- data = identity_client.user_projects(user, **kwargs)
359
+ data = list(identity_client.user_projects(user, **kwargs))
346
360
  else:
347
361
  try:
348
- data = identity_client.projects(**kwargs)
362
+ data = list(identity_client.projects(**kwargs))
349
363
  except sdk_exc.ForbiddenException:
350
364
  # NOTE(adriant): if no filters, assume a forbidden is non-admin
351
365
  # wanting their own project list.
352
366
  if not kwargs:
353
367
  user = self.app.client_manager.auth_ref.user_id
354
- data = identity_client.user_projects(user)
368
+ data = list(identity_client.user_projects(user))
355
369
  else:
356
370
  raise
357
371
 
358
372
  if parsed_args.sort:
359
- data = utils.sort_items(data, parsed_args.sort)
373
+ data = list(utils.sort_items(data, parsed_args.sort))
360
374
 
361
375
  return (
362
376
  column_headers,
@@ -367,7 +381,7 @@ class ListProject(command.Lister):
367
381
  class SetProject(command.Command):
368
382
  _description = _("Set project properties")
369
383
 
370
- def get_parser(self, prog_name):
384
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
371
385
  parser = super().get_parser(prog_name)
372
386
  parser.add_argument(
373
387
  'project',
@@ -418,8 +432,10 @@ class SetProject(command.Command):
418
432
  tag.add_tag_option_to_parser_for_set(parser, _('project'))
419
433
  return parser
420
434
 
421
- def take_action(self, parsed_args):
422
- identity_client = self.app.client_manager.sdk_connection.identity
435
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
436
+ identity_client = sdk_utils.ensure_service_version(
437
+ self.app.client_manager.sdk_connection.identity, '3'
438
+ )
423
439
 
424
440
  kwargs = {}
425
441
  if parsed_args.name:
@@ -481,7 +497,7 @@ class SetProject(command.Command):
481
497
  class ShowProject(command.ShowOne):
482
498
  _description = _("Display project details")
483
499
 
484
- def get_parser(self, prog_name):
500
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
485
501
  parser = super().get_parser(prog_name)
486
502
  parser.add_argument(
487
503
  'project',
@@ -507,10 +523,14 @@ class ShowProject(command.ShowOne):
507
523
  )
508
524
  return parser
509
525
 
510
- def take_action(self, parsed_args):
511
- identity_client = self.app.client_manager.sdk_connection.identity
526
+ def take_action(
527
+ self, parsed_args: argparse.Namespace
528
+ ) -> tuple[Sequence[str], Iterable[Any]]:
529
+ identity_client = sdk_utils.ensure_service_version(
530
+ self.app.client_manager.sdk_connection.identity, '3'
531
+ )
512
532
 
513
- kwargs = {}
533
+ kwargs: dict[str, Any] = {}
514
534
 
515
535
  domain = None
516
536
  if parsed_args.domain:
@@ -536,8 +556,8 @@ class ShowProject(command.ShowOne):
536
556
  if parsed_args.children:
537
557
  kwargs['subtree_as_ids'] = True
538
558
 
539
- project = identity_client.find_project(
559
+ project_obj = identity_client.find_project(
540
560
  project, **kwargs, ignore_missing=False
541
561
  )
542
562
 
543
- return _format_project(project)
563
+ return _format_project(project_obj)
@@ -13,8 +13,12 @@
13
13
 
14
14
  """Identity v3 Region 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_region(region):
32
+ def _format_region(region: Any) -> tuple[tuple[str, ...], Any]:
29
33
  columns = ('id', 'description', 'parent_region_id')
30
34
  column_headers = ('region', 'description', 'parent_region')
31
35
  return (
@@ -37,7 +41,7 @@ def _format_region(region):
37
41
  class CreateRegion(command.ShowOne):
38
42
  _description = _("Create new region")
39
43
 
40
- def get_parser(self, prog_name):
44
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
41
45
  parser = super().get_parser(prog_name)
42
46
  # NOTE(stevemar): The API supports an optional region ID, but that
43
47
  # seems like poor UX, we will only support user-defined IDs.
@@ -58,8 +62,12 @@ class CreateRegion(command.ShowOne):
58
62
  )
59
63
  return parser
60
64
 
61
- def take_action(self, parsed_args):
62
- identity_client = self.app.client_manager.sdk_connection.identity
65
+ def take_action(
66
+ self, parsed_args: argparse.Namespace
67
+ ) -> tuple[Sequence[str], Iterable[Any]]:
68
+ identity_client = sdk_utils.ensure_service_version(
69
+ self.app.client_manager.sdk_connection.identity, '3'
70
+ )
63
71
 
64
72
  region = identity_client.create_region(
65
73
  id=parsed_args.region,
@@ -73,7 +81,7 @@ class CreateRegion(command.ShowOne):
73
81
  class DeleteRegion(command.Command):
74
82
  _description = _("Delete region(s)")
75
83
 
76
- def get_parser(self, prog_name):
84
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
77
85
  parser = super().get_parser(prog_name)
78
86
  parser.add_argument(
79
87
  'region',
@@ -83,8 +91,10 @@ class DeleteRegion(command.Command):
83
91
  )
84
92
  return parser
85
93
 
86
- def take_action(self, parsed_args):
87
- identity_client = self.app.client_manager.sdk_connection.identity
94
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
95
+ identity_client = sdk_utils.ensure_service_version(
96
+ self.app.client_manager.sdk_connection.identity, '3'
97
+ )
88
98
  result = 0
89
99
  for i in parsed_args.region:
90
100
  try:
@@ -108,7 +118,7 @@ class DeleteRegion(command.Command):
108
118
  class ListRegion(command.Lister):
109
119
  _description = _("List regions")
110
120
 
111
- def get_parser(self, prog_name):
121
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
112
122
  parser = super().get_parser(prog_name)
113
123
  parser.add_argument(
114
124
  '--parent-region',
@@ -117,8 +127,12 @@ class ListRegion(command.Lister):
117
127
  )
118
128
  return parser
119
129
 
120
- def take_action(self, parsed_args):
121
- identity_client = self.app.client_manager.sdk_connection.identity
130
+ def take_action(
131
+ self, parsed_args: argparse.Namespace
132
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
133
+ identity_client = sdk_utils.ensure_service_version(
134
+ self.app.client_manager.sdk_connection.identity, '3'
135
+ )
122
136
 
123
137
  kwargs = {}
124
138
  if parsed_args.parent_region:
@@ -144,7 +158,7 @@ class ListRegion(command.Lister):
144
158
  class SetRegion(command.Command):
145
159
  _description = _("Set region properties")
146
160
 
147
- def get_parser(self, prog_name):
161
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
148
162
  parser = super().get_parser(prog_name)
149
163
  parser.add_argument(
150
164
  'region',
@@ -163,8 +177,10 @@ class SetRegion(command.Command):
163
177
  )
164
178
  return parser
165
179
 
166
- def take_action(self, parsed_args):
167
- identity_client = self.app.client_manager.sdk_connection.identity
180
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
181
+ identity_client = sdk_utils.ensure_service_version(
182
+ self.app.client_manager.sdk_connection.identity, '3'
183
+ )
168
184
 
169
185
  kwargs = {}
170
186
  if parsed_args.description:
@@ -178,7 +194,7 @@ class SetRegion(command.Command):
178
194
  class ShowRegion(command.ShowOne):
179
195
  _description = _("Display region details")
180
196
 
181
- def get_parser(self, prog_name):
197
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
182
198
  parser = super().get_parser(prog_name)
183
199
  parser.add_argument(
184
200
  'region',
@@ -187,8 +203,12 @@ class ShowRegion(command.ShowOne):
187
203
  )
188
204
  return parser
189
205
 
190
- def take_action(self, parsed_args):
191
- identity_client = self.app.client_manager.sdk_connection.identity
206
+ def take_action(
207
+ self, parsed_args: argparse.Namespace
208
+ ) -> tuple[Sequence[str], Iterable[Any]]:
209
+ identity_client = sdk_utils.ensure_service_version(
210
+ self.app.client_manager.sdk_connection.identity, '3'
211
+ )
192
212
 
193
213
  region = identity_client.get_region(parsed_args.region)
194
214
 
@@ -13,8 +13,12 @@
13
13
 
14
14
  """Registered limits 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,9 @@ from openstackclient.identity import common as common_utils
25
29
  LOG = logging.getLogger(__name__)
26
30
 
27
31
 
28
- def _format_registered_limit(registered_limit):
32
+ def _format_registered_limit(
33
+ registered_limit: Any,
34
+ ) -> tuple[tuple[str, ...], Any]:
29
35
  columns = (
30
36
  'default_limit',
31
37
  'description',
@@ -51,7 +57,7 @@ def _format_registered_limit(registered_limit):
51
57
  class CreateRegisteredLimit(command.ShowOne):
52
58
  _description = _("Create a registered limit")
53
59
 
54
- def get_parser(self, prog_name):
60
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
55
61
  parser = super().get_parser(prog_name)
56
62
  parser.add_argument(
57
63
  '--description',
@@ -86,8 +92,12 @@ class CreateRegisteredLimit(command.ShowOne):
86
92
  )
87
93
  return parser
88
94
 
89
- def take_action(self, parsed_args):
90
- identity_client = self.app.client_manager.sdk_connection.identity
95
+ def take_action(
96
+ self, parsed_args: argparse.Namespace
97
+ ) -> tuple[Sequence[str], Iterable[Any]]:
98
+ identity_client = sdk_utils.ensure_service_version(
99
+ self.app.client_manager.sdk_connection.identity, '3'
100
+ )
91
101
 
92
102
  kwargs = {}
93
103
 
@@ -114,7 +124,7 @@ class CreateRegisteredLimit(command.ShowOne):
114
124
  class DeleteRegisteredLimit(command.Command):
115
125
  _description = _("Delete a registered limit")
116
126
 
117
- def get_parser(self, prog_name):
127
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
118
128
  parser = super().get_parser(prog_name)
119
129
  parser.add_argument(
120
130
  'registered_limits',
@@ -127,8 +137,10 @@ class DeleteRegisteredLimit(command.Command):
127
137
  )
128
138
  return parser
129
139
 
130
- def take_action(self, parsed_args):
131
- identity_client = self.app.client_manager.sdk_connection.identity
140
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
141
+ identity_client = sdk_utils.ensure_service_version(
142
+ self.app.client_manager.sdk_connection.identity, '3'
143
+ )
132
144
 
133
145
  errors = 0
134
146
  for registered_limit_id in parsed_args.registered_limits:
@@ -160,7 +172,7 @@ class DeleteRegisteredLimit(command.Command):
160
172
  class ListRegisteredLimit(command.Lister):
161
173
  _description = _("List registered limits")
162
174
 
163
- def get_parser(self, prog_name):
175
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
164
176
  parser = super().get_parser(prog_name)
165
177
  parser.add_argument(
166
178
  '--service',
@@ -182,8 +194,12 @@ class ListRegisteredLimit(command.Lister):
182
194
  )
183
195
  return parser
184
196
 
185
- def take_action(self, parsed_args):
186
- identity_client = self.app.client_manager.sdk_connection.identity
197
+ def take_action(
198
+ self, parsed_args: argparse.Namespace
199
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
200
+ identity_client = sdk_utils.ensure_service_version(
201
+ self.app.client_manager.sdk_connection.identity, '3'
202
+ )
187
203
 
188
204
  kwargs = {}
189
205
  if parsed_args.service:
@@ -217,7 +233,7 @@ class ListRegisteredLimit(command.Lister):
217
233
  class SetRegisteredLimit(command.ShowOne):
218
234
  _description = _("Update information about a registered limit")
219
235
 
220
- def get_parser(self, prog_name):
236
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
221
237
  parser = super().get_parser(prog_name)
222
238
  parser.add_argument(
223
239
  'registered_limit_id',
@@ -267,8 +283,12 @@ class SetRegisteredLimit(command.ShowOne):
267
283
  )
268
284
  return parser
269
285
 
270
- def take_action(self, parsed_args):
271
- identity_client = self.app.client_manager.sdk_connection.identity
286
+ def take_action(
287
+ self, parsed_args: argparse.Namespace
288
+ ) -> tuple[Sequence[str], Iterable[Any]]:
289
+ identity_client = sdk_utils.ensure_service_version(
290
+ self.app.client_manager.sdk_connection.identity, '3'
291
+ )
272
292
 
273
293
  kwargs = {}
274
294
  if parsed_args.service:
@@ -300,7 +320,7 @@ class SetRegisteredLimit(command.ShowOne):
300
320
  class ShowRegisteredLimit(command.ShowOne):
301
321
  _description = _("Display registered limit details")
302
322
 
303
- def get_parser(self, prog_name):
323
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
304
324
  parser = super().get_parser(prog_name)
305
325
  parser.add_argument(
306
326
  'registered_limit_id',
@@ -309,8 +329,12 @@ class ShowRegisteredLimit(command.ShowOne):
309
329
  )
310
330
  return parser
311
331
 
312
- def take_action(self, parsed_args):
313
- identity_client = self.app.client_manager.sdk_connection.identity
332
+ def take_action(
333
+ self, parsed_args: argparse.Namespace
334
+ ) -> tuple[Sequence[str], Iterable[Any]]:
335
+ identity_client = sdk_utils.ensure_service_version(
336
+ self.app.client_manager.sdk_connection.identity, '3'
337
+ )
314
338
  registered_limit = identity_client.get_registered_limit(
315
339
  parsed_args.registered_limit_id
316
340
  )