python-openstackclient 9.0.0__py3-none-any.whl → 10.1.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 (352) 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 +59 -43
  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 +36 -34
  14. openstackclient/common/pagination.py +50 -6
  15. openstackclient/common/progressbar.py +7 -6
  16. openstackclient/common/project_cleanup.py +11 -6
  17. openstackclient/common/quota.py +105 -103
  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 +42 -22
  25. openstackclient/compute/v2/host.py +14 -6
  26. openstackclient/compute/v2/hypervisor.py +16 -5
  27. openstackclient/compute/v2/hypervisor_stats.py +10 -2
  28. openstackclient/compute/v2/keypair.py +35 -16
  29. openstackclient/compute/v2/server.py +268 -179
  30. openstackclient/compute/v2/server_backup.py +10 -4
  31. openstackclient/compute/v2/server_event.py +28 -12
  32. openstackclient/compute/v2/server_group.py +23 -11
  33. openstackclient/compute/v2/server_image.py +19 -10
  34. openstackclient/compute/v2/server_migration.py +27 -10
  35. openstackclient/compute/v2/server_share.py +274 -0
  36. openstackclient/compute/v2/server_volume.py +13 -5
  37. openstackclient/compute/v2/service.py +17 -8
  38. openstackclient/compute/v2/usage.py +28 -23
  39. openstackclient/identity/client.py +8 -3
  40. openstackclient/identity/common.py +82 -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 +32 -12
  51. openstackclient/identity/v3/application_credential.py +66 -24
  52. openstackclient/identity/v3/catalog.py +14 -7
  53. openstackclient/identity/v3/consumer.py +22 -11
  54. openstackclient/identity/v3/credential.py +39 -17
  55. openstackclient/identity/v3/domain.py +40 -19
  56. openstackclient/identity/v3/ec2creds.py +25 -12
  57. openstackclient/identity/v3/endpoint.py +98 -64
  58. openstackclient/identity/v3/endpoint_group.py +28 -17
  59. openstackclient/identity/v3/federation_protocol.py +44 -20
  60. openstackclient/identity/v3/group.py +64 -40
  61. openstackclient/identity/v3/identity_provider.py +95 -57
  62. openstackclient/identity/v3/implied_role.py +21 -9
  63. openstackclient/identity/v3/limit.py +42 -17
  64. openstackclient/identity/v3/mapping.py +58 -28
  65. openstackclient/identity/v3/policy.py +23 -12
  66. openstackclient/identity/v3/project.py +59 -26
  67. openstackclient/identity/v3/region.py +39 -17
  68. openstackclient/identity/v3/registered_limit.py +41 -16
  69. openstackclient/identity/v3/role.py +62 -31
  70. openstackclient/identity/v3/role_assignment.py +25 -7
  71. openstackclient/identity/v3/service.py +39 -17
  72. openstackclient/identity/v3/service_provider.py +40 -16
  73. openstackclient/identity/v3/tag.py +23 -6
  74. openstackclient/identity/v3/token.py +30 -14
  75. openstackclient/identity/v3/trust.py +39 -18
  76. openstackclient/identity/v3/unscoped_saml.py +10 -2
  77. openstackclient/identity/v3/user.py +86 -36
  78. openstackclient/image/client.py +7 -3
  79. openstackclient/image/v1/image.py +33 -26
  80. openstackclient/image/v2/cache.py +16 -11
  81. openstackclient/image/v2/image.py +88 -56
  82. openstackclient/image/v2/info.py +7 -1
  83. openstackclient/image/v2/metadef_namespaces.py +117 -20
  84. openstackclient/image/v2/metadef_objects.py +32 -19
  85. openstackclient/image/v2/metadef_properties.py +30 -16
  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 +25 -27
  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 +27 -54
  93. openstackclient/network/v2/address_group.py +39 -16
  94. openstackclient/network/v2/address_scope.py +36 -20
  95. openstackclient/network/v2/bgpvpn/bgpvpn.py +477 -0
  96. openstackclient/network/v2/bgpvpn/constants.py +30 -0
  97. openstackclient/network/v2/bgpvpn/network_association.py +226 -0
  98. openstackclient/network/v2/bgpvpn/port_association.py +504 -0
  99. openstackclient/network/v2/bgpvpn/router_association.py +301 -0
  100. openstackclient/network/v2/default_security_group_rule.py +31 -14
  101. openstackclient/network/v2/floating_ip.py +121 -162
  102. openstackclient/network/v2/floating_ip_port_forwarding.py +41 -19
  103. openstackclient/network/v2/fwaas/__init__.py +0 -0
  104. openstackclient/network/v2/fwaas/group.py +499 -0
  105. openstackclient/network/v2/fwaas/policy.py +518 -0
  106. openstackclient/network/v2/fwaas/rule.py +610 -0
  107. openstackclient/network/v2/ip_availability.py +25 -8
  108. openstackclient/network/v2/l3_conntrack_helper.py +35 -13
  109. openstackclient/network/v2/local_ip.py +27 -13
  110. openstackclient/network/v2/local_ip_association.py +17 -7
  111. openstackclient/network/v2/ndp_proxy.py +23 -11
  112. openstackclient/network/v2/network.py +213 -213
  113. openstackclient/network/v2/network_agent.py +77 -34
  114. openstackclient/network/v2/network_auto_allocated_topology.py +27 -15
  115. openstackclient/network/v2/network_flavor.py +45 -21
  116. openstackclient/network/v2/network_flavor_profile.py +42 -17
  117. openstackclient/network/v2/network_meter.py +39 -15
  118. openstackclient/network/v2/network_meter_rule.py +40 -12
  119. openstackclient/network/v2/network_qos_policy.py +39 -21
  120. openstackclient/network/v2/network_qos_rule.py +48 -18
  121. openstackclient/network/v2/network_qos_rule_type.py +28 -9
  122. openstackclient/network/v2/network_rbac.py +34 -16
  123. openstackclient/network/v2/network_segment.py +32 -11
  124. openstackclient/network/v2/network_segment_range.py +70 -31
  125. openstackclient/network/v2/network_service_provider.py +7 -1
  126. openstackclient/network/v2/network_trunk.py +41 -22
  127. openstackclient/network/v2/port.py +141 -40
  128. openstackclient/network/v2/router.py +101 -67
  129. openstackclient/network/v2/security_group.py +97 -198
  130. openstackclient/network/v2/security_group_rule.py +115 -282
  131. openstackclient/network/v2/subnet.py +63 -34
  132. openstackclient/network/v2/subnet_pool.py +42 -24
  133. openstackclient/network/v2/taas/tap_flow.py +35 -14
  134. openstackclient/network/v2/taas/tap_mirror.py +28 -14
  135. openstackclient/network/v2/taas/tap_service.py +26 -12
  136. openstackclient/object/client.py +7 -2
  137. openstackclient/object/v1/account.py +13 -6
  138. openstackclient/object/v1/container.py +28 -16
  139. openstackclient/object/v1/object.py +28 -16
  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 +59 -19
  151. openstackclient/tests/functional/identity/v3/test_application_credential.py +1 -1
  152. openstackclient/tests/functional/identity/v3/test_group.py +20 -20
  153. openstackclient/tests/functional/identity/v3/test_idp.py +3 -1
  154. openstackclient/tests/functional/identity/v3/test_mapping.py +81 -0
  155. openstackclient/tests/functional/identity/v3/test_project.py +10 -10
  156. openstackclient/tests/functional/identity/v3/test_role.py +18 -18
  157. openstackclient/tests/functional/identity/v3/test_role_assignment.py +12 -12
  158. openstackclient/tests/functional/identity/v3/test_user.py +8 -8
  159. openstackclient/tests/functional/image/base.py +1 -6
  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_group.py +163 -0
  172. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +11 -7
  173. openstackclient/tests/functional/volume/v3/test_volume_type.py +2 -2
  174. openstackclient/tests/unit/common/test_availability_zone.py +35 -49
  175. openstackclient/tests/unit/common/test_extension.py +2 -2
  176. openstackclient/tests/unit/common/test_limits.py +1 -1
  177. openstackclient/tests/unit/common/test_module.py +82 -44
  178. openstackclient/tests/unit/common/test_project_cleanup.py +3 -1
  179. openstackclient/tests/unit/common/test_quota.py +15 -26
  180. openstackclient/tests/unit/compute/v2/fakes.py +26 -57
  181. openstackclient/tests/unit/compute/v2/test_agent.py +4 -4
  182. openstackclient/tests/unit/compute/v2/test_aggregate.py +1 -1
  183. openstackclient/tests/unit/compute/v2/test_console.py +2 -2
  184. openstackclient/tests/unit/compute/v2/test_console_connection.py +1 -1
  185. openstackclient/tests/unit/compute/v2/test_flavor.py +29 -3
  186. openstackclient/tests/unit/compute/v2/test_host.py +3 -3
  187. openstackclient/tests/unit/compute/v2/test_hypervisor.py +2 -2
  188. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -1
  189. openstackclient/tests/unit/compute/v2/test_keypair.py +7 -7
  190. openstackclient/tests/unit/compute/v2/test_server.py +26 -111
  191. openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -1
  192. openstackclient/tests/unit/compute/v2/test_server_event.py +2 -2
  193. openstackclient/tests/unit/compute/v2/test_server_group.py +1 -1
  194. openstackclient/tests/unit/compute/v2/test_server_image.py +1 -1
  195. openstackclient/tests/unit/compute/v2/test_server_migration.py +4 -4
  196. openstackclient/tests/unit/compute/v2/test_server_share.py +287 -0
  197. openstackclient/tests/unit/compute/v2/test_server_volume.py +2 -2
  198. openstackclient/tests/unit/compute/v2/test_service.py +3 -3
  199. openstackclient/tests/unit/compute/v2/test_usage.py +1 -1
  200. openstackclient/tests/unit/identity/v2_0/fakes.py +3 -7
  201. openstackclient/tests/unit/identity/v2_0/test_endpoint.py +1 -1
  202. openstackclient/tests/unit/identity/v2_0/test_project.py +1 -1
  203. openstackclient/tests/unit/identity/v2_0/test_role.py +1 -1
  204. openstackclient/tests/unit/identity/v2_0/test_role_assignment.py +1 -1
  205. openstackclient/tests/unit/identity/v2_0/test_service.py +1 -1
  206. openstackclient/tests/unit/identity/v2_0/test_token.py +2 -2
  207. openstackclient/tests/unit/identity/v2_0/test_user.py +1 -1
  208. openstackclient/tests/unit/identity/v3/fakes.py +8 -38
  209. openstackclient/tests/unit/identity/v3/test_access_rule.py +3 -3
  210. openstackclient/tests/unit/identity/v3/test_application_credential.py +4 -4
  211. openstackclient/tests/unit/identity/v3/test_credential.py +5 -5
  212. openstackclient/tests/unit/identity/v3/test_domain.py +5 -5
  213. openstackclient/tests/unit/identity/v3/test_endpoint.py +6 -6
  214. openstackclient/tests/unit/identity/v3/test_endpoint_group.py +1 -1
  215. openstackclient/tests/unit/identity/v3/test_group.py +12 -22
  216. openstackclient/tests/unit/identity/v3/test_identity_provider.py +303 -299
  217. openstackclient/tests/unit/identity/v3/test_implied_role.py +1 -1
  218. openstackclient/tests/unit/identity/v3/test_limit.py +5 -5
  219. openstackclient/tests/unit/identity/v3/test_mappings.py +163 -79
  220. openstackclient/tests/unit/identity/v3/test_project.py +28 -5
  221. openstackclient/tests/unit/identity/v3/test_protocol.py +3 -3
  222. openstackclient/tests/unit/identity/v3/test_region.py +5 -5
  223. openstackclient/tests/unit/identity/v3/test_registered_limit.py +5 -5
  224. openstackclient/tests/unit/identity/v3/test_role.py +8 -8
  225. openstackclient/tests/unit/identity/v3/test_role_assignment.py +1 -1
  226. openstackclient/tests/unit/identity/v3/test_service.py +5 -5
  227. openstackclient/tests/unit/identity/v3/test_token.py +2 -2
  228. openstackclient/tests/unit/identity/v3/test_trust.py +4 -4
  229. openstackclient/tests/unit/identity/v3/test_user.py +77 -10
  230. openstackclient/tests/unit/image/v2/test_image.py +11 -11
  231. openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +105 -6
  232. openstackclient/tests/unit/network/test_common.py +0 -155
  233. openstackclient/tests/unit/network/v2/bgpvpn/__init__.py +0 -0
  234. openstackclient/tests/unit/network/v2/bgpvpn/fakes.py +179 -0
  235. openstackclient/tests/unit/network/v2/bgpvpn/test_bgpvpn.py +584 -0
  236. openstackclient/tests/unit/network/v2/bgpvpn/test_network_association.py +285 -0
  237. openstackclient/tests/unit/network/v2/bgpvpn/test_port_association.py +384 -0
  238. openstackclient/tests/unit/network/v2/bgpvpn/test_router_association.py +297 -0
  239. openstackclient/tests/unit/network/v2/fakes.py +5 -77
  240. openstackclient/tests/unit/network/v2/fwaas/__init__.py +0 -0
  241. openstackclient/tests/unit/network/v2/fwaas/test_group.py +923 -0
  242. openstackclient/tests/unit/network/v2/fwaas/test_policy.py +869 -0
  243. openstackclient/tests/unit/network/v2/fwaas/test_rule.py +1005 -0
  244. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_flow.py → test_tap_flow.py} +18 -25
  245. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_mirror.py → test_tap_mirror.py} +19 -29
  246. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_service.py → test_tap_service.py} +19 -29
  247. openstackclient/tests/unit/network/v2/test_address_group.py +26 -2
  248. openstackclient/tests/unit/network/v2/test_address_scope.py +24 -0
  249. openstackclient/tests/unit/network/v2/{test_floating_ip_network.py → test_floating_ip.py} +27 -2
  250. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +37 -13
  251. openstackclient/tests/unit/network/v2/test_ip_availability.py +25 -0
  252. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +29 -3
  253. openstackclient/tests/unit/network/v2/test_network.py +74 -12
  254. openstackclient/tests/unit/network/v2/test_network_agent.py +58 -5
  255. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +3 -3
  256. openstackclient/tests/unit/network/v2/test_network_flavor.py +26 -2
  257. openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +24 -0
  258. openstackclient/tests/unit/network/v2/test_network_meter.py +24 -0
  259. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +25 -1
  260. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +2 -2
  261. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +24 -0
  262. openstackclient/tests/unit/network/v2/test_network_rbac.py +25 -1
  263. openstackclient/tests/unit/network/v2/test_network_segment.py +25 -1
  264. openstackclient/tests/unit/network/v2/test_network_segment_range.py +31 -10
  265. openstackclient/tests/unit/network/v2/test_network_trunk.py +1 -1
  266. openstackclient/tests/unit/network/v2/test_port.py +166 -0
  267. openstackclient/tests/unit/network/v2/test_router.py +36 -16
  268. openstackclient/tests/unit/network/v2/{test_security_group_network.py → test_security_group.py} +11 -8
  269. openstackclient/tests/unit/network/v2/{test_security_group_rule_network.py → test_security_group_rule.py} +28 -37
  270. openstackclient/tests/unit/network/v2/test_subnet.py +30 -5
  271. openstackclient/tests/unit/network/v2/test_subnet_pool.py +26 -1
  272. openstackclient/tests/unit/object/v1/fakes.py +8 -7
  273. openstackclient/tests/unit/object/v1/test_container.py +65 -101
  274. openstackclient/tests/unit/object/v1/test_container_all.py +8 -1
  275. openstackclient/tests/unit/object/v1/test_object.py +44 -84
  276. openstackclient/tests/unit/object/v1/test_object_all.py +8 -1
  277. openstackclient/tests/unit/test_hacking.py +108 -0
  278. openstackclient/tests/unit/volume/v2/fakes.py +21 -140
  279. openstackclient/tests/unit/volume/v2/test_volume_backup.py +6 -14
  280. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +8 -1
  281. openstackclient/tests/unit/volume/v2/test_volume_type.py +2 -4
  282. openstackclient/tests/unit/volume/v3/fakes.py +205 -100
  283. openstackclient/tests/unit/volume/v3/test_backup_record.py +114 -0
  284. openstackclient/tests/unit/volume/v3/test_consistency_group.py +720 -0
  285. openstackclient/tests/unit/volume/v3/test_consistency_group_snapshot.py +354 -0
  286. openstackclient/tests/unit/volume/v3/test_qos_specs.py +455 -0
  287. openstackclient/tests/unit/volume/v3/test_volume.py +60 -3
  288. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +3 -1
  289. openstackclient/tests/unit/volume/v3/test_volume_backend.py +158 -0
  290. openstackclient/tests/unit/volume/v3/test_volume_backup.py +6 -14
  291. openstackclient/tests/unit/volume/v3/test_volume_group_type.py +65 -0
  292. openstackclient/tests/unit/volume/v3/test_volume_host.py +115 -0
  293. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +61 -1
  294. openstackclient/tests/unit/volume/v3/test_volume_type.py +2 -4
  295. openstackclient/volume/client.py +7 -3
  296. openstackclient/volume/v2/backup_record.py +15 -6
  297. openstackclient/volume/v2/consistency_group.py +29 -17
  298. openstackclient/volume/v2/consistency_group_snapshot.py +25 -10
  299. openstackclient/volume/v2/qos_specs.py +28 -17
  300. openstackclient/volume/v2/service.py +17 -6
  301. openstackclient/volume/v2/volume.py +60 -30
  302. openstackclient/volume/v2/volume_backend.py +19 -6
  303. openstackclient/volume/v2/volume_backup.py +48 -23
  304. openstackclient/volume/v2/volume_host.py +6 -4
  305. openstackclient/volume/v2/volume_snapshot.py +49 -24
  306. openstackclient/volume/v2/volume_transfer_request.py +31 -13
  307. openstackclient/volume/v2/volume_type.py +43 -24
  308. openstackclient/volume/v3/backup_record.py +94 -0
  309. openstackclient/volume/v3/block_storage_cleanup.py +11 -3
  310. openstackclient/volume/v3/block_storage_cluster.py +19 -7
  311. openstackclient/volume/v3/block_storage_log_level.py +15 -6
  312. openstackclient/volume/v3/block_storage_manage.py +10 -4
  313. openstackclient/volume/v3/block_storage_resource_filter.py +17 -5
  314. openstackclient/volume/v3/consistency_group.py +400 -0
  315. openstackclient/volume/v3/consistency_group_snapshot.py +225 -0
  316. openstackclient/volume/v3/qos_specs.py +389 -0
  317. openstackclient/volume/v3/service.py +16 -6
  318. openstackclient/volume/v3/volume.py +92 -40
  319. openstackclient/volume/v3/volume_attachment.py +47 -21
  320. openstackclient/volume/v3/volume_backend.py +130 -0
  321. openstackclient/volume/v3/volume_backup.py +55 -27
  322. openstackclient/volume/v3/volume_group.py +23 -13
  323. openstackclient/volume/v3/volume_group_snapshot.py +34 -17
  324. openstackclient/volume/v3/volume_group_type.py +27 -14
  325. openstackclient/volume/v3/volume_host.py +74 -0
  326. openstackclient/volume/v3/volume_message.py +18 -8
  327. openstackclient/volume/v3/volume_snapshot.py +70 -32
  328. openstackclient/volume/v3/volume_transfer_request.py +31 -13
  329. openstackclient/volume/v3/volume_type.py +42 -24
  330. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/METADATA +7 -8
  331. python_openstackclient-10.1.0.dist-info/RECORD +524 -0
  332. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/WHEEL +1 -1
  333. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/entry_points.txt +77 -25
  334. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/licenses/AUTHORS +9 -0
  335. python_openstackclient-10.1.0.dist-info/pbr.json +1 -0
  336. openstackclient/api/image_v1.py +0 -69
  337. openstackclient/api/image_v2.py +0 -79
  338. openstackclient/network/v2/floating_ip_pool.py +0 -38
  339. openstackclient/tests/functional/image/v1/test_image.py +0 -97
  340. openstackclient/tests/unit/api/test_image_v1.py +0 -96
  341. openstackclient/tests/unit/api/test_image_v2.py +0 -96
  342. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +0 -248
  343. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +0 -49
  344. openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +0 -39
  345. openstackclient/tests/unit/network/v2/test_network_compute.py +0 -404
  346. openstackclient/tests/unit/network/v2/test_security_group_compute.py +0 -392
  347. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +0 -555
  348. python_openstackclient-9.0.0.dist-info/RECORD +0 -499
  349. python_openstackclient-9.0.0.dist-info/pbr.json +0 -1
  350. /openstackclient/{tests/functional/image/v1 → network/v2/bgpvpn}/__init__.py +0 -0
  351. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/licenses/LICENSE +0 -0
  352. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/top_level.txt +0 -0
