python-openstackclient 9.0.0__py3-none-any.whl → 10.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. openstackclient/__init__.py +2 -6
  2. openstackclient/api/api.py +41 -23
  3. openstackclient/api/compute_v2.py +44 -25
  4. openstackclient/api/object_store_v1.py +75 -97
  5. openstackclient/api/volume_v2.py +2 -1
  6. openstackclient/api/volume_v3.py +2 -1
  7. openstackclient/common/availability_zone.py +58 -42
  8. openstackclient/common/clientmanager.py +56 -29
  9. openstackclient/common/configuration.py +10 -3
  10. openstackclient/common/envvars.py +2 -2
  11. openstackclient/common/extension.py +14 -5
  12. openstackclient/common/limits.py +10 -5
  13. openstackclient/common/module.py +14 -6
  14. openstackclient/common/pagination.py +8 -2
  15. openstackclient/common/progressbar.py +7 -6
  16. openstackclient/common/project_cleanup.py +13 -7
  17. openstackclient/common/quota.py +97 -99
  18. openstackclient/common/versions.py +8 -2
  19. openstackclient/compute/client.py +7 -3
  20. openstackclient/compute/v2/agent.py +17 -10
  21. openstackclient/compute/v2/aggregate.py +36 -22
  22. openstackclient/compute/v2/console.py +14 -8
  23. openstackclient/compute/v2/console_connection.py +11 -3
  24. openstackclient/compute/v2/flavor.py +39 -21
  25. openstackclient/compute/v2/host.py +14 -6
  26. openstackclient/compute/v2/hypervisor.py +14 -5
  27. openstackclient/compute/v2/hypervisor_stats.py +10 -2
  28. openstackclient/compute/v2/keypair.py +29 -14
  29. openstackclient/compute/v2/server.py +249 -169
  30. openstackclient/compute/v2/server_backup.py +10 -4
  31. openstackclient/compute/v2/server_event.py +21 -12
  32. openstackclient/compute/v2/server_group.py +21 -11
  33. openstackclient/compute/v2/server_image.py +19 -10
  34. openstackclient/compute/v2/server_migration.py +24 -10
  35. openstackclient/compute/v2/server_share.py +274 -0
  36. openstackclient/compute/v2/server_volume.py +10 -4
  37. openstackclient/compute/v2/service.py +14 -7
  38. openstackclient/compute/v2/usage.py +26 -21
  39. openstackclient/identity/client.py +8 -3
  40. openstackclient/identity/common.py +78 -47
  41. openstackclient/identity/v2_0/catalog.py +14 -7
  42. openstackclient/identity/v2_0/ec2creds.py +21 -10
  43. openstackclient/identity/v2_0/endpoint.py +23 -11
  44. openstackclient/identity/v2_0/project.py +25 -14
  45. openstackclient/identity/v2_0/role.py +28 -14
  46. openstackclient/identity/v2_0/role_assignment.py +9 -3
  47. openstackclient/identity/v2_0/service.py +23 -11
  48. openstackclient/identity/v2_0/token.py +12 -5
  49. openstackclient/identity/v2_0/user.py +26 -15
  50. openstackclient/identity/v3/access_rule.py +26 -12
  51. openstackclient/identity/v3/application_credential.py +59 -24
  52. openstackclient/identity/v3/catalog.py +14 -7
  53. openstackclient/identity/v3/consumer.py +22 -11
  54. openstackclient/identity/v3/credential.py +36 -16
  55. openstackclient/identity/v3/domain.py +37 -18
  56. openstackclient/identity/v3/ec2creds.py +25 -12
  57. openstackclient/identity/v3/endpoint.py +42 -20
  58. openstackclient/identity/v3/endpoint_group.py +28 -17
  59. openstackclient/identity/v3/federation_protocol.py +38 -16
  60. openstackclient/identity/v3/group.py +55 -32
  61. openstackclient/identity/v3/identity_provider.py +92 -57
  62. openstackclient/identity/v3/implied_role.py +21 -9
  63. openstackclient/identity/v3/limit.py +38 -16
  64. openstackclient/identity/v3/mapping.py +26 -13
  65. openstackclient/identity/v3/policy.py +23 -12
  66. openstackclient/identity/v3/project.py +43 -23
  67. openstackclient/identity/v3/region.py +36 -16
  68. openstackclient/identity/v3/registered_limit.py +40 -16
  69. openstackclient/identity/v3/role.py +61 -31
  70. openstackclient/identity/v3/role_assignment.py +23 -6
  71. openstackclient/identity/v3/service.py +36 -16
  72. openstackclient/identity/v3/service_provider.py +37 -15
  73. openstackclient/identity/v3/tag.py +23 -6
  74. openstackclient/identity/v3/token.py +30 -14
  75. openstackclient/identity/v3/trust.py +32 -14
  76. openstackclient/identity/v3/unscoped_saml.py +10 -2
  77. openstackclient/identity/v3/user.py +49 -26
  78. openstackclient/image/client.py +7 -3
  79. openstackclient/image/v1/image.py +33 -26
  80. openstackclient/image/v2/cache.py +14 -9
  81. openstackclient/image/v2/image.py +74 -48
  82. openstackclient/image/v2/info.py +7 -1
  83. openstackclient/image/v2/metadef_namespaces.py +109 -13
  84. openstackclient/image/v2/metadef_objects.py +28 -15
  85. openstackclient/image/v2/metadef_properties.py +24 -13
  86. openstackclient/image/v2/metadef_resource_type_association.py +14 -7
  87. openstackclient/image/v2/metadef_resource_types.py +7 -1
  88. openstackclient/image/v2/task.py +15 -6
  89. openstackclient/locale/tr_TR/LC_MESSAGES/openstackclient.po +7 -192
  90. openstackclient/network/client.py +7 -2
  91. openstackclient/network/common.py +16 -241
  92. openstackclient/network/utils.py +36 -22
  93. openstackclient/network/v2/address_group.py +27 -16
  94. openstackclient/network/v2/address_scope.py +24 -13
  95. openstackclient/network/v2/bgpvpn/bgpvpn.py +463 -0
  96. openstackclient/network/v2/bgpvpn/constants.py +30 -0
  97. openstackclient/network/v2/bgpvpn/network_association.py +214 -0
  98. openstackclient/network/v2/bgpvpn/port_association.py +490 -0
  99. openstackclient/network/v2/bgpvpn/router_association.py +288 -0
  100. openstackclient/network/v2/default_security_group_rule.py +19 -10
  101. openstackclient/network/v2/floating_ip.py +110 -159
  102. openstackclient/network/v2/floating_ip_port_forwarding.py +30 -18
  103. openstackclient/network/v2/fwaas/__init__.py +0 -0
  104. openstackclient/network/v2/fwaas/group.py +466 -0
  105. openstackclient/network/v2/fwaas/policy.py +518 -0
  106. openstackclient/network/v2/fwaas/rule.py +574 -0
  107. openstackclient/network/v2/ip_availability.py +13 -5
  108. openstackclient/network/v2/l3_conntrack_helper.py +22 -13
  109. openstackclient/network/v2/local_ip.py +24 -13
  110. openstackclient/network/v2/local_ip_association.py +14 -7
  111. openstackclient/network/v2/ndp_proxy.py +20 -11
  112. openstackclient/network/v2/network.py +129 -196
  113. openstackclient/network/v2/network_agent.py +46 -25
  114. openstackclient/network/v2/network_auto_allocated_topology.py +22 -11
  115. openstackclient/network/v2/network_flavor.py +27 -16
  116. openstackclient/network/v2/network_flavor_profile.py +23 -12
  117. openstackclient/network/v2/network_meter.py +21 -10
  118. openstackclient/network/v2/network_meter_rule.py +21 -11
  119. openstackclient/network/v2/network_qos_policy.py +25 -15
  120. openstackclient/network/v2/network_qos_rule.py +32 -17
  121. openstackclient/network/v2/network_qos_rule_type.py +13 -5
  122. openstackclient/network/v2/network_rbac.py +23 -12
  123. openstackclient/network/v2/network_segment.py +20 -11
  124. openstackclient/network/v2/network_segment_range.py +56 -29
  125. openstackclient/network/v2/network_service_provider.py +7 -1
  126. openstackclient/network/v2/network_trunk.py +38 -22
  127. openstackclient/network/v2/port.py +54 -29
  128. openstackclient/network/v2/router.py +75 -52
  129. openstackclient/network/v2/security_group.py +87 -157
  130. openstackclient/network/v2/security_group_rule.py +100 -280
  131. openstackclient/network/v2/subnet.py +49 -28
  132. openstackclient/network/v2/subnet_pool.py +30 -17
  133. openstackclient/network/v2/taas/tap_flow.py +22 -11
  134. openstackclient/network/v2/taas/tap_mirror.py +22 -11
  135. openstackclient/network/v2/taas/tap_service.py +23 -12
  136. openstackclient/object/client.py +7 -2
  137. openstackclient/object/v1/account.py +13 -6
  138. openstackclient/object/v1/container.py +25 -15
  139. openstackclient/object/v1/object.py +25 -15
  140. openstackclient/py.typed +0 -0
  141. openstackclient/shell.py +46 -10
  142. openstackclient/tests/functional/base.py +55 -20
  143. openstackclient/tests/functional/common/test_extension.py +4 -0
  144. openstackclient/tests/functional/common/test_quota.py +3 -1
  145. openstackclient/tests/functional/compute/v2/common.py +14 -13
  146. openstackclient/tests/functional/compute/v2/test_flavor.py +3 -1
  147. openstackclient/tests/functional/compute/v2/test_server.py +3 -0
  148. openstackclient/tests/functional/identity/v2/common.py +10 -6
  149. openstackclient/tests/functional/identity/v2/test_role.py +4 -4
  150. openstackclient/tests/functional/identity/v3/common.py +25 -19
  151. openstackclient/tests/functional/identity/v3/test_group.py +20 -20
  152. openstackclient/tests/functional/identity/v3/test_idp.py +3 -1
  153. openstackclient/tests/functional/identity/v3/test_project.py +10 -10
  154. openstackclient/tests/functional/identity/v3/test_role.py +18 -18
  155. openstackclient/tests/functional/identity/v3/test_role_assignment.py +12 -12
  156. openstackclient/tests/functional/identity/v3/test_user.py +8 -8
  157. openstackclient/tests/functional/image/base.py +1 -6
  158. openstackclient/tests/functional/network/v2/common.py +5 -2
  159. openstackclient/tests/functional/network/v2/test_floating_ip.py +10 -4
  160. openstackclient/tests/functional/network/v2/test_ip_availability.py +4 -0
  161. openstackclient/tests/functional/network/v2/test_network_meter_rule.py +3 -2
  162. openstackclient/tests/functional/network/v2/test_network_segment.py +5 -0
  163. openstackclient/tests/functional/network/v2/test_subnet.py +13 -9
  164. openstackclient/tests/functional/object/v1/common.py +4 -0
  165. openstackclient/tests/functional/volume/v2/common.py +4 -0
  166. openstackclient/tests/functional/volume/v2/test_volume_snapshot.py +27 -11
  167. openstackclient/tests/functional/volume/v2/test_volume_type.py +2 -2
  168. openstackclient/tests/functional/volume/v3/common.py +4 -0
  169. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +11 -7
  170. openstackclient/tests/functional/volume/v3/test_volume_type.py +2 -2
  171. openstackclient/tests/unit/common/test_availability_zone.py +35 -49
  172. openstackclient/tests/unit/common/test_extension.py +2 -2
  173. openstackclient/tests/unit/common/test_module.py +12 -7
  174. openstackclient/tests/unit/common/test_project_cleanup.py +3 -1
  175. openstackclient/tests/unit/common/test_quota.py +6 -26
  176. openstackclient/tests/unit/compute/v2/fakes.py +25 -0
  177. openstackclient/tests/unit/compute/v2/test_flavor.py +28 -2
  178. openstackclient/tests/unit/compute/v2/test_keypair.py +6 -6
  179. openstackclient/tests/unit/compute/v2/test_server.py +11 -96
  180. openstackclient/tests/unit/compute/v2/test_server_share.py +287 -0
  181. openstackclient/tests/unit/identity/v3/fakes.py +3 -0
  182. openstackclient/tests/unit/identity/v3/test_group.py +4 -14
  183. openstackclient/tests/unit/identity/v3/test_identity_provider.py +303 -299
  184. openstackclient/tests/unit/identity/v3/test_user.py +4 -4
  185. openstackclient/tests/unit/image/v2/test_image.py +11 -11
  186. openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +105 -6
  187. openstackclient/tests/unit/network/test_common.py +0 -155
  188. openstackclient/tests/unit/network/v2/bgpvpn/__init__.py +0 -0
  189. openstackclient/tests/unit/network/v2/bgpvpn/fakes.py +179 -0
  190. openstackclient/tests/unit/network/v2/bgpvpn/test_bgpvpn.py +584 -0
  191. openstackclient/tests/unit/network/v2/bgpvpn/test_network_association.py +285 -0
  192. openstackclient/tests/unit/network/v2/bgpvpn/test_port_association.py +384 -0
  193. openstackclient/tests/unit/network/v2/bgpvpn/test_router_association.py +297 -0
  194. openstackclient/tests/unit/network/v2/fwaas/__init__.py +0 -0
  195. openstackclient/tests/unit/network/v2/fwaas/test_group.py +897 -0
  196. openstackclient/tests/unit/network/v2/fwaas/test_policy.py +869 -0
  197. openstackclient/tests/unit/network/v2/fwaas/test_rule.py +980 -0
  198. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_flow.py → test_tap_flow.py} +18 -25
  199. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_mirror.py → test_tap_mirror.py} +19 -29
  200. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_service.py → test_tap_service.py} +19 -29
  201. openstackclient/tests/unit/network/v2/test_address_group.py +2 -2
  202. openstackclient/tests/unit/network/v2/{test_floating_ip_network.py → test_floating_ip.py} +3 -2
  203. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +13 -13
  204. openstackclient/tests/unit/network/v2/test_network_agent.py +8 -4
  205. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +3 -3
  206. openstackclient/tests/unit/network/v2/test_network_flavor.py +2 -2
  207. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +1 -1
  208. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +2 -2
  209. openstackclient/tests/unit/network/v2/test_network_rbac.py +1 -1
  210. openstackclient/tests/unit/network/v2/test_network_segment.py +1 -1
  211. openstackclient/tests/unit/network/v2/test_network_segment_range.py +7 -10
  212. openstackclient/tests/unit/network/v2/test_network_trunk.py +1 -1
  213. openstackclient/tests/unit/network/v2/test_router.py +8 -9
  214. openstackclient/tests/unit/network/v2/{test_security_group_network.py → test_security_group.py} +1 -20
  215. openstackclient/tests/unit/network/v2/{test_security_group_rule_network.py → test_security_group_rule.py} +7 -41
  216. openstackclient/tests/unit/network/v2/test_subnet.py +2 -1
  217. openstackclient/tests/unit/network/v2/test_subnet_pool.py +2 -1
  218. openstackclient/tests/unit/object/v1/fakes.py +8 -7
  219. openstackclient/tests/unit/object/v1/test_container.py +65 -101
  220. openstackclient/tests/unit/object/v1/test_container_all.py +8 -1
  221. openstackclient/tests/unit/object/v1/test_object.py +44 -84
  222. openstackclient/tests/unit/object/v1/test_object_all.py +8 -1
  223. openstackclient/tests/unit/test_hacking.py +108 -0
  224. openstackclient/tests/unit/volume/v2/fakes.py +1 -0
  225. openstackclient/tests/unit/volume/v2/test_volume_backup.py +1 -5
  226. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +2 -1
  227. openstackclient/tests/unit/volume/v2/test_volume_type.py +2 -4
  228. openstackclient/tests/unit/volume/v3/fakes.py +1 -0
  229. openstackclient/tests/unit/volume/v3/test_volume.py +60 -3
  230. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
  231. openstackclient/tests/unit/volume/v3/test_volume_backup.py +1 -5
  232. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +55 -1
  233. openstackclient/tests/unit/volume/v3/test_volume_type.py +2 -4
  234. openstackclient/volume/client.py +7 -3
  235. openstackclient/volume/v2/backup_record.py +15 -6
  236. openstackclient/volume/v2/consistency_group.py +29 -17
  237. openstackclient/volume/v2/consistency_group_snapshot.py +25 -10
  238. openstackclient/volume/v2/qos_specs.py +28 -17
  239. openstackclient/volume/v2/service.py +17 -6
  240. openstackclient/volume/v2/volume.py +57 -29
  241. openstackclient/volume/v2/volume_backend.py +19 -6
  242. openstackclient/volume/v2/volume_backup.py +46 -20
  243. openstackclient/volume/v2/volume_host.py +6 -4
  244. openstackclient/volume/v2/volume_snapshot.py +50 -24
  245. openstackclient/volume/v2/volume_transfer_request.py +31 -13
  246. openstackclient/volume/v2/volume_type.py +43 -24
  247. openstackclient/volume/v3/block_storage_cleanup.py +11 -3
  248. openstackclient/volume/v3/block_storage_cluster.py +19 -7
  249. openstackclient/volume/v3/block_storage_log_level.py +15 -6
  250. openstackclient/volume/v3/block_storage_manage.py +10 -4
  251. openstackclient/volume/v3/block_storage_resource_filter.py +17 -5
  252. openstackclient/volume/v3/service.py +16 -6
  253. openstackclient/volume/v3/volume.py +89 -39
  254. openstackclient/volume/v3/volume_attachment.py +43 -21
  255. openstackclient/volume/v3/volume_backup.py +53 -24
  256. openstackclient/volume/v3/volume_group.py +23 -13
  257. openstackclient/volume/v3/volume_group_snapshot.py +32 -13
  258. openstackclient/volume/v3/volume_group_type.py +26 -13
  259. openstackclient/volume/v3/volume_message.py +15 -7
  260. openstackclient/volume/v3/volume_snapshot.py +69 -32
  261. openstackclient/volume/v3/volume_transfer_request.py +31 -13
  262. openstackclient/volume/v3/volume_type.py +42 -24
  263. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/METADATA +6 -6
  264. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/RECORD +271 -260
  265. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/WHEEL +1 -1
  266. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/entry_points.txt +53 -1
  267. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/AUTHORS +4 -0
  268. python_openstackclient-10.0.0.dist-info/pbr.json +1 -0
  269. openstackclient/api/image_v1.py +0 -69
  270. openstackclient/api/image_v2.py +0 -79
  271. openstackclient/network/v2/floating_ip_pool.py +0 -38
  272. openstackclient/tests/functional/image/v1/test_image.py +0 -97
  273. openstackclient/tests/unit/api/test_image_v1.py +0 -96
  274. openstackclient/tests/unit/api/test_image_v2.py +0 -96
  275. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +0 -248
  276. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +0 -49
  277. openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +0 -39
  278. openstackclient/tests/unit/network/v2/test_network_compute.py +0 -404
  279. openstackclient/tests/unit/network/v2/test_security_group_compute.py +0 -392
  280. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +0 -555
  281. python_openstackclient-9.0.0.dist-info/pbr.json +0 -1
  282. /openstackclient/{tests/functional/image/v1 → network/v2/bgpvpn}/__init__.py +0 -0
  283. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/LICENSE +0 -0
  284. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.0.0.dist-info}/top_level.txt +0 -0
