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
@@ -11,13 +11,18 @@
11
11
  # under the License.
12
12
  #
13
13
 
14
+ from collections.abc import Iterable, Sequence
15
+ from typing import Any, cast
16
+
14
17
  from osc_lib import exceptions
15
18
 
16
19
  from openstackclient.i18n import _
17
20
 
18
21
 
19
22
  # Transform compute security group rule for display.
20
- def transform_compute_security_group_rule(sg_rule):
23
+ def transform_compute_security_group_rule(
24
+ sg_rule: dict[str, Any],
25
+ ) -> dict[str, Any]:
21
26
  info = {}
22
27
  info.update(sg_rule)
23
28
  from_port = info.pop('from_port')
@@ -45,14 +50,14 @@ def transform_compute_security_group_rule(sg_rule):
45
50
  return info
46
51
 
47
52
 
48
- def str2bool(strbool):
53
+ def str2bool(strbool: str | None) -> bool | None:
49
54
  if strbool is None:
50
55
  return None
51
56
  return strbool.lower() == 'true'
52
57
 
53
58
 
54
- def str2list(strlist):
55
- result = []
59
+ def str2list(strlist: str | None) -> list[str]:
60
+ result: list[str] = []
56
61
  if strlist:
57
62
  result = strlist.split(';')
58
63
  return result
@@ -78,17 +83,20 @@ def str2dict(strdict: str) -> dict[str, str]:
78
83
  else:
79
84
  kvlist[i - 1] = f"{kvlist[i - 1]};{kv}"
80
85
  for kv in kvlist:
81
- key, sep, value = kv.partition(':')
86
+ key, value = kv.split(':', 1)
82
87
  result[key] = value
83
88
  return result
84
89
 
85
90
 
86
- def format_security_group_rule_show(obj):
91
+ def format_security_group_rule_show(
92
+ obj: dict[str, Any],
93
+ ) -> tuple[Sequence[str], Iterable[Any]]:
87
94
  data = transform_compute_security_group_rule(obj)
88
- return zip(*sorted(data.items()))
95
+ col_headers, col_data = zip(*sorted(data.items()))
96
+ return col_headers, col_data
89
97
 
90
98
 
91
- def format_network_port_range(rule):
99
+ def format_network_port_range(rule: dict[str, Any]) -> str:
92
100
  # Display port range or ICMP type and code. For example:
93
101
  # - ICMP type: 'type=3'
94
102
  # - ICMP type and code: 'type=3:code=0'
@@ -114,8 +122,8 @@ def format_network_port_range(rule):
114
122
  return port_range
115
123
 
116
124
 
117
- def format_remote_ip_prefix(rule):
118
- remote_ip_prefix = rule['remote_ip_prefix']
125
+ def format_remote_ip_prefix(rule: dict[str, Any]) -> str | None:
126
+ remote_ip_prefix = cast(str | None, rule['remote_ip_prefix'])
119
127
  if remote_ip_prefix is None:
120
128
  ethertype = rule['ether_type']
121
129
  if ethertype == 'IPv4':
@@ -125,7 +133,7 @@ def format_remote_ip_prefix(rule):
125
133
  return remote_ip_prefix
126
134
 
127
135
 
128
- def convert_ipvx_case(string):
136
+ def convert_ipvx_case(string: str) -> str:
129
137
  if string.lower() == 'ipv4':
130
138
  return 'IPv4'
131
139
  if string.lower() == 'ipv6':
@@ -133,7 +141,7 @@ def convert_ipvx_case(string):
133
141
  return string
134
142
 
135
143
 
136
- def is_icmp_protocol(protocol):
144
+ def is_icmp_protocol(protocol: str | None) -> bool:
137
145
  # NOTE(rtheis): Neutron has deprecated protocol icmpv6.
138
146
  # However, while the OSC CLI doesn't document the protocol,
139
147
  # the code must still handle it. In addition, handle both
@@ -144,12 +152,14 @@ def is_icmp_protocol(protocol):
144
152
  return False
145
153
 
146
154
 
147
- def convert_to_lowercase(string):
155
+ def convert_to_lowercase(string: str) -> str:
148
156
  return string.lower()
149
157
 
150
158
 
151
- def get_protocol(parsed_args, default_protocol='any'):
152
- protocol = default_protocol
159
+ def get_protocol(
160
+ parsed_args: Any, default_protocol: str = 'any'
161
+ ) -> str | None:
162
+ protocol: str | None = default_protocol
153
163
  if parsed_args.protocol is not None:
