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
@@ -15,11 +15,14 @@
15
15
 
16
16
  """Identity v3 User action implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable, Sequence
18
20
  import copy
19
21
  import logging
20
- import typing as ty
22
+ from typing import Any
21
23
 
22
24
  from openstack import exceptions as sdk_exc
25
+ from openstack import utils as sdk_utils
23
26
  from osc_lib import exceptions
24
27
  from osc_lib import utils
25
28
 
@@ -31,7 +34,7 @@ from openstackclient.identity import common
31
34
  LOG = logging.getLogger(__name__)
32
35
 
33
36
 
34
- def _format_user(user):
37
+ def _format_user(user: Any) -> tuple[tuple[str, ...], Any]:
35
38
  columns = (
36
39
  'default_project_id',
37
40
  'domain_id',
@@ -60,8 +63,10 @@ def _format_user(user):
60
63
  )
61
64
 
62
65
 
63
- def _get_options_for_user(identity_client, parsed_args):
64
- options: dict[str, ty.Any] = {}
66
+ def _get_options_for_user(
67
+ identity_client: Any, parsed_args: argparse.Namespace
68
+ ) -> dict[str, Any]:
69
+ options: dict[str, Any] = {}
65
70
  if parsed_args.ignore_lockout_failure_attempts:
66
71
  options['ignore_lockout_failure_attempts'] = True
67
72
  if parsed_args.no_ignore_lockout_failure_attempts:
@@ -91,7 +96,7 @@ def _get_options_for_user(identity_client, parsed_args):
91
96
  return options
92
97
 
93
98
 
94
- def _add_user_options(parser):
99
+ def _add_user_options(parser: argparse.ArgumentParser) -> None:
95
100
  # Add additional user options
96
101
 
97
102
  parser.add_argument(
@@ -191,7 +196,7 @@ def _add_user_options(parser):
191
196
  class CreateUser(command.ShowOne):
192
197
  _description = _("Create new user")
193
198
 
194
- def get_parser(self, prog_name):
199
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
195
200
  parser = super().get_parser(prog_name)
196
201
  parser.add_argument(
197
202
  'name',
@@ -250,10 +255,14 @@ class CreateUser(command.ShowOne):
250
255
  )
251
256
  return parser
252
257
 
253
- def take_action(self, parsed_args):
254
- identity_client = self.app.client_manager.sdk_connection.identity
258
+ def take_action(
259
+ self, parsed_args: argparse.Namespace
260
+ ) -> tuple[Sequence[str], Iterable[Any]]:
261
+ identity_client = sdk_utils.ensure_service_version(
262
+ self.app.client_manager.sdk_connection.identity, '3'
263
+ )
255
264
 
256
- kwargs = {}
265
+ kwargs: dict[str, Any] = {}
257
266
 
258
267
  domain_id = None
259
268
  if parsed_args.domain:
@@ -333,7 +342,7 @@ class CreateUser(command.ShowOne):
333
342
  class DeleteUser(command.Command):
334
343
  _description = _("Delete user(s)")
335
344
 
336
- def get_parser(self, prog_name):
345
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
337
346
  parser = super().get_parser(prog_name)
338
347
  parser.add_argument(
339
348
  'users',
@@ -348,8 +357,10 @@ class DeleteUser(command.Command):
348
357
  )
349
358
  return parser
350
359
 
351
- def take_action(self, parsed_args):
352
- identity_client = self.app.client_manager.sdk_connection.identity
360
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
361
+ identity_client = sdk_utils.ensure_service_version(
362
+ self.app.client_manager.sdk_connection.identity, '3'
363
+ )
353
364
 
354
365
  domain = None
355
366
  if parsed_args.domain:
@@ -393,7 +404,7 @@ class DeleteUser(command.Command):
393
404
  class ListUser(command.Lister):
394
405
  _description = _("List users")
395
406
 
396
- def get_parser(self, prog_name):
407
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
397
408
  parser = super().get_parser(prog_name)
398
409
  parser.add_argument(
399
410
  '--domain',
@@ -439,8 +450,12 @@ class ListUser(command.Lister):
439
450
  )
440
451
  return parser
441
452
 
442
- def take_action(self, parsed_args):
443
- identity_client = self.app.client_manager.sdk_connection.identity
453
+ def take_action(
454
+ self, parsed_args: argparse.Namespace
455
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
456
+ identity_client = sdk_utils.ensure_service_version(
457
+ self.app.client_manager.sdk_connection.identity, '3'
458
+ )
444
459
 
445
460
  domain = None
446
461
  if parsed_args.domain:
@@ -541,7 +556,7 @@ class ListUser(command.Lister):
541
556
  class SetUser(command.Command):
542
557
  _description = _("Set user properties")
543
558
 
544
- def get_parser(self, prog_name):
559
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
545
560
  parser = super().get_parser(prog_name)
546
561
  parser.add_argument(
547
562
  'user',
@@ -603,8 +618,10 @@ class SetUser(command.Command):
603
618
  )
604
619
  return parser
605
620
 
606
- def take_action(self, parsed_args):
607
- identity_client = self.app.client_manager.sdk_connection.identity
621
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
622
+ identity_client = sdk_utils.ensure_service_version(
623
+ self.app.client_manager.sdk_connection.identity, '3'
624
+ )
608
625
 
609
626
  if parsed_args.password_prompt:
610
627
  parsed_args.password = utils.get_password(self.app.stdin)
@@ -676,7 +693,7 @@ class SetPasswordUser(command.Command):
676
693
 
677
694
  required_scope = False
678
695
 
679
- def get_parser(self, prog_name):
696
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
680
697
  parser = super().get_parser(prog_name)
681
698
  parser.add_argument(
682
699
  '--password',
@@ -690,15 +707,17 @@ class SetPasswordUser(command.Command):
690
707
  )
691
708
  return parser
692
709
 
693
- def take_action(self, parsed_args):
694
- identity_client = self.app.client_manager.sdk_connection.identity
710
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
711
+ identity_client = sdk_utils.ensure_service_version(
712
+ self.app.client_manager.sdk_connection.identity, '3'
713
+ )
695
714
  conn = self.app.client_manager.sdk_connection
696
715
  auth = conn.config.get_auth()
697
716
  if auth is None:
698
717
  # this will never happen
699
718
  raise exceptions.CommandError('invalid authentication info')
700
719
 
701
- user_id = auth.get_user_id(conn.identity)
720
+ user_id = auth.get_user_id(conn.session)
702
721
 
703
722
  # FIXME(gyee): there are two scenarios:
704
723
  #
@@ -740,7 +759,7 @@ class SetPasswordUser(command.Command):
740
759
  )
741
760
  )
742
761
 
743
- identity_client.update_user(
762
+ identity_client.update_password(
744
763
  user=user_id,
745
764
  current_password=current_password,
746
765
  password=password,
@@ -750,7 +769,7 @@ class SetPasswordUser(command.Command):
750
769
  class ShowUser(command.ShowOne):
751
770
  _description = _("Display user details")
752
771
 
753
- def get_parser(self, prog_name):
772
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
754
773
  parser = super().get_parser(prog_name)
755
774
  parser.add_argument(
756
775
  'user',
@@ -764,8 +783,12 @@ class ShowUser(command.ShowOne):
764
783
  )
765
784
  return parser
766
785
 
767
- def take_action(self, parsed_args):
768
- identity_client = self.app.client_manager.sdk_connection.identity
786
+ def take_action(
787
+ self, parsed_args: argparse.Namespace
788
+ ) -> tuple[Sequence[str], Iterable[Any]]:
789
+ identity_client = sdk_utils.ensure_service_version(
790
+ self.app.client_manager.sdk_connection.identity, '3'
791
+ )
769
792
 
770
793
  user_str = common._get_token_resource(
771
794
  identity_client, 'user', parsed_args.user, parsed_args.domain
@@ -12,7 +12,9 @@
12
12
  # License for the specific language governing permissions and limitations
13
13
  # under the License.
14
14
 
15
+ import argparse
15
16
  import logging
17
+ from typing import Any
16
18
 
17
19
  from osc_lib import utils
18
20
 
@@ -27,7 +29,7 @@ API_NAME = 'image'
27
29
  API_VERSIONS = ('1', '2')
28
30
 
29
31
 
30
- def make_client(instance):
32
+ def make_client(instance: Any) -> Any:
31
33
  """Returns an image service client."""
32
34
  LOG.debug(
33
35
  'Image client initialized using OpenStack SDK: %s',
@@ -36,7 +38,9 @@ def make_client(instance):
36
38
  return instance.sdk_connection.image
37
39
 
38
40
 
39
- def build_option_parser(parser):
41
+ def build_option_parser(
42
+ parser: argparse.ArgumentParser,
43
+ ) -> argparse.ArgumentParser:
40
44
  """Hook to add global options"""
41
45
  parser.add_argument(
42
46
  '--os-image-api-version',
@@ -48,6 +52,6 @@ def build_option_parser(parser):
48
52
  return parser
49
53
 
50
54
 
51
- def check_api_version(check_version):
55
+ def check_api_version(check_version: str) -> bool:
52
56
  # SDK supports auto-negotiation for us: always return True
53
57
  return True
@@ -19,7 +19,8 @@ import argparse
19
19
  import logging
20
20
  import os
21
21
  import sys
22
- import typing as ty
22
+ from collections.abc import Iterable, Sequence
23
+ from typing import Any
23
24
 
24
25
  from cliff import columns as cliff_columns
25
26
  from osc_lib.api import utils as api_utils
@@ -51,7 +52,7 @@ DISK_CHOICES = [
51
52
  LOG = logging.getLogger(__name__)
52
53
 
53
54
 
54
- def _get_columns(item):
55
+ def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
55
56
  column_map = {'is_protected': 'protected', 'owner_id': 'owner'}
56
57
  hidden_columns = [
57
58
  'location',
@@ -69,7 +70,7 @@ def _get_columns(item):
69
70
 
70
71
 
71
72
  class HumanReadableSizeColumn(cliff_columns.FormattableColumn[int]):
72
- def human_readable(self):
73
+ def human_readable(self) -> str:
73
74
  """Return a formatted visibility string
