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
@@ -14,6 +14,10 @@
14
14
 
15
15
  """Compute v2 Server action implementations"""
16
16
 
17
+ import argparse
18
+ from collections.abc import Iterable
19
+ from typing import Any
20
+
17
21
  from openstack import utils as sdk_utils
18
22
  from osc_lib import exceptions
19
23
  from osc_lib import utils
@@ -25,7 +29,7 @@ from openstackclient.i18n import _
25
29
  class ListServerVolume(command.Lister):
26
30
  """List all the volumes attached to a server."""
27
31
 
28
- def get_parser(self, prog_name):
32
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
29
33
  parser = super().get_parser(prog_name)
30
34
  parser.add_argument(
31
35
  'server',
@@ -33,7 +37,9 @@ class ListServerVolume(command.Lister):
33
37
  )
34
38
  return parser
35
39
 
36
- def take_action(self, parsed_args):
40
+ def take_action(
41
+ self, parsed_args: argparse.Namespace
42
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
37
43
  compute_client = self.app.client_manager.compute
38
44
 
39
45
  server = compute_client.find_server(
@@ -81,7 +87,7 @@ class ListServerVolume(command.Lister):
81
87
  class SetServerVolume(command.Command):
82
88
  """Update a volume attachment on the server."""
83
89
 
84
- def get_parser(self, prog_name):
90
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
85
91
  parser = super().get_parser(prog_name)
86
92
  parser.add_argument(
87
93
  'server',
@@ -113,7 +119,7 @@ class SetServerVolume(command.Command):
113
119
  )
114
120
  return parser
115
121
 
116
- def take_action(self, parsed_args):
122
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
117
123
  compute_client = self.app.client_manager.compute
118
124
  volume_client = self.app.client_manager.sdk_connection.volume
119
125
 
@@ -15,7 +15,10 @@
15
15
 
16
16
  """Service action implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable
18
20
  import logging
21
+ from typing import Any
19
22
 
20
23
  from openstack import utils as sdk_utils
21
24
  from osc_lib import exceptions
@@ -31,7 +34,7 @@ LOG = logging.getLogger(__name__)
31
34
  class DeleteService(command.Command):
32
35
  _description = _("Delete compute service(s)")
33
36
 
34
- def get_parser(self, prog_name):
37
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
35
38
  parser = super().get_parser(prog_name)
36
39
  parser.add_argument(
37
40
  "service",
@@ -51,7 +54,7 @@ class DeleteService(command.Command):
51
54
  )
52
55
  return parser
53
56
 
54
- def take_action(self, parsed_args):
57
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
55
58
  compute_client = self.app.client_manager.compute
56
59
  result = 0
57
60
  for s in parsed_args.service:
@@ -84,7 +87,7 @@ value which can be used to uniquely identify the service in a multi-cell
84
87
  deployment."""
85
88
  )
86
89
 
87
- def get_parser(self, prog_name):
90
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
88
91
  parser = super().get_parser(prog_name)
89
92
  parser.add_argument(
90
93
  "--host",
@@ -107,7 +110,9 @@ deployment."""
107
110
  )
108
111
  return parser
109
112
 
110
- def take_action(self, parsed_args):
113
+ def take_action(
114
+ self, parsed_args: argparse.Namespace
115
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
111
116
  compute_client = self.app.client_manager.compute
112
117
  columns: tuple[str, ...] = (
113
118
  "id",
@@ -146,7 +151,7 @@ deployment."""
146
151
  class SetService(command.Command):
147
152
  _description = _("Set compute service properties")
148
153
 
149
- def get_parser(self, prog_name):
154
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
150
155
  parser = super().get_parser(prog_name)
151
156
  parser.add_argument("host", metavar="<host>", help=_("Name of host"))
152
157
  parser.add_argument(
@@ -192,7 +197,9 @@ class SetService(command.Command):
192
197
  return parser
193
198
 
194
199
  @staticmethod
195
- def _find_service_by_host_and_binary(compute_client, host, binary):
200
+ def _find_service_by_host_and_binary(
201
+ compute_client: Any, host: str, binary: str
202
+ ) -> Any:
196
203
  """Utility method to find a compute service by host and binary
197
204
 
198
205
  :param host: the name of the compute service host
@@ -220,7 +227,7 @@ class SetService(command.Command):
220
227
  raise exceptions.CommandError(msg)
221
228
  return services[0]
222
229
 
223
- def take_action(self, parsed_args):
230
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
224
231
  compute_client = self.app.client_manager.compute
225
232
 
226
233
  if (
@@ -15,10 +15,11 @@
15
15
 
16
16
  """Usage action implementations"""
17
17
 
18
- from collections.abc import Collection
18
+ import argparse
19
+ from collections.abc import Collection, Iterable, Sequence
19
20
  import datetime
20
21
  import functools
21
- import typing as ty
22
+ from typing import Any, cast
22
23
 
23
24
  from cliff import columns as cliff_columns
24
25
  from osc_lib import utils
@@ -40,32 +41,32 @@ class ProjectColumn(cliff_columns.FormattableColumn[str]):
40
41
  project_cache)`` to use this.
41
42
  """
42
43
 
43
- def __init__(self, value, project_cache=None):
44
+ def __init__(self, value: str, project_cache: Any = None) -> None:
44
45
  super().__init__(value)
45
46
  self.project_cache = project_cache or {}
46
47
 
47
- def human_readable(self):
48
+ def human_readable(self) -> str:
48
49
  project = self._value
49
50
  if not project:
50
51
  return ''
51
52
 
52
53
  if project in self.project_cache.keys():
53
- return self.project_cache[project].name
54
+ return cast(str, self.project_cache[project].name)
54
55
 
55
56
  return project
56
57
 
57
58
 
58
- class CountColumn(cliff_columns.FormattableColumn[Collection[ty.Any]]):
59
- def human_readable(self):
60
- return len(self._value) if self._value is not None else None
59
+ class CountColumn(cliff_columns.FormattableColumn[Collection[Any]]):
60
+ def human_readable(self) -> str:
61
+ return str(len(self._value)) if self._value is not None else ""
61
62
 
62
63
 
63
64
  class FloatColumn(cliff_columns.FormattableColumn[float]):
64
- def human_readable(self):
65
- return float(f"{self._value:.2f}")
65
+ def human_readable(self) -> str:
66
+ return f"{self._value:.2f}"
66
67
 
67
68
 
68
- def _formatters(project_cache):
69
+ def _formatters(project_cache: Any) -> dict[str, Any]:
69
70
  return {
70
71
  'project_id': functools.partial(
71
72
  ProjectColumn, project_cache=project_cache
@@ -77,21 +78,21 @@ def _formatters(project_cache):
77
78
  }
78
79
 
79
80
 
80
- def _get_usage_marker(usage):
81
+ def _get_usage_marker(usage: Any) -> str | None:
81
82
  marker = None
82
83
  if hasattr(usage, 'server_usages') and usage.server_usages:
83
84
  marker = usage.server_usages[-1]['instance_id']
84
85
  return marker
85
86
 
86
87
 
87
- def _get_usage_list_marker(usage_list):
88
+ def _get_usage_list_marker(usage_list: Any) -> str | None:
88
89
  marker = None
89
90
  if usage_list:
90
91
  marker = _get_usage_marker(usage_list[-1])
91
92
  return marker
92
93
 
93
94
 
94
- def _merge_usage(usage, next_usage):
95
+ def _merge_usage(usage: Any, next_usage: Any) -> None:
95
96
  usage.server_usages.extend(next_usage.server_usages)
96
97
  usage.total_hours += next_usage.total_hours
97
98
  usage.total_memory_mb_usage += next_usage.total_memory_mb_usage
@@ -99,7 +100,7 @@ def _merge_usage(usage, next_usage):
99
100
  usage.total_local_gb_usage += next_usage.total_local_gb_usage
100
101
 
101
102
 
102
- def _merge_usage_list(usages, next_usage_list):
103
+ def _merge_usage_list(usages: Any, next_usage_list: Any) -> None:
103
104
  for next_usage in next_usage_list:
104
105
  if next_usage.project_id in usages:
105
106
  _merge_usage(usages[next_usage.project_id], next_usage)
@@ -110,7 +111,7 @@ def _merge_usage_list(usages, next_usage_list):
110
111
  class ListUsage(command.Lister):
111
112
  _description = _("List resource usage per project")
112
113
 
113
- def get_parser(self, prog_name):
114
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
114
115
  parser = super().get_parser(prog_name)
115
116
  parser.add_argument(
116
117
  "--start",
@@ -128,12 +129,14 @@ class ListUsage(command.Lister):
128
129
  )
129
130
  return parser
130
131
 
131
- def take_action(self, parsed_args):
132
- def _format_project(project):
132
+ def take_action(
133
+ self, parsed_args: argparse.Namespace
134
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
135
+ def _format_project(project: str) -> str:
133
136
  if not project:
134
137
  return ""
135
138
  if project in project_cache.keys():
136
- return project_cache[project].name
139
+ return cast(str, project_cache[project].name)
137
140
  else:
138
141
  return project
139
142
 
@@ -210,7 +213,7 @@ class ListUsage(command.Lister):
210
213
  class ShowUsage(command.ShowOne):
211
214
  _description = _("Show resource usage for a single project")
212
215
 
213
- def get_parser(self, prog_name):
216
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
214
217
  parser = super().get_parser(prog_name)
215
218
  parser.add_argument(
216
219
  "--project",
@@ -234,7 +237,9 @@ class ShowUsage(command.ShowOne):
234
237
  )
235
238
  return parser
236
239
 
237
- def take_action(self, parsed_args):
240
+ def take_action(
241
+ self, parsed_args: argparse.Namespace
242
+ ) -> tuple[Sequence[str], Iterable[Any]]:
238
243
  identity_client = self.app.client_manager.identity
239
244
  compute_client = self.app.client_manager.compute
240
245
  date_cli_format = "%Y-%m-%d"
@@ -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 keystoneclient.v2_0 import client as identity_client_v2
18
20
  from osc_lib import utils
@@ -39,7 +41,7 @@ AUTH_VERSIONS = {
39
41
  }
40
42
 
41
43
 
42
- def make_client(instance):
44
+ def make_client(instance: Any) -> Any:
43
45
  """Returns an identity service client."""
44
46
  identity_client = utils.get_client_class(
45
47
  API_NAME, instance._api_version[API_NAME], API_VERSIONS
@@ -56,7 +58,9 @@ def make_client(instance):
56
58
  return client
57
59
 
58
60
 
59
- def build_option_parser(parser):
61
+ def build_option_parser(
62
+ parser: argparse.ArgumentParser,
63
+ ) -> argparse.ArgumentParser:
60
64
  """Hook to add global options"""
61
65
  parser.add_argument(
62
66
  '--os-identity-api-version',
@@ -70,10 +74,11 @@ def build_option_parser(parser):
70
74
  return parser
71
75
 
72
76
 
77
+ # We're not going to add type hints to this at this point
73
78
  class IdentityClientv2(identity_client_v2.Client):
74
79
  """Tweak the earlier client class to deal with some changes"""
75
80
 
76
- def __getattr__(self, name):
81
+ def __getattr__(self, name: str) -> Any:
77
82
  # Map v3 'projects' back to v2 'tenants'
78
83
  if name == "projects":
79
84
  return self.tenants
@@ -15,6 +15,10 @@
15
15
 
16
16
  """Common identity code"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Callable
20
+ from typing import Any, cast
21
+
18
22
  from keystoneclient import exceptions as identity_exc
19
23
  from keystoneclient.v3 import domains
20
24
  from keystoneclient.v3 import groups
@@ -27,7 +31,7 @@ from osc_lib import utils
27
31
  from openstackclient.i18n import _
28
32
 
29
33
 
30
- def find_service_in_list(service_list, service_id):
34
+ def find_service_in_list(service_list: list[Any], service_id: str) -> Any:
31
35
  """Find a service by id in service list."""
32
36
 
33
37
  for service in service_list:
@@ -38,7 +42,7 @@ def find_service_in_list(service_list, service_id):
38
42
  )
39
43
 
40
44
 
41
- def find_service(identity_client, name_type_or_id):
45
+ def find_service(identity_client: Any, name_type_or_id: str) -> Any:
42
46
  """Find a service by id, name or type."""
43
47
 
44
48
  try:
@@ -74,7 +78,7 @@ def find_service(identity_client, name_type_or_id):
74
78
  raise exceptions.CommandError(msg % name_type_or_id)
75
79
 
76
80
 
77
- def find_service_sdk(identity_client, name_type_or_id):
81
+ def find_service_sdk(identity_client: Any, name_type_or_id: str) -> Any:
78
82
  """Find a service by id, name or type."""
79
83
 
80
84
  try:
@@ -107,7 +111,7 @@ def find_service_sdk(identity_client, name_type_or_id):
107
111
  return service
108
112
 
109
113
 
110
- def get_resource(manager, name_type_or_id):
114
+ def get_resource(manager: Any, name_type_or_id: str) -> Any:
111
115
  # NOTE (vishakha): Due to bug #1799153 and for any another related case
112
116
  # where GET resource API does not support the filter by name,
113
117
  # osc_lib.utils.find_resource() method cannot be used because that method
@@ -126,7 +130,7 @@ def get_resource(manager, name_type_or_id):
126
130
  raise exceptions.CommandError(msg % name_type_or_id)
127
131
 
128
132
 
129
- def get_resource_by_id(manager, resource_id):
133
+ def get_resource_by_id(manager: Any, resource_id: str) -> Any:
130
134
  """Get resource by ID
131
135
 
132
136
  Raises CommandError if the resource is not found
@@ -138,7 +142,12 @@ def get_resource_by_id(manager, resource_id):
138
142
  raise exceptions.CommandError(msg.format(resource_id))
139
143
 
140
144
 
141
- def _get_token_resource(client, resource, parsed_name, parsed_domain=None):
145
+ def _get_token_resource(
146
+ client: Any,
147
+ resource: str,
148
+ parsed_name: str,
149
+ parsed_domain: str | None = None,
150
+ ) -> str:
142
151
  """Peek into the user's auth token to get resource IDs
143
152
 
144
153
  Look into a user's token to try and find the ID of a domain, project or
@@ -174,25 +183,28 @@ def _get_token_resource(client, resource, parsed_name, parsed_domain=None):
174
183
  if isinstance(obj, list):
175
184
  for item in obj:
176
185
  if item['name'] == parsed_name:
177
- return item['id']
186
+ return cast(str, item['id'])
178
187
  if item['id'] == parsed_name:
179
188
  return parsed_name
180
189
  return parsed_name
181
190
  return obj['id'] if obj['name'] == parsed_name else parsed_name
182
191
  # diaper defense in case parsing the token fails
183
- except Exception: # noqa
192
+ except Exception:
184
193
  return parsed_name
185
194
 
186
195
 
187
- def find_domain(identity_client, name_or_id):
196
+ def find_domain(identity_client: Any, name_or_id: str) -> domains.Domain:
188
197
  return _find_identity_resource(
189
198
  identity_client.domains, name_or_id, domains.Domain
190
199
  )
191
200
 
192
201
 
193
202
  def find_domain_id_sdk(
194
- identity_client, name_or_id, *, validate_actor_existence=True
195
- ):
203
+ identity_client: Any,
204
+ name_or_id: str,
205
+ *,
206
+ validate_actor_existence: bool = True,
207
+ ) -> str:
196
208
  return _find_sdk_id(
197
209
  identity_client.find_domain,
198
210
  name_or_id=name_or_id,
@@ -200,7 +212,11 @@ def find_domain_id_sdk(
200
212
  )
201
213
 
202
214
 
203
- def find_group(identity_client, name_or_id, domain_name_or_id=None):
215
+ def find_group(
216
+ identity_client: Any,
217
+ name_or_id: str,
218
+ domain_name_or_id: str | None = None,
219
+ ) -> groups.Group:
204
220
  if domain_name_or_id is None:
205
221
  return _find_identity_resource(
206
222
  identity_client.groups, name_or_id, groups.Group
@@ -216,12 +232,12 @@ def find_group(identity_client, name_or_id, domain_name_or_id=None):
216
232
 
217
233
 
218
234
  def find_group_id_sdk(
219
- identity_client,
220
- name_or_id,
221
- domain_name_or_id=None,
235
+ identity_client: Any,
236
+ name_or_id: str,
237
+ domain_name_or_id: str | None = None,
222
238
  *,
223
- validate_actor_existence=True,
224
- ):
239
+ validate_actor_existence: bool = True,
240
+ ) -> str:
225
241
  if domain_name_or_id is None:
226
242
  return _find_sdk_id(
227
243
  identity_client.find_group,
@@ -242,7 +258,11 @@ def find_group_id_sdk(
242
258
  )
243
259
 
244
260
 
245
- def find_project(identity_client, name_or_id, domain_name_or_id=None):
261
+ def find_project(
262
+ identity_client: Any,
263
+ name_or_id: str,
264
+ domain_name_or_id: str | None = None,
265
+ ) -> projects.Project:
246
266
  if domain_name_or_id is None:
247
267
  return _find_identity_resource(
248
268
  identity_client.projects, name_or_id, projects.Project
@@ -256,7 +276,42 @@ def find_project(identity_client, name_or_id, domain_name_or_id=None):
256
276
  )
257
277
 
258
278
 
259
- def find_user(identity_client, name_or_id, domain_name_or_id=None):
279
+ def find_project_id_sdk(
280
+ identity_client: Any,
281
+ name_or_id: str,
282
+ domain_name_or_id: str | None = None,
283
+ *,
284
+ validate_actor_existence: bool = True,
285
+ validate_domain_actor_existence: bool | None = None,
286
+ ) -> str:
287
+ if domain_name_or_id is None:
288
+ return _find_sdk_id(
289
+ identity_client.find_project,
290
+ name_or_id=name_or_id,
291
+ validate_actor_existence=validate_actor_existence,
292
+ )
293
+
294
+ if validate_domain_actor_existence is None:
295
+ validate_domain_actor_existence = validate_actor_existence
296
+
297
+ domain_id = find_domain_id_sdk(
298
+ identity_client,
299
+ name_or_id=domain_name_or_id,
300
+ validate_actor_existence=validate_domain_actor_existence,
301
+ )
302
+ return _find_sdk_id(
303
+ identity_client.find_project,
304
+ name_or_id=name_or_id,
305
+ validate_actor_existence=validate_actor_existence,
306
+ domain_id=domain_id,
307
+ )
308
+
309
+
310
+ def find_user(
311
+ identity_client: Any,
312
+ name_or_id: str,
313
+ domain_name_or_id: str | None = None,
314
+ ) -> users.User:
260
315
  if domain_name_or_id is None:
261
316
  return _find_identity_resource(
262
317
  identity_client.users, name_or_id, users.User
@@ -268,12 +323,12 @@ def find_user(identity_client, name_or_id, domain_name_or_id=None):
268
323
 
269
324
 
270
325
  def find_user_id_sdk(
271
- identity_client,
272
- name_or_id,
273
- domain_name_or_id=None,
326
+ identity_client: Any,
327
+ name_or_id: str,
328
+ domain_name_or_id: str | None = None,
274
329
  *,
275
- validate_actor_existence=True,
276
- ):
330
+ validate_actor_existence: bool = True,
331
+ ) -> str:
277
332
  if domain_name_or_id is None:
278
333
  return _find_sdk_id(
279
334
  identity_client.find_user,
@@ -294,8 +349,11 @@ def find_user_id_sdk(
294
349
 
295
350
 
296
351
  def _find_identity_resource(
297
- identity_client_manager, name_or_id, resource_type, **kwargs
298
- ):
352
+ identity_client_manager: Any,
353
+ name_or_id: str,
354
+ resource_type: Any,
355
+ **kwargs: Any,
356
+ ) -> Any:
299
357
  """Find a specific identity resource.
300
358
 
301
359
  Using keystoneclient's manager, attempt to find a specific resource by its
@@ -334,8 +392,12 @@ def _find_identity_resource(
334
392
 
335
393
 
336
394
  def _find_sdk_id(
337
- find_command, name_or_id, *, validate_actor_existence=True, **kwargs
338
- ):
395
+ find_command: Callable[..., Any],
396
+ name_or_id: str,
397
+ *,
398
+ validate_actor_existence: bool = True,
399
+ **kwargs: Any,
400
+ ) -> str:
339
401
  try:
340
402
  resource = find_command(
341
403
  name_or_id=name_or_id, ignore_missing=False, **kwargs
@@ -346,10 +408,10 @@ def _find_sdk_id(
346
408
  if not validate_actor_existence:
347
409
  return name_or_id
348
410
  raise exceptions.CommandError from exc
349
- return resource.id
411
+ return cast(str, resource.id)
350
412
 
351
413
 
352
- def add_user_domain_option_to_parser(parser):
414
+ def add_user_domain_option_to_parser(parser: argparse.ArgumentParser) -> None:
353
415
  parser.add_argument(
354
416
  '--user-domain',
355
417
  metavar='<user-domain>',
@@ -361,7 +423,7 @@ def add_user_domain_option_to_parser(parser):
361
423
  )
362
424
 
363
425
 
364
- def add_group_domain_option_to_parser(parser):
426
+ def add_group_domain_option_to_parser(parser: argparse.ArgumentParser) -> None:
365
427
  parser.add_argument(
366
428
  '--group-domain',
367
429
  metavar='<group-domain>',
@@ -373,21 +435,21 @@ def add_group_domain_option_to_parser(parser):
373
435
  )
374
436
 
375
437
 
376
- def add_project_domain_option_to_parser(parser, enhance_help=lambda _h: _h):
438
+ def add_project_domain_option_to_parser(
439
+ parser: argparse.ArgumentParser,
440
+ ) -> None:
377
441
  parser.add_argument(
378
442
  '--project-domain',
379
443
  metavar='<project-domain>',
380
- help=enhance_help(
381
- _(
382
- 'Domain the project belongs to (name or ID). This '
383
- 'can be used in case collisions between project '
384
- 'names exist.'
385
- )
444
+ help=_(
445
+ 'Domain the project belongs to (name or ID). This '
446
+ 'can be used in case collisions between project '
447
+ 'names exist.'
386
448
  ),
387
449
  )
388
450
 
389
451
 
390
- def add_role_domain_option_to_parser(parser):
452
+ def add_role_domain_option_to_parser(parser: argparse.ArgumentParser) -> None:
391
453
  parser.add_argument(
392
454
  '--role-domain',
393
455
  metavar='<role-domain>',
@@ -399,7 +461,7 @@ def add_role_domain_option_to_parser(parser):
399
461
  )
400
462
 
401
463
 
402
- def add_inherited_option_to_parser(parser):
464
+ def add_inherited_option_to_parser(parser: argparse.ArgumentParser) -> None:
403
465
  parser.add_argument(
404
466
  '--inherited',
405
467
  action='store_true',
@@ -410,7 +472,7 @@ def add_inherited_option_to_parser(parser):
410
472
  )
411
473
 
412
474
 
413
- def add_resource_option_to_parser(parser):
475
+ def add_resource_option_to_parser(parser: argparse.ArgumentParser) -> None:
414
476
  immutable_group = parser.add_mutually_exclusive_group()
415
477
  immutable_group.add_argument(
416
478
  '--immutable',
@@ -13,8 +13,10 @@
13
13
 
14
14
  """Identity v2 Service Catalog action implementations"""
15
15
 
16
+ import argparse
17
+ from collections.abc import Iterable, Sequence
16
18
  import logging
17
- import typing as ty
19
+ from typing import Any
18
20
 
19
21
  from cliff import columns as cliff_columns
20
22
  from osc_lib import exceptions
@@ -27,8 +29,8 @@ from openstackclient.i18n import _
27
29
  LOG = logging.getLogger(__name__)
28
30
 
29
31
 
30
- class EndpointsColumn(cliff_columns.FormattableColumn[ty.Any]):
31
- def human_readable(self):
32
+ class EndpointsColumn(cliff_columns.FormattableColumn[Any]):
33
+ def human_readable(self) -> str:
32
34
  if not self._value:
33
35
  return ""
34
36
  ret = ''
@@ -47,7 +49,9 @@ class EndpointsColumn(cliff_columns.FormattableColumn[ty.Any]):
47
49
  class ListCatalog(command.Lister):
48
50
  _description = _("List services in the service catalog")
49
51
 
50
- def take_action(self, parsed_args):
52
+ def take_action(
53
+ self, parsed_args: argparse.Namespace
54
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
51
55
  # Trigger auth if it has not happened yet
52
56
  auth_ref = self.app.client_manager.auth_ref
53
57
  if not auth_ref:
@@ -75,7 +79,7 @@ class ListCatalog(command.Lister):
75
79
  class ShowCatalog(command.ShowOne):
76
80
  _description = _("Display service catalog details")
77
81
 
78
- def get_parser(self, prog_name):
82
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
79
83
  parser = super().get_parser(prog_name)
80
84
  parser.add_argument(
81
85
  'service',
@@ -84,7 +88,9 @@ class ShowCatalog(command.ShowOne):
84
88
  )
85
89
  return parser
86
90
 
87
- def take_action(self, parsed_args):
91
+ def take_action(
92
+ self, parsed_args: argparse.Namespace
93
+ ) -> tuple[Sequence[str], Iterable[Any]]:
88
94
  # Trigger auth if it has not happened yet
89
95
  auth_ref = self.app.client_manager.auth_ref
90
96
  if not auth_ref:
@@ -108,4 +114,5 @@ class ShowCatalog(command.ShowOne):
108
114
  LOG.error(_('service %s not found\n'), parsed_args.service)
109
115
  return ((), ())
110
116
 
111
- return zip(*sorted(data.items()))
117
+ col_headers, col_data = zip(*sorted(data.items()))
118
+ return col_headers, col_data