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
@@ -12,7 +12,10 @@
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 collections.abc import Iterable, Sequence
18
+ from typing import Any
16
19
 
17
20
  from osc_lib.cli import identity as identity_utils
18
21
  from osc_lib import exceptions
@@ -37,14 +40,14 @@ _attr_map = [
37
40
  ]
38
41
 
39
42
 
40
- def _add_updatable_args(parser):
43
+ def _add_updatable_args(parser: argparse.ArgumentParser) -> None:
41
44
  parser.add_argument('--name', help=_('Name of the tap service.'))
42
45
  parser.add_argument(
43
46
  '--description', help=_('Description of the tap service.')
44
47
  )
45
48
 
46
49
 
47
- def _get_columns(item):
50
+ def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
48
51
  column_map: dict[str, str] = {}
49
52
  hidden_columns = ['location', 'tenant_id']
50
53
  return osc_utils.get_osc_show_columns_for_sdk_resource(
@@ -55,7 +58,7 @@ def _get_columns(item):
55
58
  class CreateTapService(command.ShowOne):
56
59
  _description = _("Create a new tap service.")
57
60
 
58
- def get_parser(self, prog_name):
61
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
59
62
  parser = super().get_parser(prog_name)
60
63
  identity_utils.add_project_owner_option_to_parser(parser)
61
64
  _add_updatable_args(parser)
@@ -68,7 +71,9 @@ class CreateTapService(command.ShowOne):
68
71
  )
69
72
  return parser
70
73
 
71
- def take_action(self, parsed_args):
74
+ def take_action(
75
+ self, parsed_args: argparse.Namespace
76
+ ) -> tuple[Sequence[str], Iterable[Any]]:
72
77
  client = self.app.client_manager.network
73
78
  attrs = {}
74
79
  if parsed_args.name is not None:
@@ -95,13 +100,15 @@ class CreateTapService(command.ShowOne):
95
100
  class ListTapService(command.Lister):
96
101
  _description = _("List tap services.")
97
102
 
98
- def get_parser(self, prog_name):
103
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
99
104
  parser = super().get_parser(prog_name)
100
105
  identity_utils.add_project_owner_option_to_parser(parser)
101
106
 
102
107
  return parser
103
108
 
