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
@@ -19,7 +19,8 @@ import argparse
19
19
  import logging
20
20
  import os
21
21
  import sys
22
- import typing as ty
22
+ from collections.abc import Iterable, Sequence
23
+ from typing import Any
23
24
 
24
25
  from cliff import columns as cliff_columns
25
26
  from osc_lib.api import utils as api_utils
@@ -51,7 +52,7 @@ DISK_CHOICES = [
51
52
  LOG = logging.getLogger(__name__)
52
53
 
53
54
 
54
- def _get_columns(item):
55
+ def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
55
56
  column_map = {'is_protected': 'protected', 'owner_id': 'owner'}
56
57
  hidden_columns = [
57
58
  'location',
@@ -69,7 +70,7 @@ def _get_columns(item):
69
70
 
70
71
 
71
72
  class HumanReadableSizeColumn(cliff_columns.FormattableColumn[int]):
72
- def human_readable(self):
73
+ def human_readable(self) -> str:
73
74
  """Return a formatted visibility string
74
75
 
75
76
  :rtype:
@@ -83,7 +84,7 @@ class HumanReadableSizeColumn(cliff_columns.FormattableColumn[int]):
83
84
 
84
85
 
85
86
  class VisibilityColumn(cliff_columns.FormattableColumn[bool]):
86
- def human_readable(self):
87
+ def human_readable(self) -> str:
87
88
  """Return a formatted visibility string
88
89
 
89
90
  :rtype:
@@ -99,7 +100,7 @@ class VisibilityColumn(cliff_columns.FormattableColumn[bool]):
99
100
  class CreateImage(command.ShowOne):
100
101
  _description = _("Create/upload an image")
101
102
 
102
- def get_parser(self, prog_name):
103
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
103
104
  parser = super().get_parser(prog_name)
104
105
  parser.add_argument(
105
106
  "name",
@@ -239,7 +240,9 @@ class CreateImage(command.ShowOne):
239
240
  )
240
241
  return parser
241
242
 
242
- def take_action(self, parsed_args):
243
+ def take_action(
244
+ self, parsed_args: argparse.Namespace
245
+ ) -> tuple[Sequence[str], Iterable[Any]]:
243
246
  image_client = self.app.client_manager.image
244
247
 
245
248
  # Build an attribute dict from the parsed args, only include
@@ -299,7 +302,7 @@ class CreateImage(command.ShowOne):
299
302
  volume_client.volumes,
300
303
  parsed_args.volume,
301
304
  )
302
- response, body = volume_client.volumes.upload_to_image(
305
+ _response, body = volume_client.volumes.upload_to_image(
303
306
  source_volume.id,
304
307
  parsed_args.force,
305
308
  parsed_args.name,
@@ -314,10 +317,10 @@ class CreateImage(command.ShowOne):
314
317
  else:
315
318
  # Read file from stdin
316
319
  if not sys.stdin.isatty():
317
- if os.name == "nt":
320
+ if sys.platform == "win32":
318
321
  import msvcrt
319
322
 
320
- msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY) # type: ignore
323
+ msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
321
324
  if hasattr(sys.stdin, 'buffer'):
322
325
  kwargs['data'] = sys.stdin.buffer
323
326
  else:
@@ -351,13 +354,15 @@ class CreateImage(command.ShowOne):
351
354
  info['properties'] = format_columns.DictColumn(
352
355
  info.get('properties', {})
353
356
  )
354
- return zip(*sorted(info.items()))
357
+ col_headers, col_data = zip(*sorted(info.items()))
358
+ return col_headers, col_data
359
+ return ((), ())
355
360
 
356
361
 
357
362
  class DeleteImage(command.Command):
358
363
  _description = _("Delete image(s)")
359
364
 
360
- def get_parser(self, prog_name):
365
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
361
366
  parser = super().get_parser(prog_name)
362
367
  parser.add_argument(
363
368
  "images",
@@ -367,7 +372,7 @@ class DeleteImage(command.Command):
367
372
  )
368
373
  return parser
369
374
 
370
- def take_action(self, parsed_args):
375
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
371
376
  result = 0
372
377
  image_client = self.app.client_manager.image
373
378
  for image in parsed_args.images:
@@ -396,7 +401,7 @@ class DeleteImage(command.Command):
396
401
  class ListImage(command.Lister):
397
402
  _description = _("List available images")
398
403
 
399
- def get_parser(self, prog_name):
404
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
400
405
  parser = super().get_parser(prog_name)
401
406
  public_group = parser.add_mutually_exclusive_group()
402
407
  public_group.add_argument(
@@ -453,7 +458,9 @@ class ListImage(command.Lister):
453
458
  )
454
459
  return parser
455
460
 
456
- def take_action(self, parsed_args):
461
+ def take_action(
462
+ self, parsed_args: argparse.Namespace
463
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
457
464
  image_client = self.app.client_manager.image
458
465
 
459
466
  kwargs = {}
@@ -498,7 +505,7 @@ class ListImage(command.Lister):
498
505
 
499
506
  if parsed_args.property:
500
507
  # NOTE(dtroyer): coerce to a list to subscript it in py3
501
- attr, value = list(parsed_args.property.items())[0]
508
+ attr, value = next(iter(parsed_args.property.items()))
502
509
  api_utils.simple_filter(
503
510
  images,
504
511
  attr=attr,
@@ -527,7 +534,7 @@ class ListImage(command.Lister):
527
534
  class SaveImage(command.Command):
528
535
  _description = _("Save an image locally")
529
536
 
530
- def get_parser(self, prog_name):
537
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
531
538
  parser = super().get_parser(prog_name)
532
539
  parser.add_argument(
533
540
  "--chunk-size",
@@ -551,7 +558,7 @@ class SaveImage(command.Command):
551
558
  )
552
559
  return parser
553
560
 
554
- def take_action(self, parsed_args):
561
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
555
562
  image_client = self.app.client_manager.image
556
563
  image = image_client.find_image(
557
564
  parsed_args.image, ignore_missing=False
@@ -572,7 +579,7 @@ class SaveImage(command.Command):
572
579
  class SetImage(command.Command):
573
580
  _description = _("Set image properties")
574
581
 
575
- def get_parser(self, prog_name):
582
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
576
583
  parser = super().get_parser(prog_name)
577
584
  parser.add_argument(
578
585
  "image",
@@ -702,7 +709,7 @@ class SetImage(command.Command):
702
709
  )
703
710
  return parser
704
711
 
705
- def take_action(self, parsed_args):
712
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
706
713
  image_client = self.app.client_manager.image
707
714
 
708
715
  kwargs = {}
@@ -785,10 +792,10 @@ class SetImage(command.Command):
785
792
  # Read file from stdin
786
793
  if sys.stdin.isatty() is not True:
787
794
  if parsed_args.stdin:
788
- if os.name == "nt":
795
+ if sys.platform == "win32":
789
796
  import msvcrt
790
797
 
791
- msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY) # type: ignore
798
+ msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
792
799
  if hasattr(sys.stdin, 'buffer'):
793
800
  kwargs['data'] = sys.stdin.buffer
794
801
  else:
@@ -819,7 +826,7 @@ class SetImage(command.Command):
819
826
  class ShowImage(command.ShowOne):
820
827
  _description = _("Display image details")
821
828
 
822
- def get_parser(self, prog_name):
829
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
823
830
  parser = super().get_parser(prog_name)
824
831
  parser.add_argument(
825
832
  "--human-readable",
@@ -834,15 +841,15 @@ class ShowImage(command.ShowOne):
834
841
  )
835
842
  return parser
836
843
 
837
- def take_action(self, parsed_args):
844
+ def take_action(
845
+ self, parsed_args: argparse.Namespace
846
+ ) -> tuple[Sequence[str], Iterable[Any]]:
838
847
  image_client = self.app.client_manager.image
839
848
  image = image_client.find_image(
840
849
  parsed_args.image, ignore_missing=False
841
850
  )
842
851
 
843
- formatters: dict[
844
- str, type[cliff_columns.FormattableColumn[ty.Any]]
845
- ] = {
852
+ formatters: dict[str, type[cliff_columns.FormattableColumn[Any]]] = {
846
853
  'properties': format_columns.DictColumn,
847
854
  }
848
855
  if parsed_args.human_readable:
@@ -13,9 +13,12 @@
13
13
  # License for the specific language governing permissions and limitations
14
14
  # under the License.
15
15
 
16
+ import argparse
17
+ from collections.abc import Iterable, Sequence
16
18
  import copy
17
19
  import datetime
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
@@ -27,7 +30,7 @@ from openstackclient.i18n import _
27
30
  LOG = logging.getLogger(__name__)
28
31
 
29
32
 
30
- def _format_image_cache(cached_images):
33
+ def _format_image_cache(cached_images: dict[str, Any]) -> list[dict[str, Any]]:
31
34
  """Format image cache to make it more consistent with OSC operations."""
32
35
 
33
36
  image_list = []
@@ -70,11 +73,13 @@ def _format_image_cache(cached_images):
70
73
  class ListCachedImage(command.Lister):
71
74
  _description = _("Get Cache State")
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
  return parser
76
79
 
77
- def take_action(self, parsed_args):
80
+ def take_action(
81
+ self, parsed_args: argparse.Namespace
82
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
78
83
  image_client = self.app.client_manager.image
79
84
 
80
85
  # List of Cache data received
@@ -111,7 +116,7 @@ class ListCachedImage(command.Lister):
111
116
  class QueueCachedImage(command.Command):
112
117
  _description = _("Queue image(s) for caching.")
113
118
 
114
- def get_parser(self, prog_name):
119
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
115
120
  parser = super().get_parser(prog_name)
116
121
  parser.add_argument(
117
122
  "images",
@@ -121,7 +126,7 @@ class QueueCachedImage(command.Command):
121
126
  )
122
127
  return parser
123
128
 
124
- def take_action(self, parsed_args):
129
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
125
130
  image_client = self.app.client_manager.image
126
131
 
127
132
  failures = 0
@@ -151,7 +156,7 @@ class QueueCachedImage(command.Command):
151
156
  class DeleteCachedImage(command.Command):
152
157
  _description = _("Delete image(s) from cache")
153
158
 
154
- def get_parser(self, prog_name):
159
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
155
160
  parser = super().get_parser(prog_name)
156
161
  parser.add_argument(
157
162
  "images",
@@ -161,7 +166,7 @@ class DeleteCachedImage(command.Command):
161
166
  )
162
167
  return parser
163
168
 
164
- def take_action(self, parsed_args):
169
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
165
170
  failures = 0
166
171
  image_client = self.app.client_manager.image
167
172
  for image in parsed_args.images:
@@ -190,7 +195,7 @@ class DeleteCachedImage(command.Command):
190
195
  class ClearCachedImage(command.Command):
191
196
  _description = _("Clear all images from cache, queue or both")
192
197
 
193
- def get_parser(self, prog_name):
198
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
194
199
  parser = super().get_parser(prog_name)
195
200
  parser.add_argument(
196
201
  "--cache",
@@ -210,7 +215,7 @@ class ClearCachedImage(command.Command):
210
215
  )
211
216
  return parser
212
217
 
213
- def take_action(self, parsed_args):
218
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
214
219
  image_client = self.app.client_manager.image
215
220
 
216
221
  target = parsed_args.target