@@ -17,11 +17,12 @@
17
17
 
18
18
  import argparse
19
19
  import base64
20
+ from collections.abc import Iterable, Sequence
20
21
  import getpass
21
22
  import json
22
23
  import logging
23
24
  import os
24
- import typing as ty
25
+ from typing import Any
25
26
 
26
27
  from cliff import columns as cliff_columns
27
28
  import iso8601
@@ -38,7 +39,6 @@ from openstackclient.common import envvars
38
39
  from openstackclient.common import pagination
39
40
  from openstackclient.i18n import _
40
41
  from openstackclient.identity import common as identity_common
41
- from openstackclient.network import common as network_common
42
42
 
43
43
  LOG = logging.getLogger(__name__)
44
44
 
@@ -59,28 +59,31 @@ class PowerStateColumn(cliff_columns.FormattableColumn[int]):
59
59
  'Suspended', # 0x07
60
60
  ]
61
61
 
62
- def human_readable(self):
62
+ def human_readable(self) -> str:
63
63
  try:
64
64
  return self.power_states[self._value]
65
65
  except Exception:
66
66
  return 'N/A'
67
67
 
68
68
 
69
- class AddressesColumn(cliff_columns.FormattableColumn[ty.Any]):
69
+ class AddressesColumn(cliff_columns.FormattableColumn[Any]):
70
70
  """Generate a formatted string of a server's addresses."""
