python-openstackclient 8.3.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 (292) 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 +126 -114
  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 +251 -171
  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 +103 -41
  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 +26 -12
  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 +71 -50
  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 +115 -92
  64. openstackclient/identity/v3/mapping.py +26 -13
  65. openstackclient/identity/v3/policy.py +23 -12
  66. openstackclient/identity/v3/project.py +211 -122
  67. openstackclient/identity/v3/region.py +36 -16
  68. openstackclient/identity/v3/registered_limit.py +116 -109
  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 -17
  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 +76 -49
  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_limit.py +47 -0
  154. openstackclient/tests/functional/identity/v3/test_project.py +10 -10
  155. openstackclient/tests/functional/identity/v3/test_role.py +18 -18
  156. openstackclient/tests/functional/identity/v3/test_role_assignment.py +12 -12
  157. openstackclient/tests/functional/identity/v3/test_user.py +8 -8
  158. openstackclient/tests/functional/image/base.py +1 -6
  159. openstackclient/tests/functional/image/v2/test_metadef_objects.py +69 -0
  160. openstackclient/tests/functional/network/v2/common.py +5 -2
  161. openstackclient/tests/functional/network/v2/test_floating_ip.py +10 -4
  162. openstackclient/tests/functional/network/v2/test_ip_availability.py +4 -0
  163. openstackclient/tests/functional/network/v2/test_network_meter_rule.py +3 -2
  164. openstackclient/tests/functional/network/v2/test_network_segment.py +5 -0
  165. openstackclient/tests/functional/network/v2/test_subnet.py +13 -9
  166. openstackclient/tests/functional/object/v1/common.py +4 -0
  167. openstackclient/tests/functional/volume/v2/common.py +4 -0
  168. openstackclient/tests/functional/volume/v2/test_volume_snapshot.py +27 -11
  169. openstackclient/tests/functional/volume/v2/test_volume_type.py +2 -2
  170. openstackclient/tests/functional/volume/v3/common.py +4 -0
  171. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +56 -138
  172. openstackclient/tests/functional/volume/v3/test_volume_type.py +2 -2
  173. openstackclient/tests/unit/common/test_availability_zone.py +35 -49
  174. openstackclient/tests/unit/common/test_extension.py +2 -2
  175. openstackclient/tests/unit/common/test_module.py +12 -7
  176. openstackclient/tests/unit/common/test_project_cleanup.py +3 -1
  177. openstackclient/tests/unit/common/test_quota.py +62 -23
  178. openstackclient/tests/unit/compute/v2/fakes.py +25 -0
  179. openstackclient/tests/unit/compute/v2/test_flavor.py +28 -2
  180. openstackclient/tests/unit/compute/v2/test_keypair.py +6 -6
  181. openstackclient/tests/unit/compute/v2/test_server.py +17 -104
  182. openstackclient/tests/unit/compute/v2/test_server_share.py +287 -0
  183. openstackclient/tests/unit/identity/v3/fakes.py +3 -0
  184. openstackclient/tests/unit/identity/v3/test_group.py +4 -14
  185. openstackclient/tests/unit/identity/v3/test_identity_provider.py +303 -299
  186. openstackclient/tests/unit/identity/v3/test_limit.py +197 -145
  187. openstackclient/tests/unit/identity/v3/test_project.py +831 -512
  188. openstackclient/tests/unit/identity/v3/test_protocol.py +97 -88
  189. openstackclient/tests/unit/identity/v3/test_registered_limit.py +355 -220
  190. openstackclient/tests/unit/identity/v3/test_user.py +4 -4
  191. openstackclient/tests/unit/image/v2/test_image.py +16 -16
  192. openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +105 -6
  193. openstackclient/tests/unit/network/test_common.py +0 -155
  194. openstackclient/tests/unit/network/v2/bgpvpn/__init__.py +0 -0
  195. openstackclient/tests/unit/network/v2/bgpvpn/fakes.py +179 -0
  196. openstackclient/tests/unit/network/v2/bgpvpn/test_bgpvpn.py +584 -0
  197. openstackclient/tests/unit/network/v2/bgpvpn/test_network_association.py +285 -0
  198. openstackclient/tests/unit/network/v2/bgpvpn/test_port_association.py +384 -0
  199. openstackclient/tests/unit/network/v2/bgpvpn/test_router_association.py +297 -0
  200. openstackclient/tests/unit/network/v2/fwaas/__init__.py +0 -0
  201. openstackclient/tests/unit/network/v2/fwaas/test_group.py +897 -0
  202. openstackclient/tests/unit/network/v2/fwaas/test_policy.py +869 -0
  203. openstackclient/tests/unit/network/v2/fwaas/test_rule.py +980 -0
  204. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_flow.py → test_tap_flow.py} +18 -25
  205. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_mirror.py → test_tap_mirror.py} +19 -29
  206. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_service.py → test_tap_service.py} +19 -29
  207. openstackclient/tests/unit/network/v2/test_address_group.py +2 -2
  208. openstackclient/tests/unit/network/v2/{test_floating_ip_network.py → test_floating_ip.py} +3 -2
  209. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +13 -13
  210. openstackclient/tests/unit/network/v2/test_network_agent.py +8 -4
  211. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +3 -3
  212. openstackclient/tests/unit/network/v2/test_network_flavor.py +2 -2
  213. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +1 -1
  214. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +2 -2
  215. openstackclient/tests/unit/network/v2/test_network_rbac.py +1 -1
  216. openstackclient/tests/unit/network/v2/test_network_segment.py +1 -1
  217. openstackclient/tests/unit/network/v2/test_network_segment_range.py +7 -10
  218. openstackclient/tests/unit/network/v2/test_network_trunk.py +1 -1
  219. openstackclient/tests/unit/network/v2/test_router.py +8 -9
  220. openstackclient/tests/unit/network/v2/{test_security_group_network.py → test_security_group.py} +1 -20
  221. openstackclient/tests/unit/network/v2/{test_security_group_rule_network.py → test_security_group_rule.py} +7 -41
  222. openstackclient/tests/unit/network/v2/test_subnet.py +2 -1
  223. openstackclient/tests/unit/network/v2/test_subnet_pool.py +2 -1
  224. openstackclient/tests/unit/object/v1/fakes.py +8 -7
  225. openstackclient/tests/unit/object/v1/test_container.py +65 -101
  226. openstackclient/tests/unit/object/v1/test_container_all.py +8 -1
  227. openstackclient/tests/unit/object/v1/test_object.py +44 -84
  228. openstackclient/tests/unit/object/v1/test_object_all.py +8 -1
  229. openstackclient/tests/unit/test_hacking.py +108 -0
  230. openstackclient/tests/unit/volume/v2/fakes.py +1 -0
  231. openstackclient/tests/unit/volume/v2/test_consistency_group.py +8 -2
  232. openstackclient/tests/unit/volume/v2/test_volume.py +7 -6
  233. openstackclient/tests/unit/volume/v2/test_volume_backup.py +1 -5
  234. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +2 -1
  235. openstackclient/tests/unit/volume/v2/test_volume_type.py +2 -4
  236. openstackclient/tests/unit/volume/v3/fakes.py +1 -0
  237. openstackclient/tests/unit/volume/v3/test_volume.py +94 -15
  238. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
  239. openstackclient/tests/unit/volume/v3/test_volume_backup.py +1 -5
  240. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +55 -1
  241. openstackclient/tests/unit/volume/v3/test_volume_type.py +2 -4
  242. openstackclient/volume/client.py +7 -3
  243. openstackclient/volume/v2/backup_record.py +15 -6
  244. openstackclient/volume/v2/consistency_group.py +37 -25
  245. openstackclient/volume/v2/consistency_group_snapshot.py +27 -12
  246. openstackclient/volume/v2/qos_specs.py +30 -19
  247. openstackclient/volume/v2/service.py +17 -6
  248. openstackclient/volume/v2/volume.py +69 -34
  249. openstackclient/volume/v2/volume_backend.py +19 -6
  250. openstackclient/volume/v2/volume_backup.py +48 -22
  251. openstackclient/volume/v2/volume_host.py +6 -4
  252. openstackclient/volume/v2/volume_snapshot.py +52 -26
  253. openstackclient/volume/v2/volume_transfer_request.py +33 -15
  254. openstackclient/volume/v2/volume_type.py +46 -27
  255. openstackclient/volume/v3/block_storage_cleanup.py +11 -3
  256. openstackclient/volume/v3/block_storage_cluster.py +19 -7
  257. openstackclient/volume/v3/block_storage_log_level.py +15 -6
  258. openstackclient/volume/v3/block_storage_manage.py +10 -4
  259. openstackclient/volume/v3/block_storage_resource_filter.py +17 -5
  260. openstackclient/volume/v3/service.py +16 -6
  261. openstackclient/volume/v3/volume.py +103 -46
  262. openstackclient/volume/v3/volume_attachment.py +43 -21
  263. openstackclient/volume/v3/volume_backup.py +55 -26
  264. openstackclient/volume/v3/volume_group.py +23 -13
  265. openstackclient/volume/v3/volume_group_snapshot.py +32 -13
  266. openstackclient/volume/v3/volume_group_type.py +26 -13
  267. openstackclient/volume/v3/volume_message.py +15 -7
  268. openstackclient/volume/v3/volume_snapshot.py +71 -34
  269. openstackclient/volume/v3/volume_transfer_request.py +33 -15
  270. openstackclient/volume/v3/volume_type.py +45 -27
  271. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/METADATA +6 -6
  272. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/RECORD +279 -267
  273. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/WHEEL +1 -1
  274. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/entry_points.txt +53 -1
  275. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/AUTHORS +9 -0
  276. python_openstackclient-10.0.0.dist-info/pbr.json +1 -0
  277. openstackclient/api/image_v1.py +0 -69
  278. openstackclient/api/image_v2.py +0 -79
  279. openstackclient/network/v2/floating_ip_pool.py +0 -38
  280. openstackclient/tests/functional/image/v1/test_image.py +0 -97
  281. openstackclient/tests/unit/api/test_image_v1.py +0 -96
  282. openstackclient/tests/unit/api/test_image_v2.py +0 -96
  283. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +0 -248
  284. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +0 -49
  285. openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +0 -39
  286. openstackclient/tests/unit/network/v2/test_network_compute.py +0 -404
  287. openstackclient/tests/unit/network/v2/test_security_group_compute.py +0 -392
  288. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +0 -555
  289. python_openstackclient-8.3.0.dist-info/pbr.json +0 -1
  290. /openstackclient/{tests/functional/image/v1 → network/v2/bgpvpn}/__init__.py +0 -0
  291. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/LICENSE +0 -0
  292. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/top_level.txt +0 -0
