python-openstackclient 8.3.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 (292) 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 +126 -114
  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 +251 -171
  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 +103 -41
  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 +26 -12
  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 +71 -50
  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 +115 -92
  64. openstackclient/identity/v3/mapping.py +26 -13
  65. openstackclient/identity/v3/policy.py +23 -12
  66. openstackclient/identity/v3/project.py +211 -122
  67. openstackclient/identity/v3/region.py +36 -16
  68. openstackclient/identity/v3/registered_limit.py +116 -109
  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 -17
  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 +76 -49
  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_limit.py +47 -0
  154. openstackclient/tests/functional/identity/v3/test_project.py +10 -10
  155. openstackclient/tests/functional/identity/v3/test_role.py +18 -18
  156. openstackclient/tests/functional/identity/v3/test_role_assignment.py +12 -12
  157. openstackclient/tests/functional/identity/v3/test_user.py +8 -8
  158. openstackclient/tests/functional/image/base.py +1 -6
  159. openstackclient/tests/functional/image/v2/test_metadef_objects.py +69 -0
  160. openstackclient/tests/functional/network/v2/common.py +5 -2
  161. openstackclient/tests/functional/network/v2/test_floating_ip.py +10 -4
  162. openstackclient/tests/functional/network/v2/test_ip_availability.py +4 -0
  163. openstackclient/tests/functional/network/v2/test_network_meter_rule.py +3 -2
  164. openstackclient/tests/functional/network/v2/test_network_segment.py +5 -0
  165. openstackclient/tests/functional/network/v2/test_subnet.py +13 -9
  166. openstackclient/tests/functional/object/v1/common.py +4 -0
  167. openstackclient/tests/functional/volume/v2/common.py +4 -0
  168. openstackclient/tests/functional/volume/v2/test_volume_snapshot.py +27 -11
  169. openstackclient/tests/functional/volume/v2/test_volume_type.py +2 -2
  170. openstackclient/tests/functional/volume/v3/common.py +4 -0
  171. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +56 -138
  172. openstackclient/tests/functional/volume/v3/test_volume_type.py +2 -2
  173. openstackclient/tests/unit/common/test_availability_zone.py +35 -49
  174. openstackclient/tests/unit/common/test_extension.py +2 -2
  175. openstackclient/tests/unit/common/test_module.py +12 -7
  176. openstackclient/tests/unit/common/test_project_cleanup.py +3 -1
  177. openstackclient/tests/unit/common/test_quota.py +62 -23
  178. openstackclient/tests/unit/compute/v2/fakes.py +25 -0
  179. openstackclient/tests/unit/compute/v2/test_flavor.py +28 -2
  180. openstackclient/tests/unit/compute/v2/test_keypair.py +6 -6
  181. openstackclient/tests/unit/compute/v2/test_server.py +17 -104
  182. openstackclient/tests/unit/compute/v2/test_server_share.py +287 -0
  183. openstackclient/tests/unit/identity/v3/fakes.py +3 -0
  184. openstackclient/tests/unit/identity/v3/test_group.py +4 -14
  185. openstackclient/tests/unit/identity/v3/test_identity_provider.py +303 -299
  186. openstackclient/tests/unit/identity/v3/test_limit.py +197 -145
  187. openstackclient/tests/unit/identity/v3/test_project.py +831 -512
  188. openstackclient/tests/unit/identity/v3/test_protocol.py +97 -88
  189. openstackclient/tests/unit/identity/v3/test_registered_limit.py +355 -220
  190. openstackclient/tests/unit/identity/v3/test_user.py +4 -4
  191. openstackclient/tests/unit/image/v2/test_image.py +16 -16
  192. openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +105 -6
  193. openstackclient/tests/unit/network/test_common.py +0 -155
  194. openstackclient/tests/unit/network/v2/bgpvpn/__init__.py +0 -0
  195. openstackclient/tests/unit/network/v2/bgpvpn/fakes.py +179 -0
  196. openstackclient/tests/unit/network/v2/bgpvpn/test_bgpvpn.py +584 -0
  197. openstackclient/tests/unit/network/v2/bgpvpn/test_network_association.py +285 -0
  198. openstackclient/tests/unit/network/v2/bgpvpn/test_port_association.py +384 -0
  199. openstackclient/tests/unit/network/v2/bgpvpn/test_router_association.py +297 -0
  200. openstackclient/tests/unit/network/v2/fwaas/__init__.py +0 -0
  201. openstackclient/tests/unit/network/v2/fwaas/test_group.py +897 -0
  202. openstackclient/tests/unit/network/v2/fwaas/test_policy.py +869 -0
  203. openstackclient/tests/unit/network/v2/fwaas/test_rule.py +980 -0
  204. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_flow.py → test_tap_flow.py} +18 -25
  205. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_mirror.py → test_tap_mirror.py} +19 -29
  206. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_service.py → test_tap_service.py} +19 -29
  207. openstackclient/tests/unit/network/v2/test_address_group.py +2 -2
  208. openstackclient/tests/unit/network/v2/{test_floating_ip_network.py → test_floating_ip.py} +3 -2
  209. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +13 -13
  210. openstackclient/tests/unit/network/v2/test_network_agent.py +8 -4
  211. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +3 -3
  212. openstackclient/tests/unit/network/v2/test_network_flavor.py +2 -2
  213. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +1 -1
  214. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +2 -2
  215. openstackclient/tests/unit/network/v2/test_network_rbac.py +1 -1
  216. openstackclient/tests/unit/network/v2/test_network_segment.py +1 -1
  217. openstackclient/tests/unit/network/v2/test_network_segment_range.py +7 -10
  218. openstackclient/tests/unit/network/v2/test_network_trunk.py +1 -1
  219. openstackclient/tests/unit/network/v2/test_router.py +8 -9
  220. openstackclient/tests/unit/network/v2/{test_security_group_network.py → test_security_group.py} +1 -20
  221. openstackclient/tests/unit/network/v2/{test_security_group_rule_network.py → test_security_group_rule.py} +7 -41
  222. openstackclient/tests/unit/network/v2/test_subnet.py +2 -1
  223. openstackclient/tests/unit/network/v2/test_subnet_pool.py +2 -1
  224. openstackclient/tests/unit/object/v1/fakes.py +8 -7
  225. openstackclient/tests/unit/object/v1/test_container.py +65 -101
  226. openstackclient/tests/unit/object/v1/test_container_all.py +8 -1
  227. openstackclient/tests/unit/object/v1/test_object.py +44 -84
  228. openstackclient/tests/unit/object/v1/test_object_all.py +8 -1
  229. openstackclient/tests/unit/test_hacking.py +108 -0
  230. openstackclient/tests/unit/volume/v2/fakes.py +1 -0
  231. openstackclient/tests/unit/volume/v2/test_consistency_group.py +8 -2
  232. openstackclient/tests/unit/volume/v2/test_volume.py +7 -6
  233. openstackclient/tests/unit/volume/v2/test_volume_backup.py +1 -5
  234. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +2 -1
  235. openstackclient/tests/unit/volume/v2/test_volume_type.py +2 -4
  236. openstackclient/tests/unit/volume/v3/fakes.py +1 -0
  237. openstackclient/tests/unit/volume/v3/test_volume.py +94 -15
  238. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
  239. openstackclient/tests/unit/volume/v3/test_volume_backup.py +1 -5
  240. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +55 -1
  241. openstackclient/tests/unit/volume/v3/test_volume_type.py +2 -4
  242. openstackclient/volume/client.py +7 -3
  243. openstackclient/volume/v2/backup_record.py +15 -6
  244. openstackclient/volume/v2/consistency_group.py +37 -25
  245. openstackclient/volume/v2/consistency_group_snapshot.py +27 -12
  246. openstackclient/volume/v2/qos_specs.py +30 -19
  247. openstackclient/volume/v2/service.py +17 -6
  248. openstackclient/volume/v2/volume.py +69 -34
  249. openstackclient/volume/v2/volume_backend.py +19 -6
  250. openstackclient/volume/v2/volume_backup.py +48 -22
  251. openstackclient/volume/v2/volume_host.py +6 -4
  252. openstackclient/volume/v2/volume_snapshot.py +52 -26
  253. openstackclient/volume/v2/volume_transfer_request.py +33 -15
  254. openstackclient/volume/v2/volume_type.py +46 -27
  255. openstackclient/volume/v3/block_storage_cleanup.py +11 -3
  256. openstackclient/volume/v3/block_storage_cluster.py +19 -7
  257. openstackclient/volume/v3/block_storage_log_level.py +15 -6
  258. openstackclient/volume/v3/block_storage_manage.py +10 -4
  259. openstackclient/volume/v3/block_storage_resource_filter.py +17 -5
  260. openstackclient/volume/v3/service.py +16 -6
  261. openstackclient/volume/v3/volume.py +103 -46
  262. openstackclient/volume/v3/volume_attachment.py +43 -21
  263. openstackclient/volume/v3/volume_backup.py +55 -26
  264. openstackclient/volume/v3/volume_group.py +23 -13
  265. openstackclient/volume/v3/volume_group_snapshot.py +32 -13
  266. openstackclient/volume/v3/volume_group_type.py +26 -13
  267. openstackclient/volume/v3/volume_message.py +15 -7
  268. openstackclient/volume/v3/volume_snapshot.py +71 -34
  269. openstackclient/volume/v3/volume_transfer_request.py +33 -15
  270. openstackclient/volume/v3/volume_type.py +45 -27
  271. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/METADATA +6 -6
  272. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/RECORD +279 -267
  273. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/WHEEL +1 -1
  274. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/entry_points.txt +53 -1
  275. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/AUTHORS +9 -0
  276. python_openstackclient-10.0.0.dist-info/pbr.json +1 -0
  277. openstackclient/api/image_v1.py +0 -69
  278. openstackclient/api/image_v2.py +0 -79
  279. openstackclient/network/v2/floating_ip_pool.py +0 -38
  280. openstackclient/tests/functional/image/v1/test_image.py +0 -97
  281. openstackclient/tests/unit/api/test_image_v1.py +0 -96
  282. openstackclient/tests/unit/api/test_image_v2.py +0 -96
  283. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +0 -248
  284. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +0 -49
  285. openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +0 -39
  286. openstackclient/tests/unit/network/v2/test_network_compute.py +0 -404
  287. openstackclient/tests/unit/network/v2/test_security_group_compute.py +0 -392
  288. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +0 -555
  289. python_openstackclient-8.3.0.dist-info/pbr.json +0 -1
  290. /openstackclient/{tests/functional/image/v1 → network/v2/bgpvpn}/__init__.py +0 -0
  291. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/LICENSE +0 -0
  292. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/top_level.txt +0 -0
