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,8 +13,11 @@
13
13
 
14
14
  """Identity v3 Endpoint Group action implementations"""
15
15
 
16
+ import argparse
17
+ from collections.abc import Iterable, Sequence
16
18
  import json
17
19
  import logging
20
+ from typing import Any
18
21
 
19
22
  from osc_lib import exceptions
20
23
  from osc_lib import utils
@@ -30,7 +33,7 @@ LOG = logging.getLogger(__name__)
30
33
  class _FiltersReader:
31
34
  _description = _("Helper class capable of reading filters from files")
32
35
 
33
- def _read_filters(self, path):
36
+ def _read_filters(self, path: str) -> Any:
34
37
  """Read and parse rules from path
35
38
 
36
39
  Expect the file to contain a valid JSON structure.
@@ -62,7 +65,7 @@ class _FiltersReader:
62
65
  class AddProjectToEndpointGroup(command.Command):
63
66
  _description = _("Add a project to an endpoint group")
64
67
 
65
- def get_parser(self, prog_name):
68
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
66
69
  parser = super().get_parser(prog_name)
67
70
  parser.add_argument(
68
71
  'endpointgroup',
@@ -77,7 +80,7 @@ class AddProjectToEndpointGroup(command.Command):
77
80
  common.add_project_domain_option_to_parser(parser)
78
81
  return parser
79
82
 
80
- def take_action(self, parsed_args):
83
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
81
84
  client = self.app.client_manager.identity
82
85
 
83
86
  endpointgroup = utils.find_resource(
@@ -96,7 +99,7 @@ class AddProjectToEndpointGroup(command.Command):
96
99
  class CreateEndpointGroup(command.ShowOne, _FiltersReader):
97
100
  _description = _("Create new endpoint group")
98
101
 
99
- def get_parser(self, prog_name):
102
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
100
103
  parser = super().get_parser(prog_name)
101
104
  parser.add_argument(
102
105
  'name',
@@ -114,7 +117,9 @@ class CreateEndpointGroup(command.ShowOne, _FiltersReader):
114
117
  )
115
118
  return parser
116
119
 
117
- def take_action(self, parsed_args):
120
+ def take_action(
121
+ self, parsed_args: argparse.Namespace
122
+ ) -> tuple[Sequence[str], Iterable[Any]]:
118
123
  identity_client = self.app.client_manager.identity
119
124
 
120
125
  filters = None
@@ -130,13 +135,14 @@ class CreateEndpointGroup(command.ShowOne, _FiltersReader):
130
135
  info = {}
131
136
  endpoint_group._info.pop('links')
132
137
  info.update(endpoint_group._info)
133
- return zip(*sorted(info.items()))
138
+ col_headers, col_data = zip(*sorted(info.items()))
139
+ return col_headers, col_data
134
140
 
135
141
 
136
142
  class DeleteEndpointGroup(command.Command):
137
143
  _description = _("Delete endpoint group(s)")
138
144
 
139
- def get_parser(self, prog_name):
145
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
140
146
  parser = super().get_parser(prog_name)
141
147
  parser.add_argument(
142
148
  'endpointgroup',
@@ -146,7 +152,7 @@ class DeleteEndpointGroup(command.Command):
146
152
  )
147
153
  return parser
148
154
 
149
- def take_action(self, parsed_args):
155
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
150
156
  identity_client = self.app.client_manager.identity
151
157
  result = 0
152
158
  for i in parsed_args.endpointgroup:
@@ -176,7 +182,7 @@ class DeleteEndpointGroup(command.Command):
176
182
  class ListEndpointGroup(command.Lister):
177
183
  _description = _("List endpoint groups")
178
184
 
179
- def get_parser(self, prog_name):
185
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
180
186
  parser = super().get_parser(prog_name)
181
187
  list_group = parser.add_mutually_exclusive_group()
182
188
  list_group.add_argument(
@@ -196,7 +202,9 @@ class ListEndpointGroup(command.Lister):
196
202
  )
197
203
  return parser
198
204
 
199
- def take_action(self, parsed_args):
205
+ def take_action(
206
+ self, parsed_args: argparse.Namespace
207
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
200
208
  client = self.app.client_manager.identity
201
209
 
202
210
  endpointgroup = None
@@ -241,7 +249,7 @@ class ListEndpointGroup(command.Lister):
241
249
  class RemoveProjectFromEndpointGroup(command.Command):
242
250
  _description = _("Remove project from endpoint group")
243
251
 
244
- def get_parser(self, prog_name):
252
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
245
253
  parser = super().get_parser(prog_name)
246
254
  parser.add_argument(
247
255
  'endpointgroup',
@@ -256,7 +264,7 @@ class RemoveProjectFromEndpointGroup(command.Command):
256
264
  common.add_project_domain_option_to_parser(parser)
257
265
  return parser
258
266
 
259
- def take_action(self, parsed_args):
267
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
260
268
  client = self.app.client_manager.identity
261
269
 
262
270
  endpointgroup = utils.find_resource(
@@ -275,7 +283,7 @@ class RemoveProjectFromEndpointGroup(command.Command):
275
283
  class SetEndpointGroup(command.Command, _FiltersReader):
276
284
  _description = _("Set endpoint group properties")
277
285
 
278
- def get_parser(self, prog_name):
286
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
279
287
  parser = super().get_parser(prog_name)
280
288
  parser.add_argument(
281
289
  'endpointgroup',
@@ -300,7 +308,7 @@ class SetEndpointGroup(command.Command, _FiltersReader):
300
308
  )
301
309
  return parser
302
310
 
303
- def take_action(self, parsed_args):
311
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
304
312
  identity_client = self.app.client_manager.identity
305
313
  endpointgroup = utils.find_resource(
306
314
  identity_client.endpoint_groups, parsed_args.endpointgroup
@@ -321,7 +329,7 @@ class SetEndpointGroup(command.Command, _FiltersReader):
321
329
  class ShowEndpointGroup(command.ShowOne):
322
330
  _description = _("Display endpoint group details")
323
331
 
324
- def get_parser(self, prog_name):
332
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
325
333
  parser = super().get_parser(prog_name)
326
334
  parser.add_argument(
327
335
  'endpointgroup',
@@ -330,7 +338,9 @@ class ShowEndpointGroup(command.ShowOne):
330
338
  )
331
339
  return parser
332
340
 
333
- def take_action(self, parsed_args):
341
+ def take_action(
342
+ self, parsed_args: argparse.Namespace
343
+ ) -> tuple[Sequence[str], Iterable[Any]]:
334
344
  identity_client = self.app.client_manager.identity
335
345
  endpoint_group = utils.find_resource(
336
346
  identity_client.endpoint_groups, parsed_args.endpointgroup
@@ -339,4 +349,5 @@ class ShowEndpointGroup(command.ShowOne):
339
349
  info = {}
340
350
  endpoint_group._info.pop('links')
341
351
  info.update(endpoint_group._info)
342
- return zip(*sorted(info.items()))
352
+ col_headers, col_data = zip(*sorted(info.items()))
353
+ return col_headers, col_data
@@ -14,8 +14,12 @@
14
14
 
15
15
  """Identity v3 Protocols actions implementations"""
16
16
 
17
+ import argparse
18
+ from collections.abc import Iterable, Sequence
17
19
  import logging
20
+ from typing import Any
18
21
 
22
+ from openstack import utils as sdk_utils
19
23
  from osc_lib import exceptions
20
24
  from osc_lib import utils
21
25
 
@@ -26,7 +30,7 @@ from openstackclient.i18n import _
26
30
  LOG = logging.getLogger(__name__)
27
31
 
28
32
 
29
- def _format_protocol(protocol):
33
+ def _format_protocol(protocol: Any) -> tuple[tuple[str, ...], Any]:
30
34
  columns = ('name', 'idp_id', 'mapping_id')
31
35
  column_headers = ('id', 'identity_provider', 'mapping')
32
36
  return (
@@ -38,7 +42,7 @@ def _format_protocol(protocol):
38
42
  class CreateProtocol(command.ShowOne):
39
43
  _description = _("Create new federation protocol")
40
44
 
41
- def get_parser(self, prog_name):
45
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
42
46
  parser = super().get_parser(prog_name)
43
47
  parser.add_argument(
44
48
  'federation_protocol',
@@ -66,8 +70,12 @@ class CreateProtocol(command.ShowOne):
66
70
 
67
71
  return parser
68
72
 
69
- def take_action(self, parsed_args):
70
- identity_client = self.app.client_manager.sdk_connection.identity
73
+ def take_action(
74
+ self, parsed_args: argparse.Namespace
75
+ ) -> tuple[Sequence[str], Iterable[Any]]:
76
+ identity_client = sdk_utils.ensure_service_version(
77
+ self.app.client_manager.sdk_connection.identity, '3'
78
+ )
71
79
 
72
80
  protocol = identity_client.create_federation_protocol(
73
81
  name=parsed_args.federation_protocol,
@@ -81,7 +89,7 @@ class CreateProtocol(command.ShowOne):
81
89
  class DeleteProtocol(command.Command):
82
90
  _description = _("Delete federation protocol(s)")
83
91
 
84
- def get_parser(self, prog_name):
92
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
85
93
  parser = super().get_parser(prog_name)
86
94
  parser.add_argument(
87
95
  'federation_protocol',
@@ -101,8 +109,10 @@ class DeleteProtocol(command.Command):
101
109
 
102
110
  return parser
103
111
 
104
- def take_action(self, parsed_args):
105
- identity_client = self.app.client_manager.sdk_connection.identity
112
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
113
+ identity_client = sdk_utils.ensure_service_version(
114
+ self.app.client_manager.sdk_connection.identity, '3'
115
+ )
106
116
 
107
117
  result = 0
108
118
  for i in parsed_args.federation_protocol:
@@ -134,7 +144,7 @@ class DeleteProtocol(command.Command):
134
144
  class ListProtocols(command.Lister):
135
145
  _description = _("List federation protocols")
136
146
 
137
- def get_parser(self, prog_name):
147
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
138
148
  parser = super().get_parser(prog_name)
139
149
  parser.add_argument(
140
150
  '--identity-provider',
@@ -145,8 +155,12 @@ class ListProtocols(command.Lister):
145
155
 
146
156
  return parser
147
157
 
148
- def take_action(self, parsed_args):
149
- identity_client = self.app.client_manager.sdk_connection.identity
158
+ def take_action(
159
+ self, parsed_args: argparse.Namespace
160
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
161
+ identity_client = sdk_utils.ensure_service_version(
162
+ self.app.client_manager.sdk_connection.identity, '3'
163
+ )
150
164
 
151
165
  protocols = identity_client.federation_protocols(
152
166
  parsed_args.identity_provider
@@ -163,7 +177,7 @@ class ListProtocols(command.Lister):
163
177
  class SetProtocol(command.Command):
164
178
  _description = _("Set federation protocol properties")
165
179
 
166
- def get_parser(self, prog_name):
180
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
167
181
  parser = super().get_parser(prog_name)
168
182
  parser.add_argument(
169
183
  'federation_protocol',
@@ -186,8 +200,12 @@ class SetProtocol(command.Command):
186
200
  )
187
201
  return parser
188
202
 
189
- def take_action(self, parsed_args):
190
- identity_client = self.app.client_manager.sdk_connection.identity
203
+ def take_action(
204
+ self, parsed_args: argparse.Namespace
205
+ ) -> tuple[Sequence[str], Iterable[Any]]:
206
+ identity_client = sdk_utils.ensure_service_version(
207
+ self.app.client_manager.sdk_connection.identity, '3'
208
+ )
191
209
 
192
210
  kwargs = {'idp_id': parsed_args.identity_provider}
193
211
  if parsed_args.federation_protocol:
@@ -202,7 +220,7 @@ class SetProtocol(command.Command):
202
220
  class ShowProtocol(command.ShowOne):
203
221
  _description = _("Display federation protocol details")
204
222
 
205
- def get_parser(self, prog_name):
223
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
206
224
  parser = super().get_parser(prog_name)
207
225
  parser.add_argument(
208
226
  'federation_protocol',
@@ -220,8 +238,12 @@ class ShowProtocol(command.ShowOne):
220
238
  )
221
239
  return parser
222
240
 
223
- def take_action(self, parsed_args):
224
- identity_client = self.app.client_manager.sdk_connection.identity
241
+ def take_action(
242
+ self, parsed_args: argparse.Namespace
243
+ ) -> tuple[Sequence[str], Iterable[Any]]:
244
+ identity_client = sdk_utils.ensure_service_version(
245
+ self.app.client_manager.sdk_connection.identity, '3'
246
+ )
225
247
 
226
248
  protocol = identity_client.get_federation_protocol(
227
249
  idp_id=parsed_args.identity_provider,
@@ -15,9 +15,13 @@
15
15
 
16
16
  """Group 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 openstack import exceptions as sdk_exc
