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
@@ -16,7 +16,10 @@
16
16
 
17
17
  """Identity v2 EC2 Credentials action implementations"""
18
18
 
19
+ import argparse
20
+ from collections.abc import Iterable, Sequence
19
21
  import logging
22
+ from typing import Any
20
23
 
21
24
  from osc_lib import exceptions
22
25
  from osc_lib import utils
@@ -31,7 +34,7 @@ LOG = logging.getLogger(__name__)
31
34
  class CreateEC2Creds(command.ShowOne):
32
35
  _description = _("Create EC2 credentials")
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
  '--project',
@@ -51,7 +54,9 @@ class CreateEC2Creds(command.ShowOne):
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[Any]]:
55
60
  identity_client = self.app.client_manager.identity
56
61
 
57
62
  if parsed_args.project:
@@ -79,13 +84,14 @@ class CreateEC2Creds(command.ShowOne):
79
84
  if 'tenant_id' in info:
80
85
  info.update({'project_id': info.pop('tenant_id')})
81
86
 
82
- return zip(*sorted(info.items()))
87
+ col_headers, col_data = zip(*sorted(info.items()))
88
+ return col_headers, col_data
83
89
 
84
90
 
85
91
  class DeleteEC2Creds(command.Command):
86
92
  _description = _("Delete EC2 credentials")
87
93
 
88
- def get_parser(self, prog_name):
94
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
89
95
  parser = super().get_parser(prog_name)
90
96
  parser.add_argument(
91
97
  'access_keys',
@@ -100,7 +106,7 @@ class DeleteEC2Creds(command.Command):
100
106
  )
101
107
  return parser
102
108
 
103
- def take_action(self, parsed_args):
109
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
104
110
  identity_client = self.app.client_manager.identity
105
111
 
106
112
  if parsed_args.user:
@@ -138,7 +144,7 @@ class DeleteEC2Creds(command.Command):
138
144
  class ListEC2Creds(command.Lister):
139
145
  _description = _("List EC2 credentials")
140
146
 
141
- def get_parser(self, prog_name):
147
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
142
148
  parser = super().get_parser(prog_name)
143
149
  parser.add_argument(
144
150
  '--user',
@@ -147,7 +153,9 @@ class ListEC2Creds(command.Lister):
147
153
  )
148
154
  return parser
149
155
 