71
71
 
72
- def human_readable(self):
72
+ def human_readable(self) -> str:
73
73
  try:
74
- return utils.format_dict_of_list(
75
- {
76
- k: [i['addr'] for i in v if 'addr' in i]
77
- for k, v in self._value.items()
78
- }
74
+ return (
75
+ utils.format_dict_of_list(
76
+ {
77
+ k: [i['addr'] for i in v if 'addr' in i]
78
+ for k, v in self._value.items()
79
+ }
80
+ )
81
+ or ''
79
82
  )
80
83
  except Exception:
81
84
  return 'N/A'
82
85
 
83
- def machine_readable(self):
86
+ def machine_readable(self) -> Any:
84
87
  return {
85
88
  k: [i['addr'] for i in v if 'addr' in i]
86
89
  for k, v in (self._value.items() if self._value else [])
@@ -90,14 +93,16 @@ class AddressesColumn(cliff_columns.FormattableColumn[ty.Any]):
90
93
  class HostColumn(cliff_columns.FormattableColumn[str | None]):
91
94
  """Generate a formatted string of a hostname."""
92
95
 
93
- def human_readable(self):
96
+ def human_readable(self) -> str:
94
97
  if self._value is None:
95
98
  return ''
96
99
 
97
100
  return self._value
98
101
 
99
102
 
100
- def _get_ip_address(addresses, address_type, ip_address_family):
103
+ def _get_ip_address(
104
+ addresses: Any, address_type: str, ip_address_family: list[int]
105
+ ) -> Any:
101
106
  # Old style addresses
102
107
  if address_type in addresses:
103
108
  for addy in addresses[address_type]:
@@ -130,7 +135,13 @@ def _get_ip_address(addresses, address_type, ip_address_family):
130
135
  )
131
136
 
132
137
 
133
- def _prep_server_detail(compute_client, image_client, server, *, refresh=True):
138
+ def _prep_server_detail(
139
+ compute_client: Any,
140
+ image_client: Any,
141
+ server: Any,
142
+ *,
143
+ refresh: bool = True,
144
+ ) -> dict[str, Any]:
134
145
  """Prepare the detailed server dict for printing
135
146
 
136
147
  :param compute_client: a compute client instance
@@ -352,7 +363,7 @@ def _prep_server_detail(compute_client, image_client, server, *, refresh=True):
352
363
  class AddFixedIP(command.ShowOne):
353
364
  _description = _("Add fixed IP address to server")
354
365
 
355
- def get_parser(self, prog_name):
366
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
356
367
  parser = super().get_parser(prog_name)
357
368
  parser.add_argument(
358
369
  "server",
@@ -381,7 +392,9 @@ class AddFixedIP(command.ShowOne):
381
392
  )
382
393
  return parser
383
394
 
384
- def take_action(self, parsed_args):
395
+ def take_action(
396
+ self, parsed_args: argparse.Namespace
397
+ ) -> tuple[Sequence[str], Iterable[Any]]:
385
398
  compute_client = self.app.client_manager.compute
386
399
  server = compute_client.find_server(
387
400
  parsed_args.server, ignore_missing=False
@@ -403,7 +416,7 @@ class AddFixedIP(command.ShowOne):
403
416
  else:
404
417
  net_id = parsed_args.network
405
418
 
406
- kwargs = {'net_id': net_id}
419
+ kwargs: dict[str, Any] = {'net_id': net_id}
407
420
  if parsed_args.fixed_ip_address:
408
421
  kwargs['fixed_ips'] = [
409
422
  {"ip_address": parsed_args.fixed_ip_address}
@@ -447,10 +460,11 @@ class AddFixedIP(command.ShowOne):
447
460
  )
448
461
 
449
462
 
450
- class AddFloatingIP(network_common.NetworkAndComputeCommand):
463
+ class AddFloatingIP(command.Command):
451
464
  _description = _("Add floating IP address to server")
452
465
 
453
- def update_parser_common(self, parser):
466
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
467
+ parser = super().get_parser(prog_name)
454
468
  parser.add_argument(
455
469
  "server",
456
470
  metavar="<server>",
@@ -475,7 +489,8 @@ class AddFloatingIP(network_common.NetworkAndComputeCommand):
475
489
  )
476
490
  return parser
477
491
 
478
- def take_action_network(self, client, parsed_args):
492
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
493
+ client = self.app.client_manager.network
479
494
  compute_client = self.app.client_manager.compute
480
495
 
481
496
  attrs = {}
@@ -534,19 +549,11 @@ class AddFloatingIP(network_common.NetworkAndComputeCommand):
534
549
  if error:
535
550
  raise error
536
551
 
537
- def take_action_compute(self, client, parsed_args):
538
- server = client.find_server(parsed_args.server, ignore_missing=False)
539
- client.add_floating_ip_to_server(
540
- server,
541
- parsed_args.ip_address,
542
- fixed_address=parsed_args.fixed_ip_address,
543
- )
544
-
545
552
 
546
553
  class AddPort(command.Command):
547
554
  _description = _("Add port to server")
548
555
 
549
- def get_parser(self, prog_name):
556
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
550
557
  parser = super().get_parser(prog_name)
551
558
  parser.add_argument(
552
559
  "server",
@@ -568,7 +575,7 @@ class AddPort(command.Command):
568
575
  )
569
576
  return parser
570
577
 
571
- def take_action(self, parsed_args):
578
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
572
579
  compute_client = self.app.client_manager.compute
573
580
 
574
581
  server = compute_client.find_server(
@@ -600,7 +607,7 @@ class AddPort(command.Command):
600
607
  class AddNetwork(command.Command):
601
608
  _description = _("Add network to server")
602
609
 
603
- def get_parser(self, prog_name):
610
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
604
611
  parser = super().get_parser(prog_name)
605
612
  parser.add_argument(
606
613
  "server",
@@ -622,7 +629,7 @@ class AddNetwork(command.Command):
622
629
  )
623
630
  return parser
624
631
 
625
- def take_action(self, parsed_args):
632
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
626
633
  compute_client = self.app.client_manager.compute
627
634
 
628
635
  server = compute_client.find_server(
@@ -655,7 +662,7 @@ class AddNetwork(command.Command):
655
662
  class AddServerSecurityGroup(command.Command):
656
663
  _description = _("Add security group(s) to server")
657
664
 
658
- def get_parser(self, prog_name):
665
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
659
666
  parser = super().get_parser(prog_name)
660
667
  parser.add_argument(
661
668
  'server',
@@ -673,7 +680,7 @@ class AddServerSecurityGroup(command.Command):
673
680
  )
674
681
  return parser
675
682
 
676
- def take_action(self, parsed_args):
683
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
677
684
  compute_client = self.app.client_manager.compute
678
685
 
679
686
  server = compute_client.find_server(
@@ -729,7 +736,7 @@ Specify ``--os-compute-api-version 2.20`` or higher to add a volume to a server
729
736
  with status ``SHELVED`` or ``SHELVED_OFFLOADED``."""
730
737
  )