@@ -15,7 +15,10 @@
15
15
 
16
16
  """Compute v2 Server action implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable, Sequence
18
20
  import importlib
21
+ from typing import Any
19
22
 
20
23
  from osc_lib import exceptions
21
24
  from osc_lib import utils
@@ -32,7 +35,7 @@ class CreateServerBackup(command.ShowOne):
32
35
  "2": "openstackclient.image.v2.image",
33
36
  }
34
37
 
35
- def get_parser(self, prog_name):
38
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
36
39
  parser = super().get_parser(prog_name)
37
40
  parser.add_argument(
38
41
  'server',
@@ -65,8 +68,10 @@ class CreateServerBackup(command.ShowOne):
65
68
  )
66
69
  return parser
67
70
 
68
- def take_action(self, parsed_args):
69
- def _show_progress(progress):
71
+ def take_action(
72
+ self, parsed_args: argparse.Namespace
73
+ ) -> tuple[Sequence[str], Iterable[Any]]:
74
+ def _show_progress(progress: int | None) -> None:
70
75
  if progress:
71
76
  self.app.stderr.write(f'\rProgress: {progress}')
72
77
  self.app.stderr.flush()
@@ -124,4 +129,5 @@ class CreateServerBackup(command.ShowOne):
124
129
  ]
125
130
  )
126
131
  info = image_module._format_image(image)
127
- return zip(*sorted(info.items()))
132
+ col_headers, col_data = zip(*sorted(info.items()))
133
+ return col_headers, col_data
@@ -15,7 +15,10 @@
15
15
 
16
16
  """Compute v2 Server operation event implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable, Sequence