@@ -14,9 +14,12 @@
14
14
 
15
15
  """Volume v3 Backup action implementations"""
16
16
 
17
+ import argparse
18
+ from collections.abc import Iterable, Sequence
17
19
  import copy
18
20
  import functools
19
21
  import logging
22
+ from typing import Any
20
23
 
21
24
  from cliff import columns as cliff_columns
22
25
  from openstack import utils as sdk_utils
@@ -42,11 +45,13 @@ class VolumeIdColumn(cliff_columns.FormattableColumn[str]):
42
45
  ``functools.partial(VolumeIdColumn, volume_cache)``.
43
46
  """
44
47
 
45
- def __init__(self, value, volume_cache=None):
48
+ def __init__(
49
+ self, value: str, volume_cache: dict[str, Any] | None = None
50
+ ) -> None:
46
51
  super().__init__(value)
47
52
  self._volume_cache = volume_cache or {}
48
53
 
49
- def human_readable(self):
54
+ def human_readable(self) -> str:
50
55
  """Return a volume name if available
51
56
 
52
57
  :rtype: either the volume ID or name
@@ -61,7 +66,7 @@ class VolumeIdColumn(cliff_columns.FormattableColumn[str]):
61
66
  class CreateVolumeBackup(command.ShowOne):
62
67
  _description = _("Create new volume backup")
