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
@@ -18,11 +18,13 @@ import argparse
18
18
  import copy
19
19
  import functools
20
20
  import logging
21
- import typing as ty
21
+ from collections.abc import Iterable, Sequence
22
+ from typing import Any
22
23
 
23
24
  from cliff import columns as cliff_columns
24
25
  from openstack.block_storage.v2 import volume as _volume
25
26
  from openstack import exceptions as sdk_exceptions
27
+ from openstack import utils as sdk_utils
26
28
  from osc_lib.cli import format_columns
27
29
  from osc_lib.cli import parseractions
28
30
  from osc_lib import exceptions
@@ -43,14 +45,20 @@ class KeyValueHintAction(argparse.Action):
43
45
 
44
46
  APPEND_KEYS = ('same_host', 'different_host')
45
47
 
46
- def __init__(self, *args, **kwargs):
48
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
47
49
  self._key_value_action = parseractions.KeyValueAction(*args, **kwargs)
48
50
  self._key_value_append_action = parseractions.KeyValueAppendAction(
49
51
  *args, **kwargs
50
52
  )
51
53
  super().__init__(*args, **kwargs)
52
54
 
53
- def __call__(self, parser, namespace, values, option_string=None):
55
+ def __call__(
56
+ self,
57
+ parser: argparse.ArgumentParser,
58
+ namespace: argparse.Namespace,
59
+ values: Any,
60
+ option_string: str | None = None,
61
+ ) -> None:
54
62
  if values.startswith(self.APPEND_KEYS):
55
63
  self._key_value_append_action(
56
64
  parser, namespace, values, option_string=option_string
@@ -61,7 +69,7 @@ class KeyValueHintAction(argparse.Action):
61
69
  )
62
70
 
63
71
 
64
- class AttachmentsColumn(cliff_columns.FormattableColumn[list[ty.Any]]):
72
+ class AttachmentsColumn(cliff_columns.FormattableColumn[list[Any]]):
65
73
  """Formattable column for attachments column.
66
74
 
67
75
  Unlike the parent FormattableColumn class, the initializer of the
@@ -72,11 +80,13 @@ class AttachmentsColumn(cliff_columns.FormattableColumn[list[ty.Any]]):
72
80
  ``functools.partial(AttachmentsColumn, server_cache)``.
73
81
  """
74
82
 
75
- def __init__(self, value, server_cache=None):
83
+ def __init__(
84
+ self, value: list[Any], server_cache: dict[str, Any] | None = None
85
+ ) -> None:
76
86
  super().__init__(value)
77
87
  self._server_cache = server_cache or {}
78
88
 
79
- def human_readable(self):
89
+ def human_readable(self) -> str:
80
90
  """Return a formatted string of a volume's attached instances
81
91
 
82
92
  :rtype: a string of formatted instances
@@ -92,7 +102,7 @@ class AttachmentsColumn(cliff_columns.FormattableColumn[list[ty.Any]]):
92
102
  return msg
93
103
 
94
104
 
95
- def _format_volume(volume: _volume.Volume) -> dict[str, ty.Any]:
105
+ def _format_volume(volume: _volume.Volume) -> dict[str, Any]:
96
106
  # Some columns returned by openstacksdk should not be shown because they're
97
107
  # either irrelevant or duplicates
98
108
  ignored_columns = {
@@ -137,7 +147,7 @@ class CreateVolume(command.ShowOne):
137
147
  _description = _("Create new volume")
138
148
 
139
149
  @staticmethod
140
- def _check_size_arg(args):
150
+ def _check_size_arg(args: argparse.Namespace) -> None:
141
151
  """Check whether --size option is required or not.
142
152
 
143
153
  Require size parameter only in case when snapshot or source
@@ -151,7 +161,7 @@ class CreateVolume(command.ShowOne):
151
161
  )
152
162
  raise exceptions.CommandError(msg)
153
163
 
154
- def get_parser(self, prog_name):
164
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
155
165
  parser = super().get_parser(prog_name)
156
166
  parser.add_argument(
157
167
  "name",
@@ -262,7 +272,9 @@ class CreateVolume(command.ShowOne):
262
272
  )
263
273
  return parser
264
274
 
265
- def take_action(self, parsed_args):
275
+ def take_action(
276
+ self, parsed_args: argparse.Namespace
277
+ ) -> tuple[Sequence[str], Iterable[Any]]:
266
278
  self._check_size_arg(parsed_args)