@@ -13,8 +13,12 @@
13
13
 
14
14
  """Registered limits 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
 
21
+ from openstack import utils as sdk_utils
18
22
  from osc_lib import exceptions
19
23
  from osc_lib import utils
20
24
 
@@ -25,10 +29,35 @@ from openstackclient.identity import common as common_utils
25
29
  LOG = logging.getLogger(__name__)
26
30
 
27
31
 
32
+ def _format_registered_limit(
33
+ registered_limit: Any,
34
+ ) -> tuple[tuple[str, ...], Any]:
35
+ columns = (
36
+ 'default_limit',
37
+ 'description',
38
+ 'id',
39
+ 'region_id',
40
+ 'resource_name',
41
+ 'service_id',
42
+ )
43
+ column_headers = (
44
+ 'default_limit',
45
+ 'description',
46
+ 'id',
47
+ 'region_id',
48
+ 'resource_name',
49
+ 'service_id',
50
+ )
51
+ return (
52
+ column_headers,
53
+ utils.get_item_properties(registered_limit, columns),
54
+ )
55
+
56
+
28
57
  class CreateRegisteredLimit(command.ShowOne):
29
58
  _description = _("Create a registered limit")
30
59
 
31
- def get_parser(self, prog_name):
60
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
32
61
  parser = super().get_parser(prog_name)
33
62
  parser.add_argument(
34
63
  '--description',
@@ -63,66 +92,62 @@ class CreateRegisteredLimit(command.ShowOne):
63
92
  )
64
93
  return parser
65
94
 
66
- def take_action(self, parsed_args):
67
- identity_client = self.app.client_manager.identity
68
-
69
- service = utils.find_resource(
70
- identity_client.services, parsed_args.service
95
+ def take_action(
96
+ self, parsed_args: argparse.Namespace
97
+ ) -> tuple[Sequence[str], Iterable[Any]]:
98
+ identity_client = sdk_utils.ensure_service_version(
99
+ self.app.client_manager.sdk_connection.identity, '3'
71
100
  )
72
- region = None
101
+
102
+ kwargs = {}
103
+
104
+ if parsed_args.description:
105
+ kwargs["description"] = parsed_args.description
106
+
107
+ kwargs["service_id"] = common_utils.find_service_sdk(
108
+ identity_client, parsed_args.service
109
+ ).id
110
+
73
111
  if parsed_args.region:
74
- if 'None' not in parsed_args.region:
75
- # NOTE (vishakha): Due to bug #1799153 and for any another
76
- # related case where GET resource API does not support the
77
- # filter by name, osc_lib.utils.find_resource() method cannot
78
- # be used because that method try to fall back to list all the
79
- # resource if requested resource cannot be get via name. Which
80
- # ends up with NoUniqueMatch error.
81
- # So osc_lib.utils.find_resource() function cannot be used for
82
- # 'regions', using common_utils.get_resource() instead.
83
- region = common_utils.get_resource(
84
- identity_client.regions, parsed_args.region
85
- )
86
- else:
87
- self.log.warning(
88
- _(
89
- "Passing 'None' to indicate no region is deprecated. "
90
- "Instead, don't pass --region."
91
- )
92
- )
112
+ kwargs["region_id"] = identity_client.get_region(
113
+ parsed_args.region
114
+ ).id
93
115
 
94
- registered_limit = identity_client.registered_limits.create(
95
- service,
96
- parsed_args.resource_name,
97
- parsed_args.default_limit,
98
- description=parsed_args.description,
99
- region=region,
100
- )
116
+ kwargs["resource_name"] = parsed_args.resource_name
117
+ kwargs["default_limit"] = parsed_args.default_limit
118
+
119
+ registered_limit = identity_client.create_registered_limit(**kwargs)
101
120
 
102
- registered_limit._info.pop('links', None)
103
- return zip(*sorted(registered_limit._info.items()))
121
+ return _format_registered_limit(registered_limit)
104
122
 
105
123
 
106
124
  class DeleteRegisteredLimit(command.Command):
107
125
  _description = _("Delete a registered limit")
108
126
 
109
- def get_parser(self, prog_name):
127
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
110
128
  parser = super().get_parser(prog_name)
111
129
  parser.add_argument(
112
130
  'registered_limits',
113
131
  metavar='<registered-limits>',
114
132
  nargs="+",
115
- help=_('Registered limit(s) to delete (ID)'),
133
+ help=_(
134
+ 'Registered limit(s) to delete (ID) '
135
+ '(repeat option to remove multiple registered limits)'
136
+ ),
116
137
  )
117
138
  return parser
118
139
 
119
- def take_action(self, parsed_args):
120
- identity_client = self.app.client_manager.identity
140
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
141
+ identity_client = sdk_utils.ensure_service_version(
142
+ self.app.client_manager.sdk_connection.identity, '3'
143
+ )
121
144
 
122
145
  errors = 0
123
146
  for registered_limit_id in parsed_args.registered_limits:
124
147
  try:
125
- identity_client.registered_limits.delete(registered_limit_id)
148
+ identity_client.delete_registered_limit(
149
+ registered_limit_id, ignore_missing=False
150
+ )
126
151
  except Exception as e:
127
152
  errors += 1
128
153
  from pprint import pprint
@@ -147,7 +172,7 @@ class DeleteRegisteredLimit(command.Command):
147
172
  class ListRegisteredLimit(command.Lister):
148
173
  _description = _("List registered limits")
149
174
 
150
- def get_parser(self, prog_name):
175
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
151
176
  parser = super().get_parser(prog_name)
152
177
  parser.add_argument(
153
178
  '--service',
@@ -169,41 +194,27 @@ class ListRegisteredLimit(command.Lister):
169
194
  )
170
195
  return parser
171
196
 
172
- def take_action(self, parsed_args):
173
- identity_client = self.app.client_manager.identity
197
+ def take_action(
198
+ self, parsed_args: argparse.Namespace
199
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
200
+ identity_client = sdk_utils.ensure_service_version(
201
+ self.app.client_manager.sdk_connection.identity, '3'
202
+ )
174
203
 
175
- service = None
204
+ kwargs = {}
176
205
  if parsed_args.service:
177
- service = common_utils.find_service(
206
+ kwargs["service_id"] = common_utils.find_service_sdk(
178
207
  identity_client, parsed_args.service
179
- )
180
- region = None
208
+ ).id
181
209
  if parsed_args.region:
182
- if 'None' not in parsed_args.region:
183
- # NOTE (vishakha): Due to bug #1799153 and for any another
184
- # related case where GET resource API does not support the
185
- # filter by name, osc_lib.utils.find_resource() method cannot
186
- # be used because that method try to fall back to list all the
187
- # resource if requested resource cannot be get via name. Which
188
- # ends up with NoUniqueMatch error.
189
- # So osc_lib.utils.find_resource() function cannot be used for
190
- # 'regions', using common_utils.get_resource() instead.
191
- region = common_utils.get_resource(
192
- identity_client.regions, parsed_args.region
193
- )
194
- else:
195
- self.log.warning(
196
- _(
197
- "Passing 'None' to indicate no region is deprecated. "
198
- "Instead, don't pass --region."
199
- )
200
- )
210
+ kwargs["region_id"] = identity_client.get_region(
211
+ parsed_args.region
212
+ ).id
201
213
 
202
- registered_limits = identity_client.registered_limits.list(
203
- service=service,
204
- resource_name=parsed_args.resource_name,
205
- region=region,
206
- )
214
+ if parsed_args.resource_name:
215
+ kwargs["resource_name"] = parsed_args.resource_name
216
+
217
+ registered_limits = identity_client.registered_limits(**kwargs)
207
218
 
208
219
  columns = (
209
220
  'ID',
@@ -222,7 +233,7 @@ class ListRegisteredLimit(command.Lister):
222
233
  class SetRegisteredLimit(command.ShowOne):
223
234
  _description = _("Update information about a registered limit")
224
235
 
225
- def get_parser(self, prog_name):
236
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
226
237
  parser = super().get_parser(prog_name)
227
238
  parser.add_argument(
228
239
  'registered_limit_id',
@@ -272,51 +283,44 @@ class SetRegisteredLimit(command.ShowOne):
272
283
  )
273
284
  return parser
274
285
 
275
- def take_action(self, parsed_args):
276
- identity_client = self.app.client_manager.identity
286
+ def take_action(
287
+ self, parsed_args: argparse.Namespace
288
+ ) -> tuple[Sequence[str], Iterable[Any]]:
289
+ identity_client = sdk_utils.ensure_service_version(
290
+ self.app.client_manager.sdk_connection.identity, '3'
291
+ )
277
292
 
278
- service = None
293
+ kwargs = {}
279
294
  if parsed_args.service:
280
- service = common_utils.find_service(
295
+ kwargs["service_id"] = common_utils.find_service_sdk(
281
296
  identity_client, parsed_args.service
282
- )
297
+ ).id
298
+
299
+ if parsed_args.resource_name:
300
+ kwargs["resource_name"] = parsed_args.resource_name
301
+
302
+ if parsed_args.default_limit:
303
+ kwargs["default_limit"] = parsed_args.default_limit
304
+
305
+ if parsed_args.description:
306
+ kwargs["description"] = parsed_args.description
283
307
 
284
- region = None
285
308
  if parsed_args.region:
286
- if 'None' not in parsed_args.region:
287
- # NOTE (vishakha): Due to bug #1799153 and for any another
288
- # related case where GET resource API does not support the
289
- # filter by name, osc_lib.utils.find_resource() method cannot
290
- # be used because that method try to fall back to list all the
291
- # resource if requested resource cannot be get via name. Which
292
- # ends up with NoUniqueMatch error.
293
- # So osc_lib.utils.find_resource() function cannot be used for
294
- # 'regions', using common_utils.get_resource() instead.
295
- region = common_utils.get_resource(
296
- identity_client.regions, parsed_args.region
297
- )
298
- else:
299
- self.log.warning(
300
- _("Passing 'None' to indicate no region is deprecated.")
301
- )
309
+ kwargs["region_id"] = identity_client.get_region(
310
+ parsed_args.region
311
+ ).id
302
312
 
303
- registered_limit = identity_client.registered_limits.update(
304
- parsed_args.registered_limit_id,
305
- service=service,
306
- resource_name=parsed_args.resource_name,
307
- default_limit=parsed_args.default_limit,
308
- description=parsed_args.description,
309
- region=region,
313
+ registered_limit = identity_client.update_registered_limit(
314
+ parsed_args.registered_limit_id, **kwargs
310
315
  )
311
316
 
312
- registered_limit._info.pop('links', None)
313
- return zip(*sorted(registered_limit._info.items()))
317
+ return _format_registered_limit(registered_limit)
314
318
 
315
319
 
316
320
  class ShowRegisteredLimit(command.ShowOne):
317
321
  _description = _("Display registered limit details")
318
322
 
319
- def get_parser(self, prog_name):
323
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
320
324
  parser = super().get_parser(prog_name)
321
325
  parser.add_argument(
322
326
  'registered_limit_id',
@@ -325,10 +329,13 @@ class ShowRegisteredLimit(command.ShowOne):
325
329
  )
326
330
  return parser
327
331
 
328
- def take_action(self, parsed_args):
329
- identity_client = self.app.client_manager.identity
330
- registered_limit = identity_client.registered_limits.get(
332
+ def take_action(
333
+ self, parsed_args: argparse.Namespace
334
+ ) -> tuple[Sequence[str], Iterable[Any]]:
335
+ identity_client = sdk_utils.ensure_service_version(
336
+ self.app.client_manager.sdk_connection.identity, '3'
337
+ )
338
+ registered_limit = identity_client.get_registered_limit(
331
339
  parsed_args.registered_limit_id
332
340
  )
333
- registered_limit._info.pop('links', None)
334
- return zip(*sorted(registered_limit._info.items()))
341
+ return _format_registered_limit(registered_limit)
@@ -15,9 +15,13 @@
15
15
 
16
16
  """Identity v3 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 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_role(role):