63
68
 
64
- def get_parser(self, prog_name):
69
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
65
70
  parser = super().get_parser(prog_name)
66
71
  parser.add_argument(
67
72
  "volume",
@@ -125,8 +130,12 @@ class CreateVolumeBackup(command.ShowOne):
125
130
  )
126
131
  return parser
127
132
 
128
- def take_action(self, parsed_args):
129
- volume_client = self.app.client_manager.sdk_connection.volume
133
+ def take_action(
134
+ self, parsed_args: argparse.Namespace
135
+ ) -> tuple[Sequence[str], Iterable[Any]]:
136
+ volume_client = sdk_utils.ensure_service_version(
137
+ self.app.client_manager.sdk_connection.volume, '3'
138
+ )
130
139
 
131
140
  volume_id = volume_client.find_volume(
132
141
  parsed_args.volume,
@@ -182,7 +191,7 @@ class CreateVolumeBackup(command.ShowOne):
182
191
  class DeleteVolumeBackup(command.Command):
183
192
  _description = _("Delete volume backup(s)")
184
193
 
185
- def get_parser(self, prog_name):
194
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
186
195
  parser = super().get_parser(prog_name)
187
196
  parser.add_argument(
188
197
  "backups",
@@ -198,8 +207,10 @@ class DeleteVolumeBackup(command.Command):
198
207
  )
199
208
  return parser
200
209
 
201
- def take_action(self, parsed_args):
202
- volume_client = self.app.client_manager.sdk_connection.volume
210
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
211
+ volume_client = sdk_utils.ensure_service_version(
212
+ self.app.client_manager.sdk_connection.volume, '3'
213
+ )
203
214
  result = 0
204
215
 
205
216
  for backup in parsed_args.backups:
@@ -218,8 +229,8 @@ class DeleteVolumeBackup(command.Command):
218
229
  _(
219
230
  "Failed to delete backup with "
220
231
  "name or ID '%(backup)s': %(e)s"
221
- )
222
- % {'backup': backup, 'e': e}
232
+ ),
233
+ {'backup': backup, 'e': e},
223
234
  )
224
235
 
225
236
  if result > 0:
@@ -234,7 +245,7 @@ class DeleteVolumeBackup(command.Command):
234
245
  class ListVolumeBackup(command.Lister):