267
279
  # size is validated in the above call to
268
280
  # _check_size_arg where we check that size
@@ -270,7 +282,9 @@ class CreateVolume(command.ShowOne):
270
282
  # volume from snapshot or source volume
271
283
  size = parsed_args.size
272
284
 
273
- volume_client = self.app.client_manager.sdk_connection.volume
285
+ volume_client = sdk_utils.ensure_service_version(
286
+ self.app.client_manager.sdk_connection.volume, '2'
287
+ )
274
288
  image_client = self.app.client_manager.image
275
289
 
276
290
  source_volume = None
@@ -366,13 +380,14 @@ class CreateVolume(command.ShowOne):
366
380
  )
367
381
 
368
382
  data = _format_volume(volume)
369
- return zip(*sorted(data.items()))
383
+ col_headers, col_data = zip(*sorted(data.items()))
384
+ return col_headers, col_data
370
385
 
371
386
 
372
387
  class DeleteVolume(command.Command):
373
388
  _description = _("Delete volume(s)")
374
389
 
375
- def get_parser(self, prog_name):
390
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
376
391
  parser = super().get_parser(prog_name)
377
392
  parser.add_argument(
378
393
  "volumes",
@@ -405,8 +420,10 @@ class DeleteVolume(command.Command):
405
420
  )
406
421
  return parser
407
422
 
408
- def take_action(self, parsed_args):
409
- volume_client = self.app.client_manager.sdk_connection.volume
423
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
424
+ volume_client = sdk_utils.ensure_service_version(
425
+ self.app.client_manager.sdk_connection.volume, '2'
426
+ )
410
427
  result = 0
411
428
 
412
429
  for volume in parsed_args.volumes:
@@ -441,7 +458,7 @@ class DeleteVolume(command.Command):
441
458
  class ListVolume(command.Lister):
442
459
  _description = _("List volumes")
443
460
 
444
- def get_parser(self, prog_name):
461
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
445
462
  parser = super().get_parser(prog_name)