18
20
  import logging
21
+ from typing import Any
19
22
  import uuid
20
23
 
21
24
  from cliff import columns
@@ -34,7 +37,7 @@ LOG = logging.getLogger(__name__)
34
37
 
35
38
  # TODO(stephenfin): Move this to osc_lib since it's useful elsewhere (e.g.
36
39
  # glance)
37
- def is_uuid_like(value) -> bool:
40
+ def is_uuid_like(value: str) -> bool:
38
41
  """Returns validation of a value as a UUID.
39
42
 
40
43
  :param val: Value to verify
@@ -57,14 +60,14 @@ def is_uuid_like(value) -> bool:
57
60
  return False
58
61
 
59
62
 
60
- class ServerActionEventColumn(columns.FormattableColumn):
63
+ class ServerActionEventColumn(columns.FormattableColumn[Any]):
61
64
  """Custom formatter for server action events.
62
65
 
63
66
  Format the :class:`~openstack.compute.v2.server_action.ServerActionEvent`
64
67
  objects as we'd like.
65
68
  """
66
69
 
67
- def _format_event(self, event):
70
+ def _format_event(self, event: Any) -> dict[str, Any]:
68
71
  hidden_columns = ['id', 'name', 'location']
69
72
  _, columns = utils.get_osc_show_columns_for_sdk_resource(
70
73
  event, {}, hidden_columns
@@ -72,17 +75,19 @@ class ServerActionEventColumn(columns.FormattableColumn):
72
75
  data = utils.get_item_properties(event, columns)
73
76
  return dict(zip(columns, data))
74
77
 
75
- def human_readable(self):
78
+ def human_readable(self) -> str:
76
79
  events = [self._format_event(event) for event in self._value]
77
- return utils.format_list_of_dicts(events)
80
+ return utils.format_list_of_dicts(events) or ""
78
81
 
79
- def machine_readable(self):
82
+ def machine_readable(self) -> Any:
80
83
  events = [self._format_event(event) for event in self._value]
81
84
  return events
82
85
 
83
86
 
84
- def _get_server_event_columns(item, client):
85
- hidden_columns = ['name', 'server_id', 'links', 'location', 'finish_time']
87
+ def _get_server_event_columns(
88
+ item: Any, client: Any
89
+ ) -> tuple[tuple[str, ...], tuple[str, ...]]:
90
+ hidden_columns = ['name', 'server_id', 'links', 'location']
86
91
 
87
92
  if not sdk_utils.supports_microversion(client, '2.58'):
88
93
  # updated_at was introduced in 2.58
@@ -100,7 +105,7 @@ class ListServerEvent(command.Lister):
100
105
  deleted server, specified by ID only.
101
106
  """
