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
@@ -14,6 +14,10 @@
14
14
 
15
15
  """Compute v2 Server action implementations"""
16
16
 
17
+ import argparse
18
+ from collections.abc import Iterable
19
+ from typing import Any
20
+
17
21
  from openstack import utils as sdk_utils
18
22
  from osc_lib import exceptions
19
23
  from osc_lib import utils
@@ -25,7 +29,7 @@ from openstackclient.i18n import _
25
29
  class ListServerVolume(command.Lister):
26
30
  """List all the volumes attached to a server."""
27
31
 
28
- def get_parser(self, prog_name):
32
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
29
33
  parser = super().get_parser(prog_name)
30
34
  parser.add_argument(
31
35
  'server',
@@ -33,7 +37,9 @@ class ListServerVolume(command.Lister):
33
37
  )
34
38
  return parser
35
39
 
36
- def take_action(self, parsed_args):
40
+ def take_action(
41
+ self, parsed_args: argparse.Namespace
42
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
37
43
  compute_client = self.app.client_manager.compute
38
44
 
39
45
  server = compute_client.find_server(
@@ -81,7 +87,7 @@ class ListServerVolume(command.Lister):
81
87
  class SetServerVolume(command.Command):
82
88
  """Update a volume attachment on the server."""
83
89
 
84
- def get_parser(self, prog_name):
90
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
85
91
  parser = super().get_parser(prog_name)
86
92
  parser.add_argument(
87
93
  'server',
@@ -113,7 +119,7 @@ class SetServerVolume(command.Command):
113
119
  )
114
120
  return parser
115
121
 
116
- def take_action(self, parsed_args):
122
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
117
123
  compute_client = self.app.client_manager.compute
118
124
  volume_client = self.app.client_manager.sdk_connection.volume
119
125
 
@@ -15,7 +15,10 @@
15
15
 
16
16
  """Service action implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable
18
20
  import logging
21
+ from typing import Any
19
22
 
20
23
  from openstack import utils as sdk_utils
21
24
  from osc_lib import exceptions
@@ -31,7 +34,7 @@ LOG = logging.getLogger(__name__)
31
34
  class DeleteService(command.Command):
32
35
  _description = _("Delete compute service(s)")
33
36
 
34
- def get_parser(self, prog_name):
37
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
35
38
  parser = super().get_parser(prog_name)
36
39
  parser.add_argument(
37
40
  "service",
@@ -51,7 +54,7 @@ class DeleteService(command.Command):
51
54
  )
52
55
  return parser
53
56
 
54
- def take_action(self, parsed_args):
57
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
55
58
  compute_client = self.app.client_manager.compute
56
59
  result = 0
57
60
  for s in parsed_args.service:
@@ -84,7 +87,7 @@ value which can be used to uniquely identify the service in a multi-cell
84
87
  deployment."""
85
88
  )
86
89
 
87
- def get_parser(self, prog_name):
90
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
88
91
  parser = super().get_parser(prog_name)
89
92
  parser.add_argument(
90
93
  "--host",
@@ -107,7 +110,9 @@ deployment."""
107
110
  )
108
111
  return parser
109
112
 
110
- def take_action(self, parsed_args):
113
+ def take_action(
114
+ self, parsed_args: argparse.Namespace
115
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
111
116
  compute_client = self.app.client_manager.compute
112
117
  columns: tuple[str, ...] = (
113
118
  "id",
@@ -146,7 +151,7 @@ deployment."""
146
151
  class SetService(command.Command):
147
152
  _description = _("Set compute service properties")
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("host", metavar="<host>", help=_("Name of host"))
152
157
  parser.add_argument(
@@ -192,7 +197,9 @@ class SetService(command.Command):
192
197
  return parser
193
198
 
194
199
  @staticmethod
195
- def _find_service_by_host_and_binary(compute_client, host, binary):
200
+ def _find_service_by_host_and_binary(
201
+ compute_client: Any, host: str, binary: str
202
+ ) -> Any:
196
203
  """Utility method to find a compute service by host and binary
197
204
 
198
205
  :param host: the name of the compute service host
@@ -220,7 +227,7 @@ class SetService(command.Command):
220
227
  raise exceptions.CommandError(msg)
221
228
  return services[0]
222
229
 
223
- def take_action(self, parsed_args):
230
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
224
231
  compute_client = self.app.client_manager.compute
225
232
 
226
233
  if (
@@ -15,10 +15,11 @@
15
15
 
16
16
  """Usage action implementations"""
17
17
 
18
- from collections.abc import Collection
18
+ import argparse
19
+ from collections.abc import Collection, Iterable, Sequence
19
20
  import datetime
20
21
  import functools
21
- import typing as ty
22
+ from typing import Any, cast
22
23
 
23
24
  from cliff import columns as cliff_columns
24
25
  from osc_lib import utils
@@ -40,32 +41,32 @@ class ProjectColumn(cliff_columns.FormattableColumn[str]):
40
41
  project_cache)`` to use this.
41
42
  """
42
43
 
43
- def __init__(self, value, project_cache=None):
44
+ def __init__(self, value: str, project_cache: Any = None) -> None:
44
45
  super().__init__(value)
45
46
  self.project_cache = project_cache or {}
46
47
 
47
- def human_readable(self):
48
+ def human_readable(self) -> str:
48
49
  project = self._value
49
50
  if not project:
50
51
  return ''
51
52
 
52
53
  if project in self.project_cache.keys():
53
- return self.project_cache[project].name
54
+ return cast(str, self.project_cache[project].name)
54
55
 
55
56
  return project
56
57
 
57
58
 
58
- class CountColumn(cliff_columns.FormattableColumn[Collection[ty.Any]]):
59
- def human_readable(self):
60
- return len(self._value) if self._value is not None else None
59
+ class CountColumn(cliff_columns.FormattableColumn[Collection[Any]]):
60
+ def human_readable(self) -> str:
61
+ return str(len(self._value)) if self._value is not None else ""
61
62
 
62
63
 
63
64
  class FloatColumn(cliff_columns.FormattableColumn[float]):
64
- def human_readable(self):
65
- return float(f"{self._value:.2f}")
65
+ def human_readable(self) -> str:
66
+ return f"{self._value:.2f}"
66
67
 
67
68
 
68
- def _formatters(project_cache):
69
+ def _formatters(project_cache: Any) -> dict[str, Any]:
69
70
  return {
70
71
  'project_id': functools.partial(
71
72
  ProjectColumn, project_cache=project_cache
@@ -77,21 +78,21 @@ def _formatters(project_cache):
77
78
  }
78
79
 
79
80
 
80
- def _get_usage_marker(usage):
81
+ def _get_usage_marker(usage: Any) -> str | None:
81
82
  marker = None
82
83
  if hasattr(usage, 'server_usages') and usage.server_usages:
83
84
  marker = usage.server_usages[-1]['instance_id']
84
85
  return marker
85
86
 
86
87
 
87
- def _get_usage_list_marker(usage_list):
88
+ def _get_usage_list_marker(usage_list: Any) -> str | None:
88
89
  marker = None
89
90
  if usage_list:
90
91
  marker = _get_usage_marker(usage_list[-1])
91
92
  return marker
92
93
 
93
94
 
94
- def _merge_usage(usage, next_usage):
95
+ def _merge_usage(usage: Any, next_usage: Any) -> None:
95
96
  usage.server_usages.extend(next_usage.server_usages)
96
97
  usage.total_hours += next_usage.total_hours
97
98
  usage.total_memory_mb_usage += next_usage.total_memory_mb_usage
@@ -99,7 +100,7 @@ def _merge_usage(usage, next_usage):
99
100
  usage.total_local_gb_usage += next_usage.total_local_gb_usage
100
101
 
101
102
 
102
- def _merge_usage_list(usages, next_usage_list):
103
+ def _merge_usage_list(usages: Any, next_usage_list: Any) -> None:
103
104
  for next_usage in next_usage_list:
104
105
  if next_usage.project_id in usages:
105
106
  _merge_usage(usages[next_usage.project_id], next_usage)
@@ -110,7 +111,7 @@ def _merge_usage_list(usages, next_usage_list):
110
111
  class ListUsage(command.Lister):
111
112
  _description = _("List resource usage per project")
112
113
 
113
- def get_parser(self, prog_name):
114
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
114
115
  parser = super().get_parser(prog_name)
115
116
  parser.add_argument(
116
117
  "--start",
@@ -128,12 +129,14 @@ class ListUsage(command.Lister):
128
129
  )
129
130
  return parser
130
131
 
131
- def take_action(self, parsed_args):
132
- def _format_project(project):
132
+ def take_action(
133
+ self, parsed_args: argparse.Namespace
134
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
135
+ def _format_project(project: str) -> str:
133
136
  if not project:
134
137
  return ""
135
138
  if project in project_cache.keys():
136
- return project_cache[project].name
139
+ return cast(str, project_cache[project].name)
137
140
  else:
138
141
  return project
139
142
 
@@ -210,7 +213,7 @@ class ListUsage(command.Lister):
210
213
  class ShowUsage(command.ShowOne):
211
214
  _description = _("Show resource usage for a single project")
212
215
 
213
- def get_parser(self, prog_name):
216
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
214
217
  parser = super().get_parser(prog_name)
215
218
  parser.add_argument(
216
219
  "--project",
@@ -234,7 +237,9 @@ class ShowUsage(command.ShowOne):
234
237
  )
235
238
  return parser
236
239
 
237
- def take_action(self, parsed_args):
240
+ def take_action(
241
+ self, parsed_args: argparse.Namespace
242
+ ) -> tuple[Sequence[str], Iterable[Any]]:
238
243
  identity_client = self.app.client_manager.identity
239
244
  compute_client = self.app.client_manager.compute
240
245
  date_cli_format = "%Y-%m-%d"
@@ -12,7 +12,9 @@
12
12
  # License for the specific language governing permissions and limitations
13
13
  # under the License.
14
14
 
15
+ import argparse
15
16
  import logging
17
+ from typing import Any
16
18
 
17
19
  from keystoneclient.v2_0 import client as identity_client_v2
18
20
  from osc_lib import utils
@@ -39,7 +41,7 @@ AUTH_VERSIONS = {
39
41
  }
40
42
 
41
43
 
42
- def make_client(instance):
44
+ def make_client(instance: Any) -> Any:
43
45
  """Returns an identity service client."""
44
46
  identity_client = utils.get_client_class(
45
47
  API_NAME, instance._api_version[API_NAME], API_VERSIONS
@@ -56,7 +58,9 @@ def make_client(instance):
56
58
  return client
57
59
 
58
60
 
59
- def build_option_parser(parser):
61
+ def build_option_parser(
62
+ parser: argparse.ArgumentParser,
63
+ ) -> argparse.ArgumentParser:
60
64
  """Hook to add global options"""
61
65
  parser.add_argument(
62
66
  '--os-identity-api-version',
@@ -70,10 +74,11 @@ def build_option_parser(parser):
70
74
  return parser
71
75
 
72
76
 
77
+ # We're not going to add type hints to this at this point
73
78
  class IdentityClientv2(identity_client_v2.Client):
74
79
  """Tweak the earlier client class to deal with some changes"""
75
80
 
76
- def __getattr__(self, name):
81
+ def __getattr__(self, name: str) -> Any:
77
82
  # Map v3 'projects' back to v2 'tenants'
78
83
  if name == "projects":
79
84
  return self.tenants
@@ -15,6 +15,10 @@
15
15
 
16
16
  """Common identity code"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Callable
20
+ from typing import Any, cast
21
+
18
22
  from keystoneclient import exceptions as identity_exc
19
23
  from keystoneclient.v3 import domains
20
24
  from keystoneclient.v3 import groups
@@ -27,7 +31,7 @@ from osc_lib import utils
27
31
  from openstackclient.i18n import _
28
32
 
29
33
 
30
- def find_service_in_list(service_list, service_id):
34
+ def find_service_in_list(service_list: list[Any], service_id: str) -> Any:
31
35
  """Find a service by id in service list."""
32
36
 
33
37
  for service in service_list:
@@ -38,7 +42,7 @@ def find_service_in_list(service_list, service_id):
38
42
  )
39
43
 
40
44
 
41
- def find_service(identity_client, name_type_or_id):
45
+ def find_service(identity_client: Any, name_type_or_id: str) -> Any:
42
46
  """Find a service by id, name or type."""
43
47
 
44
48
  try:
@@ -74,7 +78,7 @@ def find_service(identity_client, name_type_or_id):
74
78
  raise exceptions.CommandError(msg % name_type_or_id)
75
79
 
76
80
 
77
- def find_service_sdk(identity_client, name_type_or_id):
81
+ def find_service_sdk(identity_client: Any, name_type_or_id: str) -> Any:
78
82
  """Find a service by id, name or type."""
79
83
 
80
84
  try:
@@ -107,7 +111,7 @@ def find_service_sdk(identity_client, name_type_or_id):
107
111
  return service
108
112
 
109
113
 
110
- def get_resource(manager, name_type_or_id):
114
+ def get_resource(manager: Any, name_type_or_id: str) -> Any:
111
115
  # NOTE (vishakha): Due to bug #1799153 and for any another related case
112
116
  # where GET resource API does not support the filter by name,
113
117
  # osc_lib.utils.find_resource() method cannot be used because that method
@@ -126,7 +130,7 @@ def get_resource(manager, name_type_or_id):
126
130
  raise exceptions.CommandError(msg % name_type_or_id)
127
131
 
128
132
 
129
- def get_resource_by_id(manager, resource_id):
133
+ def get_resource_by_id(manager: Any, resource_id: str) -> Any:
130
134
  """Get resource by ID
131
135
 
132
136
  Raises CommandError if the resource is not found
@@ -138,7 +142,12 @@ def get_resource_by_id(manager, resource_id):
138
142
  raise exceptions.CommandError(msg.format(resource_id))
139
143
 
140
144
 
141
- def _get_token_resource(client, resource, parsed_name, parsed_domain=None):
145
+ def _get_token_resource(
146
+ client: Any,
147
+ resource: str,
148
+ parsed_name: str,
149
+ parsed_domain: str | None = None,
150
+ ) -> str:
142
151
  """Peek into the user's auth token to get resource IDs
143
152
 
144
153
  Look into a user's token to try and find the ID of a domain, project or
@@ -174,25 +183,28 @@ def _get_token_resource(client, resource, parsed_name, parsed_domain=None):
174
183
  if isinstance(obj, list):
175
184
  for item in obj:
176
185
  if item['name'] == parsed_name:
177
- return item['id']
186
+ return cast(str, item['id'])
178
187
  if item['id'] == parsed_name:
179
188
  return parsed_name
180
189
  return parsed_name
181
190
  return obj['id'] if obj['name'] == parsed_name else parsed_name
182
191
  # diaper defense in case parsing the token fails
183
- except Exception: # noqa
192
+ except Exception:
184
193
  return parsed_name
185
194
 
186
195
 
187
- def find_domain(identity_client, name_or_id):
196
+ def find_domain(identity_client: Any, name_or_id: str) -> domains.Domain:
188
197
  return _find_identity_resource(
189
198
  identity_client.domains, name_or_id, domains.Domain
190
199
  )
191
200
 
192
201
 
193
202
  def find_domain_id_sdk(
194
- identity_client, name_or_id, *, validate_actor_existence=True
195
- ):
203
+ identity_client: Any,
204
+ name_or_id: str,
205
+ *,
206
+ validate_actor_existence: bool = True,
207
+ ) -> str:
196
208
  return _find_sdk_id(
197
209
  identity_client.find_domain,
198
210
  name_or_id=name_or_id,
@@ -200,7 +212,11 @@ def find_domain_id_sdk(
200
212
  )
201
213
 
202
214
 
203
- def find_group(identity_client, name_or_id, domain_name_or_id=None):
215
+ def find_group(
216
+ identity_client: Any,
217
+ name_or_id: str,
218
+ domain_name_or_id: str | None = None,
219
+ ) -> groups.Group:
204
220
  if domain_name_or_id is None:
205
221
  return _find_identity_resource(
206
222
  identity_client.groups, name_or_id, groups.Group
@@ -216,12 +232,12 @@ def find_group(identity_client, name_or_id, domain_name_or_id=None):
216
232
 
217
233
 
218
234
  def find_group_id_sdk(
219
- identity_client,
220
- name_or_id,
221
- domain_name_or_id=None,
235
+ identity_client: Any,
236
+ name_or_id: str,
237
+ domain_name_or_id: str | None = None,
222
238
  *,
223
- validate_actor_existence=True,
224
- ):
239
+ validate_actor_existence: bool = True,
240
+ ) -> str:
225
241
  if domain_name_or_id is None:
226
242
  return _find_sdk_id(
227
243
  identity_client.find_group,
@@ -242,7 +258,11 @@ def find_group_id_sdk(
242
258
  )
243
259
 
244
260
 
245
- def find_project(identity_client, name_or_id, domain_name_or_id=None):
261
+ def find_project(
262
+ identity_client: Any,
263
+ name_or_id: str,
264
+ domain_name_or_id: str | None = None,
265
+ ) -> projects.Project:
246
266
  if domain_name_or_id is None:
247
267
  return _find_identity_resource(
248
268
  identity_client.projects, name_or_id, projects.Project
@@ -257,13 +277,13 @@ def find_project(identity_client, name_or_id, domain_name_or_id=None):
257
277
 
258
278
 
259
279
  def find_project_id_sdk(
260
- identity_client,
261
- name_or_id,
262
- domain_name_or_id=None,
280
+ identity_client: Any,
281
+ name_or_id: str,
282
+ domain_name_or_id: str | None = None,
263
283
  *,
264
- validate_actor_existence=True,
265
- validate_domain_actor_existence=None,
266
- ):
284
+ validate_actor_existence: bool = True,
285
+ validate_domain_actor_existence: bool | None = None,
286
+ ) -> str:
267
287
  if domain_name_or_id is None:
268
288
  return _find_sdk_id(
269
289
  identity_client.find_project,
@@ -287,7 +307,11 @@ def find_project_id_sdk(
287
307
  )
288
308
 
289
309
 
290
- def find_user(identity_client, name_or_id, domain_name_or_id=None):
310
+ def find_user(
311
+ identity_client: Any,
312
+ name_or_id: str,
313
+ domain_name_or_id: str | None = None,
314
+ ) -> users.User:
291
315
  if domain_name_or_id is None:
292
316
  return _find_identity_resource(
293
317
  identity_client.users, name_or_id, users.User
@@ -299,12 +323,12 @@ def find_user(identity_client, name_or_id, domain_name_or_id=None):
299
323
 
300
324
 
301
325
  def find_user_id_sdk(
302
- identity_client,
303
- name_or_id,
304
- domain_name_or_id=None,
326
+ identity_client: Any,
327
+ name_or_id: str,
328
+ domain_name_or_id: str | None = None,
305
329
  *,
306
- validate_actor_existence=True,
307
- ):
330
+ validate_actor_existence: bool = True,
331
+ ) -> str:
308
332
  if domain_name_or_id is None:
309
333
  return _find_sdk_id(
310
334
  identity_client.find_user,
@@ -325,8 +349,11 @@ def find_user_id_sdk(
325
349
 
326
350
 
327
351
  def _find_identity_resource(
328
- identity_client_manager, name_or_id, resource_type, **kwargs
329
- ):
352
+ identity_client_manager: Any,
353
+ name_or_id: str,
354
+ resource_type: Any,
355
+ **kwargs: Any,
356
+ ) -> Any:
330
357
  """Find a specific identity resource.
331
358
 
332
359
  Using keystoneclient's manager, attempt to find a specific resource by its
@@ -365,8 +392,12 @@ def _find_identity_resource(
365
392
 
366
393
 
367
394
  def _find_sdk_id(
368
- find_command, name_or_id, *, validate_actor_existence=True, **kwargs
369
- ):
395
+ find_command: Callable[..., Any],
396
+ name_or_id: str,
397
+ *,
398
+ validate_actor_existence: bool = True,
399
+ **kwargs: Any,
400
+ ) -> str:
370
401
  try:
371
402
  resource = find_command(
372
403
  name_or_id=name_or_id, ignore_missing=False, **kwargs
@@ -377,10 +408,10 @@ def _find_sdk_id(
377
408
  if not validate_actor_existence:
378
409
  return name_or_id
379
410
  raise exceptions.CommandError from exc
380
- return resource.id
411
+ return cast(str, resource.id)
381
412
 
382
413
 
383
- def add_user_domain_option_to_parser(parser):
414
+ def add_user_domain_option_to_parser(parser: argparse.ArgumentParser) -> None:
384
415
  parser.add_argument(
385
416
  '--user-domain',
386
417
  metavar='<user-domain>',
@@ -392,7 +423,7 @@ def add_user_domain_option_to_parser(parser):
392
423
  )
393
424
 
394
425
 
395
- def add_group_domain_option_to_parser(parser):
426
+ def add_group_domain_option_to_parser(parser: argparse.ArgumentParser) -> None:
396
427
  parser.add_argument(
397
428
  '--group-domain',
398
429
  metavar='<group-domain>',
@@ -404,21 +435,21 @@ def add_group_domain_option_to_parser(parser):
404
435
  )
405
436
 
406
437
 
407
- def add_project_domain_option_to_parser(parser, enhance_help=lambda _h: _h):
438
+ def add_project_domain_option_to_parser(
439
+ parser: argparse.ArgumentParser,
440
+ ) -> None:
408
441
  parser.add_argument(
409
442
  '--project-domain',
410
443
  metavar='<project-domain>',
411
- help=enhance_help(
412
- _(
413
- 'Domain the project belongs to (name or ID). This '
414
- 'can be used in case collisions between project '
415
- 'names exist.'
416
- )
444
+ help=_(
445
+ 'Domain the project belongs to (name or ID). This '
446
+ 'can be used in case collisions between project '
447
+ 'names exist.'
417
448
  ),
418
449
  )
419
450
 
420
451
 
421
- def add_role_domain_option_to_parser(parser):
452
+ def add_role_domain_option_to_parser(parser: argparse.ArgumentParser) -> None:
422
453
  parser.add_argument(
423
454
  '--role-domain',
424
455
  metavar='<role-domain>',
@@ -430,7 +461,7 @@ def add_role_domain_option_to_parser(parser):
430
461
  )
431
462
 
432
463
 
433
- def add_inherited_option_to_parser(parser):
464
+ def add_inherited_option_to_parser(parser: argparse.ArgumentParser) -> None:
434
465
  parser.add_argument(
435
466
  '--inherited',
436
467
  action='store_true',
@@ -441,7 +472,7 @@ def add_inherited_option_to_parser(parser):
441
472
  )
442
473
 
443
474
 
444
- def add_resource_option_to_parser(parser):
475
+ def add_resource_option_to_parser(parser: argparse.ArgumentParser) -> None:
445
476
  immutable_group = parser.add_mutually_exclusive_group()
446
477
  immutable_group.add_argument(
447
478
  '--immutable',
@@ -13,8 +13,10 @@
13
13
 
14
14
  """Identity v2 Service Catalog action implementations"""
15
15
 
16
+ import argparse
17
+ from collections.abc import Iterable, Sequence
16
18
  import logging
17
- import typing as ty
19
+ from typing import Any
18
20
 
19
21
  from cliff import columns as cliff_columns
20
22
  from osc_lib import exceptions
@@ -27,8 +29,8 @@ from openstackclient.i18n import _
27
29
  LOG = logging.getLogger(__name__)
28
30
 
29
31
 
30
- class EndpointsColumn(cliff_columns.FormattableColumn[ty.Any]):
31
- def human_readable(self):
32
+ class EndpointsColumn(cliff_columns.FormattableColumn[Any]):
33
+ def human_readable(self) -> str:
32
34
  if not self._value:
33
35
  return ""
34
36
  ret = ''
@@ -47,7 +49,9 @@ class EndpointsColumn(cliff_columns.FormattableColumn[ty.Any]):
47
49
  class ListCatalog(command.Lister):
48
50
  _description = _("List services in the service catalog")
49
51
 
50
- def take_action(self, parsed_args):
52
+ def take_action(
53
+ self, parsed_args: argparse.Namespace
54
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
51
55
  # Trigger auth if it has not happened yet
52
56
  auth_ref = self.app.client_manager.auth_ref
53
57
  if not auth_ref:
@@ -75,7 +79,7 @@ class ListCatalog(command.Lister):
75
79
  class ShowCatalog(command.ShowOne):
76
80
  _description = _("Display service catalog details")
77
81
 
78
- def get_parser(self, prog_name):
82
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
79
83
  parser = super().get_parser(prog_name)
80
84
  parser.add_argument(
81
85
  'service',
@@ -84,7 +88,9 @@ class ShowCatalog(command.ShowOne):
84
88
  )
85
89
  return parser
86
90
 
87
- def take_action(self, parsed_args):
91
+ def take_action(
92
+ self, parsed_args: argparse.Namespace
93
+ ) -> tuple[Sequence[str], Iterable[Any]]:
88
94
  # Trigger auth if it has not happened yet
89
95
  auth_ref = self.app.client_manager.auth_ref
90
96
  if not auth_ref:
@@ -108,4 +114,5 @@ class ShowCatalog(command.ShowOne):
108
114
  LOG.error(_('service %s not found\n'), parsed_args.service)
109
115
  return ((), ())
110
116
 
111
- return zip(*sorted(data.items()))
117
+ col_headers, col_data = zip(*sorted(data.items()))
118
+ return col_headers, col_data