731
738
 
732
- def get_parser(self, prog_name):
739
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
733
740
  parser = super().get_parser(prog_name)
734
741
  parser.add_argument(
735
742
  'server',
@@ -775,7 +782,9 @@ with status ``SHELVED`` or ``SHELVED_OFFLOADED``."""
775
782
  )
776
783
  return parser
777
784
 
778
- def take_action(self, parsed_args):
785
+ def take_action(
786
+ self, parsed_args: argparse.Namespace
787
+ ) -> tuple[Sequence[str], Iterable[Any]]:
779
788
  compute_client = self.app.client_manager.compute
780
789
  volume_client = self.app.client_manager.sdk_connection.volume
781
790
 
@@ -849,7 +858,12 @@ with status ``SHELVED`` or ``SHELVED_OFFLOADED``."""
849
858
 
850
859
 
851
860
  class NoneNICAction(argparse.Action):
852
- def __init__(self, option_strings, dest, help=None):
861
+ def __init__(
862
+ self,
863
+ option_strings: list[str],
864
+ dest: str,
865
+ help: str | None = None,
866
+ ) -> None:
853
867
  super().__init__(
854
868
  option_strings=option_strings,
855
869
  dest=dest,
@@ -859,7 +873,13 @@ class NoneNICAction(argparse.Action):
859
873
  help=help,
860
874
  )
861
875
 
862
- def __call__(self, parser, namespace, values, option_string=None):
876
+ def __call__(
877
+ self,
878
+ parser: argparse.ArgumentParser,
879
+ namespace: argparse.Namespace,
880
+ values: Any,
881
+ option_string: str | None = None,
882
+ ) -> None:
863
883
  # Make sure we have an empty dict rather than None
864
884
  if getattr(namespace, self.dest, None) is None:
865
885
  setattr(namespace, self.dest, [])
@@ -868,7 +888,12 @@ class NoneNICAction(argparse.Action):
868
888
 
869
889
 
870
890
  class AutoNICAction(argparse.Action):
871
- def __init__(self, option_strings, dest, help=None):
891
+ def __init__(
892
+ self,
893
+ option_strings: list[str],
894
+ dest: str,
895
+ help: str | None = None,
896
+ ) -> None:
872
897
  super().__init__(
873
898
  option_strings=option_strings,
874
899
  dest=dest,
@@ -878,7 +903,13 @@ class AutoNICAction(argparse.Action):
878
903
  help=help,
879
904
  )
880
905
 
881
- def __call__(self, parser, namespace, values, option_string=None):
906
+ def __call__(
907
+ self,
908
+ parser: argparse.ArgumentParser,
909
+ namespace: argparse.Namespace,
910
+ values: Any,
911
+ option_string: str | None = None,
912
+ ) -> None:
882
913
  # Make sure we have an empty dict rather than None
883
914
  if getattr(namespace, self.dest, None) is None:
884
915
  setattr(namespace, self.dest, [])
@@ -889,12 +920,12 @@ class AutoNICAction(argparse.Action):
889
920
  class NICAction(argparse.Action):
890
921
  def __init__(
891
922
  self,
892
- option_strings,
893
- dest,
894
- help=None,
895
- metavar=None,
896
- key=None,
897
- ):
923
+ option_strings: list[str],
924
+ dest: str,
925
+ help: str | None = None,
926
+ metavar: str | None = None,
927
+ key: str | None = None,
928
+ ) -> None:
898
929
  self.key = key
899
930
  super().__init__(
900
931
  option_strings=option_strings,
@@ -909,7 +940,13 @@ class NICAction(argparse.Action):
909
940
  metavar=metavar,
910
941
  )
911
942
 
912
- def __call__(self, parser, namespace, values, option_string=None):
943
+ def __call__(
944
+ self,
945
+ parser: argparse.ArgumentParser,
946
+ namespace: argparse.Namespace,
947
+ values: Any,
948
+ option_string: str | None = None,
949
+ ) -> None:
913
950
  # Make sure we have an empty dict rather than None
914
951
  if getattr(namespace, self.dest, None) is None:
915
952
  setattr(namespace, self.dest, [])
@@ -940,9 +977,9 @@ class NICAction(argparse.Action):
940
977
  }
941
978
 
942
979
  for kv_str in values.split(','):
943
- k, sep, v = kv_str.partition('=')
980
+ k, _sep, v = kv_str.partition('=')
944
981
 