36
+ def _format_role(role: Any) -> tuple[tuple[str, ...], Any]:
33
37
  columns = (
34
38
  "id",
35
39
  "name",
@@ -48,7 +52,9 @@ def _format_role(role):
48
52
  )
49
53
 
50
54
 
51
- def _add_identity_and_resource_options_to_parser(parser):
55
+ def _add_identity_and_resource_options_to_parser(
56
+ parser: argparse.ArgumentParser,
57
+ ) -> None:
52
58
  system_or_domain_or_project = parser.add_mutually_exclusive_group()
53
59
  system_or_domain_or_project.add_argument(
54
60
  '--system',
@@ -83,9 +89,11 @@ def _add_identity_and_resource_options_to_parser(parser):
83
89
 
84
90
 
85
91
  def _process_identity_and_resource_options(
86
- parsed_args, identity_client, validate_actor_existence=True
87
- ):
88
- def _find_user():
92
+ parsed_args: argparse.Namespace,
93
+ identity_client: Any,
94
+ validate_actor_existence: bool = True,
95
+ ) -> dict[str, Any]:
96
+ def _find_user() -> Any:
89
97
  domain_id = (
90
98
  common._find_sdk_id(
91
99
  identity_client.find_domain,
@@ -102,7 +110,7 @@ def _process_identity_and_resource_options(
102
110
  domain_id=domain_id,
103
111
  )
104
112
 
105
- def _find_group():
113
+ def _find_group() -> Any:
106
114
  domain_id = (
107
115
  common._find_sdk_id(
108
116
  identity_client.find_domain,
@@ -119,7 +127,7 @@ def _process_identity_and_resource_options(
119
127
  domain_id=domain_id,
120
128
  )
121
129
 
122
- def _find_project():
130
+ def _find_project() -> Any:
123
131
  domain_id = (
124
132
  common._find_sdk_id(
125
133
  identity_client.find_domain,
@@ -180,7 +188,7 @@ class AddRole(command.Command):
180
188
  "system, a domain, or a project"
181
189
  )
182
190
 
183
- def get_parser(self, prog_name):
191
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
184
192
  parser = super().get_parser(prog_name)
185
193
  parser.add_argument(
186
194
  'role',
@@ -191,8 +199,10 @@ class AddRole(command.Command):
191
199
  common.add_role_domain_option_to_parser(parser)
192
200
  return parser
193
201
 
194
- def take_action(self, parsed_args):
195
- identity_client = self.app.client_manager.sdk_connection.identity
202
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
203
+ identity_client = sdk_utils.ensure_service_version(
204
+ self.app.client_manager.sdk_connection.identity, '3'
205
+ )
196
206
 
197
207
  if (
198
208
  not parsed_args.user
@@ -278,7 +288,7 @@ class AddRole(command.Command):
278
288
  class CreateRole(command.ShowOne):
279
289
  _description = _("Create new role")
280
290
 
281
- def get_parser(self, prog_name):
291
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
282
292
  parser = super().get_parser(prog_name)
283
293
  parser.add_argument(
284
294
  'name',
@@ -303,10 +313,14 @@ class CreateRole(command.ShowOne):
303
313
  common.add_resource_option_to_parser(parser)
304
314
  return parser
305
315
 
306
- def take_action(self, parsed_args):
307
- identity_client = self.app.client_manager.sdk_connection.identity
316
+ def take_action(
317
+ self, parsed_args: argparse.Namespace
318
+ ) -> tuple[Sequence[str], Iterable[Any]]:
319
+ identity_client = sdk_utils.ensure_service_version(
320
+ self.app.client_manager.sdk_connection.identity, '3'
321
+ )
308
322
 
309
- create_kwargs = {}
323
+ create_kwargs: dict[str, Any] = {}
310
324
  if parsed_args.domain:
311
325
  create_kwargs['domain_id'] = common._find_sdk_id(
312
326
  identity_client.find_domain, name_or_id=parsed_args.domain
@@ -341,7 +355,7 @@ class CreateRole(command.ShowOne):
341
355
  class DeleteRole(command.Command):
342
356
  _description = _("Delete role(s)")
343
357
 
344
- def get_parser(self, prog_name):
358
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
345
359
  parser = super().get_parser(prog_name)
346
360
  parser.add_argument(
347
361
  'roles',
@@ -356,8 +370,10 @@ class DeleteRole(command.Command):
356
370
  )
357
371
  return parser
358
372
 
359
- def take_action(self, parsed_args):
360
- identity_client = self.app.client_manager.sdk_connection.identity
373
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
374
+ identity_client = sdk_utils.ensure_service_version(
375
+ self.app.client_manager.sdk_connection.identity, '3'
376
+ )
361
377
 
362
378
  domain_id = None
363
379
  if parsed_args.domain:
@@ -395,7 +411,7 @@ class DeleteRole(command.Command):
395
411
  class ListRole(command.Lister):
396
412
  _description = _("List roles")
397
413
 
398
- def get_parser(self, prog_name):
414
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
399
415
  parser = super().get_parser(prog_name)
400
416
  parser.add_argument(
401
417
  '--domain',
@@ -404,8 +420,12 @@ class ListRole(command.Lister):
404
420
  )
405
421
  return parser
406
422
 
407
- def take_action(self, parsed_args):
408
- identity_client = self.app.client_manager.sdk_connection.identity
423
+ def take_action(
424
+ self, parsed_args: argparse.Namespace
425
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
426
+ identity_client = sdk_utils.ensure_service_version(
427
+ self.app.client_manager.sdk_connection.identity, '3'
428
+ )
409
429
 
410
430
  if parsed_args.domain:
411
431
  domain = identity_client.find_domain(
@@ -416,8 +436,10 @@ class ListRole(command.Lister):
416
436
  return (
417
437
  ('ID', 'Name', 'Domain'),
418
438
  (
419
- utils.get_item_properties(s, ('id', 'name'))
420
- + (domain.name,)
439
+ (
440
+ *utils.get_item_properties(s, ('id', 'name')),
441
+ domain.name,
442
+ )
421
443
  for s in data
422
444
  ),
423
445
  )
@@ -435,7 +457,7 @@ class RemoveRole(command.Command):
435
457
  "Removes a role assignment from system/domain/project : user/group"
436
458
  )
437
459
 
438
- def get_parser(self, prog_name):
460
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
439
461
  parser = super().get_parser(prog_name)
440
462
  parser.add_argument(
441
463
  'role',
@@ -447,8 +469,10 @@ class RemoveRole(command.Command):
447
469
 
448
470
  return parser
449
471
 
450
- def take_action(self, parsed_args):
451
- identity_client = self.app.client_manager.sdk_connection.identity
472
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
473
+ identity_client = sdk_utils.ensure_service_version(
474
+ self.app.client_manager.sdk_connection.identity, '3'
475
+ )
452
476
  if (
453
477
  not parsed_args.user
454
478
  and not parsed_args.domain
@@ -527,7 +551,7 @@ class RemoveRole(command.Command):
527
551
  class SetRole(command.Command):
528
552
  _description = _("Set role properties")
529
553
 
530
- def get_parser(self, prog_name):
554
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
531
555
  parser = super().get_parser(prog_name)
532
556
  parser.add_argument(
533
557
  'role',
@@ -552,8 +576,10 @@ class SetRole(command.Command):
552
576
  common.add_resource_option_to_parser(parser)
553
577
  return parser
554
578
 
555
- def take_action(self, parsed_args):
556
- identity_client = self.app.client_manager.sdk_connection.identity
579
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
580
+ identity_client = sdk_utils.ensure_service_version(
581
+ self.app.client_manager.sdk_connection.identity, '3'
582
+ )
557
583
 
558
584
  update_kwargs = {}
559
585
  if parsed_args.description:
@@ -585,7 +611,7 @@ class SetRole(command.Command):
585
611
  class ShowRole(command.ShowOne):
586
612
  _description = _("Display role details")
587
613
 
588
- def get_parser(self, prog_name):
614
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
589
615
  parser = super().get_parser(prog_name)
590
616
  parser.add_argument(
591
617
  'role',
@@ -599,8 +625,12 @@ class ShowRole(command.ShowOne):
599
625
  )
600
626
  return parser
601
627
 
602
- def take_action(self, parsed_args):
603
- identity_client = self.app.client_manager.sdk_connection.identity
628
+ def take_action(
629
+ self, parsed_args: argparse.Namespace
630
+ ) -> tuple[Sequence[str], Iterable[Any]]:
631
+ identity_client = sdk_utils.ensure_service_version(
632
+ self.app.client_manager.sdk_connection.identity, '3'
633
+ )
604
634
 
605
635
  domain_id = None
606
636
  if parsed_args.domain:
@@ -13,13 +13,22 @@
13
13
 
14
14
  """Identity v3 Assignment action implementations"""
15
15
 
16
+ import argparse
17
+ from collections.abc import Iterable
18
+ from typing import Any
19
+
20
+ from openstack import utils as sdk_utils
21
+ from osc_lib import exceptions
22
+
16
23
  from openstackclient import command
17
24
  from openstackclient.i18n import _
18
25
  from openstackclient.identity import common
19
26
 
20
27
 
21
- def _format_role_assignment_(assignment, include_names):
22
- def _get_names(attr):
28
+ def _format_role_assignment_(
29
+ assignment: Any, include_names: Any
30
+ ) -> tuple[Any, ...]:
31
+ def _get_names(attr: Any) -> str:
23
32
  return (
24
33
  (
25
34
  attr['name']
@@ -34,7 +43,7 @@ def _format_role_assignment_(assignment, include_names):
34
43
  else ''
35
44
  )
36
45
 
37
- def _get_ids(attr):
46
+ def _get_ids(attr: Any) -> str:
38
47
  return attr['id'] or '' if attr else ''
39
48
 
40
49
  func = _get_names if include_names else _get_ids
@@ -52,7 +61,7 @@ def _format_role_assignment_(assignment, include_names):
52
61
  class ListRoleAssignment(command.Lister):
53
62
  _description = _("List role assignments")
54
63
 
55
- def get_parser(self, prog_name):
64
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
56
65
  parser = super().get_parser(prog_name)
57
66
  parser.add_argument(
58
67
  '--effective',
@@ -117,8 +126,12 @@ class ListRoleAssignment(command.Lister):
117
126
  )
118
127
  return parser
119
128
 
120
- def take_action(self, parsed_args):
121
- identity_client = self.app.client_manager.sdk_connection.identity
129
+ def take_action(
130
+ self, parsed_args: argparse.Namespace
131
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
132
+ identity_client = sdk_utils.ensure_service_version(
133
+ self.app.client_manager.sdk_connection.identity, '3'
134
+ )
122
135
  auth_ref = self.app.client_manager.auth_ref
123
136
 
124
137
  role_id = None
@@ -151,6 +164,8 @@ class ListRoleAssignment(command.Lister):
151
164
  )
152
165
  elif parsed_args.authuser:
153
166
  if auth_ref:
167
+ if auth_ref.user_id is None:
168
+ raise exceptions.CommandError('missing auth info')
154
169
  user_id = common._find_sdk_id(
155
170
  identity_client.find_user,
156
171
  name_or_id=auth_ref.user_id,
@@ -185,6 +200,8 @@ class ListRoleAssignment(command.Lister):
185
200
  )
186
201
  elif parsed_args.authproject:
187
202
  if auth_ref:
203
+ if auth_ref.project_id is None:
204
+ raise exceptions.CommandError('missing auth info')
188
205
  project_id = common._find_sdk_id(
189
206
  identity_client.find_project,
190
207
  name_or_id=auth_ref.project_id,