102
107
 
103
- def get_parser(self, prog_name):
108
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
104
109
  parser = super().get_parser(prog_name)
105
110
  parser.add_argument(
106
111
  'server',
@@ -138,7 +143,9 @@ class ListServerEvent(command.Lister):
138
143
  pagination.add_marker_pagination_option_to_parser(parser)
139
144
  return parser
140
145
 
141
- def take_action(self, parsed_args):
146
+ def take_action(
147
+ self, parsed_args: argparse.Namespace
148
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
142
149
  compute_client = self.app.client_manager.compute
143
150
 
144
151
  kwargs = {}
@@ -251,7 +258,7 @@ class ShowServerEvent(command.ShowOne):
251
258
  non-admin users.
252
259
  """
253
260
 
254
- def get_parser(self, prog_name):
261
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
255
262
  parser = super().get_parser(prog_name)
256
263
  parser.add_argument(
257
264
  'server',
@@ -265,7 +272,9 @@ class ShowServerEvent(command.ShowOne):
265
272
  )
266
273
  return parser
267
274
 
268
- def take_action(self, parsed_args):
275
+ def take_action(
276
+ self, parsed_args: argparse.Namespace
277
+ ) -> tuple[Sequence[str], Iterable[Any]]:
269
278
  compute_client = self.app.client_manager.compute
270
279
 
271
280
  try:
@@ -15,8 +15,10 @@
15
15
 
16
16
  """Compute v2 Server Group action implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable, Sequence
18
20
  import logging
19
- import typing as ty
21
+ from typing import Any
20
22
 
21
23
  from cliff import columns
22
24
  from openstack import utils as sdk_utils
@@ -32,14 +34,16 @@ from openstackclient.i18n import _
32
34
  LOG = logging.getLogger(__name__)
33
35
 
34
36
 
35
- _formatters: dict[str, type[columns.FormattableColumn[ty.Any]]] = {
37
+ _formatters: dict[str, type[columns.FormattableColumn[Any]]] = {
36
38
  'member_ids': format_columns.ListColumn,
37
39
  'policies': format_columns.ListColumn,
38
40
  'rules': format_columns.DictColumn,
39
41
  }
40
42
 
41
43
 
42
- def _get_server_group_columns(item, client):
44
+ def _get_server_group_columns(
45
+ item: Any, client: Any
46
+ ) -> tuple[tuple[str, ...], tuple[str, ...]]:
43
47
  column_map = {'member_ids': 'members'}
44
48
  hidden_columns = ['metadata', 'location']
45
49
 
@@ -57,7 +61,7 @@ def _get_server_group_columns(item, client):
57
61
  class CreateServerGroup(command.ShowOne):
58
62
  _description = _("Create a new server group.")
59
63
 
60
- def get_parser(self, prog_name):
64
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
61
65
  parser = super().get_parser(prog_name)
62
66
  parser.add_argument(
63
67
  'name',
@@ -94,7 +98,9 @@ class CreateServerGroup(command.ShowOne):
94
98
  )
95
99
  return parser
96
100
 
97
- def take_action(self, parsed_args):
101
+ def take_action(
102
+ self, parsed_args: argparse.Namespace
103
+ ) -> tuple[Sequence[str], Iterable[Any]]:
98
104
  compute_client = self.app.client_manager.compute
99
105
 
100
106
  if parsed_args.policy in ('soft-affinity', 'soft-anti-affinity'):
@@ -144,7 +150,7 @@ class CreateServerGroup(command.ShowOne):
144
150
  class DeleteServerGroup(command.Command):
145
151
  _description = _("Delete existing server group(s).")
146
152
 
147
- def get_parser(self, prog_name):
153
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
148
154
  parser = super().get_parser(prog_name)
149
155
  parser.add_argument(
150
156
  'server_group',
@@ -154,7 +160,7 @@ class DeleteServerGroup(command.Command):
154
160
  )
155
161
  return parser
156
162
 
157
- def take_action(self, parsed_args):
163
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
158
164
  compute_client = self.app.client_manager.compute
159
165
  result = 0
160
166
  for group in parsed_args.server_group:
@@ -179,7 +185,7 @@ class DeleteServerGroup(command.Command):
179
185
  class ListServerGroup(command.Lister):
180
186
  _description = _("List all server groups.")
181
187
 
182
- def get_parser(self, prog_name):
188
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
183
189
  parser = super().get_parser(prog_name)
184
190
  parser.add_argument(
185
191
  '--all-projects',
@@ -198,7 +204,9 @@ class ListServerGroup(command.Lister):
198
204
  pagination.add_offset_pagination_option_to_parser(parser)
199
205
  return parser
200
206
 
201
- def take_action(self, parsed_args):
207
+ def take_action(
208
+ self, parsed_args: argparse.Namespace
209
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
202
210
  compute_client = self.app.client_manager.compute
203
211
 
204
212
  kwargs = {}
@@ -256,7 +264,7 @@ class ListServerGroup(command.Lister):
256
264
  class ShowServerGroup(command.ShowOne):
257
265
  _description = _("Display server group details.")
258
266
 
259
- def get_parser(self, prog_name):
267
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
260
268
  parser = super().get_parser(prog_name)
261
269
  parser.add_argument(
262
270
  'server_group',
@@ -265,7 +273,9 @@ class ShowServerGroup(command.ShowOne):
265
273
  )
266
274
  return parser
267
275
 
268
- def take_action(self, parsed_args):
276
+ def take_action(
277
+ self, parsed_args: argparse.Namespace
278
+ ) -> tuple[Sequence[str], Iterable[Any]]:
269
279
  compute_client = self.app.client_manager.compute
270
280
  group = compute_client.find_server_group(
271
281
  parsed_args.server_group, ignore_missing=False
@@ -15,8 +15,11 @@
15
15
 
16
16
  """Compute v2 Server action implementations"""
17
17
 
18
+ import argparse
19
+ from collections.abc import Iterable, Sequence
18
20
  import importlib
19
21
  import logging
22
+ from typing import Any
20
23
 
21
24
  from osc_lib.cli import parseractions
22
25
  from osc_lib import exceptions
@@ -37,7 +40,7 @@ class CreateServerImage(command.ShowOne):
37
40
  "2": "openstackclient.image.v2.image",
38
41
  }
39
42
 
40
- def get_parser(self, prog_name):
43
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
41
44
  parser = super().get_parser(prog_name)
42
45
  parser.add_argument(
43
46
  'server',
@@ -66,8 +69,10 @@ class CreateServerImage(command.ShowOne):
66
69
  )
67
70
  return parser
68
71
 
69
- def take_action(self, parsed_args):
70
- def _show_progress(progress):
72
+ def take_action(
73
+ self, parsed_args: argparse.Namespace
74
+ ) -> tuple[Sequence[str], Iterable[Any]]:
75
+ def _show_progress(progress: int | None) -> None:
71
76
  if progress:
72
77
  self.app.stdout.write(f'\rProgress: {progress}')
73
78
  self.app.stdout.flush()
@@ -85,11 +90,16 @@ class CreateServerImage(command.ShowOne):
85
90
  else:
86
91
  image_name = server.name
87
92
 
88
- image_id = compute_client.create_server_image(
93
+ image = compute_client.create_server_image(
89
94
  server.id,
90
95
  image_name,
91
96
  parsed_args.properties,
92
- ).id
97
+ )
98
+ if not image:
99
+ msg = _('Error creating server image: %s')
100
+ raise exceptions.CommandError(msg, parsed_args.server)
101
+
102
+ image_id = image.id
93
103
 
94
104
  if parsed_args.wait:
95
105
  if utils.wait_for_status(
@@ -99,10 +109,8 @@ class CreateServerImage(command.ShowOne):
99
109
  ):
100
110
  self.app.stdout.write('\n')
101
111
  else:
102
- LOG.error(
103
- _('Error creating server image: %s'), parsed_args.server
104
- )
105
- raise exceptions.CommandError
112
+ msg = _('Error creating server image: %s')
113
+ raise exceptions.CommandError(msg, parsed_args.server)
106
114
 
107
115
  image = image_client.find_image(image_id, ignore_missing=False)
108
116
 
@@ -119,4 +127,5 @@ class CreateServerImage(command.ShowOne):
119
127
  )
120
128
  info = image_module._format_image(image)
121
129
 
122
- return zip(*sorted(info.items()))
130
+ col_headers, col_data = zip(*sorted(info.items()))
131
+ return col_headers, col_data
@@ -12,6 +12,9 @@
12
12
 
13
13
  """Compute v2 Server Migration action implementations"""
14
14
 
15
+ import argparse
16
+ from collections.abc import Iterable, Sequence
17
+ from typing import Any
15
18
  import uuid
16
19
 
17
20
  from openstack import utils as sdk_utils
@@ -27,7 +30,7 @@ from openstackclient.identity import common as identity_common
27
30
  class ListMigration(command.Lister):
28
31
  _description = _("""List server migrations""")
29
32
 
30
- def get_parser(self, prog_name):
33
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
31
34
  parser = super().get_parser(prog_name)
32
35
  parser.add_argument(
33
36
  '--server',
@@ -98,7 +101,12 @@ class ListMigration(command.Lister):
98
101
  identity_common.add_user_domain_option_to_parser(parser)
99
102
  return parser
100
103
 
101
- def print_migrations(self, parsed_args, compute_client, migrations):
104
+ def print_migrations(
105
+ self,
106
+ parsed_args: argparse.Namespace,
107
+ compute_client: Any,
108
+ migrations: Any,
109
+ ) -> tuple[list[str], Iterable[tuple[Any, ...]]]:
102
110
  column_headers = [
103
111
  'Source Node',
104
112
  'Dest Node',
@@ -153,7 +161,9 @@ class ListMigration(command.Lister):
153
161
  (utils.get_item_properties(mig, columns) for mig in migrations),
154
162
  )
155
163
 
156
- def take_action(self, parsed_args):
164
+ def take_action(
165
+ self, parsed_args: argparse.Namespace
166
+ ) -> tuple[list[str], Iterable[tuple[Any, ...]]]:
157
167
  compute_client = self.app.client_manager.compute
158
168
  identity_client = self.app.client_manager.identity
159
169
 
@@ -248,7 +258,9 @@ class ListMigration(command.Lister):
248
258
  return self.print_migrations(parsed_args, compute_client, migrations)
249
259
 
250
260
 
251
- def _get_migration_by_uuid(compute_client, server_id, migration_uuid):
261
+ def _get_migration_by_uuid(
262
+ compute_client: Any, server_id: str, migration_uuid: str
263
+ ) -> Any:
252
264
  for migration in compute_client.server_migrations(server_id):
253
265
  if migration.uuid == migration_uuid:
254
266
  return migration
@@ -274,7 +286,7 @@ class ShowMigration(command.ShowOne):
274
286
  these.
275
287
  """
276
288
 
277
- def get_parser(self, prog_name):
289
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
278
290
  parser = super().get_parser(prog_name)
279
291
  parser.add_argument(
280
292
  'server',
@@ -288,7 +300,9 @@ class ShowMigration(command.ShowOne):
288
300
  )
289
301
  return parser
290
302
 
291
- def take_action(self, parsed_args):
303
+ def take_action(
304
+ self, parsed_args: argparse.Namespace
305
+ ) -> tuple[Sequence[str], Iterable[Any]]:
292
306
  compute_client = self.app.client_manager.compute
293
307
 
294
308
  if not sdk_utils.supports_microversion(compute_client, '2.24'):
@@ -389,7 +403,7 @@ class AbortMigration(command.Command):
389
403
  This command requires ``--os-compute-api-version`` 2.24 or greater.
390
404
  """
391
405
 
392
- def get_parser(self, prog_name):
406
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
393
407
  parser = super().get_parser(prog_name)
394
408
  parser.add_argument(
395
409
  'server',
@@ -403,7 +417,7 @@ class AbortMigration(command.Command):
403
417
  )
404
418
  return parser
405
419
 
406
- def take_action(self, parsed_args):
420
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
407
421
  compute_client = self.app.client_manager.compute
408
422
 
409
423
  if not sdk_utils.supports_microversion(compute_client, '2.24'):
@@ -456,7 +470,7 @@ class ForceCompleteMigration(command.Command):
456
470
  This command requires ``--os-compute-api-version`` 2.22 or greater.
457
471
  """
458
472
 
459
- def get_parser(self, prog_name):
473
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
460
474
  parser = super().get_parser(prog_name)
461
475
  parser.add_argument(
462
476
  'server',
@@ -468,7 +482,7 @@ class ForceCompleteMigration(command.Command):
468
482
  )
469
483
  return parser
470
484
 
471
- def take_action(self, parsed_args):
485
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
472
486
  compute_client = self.app.client_manager.compute
473
487
 
474
488
  if not sdk_utils.supports_microversion(compute_client, '2.22'):
@@ -0,0 +1,274 @@
1
+ # Copyright 2020, Red Hat Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may
4
+ # not use this file except in compliance with the License. You may obtain
5
+ # a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
+ # License for the specific language governing permissions and limitations
13
+ # under the License.
14
+
15
+ """Compute v2 Server action implementations"""
16
+
17
+ import argparse
18
+ from collections.abc import Iterable, Sequence
19
+ from typing import Any
20
+
21
+ from openstack import utils as sdk_utils
22
+ from osc_lib import exceptions
23
+ from osc_lib import utils
24
+
25
+ from openstackclient import command
26
+ from openstackclient.i18n import _
27
+
28
+
29
+ def _get_server_share_columns(
30
+ item: Any,
31
+ ) -> tuple[tuple[str, ...], tuple[str, ...]]:
32
+ # Non admin cannot see uuid and export location, so hide them
33
+ if item.uuid is None:
34
+ column_map = {
35
+ 'share_id': 'Share ID',
36
+ 'status': 'Status',
37
+ 'tag': 'Tag',
38
+ }
39
+ hidden_columns = [
40
+ 'id',
41
+ 'location',
42
+ 'name',
43
+ 'uuid',
44
+ 'export_location',
45
+ 'share_proto',
46
+ ]
47
+ else:
48
+ column_map = {
49
+ 'uuid': 'UUID',
50
+ 'share_id': 'Share ID',
51
+ 'status': 'Status',
52
+ 'tag': 'Tag',
53
+ 'export_location': 'Export Location',
54
+ }
55
+ hidden_columns = ['id', 'location', 'name', 'share_proto']
56
+
57
+ return utils.get_osc_show_columns_for_sdk_resource(
58
+ item, column_map, hidden_columns
59
+ )
60
+
61
+
62
+ class ListServerShare(command.Lister):
63
+ """List all the shares attached to a server.
64
+
65
+ Requires ``--os-compute-api-version 2.97`` or later.
66
+ """
67
+
68
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
69
+ parser = super().get_parser(prog_name)
70
+ parser.add_argument(
71
+ 'server',
72
+ metavar='<server>',
73
+ help=_('Server to list share mapping for (name or ID)'),
74
+ )
75
+ return parser
76
+
77
+ def take_action(
78
+ self, parsed_args: argparse.Namespace
79
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
80
+ compute_client = self.app.client_manager.compute
81
+
82
+ if not sdk_utils.supports_microversion(compute_client, '2.97'):
83
+ msg = _(
84
+ '--os-compute-api-version 2.97 or greater is required '
85
+ 'to support share attachments'
86
+ )
87
+ raise exceptions.CommandError(msg)
88
+
89
+ server = compute_client.find_server(
90
+ parsed_args.server,
91
+ ignore_missing=False,
92
+ )
93
+ shares = compute_client.share_attachments(server)
94
+
95
+ columns = (
96
+ 'share_id',
97
+ 'status',
98
+ 'tag',
99
+ )
100
+ column_headers = (
101
+ 'Share ID',
102
+ 'Status',
103
+ 'Tag',
104
+ )
105
+
106
+ return (
107
+ column_headers,
108
+ (utils.get_item_properties(s, columns) for s in shares),
109
+ )
110
+
111
+
112
+ class ShowServerShare(command.ShowOne):
113
+ """Show detail of a share attachment to a server.
114
+
115
+ Requires ``--os-compute-api-version 2.97`` or later.
116
+ """
117
+
118
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
119
+ parser = super().get_parser(prog_name)
120
+ parser.add_argument(
121
+ 'server',
122
+ metavar='<server>',
123
+ help=_('Server to show share mapping for (name or ID)'),
124
+ )
125
+ parser.add_argument(
126
+ 'share',
127
+ metavar='<share>',
128
+ help=_('Share to show details for (name or ID)'),
129
+ )
130
+ return parser
131
+
132
+ def take_action(
133
+ self, parsed_args: argparse.Namespace
134
+ ) -> tuple[Sequence[str], Iterable[Any]]:
135
+ compute_client = self.app.client_manager.compute
136
+ shared_file_system_client = (
137
+ self.app.client_manager.sdk_connection.shared_file_system
138
+ )
139
+
140
+ if not sdk_utils.supports_microversion(compute_client, '2.97'):
141
+ msg = _(
142
+ '--os-compute-api-version 2.97 or greater is required '
143
+ 'to support share attachments'
144
+ )
145
+ raise exceptions.CommandError(msg)
146
+
147
+ server = compute_client.find_server(
148
+ parsed_args.server,
149
+ ignore_missing=False,
150
+ )
151
+ share = shared_file_system_client.find_share(
152
+ parsed_args.share,
153
+ ignore_missing=False,
154
+ )
155
+ share_attachment = compute_client.get_share_attachment(
156
+ server, share.id
157
+ )
158
+
159
+ display_columns, columns = _get_server_share_columns(
160
+ share_attachment,
161
+ )
162
+ data = utils.get_item_properties(share_attachment, columns)
163
+ return display_columns, data
164
+
165
+
166
+ class AddServerShare(command.ShowOne):
167
+ """Add a share to a server.
168
+
169
+ Requires ``--os-compute-api-version 2.97`` or later.
170
+ """
171
+
172
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
173
+ parser = super().get_parser(prog_name)
174
+ parser.add_argument(
175
+ 'server',
176
+ metavar='<server>',
177
+ help=_('Server to add share to (name or ID)'),
178
+ )
179
+ parser.add_argument(
180
+ 'share',
181
+ metavar='<share>',
182
+ help=_('Share to add (name or ID)'),
183
+ )
184
+ parser.add_argument(
185
+ '--tag',
186
+ metavar='<tag>',
187
+ help=_(
188
+ 'Optional tag used to mount the share, '
189
+ 'if not provided the share uuid is used as tag by default'
190
+ ),
191
+ )
192
+ return parser
193
+
194
+ def take_action(
195
+ self, parsed_args: argparse.Namespace
196
+ ) -> tuple[Sequence[str], Iterable[Any]]:
197
+ compute_client = self.app.client_manager.compute
198
+ shared_file_system_client = (
199
+ self.app.client_manager.sdk_connection.shared_file_system
200
+ )
201
+
202
+ if not sdk_utils.supports_microversion(compute_client, '2.97'):
203
+ msg = _(
204
+ '--os-compute-api-version 2.97 or greater is required '
205
+ 'to support share attachments'
206
+ )
207
+ raise exceptions.CommandError(msg)
208
+
209
+ server = compute_client.find_server(
210
+ parsed_args.server,
211
+ ignore_missing=False,
212
+ )
213
+ share = shared_file_system_client.find_share(
214
+ parsed_args.share,
215
+ ignore_missing=False,
216
+ )
217
+
218
+ kwargs: dict[str, Any] = {}
219
+ if parsed_args.tag:
220
+ kwargs['tag'] = parsed_args.tag
221
+
222
+ share_attachment = compute_client.create_share_attachment(
223
+ server, share.id, **kwargs
224
+ )
225
+
226
+ display_columns, columns = _get_server_share_columns(
227
+ share_attachment,
228
+ )
229
+ data = utils.get_item_properties(share_attachment, columns)
230
+ return display_columns, data
231
+
232
+
233
+ class RemoveServerShare(command.Command):
234
+ """Remove a share from a server.
235
+
236
+ Requires ``--os-compute-api-version 2.97`` or later.
237
+ """
238
+
239
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
240
+ parser = super().get_parser(prog_name)
241
+ parser.add_argument(
242
+ 'server',
243
+ metavar='<server>',
244
+ help=_('Server to remove share from (name or ID)'),
245
+ )
246
+ parser.add_argument(
247
+ 'share',
248
+ metavar='<share>',
249
+ help=_('Share to remove (name or ID)'),
250
+ )
251
+ return parser
252
+
253
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
254
+ compute_client = self.app.client_manager.compute
255
+ shared_file_system_client = (
256
+ self.app.client_manager.sdk_connection.shared_file_system
257
+ )
258
+
259
+ if not sdk_utils.supports_microversion(compute_client, '2.97'):
260
+ msg = _(
261
+ '--os-compute-api-version 2.97 or greater is required '
262
+ 'to support share attachments'
263
+ )
264
+ raise exceptions.CommandError(msg)
265
+
266
+ server = compute_client.find_server(
267
+ parsed_args.server,
268
+ ignore_missing=False,
269
+ )
270
+ share = shared_file_system_client.find_share(
271
+ parsed_args.share,
272
+ ignore_missing=False,
273
+ )
274
+ compute_client.delete_share_attachment(server, share.id)