150
- def take_action(self, parsed_args):
156
+ def take_action(
157
+ self, parsed_args: argparse.Namespace
158
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
151
159
  identity_client = self.app.client_manager.identity
152
160
 
153
161
  if parsed_args.user:
@@ -179,7 +187,7 @@ class ListEC2Creds(command.Lister):
179
187
  class ShowEC2Creds(command.ShowOne):
180
188
  _description = _("Display EC2 credentials details")
181
189
 
182
- def get_parser(self, prog_name):
190
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
183
191
  parser = super().get_parser(prog_name)
184
192
  parser.add_argument(
185
193
  'access_key',
@@ -193,7 +201,9 @@ class ShowEC2Creds(command.ShowOne):
193
201
  )
194
202
  return parser
195
203
 
196
- def take_action(self, parsed_args):
204
+ def take_action(
205
+ self, parsed_args: argparse.Namespace
206
+ ) -> tuple[Sequence[str], Iterable[Any]]:
197
207
  identity_client = self.app.client_manager.identity
198
208
 
199
209
  if parsed_args.user:
@@ -213,4 +223,5 @@ class ShowEC2Creds(command.ShowOne):
213
223
  if 'tenant_id' in info:
214
224
  info.update({'project_id': info.pop('tenant_id')})
215
225
 
216
- return zip(*sorted(info.items()))
226
+ col_headers, col_data = zip(*sorted(info.items()))
227
+ return col_headers, col_data
@@ -15,7 +15,10 @@
15
15
 
16
16
  """Endpoint action implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable, Sequence
18
20
  import logging
21
+ from typing import Any
19
22
 
20
23
  from osc_lib import exceptions
21
24
  from osc_lib import utils
@@ -31,7 +34,7 @@ LOG = logging.getLogger(__name__)
31
34
  class CreateEndpoint(command.ShowOne):
32
35
  _description = _("Create new endpoint")
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',
@@ -61,7 +64,9 @@ class CreateEndpoint(command.ShowOne):
61
64
  )
62
65
  return parser
63
66
 
64
- def take_action(self, parsed_args):
67
+ def take_action(
68
+ self, parsed_args: argparse.Namespace
69
+ ) -> tuple[Sequence[str], Iterable[Any]]:
65
70
  identity_client = self.app.client_manager.identity
66
71
  service = common.find_service(identity_client, parsed_args.service)
67
72
  endpoint = identity_client.endpoints.create(
@@ -76,13 +81,14 @@ class CreateEndpoint(command.ShowOne):
76
81
  info.update(endpoint._info)
77
82
  info['service_name'] = service.name
78
83
  info['service_type'] = service.type
79
- return zip(*sorted(info.items()))
84
+ col_headers, col_data = zip(*sorted(info.items()))
85
+ return col_headers, col_data
80
86
 
81
87
 
82
88
  class DeleteEndpoint(command.Command):
83
89
  _description = _("Delete endpoint(s)")
84
90
 
85
- def get_parser(self, prog_name):
91
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
86
92
  parser = super().get_parser(prog_name)
87
93
  parser.add_argument(
88
94
  'endpoints',
@@ -92,7 +98,7 @@ class DeleteEndpoint(command.Command):
92
98
  )
93
99
  return parser
94
100
 
95
- def take_action(self, parsed_args):
101
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
96
102
  identity_client = self.app.client_manager.identity
97
103
 
98
104
  result = 0
@@ -121,7 +127,7 @@ class DeleteEndpoint(command.Command):
121
127
  class ListEndpoint(command.Lister):
122
128
  _description = _("List endpoints")
123
129
 
124
- def get_parser(self, prog_name):
130
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
125
131
  parser = super().get_parser(prog_name)
126
132
  parser.add_argument(
127
133
  '--long',
@@ -131,7 +137,9 @@ class ListEndpoint(command.Lister):
131
137
  )
132
138
  return parser
133
139
 
134
- def take_action(self, parsed_args):
140
+ def take_action(
141
+ self, parsed_args: argparse.Namespace
142
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
135
143
  identity_client = self.app.client_manager.identity
136
144
 
137
145
  columns: tuple[str, ...] = (
@@ -168,7 +176,7 @@ class ListEndpoint(command.Lister):
168
176
  class ShowEndpoint(command.ShowOne):
169
177
  _description = _("Display endpoint details")
170
178
 
171
- def get_parser(self, prog_name):
179
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
172
180
  parser = super().get_parser(prog_name)
173
181
  parser.add_argument(
174
182
  'endpoint_or_service',
@@ -180,7 +188,9 @@ class ShowEndpoint(command.ShowOne):
180
188
  )
181
189
  return parser
182
190
 
183
- def take_action(self, parsed_args):
191
+ def take_action(
192
+ self, parsed_args: argparse.Namespace
193
+ ) -> tuple[Sequence[str], Iterable[Any]]:
184
194
  identity_client = self.app.client_manager.identity
185
195
  data = identity_client.endpoints.list()
186
196
  match = None
@@ -196,9 +206,11 @@ class ShowEndpoint(command.ShowOne):
196
206
  if ep.service_id == service.id:
197
207
  match = ep
198
208
  if match is None:
199
- return None
209
+ return ((), ())
210
+
200
211
  info = {}
201
212
  info.update(match._info)
202
213
  info['service_name'] = service.name
203
214
  info['service_type'] = service.type
204
- return zip(*sorted(info.items()))
215
+ col_headers, col_data = zip(*sorted(info.items()))
216
+ return col_headers, col_data
@@ -15,7 +15,10 @@
15
15
 
16
16
  """Identity v2 Project action implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable, Sequence
18
20
  import logging
21
+ from typing import Any
19
22
 
20
23
  from keystoneauth1 import exceptions as ks_exc
21
24
  from osc_lib.cli import format_columns
@@ -33,7 +36,7 @@ LOG = logging.getLogger(__name__)
33
36
  class CreateProject(command.ShowOne):
34
37
  _description = _("Create new project")
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
  'name',
@@ -73,7 +76,9 @@ class CreateProject(command.ShowOne):
73
76
  )
