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
@@ -13,9 +13,11 @@
13
13
 
14
14
  """Subnet action implementations"""
15
15
 
16
+ import argparse
16
17
  import copy
18
+ from collections.abc import Iterable, Sequence
17
19
  import logging
18
- import typing as ty
20
+ from typing import Any
19
21
 
20
22
  from cliff import columns as cliff_columns
21
23
  from osc_lib.cli import format_columns
@@ -32,7 +34,9 @@ from openstackclient.network import common
32
34
  LOG = logging.getLogger(__name__)
33
35
 
34
36
 
35
- def _update_arguments(obj_list, parsed_args_list, option):
37
+ def _update_arguments(
38
+ obj_list: list[Any], parsed_args_list: list[Any], option: str
39
+ ) -> None:
36
40
  for item in parsed_args_list:
37
41
  try:
38
42
  obj_list.remove(item)
@@ -44,8 +48,8 @@ def _update_arguments(obj_list, parsed_args_list, option):
44
48
  raise exceptions.CommandError(msg)
45
49
 
46
50
 
47
- class AllocationPoolsColumn(cliff_columns.FormattableColumn[ty.Any]):
48
- def human_readable(self):
51
+ class AllocationPoolsColumn(cliff_columns.FormattableColumn[Any]):
52
+ def human_readable(self) -> str:
49
53
  pool_formatted = [
50
54
  '{}-{}'.format(pool.get('start', ''), pool.get('end', ''))
51
55
  for pool in self._value
@@ -53,18 +57,19 @@ class AllocationPoolsColumn(cliff_columns.FormattableColumn[ty.Any]):
53
57
  return ','.join(pool_formatted)
54
58
 
55
59
 
56
- class HostRoutesColumn(cliff_columns.FormattableColumn[ty.Any]):
57
- def human_readable(self):
60
+ class HostRoutesColumn(cliff_columns.FormattableColumn[Any]):
61
+ def human_readable(self) -> str:
58
62
  # Map the host route keys to match --host-route option.
59
- return utils.format_list_of_dicts(
60
- convert_entries_to_gateway(self._value)
63
+ return (
64
+ utils.format_list_of_dicts(convert_entries_to_gateway(self._value))
65
+ or ""
61
66
  )
62
67
 
63
68
 
64
- class UnsortedListColumn(cliff_columns.FormattableColumn[list[ty.Any]]):
69
+ class UnsortedListColumn(cliff_columns.FormattableColumn[list[Any]]):
65
70
  # format_columns.ListColumn sorts the output, but for things like
66
71
  # DNS server addresses the order matters
67
- def human_readable(self):
72
+ def human_readable(self) -> str:
68
73
  return ', '.join(self._value)
69
74
 
70
75
 
@@ -77,7 +82,9 @@ _formatters = {
77
82
  }
78
83
 
79
84
 
80
- def _get_common_parse_arguments(parser, is_create=True):
85
+ def _get_common_parse_arguments(
86
+ parser: argparse.ArgumentParser, is_create: bool = True
87
+ ) -> None:
81
88
  parser.add_argument(
82
89
  '--allocation-pool',
83
90
  metavar='start=<ip-address>,end=<ip-address>',
@@ -159,7 +166,7 @@ def _get_common_parse_arguments(parser, is_create=True):
159
166
  )
160
167
 
161
168
 
162
- def _get_columns(item):
169
+ def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
163
170
  column_map = {
164
171
  'is_dhcp_enabled': 'enable_dhcp',
165
172
  'subnet_pool_id': 'subnetpool_id',
@@ -176,7 +183,9 @@ def _get_columns(item):
176
183
  )
177
184
 
178
185
 
179
- def convert_entries_to_nexthop(entries):
186
+ def convert_entries_to_nexthop(
187
+ entries: list[dict[str, Any]],
188
+ ) -> list[dict[str, Any]]:
180
189
  # Change 'gateway' entry to 'nexthop'
181
190
  changed_entries = copy.deepcopy(entries)
182
191
  for entry in changed_entries:
@@ -187,7 +196,9 @@ def convert_entries_to_nexthop(entries):
187
196
  return changed_entries
188
197
 
189
198
 
190
- def convert_entries_to_gateway(entries):
199
+ def convert_entries_to_gateway(
200
+ entries: list[dict[str, Any]],
201
+ ) -> list[dict[str, Any]]:
191
202
  # Change 'nexthop' entry to 'gateway'
192
203
  changed_entries = copy.deepcopy(entries)
193
204
  for entry in changed_entries:
@@ -198,7 +209,11 @@ def convert_entries_to_gateway(entries):
198
209
  return changed_entries
199
210
 
200
211
 
201
- def _get_attrs(client_manager, parsed_args, is_create=True):
212
+ def _get_attrs(
213
+ client_manager: Any,
214
+ parsed_args: argparse.Namespace,
215
+ is_create: bool = True,
216
+ ) -> dict[str, Any]:
202
217
  attrs = {}
203
218
  client = client_manager.network
204
219
  if 'name' in parsed_args and parsed_args.name is not None:
@@ -292,7 +307,7 @@ def _get_attrs(client_manager, parsed_args, is_create=True):
292
307
  class CreateSubnet(command.ShowOne, common.NeutronCommandWithExtraArgs):
293
308
  _description = _("Create a subnet")
294
309
 
295
- def get_parser(self, prog_name):
310
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
296
311
  parser = super().get_parser(prog_name)
297
312
  parser.add_argument(
298
313
  'name', metavar='<name>', help=_("New subnet name")
@@ -419,7 +434,9 @@ class CreateSubnet(command.ShowOne, common.NeutronCommandWithExtraArgs):
419
434
  _tag.add_tag_option_to_parser_for_create(parser, _('subnet'))
420
435
  return parser
421
436
 
422
- def take_action(self, parsed_args):
437
+ def take_action(
438
+ self, parsed_args: argparse.Namespace
439
+ ) -> tuple[Sequence[str], Iterable[Any]]:
423
440
  client = self.app.client_manager.network
424
441
  attrs = _get_attrs(self.app.client_manager, parsed_args)
425
442
  attrs.update(
@@ -436,7 +453,7 @@ class CreateSubnet(command.ShowOne, common.NeutronCommandWithExtraArgs):
436
453
  class DeleteSubnet(command.Command):
437
454
  _description = _("Delete subnet(s)")
438
455
 
439
- def get_parser(self, prog_name):
456
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
440
457
  parser = super().get_parser(prog_name)
441
458
  parser.add_argument(
442
459
  'subnet',
@@ -446,7 +463,7 @@ class DeleteSubnet(command.Command):
446
463
  )
447
464
  return parser
448
465
 
449
- def take_action(self, parsed_args):
466
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
450
467
  client = self.app.client_manager.network
451
468
  result = 0
452
469
 
@@ -478,7 +495,7 @@ class DeleteSubnet(command.Command):
478
495
  class ListSubnet(command.Lister):
479
496
  _description = _("List subnets")
480
497
 
481
- def get_parser(self, prog_name):
498
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
482
499
  parser = super().get_parser(prog_name)
483
500
  parser.add_argument(
484
501
  '--long',
@@ -566,7 +583,9 @@ class ListSubnet(command.Lister):
566
583
  _tag.add_tag_filtering_option_to_parser(parser, _('subnets'))
567
584
  return parser
568
585
 
569
- def take_action(self, parsed_args):
586
+ def take_action(
587
+ self, parsed_args: argparse.Namespace
588
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
570
589
  identity_client = self.app.client_manager.identity
571
590
  network_client = self.app.client_manager.network
572
591
  filters = {}
@@ -650,7 +669,7 @@ class ListSubnet(command.Lister):
650
669
  class SetSubnet(common.NeutronCommandWithExtraArgs):
651
670
  _description = _("Set subnet properties")
652
671
 
653
- def get_parser(self, prog_name):
672
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
654
673
  parser = super().get_parser(prog_name)
655
674
  parser.add_argument(
656
675
  'subnet',
@@ -707,7 +726,7 @@ class SetSubnet(common.NeutronCommandWithExtraArgs):
707
726
  _get_common_parse_arguments(parser, is_create=False)
708
727
  return parser
709
728
 
710
- def take_action(self, parsed_args):
729
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
711
730
  client = self.app.client_manager.network
712
731
  obj = client.find_subnet(parsed_args.subnet, ignore_missing=False)
713
732
  attrs = _get_attrs(
@@ -743,7 +762,7 @@ class SetSubnet(common.NeutronCommandWithExtraArgs):
743
762
  class ShowSubnet(command.ShowOne):
744
763
  _description = _("Display subnet details")
745
764
 
746
- def get_parser(self, prog_name):
765
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
747
766
  parser = super().get_parser(prog_name)
748
767
  parser.add_argument(
749
768
  'subnet',
@@ -752,7 +771,9 @@ class ShowSubnet(command.ShowOne):
752
771
  )
753
772
  return parser
754
773
 
755
- def take_action(self, parsed_args):
774
+ def take_action(
775
+ self, parsed_args: argparse.Namespace
776
+ ) -> tuple[Sequence[str], Iterable[Any]]:
756
777
  obj = self.app.client_manager.network.find_subnet(
757
778
  parsed_args.subnet, ignore_missing=False
758
779
  )
@@ -764,7 +785,7 @@ class ShowSubnet(command.ShowOne):
764
785
  class UnsetSubnet(common.NeutronUnsetCommandWithExtraArgs):
765
786
  _description = _("Unset subnet properties")
766
787
 
767
- def get_parser(self, prog_name):
788
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
768
789
  parser = super().get_parser(prog_name)
769
790
  parser.add_argument(
770
791
  '--allocation-pool',
@@ -827,11 +848,11 @@ class UnsetSubnet(common.NeutronUnsetCommandWithExtraArgs):
827
848
  )
828
849
  return parser
829
850
 
830
- def take_action(self, parsed_args):
851
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
831
852
  client = self.app.client_manager.network
832
853
  obj = client.find_subnet(parsed_args.subnet, ignore_missing=False)
833
854
 
834
- attrs: dict[str, ty.Any] = {}
855
+ attrs: dict[str, Any] = {}
835
856
  if parsed_args.gateway:
836
857
  attrs['gateway_ip'] = None
837
858
  if parsed_args.dns_nameservers:
@@ -13,7 +13,10 @@
13
13
 
14
14
  """Subnet pool action implementations"""
15
15
 
16
+ import argparse
17
+ from collections.abc import Iterable, Sequence
16
18
  import logging
19
+ from typing import Any
17
20
 
18
21
  from osc_lib.cli import format_columns
19
22
  from osc_lib.cli import parseractions
@@ -30,7 +33,7 @@ from openstackclient.network import common
30
33
  LOG = logging.getLogger(__name__)
31
34
 
32
35
 
33
- def _get_columns(item):
36
+ def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
34
37
  column_map = {
35
38
  'default_prefix_length': 'default_prefixlen',
36
39
  'is_shared': 'shared',
@@ -49,7 +52,9 @@ _formatters = {
49
52
  }
50
53
 
51
54
 
52
- def _get_attrs(client_manager, parsed_args):
55
+ def _get_attrs(
56
+ client_manager: Any, parsed_args: argparse.Namespace
57
+ ) -> dict[str, Any]:
53
58
  attrs = {}
54
59
  network_client = client_manager.network
55
60
 
@@ -100,7 +105,9 @@ def _get_attrs(client_manager, parsed_args):
100
105
  return attrs
101
106
 
102
107
 
103
- def _add_prefix_options(parser, for_create=False):
108
+ def _add_prefix_options(
109
+ parser: argparse.ArgumentParser, for_create: bool = False
110
+ ) -> None:
104
111
  parser.add_argument(
105
112
  '--pool-prefix',
106
113
  metavar='<pool-prefix>',
@@ -135,7 +142,7 @@ def _add_prefix_options(parser, for_create=False):
135
142
  )
136
143
 
137
144
 
138
- def _add_default_options(parser):
145
+ def _add_default_options(parser: argparse.ArgumentParser) -> None:
139
146
  default_group = parser.add_mutually_exclusive_group()
140
147
  default_group.add_argument(
141
148
  '--default',
@@ -154,7 +161,7 @@ def _add_default_options(parser):
154
161
  class CreateSubnetPool(command.ShowOne, common.NeutronCommandWithExtraArgs):
155
162
  _description = _("Create subnet pool")
156
163
 
157
- def get_parser(self, prog_name):
164
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
158
165
  parser = super().get_parser(prog_name)
159
166
  parser.add_argument(
160
167
  'name', metavar='<name>', help=_("Name of the new subnet pool")
@@ -205,7 +212,9 @@ class CreateSubnetPool(command.ShowOne, common.NeutronCommandWithExtraArgs):
205
212
  _tag.add_tag_option_to_parser_for_create(parser, _('subnet pool'))
206
213
  return parser
207
214
 
208
- def take_action(self, parsed_args):
215
+ def take_action(
216
+ self, parsed_args: argparse.Namespace
217
+ ) -> tuple[Sequence[str], Iterable[Any]]:
209
218
  client = self.app.client_manager.network
210
219
  attrs = _get_attrs(self.app.client_manager, parsed_args)
211
220
  # NeutronServer expects prefixes to be a List
@@ -225,7 +234,7 @@ class CreateSubnetPool(command.ShowOne, common.NeutronCommandWithExtraArgs):
225
234
  class DeleteSubnetPool(command.Command):
226
235
  _description = _("Delete subnet pool(s)")
227
236
 
228
- def get_parser(self, prog_name):
237
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
229
238
  parser = super().get_parser(prog_name)
230
239
  parser.add_argument(
231
240
  'subnet_pool',
@@ -235,7 +244,7 @@ class DeleteSubnetPool(command.Command):
235
244
  )
236
245
  return parser
237
246
 
238
- def take_action(self, parsed_args):
247
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
239
248
  client = self.app.client_manager.network
240
249
  result = 0
241
250
 
@@ -266,7 +275,7 @@ class DeleteSubnetPool(command.Command):
266
275
  class ListSubnetPool(command.Lister):
267
276
  _description = _("List subnet pools")
268
277
 
269
- def get_parser(self, prog_name):
278
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
270
279
  parser = super().get_parser(prog_name)
271
280
  parser.add_argument(
272
281
  '--long',
@@ -327,10 +336,12 @@ class ListSubnetPool(command.Lister):
327
336
  _tag.add_tag_filtering_option_to_parser(parser, _('subnet pools'))
328
337
  return parser
329
338
 
330
- def take_action(self, parsed_args):
339
+ def take_action(
340
+ self, parsed_args: argparse.Namespace
341
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
331
342
  identity_client = self.app.client_manager.identity
332
343
  network_client = self.app.client_manager.network
333
- filters = {}
344
+ filters: dict[str, Any] = {}
334
345
  if parsed_args.share:
335
346
  filters['shared'] = True
336
347
  filters['is_shared'] = True
@@ -394,7 +405,7 @@ class ListSubnetPool(command.Lister):
394
405
  class SetSubnetPool(common.NeutronCommandWithExtraArgs):
395
406
  _description = _("Set subnet pool properties")
396
407
 
397
- def get_parser(self, prog_name):
408
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
398
409
  parser = super().get_parser(prog_name)
399
410
  parser.add_argument(
400
411
  'subnet_pool',
@@ -440,7 +451,7 @@ class SetSubnetPool(common.NeutronCommandWithExtraArgs):
440
451
 
441
452
  return parser
442
453
 
443
- def take_action(self, parsed_args):
454
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
444
455
  client = self.app.client_manager.network
445
456
  obj = client.find_subnet_pool(
446
457
  parsed_args.subnet_pool, ignore_missing=False
@@ -465,7 +476,7 @@ class SetSubnetPool(common.NeutronCommandWithExtraArgs):
465
476
  class ShowSubnetPool(command.ShowOne):
466
477
  _description = _("Display subnet pool details")
467
478
 
468
- def get_parser(self, prog_name):
479
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
469
480
  parser = super().get_parser(prog_name)
470
481
  parser.add_argument(
471
482
  'subnet_pool',
@@ -474,7 +485,9 @@ class ShowSubnetPool(command.ShowOne):
474
485
  )
475
486
  return parser
476
487
 
477
- def take_action(self, parsed_args):
488
+ def take_action(
489
+ self, parsed_args: argparse.Namespace
490
+ ) -> tuple[Sequence[str], Iterable[Any]]:
478
491
  client = self.app.client_manager.network
479
492
  obj = client.find_subnet_pool(
480
493
  parsed_args.subnet_pool, ignore_missing=False
@@ -487,7 +500,7 @@ class ShowSubnetPool(command.ShowOne):
487
500
  class UnsetSubnetPool(command.Command):
488
501
  _description = _("Unset subnet pool properties")
489
502
 
490
- def get_parser(self, prog_name):
503
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
491
504
  parser = super().get_parser(prog_name)
492
505
  parser.add_argument(
493
506
  'subnet_pool',
@@ -497,7 +510,7 @@ class UnsetSubnetPool(command.Command):
497
510
  _tag.add_tag_option_to_parser_for_unset(parser, _('subnet pool'))
498
511
  return parser
499
512
 
500
- def take_action(self, parsed_args):
513
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
501
514
  client = self.app.client_manager.network
502
515
  obj = client.find_subnet_pool(
503
516
  parsed_args.subnet_pool, ignore_missing=False
@@ -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 format_columns
18
21
  from osc_lib.cli import identity as identity_utils
@@ -45,7 +48,7 @@ _formatters = {
45
48
  }
46
49
 
47
50
 
48
- def _add_updatable_args(parser):
51
+ def _add_updatable_args(parser: argparse.ArgumentParser) -> None:
49
52
  parser.add_argument('--name', help=_('Name of the tap flow.'))
50
53
  parser.add_argument(
51
54
  '--description', help=_('Description of the tap flow.')
@@ -55,7 +58,7 @@ def _add_updatable_args(parser):
55
58
  class CreateTapFlow(command.ShowOne):
56
59
  _description = _("Create a new tap flow.")
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)
@@ -92,7 +95,9 @@ class CreateTapFlow(command.ShowOne):
92
95
  )
93
96
  return parser
94
97
 
95
- def take_action(self, parsed_args):
98
+ def take_action(
99
+ self, parsed_args: argparse.Namespace
100
+ ) -> tuple[Sequence[str], Iterable[Any]]:
96
101
  client = self.app.client_manager.network
97
102
  attrs = {}
98
103
  if parsed_args.name is not None:
@@ -128,13 +133,15 @@ class CreateTapFlow(command.ShowOne):
128
133
  class ListTapFlow(command.Lister):
129
134
  _description = _("List tap flows.")
130
135
 
131
- def get_parser(self, prog_name):
136
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
132
137
  parser = super().get_parser(prog_name)
133
138
  identity_utils.add_project_owner_option_to_parser(parser)
134
139
 
135
140
  return parser
136
141
 
137
- def take_action(self, parsed_args):
142
+ def take_action(
143
+ self, parsed_args: argparse.Namespace
144
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
138
145
  client = self.app.client_manager.network
139
146
  params = {}
140
147
  if parsed_args.project is not None:
@@ -161,7 +168,7 @@ class ListTapFlow(command.Lister):
161
168
  class ShowTapFlow(command.ShowOne):
162
169
  _description = _("Show tap flow details.")
163
170
 
164
- def get_parser(self, prog_name):
171
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
165
172
  parser = super().get_parser(prog_name)
166
173
  parser.add_argument(
167
174
  TAP_FLOW,
@@ -170,7 +177,9 @@ class ShowTapFlow(command.ShowOne):
170
177
  )
171
178
  return parser
172
179
 
173
- def take_action(self, parsed_args):
180
+ def take_action(
181
+ self, parsed_args: argparse.Namespace
182
+ ) -> tuple[Sequence[str], Iterable[Any]]:
174
183
  client = self.app.client_manager.network
175
184
  id = client.find_tap_flow(
176
185
  parsed_args.tap_flow, ignore_missing=False
@@ -184,7 +193,7 @@ class ShowTapFlow(command.ShowOne):
184
193
  class DeleteTapFlow(command.Command):
185
194
  _description = _("Delete a tap flow.")
186
195
 
187
- def get_parser(self, prog_name):
196
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
188
197
  parser = super().get_parser(prog_name)
189
198
  parser.add_argument(
190
199
  TAP_FLOW,
@@ -194,7 +203,7 @@ class DeleteTapFlow(command.Command):
194
203
  )
195
204
  return parser
196
205
 
197
- def take_action(self, parsed_args):
206
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
198
207
  client = self.app.client_manager.network
199
208
  fails = 0
200
209
  for id_or_name in parsed_args.tap_flow:
@@ -219,7 +228,7 @@ class DeleteTapFlow(command.Command):
219
228
  class UpdateTapFlow(command.ShowOne):
220
229
  _description = _("Update a tap flow.")
221
230
 
222
- def get_parser(self, prog_name):
231
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
223
232
  parser = super().get_parser(prog_name)
224
233
  parser.add_argument(
225
234
  TAP_FLOW,
@@ -229,7 +238,9 @@ class UpdateTapFlow(command.ShowOne):
229
238
  _add_updatable_args(parser)
230
239
  return parser
231
240
 
232
- def take_action(self, parsed_args):
241
+ def take_action(
242
+ self, parsed_args: argparse.Namespace
243
+ ) -> tuple[Sequence[str], Iterable[Any]]:
233
244
  client = self.app.client_manager.network
234
245
  original_t_f = client.find_tap_flow(
235
246
  parsed_args.tap_flow, ignore_missing=False
@@ -10,7 +10,10 @@
10
10
  # License for the specific language governing permissions and limitations
11
11
  # under the License.
12
12
 
13
+ import argparse
13
14
  import logging
15
+ from collections.abc import Iterable, Sequence
16
+ from typing import Any
14
17
 
15
18
  from osc_lib.cli import identity as identity_utils
16
19
  from osc_lib import exceptions
@@ -39,7 +42,7 @@ _attr_map = [
39
42
  ]
40
43
 
41
44
 
42
- def _get_columns(item):
45
+ def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
43
46
  column_map: dict[str, str] = {}
44
47
  hidden_columns = ['location', 'tenant_id']
45
48
  return osc_utils.get_osc_show_columns_for_sdk_resource(
@@ -50,7 +53,7 @@ def _get_columns(item):
50
53
  class CreateTapMirror(command.ShowOne):
51
54
  _description = _("Create a new tap mirror.")
52
55
 
53
- def get_parser(self, prog_name):
56
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
54
57
  parser = super().get_parser(prog_name)
55
58
  identity_utils.add_project_owner_option_to_parser(parser)
56
59
  tap_service._add_updatable_args(parser)
@@ -88,7 +91,9 @@ class CreateTapMirror(command.ShowOne):
88
91
  )
89
92
  return parser
90
93
 
91
- def take_action(self, parsed_args):
94
+ def take_action(
95
+ self, parsed_args: argparse.Namespace
96
+ ) -> tuple[Sequence[str], Iterable[Any]]:
92
97
  client = self.app.client_manager.network
93
98
  attrs = {}
94
99
  if parsed_args.name is not None:
@@ -121,13 +126,15 @@ class CreateTapMirror(command.ShowOne):
121
126
  class ListTapMirror(command.Lister):
122
127
  _description = _("List tap mirrors.")
123
128
 
124
- def get_parser(self, prog_name):
129
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
125
130
  parser = super().get_parser(prog_name)
126
131
  identity_utils.add_project_owner_option_to_parser(parser)
127
132
 
128
133
  return parser
129
134
 
130
- def take_action(self, parsed_args):
135
+ def take_action(
136
+ self, parsed_args: argparse.Namespace
137
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
131
138
  client = self.app.client_manager.network
132
139
  params = {}
133
140
  if parsed_args.project is not None:
@@ -149,7 +156,7 @@ class ListTapMirror(command.Lister):
149
156
  class ShowTapMirror(command.ShowOne):
150
157
  _description = _("Show tap mirror details.")
151
158
 
152
- def get_parser(self, prog_name):
159
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
153
160
  parser = super().get_parser(prog_name)
154
161
  parser.add_argument(
155
162
  TAP_MIRROR,
@@ -158,7 +165,9 @@ class ShowTapMirror(command.ShowOne):
158
165
  )
159
166
  return parser
160
167
 
161
- def take_action(self, parsed_args):
168
+ def take_action(
169
+ self, parsed_args: argparse.Namespace
170
+ ) -> tuple[Sequence[str], Iterable[Any]]:
162
171
  client = self.app.client_manager.network
163
172
  id = client.find_tap_mirror(
164
173
  parsed_args.tap_mirror, ignore_missing=False
@@ -172,7 +181,7 @@ class ShowTapMirror(command.ShowOne):
172
181
  class DeleteTapMirror(command.Command):
173
182
  _description = _("Delete a tap mirror.")
174
183
 
175
- def get_parser(self, prog_name):
184
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
176
185
  parser = super().get_parser(prog_name)
177
186
  parser.add_argument(
178
187
  TAP_MIRROR,
@@ -182,7 +191,7 @@ class DeleteTapMirror(command.Command):
182
191
  )
183
192
  return parser
184
193
 
185
- def take_action(self, parsed_args):
194
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
186
195
  client = self.app.client_manager.network
187
196
  fails = 0
188
197
  for id_or_name in parsed_args.tap_mirror:
@@ -211,7 +220,7 @@ class DeleteTapMirror(command.Command):
211
220
  class UpdateTapMirror(command.ShowOne):
212
221
  _description = _("Update a tap mirror.")
213
222
 
214
- def get_parser(self, prog_name):
223
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
215
224
  parser = super().get_parser(prog_name)
216
225
  parser.add_argument(
217
226
  TAP_MIRROR,
@@ -221,7 +230,9 @@ class UpdateTapMirror(command.ShowOne):
221
230
  tap_service._add_updatable_args(parser)
222
231
  return parser
223
232
 
224
- def take_action(self, parsed_args):
233
+ def take_action(
234
+ self, parsed_args: argparse.Namespace
235
+ ) -> tuple[Sequence[str], Iterable[Any]]:
225
236
  client = self.app.client_manager.network
226
237
  original_t_s = client.find_tap_mirror(
227
238
  parsed_args.tap_mirror, ignore_missing=False