104
- def take_action(self, parsed_args):
109
+ def take_action(
110
+ self, parsed_args: argparse.Namespace
111
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
105
112
  client = self.app.client_manager.network
106
113
  params = {}
107
114
  if parsed_args.project is not None:
@@ -123,7 +130,7 @@ class ListTapService(command.Lister):
123
130
  class ShowTapService(command.ShowOne):
124
131
  _description = _("Show tap service details.")
125
132
 
126
- def get_parser(self, prog_name):
133
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
127
134
  parser = super().get_parser(prog_name)
128
135
  parser.add_argument(
129
136
  TAP_SERVICE,
@@ -132,7 +139,9 @@ class ShowTapService(command.ShowOne):
132
139
  )
133
140
  return parser
134
141
 
135
- def take_action(self, parsed_args):
142
+ def take_action(
143
+ self, parsed_args: argparse.Namespace
144
+ ) -> tuple[Sequence[str], Iterable[Any]]:
136
145
  client = self.app.client_manager.network
137
146
  id = client.find_tap_service(
138
147
  parsed_args.tap_service, ignore_missing=False
@@ -146,7 +155,7 @@ class ShowTapService(command.ShowOne):
146
155
  class DeleteTapService(command.Command):
147
156
  _description = _("Delete a tap service.")
148
157
 
149
- def get_parser(self, prog_name):
158
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
150
159
  parser = super().get_parser(prog_name)
151
160
  parser.add_argument(
152
161
  TAP_SERVICE,
@@ -156,7 +165,7 @@ class DeleteTapService(command.Command):
156
165
  )
157
166
  return parser
158
167
 
159
- def take_action(self, parsed_args):
168
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
160
169
  client = self.app.client_manager.network
161
170
  fails = 0
162
171
  for id_or_name in parsed_args.tap_service:
@@ -185,7 +194,7 @@ class DeleteTapService(command.Command):
185
194
  class UpdateTapService(command.ShowOne):
186
195
  _description = _("Update a tap service.")
187
196
 
188
- def get_parser(self, prog_name):
197
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
189
198
  parser = super().get_parser(prog_name)
190
199
  parser.add_argument(
191
200
  TAP_SERVICE,
@@ -195,7 +204,9 @@ class UpdateTapService(command.ShowOne):
195
204
  _add_updatable_args(parser)
196
205
  return parser
197
206
 
198
- def take_action(self, parsed_args):
207
+ def take_action(
208
+ self, parsed_args: argparse.Namespace
209
+ ) -> tuple[Sequence[str], Iterable[Any]]:
199
210
  client = self.app.client_manager.network
200
211
  original_t_s = client.find_tap_service(
201
212
  parsed_args.tap_service, ignore_missing=False
@@ -15,6 +15,9 @@
15
15
 
16
16
  """Object client"""
17
17
 
18
+ import argparse
19
+ from typing import Any
20
+
18
21
  from osc_lib import utils
19
22
 
20
23
  from openstackclient.api import object_store_v1
@@ -26,7 +29,7 @@ API_NAME = 'object_store'
26
29
  API_VERSIONS = ('1',)
27
30
 
28
31
 
29
- def make_client(instance):
32
+ def make_client(instance: Any) -> object_store_v1.APIv1:
30
33
  """Returns an object-store API client."""
31
34
 
32
35
  endpoint = instance.get_endpoint_for_service_type(
@@ -43,7 +46,9 @@ def make_client(instance):
43
46
  return client
44
47
 
45
48
 
46
- def build_option_parser(parser):
49
+ def build_option_parser(
50
+ parser: argparse.ArgumentParser,
51
+ ) -> argparse.ArgumentParser:
47
52
  """Hook to add global options"""
48
53
  parser.add_argument(
49
54
  '--os-object-api-version',
@@ -13,6 +13,10 @@
13
13
 
14
14
  """Account v1 action implementations"""
15
15
 
16
+ import argparse
17
+ from collections.abc import Iterable, Sequence
18
+ from typing import Any
19
+
16
20
  from osc_lib.cli import format_columns
17
21
  from osc_lib.cli import parseractions
18
22
 
@@ -23,7 +27,7 @@ from openstackclient.i18n import _
23
27
  class SetAccount(command.Command):
24
28
  _description = _("Set account properties")
25
29
 
26
- def get_parser(self, prog_name):
30
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
27
31
  parser = super().get_parser(prog_name)
28
32
  parser.add_argument(
29
33
  "--property",
@@ -37,7 +41,7 @@ class SetAccount(command.Command):
37
41
  )
38
42
  return parser
39
43
 
40
- def take_action(self, parsed_args):
44
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
41
45
  self.app.client_manager.object_store.account_set(
42
46
  properties=parsed_args.property,
43
47
  )
@@ -46,19 +50,22 @@ class SetAccount(command.Command):
46
50
  class ShowAccount(command.ShowOne):
47
51
  _description = _("Display account details")
48
52
 
49
- def take_action(self, parsed_args):
53
+ def take_action(
54
+ self, parsed_args: argparse.Namespace
55
+ ) -> tuple[Sequence[str], Iterable[Any]]:
50
56
  data = self.app.client_manager.object_store.account_show()
51
57
  if 'properties' in data:
52
58
  data['properties'] = format_columns.DictColumn(
53
59
  data.pop('properties')
54
60
  )
55
- return zip(*sorted(data.items()))
61
+ col_headers, col_data = zip(*sorted(data.items()))
62
+ return col_headers, col_data
56
63
 
57
64
 
58
65
  class UnsetAccount(command.Command):
59
66
  _description = _("Unset account properties")
60
67
 
61
- def get_parser(self, prog_name):
68
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
62
69
  parser = super().get_parser(prog_name)
63
70
  parser.add_argument(
64
71
  '--property',
@@ -73,7 +80,7 @@ class UnsetAccount(command.Command):
73
80
  )
74
81
  return parser
75
82
 
76
- def take_action(self, parsed_args):
83
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
77
84
  self.app.client_manager.object_store.account_unset(
78
85
  properties=parsed_args.property,
79
86
  )
@@ -15,7 +15,10 @@
15
15
 
16
16
  """Container v1 action implementations"""
17
17
 
18
+ import argparse
18
19
  import logging
20
+ from collections.abc import Iterable, Sequence
21
+ from typing import Any
19
22
 
20
23
  from osc_lib.cli import format_columns
21
24
  from osc_lib.cli import parseractions
@@ -31,7 +34,7 @@ LOG = logging.getLogger(__name__)
31
34
  class CreateContainer(command.Lister):
32
35
  _description = _("Create new container")
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
  '--public',
@@ -51,7 +54,9 @@ class CreateContainer(command.Lister):
51
54
  )
52
55
  return parser
53
56
 
54
- def take_action(self, parsed_args):
57
+ def take_action(
58
+ self, parsed_args: argparse.Namespace
59
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
55
60
  results = []
56
61
  for container in parsed_args.containers:
57
62
  if len(container) > 256:
@@ -84,7 +89,7 @@ class CreateContainer(command.Lister):
84
89
  class DeleteContainer(command.Command):
85
90
  _description = _("Delete container")
86
91
 
87
- def get_parser(self, prog_name):
92
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
88
93
  parser = super().get_parser(prog_name)
89
94
  parser.add_argument(
90
95
  '--recursive',
@@ -101,7 +106,7 @@ class DeleteContainer(command.Command):
101
106
  )
102
107
  return parser
103
108
 
104
- def take_action(self, parsed_args):
109
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
105
110
  for container in parsed_args.containers:
106
111
  if parsed_args.recursive:
107
112
  objs = self.app.client_manager.object_store.object_list(
@@ -120,7 +125,7 @@ class DeleteContainer(command.Command):
120
125
  class ListContainer(command.Lister):
121
126
  _description = _("List containers")
122
127
 
123
- def get_parser(self, prog_name):
128
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
124
129
  parser = super().get_parser(prog_name)
125
130
  parser.add_argument(
126
131
  "--prefix",
@@ -147,7 +152,9 @@ class ListContainer(command.Lister):
147
152
  )
148
153
  return parser
149
154
 
150
- def take_action(self, parsed_args):
155
+ def take_action(
156
+ self, parsed_args: argparse.Namespace
157
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
151
158
  columns: tuple[str, ...] = ('Name',)
152
159
  if parsed_args.long:
153
160
  columns += ('Bytes', 'Count')
@@ -182,7 +189,7 @@ class ListContainer(command.Lister):
182
189
  class SaveContainer(command.Command):
183
190
  _description = _("Save container contents locally")
184
191
 
185
- def get_parser(self, prog_name):
192
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
186
193
  parser = super().get_parser(prog_name)
187
194
  parser.add_argument(
188
195
  'container',
@@ -191,7 +198,7 @@ class SaveContainer(command.Command):
191
198
  )
192
199
  return parser
193
200
 
194
- def take_action(self, parsed_args):
201
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
195
202
  self.app.client_manager.object_store.container_save(
196
203
  container=parsed_args.container,
197
204
  )
@@ -200,7 +207,7 @@ class SaveContainer(command.Command):
200
207
  class SetContainer(command.Command):
201
208
  _description = _("Set container properties")
202
209
 
203
- def get_parser(self, prog_name):
210
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
204
211
  parser = super().get_parser(prog_name)
205
212
  parser.add_argument(
206
213
  'container',
@@ -219,7 +226,7 @@ class SetContainer(command.Command):
219
226
  )
220
227
  return parser
221
228
 
222
- def take_action(self, parsed_args):
229
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
223
230
  self.app.client_manager.object_store.container_set(
224
231
  parsed_args.container,
225
232
  properties=parsed_args.property,
@@ -229,7 +236,7 @@ class SetContainer(command.Command):
229
236
  class ShowContainer(command.ShowOne):
230
237
  _description = _("Display container details")
231
238
 
232
- def get_parser(self, prog_name):
239
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
233
240
  parser = super().get_parser(prog_name)
234
241
  parser.add_argument(
235
242
  'container',
@@ -238,20 +245,23 @@ class ShowContainer(command.ShowOne):
238
245
  )
239
246
  return parser
240
247
 
241
- def take_action(self, parsed_args):
248
+ def take_action(
249
+ self, parsed_args: argparse.Namespace
250
+ ) -> tuple[Sequence[str], Iterable[Any]]:
242
251
  data = self.app.client_manager.object_store.container_show(
243
252
  container=parsed_args.container,
244
253
  )
245
254
  if 'properties' in data:
246
255
  data['properties'] = format_columns.DictColumn(data['properties'])
247
256
 
248
- return zip(*sorted(data.items()))
257
+ col_headers, col_data = zip(*sorted(data.items()))
258
+ return col_headers, col_data
249
259
 
250
260
 
251
261
  class UnsetContainer(command.Command):
252
262
  _description = _("Unset container properties")
253
263
 
254
- def get_parser(self, prog_name):
264
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
255
265
  parser = super().get_parser(prog_name)
256
266
  parser.add_argument(
257
267
  'container',
@@ -271,7 +281,7 @@ class UnsetContainer(command.Command):
271
281
  )
272
282
  return parser
273
283
 
274
- def take_action(self, parsed_args):
284
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
275
285
  self.app.client_manager.object_store.container_unset(
276
286
  parsed_args.container,
277
287
  properties=parsed_args.property,
@@ -15,7 +15,10 @@
15
15
 
16
16
  """Object v1 action implementations"""
17
17
 
18
+ import argparse
18
19
  import logging
20
+ from collections.abc import Iterable, Sequence
21
+ from typing import Any
19
22
 
20
23
  from osc_lib.cli import format_columns
21
24
  from osc_lib.cli import parseractions
@@ -33,7 +36,7 @@ LOG = logging.getLogger(__name__)
33
36
  class CreateObject(command.Lister):
34
37
  _description = _("Upload object to container")
35
38
 
36
- def get_parser(self, prog_name):
39
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
37
40
  parser = super().get_parser(prog_name)
38
41
  parser.add_argument(
39
42
  'container',
@@ -56,7 +59,9 @@ class CreateObject(command.Lister):
56
59
  )
57
60
  return parser
58
61
 
59
- def take_action(self, parsed_args):
62
+ def take_action(
63
+ self, parsed_args: argparse.Namespace
64
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
60
65
  if parsed_args.name:
61
66
  if len(parsed_args.objects) > 1:
62
67
  msg = _(
@@ -98,7 +103,7 @@ class CreateObject(command.Lister):
98
103
  class DeleteObject(command.Command):
99
104
  _description = _("Delete object from container")
100
105
 
101
- def get_parser(self, prog_name):
106
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
102
107
  parser = super().get_parser(prog_name)
103
108
  parser.add_argument(
104
109
  'container',
@@ -113,7 +118,7 @@ class DeleteObject(command.Command):
113
118
  )
114
119
  return parser
115
120
 
116
- def take_action(self, parsed_args):
121
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
117
122
  for obj in parsed_args.objects:
118
123
  self.app.client_manager.object_store.object_delete(
119
124
  container=parsed_args.container,
@@ -124,7 +129,7 @@ class DeleteObject(command.Command):
124
129
  class ListObject(command.Lister):
125
130
  _description = _("List objects")
126
131
 
127
- def get_parser(self, prog_name):
132
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
128
133
  parser = super().get_parser(prog_name)
129
134
  parser.add_argument(
130
135
  "container",
@@ -161,7 +166,9 @@ class ListObject(command.Lister):
161
166
  )
162
167
  return parser
163
168
 
164
- def take_action(self, parsed_args):
169
+ def take_action(
170
+ self, parsed_args: argparse.Namespace
171
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
165
172
  columns: tuple[str, ...] = ('Name',)
166
173
  if parsed_args.long:
167
174
  columns += ('Bytes', 'Hash', 'Content Type', 'Last Modified')
@@ -200,7 +207,7 @@ class ListObject(command.Lister):
200
207
  class SaveObject(command.Command):
201
208
  _description = _("Save object locally")
202
209
 
203
- def get_parser(self, prog_name):
210
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
204
211
  parser = super().get_parser(prog_name)
205
212
  parser.add_argument(
206
213
  "--file",
@@ -222,7 +229,7 @@ class SaveObject(command.Command):
222
229
  )
223
230
  return parser
224
231
 
225
- def take_action(self, parsed_args):
232
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
226
233
  self.app.client_manager.object_store.object_save(
227
234
  container=parsed_args.container,
228
235
  object=parsed_args.object,
@@ -233,7 +240,7 @@ class SaveObject(command.Command):
233
240
  class SetObject(command.Command):
234
241
  _description = _("Set object properties")
235
242
 
236
- def get_parser(self, prog_name):
243
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
237
244
  parser = super().get_parser(prog_name)
238
245
  parser.add_argument(
239
246
  'container',
@@ -257,7 +264,7 @@ class SetObject(command.Command):
257
264
  )
258
265
  return parser
259
266
 
260
- def take_action(self, parsed_args):
267
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
261
268
  self.app.client_manager.object_store.object_set(
262
269
  parsed_args.container,
263
270
  parsed_args.object,
@@ -268,7 +275,7 @@ class SetObject(command.Command):
268
275
  class ShowObject(command.ShowOne):
269
276
  _description = _("Display object details")
270
277
 
271
- def get_parser(self, prog_name):
278
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
272
279
  parser = super().get_parser(prog_name)
273
280
  parser.add_argument(
274
281
  'container',
@@ -282,7 +289,9 @@ class ShowObject(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
  data = self.app.client_manager.object_store.object_show(
287
296
  container=parsed_args.container,
288
297
  object=parsed_args.object,
@@ -290,13 +299,14 @@ class ShowObject(command.ShowOne):
290
299
  if 'properties' in data:
291
300
  data['properties'] = format_columns.DictColumn(data['properties'])
292
301
 
293
- return zip(*sorted(data.items()))
302
+ col_headers, col_data = zip(*sorted(data.items()))
303
+ return col_headers, col_data
294
304
 
295
305
 
296
306
  class UnsetObject(command.Command):
297
307
  _description = _("Unset object properties")
298
308
 
299
- def get_parser(self, prog_name):
309
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
300
310
  parser = super().get_parser(prog_name)
301
311
  parser.add_argument(
302
312
  'container',
@@ -321,7 +331,7 @@ class UnsetObject(command.Command):
321
331
  )
322
332
  return parser
323
333
 
324
- def take_action(self, parsed_args):
334
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
325
335
  self.app.client_manager.object_store.object_unset(
326
336
  parsed_args.container,
327
337
  parsed_args.object,
File without changes
openstackclient/shell.py CHANGED
@@ -16,7 +16,9 @@
16
16
 
17
17
  """Command-line interface to the OpenStack APIs"""
18
18
 
19
+ import argparse
19
20
  import sys
21
+ from typing import Any
20
22
  import warnings
21
23
 
22
24
  from osc_lib.api import auth
@@ -31,14 +33,16 @@ DEFAULT_DOMAIN = 'default'
31
33
  # core OSC
32
34
  IGNORED_MODULES = (
33
35
  'neutron_taas.taas_client.osc',
36
+ 'neutronclient.osc.v2.fwaas',
34
37
  'neutronclient.osc.v2.taas',
38
+ 'neutronclient.osc.v2.networking_bgpvpn',
35
39
  )
36
40
 
37
41
 
38
42
  class OpenStackShell(shell.OpenStackShell):
39
43
  client_manager: clientmanager.ClientManager
40
44
 
41
- def __init__(self):
45
+ def __init__(self) -> None:
42
46
  command_manager = commandmanager.CommandManager(
43
47
  'openstack.cli', ignored_modules=IGNORED_MODULES
44
48
  )
@@ -59,7 +63,12 @@ class OpenStackShell(shell.OpenStackShell):
59
63
  # about them
60
64
  warnings.filterwarnings('ignore', module='openstack')
61
65
 
62
- def build_option_parser(self, description, version, argparse_kwargs=None):
66
+ def build_option_parser(
67
+ self,
68
+ description: str | None,
69
+ version: str | None,
70
+ argparse_kwargs: dict[str, Any] | None = None,
71
+ ) -> argparse.ArgumentParser:
63
72
  parser = super().build_option_parser(
64
73
  description, version, argparse_kwargs
65
74
  )
@@ -67,7 +76,7 @@ class OpenStackShell(shell.OpenStackShell):
67
76
  parser = auth.build_auth_plugins_option_parser(parser)
68
77
  return parser
69
78
 
70
- def _final_defaults(self):
79
+ def _final_defaults(self) -> None:
71
80
  super()._final_defaults()
72
81
 
73
82
  # Set the default plugin to admin_token if endpoint and token are given
@@ -77,7 +86,7 @@ class OpenStackShell(shell.OpenStackShell):
77
86
  else:
78
87
  self._auth_type = 'password'
79
88
 
80
- def _load_plugins(self):
89
+ def _load_plugins(self) -> None:
81
90
  """Load plugins via stevedore."""
82
91
  # Loop through extensions to get API versions
83
92
  for mod in clientmanager.PLUGIN_MODULES:
@@ -128,16 +137,43 @@ class OpenStackShell(shell.OpenStackShell):
128
137
  },
129
138
  )
130
139
 
131
- # Command groups deal only with major versions
132
- version = '.v' + version_opt.replace('.', '_').split('_')[0]
133
- cmd_group = 'openstack.' + api.replace('-', '_') + version
140
+ # Build our command group which we expect to look like:
141
+ #
142
+ # openstack.<service>.vN
143
+ #
144
+ # Note that command groups deal only with major versions
145
+ cmd_group = '.'.join(
146
+ [
147
+ 'openstack',
148
+ api.replace('-', '_'),
149
+ 'v' + version_opt.replace('.', '_').split('_')[0],
150
+ ]
151
+ )
134
152
  self.command_manager.add_command_group(cmd_group)
135
153
  self.log.debug(
136
154
  '%(name)s API version %(version)s, cmd group %(group)s',
137
155
  {'name': api, 'version': version_opt, 'group': cmd_group},
138
156
  )
139
157
 
140
- def _load_commands(self):
158
+ mod_extensions = getattr(mod, 'API_EXTENSIONS', None)
159
+ if not mod_extensions:
160
+ continue
161
+
162
+ for extension in mod_extensions:
163
+ extension_cmd_group = '.'.join([cmd_group, extension])
164
+ self.command_manager.add_command_group(extension_cmd_group)
165
+ self.log.debug(
166
+ '%(name)s API version %(version)s '
167
+ '(%(extension)s extension), cmd group %(group)s',
168
+ {
169
+ 'name': api,
170
+ 'version': version_opt,
171
+ 'extension': extension,
172
+ 'group': cmd_group,
173
+ },
174
+ )
175
+
176
+ def _load_commands(self) -> None:
141
177
  """Load commands via cliff/stevedore
142
178
 
143
179
  osc-lib has no opinion on what commands should be loaded
@@ -157,7 +193,7 @@ class OpenStackShell(shell.OpenStackShell):
157
193
  # }
158
194
  self.command_manager.add_command_group('openstack.extension')
159
195
 
160
- def initialize_app(self, argv):
196
+ def initialize_app(self, argv: list[str]) -> None:
161
197
  super().initialize_app(argv)
162
198
 
163
199
  # Re-create the client_manager with our subclass
@@ -168,7 +204,7 @@ class OpenStackShell(shell.OpenStackShell):
168
204
  )
169
205
 
170
206
 
171
- def main(argv=None):
207
+ def main(argv: list[str] | None = None) -> int:
172
208
  if argv is None:
173
209
  argv = sys.argv[1:]
174
210