446
463
  parser.add_argument(
447
464
  '--project',
@@ -480,7 +497,9 @@ class ListVolume(command.Lister):
480
497
  pagination.add_marker_pagination_option_to_parser(parser)
481
498
  return parser
482
499
 
483
- def take_action(self, parsed_args):
500
+ def take_action(
501
+ self, parsed_args: argparse.Namespace
502
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
484
503
  volume_client = self.app.client_manager.volume
485
504
  identity_client = self.app.client_manager.identity
486
505
 
@@ -555,7 +574,7 @@ class ListVolume(command.Lister):
555
574
  compute_client = self.app.client_manager.compute
556
575
  for s in compute_client.servers():
557
576
  server_cache[s.id] = s
558
- except sdk_exceptions.SDKException: # noqa: S110
577
+ except sdk_exceptions.SDKException:
559
578
  # Just forget it if there's any trouble
560
579
  pass
561
580
  AttachmentsColumnWithCache = functools.partial(
@@ -585,7 +604,7 @@ class ListVolume(command.Lister):
585
604
  class MigrateVolume(command.Command):
586
605
  _description = _("Migrate volume to a new host")
587
606
 
588
- def get_parser(self, prog_name):
607
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
589
608
  parser = super().get_parser(prog_name)
590
609
  parser.add_argument(
591
610
  'volume',
@@ -619,8 +638,11 @@ class MigrateVolume(command.Command):
619
638
  )
620
639
  return parser
621
640
 
622
- def take_action(self, parsed_args):
623
- volume_client = self.app.client_manager.sdk_connection.volume
641
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
642
+ volume_client = sdk_utils.ensure_service_version(
643
+ self.app.client_manager.sdk_connection.volume, '2'
644
+ )
645
+
624
646
  volume = volume_client.find_volume(
625
647
  parsed_args.volume, ignore_missing=False
626
648
  )
@@ -635,7 +657,7 @@ class MigrateVolume(command.Command):
635
657
  class SetVolume(command.Command):
636
658
  _description = _("Set volume properties")
637
659
 
638
- def get_parser(self, prog_name):
660
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
639
661
  parser = super().get_parser(prog_name)
640
662
  parser.add_argument(
641
663
  'volume',
@@ -788,7 +810,7 @@ class SetVolume(command.Command):
788
810
  )
789
811
  return parser
790
812
 
791
- def take_action(self, parsed_args):
813
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
792
814
  volume_client = self.app.client_manager.volume
793
815
  volume = utils.find_resource(volume_client.volumes, parsed_args.volume)
794
816
 
@@ -952,7 +974,7 @@ class SetVolume(command.Command):
952
974
  class ShowVolume(command.ShowOne):
953
975
  _description = _("Display volume details")
954
976
 
955
- def get_parser(self, prog_name):
977
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
956
978
  parser = super().get_parser(prog_name)
957
979
  parser.add_argument(
958
980
  'volume',
@@ -961,20 +983,26 @@ class ShowVolume(command.ShowOne):
961
983
  )
962
984
  return parser
963
985
 
964
- def take_action(self, parsed_args):
965
- volume_client = self.app.client_manager.sdk_connection.volume
986
+ def take_action(
987
+ self, parsed_args: argparse.Namespace
988
+ ) -> tuple[Sequence[str], Iterable[Any]]:
989
+ volume_client = sdk_utils.ensure_service_version(
990
+ self.app.client_manager.sdk_connection.volume, '2'
991
+ )
992
+
966
993
  volume = volume_client.find_volume(
967
994
  parsed_args.volume, ignore_missing=False
968
995
  )
969
996
 
970
997
  data = _format_volume(volume)
971
- return zip(*sorted(data.items()))
998
+ col_headers, col_data = zip(*sorted(data.items()))
999
+ return col_headers, col_data
972
1000
 
973
1001
 
974
1002
  class UnsetVolume(command.Command):
975
1003
  _description = _("Unset volume properties")
976
1004
 
977
- def get_parser(self, prog_name):
1005
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
978
1006
  parser = super().get_parser(prog_name)
979
1007
  parser.add_argument(
980
1008
  'volume',
@@ -1003,7 +1031,7 @@ class UnsetVolume(command.Command):
1003
1031
  )
1004
1032
  return parser
1005
1033
 
1006
- def take_action(self, parsed_args):
1034
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
1007
1035
  volume_client = self.app.client_manager.volume
1008
1036
  volume = utils.find_resource(volume_client.volumes, parsed_args.volume)
1009
1037
 
@@ -14,6 +14,11 @@
14
14
 
15
15
  """Storage backend action implementations"""
16
16
 
17
+ import argparse
18
+ from collections.abc import Iterable, Sequence
19
+ from typing import Any
20
+
21
+ from openstack import utils as sdk_utils
17
22
  from osc_lib.cli import format_columns
18
23
  from osc_lib import utils
19
24
 
@@ -24,7 +29,7 @@ from openstackclient.i18n import _
24
29
  class ShowCapability(command.Lister):
25
30
  _description = _("Show capability command")
26
31
 
27
- def get_parser(self, prog_name):
32
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
28
33
  parser = super().get_parser(prog_name)
29
34
  parser.add_argument(
30
35
  "host",
@@ -33,8 +38,12 @@ class ShowCapability(command.Lister):
33
38
  )
34
39
  return parser
35
40
 
36
- def take_action(self, parsed_args):
37
- volume_client = self.app.client_manager.sdk_connection.volume
41
+ def take_action(
42
+ self, parsed_args: argparse.Namespace
43
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
44
+ volume_client = sdk_utils.ensure_service_version(
45
+ self.app.client_manager.sdk_connection.volume, '2'
46
+ )
38
47
 
39
48
  columns = [
40
49
  'Title',
@@ -71,7 +80,7 @@ class ShowCapability(command.Lister):
71
80
  class ListPool(command.Lister):
72
81
  _description = _("List pool command")
73
82
 
74
- def get_parser(self, prog_name):
83
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
75
84
  parser = super().get_parser(prog_name)
76
85
  parser.add_argument(
77
86
  "--long",
@@ -83,8 +92,12 @@ class ListPool(command.Lister):
83
92
  # able to pass in --filters with a <key>=<value> pair to filter on.
84
93
  return parser
85
94
 
86
- def take_action(self, parsed_args):
87
- volume_client = self.app.client_manager.sdk_connection.volume
95
+ def take_action(
96
+ self, parsed_args: argparse.Namespace
97
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
98
+ volume_client = sdk_utils.ensure_service_version(
99
+ self.app.client_manager.sdk_connection.volume, '2'
100
+ )
88
101
 
89
102
  if parsed_args.long:
90
103
  columns = [
@@ -14,10 +14,14 @@
14
14
 
15
15
  """Volume v2 Backup action implementations"""
16
16
 
17
+ import argparse
17
18
  import functools
18
19
  import logging
20
+ from collections.abc import Iterable, Sequence
21
+ from typing import Any
19
22
 
20
23
  from cliff import columns as cliff_columns
24
+ from openstack import utils as sdk_utils
21
25
  from osc_lib import exceptions
22
26
  from osc_lib import utils
23
27
 
@@ -39,11 +43,13 @@ class VolumeIdColumn(cliff_columns.FormattableColumn[str]):
39
43
  ``functools.partial(VolumeIdColumn, volume_cache)``.
40
44
  """
41
45
 
42
- def __init__(self, value, volume_cache=None):
46
+ def __init__(
47
+ self, value: str, volume_cache: dict[str, Any] | None = None
48
+ ) -> None:
43
49
  super().__init__(value)
44
50
  self._volume_cache = volume_cache or {}
45
51
 
46
- def human_readable(self):
52
+ def human_readable(self) -> str:
47
53
  """Return a volume name if available
48
54
 
49
55
  :rtype: either the volume ID or name
@@ -58,7 +64,7 @@ class VolumeIdColumn(cliff_columns.FormattableColumn[str]):
58
64
  class CreateVolumeBackup(command.ShowOne):
59
65
  _description = _("Create new volume backup")
60
66
 
61
- def get_parser(self, prog_name):
67
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
62
68
  parser = super().get_parser(prog_name)
63
69
  parser.add_argument(
64
70
  "volume",
@@ -102,8 +108,12 @@ class CreateVolumeBackup(command.ShowOne):
102
108
  )
103
109
  return parser
104
110
 
105
- def take_action(self, parsed_args):
106
- volume_client = self.app.client_manager.sdk_connection.volume
111
+ def take_action(
112
+ self, parsed_args: argparse.Namespace
113
+ ) -> tuple[Sequence[str], Iterable[Any]]:
114
+ volume_client = sdk_utils.ensure_service_version(
115
+ self.app.client_manager.sdk_connection.volume, '2'
116
+ )
107
117
 
108
118
  volume_id = volume_client.find_volume(
109
119
  parsed_args.volume,
@@ -139,7 +149,7 @@ class CreateVolumeBackup(command.ShowOne):
139
149
  class DeleteVolumeBackup(command.Command):
140
150
  _description = _("Delete volume backup(s)")
141
151
 
142
- def get_parser(self, prog_name):
152
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
143
153
  parser = super().get_parser(prog_name)
144
154
  parser.add_argument(
145
155
  "backups",
@@ -155,8 +165,10 @@ class DeleteVolumeBackup(command.Command):
155
165
  )
156
166
  return parser
157
167
 
158
- def take_action(self, parsed_args):
159
- volume_client = self.app.client_manager.sdk_connection.volume
168
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
169
+ volume_client = sdk_utils.ensure_service_version(
170
+ self.app.client_manager.sdk_connection.volume, '2'
171
+ )
160
172
  result = 0
161
173
 
162
174
  for backup in parsed_args.backups:
@@ -191,7 +203,7 @@ class DeleteVolumeBackup(command.Command):
191
203
  class ListVolumeBackup(command.Lister):
192
204
  _description = _("List volume backups")
193
205
 
194
- def get_parser(self, prog_name):
206
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
195
207
  parser = super().get_parser(prog_name)
196
208
  parser.add_argument(
197
209
  "--long",
@@ -237,8 +249,12 @@ class ListVolumeBackup(command.Lister):
237
249
  )
238
250
  return parser
239
251
 
240
- def take_action(self, parsed_args):
241
- volume_client = self.app.client_manager.sdk_connection.volume
252
+ def take_action(
253
+ self, parsed_args: argparse.Namespace
254
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
255
+ volume_client = sdk_utils.ensure_service_version(
256
+ self.app.client_manager.sdk_connection.volume, '2'
257
+ )
242
258
 
243
259
  columns: tuple[str, ...] = (
244
260
  'id',
@@ -324,7 +340,7 @@ class ListVolumeBackup(command.Lister):
324
340
  class RestoreVolumeBackup(command.ShowOne):
325
341
  _description = _("Restore volume backup")
326
342
 
327
- def get_parser(self, prog_name):
343
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
328
344
  parser = super().get_parser(prog_name)
329
345
  parser.add_argument(
330
346
  "backup",
@@ -350,8 +366,12 @@ class RestoreVolumeBackup(command.ShowOne):
350
366
  )
351
367
  return parser
352
368
 
353
- def take_action(self, parsed_args):
354
- volume_client = self.app.client_manager.sdk_connection.volume
369
+ def take_action(
370
+ self, parsed_args: argparse.Namespace
371
+ ) -> tuple[Sequence[str], Iterable[Any]]:
372
+ volume_client = sdk_utils.ensure_service_version(
373
+ self.app.client_manager.sdk_connection.volume, '2'
374
+ )
355
375
 
356
376
  backup = volume_client.find_backup(
357
377
  parsed_args.backup,
@@ -396,7 +416,7 @@ class RestoreVolumeBackup(command.ShowOne):
396
416
  class SetVolumeBackup(command.Command):
397
417
  _description = _("Set volume backup properties")
398
418
 
399
- def get_parser(self, prog_name):
419
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
400
420
  parser = super().get_parser(prog_name)
401
421
  parser.add_argument(
402
422
  "backup",
@@ -416,8 +436,10 @@ class SetVolumeBackup(command.Command):
416
436
  )
417
437
  return parser
418
438
 
419
- def take_action(self, parsed_args):
420
- volume_client = self.app.client_manager.sdk_connection.volume
439
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
440
+ volume_client = sdk_utils.ensure_service_version(
441
+ self.app.client_manager.sdk_connection.volume, '2'
442
+ )
421
443
 
422
444
  backup = volume_client.find_backup(
423
445
  parsed_args.backup,
@@ -442,7 +464,7 @@ class SetVolumeBackup(command.Command):
442
464
  class ShowVolumeBackup(command.ShowOne):
443
465
  _description = _("Display volume backup details")
444
466
 
445
- def get_parser(self, prog_name):
467
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
446
468
  parser = super().get_parser(prog_name)
447
469
  parser.add_argument(
448
470
  "backup",
@@ -451,8 +473,12 @@ class ShowVolumeBackup(command.ShowOne):
451
473
  )
452
474
  return parser
453
475
 
454
- def take_action(self, parsed_args):
455
- volume_client = self.app.client_manager.sdk_connection.volume
476
+ def take_action(
477
+ self, parsed_args: argparse.Namespace
478
+ ) -> tuple[Sequence[str], Iterable[Any]]:
479
+ volume_client = sdk_utils.ensure_service_version(
480
+ self.app.client_manager.sdk_connection.volume, '2'
481
+ )
456
482
  backup = volume_client.find_backup(
457
483
  parsed_args.backup, ignore_missing=False
458
484
  )
@@ -14,6 +14,8 @@
14
14
 
15
15
  """Volume v2 host action implementations"""
16
16
 
17
+ import argparse
18
+
17
19
  from openstackclient import command
18
20
  from openstackclient.i18n import _
19
21
 
@@ -21,7 +23,7 @@ from openstackclient.i18n import _
21
23
  class FailoverVolumeHost(command.Command):
22
24
  _description = _("Failover volume host to different backend")
23
25
 
24
- def get_parser(self, prog_name):
26
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
25
27
  parser = super().get_parser(prog_name)
26
28
  parser.add_argument(
27
29
  "host", metavar="<host-name>", help=_("Name of volume host")
@@ -37,7 +39,7 @@ class FailoverVolumeHost(command.Command):
37
39
  )
38
40
  return parser
39
41
 
40
- def take_action(self, parsed_args):
42
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
41
43
  service_client = self.app.client_manager.volume
42
44
  service_client.services.failover_host(
43
45
  parsed_args.host, parsed_args.volume_backend
@@ -47,7 +49,7 @@ class FailoverVolumeHost(command.Command):
47
49
  class SetVolumeHost(command.Command):
48
50
  _description = _("Set volume host properties")
49
51
 
50
- def get_parser(self, prog_name):
52
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
51
53
  parser = super().get_parser(prog_name)
52
54
  parser.add_argument(
53
55
  "host", metavar="<host-name>", help=_("Name of volume host")
@@ -65,7 +67,7 @@ class SetVolumeHost(command.Command):
65
67
  )
66
68
  return parser
67
69
 
68
- def take_action(self, parsed_args):
70
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
69
71
  service_client = self.app.client_manager.volume
70
72
  if parsed_args.enable:
71
73
  service_client.services.thaw_host(parsed_args.host)