74
77
  return parser
75
78
 
76
- def take_action(self, parsed_args):
79
+ def take_action(
80
+ self, parsed_args: argparse.Namespace
81
+ ) -> tuple[Sequence[str], Iterable[Any]]:
77
82
  identity_client = self.app.client_manager.identity
78
83
 
79
84
  enabled = True
@@ -102,7 +107,8 @@ class CreateProject(command.ShowOne):
102
107
 
103
108
  # TODO(stevemar): Remove the line below when we support multitenancy
104
109
  project._info.pop('parent_id', None)
105
- return zip(*sorted(project._info.items()))
110
+ col_headers, col_data = zip(*sorted(project._info.items()))
111
+ return col_headers, col_data
106
112
 
107
113
 
108
114
  class DeleteProject(command.Command):
@@ -115,7 +121,7 @@ class DeleteProject(command.Command):
115
121
  "regardless."
116
122
  )
117
123
 
118
- def get_parser(self, prog_name):
124
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
119
125
  parser = super().get_parser(prog_name)
120
126
  parser.add_argument(
121
127
  'projects',
@@ -125,7 +131,7 @@ class DeleteProject(command.Command):
125
131
  )
126
132
  return parser
127
133
 
128
- def take_action(self, parsed_args):
134
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
129
135
  identity_client = self.app.client_manager.identity
130
136
 
131
137
  errors = 0
@@ -158,7 +164,7 @@ class DeleteProject(command.Command):
158
164
  class ListProject(command.Lister):
159
165
  _description = _("List projects")
160
166
 
161
- def get_parser(self, prog_name):
167
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
162
168
  parser = super().get_parser(prog_name)
163
169
  parser.add_argument(
164
170
  '--long',
@@ -177,7 +183,9 @@ class ListProject(command.Lister):
177
183
  )
178
184
  return parser
179
185
 