24
+ from openstack import utils as sdk_utils
21
25
  from osc_lib import exceptions
22
26
  from osc_lib import utils
23
27
 
@@ -29,7 +33,7 @@ from openstackclient.identity import common
29
33
  LOG = logging.getLogger(__name__)
30
34
 
31
35
 
32
- def _format_group(group):
36
+ def _format_group(group: Any) -> tuple[tuple[str, ...], Any]:
33
37
  columns = (
34
38
  'description',
35
39
  'domain_id',
@@ -51,7 +55,7 @@ def _format_group(group):
51
55
  class AddUserToGroup(command.Command):
52
56
  _description = _("Add user to group")
53
57
 
54
- def get_parser(self, prog_name):
58
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
55
59
  parser = super().get_parser(prog_name)
56
60
  parser.add_argument(
57
61
  'group',
@@ -71,8 +75,10 @@ class AddUserToGroup(command.Command):
71
75
  common.add_user_domain_option_to_parser(parser)
72
76
  return parser
73
77
 
74
- def take_action(self, parsed_args):
75
- identity_client = self.app.client_manager.sdk_connection.identity
78
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
79
+ identity_client = sdk_utils.ensure_service_version(
80
+ self.app.client_manager.sdk_connection.identity, '3'
81
+ )
76
82
 
77
83
  group_id = common.find_group_id_sdk(
78
84
  identity_client, parsed_args.group, parsed_args.group_domain
@@ -111,7 +117,7 @@ class AddUserToGroup(command.Command):
111
117
  class CheckUserInGroup(command.Command):
112
118
  _description = _("Check user membership in group")
113
119
 
114
- def get_parser(self, prog_name):
120
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
115
121
  parser = super().get_parser(prog_name)
116
122
  parser.add_argument(
117
123
  'group',
@@ -127,8 +133,10 @@ class CheckUserInGroup(command.Command):
127
133
  common.add_user_domain_option_to_parser(parser)
128
134
  return parser
129
135
 
130
- def take_action(self, parsed_args):
131
- identity_client = self.app.client_manager.sdk_connection.identity
136
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
137
+ identity_client = sdk_utils.ensure_service_version(
138
+ self.app.client_manager.sdk_connection.identity, '3'
139
+ )
132
140
 
133
141
  user_id = common.find_user_id_sdk(
134
142
  identity_client,
@@ -168,7 +176,7 @@ class CheckUserInGroup(command.Command):
168
176
  class CreateGroup(command.ShowOne):
169
177
  _description = _("Create new group")
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
  'name',
@@ -192,8 +200,12 @@ class CreateGroup(command.ShowOne):
192
200
  )
193
201
  return parser
194
202
 
195
- def take_action(self, parsed_args):
196
- identity_client = self.app.client_manager.sdk_connection.identity
203
+ def take_action(
204
+ self, parsed_args: argparse.Namespace
205
+ ) -> tuple[Sequence[str], Iterable[Any]]:
206
+ identity_client = sdk_utils.ensure_service_version(
207
+ self.app.client_manager.sdk_connection.identity, '3'
208
+ )
197
209
 
198
210
  kwargs = {}
199
211
  if parsed_args.name:
@@ -230,7 +242,7 @@ class CreateGroup(command.ShowOne):
230
242
  class DeleteGroup(command.Command):
231
243
  _description = _("Delete group(s)")
232
244
 
233
- def get_parser(self, prog_name):
245
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
234
246
  parser = super().get_parser(prog_name)
235
247
  parser.add_argument(
236
248
  'groups',
@@ -245,8 +257,10 @@ class DeleteGroup(command.Command):
245
257
  )
246
258
  return parser
247
259
 
248
- def take_action(self, parsed_args):
249
- identity_client = self.app.client_manager.sdk_connection.identity
260
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
261
+ identity_client = sdk_utils.ensure_service_version(
262
+ self.app.client_manager.sdk_connection.identity, '3'
263
+ )
250
264
 
251
265
  errors = 0
252
266
  for group in parsed_args.groups:
@@ -277,7 +291,7 @@ class DeleteGroup(command.Command):
277
291
  class ListGroup(command.Lister):
278
292
  _description = _("List groups")
279
293
 
280
- def get_parser(self, prog_name):
294
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
281
295
  parser = super().get_parser(prog_name)
282
296
  parser.add_argument(
283
297
  '--domain',
@@ -298,8 +312,12 @@ class ListGroup(command.Lister):
298
312
  )
299
313
  return parser
300
314
 
301
- def take_action(self, parsed_args):
302
- identity_client = self.app.client_manager.sdk_connection.identity
315
+ def take_action(
316
+ self, parsed_args: argparse.Namespace
317
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
318
+ identity_client = sdk_utils.ensure_service_version(
319
+ self.app.client_manager.sdk_connection.identity, '3'
320
+ )
303
321
 
304
322
  domain = None
305
323
  if parsed_args.domain:
@@ -314,13 +332,10 @@ class ListGroup(command.Lister):
314
332
  parsed_args.user,
315
333
  parsed_args.user_domain,
316
334
  )
317
- if domain:
318
- # NOTE(0weng): The API doesn't actually support filtering
319
- # additionally by domain_id, so this doesn't really do
320
- # anything.
321
- data = identity_client.user_groups(user, domain_id=domain)
322
- else:
323
- data = identity_client.user_groups(user)
335
+ # NOTE(0weng): The API doesn't actually support filtering
336
+ # additionally by domain_id, so this doesn't really do
337
+ # anything.
338
+ data = identity_client.user_groups(user)
324
339
  else:
325
340
  if domain:
326
341
  data = identity_client.groups(domain_id=domain)
@@ -348,7 +363,7 @@ class ListGroup(command.Lister):
348
363
  class RemoveUserFromGroup(command.Command):
349
364
  _description = _("Remove user from group")
350
365
 
351
- def get_parser(self, prog_name):
366
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
352
367
  parser = super().get_parser(prog_name)
353
368
  parser.add_argument(
354
369
  'group',
@@ -368,8 +383,10 @@ class RemoveUserFromGroup(command.Command):
368
383
  common.add_user_domain_option_to_parser(parser)
369
384
  return parser
370
385
 
371
- def take_action(self, parsed_args):
372
- identity_client = self.app.client_manager.sdk_connection.identity
386
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
387
+ identity_client = sdk_utils.ensure_service_version(
388
+ self.app.client_manager.sdk_connection.identity, '3'
389
+ )
373
390
 
374
391
  group_id = common.find_group_id_sdk(
375
392
  identity_client, parsed_args.group, parsed_args.group_domain
@@ -408,7 +425,7 @@ class RemoveUserFromGroup(command.Command):
408
425
  class SetGroup(command.Command):
409
426
  _description = _("Set group properties")
410
427
 
411
- def get_parser(self, prog_name):
428
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
412
429
  parser = super().get_parser(prog_name)
413
430
  parser.add_argument(
414
431
  'group',
@@ -432,8 +449,10 @@ class SetGroup(command.Command):
432
449
  )
433
450
  return parser
434
451
 
435
- def take_action(self, parsed_args):
436
- identity_client = self.app.client_manager.sdk_connection.identity
452
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
453
+ identity_client = sdk_utils.ensure_service_version(
454
+ self.app.client_manager.sdk_connection.identity, '3'
455
+ )
437
456
  group = common.find_group_id_sdk(
438
457
  identity_client, parsed_args.group, parsed_args.domain
439
458
  )
@@ -449,7 +468,7 @@ class SetGroup(command.Command):
449
468
  class ShowGroup(command.ShowOne):
450
469
  _description = _("Display group details")
451
470
 
452
- def get_parser(self, prog_name):
471
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
453
472
  parser = super().get_parser(prog_name)
454
473
  parser.add_argument(
455
474
  'group',
@@ -463,8 +482,12 @@ class ShowGroup(command.ShowOne):
463
482
  )
464
483
  return parser
465
484
 
466
- def take_action(self, parsed_args):
467
- identity_client = self.app.client_manager.sdk_connection.identity
485
+ def take_action(
486
+ self, parsed_args: argparse.Namespace
487
+ ) -> tuple[Sequence[str], Iterable[Any]]:
488
+ identity_client = sdk_utils.ensure_service_version(
489
+ self.app.client_manager.sdk_connection.identity, '3'
490
+ )
468
491
 
469
492
  if parsed_args.domain:
470
493
  domain = common.find_domain_id_sdk(