154
164
  protocol = parsed_args.protocol
155
165
  if hasattr(parsed_args, "proto") and parsed_args.proto is not None:
@@ -159,7 +169,7 @@ def get_protocol(parsed_args, default_protocol='any'):
159
169
  return protocol
160
170
 
161
171
 
162
- def get_ethertype(parsed_args, protocol):
172
+ def get_ethertype(parsed_args: Any, protocol: str | None) -> str:
163
173
  ethertype = 'IPv4'
164
174
  if parsed_args.ethertype is not None:
165
175
  ethertype = parsed_args.ethertype
@@ -168,16 +178,20 @@ def get_ethertype(parsed_args, protocol):
168
178
  return ethertype
169
179
 
170
180
 
171
- def is_ipv6_protocol(protocol):
181
+ def is_ipv6_protocol(protocol: str | None) -> bool:
172
182
  # NOTE(rtheis): Neutron has deprecated protocol icmpv6.
173
183
  # However, while the OSC CLI doesn't document the protocol,
174
184
  # the code must still handle it. In addition, handle both
175
185
  # protocol names and numbers.
176
- if (
177
- protocol is not None
178
- and protocol.startswith('ipv6-')
179
- or protocol in ['icmpv6', '41', '43', '44', '58', '59', '60']
180
- ):
186
+ if (protocol is not None and protocol.startswith('ipv6-')) or protocol in [
187
+ 'icmpv6',
188
+ '41',
189
+ '43',
190
+ '44',
191
+ '58',
192
+ '59',
193
+ '60',
194
+ ]:
181
195
  return True
182
196
  else:
183
197
  return False
@@ -13,7 +13,10 @@
13
13
 
14
14
  """Address group action implementations"""
15
15
 
16
+ import argparse
16
17
  import logging
18
+ from collections.abc import Iterable, Sequence
19
+ from typing import Any
17
20
 
18
21
  import netaddr
19
22
  from osc_lib import exceptions
@@ -27,19 +30,21 @@ from openstackclient.network import common
27
30
  LOG = logging.getLogger(__name__)
28
31
 
29
32
 
30
- def _get_columns(item):
33
+ def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
31
34
  hidden_columns = ['location', 'tenant_id']
32
35
  return utils.get_osc_show_columns_for_sdk_resource(
33
36
  item, {}, hidden_columns
34
37
  )
35
38
 
36
39
 
37
- def _format_addresses(addresses):
40
+ def _format_addresses(addresses: list[str]) -> list[str]:
38
41
  return [str(netaddr.IPNetwork(addr)) for addr in addresses]
39
42
 
40
43
 
41
- def _get_attrs(client_manager, parsed_args):
42
- attrs = {}
44
+ def _get_attrs(
45
+ client_manager: Any, parsed_args: argparse.Namespace
46
+ ) -> dict[str, Any]:
47
+ attrs: dict[str, Any] = {}
43
48
  attrs['name'] = parsed_args.name
44
49
  if parsed_args.description:
45
50
  attrs['description'] = parsed_args.description
@@ -59,7 +64,7 @@ def _get_attrs(client_manager, parsed_args):
59
64
  class CreateAddressGroup(command.ShowOne, common.NeutronCommandWithExtraArgs):
60
65
  _description = _("Create a new Address Group")
61
66
 
62
- def get_parser(self, prog_name):
67
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
63
68
  parser = super().get_parser(prog_name)