74
75
 
75
76
  :rtype:
@@ -83,7 +84,7 @@ class HumanReadableSizeColumn(cliff_columns.FormattableColumn[int]):
83
84
 
84
85
 
85
86
  class VisibilityColumn(cliff_columns.FormattableColumn[bool]):
86
- def human_readable(self):
87
+ def human_readable(self) -> str:
87
88
  """Return a formatted visibility string
88
89
 
89
90
  :rtype:
@@ -99,7 +100,7 @@ class VisibilityColumn(cliff_columns.FormattableColumn[bool]):
99
100
  class CreateImage(command.ShowOne):
100
101
  _description = _("Create/upload an image")
101
102
 
102
- def get_parser(self, prog_name):
103
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
103
104
  parser = super().get_parser(prog_name)
104
105
  parser.add_argument(
105
106
  "name",
@@ -239,7 +240,9 @@ class CreateImage(command.ShowOne):
239
240
  )
240
241
  return parser
241
242
 
242
- def take_action(self, parsed_args):
243
+ def take_action(
244
+ self, parsed_args: argparse.Namespace
245
+ ) -> tuple[Sequence[str], Iterable[Any]]:
243
246
  image_client = self.app.client_manager.image
244
247
 
245
248
  # Build an attribute dict from the parsed args, only include
@@ -299,7 +302,7 @@ class CreateImage(command.ShowOne):
299
302
  volume_client.volumes,
300
303
  parsed_args.volume,
301
304
  )
302
- response, body = volume_client.volumes.upload_to_image(
305
+ _response, body = volume_client.volumes.upload_to_image(
303
306
  source_volume.id,
304
307
  parsed_args.force,
305
308
  parsed_args.name,
@@ -314,10 +317,10 @@ class CreateImage(command.ShowOne):
314
317
  else:
315
318
  # Read file from stdin
316
319
  if not sys.stdin.isatty():
317
- if os.name == "nt":
320
+ if sys.platform == "win32":
318
321
  import msvcrt
319
322
 
320
- msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY) # type: ignore
323
+ msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
321
324
  if hasattr(sys.stdin, 'buffer'):
322
325
  kwargs['data'] = sys.stdin.buffer
323
326
  else:
@@ -351,13 +354,15 @@ class CreateImage(command.ShowOne):
351
354
  info['properties'] = format_columns.DictColumn(
352
355
  info.get('properties', {})
353
356
  )
354
- return zip(*sorted(info.items()))
357
+ col_headers, col_data = zip(*sorted(info.items()))
358
+ return col_headers, col_data
359
+ return ((), ())
355
360
 
356
361
 
357
362
  class DeleteImage(command.Command):
358
363
  _description = _("Delete image(s)")
359
364
 
360
- def get_parser(self, prog_name):
365
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
361
366
  parser = super().get_parser(prog_name)
362
367
  parser.add_argument(
363
368
  "images",
@@ -367,7 +372,7 @@ class DeleteImage(command.Command):
367
372
  )
368
373
  return parser
369
374
 
370
- def take_action(self, parsed_args):
375
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
371
376
  result = 0
372
377
  image_client = self.app.client_manager.image
373
378
  for image in parsed_args.images:
@@ -396,7 +401,7 @@ class DeleteImage(command.Command):
396
401
  class ListImage(command.Lister):
397
402
  _description = _("List available images")
398
403
 
399
- def get_parser(self, prog_name):
404
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
400
405
  parser = super().get_parser(prog_name)
401
406
  public_group = parser.add_mutually_exclusive_group()
402
407
  public_group.add_argument(
@@ -453,7 +458,9 @@ class ListImage(command.Lister):
453
458
  )
454
459
  return parser
455
460
 
456
- def take_action(self, parsed_args):
461
+ def take_action(
462
+ self, parsed_args: argparse.Namespace
463
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
457
464
  image_client = self.app.client_manager.image
458
465
 
459
466
  kwargs = {}
@@ -498,7 +505,7 @@ class ListImage(command.Lister):
498
505
 
499
506
  if parsed_args.property:
500
507
  # NOTE(dtroyer): coerce to a list to subscript it in py3
501
- attr, value = list(parsed_args.property.items())[0]
508
+ attr, value = next(iter(parsed_args.property.items()))
502
509
  api_utils.simple_filter(
503
510
  images,
504
511
  attr=attr,
@@ -527,7 +534,7 @@ class ListImage(command.Lister):
527
534
  class SaveImage(command.Command):
528
535
  _description = _("Save an image locally")
529
536
 
530
- def get_parser(self, prog_name):
537
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
531
538
  parser = super().get_parser(prog_name)
532
539
  parser.add_argument(
533
540
  "--chunk-size",
@@ -551,7 +558,7 @@ class SaveImage(command.Command):
551
558
  )
552
559
  return parser
553
560
 
554
- def take_action(self, parsed_args):
561
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
555
562
  image_client = self.app.client_manager.image
556
563
  image = image_client.find_image(
557
564
  parsed_args.image, ignore_missing=False
@@ -572,7 +579,7 @@ class SaveImage(command.Command):
572
579
  class SetImage(command.Command):
573
580
  _description = _("Set image properties")
574
581
 
575
- def get_parser(self, prog_name):
582
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
576
583
  parser = super().get_parser(prog_name)
577
584
  parser.add_argument(
578
585
  "image",
@@ -702,7 +709,7 @@ class SetImage(command.Command):
702
709
  )
703
710
  return parser
704
711
 
705
- def take_action(self, parsed_args):
712
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
706
713
  image_client = self.app.client_manager.image
707
714
 
708
715
  kwargs = {}
@@ -785,10 +792,10 @@ class SetImage(command.Command):
785
792
  # Read file from stdin
786
793
  if sys.stdin.isatty() is not True:
787
794
  if parsed_args.stdin:
788
- if os.name == "nt":
795
+ if sys.platform == "win32":
789
796
  import msvcrt
790
797
 
791
- msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY) # type: ignore
798
+ msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
792
799
  if hasattr(sys.stdin, 'buffer'):
793
800
  kwargs['data'] = sys.stdin.buffer
794
801
  else:
@@ -819,7 +826,7 @@ class SetImage(command.Command):
819
826
  class ShowImage(command.ShowOne):
820
827
  _description = _("Display image details")
821
828
 
822
- def get_parser(self, prog_name):
829
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
823
830
  parser = super().get_parser(prog_name)
824
831
  parser.add_argument(
825
832
  "--human-readable",
@@ -834,15 +841,15 @@ class ShowImage(command.ShowOne):
834
841
  )
835
842
  return parser
836
843
 
837
- def take_action(self, parsed_args):
844
+ def take_action(
845
+ self, parsed_args: argparse.Namespace
846
+ ) -> tuple[Sequence[str], Iterable[Any]]:
838
847
  image_client = self.app.client_manager.image
839
848
  image = image_client.find_image(
840
849
  parsed_args.image, ignore_missing=False
841
850
  )
842
851
 
843
- formatters: dict[
844
- str, type[cliff_columns.FormattableColumn[ty.Any]]
845
- ] = {
852
+ formatters: dict[str, type[cliff_columns.FormattableColumn[Any]]] = {
846
853
  'properties': format_columns.DictColumn,
847
854
  }
848
855
  if parsed_args.human_readable:
@@ -13,9 +13,12 @@
13
13
  # License for the specific language governing permissions and limitations
14
14
  # under the License.
15
15
 
16
+ import argparse
17
+ from collections.abc import Iterable, Sequence
16
18
  import copy
17
19
  import datetime
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
@@ -27,7 +30,7 @@ from openstackclient.i18n import _
27
30
  LOG = logging.getLogger(__name__)
28
31
 
29
32
 
30
- def _format_image_cache(cached_images):
33
+ def _format_image_cache(cached_images: dict[str, Any]) -> list[dict[str, Any]]:
31
34
  """Format image cache to make it more consistent with OSC operations."""
32
35
 
33
36
  image_list = []
@@ -70,11 +73,13 @@ def _format_image_cache(cached_images):
70
73
  class ListCachedImage(command.Lister):
71
74
  _description = _("Get Cache State")
72
75
 
73
- def get_parser(self, prog_name):
76
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
74
77
  parser = super().get_parser(prog_name)
75
78
  return parser
76
79
 
77
- def take_action(self, parsed_args):
80
+ def take_action(
81
+ self, parsed_args: argparse.Namespace
82
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
78
83
  image_client = self.app.client_manager.image
79
84
 
80
85
  # List of Cache data received
@@ -111,7 +116,7 @@ class ListCachedImage(command.Lister):
111
116
  class QueueCachedImage(command.Command):
112
117
  _description = _("Queue image(s) for caching.")
113
118
 
114
- def get_parser(self, prog_name):
119
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
115
120
  parser = super().get_parser(prog_name)
116
121
  parser.add_argument(
117
122
  "images",
@@ -121,7 +126,7 @@ class QueueCachedImage(command.Command):
121
126
  )
122
127
  return parser
123
128
 
124
- def take_action(self, parsed_args):
129
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
125
130
  image_client = self.app.client_manager.image
126
131
 
127
132
  failures = 0
@@ -151,7 +156,7 @@ class QueueCachedImage(command.Command):
151
156
  class DeleteCachedImage(command.Command):
152
157
  _description = _("Delete image(s) from cache")
153
158
 
154
- def get_parser(self, prog_name):
159
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
155
160
  parser = super().get_parser(prog_name)
156
161
  parser.add_argument(
157
162
  "images",
@@ -161,7 +166,7 @@ class DeleteCachedImage(command.Command):
161
166
  )
162
167
  return parser
163
168
 
164
- def take_action(self, parsed_args):
169
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
165
170
  failures = 0
166
171
  image_client = self.app.client_manager.image
167
172
  for image in parsed_args.images:
@@ -190,7 +195,7 @@ class DeleteCachedImage(command.Command):
190
195
  class ClearCachedImage(command.Command):
191
196
  _description = _("Clear all images from cache, queue or both")
192
197
 
193
- def get_parser(self, prog_name):
198
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
194
199
  parser = super().get_parser(prog_name)
195
200
  parser.add_argument(
196
201
  "--cache",
@@ -210,7 +215,7 @@ class ClearCachedImage(command.Command):
210
215
  )
211
216
  return parser
212
217
 
213
- def take_action(self, parsed_args):
218
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
214
219
  image_client = self.app.client_manager.image
215
220
 
216
221
  target = parsed_args.target