945
- if k not in list(info) + ['tag'] or not v:
982
+ if k not in [*list(info), 'tag'] or not v:
946
983
  msg = _(
947
984
  "Invalid argument %s; argument must be of form "
948
985
  "'net-id=net-uuid,port-id=port-uuid,v4-fixed-ip=ip-addr,"
@@ -970,12 +1007,18 @@ class NICAction(argparse.Action):
970
1007
 
971
1008
 
972
1009
  class BDMLegacyAction(argparse.Action):
973
- def __call__(self, parser, namespace, values, option_string=None):
1010
+ def __call__(
1011
+ self,
1012
+ parser: argparse.ArgumentParser,
1013
+ namespace: argparse.Namespace,
1014
+ values: Any,
1015
+ option_string: str | None = None,
1016
+ ) -> None:
974
1017
  # Make sure we have an empty list rather than None
975
1018
  if getattr(namespace, self.dest, None) is None:
976
1019
  setattr(namespace, self.dest, [])
977
1020
 
978
- dev_name, sep, dev_map = values.partition('=')
1021
+ dev_name, _sep, dev_map = values.partition('=')
979
1022
  dev_map = dev_map.split(':') if dev_map else dev_map
980
1023
  if not dev_name or not dev_map or len(dev_map) > 4:
981
1024
  msg = _(
@@ -1014,7 +1057,9 @@ class BDMLegacyAction(argparse.Action):
1014
1057
 
1015
1058
 
1016
1059
  class BDMAction(parseractions.MultiKeyValueAction):
1017
- def __init__(self, option_strings, dest, **kwargs):
1060
+ def __init__(
1061
+ self, option_strings: list[str], dest: str, **kwargs: Any
1062
+ ) -> None:
1018
1063
  optional_keys = [
1019
1064
  'uuid',
1020
1065
  'source_type',
@@ -1039,7 +1084,7 @@ class BDMAction(parseractions.MultiKeyValueAction):
1039
1084
 
1040
1085
  # TODO(stephenfin): Remove once I549d0897ef3704b7f47000f867d6731ad15d3f2b
1041
1086
  # or similar lands in a release
1042
- def validate_keys(self, keys):
1087
+ def validate_keys(self, keys: Sequence[str]) -> None:
1043
1088
  """Validate the provided keys.
1044
1089
 
1045
1090
  :param keys: A list of keys to validate.
@@ -1075,7 +1120,13 @@ class BDMAction(parseractions.MultiKeyValueAction):
1075
1120
  },
1076
1121
  )
1077
1122
 
1078
- def __call__(self, parser, namespace, values, option_string=None):
1123
+ def __call__(
1124
+ self,
1125
+ parser: argparse.ArgumentParser,
1126
+ namespace: argparse.Namespace,
1127
+ values: Any,
1128
+ option_string: str | None = None,
1129
+ ) -> None:
1079
1130
  if getattr(namespace, self.dest, None) is None:
1080
1131
  setattr(namespace, self.dest, [])
1081
1132
 
@@ -1094,7 +1145,7 @@ class BDMAction(parseractions.MultiKeyValueAction):
1094
1145
  class CreateServer(command.ShowOne):
1095
1146
  _description = _("Create a new server")
1096
1147
 
1097
- def get_parser(self, prog_name):
1148
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
1098
1149
  parser = super().get_parser(prog_name)
1099
1150
  parser.add_argument(
1100
1151
  'server_name',
@@ -1535,8 +1586,10 @@ class CreateServer(command.ShowOne):
1535
1586
  )
1536
1587
  return parser
1537
1588
 
1538
- def take_action(self, parsed_args):
1539
- def _show_progress(progress):
1589
+ def take_action(
1590
+ self, parsed_args: argparse.Namespace
1591
+ ) -> tuple[Sequence[str], Iterable[Any]]:
1592
+ def _show_progress(progress: int | None) -> None:
1540
1593
  if progress:
1541
1594
  self.app.stdout.write(f'\rProgress: {progress}')
1542
1595
  self.app.stdout.flush()
@@ -1554,7 +1607,7 @@ class CreateServer(command.ShowOne):
1554
1607
 
1555
1608
  if not image and parsed_args.image_properties:
1556
1609
 
1557
- def _match_image(image_api, wanted_properties):
1610
+ def _match_image(image_api: Any, wanted_properties: Any) -> Any:
1558
1611
  image_list = image_api.images()
1559
1612
  images_matched = []
1560
1613
  for img in image_list:
@@ -1909,6 +1962,7 @@ class CreateServer(command.ShowOne):
1909
1962
 
1910
1963
  networks = parsed_args.nics[0]
1911
1964
  else:
1965
+ _networks = []
1912
1966
  for nic in parsed_args.nics:
1913
1967
  if 'tag' in nic:
1914
1968
  if not sdk_utils.supports_microversion(
@@ -1969,7 +2023,8 @@ class CreateServer(command.ShowOne):
1969
2023
  if nic.get('tag'): # tags are optional
1970
2024
  network['tag'] = nic['tag']
1971
2025
 
1972
- networks.append(network) # type: ignore[union-attr]
2026
+ _networks.append(network)
2027
+ networks = _networks
1973
2028
 
1974
2029
  if not parsed_args.nics and sdk_utils.supports_microversion(
1975
2030
  compute_client, '2.37'
@@ -2153,7 +2208,8 @@ class CreateServer(command.ShowOne):
2153
2208
  raise exceptions.CommandError(msg)
2154
2209
 
2155
2210
  data = _prep_server_detail(compute_client, image_client, server)
2156
- return zip(*sorted(data.items()))
2211
+ col_headers, col_data = zip(*sorted(data.items()))
2212
+ return col_headers, col_data
2157
2213
 
2158
2214
 
2159
2215
  class CreateServerDump(command.Command):
@@ -2168,7 +2224,7 @@ class CreateServerDump(command.Command):
2168
2224
  This command requires ``--os-compute-api-version`` 2.17 or greater.
2169
2225
  """
2170
2226
 
2171
- def get_parser(self, prog_name):
2227
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
2172
2228
  parser = super().get_parser(prog_name)
2173
2229
  parser.add_argument(
2174
2230
  'server',
@@ -2178,7 +2234,7 @@ class CreateServerDump(command.Command):
2178
2234
  )
2179
2235
  return parser
2180
2236
 
2181
- def take_action(self, parsed_args):
2237
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
2182
2238
  compute_client = self.app.client_manager.compute
2183
2239
  for name_or_id in parsed_args.server:
2184
2240
  server = compute_client.find_server(
@@ -2190,7 +2246,7 @@ class CreateServerDump(command.Command):
2190
2246
  class DeleteServer(command.Command):
2191
2247
  _description = _("Delete server(s)")
2192
2248
 
2193
- def get_parser(self, prog_name):
2249
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
2194
2250
  parser = super().get_parser(prog_name)
2195
2251
  parser.add_argument(
2196
2252
  'server',
@@ -2219,8 +2275,8 @@ class DeleteServer(command.Command):
2219
2275
  )
2220
2276
  return parser
2221
2277
 
2222
- def take_action(self, parsed_args):
2223
- def _show_progress(progress):
2278
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
2279
+ def _show_progress(progress: int | None) -> None:
2224
2280
  if progress:
2225
2281
  self.app.stdout.write(f'\rProgress: {progress}')
2226
2282
  self.app.stdout.flush()
@@ -2273,17 +2329,17 @@ class DeleteServer(command.Command):
2273
2329
  class PercentAction(argparse.Action):
2274
2330
  def __init__(
2275
2331
  self,
2276
- option_strings,
2277
- dest,
2278
- nargs=None,
2279
- const=None,
2280
- default=None,
2281
- type=None,
2282
- choices=None,
2283
- required=False,
2284
- help=None,
2285
- metavar=None,
2286
- ):
2332
+ option_strings: list[str],
2333
+ dest: str,
2334
+ nargs: int | str | None = None,
2335
+ const: Any = None,
2336
+ default: Any = None,
2337
+ type: Any = None,
2338
+ choices: Any = None,
2339
+ required: bool = False,
2340
+ help: str | None = None,
2341
+ metavar: str | tuple[str, ...] | None = None,
2342
+ ) -> None:
2287
2343
  if nargs == 0:
2288
2344
  raise ValueError(
2289
2345
  'nargs for store actions must be != 0; if you '
@@ -2307,7 +2363,13 @@ class PercentAction(argparse.Action):
2307
2363
  metavar=metavar,
2308
2364
  )
2309
2365
 
2310
- def __call__(self, parser, namespace, values, option_string=None):
2366
+ def __call__(
2367
+ self,
2368
+ parser: argparse.ArgumentParser,
2369
+ namespace: argparse.Namespace,
2370
+ values: Any,
2371
+ option_string: str | None = None,
2372
+ ) -> None:
2311
2373
  x = int(values)
2312
2374
  if not 0 < x <= 100:
2313
2375
  raise argparse.ArgumentError(self, "Must be between 0 and 100")
@@ -2317,7 +2379,7 @@ class PercentAction(argparse.Action):
2317
2379
  class ListServer(command.Lister):
2318
2380
  _description = _("List servers")
2319
2381
 
2320
- def get_parser(self, prog_name):
2382
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
2321
2383
  parser = super().get_parser(prog_name)
2322
2384
  parser.add_argument(
2323
2385
  '--reservation-id',
@@ -2657,7 +2719,9 @@ class ListServer(command.Lister):
2657
2719
  )
2658
2720
  return parser
2659
2721
 
2660
- def take_action(self, parsed_args):
2722
+ def take_action(
2723
+ self, parsed_args: argparse.Namespace
2724
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
2661
2725
  compute_client = self.app.client_manager.compute
2662
2726
  identity_client = self.app.client_manager.identity
2663
2727
  image_client = self.app.client_manager.image
@@ -2790,6 +2854,9 @@ class ListServer(command.Lister):
2790
2854
  search_opts['limit'] = parsed_args.limit
2791
2855
  search_opts['paginated'] = False
2792
2856
 
2857
+ if parsed_args.max_items is not None:
2858
+ search_opts['max_items'] = parsed_args.max_items
2859
+
2793
2860
  LOG.debug('search options: %s', search_opts)
2794
2861
 
2795
2862
  if search_opts['changes-before']:
@@ -3038,8 +3105,8 @@ class ListServer(command.Lister):
3038
3105
  else:
3039
3106
  try:
3040
3107
  flavors_list = compute_client.flavors(is_public=None)
3041
- for i in flavors_list:
3042
- flavors[i.id] = i
3108
+ for f in flavors_list:
3109
+ flavors[f.id] = f
3043
3110
  except Exception: # noqa: S110
3044
3111
  # retrieving flavor names is not crucial, so we swallow any
3045
3112
  # exceptions
@@ -3060,30 +3127,33 @@ class ListServer(command.Lister):
3060
3127
  if 'id' in s.image and s.image.id is not None:
3061
3128
  image = images.get(s.image['id'])
3062
3129
  if image:
3063
- s.image_name = image.name
3130
+ setattr(s, 'image_name', image.name)
3064
3131
  s.image_id = s.image['id']
3065
3132
  else:
3066
3133
  # NOTE(melwitt): An server booted from a volume will have no
3067
3134
  # image associated with it. We fill in the Image Name and ID
3068
3135
  # with "N/A (booted from volume)" to help users who want to be
3069
3136
  # able to grep for boot-from-volume servers when using the CLI.
3070
- s.image_name = IMAGE_STRING_FOR_BFV
3137
+ setattr(s, 'image_name', IMAGE_STRING_FOR_BFV)
3071
3138
  s.image_id = IMAGE_STRING_FOR_BFV
3072
3139
 
3073
3140
  if not sdk_utils.supports_microversion(compute_client, '2.47'):
3074
- flavor = flavors.get(s.flavor['id'])
3075
- if flavor:
3076
- s.flavor_name = flavor.name
3141
+ if s.flavor['id'] in flavors:
3142
+ setattr(s, 'flavor_name', flavors[s.flavor['id']].name)
3077
3143
  s.flavor_id = s.flavor['id']
3078
3144
  else:
3079
- s.flavor_name = s.flavor['original_name']
3145
+ setattr(s, 'flavor_name', s.flavor['original_name'])
3080
3146
 
3081
3147
  # Add a list with security group name as attribute
3082
3148
  for s in data:
3083
3149
  if hasattr(s, 'security_groups') and s.security_groups is not None:
3084
- s.security_groups_name = [x["name"] for x in s.security_groups]
3150
+ setattr(
3151
+ s,
3152
+ 'security_groups_name',
3153
+ [x["name"] for x in s.security_groups],
3154
+ )
3085
3155
  else:
3086
- s.security_groups_name = []
3156
+ setattr(s, 'security_groups_name', [])
3087
3157
 
3088
3158
  # The host_status field contains the status of the compute host the
3089
3159
  # server is on. It is only returned by the API when the nova-api
@@ -3134,7 +3204,7 @@ class LockServer(command.Command):
3134
3204
  A non-admin user will not be able to execute actions."""
3135
3205
  )
3136
3206
 
3137
- def get_parser(self, prog_name):
3207
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
3138
3208
  parser = super().get_parser(prog_name)
3139
3209
  parser.add_argument(
3140
3210
  'server',
@@ -3153,7 +3223,7 @@ A non-admin user will not be able to execute actions."""
3153
3223
  )
3154
3224
  return parser
3155
3225
 
3156
- def take_action(self, parsed_args):
3226
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
3157
3227
  compute_client = self.app.client_manager.compute
3158
3228
 
3159
3229
  kwargs = {}
@@ -3189,16 +3259,25 @@ class MigrateServer(command.Command):
3189
3259
  _description = _(
3190
3260
  """Migrate server to different host.
3191
3261
 
3192
- A migrate operation is implemented as a resize operation using the same flavor
3193
- as the old server. This means that, like resize, migrate works by creating a
3194
- new server using the same flavor and copying the contents of the original disk
3195
- into a new one. As with resize, the migrate operation is a two-step process for
3196
- the user: the first step is to perform the migrate, and the second step is to
3197
- either confirm (verify) success and release the old server, or to declare a
3198
- revert to release the new server and restart the old one."""
3262
+ There are two types of migration operation: a cold migration and a live
3263
+ migration.
3264
+
3265
+ A cold migration operation is implemented as a resize operation
3266
+ using the same flavor as the old server. This means that, like resize, migrate
3267
+ works by shutting down the original server, creating a new server using the
3268
+ same flavor and copying the contents of the original disk into a new one.
3269
+ As with resize, the migrate operation is a two-step process for the user:
3270
+ the first step is to perform the migrate, and the second step is to either
3271
+ confirm (verify) success and release the old server, or to declare a revert
3272
+ to release the new server and restart the old one.
3273
+
3274
+ By comparison, a live migration operation does not involve shutting the server
3275
+ down, and is a one-step process that does not require a confirmation or revert
3276
+ to finish.
3277
+ """
3199
3278
  )
3200
3279
 
3201
- def get_parser(self, prog_name):
3280
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
3202
3281
  parser = super().get_parser(prog_name)
3203
3282
  parser.add_argument(
3204
3283
  'server',
@@ -3272,8 +3351,8 @@ revert to release the new server and restart the old one."""
3272
3351
  )
3273
3352
  return parser
3274
3353
 
3275
- def take_action(self, parsed_args):
3276
- def _show_progress(progress):
3354
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
3355
+ def _show_progress(progress: int | None) -> None:
3277
3356
  if progress:
3278
3357
  self.app.stdout.write(f'\rProgress: {progress}')
3279
3358
  self.app.stdout.flush()
@@ -3370,7 +3449,7 @@ revert to release the new server and restart the old one."""
3370
3449
  class PauseServer(command.Command):
3371
3450
  _description = _("Pause server(s)")
3372
3451
 
3373
- def get_parser(self, prog_name):
3452
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
3374
3453
  parser = super().get_parser(prog_name)
3375
3454
  parser.add_argument(
3376
3455
  'server',
@@ -3380,7 +3459,7 @@ class PauseServer(command.Command):
3380
3459
  )
3381
3460
  return parser
3382
3461
 
3383
- def take_action(self, parsed_args):
3462
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
3384
3463
  compute_client = self.app.client_manager.compute
3385
3464
  for server in parsed_args.server:
3386
3465
  server_id = compute_client.find_server(
@@ -3393,7 +3472,7 @@ class PauseServer(command.Command):
3393
3472
  class RebootServer(command.Command):
3394
3473
  _description = _("Perform a hard or soft server reboot")
3395
3474
 
3396
- def get_parser(self, prog_name):
3475
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
3397
3476
  parser = super().get_parser(prog_name)
3398
3477
  parser.add_argument(
3399
3478
  'server',
@@ -3424,8 +3503,8 @@ class RebootServer(command.Command):
3424
3503
  )
3425
3504
  return parser
3426
3505
 
3427
- def take_action(self, parsed_args):
3428
- def _show_progress(progress):
3506
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
3507
+ def _show_progress(progress: int | None) -> None:
3429
3508
  if progress:
3430
3509
  self.app.stdout.write(f'\rProgress: {progress}')
3431
3510
  self.app.stdout.flush()
@@ -3453,7 +3532,7 @@ class RebootServer(command.Command):
3453
3532
  class RebuildServer(command.ShowOne):
3454
3533
  _description = _("Rebuild server")
3455
3534
 
3456
- def get_parser(self, prog_name):
3535
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
3457
3536
  parser = super().get_parser(prog_name)
3458
3537
  parser.add_argument(
3459
3538
  'server',
@@ -3629,8 +3708,10 @@ class RebuildServer(command.ShowOne):
3629
3708
  )
3630
3709
  return parser
3631
3710
 
3632
- def take_action(self, parsed_args):
3633
- def _show_progress(progress):
3711
+ def take_action(
3712
+ self, parsed_args: argparse.Namespace
3713
+ ) -> tuple[Sequence[str], Iterable[Any]]:
3714
+ def _show_progress(progress: int | None) -> None:
3634
3715
  if progress:
3635
3716
  self.app.stdout.write(f'\rProgress: {progress}')
3636
3717
  self.app.stdout.flush()
@@ -3822,7 +3903,8 @@ class RebuildServer(command.ShowOne):
3822
3903
  data = _prep_server_detail(
3823
3904
  compute_client, image_client, server, refresh=False
3824
3905
  )
3825
- return zip(*sorted(data.items()))
3906
+ col_headers, col_data = zip(*sorted(data.items()))
3907
+ return col_headers, col_data
3826
3908
 
3827
3909
 
3828
3910
  class EvacuateServer(command.ShowOne):
@@ -3843,7 +3925,7 @@ root disk will be preserved and reused for the evacuated instance on the new
3843
3925
  host."""
3844
3926
  )
3845
3927
 
3846
- def get_parser(self, prog_name):
3928
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
3847
3929
  parser = super().get_parser(prog_name)
3848
3930
  parser.add_argument(
3849
3931
  'server',
@@ -3890,8 +3972,10 @@ host."""
3890
3972
  )
3891
3973
  return parser
3892
3974
 
3893
- def take_action(self, parsed_args):
3894
- def _show_progress(progress):
3975
+ def take_action(
3976
+ self, parsed_args: argparse.Namespace
3977
+ ) -> tuple[Sequence[str], Iterable[Any]]:
3978
+ def _show_progress(progress: int | None) -> None:
3895
3979
  if progress:
3896
3980
  self.app.stdout.write(f'\rProgress: {progress}')
3897
3981
  self.app.stdout.flush()
@@ -3946,13 +4030,14 @@ host."""
3946
4030
  raise exceptions.CommandError(msg)
3947
4031
 
3948
4032
  data = _prep_server_detail(compute_client, image_client, server)
3949
- return zip(*sorted(data.items()))
4033
+ col_headers, col_data = zip(*sorted(data.items()))
4034
+ return col_headers, col_data
3950
4035
 
3951
4036
 
3952
4037
  class RemoveFixedIP(command.Command):
3953
4038
  _description = _("Remove fixed IP address from server")
3954
4039
 
3955
- def get_parser(self, prog_name):
4040
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
3956
4041
  parser = super().get_parser(prog_name)
3957
4042
  parser.add_argument(
3958
4043
  "server",
@@ -3966,7 +4051,7 @@ class RemoveFixedIP(command.Command):
3966
4051
  )
3967
4052
  return parser
3968
4053
 
3969
- def take_action(self, parsed_args):
4054
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
3970
4055
  compute_client = self.app.client_manager.compute
3971
4056
 
3972
4057
  server = compute_client.find_server(
@@ -3977,10 +4062,11 @@ class RemoveFixedIP(command.Command):
3977
4062
  )
3978
4063
 
3979
4064
 
3980
- class RemoveFloatingIP(network_common.NetworkAndComputeCommand):
4065
+ class RemoveFloatingIP(command.Command):
3981
4066
  _description = _("Remove floating IP address from server")
3982
4067
 
3983
- def update_parser_common(self, parser):
4068
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4069
+ parser = super().get_parser(prog_name)
3984
4070
  parser.add_argument(
3985
4071
  "server",
3986
4072
  metavar="<server>",
@@ -3995,7 +4081,8 @@ class RemoveFloatingIP(network_common.NetworkAndComputeCommand):
3995
4081
  )
3996
4082
  return parser
3997
4083
 
3998
- def take_action_network(self, client, parsed_args):
4084
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4085
+ client = self.app.client_manager.network
3999
4086
  obj = client.find_ip(
4000
4087
  parsed_args.ip_address,
4001
4088
  ignore_missing=False,
@@ -4003,15 +4090,11 @@ class RemoveFloatingIP(network_common.NetworkAndComputeCommand):
4003
4090
 
4004
4091
  client.update_ip(obj, port_id=None)
4005
4092
 
4006
- def take_action_compute(self, client, parsed_args):
4007
- server = client.find_server(parsed_args.server, ignore_missing=False)
4008
- client.remove_floating_ip_from_server(server, parsed_args.ip_address)
4009
-
4010
4093
 
4011
4094
  class RemovePort(command.Command):
4012
4095
  _description = _("Remove port from server")
4013
4096
 
4014
- def get_parser(self, prog_name):
4097
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4015
4098
  parser = super().get_parser(prog_name)
4016
4099
  parser.add_argument(
4017
4100
  "server",
@@ -4025,7 +4108,7 @@ class RemovePort(command.Command):
4025
4108
  )
4026
4109
  return parser
4027
4110
 
4028
- def take_action(self, parsed_args):
4111
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4029
4112
  compute_client = self.app.client_manager.compute
4030
4113
 
4031
4114
  server = compute_client.find_server(
@@ -4050,7 +4133,7 @@ class RemovePort(command.Command):
4050
4133
  class RemoveNetwork(command.Command):
4051
4134
  _description = _("Remove all ports of a network from server")
4052
4135
 
4053
- def get_parser(self, prog_name):
4136
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4054
4137
  parser = super().get_parser(prog_name)
4055
4138
  parser.add_argument(
4056
4139
  "server",
@@ -4064,7 +4147,7 @@ class RemoveNetwork(command.Command):
4064
4147
  )
4065
4148
  return parser
4066
4149
 
4067
- def take_action(self, parsed_args):
4150
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4068
4151
  compute_client = self.app.client_manager.compute
4069
4152
 
4070
4153
  server = compute_client.find_server(
@@ -4090,7 +4173,7 @@ class RemoveNetwork(command.Command):
4090
4173
  class RemoveServerSecurityGroup(command.Command):
4091
4174
  _description = _("Remove security group from server")
4092
4175
 
4093
- def get_parser(self, prog_name):
4176
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4094
4177
  parser = super().get_parser(prog_name)
4095
4178
  parser.add_argument(
4096
4179
  'server',
@@ -4108,7 +4191,7 @@ class RemoveServerSecurityGroup(command.Command):
4108
4191
  )
4109
4192
  return parser
4110
4193
 
4111
- def take_action(self, parsed_args):
4194
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4112
4195
  compute_client = self.app.client_manager.compute
4113
4196
 
4114
4197
  server = compute_client.find_server(
@@ -4164,7 +4247,7 @@ Specify ``--os-compute-api-version 2.20`` or higher to remove a
4164
4247
  volume from a server with status ``SHELVED`` or ``SHELVED_OFFLOADED``."""
4165
4248
  )
4166
4249
 
4167
- def get_parser(self, prog_name):
4250
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4168
4251
  parser = super().get_parser(prog_name)
4169
4252
  parser.add_argument(
4170
4253
  'server',
@@ -4178,9 +4261,11 @@ volume from a server with status ``SHELVED`` or ``SHELVED_OFFLOADED``."""
4178
4261
  )
4179
4262
  return parser
4180
4263
 
4181
- def take_action(self, parsed_args):
4264
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4182
4265
  compute_client = self.app.client_manager.compute
4183
- volume_client = self.app.client_manager.sdk_connection.volume
4266
+ volume_client = sdk_utils.ensure_service_version(
4267
+ self.app.client_manager.sdk_connection.volume, '3'
4268
+ )
4184
4269
 
4185
4270
  server = compute_client.find_server(
4186
4271
  parsed_args.server,
@@ -4192,8 +4277,8 @@ volume from a server with status ``SHELVED`` or ``SHELVED_OFFLOADED``."""
4192
4277
  )
4193
4278
 
4194
4279
  compute_client.delete_volume_attachment(
4195
- volume,
4196
4280
  server,
4281
+ volume,
4197
4282
  ignore_missing=False,
4198
4283
  )
4199
4284
 
@@ -4206,7 +4291,7 @@ Specify ``--os-compute-api-version 2.87`` or higher to rescue a
4206
4291
  server booted from a volume."""
4207
4292
  )
4208
4293
 
4209
- def get_parser(self, prog_name):
4294
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4210
4295
  parser = super().get_parser(prog_name)
4211
4296
  parser.add_argument(
4212
4297
  'server',
@@ -4231,7 +4316,7 @@ server booted from a volume."""
4231
4316
  )
4232
4317
  return parser
4233
4318
 
4234
- def take_action(self, parsed_args):
4319
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4235
4320
  compute_client = self.app.client_manager.compute
4236
4321
  image_client = self.app.client_manager.image
4237
4322
 
@@ -4260,7 +4345,7 @@ confirm (verify) success and release the old server or to declare a revert to
4260
4345
  release the new server and restart the old one."""
4261
4346
  )
4262
4347
 
4263
- def get_parser(self, prog_name):
4348
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4264
4349
  parser = super().get_parser(prog_name)
4265
4350
  parser.add_argument(
4266
4351
  'server',
@@ -4298,8 +4383,8 @@ release the new server and restart the old one."""
4298
4383
  )
4299
4384
  return parser
4300
4385
 
4301
- def take_action(self, parsed_args):
4302
- def _show_progress(progress):
4386
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4387
+ def _show_progress(progress: int | None) -> None:
4303
4388
  if progress:
4304
4389
  self.app.stdout.write(f'\rProgress: {progress}')
4305
4390
  self.app.stdout.flush()
@@ -4356,7 +4441,7 @@ class ResizeConfirm(command.Command):
4356
4441
  Confirm (verify) success of resize operation and release the old server."""
4357
4442
  )
4358
4443
 
4359
- def get_parser(self, prog_name):
4444
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4360
4445
  parser = super().get_parser(prog_name)
4361
4446
  parser.add_argument(
4362
4447
  'server',
@@ -4365,7 +4450,7 @@ Confirm (verify) success of resize operation and release the old server."""
4365
4450
  )
4366
4451
  return parser
4367
4452
 
4368
- def take_action(self, parsed_args):
4453
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4369
4454
  compute_client = self.app.client_manager.compute
4370
4455
  server = compute_client.find_server(
4371
4456
  parsed_args.server, ignore_missing=False
@@ -4377,7 +4462,7 @@ Confirm (verify) success of resize operation and release the old server."""
4377
4462
  class MigrateConfirm(ResizeConfirm):
4378
4463
  _description = _("DEPRECATED: Use 'server migration confirm' instead.")
4379
4464
 
4380
- def take_action(self, parsed_args):
4465
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4381
4466
  msg = _(
4382
4467
  "The 'server migrate confirm' command has been deprecated in "
4383
4468
  "favour of the 'server migration confirm' command."
@@ -4404,7 +4489,7 @@ Revert the resize operation. Release the new server and restart the old
4404
4489
  one."""
4405
4490
  )
4406
4491
 
4407
- def get_parser(self, prog_name):
4492
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4408
4493
  parser = super().get_parser(prog_name)
4409
4494
  parser.add_argument(
4410
4495
  'server',
@@ -4413,7 +4498,7 @@ one."""
4413
4498
  )
4414
4499
  return parser
4415
4500
 
4416
- def take_action(self, parsed_args):
4501
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4417
4502
  compute_client = self.app.client_manager.compute
4418
4503
  server = compute_client.find_server(
4419
4504
  parsed_args.server, ignore_missing=False
@@ -4425,7 +4510,7 @@ one."""
4425
4510
  class MigrateRevert(ResizeRevert):
4426
4511
  _description = _("DEPRECATED: Use 'server migration revert' instead.")
4427
4512
 
4428
- def take_action(self, parsed_args):
4513
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4429
4514
  msg = _(
4430
4515
  "The 'server migrate revert' command has been deprecated in "
4431
4516
  "favour of the 'server migration revert' command."
@@ -4447,7 +4532,7 @@ one."""
4447
4532
  class RestoreServer(command.Command):
4448
4533
  _description = _("Restore server(s)")
4449
4534
 
4450
- def get_parser(self, prog_name):
4535
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4451
4536
  parser = super().get_parser(prog_name)
4452
4537
  parser.add_argument(
4453
4538
  'server',
@@ -4457,7 +4542,7 @@ class RestoreServer(command.Command):
4457
4542
  )
4458
4543
  return parser
4459
4544
 
4460
- def take_action(self, parsed_args):
4545
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4461
4546
  compute_client = self.app.client_manager.compute
4462
4547
  for server in parsed_args.server:
4463
4548
  server_id = compute_client.find_server(
@@ -4470,7 +4555,7 @@ class RestoreServer(command.Command):
4470
4555
  class ResumeServer(command.Command):
4471
4556
  _description = _("Resume server(s)")
4472
4557
 
4473
- def get_parser(self, prog_name):
4558
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4474
4559
  parser = super().get_parser(prog_name)
4475
4560
  parser.add_argument(
4476
4561
  'server',
@@ -4480,7 +4565,7 @@ class ResumeServer(command.Command):
4480
4565
  )
4481
4566
  return parser
4482
4567
 
4483
- def take_action(self, parsed_args):
4568
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4484
4569
  compute_client = self.app.client_manager.compute
4485
4570
  for server in parsed_args.server:
4486
4571
  server_id = compute_client.find_server(
@@ -4493,7 +4578,7 @@ class ResumeServer(command.Command):
4493
4578
  class SetServer(command.Command):
4494
4579
  _description = _("Set server properties")
4495
4580
 
4496
- def get_parser(self, prog_name):
4581
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4497
4582
  parser = super().get_parser(prog_name)
4498
4583
  parser.add_argument(
4499
4584
  'server',
@@ -4593,7 +4678,7 @@ class SetServer(command.Command):
4593
4678
  return parser
4594
4679
 
4595
4680
  @staticmethod
4596
- def ask_user_yesno(msg):
4681
+ def ask_user_yesno(msg: str) -> bool:
4597
4682
  """Ask user Y/N question
4598
4683
 
4599
4684
  :param str msg: question text
@@ -4606,7 +4691,7 @@ class SetServer(command.Command):
4606
4691
  elif answer in ('n', 'N', 'no'):
4607
4692
  return False
4608
4693
 
4609
- def take_action(self, parsed_args):
4694
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4610
4695
  compute_client = self.app.client_manager.compute
4611
4696
  server = compute_client.find_server(
4612
4697
  parsed_args.server, ignore_missing=False
@@ -4704,7 +4789,7 @@ class ShelveServer(command.Command):
4704
4789
  specified. This is an admin-only operation by default.
4705
4790
  """
4706
4791
 
4707
- def get_parser(self, prog_name):
4792
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4708
4793
  parser = super().get_parser(prog_name)
4709
4794
  parser.add_argument(
4710
4795
  'servers',
@@ -4730,8 +4815,8 @@ class ShelveServer(command.Command):
4730
4815
  )
4731
4816
  return parser
4732
4817
 
4733
- def take_action(self, parsed_args):
4734
- def _show_progress(progress):
4818
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4819
+ def _show_progress(progress: int | None) -> None:
4735
4820
  if progress:
4736
4821
  self.app.stdout.write(f'\rProgress: {progress}')
4737
4822
  self.app.stdout.flush()
@@ -4804,7 +4889,7 @@ Specify ``--os-compute-api-version 2.47`` or higher to see the embedded flavor
4804
4889
  information for the server."""
4805
4890
  )
4806
4891
 
4807
- def get_parser(self, prog_name):
4892
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4808
4893
  parser = super().get_parser(prog_name)
4809
4894
  parser.add_argument(
4810
4895
  'server',
@@ -4830,7 +4915,9 @@ information for the server."""
4830
4915
  )
4831
4916
  return parser
4832
4917
 
4833
- def take_action(self, parsed_args):
4918
+ def take_action(
4919
+ self, parsed_args: argparse.Namespace
4920
+ ) -> tuple[Sequence[str], Iterable[Any]]:
4834
4921
  compute_client = self.app.client_manager.compute
4835
4922
  image_client = self.app.client_manager.image
4836
4923
 
@@ -4841,8 +4928,9 @@ information for the server."""
4841
4928
  )
4842
4929
 
4843
4930
  if parsed_args.diagnostics:
4844
- data = compute_client.get_server_diagnostics(server)
4845
- return zip(*sorted(data.items()))
4931
+ diagnostics = compute_client.get_server_diagnostics(server)
4932
+ col_headers, col_data = zip(*sorted(diagnostics.items()))
4933
+ return col_headers, col_data
4846
4934
 
4847
4935
  topology = None
4848
4936
  if parsed_args.topology:
@@ -4860,13 +4948,14 @@ information for the server."""
4860
4948
  )
4861
4949
  if topology:
4862
4950
  data['topology'] = format_columns.DictColumn(topology)
4863
- return zip(*sorted(data.items()))
4951
+ col_headers, col_data = zip(*sorted(data.items()))
4952
+ return col_headers, col_data
4864
4953
 
4865
4954
 
4866
4955
  class SshServer(command.Command):
4867
4956
  _description = _("SSH to server")
4868
4957
 
4869
- def get_parser(self, prog_name):
4958
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
4870
4959
  parser = super().get_parser(prog_name)
4871
4960
  parser.add_argument(
4872
4961
  'server',
@@ -4960,7 +5049,7 @@ class SshServer(command.Command):
4960
5049
  )
4961
5050
  return parser
4962
5051
 
4963
- def take_action(self, parsed_args):
5052
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
4964
5053
  compute_client = self.app.client_manager.compute
4965
5054
 
4966
5055
  server = compute_client.find_server(
@@ -5017,7 +5106,7 @@ class SshServer(command.Command):
5017
5106
  ip_address_family,
5018
5107
  )
5019
5108
 
5020
- cmd = ' '.join(['ssh', ip_address] + args)
5109
+ cmd = ' '.join(['ssh', ip_address, *args])
5021
5110
  LOG.debug('ssh command: %s', cmd)
5022
5111
  # we intentionally pass through user-provided arguments and run this in
5023
5112
  # the user's shell
@@ -5027,7 +5116,7 @@ class SshServer(command.Command):
5027
5116
  class StartServer(command.Command):
5028
5117
  _description = _("Start server(s)")
5029
5118
 
5030
- def get_parser(self, prog_name):
5119
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
5031
5120
  parser = super().get_parser(prog_name)
5032
5121
  parser.add_argument(
5033
5122
  'server',
@@ -5046,7 +5135,7 @@ class StartServer(command.Command):
5046
5135
  )
5047
5136
  return parser
5048
5137
 
5049
- def take_action(self, parsed_args):
5138
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
5050
5139
  compute_client = self.app.client_manager.compute
5051
5140
  for server in parsed_args.server:
5052
5141
  server_id = compute_client.find_server(
@@ -5062,7 +5151,7 @@ class StartServer(command.Command):
5062
5151
  class StopServer(command.Command):
5063
5152
  _description = _("Stop server(s)")
5064
5153
 
5065
- def get_parser(self, prog_name):
5154
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
5066
5155
  parser = super().get_parser(prog_name)
5067
5156
  parser.add_argument(
5068
5157
  'server',
@@ -5081,7 +5170,7 @@ class StopServer(command.Command):
5081
5170
  )
5082
5171
  return parser
5083
5172
 
5084
- def take_action(self, parsed_args):
5173
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
5085
5174
  compute_client = self.app.client_manager.compute
5086
5175
  for server in parsed_args.server:
5087
5176
  server_id = compute_client.find_server(
@@ -5096,7 +5185,7 @@ class StopServer(command.Command):
5096
5185
  class SuspendServer(command.Command):
5097
5186
  _description = _("Suspend server(s)")
5098
5187
 
5099
- def get_parser(self, prog_name):
5188
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
5100
5189
  parser = super().get_parser(prog_name)
5101
5190
  parser.add_argument(
5102
5191
  'server',
@@ -5106,7 +5195,7 @@ class SuspendServer(command.Command):
5106
5195
  )
5107
5196
  return parser
5108
5197
 
5109
- def take_action(self, parsed_args):
5198
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
5110
5199
  compute_client = self.app.client_manager.compute
5111
5200
  for server in parsed_args.server:
5112
5201
  server_id = compute_client.find_server(
@@ -5119,7 +5208,7 @@ class SuspendServer(command.Command):
5119
5208
  class UnlockServer(command.Command):
5120
5209
  _description = _("Unlock server(s)")
5121
5210
 
5122
- def get_parser(self, prog_name):
5211
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
5123
5212
  parser = super().get_parser(prog_name)
5124
5213
  parser.add_argument(
5125
5214
  'server',
@@ -5129,7 +5218,7 @@ class UnlockServer(command.Command):
5129
5218
  )
5130
5219
  return parser
5131
5220
 
5132
- def take_action(self, parsed_args):
5221
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
5133
5222
  compute_client = self.app.client_manager.compute
5134
5223
  for server in parsed_args.server:
5135
5224
  server_id = compute_client.find_server(
@@ -5142,7 +5231,7 @@ class UnlockServer(command.Command):
5142
5231
  class UnpauseServer(command.Command):
5143
5232
  _description = _("Unpause server(s)")
5144
5233
 
5145
- def get_parser(self, prog_name):
5234
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
5146
5235
  parser = super().get_parser(prog_name)
5147
5236
  parser.add_argument(
5148
5237
  'server',
@@ -5152,7 +5241,7 @@ class UnpauseServer(command.Command):
5152
5241
  )
5153
5242
  return parser
5154
5243
 
5155
- def take_action(self, parsed_args):
5244
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
5156
5245
  compute_client = self.app.client_manager.compute
5157
5246
  for server in parsed_args.server:
5158
5247
  server_id = compute_client.find_server(
@@ -5165,7 +5254,7 @@ class UnpauseServer(command.Command):
5165
5254
  class UnrescueServer(command.Command):
5166
5255
  _description = _("Restore server from rescue mode")
5167
5256
 
5168
- def get_parser(self, prog_name):
5257
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
5169
5258
  parser = super().get_parser(prog_name)
5170
5259
  parser.add_argument(
5171
5260
  'server',
@@ -5174,7 +5263,7 @@ class UnrescueServer(command.Command):
5174
5263
  )
5175
5264
  return parser
5176
5265
 
5177
- def take_action(self, parsed_args):
5266
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
5178
5267
  compute_client = self.app.client_manager.compute
5179
5268
  server = compute_client.find_server(
5180
5269
  parsed_args.server, ignore_missing=False
@@ -5185,7 +5274,7 @@ class UnrescueServer(command.Command):
5185
5274
  class UnsetServer(command.Command):
5186
5275
  _description = _("Unset server properties and tags")
5187
5276
 
5188
- def get_parser(self, prog_name):
5277
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
5189
5278
  parser = super().get_parser(prog_name)
5190
5279
  parser.add_argument(
5191
5280
  'server',
@@ -5241,7 +5330,7 @@ class UnsetServer(command.Command):
5241
5330
  )
5242
5331
  return parser
5243
5332
 
5244
- def take_action(self, parsed_args):
5333
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
5245
5334
  compute_client = self.app.client_manager.compute
5246
5335
 
5247
5336
  server = compute_client.find_server(
@@ -5281,7 +5370,7 @@ class UnsetServer(command.Command):
5281
5370
  class UnshelveServer(command.Command):
5282
5371
  _description = _("Unshelve server(s)")
5283
5372
 
5284
- def get_parser(self, prog_name):
5373
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
5285
5374
  parser = super().get_parser(prog_name)
5286
5375
  parser.add_argument(
5287
5376
  'server',
@@ -5327,8 +5416,8 @@ class UnshelveServer(command.Command):
5327
5416
  )
5328
5417
  return parser
5329
5418
 
5330
- def take_action(self, parsed_args):
5331
- def _show_progress(progress):
5419
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
5420
+ def _show_progress(progress: int | None) -> None:
5332
5421
  if progress:
5333
5422
  self.app.stdout.write(f'\rProgress: {progress}')
5334
5423
  self.app.stdout.flush()