64
69
  parser.add_argument(
65
70
  'name', metavar="<name>", help=_("New address group name")
@@ -87,7 +92,9 @@ class CreateAddressGroup(command.ShowOne, common.NeutronCommandWithExtraArgs):
87
92
 
88
93
  return parser
89
94
 
90
- def take_action(self, parsed_args):
95
+ def take_action(
96
+ self, parsed_args: argparse.Namespace
97
+ ) -> tuple[Sequence[str], Iterable[Any]]:
91
98
  client = self.app.client_manager.network
92
99
  attrs = _get_attrs(self.app.client_manager, parsed_args)
93
100
 
@@ -105,7 +112,7 @@ class CreateAddressGroup(command.ShowOne, common.NeutronCommandWithExtraArgs):
105
112
  class DeleteAddressGroup(command.Command):
106
113
  _description = _("Delete address group(s)")
107
114
 
108
- def get_parser(self, prog_name):
115
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
109
116
  parser = super().get_parser(prog_name)
110
117
  parser.add_argument(
111
118
  'address_group',
@@ -116,7 +123,7 @@ class DeleteAddressGroup(command.Command):
116
123
 
117
124
  return parser
118
125
 
119
- def take_action(self, parsed_args):
126
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
120
127
  client = self.app.client_manager.network
121
128
  result = 0
122
129
 
@@ -145,7 +152,7 @@ class DeleteAddressGroup(command.Command):
145
152
  class ListAddressGroup(command.Lister):
146
153
  _description = _("List address groups")
147
154
 
148
- def get_parser(self, prog_name):
155
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
149
156
  parser = super().get_parser(prog_name)
150
157
 
151
158
  parser.add_argument(
@@ -165,7 +172,9 @@ class ListAddressGroup(command.Lister):
165
172
 
166
173
  return parser
167
174
 
168
- def take_action(self, parsed_args):
175
+ def take_action(
176
+ self, parsed_args: argparse.Namespace
177
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
169
178
  client = self.app.client_manager.network
170
179
  columns = (
171
180
  'id',
@@ -210,7 +219,7 @@ class ListAddressGroup(command.Lister):
210
219
  class SetAddressGroup(common.NeutronCommandWithExtraArgs):
211
220
  _description = _("Set address group properties")
212
221
 
213
- def get_parser(self, prog_name):
222
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
214
223
  parser = super().get_parser(prog_name)
215
224
  parser.add_argument(
216
225
  'address_group',
@@ -236,7 +245,7 @@ class SetAddressGroup(common.NeutronCommandWithExtraArgs):
236
245
  )
237
246
  return parser
238
247
 
239
- def take_action(self, parsed_args):
248
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
240
249
  client = self.app.client_manager.network
241
250
  obj = client.find_address_group(
242
251
  parsed_args.address_group, ignore_missing=False
@@ -261,7 +270,7 @@ class SetAddressGroup(common.NeutronCommandWithExtraArgs):
261
270
  class ShowAddressGroup(command.ShowOne):
262
271
  _description = _("Display address group details")
263
272
 
264
- def get_parser(self, prog_name):
273
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
265
274
  parser = super().get_parser(prog_name)
266
275
  parser.add_argument(
267
276
  'address_group',
@@ -271,7 +280,9 @@ class ShowAddressGroup(command.ShowOne):
271
280
 
272
281
  return parser
273
282
 
274
- def take_action(self, parsed_args):
283
+ def take_action(
284
+ self, parsed_args: argparse.Namespace
285
+ ) -> tuple[Sequence[str], Iterable[Any]]:
275
286
  client = self.app.client_manager.network
276
287
  obj = client.find_address_group(
277
288
  parsed_args.address_group, ignore_missing=False
@@ -285,7 +296,7 @@ class ShowAddressGroup(command.ShowOne):
285
296
  class UnsetAddressGroup(command.Command):
286
297
  _description = _("Unset address group properties")
287
298
 
288
- def get_parser(self, prog_name):
299
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
289
300
  parser = super().get_parser(prog_name)
290
301
  parser.add_argument(
291
302
  'address_group',
@@ -304,7 +315,7 @@ class UnsetAddressGroup(command.Command):
304
315
  )
305
316
  return parser
306
317
 
307
- def take_action(self, parsed_args):
318
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
308
319
  client = self.app.client_manager.network
309
320
  obj = client.find_address_group(
310
321
  parsed_args.address_group, ignore_missing=False
@@ -13,7 +13,10 @@
13
13
 
14
14
  """Address scope action implementations"""
15
15
 
16
+ import argparse
16
17
  import logging
18
+ from collections.abc import Iterable, Sequence
19
+ from typing import Any
17
20
 
18
21
  from osc_lib import exceptions
19
22
  from osc_lib import utils
@@ -26,7 +29,7 @@ from openstackclient.network import common
26
29
  LOG = logging.getLogger(__name__)
27
30
 
28
31
 
29
- def _get_columns(item):
32
+ def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
30
33
  column_map = {
31
34
  'is_shared': 'shared',
32
35
  }
@@ -36,8 +39,10 @@ def _get_columns(item):
36
39
  )
37
40
 
38
41
 
39
- def _get_attrs(client_manager, parsed_args):
40
- attrs = {}
42
+ def _get_attrs(
43
+ client_manager: Any, parsed_args: argparse.Namespace
44
+ ) -> dict[str, Any]:
45
+ attrs: dict[str, Any] = {}
41
46
  attrs['name'] = parsed_args.name
42
47
  attrs['ip_version'] = parsed_args.ip_version
43
48
  if parsed_args.share:
@@ -61,7 +66,7 @@ def _get_attrs(client_manager, parsed_args):
61
66
  class CreateAddressScope(command.ShowOne, common.NeutronCommandWithExtraArgs):
62
67
  _description = _("Create a new Address Scope")
63
68
 
64
- def get_parser(self, prog_name):
69
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
65
70
  parser = super().get_parser(prog_name)
66
71
  parser.add_argument(
67
72
  'name', metavar="<name>", help=_("New address scope name")
@@ -96,7 +101,9 @@ class CreateAddressScope(command.ShowOne, common.NeutronCommandWithExtraArgs):
96
101
 
97
102
  return parser
98
103
 
99
- def take_action(self, parsed_args):
104
+ def take_action(
105
+ self, parsed_args: argparse.Namespace
106
+ ) -> tuple[Sequence[str], Iterable[Any]]:
100
107
  client = self.app.client_manager.network
101
108
  attrs = _get_attrs(self.app.client_manager, parsed_args)
102
109
  attrs.update(
@@ -112,7 +119,7 @@ class CreateAddressScope(command.ShowOne, common.NeutronCommandWithExtraArgs):
112
119
  class DeleteAddressScope(command.Command):
113
120
  _description = _("Delete address scope(s)")
114
121
 
115
- def get_parser(self, prog_name):
122
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
116
123
  parser = super().get_parser(prog_name)
117
124
  parser.add_argument(
118
125
  'address_scope',
@@ -123,7 +130,7 @@ class DeleteAddressScope(command.Command):
123
130
 
124
131
  return parser
125
132
 
126
- def take_action(self, parsed_args):
133
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
127
134
  client = self.app.client_manager.network
128
135
  result = 0
129
136
 
@@ -154,7 +161,7 @@ class DeleteAddressScope(command.Command):
154
161
  class ListAddressScope(command.Lister):
155
162
  _description = _("List address scopes")
156
163
 
157
- def get_parser(self, prog_name):
164
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
158
165
  parser = super().get_parser(prog_name)
159
166
 
160
167
  parser.add_argument(
@@ -196,7 +203,9 @@ class ListAddressScope(command.Lister):
196
203
  )
197
204
  return parser
198
205
 
199
- def take_action(self, parsed_args):
206
+ def take_action(
207
+ self, parsed_args: argparse.Namespace
208
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
200
209
  client = self.app.client_manager.network
201
210
  columns = (
202
211
  'id',
@@ -249,7 +258,7 @@ class ListAddressScope(command.Lister):
249
258
  class SetAddressScope(common.NeutronCommandWithExtraArgs):
250
259
  _description = _("Set address scope properties")
251
260
 
252
- def get_parser(self, prog_name):
261
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
253
262
  parser = super().get_parser(prog_name)
254
263
  parser.add_argument(
255
264
  'address_scope',
@@ -273,7 +282,7 @@ class SetAddressScope(common.NeutronCommandWithExtraArgs):
273
282
 
274
283
  return parser
275
284
 
276
- def take_action(self, parsed_args):
285
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
277
286
  client = self.app.client_manager.network
278
287
  obj = client.find_address_scope(
279
288
  parsed_args.address_scope, ignore_missing=False
@@ -294,7 +303,7 @@ class SetAddressScope(common.NeutronCommandWithExtraArgs):
294
303
  class ShowAddressScope(command.ShowOne):
295
304
  _description = _("Display address scope details")
296
305
 
297
- def get_parser(self, prog_name):
306
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
298
307
  parser = super().get_parser(prog_name)
299
308
  parser.add_argument(
300
309
  'address_scope',
@@ -304,7 +313,9 @@ class ShowAddressScope(command.ShowOne):
304
313
 
305
314
  return parser
306
315
 
307
- def take_action(self, parsed_args):
316
+ def take_action(
317
+ self, parsed_args: argparse.Namespace
318
+ ) -> tuple[Sequence[str], Iterable[Any]]:
308
319
  client = self.app.client_manager.network
309
320
  obj = client.find_address_scope(
310
321
  parsed_args.address_scope, ignore_missing=False