180
- def take_action(self, parsed_args):
186
+ def take_action(
187
+ self, parsed_args: argparse.Namespace
188
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
181
189
  columns: tuple[str, ...] = ('ID', 'Name')
182
190
  if parsed_args.long:
183
191
  columns += ('Description', 'Enabled')
@@ -200,7 +208,7 @@ class ListProject(command.Lister):
200
208
  class SetProject(command.Command):
201
209
  _description = _("Set project properties")
202
210
 
203
- def get_parser(self, prog_name):
211
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
204
212
  parser = super().get_parser(prog_name)
205
213
  parser.add_argument(
206
214
  'project',
@@ -240,7 +248,7 @@ class SetProject(command.Command):
240
248
  )
241
249
  return parser
242
250
 
243
- def take_action(self, parsed_args):
251
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
244
252
  identity_client = self.app.client_manager.identity
245
253
 
246
254
  project = utils.find_resource(
@@ -272,7 +280,7 @@ class SetProject(command.Command):
272
280
  class ShowProject(command.ShowOne):
273
281
  _description = _("Display project details")
274
282
 
275
- def get_parser(self, prog_name):
283
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
276
284
  parser = super().get_parser(prog_name)
277
285
  parser.add_argument(
278
286
  'project',
@@ -281,7 +289,9 @@ class ShowProject(command.ShowOne):
281
289
  )
282
290
  return parser
283
291
 
284
- def take_action(self, parsed_args):
292
+ def take_action(
293
+ self, parsed_args: argparse.Namespace
294
+ ) -> tuple[Sequence[str], Iterable[Any]]:
285
295
  identity_client = self.app.client_manager.identity
286
296
 
287
297
  info = {}
@@ -324,13 +334,14 @@ class ShowProject(command.ShowOne):
324
334
  properties[k] = v
325
335
 
326
336
  info['properties'] = format_columns.DictColumn(properties)
327
- return zip(*sorted(info.items()))
337
+ col_headers, col_data = zip(*sorted(info.items()))
338
+ return col_headers, col_data
328
339
 
329
340
 
330
341
  class UnsetProject(command.Command):
331
342
  _description = _("Unset project properties")
332
343
 
333
- def get_parser(self, prog_name):
344
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
334
345
  parser = super().get_parser(prog_name)
335
346
  parser.add_argument(
336
347
  'project',
@@ -350,7 +361,7 @@ class UnsetProject(command.Command):
350
361
  )
351
362
  return parser
352
363
 
353
- def take_action(self, parsed_args):
364
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
354
365
  identity_client = self.app.client_manager.identity
355
366
  project = utils.find_resource(
356
367
  identity_client.tenants,
@@ -15,7 +15,10 @@
15
15
 
16
16
  """Identity v2 Role action implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable, Sequence
18
20
  import logging
21
+ from typing import Any
19
22
 
20
23
  from keystoneauth1 import exceptions as ks_exc
21
24
  from osc_lib import exceptions
@@ -31,7 +34,7 @@ LOG = logging.getLogger(__name__)
31
34
  class AddRole(command.ShowOne):
32
35
  _description = _("Add role to project:user")
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
  'role',
@@ -52,7 +55,9 @@ class AddRole(command.ShowOne):
52
55
  )
53
56
  return parser
54
57
 
55
- def take_action(self, parsed_args):
58
+ def take_action(
59
+ self, parsed_args: argparse.Namespace
60
+ ) -> tuple[Sequence[str], Iterable[Any]]:
56
61
  identity_client = self.app.client_manager.identity
57
62
  role = utils.find_resource(identity_client.roles, parsed_args.role)
58
63
  project = utils.find_resource(
@@ -68,13 +73,14 @@ class AddRole(command.ShowOne):
68
73
 
69
74
  info = {}
70
75
  info.update(role._info)
71
- return zip(*sorted(info.items()))
76
+ col_headers, col_data = zip(*sorted(info.items()))
77
+ return col_headers, col_data
72
78
 
73
79
 
74
80
  class CreateRole(command.ShowOne):
75
81
  _description = _("Create new role")
76
82
 
77
- def get_parser(self, prog_name):
83
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
78
84
  parser = super().get_parser(prog_name)
79
85
  parser.add_argument(
80
86
  'role_name',
@@ -88,7 +94,9 @@ class CreateRole(command.ShowOne):
88
94
  )
89
95
  return parser
90
96
 
91
- def take_action(self, parsed_args):
97
+ def take_action(
98
+ self, parsed_args: argparse.Namespace
99
+ ) -> tuple[Sequence[str], Iterable[Any]]:
92
100
  identity_client = self.app.client_manager.identity
93
101
  try:
94
102
  role = identity_client.roles.create(parsed_args.role_name)
@@ -104,13 +112,14 @@ class CreateRole(command.ShowOne):
104
112
 
105
113
  info = {}
106
114
  info.update(role._info)
107
- return zip(*sorted(info.items()))
115
+ col_headers, col_data = zip(*sorted(info.items()))
116
+ return col_headers, col_data
108
117
 
109
118
 
110
119
  class DeleteRole(command.Command):
111
120
  _description = _("Delete role(s)")
112
121
 
113
- def get_parser(self, prog_name):
122
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
114
123
  parser = super().get_parser(prog_name)
115
124
  parser.add_argument(
116
125
  'roles',
@@ -120,7 +129,7 @@ class DeleteRole(command.Command):
120
129
  )
121
130
  return parser
122
131
 
123
- def take_action(self, parsed_args):
132
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
124
133
  identity_client = self.app.client_manager.identity
125
134
 
126
135
  errors = 0
@@ -153,7 +162,9 @@ class DeleteRole(command.Command):
153
162
  class ListRole(command.Lister):
154
163
  _description = _("List roles")
155
164
 
156
- def take_action(self, parsed_args):
165
+ def take_action(
166
+ self, parsed_args: argparse.Namespace
167
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
157
168
  identity_client = self.app.client_manager.identity
158
169
 
159
170
  columns = ('ID', 'Name')
@@ -175,7 +186,7 @@ class ListRole(command.Lister):
175
186
  class RemoveRole(command.Command):
176
187
  _description = _("Remove role from project : user")
177
188
 
178
- def get_parser(self, prog_name):
189
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
179
190
  parser = super().get_parser(prog_name)
180
191
  parser.add_argument(
181
192
  'role',
@@ -196,7 +207,7 @@ class RemoveRole(command.Command):
196
207
  )
197
208
  return parser
198
209
 
199
- def take_action(self, parsed_args):
210
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
200
211
  identity_client = self.app.client_manager.identity
201
212
  role = utils.find_resource(identity_client.roles, parsed_args.role)
202
213
  project = utils.find_resource(
@@ -210,7 +221,7 @@ class RemoveRole(command.Command):
210
221
  class ShowRole(command.ShowOne):
211
222
  _description = _("Display role details")
212
223
 
213
- def get_parser(self, prog_name):
224
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
214
225
  parser = super().get_parser(prog_name)
215
226
  parser.add_argument(
216
227
  'role',
@@ -219,10 +230,13 @@ class ShowRole(command.ShowOne):
219
230
  )
220
231
  return parser
221
232
 
222
- def take_action(self, parsed_args):
233
+ def take_action(
234
+ self, parsed_args: argparse.Namespace
235
+ ) -> tuple[Sequence[str], Iterable[Any]]:
223
236
  identity_client = self.app.client_manager.identity
224
237
  role = utils.find_resource(identity_client.roles, parsed_args.role)
225
238
 
226
239
  info = {}
227
240
  info.update(role._info)
228
- return zip(*sorted(info.items()))
241
+ col_headers, col_data = zip(*sorted(info.items()))
242
+ return col_headers, col_data
@@ -13,17 +13,21 @@
13
13
 
14
14
  """Identity v2 Assignment action implementations"""
15
15
 
16
+ import argparse
17
+ from collections.abc import Iterable
18
+ from typing import Any
19
+
16
20
  from osc_lib import exceptions
17
21
  from osc_lib import utils
18
22
 
19
23
  from openstackclient import command
20
- from openstackclient.i18n import _ # noqa
24
+ from openstackclient.i18n import _
21
25
 
22
26
 
23
27
  class ListRoleAssignment(command.Lister):
24
28
  _description = _("List role assignments")
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
  '--user',
@@ -55,7 +59,9 @@ class ListRoleAssignment(command.Lister):
55
59
  )
56
60
  return parser
57
61
 
58
- def take_action(self, parsed_args):
62
+ def take_action(
63
+ self, parsed_args: argparse.Namespace
64
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
59
65
  identity_client = self.app.client_manager.identity
60
66
  auth_ref = self.app.client_manager.auth_ref
61
67
 
@@ -15,7 +15,10 @@
15
15
 
16
16
  """Service action implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable, Sequence
18
20
  import logging
21
+ from typing import Any
19
22
 
20
23
  from osc_lib import exceptions
21
24
  from osc_lib import utils
@@ -31,7 +34,7 @@ LOG = logging.getLogger(__name__)
31
34
  class CreateService(command.ShowOne):
32
35
  _description = _("Create new service")
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
  'type',
@@ -50,7 +53,9 @@ class CreateService(command.ShowOne):
50
53
  )
51
54
  return parser
52
55
 
53
- def take_action(self, parsed_args):
56
+ def take_action(
57
+ self, parsed_args: argparse.Namespace
58
+ ) -> tuple[Sequence[str], Iterable[Any]]:
54
59
  identity_client = self.app.client_manager.identity
55
60
 
56
61
  name = parsed_args.name
@@ -64,13 +69,14 @@ class CreateService(command.ShowOne):
64
69
 
65
70
  info = {}
66
71
  info.update(service._info)
67
- return zip(*sorted(info.items()))
72
+ col_headers, col_data = zip(*sorted(info.items()))
73
+ return col_headers, col_data
68
74
 
69
75
 
70
76
  class DeleteService(command.Command):
71
77
  _description = _("Delete service(s)")
72
78
 
73
- def get_parser(self, prog_name):
79
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
74
80
  parser = super().get_parser(prog_name)
75
81
  parser.add_argument(
76
82
  'services',
@@ -80,7 +86,7 @@ class DeleteService(command.Command):
80
86
  )
81
87
  return parser
82
88
 
83
- def take_action(self, parsed_args):
89
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
84
90
  identity_client = self.app.client_manager.identity
85
91
 
86
92
  result = 0
@@ -110,7 +116,7 @@ class DeleteService(command.Command):
110
116
  class ListService(command.Lister):
111
117
  _description = _("List services")
112
118
 
113
- def get_parser(self, prog_name):
119
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
114
120
  parser = super().get_parser(prog_name)
115
121
  parser.add_argument(
116
122
  '--long',
@@ -120,7 +126,9 @@ class ListService(command.Lister):
120
126
  )
121
127
  return parser
122
128
 
123
- def take_action(self, parsed_args):
129
+ def take_action(
130
+ self, parsed_args: argparse.Namespace
131
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
124
132
  columns: tuple[str, ...] = ('ID', 'Name', 'Type')
125
133
  if parsed_args.long:
126
134
  columns += ('Description',)
@@ -134,7 +142,7 @@ class ListService(command.Lister):
134
142
  class ShowService(command.ShowOne):
135
143
  _description = _("Display service details")
136
144
 
137
- def get_parser(self, prog_name):
145
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
138
146
  parser = super().get_parser(prog_name)
139
147
  parser.add_argument(
140
148
  'service',
@@ -149,7 +157,9 @@ class ShowService(command.ShowOne):
149
157
  )
150
158
  return parser
151
159
 
152
- def take_action(self, parsed_args):
160
+ def take_action(
161
+ self, parsed_args: argparse.Namespace
162
+ ) -> tuple[Sequence[str], Iterable[Any]]:
153
163
  identity_client = self.app.client_manager.identity
154
164
  auth_ref = self.app.client_manager.auth_ref
155
165
 
@@ -163,7 +173,8 @@ class ShowService(command.ShowOne):
163
173
  # FIXME(stephenfin): The return type for this in ksa is
164
174
  # wrong
165
175
  info.update(service_endpoints[0]) # type: ignore
166
- return zip(*sorted(info.items()))
176
+ col_headers, col_data = zip(*sorted(info.items()))
177
+ return col_headers, col_data
167
178
 
168
179
  msg = _(
169
180
  "No service catalog with a type, name or ID of '%s' exists."
@@ -173,4 +184,5 @@ class ShowService(command.ShowOne):
173
184
  service = common.find_service(identity_client, parsed_args.service)
174
185
  info = {}
175
186
  info.update(service._info)
176
- return zip(*sorted(info.items()))
187
+ col_headers, col_data = zip(*sorted(info.items()))
188
+ return col_headers, col_data
@@ -15,6 +15,10 @@
15
15
 
16
16
  """Identity v2 Token action implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable, Sequence
20
+ from typing import Any
21
+
18
22
  from osc_lib import exceptions
19
23
 
20
24
  from openstackclient import command
@@ -27,11 +31,13 @@ class IssueToken(command.ShowOne):
27
31
  # scoped token is optional
28
32
  required_scope = False
29
33
 
30
- def get_parser(self, prog_name):
34
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
31
35
  parser = super().get_parser(prog_name)
32
36
  return parser
33
37
 
34
- def take_action(self, parsed_args):
38
+ def take_action(
39
+ self, parsed_args: argparse.Namespace
40
+ ) -> tuple[Sequence[str], Iterable[Any]]:
35
41
  auth_ref = self.app.client_manager.auth_ref
36
42
  if not auth_ref:
37
43
  raise exceptions.AuthorizationFailure(
@@ -49,13 +55,14 @@ class IssueToken(command.ShowOne):
49
55
  data['project_id'] = auth_ref.project_id
50
56
  if auth_ref.user_id:
51
57
  data['user_id'] = auth_ref.user_id
52
- return zip(*sorted(data.items()))
58
+ col_headers, col_data = zip(*sorted(data.items()))
59
+ return col_headers, col_data
53
60
 
54
61
 
55
62
  class RevokeToken(command.Command):
56
63
  _description = _("Revoke existing token")
57
64
 
58
- def get_parser(self, prog_name):
65
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
59
66
  parser = super().get_parser(prog_name)
60
67
  parser.add_argument(
61
68
  'token',
@@ -64,7 +71,7 @@ class RevokeToken(command.Command):
64
71
  )
65
72
  return parser
66
73
 
67
- def take_action(self, parsed_args):
74
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
68
75
  identity_client = self.app.client_manager.identity
69
76
 
70
77
  identity_client.tokens.delete(parsed_args.token)