235
246
  _description = _("List volume backups")
236
247
 
237
- def get_parser(self, prog_name):
248
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
238
249
  parser = super().get_parser(prog_name)
239
250
  parser.add_argument(
240
251
  '--project',
@@ -299,9 +310,15 @@ class ListVolumeBackup(command.Lister):
299
310
  # )
300
311
  return parser
301
312
 
302
- def take_action(self, parsed_args):
303
- volume_client = self.app.client_manager.sdk_connection.volume
304
- identity_client = self.app.client_manager.sdk_connection.identity
313
+ def take_action(
314
+ self, parsed_args: argparse.Namespace
315
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
316
+ volume_client = sdk_utils.ensure_service_version(
317
+ self.app.client_manager.sdk_connection.volume, '3'
318
+ )
319
+ identity_client = sdk_utils.ensure_service_version(
320
+ self.app.client_manager.sdk_connection.identity, '3'
321
+ )
305
322
 
306
323
  columns: tuple[str, ...] = (
307
324
  'id',
@@ -396,7 +413,7 @@ class ListVolumeBackup(command.Lister):
396
413
  class RestoreVolumeBackup(command.ShowOne):
397
414
  _description = _("Restore volume backup")
398
415
 
399
- def get_parser(self, prog_name):
416
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
400
417
  parser = super().get_parser(prog_name)
401
418
  parser.add_argument(
402
419
  "backup",
@@ -422,8 +439,12 @@ class RestoreVolumeBackup(command.ShowOne):
422
439
  )
423
440
  return parser
424
441
 
425
- def take_action(self, parsed_args):
426
- volume_client = self.app.client_manager.sdk_connection.volume
442
+ def take_action(
443
+ self, parsed_args: argparse.Namespace
444
+ ) -> tuple[tuple[str, ...], Iterable[Any]]:
445
+ volume_client = sdk_utils.ensure_service_version(
446
+ self.app.client_manager.sdk_connection.volume, '3'
447
+ )
427
448
 
428
449
  columns: tuple[str, ...] = (
429
450
  'id',
@@ -468,7 +489,7 @@ class RestoreVolumeBackup(command.ShowOne):
468
489
  class SetVolumeBackup(command.Command):
469
490
  _description = _("Set volume backup properties")
470
491
 
471
- def get_parser(self, prog_name):
492
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
472
493
  parser = super().get_parser(prog_name)
473
494
  parser.add_argument(
474
495
  "backup",
@@ -525,8 +546,10 @@ class SetVolumeBackup(command.Command):
525
546
  )
526
547
  return parser
527
548
 
528
- def take_action(self, parsed_args):
529
- volume_client = self.app.client_manager.sdk_connection.volume
549
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
550
+ volume_client = sdk_utils.ensure_service_version(
551
+ self.app.client_manager.sdk_connection.volume, '3'
552
+ )
530
553
 
531
554
  backup = volume_client.find_backup(
532
555
  parsed_args.backup,
@@ -608,7 +631,7 @@ class UnsetVolumeBackup(command.Command):
608
631
  This command requires ``--os-volume-api-version`` 3.43 or greater.
609
632
  """
610
633
 
611
- def get_parser(self, prog_name):
634
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
612
635
  parser = super().get_parser(prog_name)
613
636
  parser.add_argument(
614
637
  'backup',
@@ -627,8 +650,10 @@ class UnsetVolumeBackup(command.Command):
627
650
  )
628
651
  return parser
629
652
 
630
- def take_action(self, parsed_args):
631
- volume_client = self.app.client_manager.sdk_connection.volume
653
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
654
+ volume_client = sdk_utils.ensure_service_version(
655
+ self.app.client_manager.sdk_connection.volume, '3'
656
+ )
632
657
 
633
658
  if not sdk_utils.supports_microversion(volume_client, '3.43'):
634
659
  msg = _(
@@ -660,7 +685,7 @@ class UnsetVolumeBackup(command.Command):
660
685
  class ShowVolumeBackup(command.ShowOne):
661
686
  _description = _("Display volume backup details")
662
687
 
663
- def get_parser(self, prog_name):
688
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
664
689
  parser = super().get_parser(prog_name)
665
690
  parser.add_argument(
666
691
  "backup",
@@ -669,8 +694,12 @@ class ShowVolumeBackup(command.ShowOne):
669
694
  )
670
695
  return parser
671
696
 
672
- def take_action(self, parsed_args):
673
- volume_client = self.app.client_manager.sdk_connection.volume
697
+ def take_action(
698
+ self, parsed_args: argparse.Namespace
699
+ ) -> tuple[tuple[str, ...], Iterable[Any]]:
700
+ volume_client = sdk_utils.ensure_service_version(
701
+ self.app.client_manager.sdk_connection.volume, '3'
702
+ )
674
703
  backup = volume_client.find_backup(
675
704
  parsed_args.backup, ignore_missing=False
676
705
  )
@@ -11,6 +11,8 @@
11
11
  # under the License.
12
12
 
13
13
  import argparse
14
+ from collections.abc import Iterable, Sequence
15
+ from typing import Any
14
16
 
15
17
  from cinderclient import api_versions
16
18
  from osc_lib import exceptions
@@ -21,7 +23,7 @@ from openstackclient.common import envvars
21
23
  from openstackclient.i18n import _
22
24
 
23
25
 
24
- def _format_group(group):
26
+ def _format_group(group: Any) -> tuple[Sequence[str], Iterable[Any]]:
25
27
  columns = (
26
28
  'id',
27
29
  'status',
@@ -79,7 +81,7 @@ class CreateVolumeGroup(command.ShowOne):
79
81
  This command requires ``--os-volume-api-version`` 3.13 or greater.
80
82
  """
81
83
 
82
- def get_parser(self, prog_name):
84
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
83
85
  parser = super().get_parser(prog_name)
84
86
  # This is a bit complicated. We accept two patterns: a legacy pattern
85
87
  #
@@ -168,7 +170,9 @@ class CreateVolumeGroup(command.ShowOne):
168
170
  )
169
171
  return parser
170
172
 
171
- def take_action(self, parsed_args):
173
+ def take_action(
174
+ self, parsed_args: argparse.Namespace
175
+ ) -> tuple[Sequence[str], Iterable[Any]]:
172
176
  volume_client = self.app.client_manager.volume
173
177
 
174
178
  if parsed_args.volume_group_type_legacy:
@@ -276,7 +280,7 @@ class DeleteVolumeGroup(command.Command):
276
280
  This command requires ``--os-volume-api-version`` 3.13 or greater.
277
281
  """
278
282
 
279
- def get_parser(self, prog_name):
283
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
280
284
  parser = super().get_parser(prog_name)
281
285
  parser.add_argument(
282
286
  'group',
@@ -294,7 +298,7 @@ class DeleteVolumeGroup(command.Command):
294
298
  )
295
299
  return parser
296
300
 
297
- def take_action(self, parsed_args):
301
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
298
302
  volume_client = self.app.client_manager.volume
299
303
 
300
304
  if volume_client.api_version < api_versions.APIVersion('3.13'):
@@ -318,7 +322,7 @@ class SetVolumeGroup(command.ShowOne):
318
322
  This command requires ``--os-volume-api-version`` 3.13 or greater.
319
323
  """
320
324
 
321
- def get_parser(self, prog_name):
325
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
322
326
  parser = super().get_parser(prog_name)
323
327
  parser.add_argument(
324
328
  'group',
@@ -356,7 +360,9 @@ class SetVolumeGroup(command.ShowOne):
356
360
  )
357
361
  return parser
358
362
 
359
- def take_action(self, parsed_args):
363
+ def take_action(
364
+ self, parsed_args: argparse.Namespace
365
+ ) -> tuple[Sequence[str], Iterable[Any]]:
360
366
  volume_client = self.app.client_manager.volume
361
367
 
362
368
  if volume_client.api_version < api_versions.APIVersion('3.13'):
@@ -405,7 +411,7 @@ class ListVolumeGroup(command.Lister):
405
411
  This command requires ``--os-volume-api-version`` 3.13 or greater.
406
412
  """
407
413
 
408
- def get_parser(self, prog_name):
414
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
409
415
  parser = super().get_parser(prog_name)
410
416
  parser.add_argument(
411
417
  '--all-projects',
@@ -430,7 +436,9 @@ class ListVolumeGroup(command.Lister):
430
436
  # )
431
437
  return parser
432
438
 
433
- def take_action(self, parsed_args):
439
+ def take_action(
440
+ self, parsed_args: argparse.Namespace
441
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
434
442
  volume_client = self.app.client_manager.volume
435
443
 
436
444
  if volume_client.api_version < api_versions.APIVersion('3.13'):
@@ -469,7 +477,7 @@ class ShowVolumeGroup(command.ShowOne):
469
477
  This command requires ``--os-volume-api-version`` 3.13 or greater.
470
478
  """
471
479
 
472
- def get_parser(self, prog_name):
480
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
473
481
  parser = super().get_parser(prog_name)
474
482
  parser.add_argument(
475
483
  'group',
@@ -517,7 +525,9 @@ class ShowVolumeGroup(command.ShowOne):
517
525
 
518
526
  return parser
519
527
 
520
- def take_action(self, parsed_args):
528
+ def take_action(
529
+ self, parsed_args: argparse.Namespace
530
+ ) -> tuple[Sequence[str], Iterable[Any]]:
521
531
  volume_client = self.app.client_manager.volume
522
532
 
523
533
  if volume_client.api_version < api_versions.APIVersion('3.13'):
@@ -571,7 +581,7 @@ class FailoverVolumeGroup(command.Command):
571
581
  This command requires ``--os-volume-api-version`` 3.38 or greater.
572
582
  """
573
583
 
574
- def get_parser(self, prog_name):
584
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
575
585
  parser = super().get_parser(prog_name)
576
586
  parser.add_argument(
577
587
  'group',
@@ -599,7 +609,7 @@ class FailoverVolumeGroup(command.Command):
599
609
  )
600
610
  return parser
601
611
 
602
- def take_action(self, parsed_args):
612
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
603
613
  volume_client = self.app.client_manager.volume
604
614
 
605
615
  if volume_client.api_version < api_versions.APIVersion('3.38'):
@@ -10,7 +10,10 @@
10
10
  # License for the specific language governing permissions and limitations
11
11
  # under the License.
12
12
 
13
+ import argparse
14
+ from collections.abc import Iterable, Sequence
13
15
  import logging
16
+ from typing import Any
14
17
 
15
18
  from openstack import utils as sdk_utils
16
19
  from osc_lib import exceptions
@@ -23,7 +26,9 @@ from openstackclient.i18n import _
23
26
  LOG = logging.getLogger(__name__)
24
27
 
25
28
 
26
- def _format_group_snapshot(snapshot):
29
+ def _format_group_snapshot(
30
+ snapshot: Any,
31
+ ) -> tuple[Sequence[str], Iterable[Any]]:
27
32
  columns = (
28
33
  'id',
29
34
  'status',
@@ -56,7 +61,7 @@ class CreateVolumeGroupSnapshot(command.ShowOne):
56
61
  This command requires ``--os-volume-api-version`` 3.13 or greater.
57
62
  """
58
63
 
59
- def get_parser(self, prog_name):
64
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
60
65
  parser = super().get_parser(prog_name)
61
66
  parser.add_argument(
62
67
  'volume_group',
@@ -75,8 +80,12 @@ class CreateVolumeGroupSnapshot(command.ShowOne):
75
80
  )
76
81
  return parser
77
82
 
78
- def take_action(self, parsed_args):
79
- volume_client = self.app.client_manager.sdk_connection.volume
83
+ def take_action(
84
+ self, parsed_args: argparse.Namespace
85
+ ) -> tuple[Sequence[str], Iterable[Any]]:
86
+ volume_client = sdk_utils.ensure_service_version(
87
+ self.app.client_manager.sdk_connection.volume, '3'
88
+ )
80
89
 
81
90
  if not sdk_utils.supports_microversion(volume_client, '3.14'):
82
91
  msg = _(
@@ -106,7 +115,7 @@ class DeleteVolumeGroupSnapshot(command.Command):
106
115
  This command requires ``--os-volume-api-version`` 3.14 or greater.
107
116
  """
108
117
 
109
- def get_parser(self, prog_name):
118
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
110
119
  parser = super().get_parser(prog_name)
111
120
  parser.add_argument(
112
121
  'snapshot',
@@ -115,8 +124,10 @@ class DeleteVolumeGroupSnapshot(command.Command):
115
124
  )
116
125
  return parser
117
126
 
118
- def take_action(self, parsed_args):
119
- volume_client = self.app.client_manager.sdk_connection.volume
127
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
128
+ volume_client = sdk_utils.ensure_service_version(
129
+ self.app.client_manager.sdk_connection.volume, '3'
130
+ )
120
131
 
121
132
  if not sdk_utils.supports_microversion(volume_client, '3.14'):
122
133
  msg = _(
@@ -140,7 +151,7 @@ class ListVolumeGroupSnapshot(command.Lister):
140
151
  This command requires ``--os-volume-api-version`` 3.14 or greater.
141
152
  """
142
153
 
143
- def get_parser(self, prog_name):
154
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
144
155
  parser = super().get_parser(prog_name)
145
156
  parser.add_argument(
146
157
  '--all-projects',
@@ -165,8 +176,12 @@ class ListVolumeGroupSnapshot(command.Lister):
165
176
  # )
166
177
  return parser
167
178
 
168
- def take_action(self, parsed_args):
169
- volume_client = self.app.client_manager.sdk_connection.volume
179
+ def take_action(
180
+ self, parsed_args: argparse.Namespace
181
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
182
+ volume_client = sdk_utils.ensure_service_version(
183
+ self.app.client_manager.sdk_connection.volume, '3'
184
+ )
170
185
 
171
186
  if not sdk_utils.supports_microversion(volume_client, '3.14'):
172
187
  msg = _(
@@ -202,7 +217,7 @@ class ShowVolumeGroupSnapshot(command.ShowOne):
202
217
  This command requires ``--os-volume-api-version`` 3.14 or greater.
203
218
  """
204
219
 
205
- def get_parser(self, prog_name):
220
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
206
221
  parser = super().get_parser(prog_name)
207
222
  parser.add_argument(
208
223
  'snapshot',
@@ -211,8 +226,12 @@ class ShowVolumeGroupSnapshot(command.ShowOne):
211
226
  )
212
227
  return parser
213
228
 
214
- def take_action(self, parsed_args):
215
- volume_client = self.app.client_manager.sdk_connection.volume
229
+ def take_action(
230
+ self, parsed_args: argparse.Namespace
231
+ ) -> tuple[Sequence[str], Iterable[Any]]:
232
+ volume_client = sdk_utils.ensure_service_version(
233
+ self.app.client_manager.sdk_connection.volume, '3'
234
+ )
216
235
 
217
236
  if not sdk_utils.supports_microversion(volume_client, '3.14'):
218
237
  msg = _(
@@ -10,7 +10,10 @@
10
10
  # License for the specific language governing permissions and limitations
11
11
  # under the License.
12
12
 
13
+ import argparse
14
+ from collections.abc import Iterable, Sequence
13
15
  import logging
16
+ from typing import Any
14
17
 
15
18
  from cinderclient import api_versions
16
19
  from osc_lib.cli import format_columns
@@ -24,7 +27,7 @@ from openstackclient.i18n import _
24
27
  LOG = logging.getLogger(__name__)
25
28
 
26
29
 
27
- def _format_group_type(group):
30
+ def _format_group_type(group: Any) -> tuple[Sequence[str], Iterable[Any]]:
28
31
  columns = (
29
32
  'id',
30
33
  'name',
@@ -60,7 +63,7 @@ class CreateVolumeGroupType(command.ShowOne):
60
63
  This command requires ``--os-volume-api-version`` 3.11 or greater.
61
64
  """
62
65
 
63
- def get_parser(self, prog_name):
66
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
64
67
  parser = super().get_parser(prog_name)
65
68
  parser.add_argument(
66
69
  'name',
@@ -90,7 +93,9 @@ class CreateVolumeGroupType(command.ShowOne):
90
93
  )
91
94
  return parser
92
95
 
93
- def take_action(self, parsed_args):
96
+ def take_action(
97
+ self, parsed_args: argparse.Namespace
98
+ ) -> tuple[Sequence[str], Iterable[Any]]:
94
99
  volume_client = self.app.client_manager.volume
95
100
 
96
101
  if volume_client.api_version < api_versions.APIVersion('3.11'):
@@ -113,7 +118,7 @@ class DeleteVolumeGroupType(command.Command):
113
118
  This command requires ``--os-volume-api-version`` 3.11 or greater.
114
119
  """
115
120
 
116
- def get_parser(self, prog_name):
121
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
117
122
  parser = super().get_parser(prog_name)
118
123
  parser.add_argument(
119
124
  'group_type',
@@ -122,7 +127,7 @@ class DeleteVolumeGroupType(command.Command):
122
127
  )
123
128
  return parser
124
129
 
125
- def take_action(self, parsed_args):
130
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
126
131
  volume_client = self.app.client_manager.volume
127
132
 
128
133
  if volume_client.api_version < api_versions.APIVersion('3.11'):
@@ -146,7 +151,7 @@ class SetVolumeGroupType(command.ShowOne):
146
151
  This command requires ``--os-volume-api-version`` 3.11 or greater.
147
152
  """
148
153
 
149
- def get_parser(self, prog_name):
154
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
150
155
  parser = super().get_parser(prog_name)
151
156
  parser.add_argument(
152
157
  'group_type',
@@ -199,7 +204,9 @@ class SetVolumeGroupType(command.ShowOne):
199
204
  )
200
205
  return parser
201
206
 
202
- def take_action(self, parsed_args):
207
+ def take_action(
208
+ self, parsed_args: argparse.Namespace
209
+ ) -> tuple[Sequence[str], Iterable[Any]]:
203
210
  volume_client = self.app.client_manager.volume
204
211
 
205
212
  if volume_client.api_version < api_versions.APIVersion('3.11'):
@@ -263,7 +270,7 @@ class UnsetVolumeGroupType(command.ShowOne):
263
270
  This command requires ``--os-volume-api-version`` 3.11 or greater.
264
271
  """
265
272
 
266
- def get_parser(self, prog_name):
273
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
267
274
  parser = super().get_parser(prog_name)
268
275
  parser.add_argument(
269
276
  'group_type',
@@ -282,7 +289,9 @@ class UnsetVolumeGroupType(command.ShowOne):
282
289
  )
283
290
  return parser
284
291
 
285
- def take_action(self, parsed_args):
292
+ def take_action(
293
+ self, parsed_args: argparse.Namespace
294
+ ) -> tuple[Sequence[str], Iterable[Any]]:
286
295
  volume_client = self.app.client_manager.volume
287
296
 
288
297
  if volume_client.api_version < api_versions.APIVersion('3.11'):
@@ -313,7 +322,7 @@ class ListVolumeGroupType(command.Lister):
313
322
  This command requires ``--os-volume-api-version`` 3.11 or greater.
314
323
  """
315
324
 
316
- def get_parser(self, prog_name):
325
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
317
326
  parser = super().get_parser(prog_name)
318
327
  parser.add_argument(
319
328
  '--default',
@@ -338,7 +347,9 @@ class ListVolumeGroupType(command.Lister):
338
347
  # )
339
348
  return parser
340
349
 
341
- def take_action(self, parsed_args):
350
+ def take_action(
351
+ self, parsed_args: argparse.Namespace
352
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
342
353
  volume_client = self.app.client_manager.volume
343
354
 
344
355
  if volume_client.api_version < api_versions.APIVersion('3.11'):
@@ -378,7 +389,7 @@ class ShowVolumeGroupType(command.ShowOne):
378
389
  This command requires ``--os-volume-api-version`` 3.11 or greater.
379
390
  """
380
391
 
381
- def get_parser(self, prog_name):
392
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
382
393
  parser = super().get_parser(prog_name)
383
394
  parser.add_argument(
384
395
  'group_type',
@@ -387,7 +398,9 @@ class ShowVolumeGroupType(command.ShowOne):
387
398
  )
388
399
  return parser
389
400
 
390
- def take_action(self, parsed_args):
401
+ def take_action(
402
+ self, parsed_args: argparse.Namespace
403
+ ) -> tuple[Sequence[str], Iterable[Any]]:
391
404
  volume_client = self.app.client_manager.volume
392
405
 
393
406
  if volume_client.api_version < api_versions.APIVersion('3.11'):
@@ -14,7 +14,10 @@
14
14
 
15
15
  """Volume V3 Messages implementations"""
16
16
 
17
+ import argparse
18
+ from collections.abc import Iterable, Sequence
17
19
  import logging as LOG
20
+ from typing import Any
18
21
 
19
22
  from cinderclient import api_versions
20
23
  from osc_lib import exceptions
@@ -29,7 +32,7 @@ from openstackclient.identity import common as identity_common
29
32
  class DeleteMessage(command.Command):
30
33
  _description = _('Delete a volume failure message')
31
34
 
32
- def get_parser(self, prog_name):
35
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
33
36
  parser = super().get_parser(prog_name)
34
37
  parser.add_argument(
35
38
  'message_ids',
@@ -40,7 +43,7 @@ class DeleteMessage(command.Command):
40
43
 
41
44
  return parser
42
45
 
43
- def take_action(self, parsed_args):
46
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
44
47
  volume_client = self.app.client_manager.volume
45
48
 
46
49
  if volume_client.api_version < api_versions.APIVersion('3.3'):
@@ -70,7 +73,7 @@ class DeleteMessage(command.Command):
70
73
  class ListMessages(command.Lister):
71
74
  _description = _('List volume failure messages')
72
75
 
73
- def get_parser(self, prog_name):
76
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
74
77
  parser = super().get_parser(prog_name)
75
78
 
76
79
  parser.add_argument(
@@ -83,7 +86,9 @@ class ListMessages(command.Lister):
83
86
 
84
87
  return parser
85
88
 
86
- def take_action(self, parsed_args):
89
+ def take_action(
90
+ self, parsed_args: argparse.Namespace
91
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
87
92
  volume_client = self.app.client_manager.volume
88
93
  identity_client = self.app.client_manager.identity
89
94
 
@@ -132,7 +137,7 @@ class ListMessages(command.Lister):
132
137
  class ShowMessage(command.ShowOne):
133
138
  _description = _('Show a volume failure message')
134
139
 
135
- def get_parser(self, prog_name):
140
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
136
141
  parser = super().get_parser(prog_name)
137
142
  parser.add_argument(
138
143
  'message_id',
@@ -142,7 +147,9 @@ class ShowMessage(command.ShowOne):
142
147
 
143
148
  return parser
144
149
 
145
- def take_action(self, parsed_args):
150
+ def take_action(
151
+ self, parsed_args: argparse.Namespace
152
+ ) -> tuple[Sequence[str], Iterable[Any]]:
146
153
  volume_client = self.app.client_manager.volume
147
154
 
148
155
  if volume_client.api_version < api_versions.APIVersion('3.3'):
@@ -154,4 +161,5 @@ class ShowMessage(command.ShowOne):
154
161
 
155
162
  message = volume_client.messages.get(parsed_args.message_id)
156
163
 
157
- return zip(*sorted(message._info.items()))
164
+ col_headers, col_data = zip(*sorted(message._info.items()))
165
+ return col_headers, col_data