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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. openstackclient/__init__.py +2 -6
  2. openstackclient/api/api.py +41 -23
  3. openstackclient/api/compute_v2.py +44 -25
  4. openstackclient/api/object_store_v1.py +75 -97
  5. openstackclient/api/volume_v2.py +2 -1
  6. openstackclient/api/volume_v3.py +2 -1
  7. openstackclient/common/availability_zone.py +58 -42
  8. openstackclient/common/clientmanager.py +56 -29
  9. openstackclient/common/configuration.py +10 -3
  10. openstackclient/common/envvars.py +2 -2
  11. openstackclient/common/extension.py +14 -5
  12. openstackclient/common/limits.py +10 -5
  13. openstackclient/common/module.py +14 -6
  14. openstackclient/common/pagination.py +8 -2
  15. openstackclient/common/progressbar.py +7 -6
  16. openstackclient/common/project_cleanup.py +13 -7
  17. openstackclient/common/quota.py +126 -114
  18. openstackclient/common/versions.py +8 -2
  19. openstackclient/compute/client.py +7 -3
  20. openstackclient/compute/v2/agent.py +17 -10
  21. openstackclient/compute/v2/aggregate.py +36 -22
  22. openstackclient/compute/v2/console.py +14 -8
  23. openstackclient/compute/v2/console_connection.py +11 -3
  24. openstackclient/compute/v2/flavor.py +39 -21
  25. openstackclient/compute/v2/host.py +14 -6
  26. openstackclient/compute/v2/hypervisor.py +14 -5
  27. openstackclient/compute/v2/hypervisor_stats.py +10 -2
  28. openstackclient/compute/v2/keypair.py +29 -14
  29. openstackclient/compute/v2/server.py +251 -171
  30. openstackclient/compute/v2/server_backup.py +10 -4
  31. openstackclient/compute/v2/server_event.py +21 -12
  32. openstackclient/compute/v2/server_group.py +21 -11
  33. openstackclient/compute/v2/server_image.py +19 -10
  34. openstackclient/compute/v2/server_migration.py +24 -10
  35. openstackclient/compute/v2/server_share.py +274 -0
  36. openstackclient/compute/v2/server_volume.py +10 -4
  37. openstackclient/compute/v2/service.py +14 -7
  38. openstackclient/compute/v2/usage.py +26 -21
  39. openstackclient/identity/client.py +8 -3
  40. openstackclient/identity/common.py +103 -41
  41. openstackclient/identity/v2_0/catalog.py +14 -7
  42. openstackclient/identity/v2_0/ec2creds.py +21 -10
  43. openstackclient/identity/v2_0/endpoint.py +23 -11
  44. openstackclient/identity/v2_0/project.py +25 -14
  45. openstackclient/identity/v2_0/role.py +28 -14
  46. openstackclient/identity/v2_0/role_assignment.py +9 -3
  47. openstackclient/identity/v2_0/service.py +26 -12
  48. openstackclient/identity/v2_0/token.py +12 -5
  49. openstackclient/identity/v2_0/user.py +26 -15
  50. openstackclient/identity/v3/access_rule.py +26 -12
  51. openstackclient/identity/v3/application_credential.py +59 -24
  52. openstackclient/identity/v3/catalog.py +14 -7
  53. openstackclient/identity/v3/consumer.py +22 -11
  54. openstackclient/identity/v3/credential.py +36 -16
  55. openstackclient/identity/v3/domain.py +37 -18
  56. openstackclient/identity/v3/ec2creds.py +25 -12
  57. openstackclient/identity/v3/endpoint.py +42 -20
  58. openstackclient/identity/v3/endpoint_group.py +28 -17
  59. openstackclient/identity/v3/federation_protocol.py +71 -50
  60. openstackclient/identity/v3/group.py +55 -32
  61. openstackclient/identity/v3/identity_provider.py +92 -57
  62. openstackclient/identity/v3/implied_role.py +21 -9
  63. openstackclient/identity/v3/limit.py +115 -92
  64. openstackclient/identity/v3/mapping.py +26 -13
  65. openstackclient/identity/v3/policy.py +23 -12
  66. openstackclient/identity/v3/project.py +211 -122
  67. openstackclient/identity/v3/region.py +36 -16
  68. openstackclient/identity/v3/registered_limit.py +116 -109
  69. openstackclient/identity/v3/role.py +61 -31
  70. openstackclient/identity/v3/role_assignment.py +23 -6
  71. openstackclient/identity/v3/service.py +36 -16
  72. openstackclient/identity/v3/service_provider.py +37 -15
  73. openstackclient/identity/v3/tag.py +23 -17
  74. openstackclient/identity/v3/token.py +30 -14
  75. openstackclient/identity/v3/trust.py +32 -14
  76. openstackclient/identity/v3/unscoped_saml.py +10 -2
  77. openstackclient/identity/v3/user.py +49 -26
  78. openstackclient/image/client.py +7 -3
  79. openstackclient/image/v1/image.py +33 -26
  80. openstackclient/image/v2/cache.py +14 -9
  81. openstackclient/image/v2/image.py +76 -49
  82. openstackclient/image/v2/info.py +7 -1
  83. openstackclient/image/v2/metadef_namespaces.py +109 -13
  84. openstackclient/image/v2/metadef_objects.py +28 -15
  85. openstackclient/image/v2/metadef_properties.py +24 -13
  86. openstackclient/image/v2/metadef_resource_type_association.py +14 -7
  87. openstackclient/image/v2/metadef_resource_types.py +7 -1
  88. openstackclient/image/v2/task.py +15 -6
  89. openstackclient/locale/tr_TR/LC_MESSAGES/openstackclient.po +7 -192
  90. openstackclient/network/client.py +7 -2
  91. openstackclient/network/common.py +16 -241
  92. openstackclient/network/utils.py +36 -22
  93. openstackclient/network/v2/address_group.py +27 -16
  94. openstackclient/network/v2/address_scope.py +24 -13
  95. openstackclient/network/v2/bgpvpn/bgpvpn.py +463 -0
  96. openstackclient/network/v2/bgpvpn/constants.py +30 -0
  97. openstackclient/network/v2/bgpvpn/network_association.py +214 -0
  98. openstackclient/network/v2/bgpvpn/port_association.py +490 -0
  99. openstackclient/network/v2/bgpvpn/router_association.py +288 -0
  100. openstackclient/network/v2/default_security_group_rule.py +19 -10
  101. openstackclient/network/v2/floating_ip.py +110 -159
  102. openstackclient/network/v2/floating_ip_port_forwarding.py +30 -18
  103. openstackclient/network/v2/fwaas/__init__.py +0 -0
  104. openstackclient/network/v2/fwaas/group.py +466 -0
  105. openstackclient/network/v2/fwaas/policy.py +518 -0
  106. openstackclient/network/v2/fwaas/rule.py +574 -0
  107. openstackclient/network/v2/ip_availability.py +13 -5
  108. openstackclient/network/v2/l3_conntrack_helper.py +22 -13
  109. openstackclient/network/v2/local_ip.py +24 -13
  110. openstackclient/network/v2/local_ip_association.py +14 -7
  111. openstackclient/network/v2/ndp_proxy.py +20 -11
  112. openstackclient/network/v2/network.py +129 -196
  113. openstackclient/network/v2/network_agent.py +46 -25
  114. openstackclient/network/v2/network_auto_allocated_topology.py +22 -11
  115. openstackclient/network/v2/network_flavor.py +27 -16
  116. openstackclient/network/v2/network_flavor_profile.py +23 -12
  117. openstackclient/network/v2/network_meter.py +21 -10
  118. openstackclient/network/v2/network_meter_rule.py +21 -11
  119. openstackclient/network/v2/network_qos_policy.py +25 -15
  120. openstackclient/network/v2/network_qos_rule.py +32 -17
  121. openstackclient/network/v2/network_qos_rule_type.py +13 -5
  122. openstackclient/network/v2/network_rbac.py +23 -12
  123. openstackclient/network/v2/network_segment.py +20 -11
  124. openstackclient/network/v2/network_segment_range.py +56 -29
  125. openstackclient/network/v2/network_service_provider.py +7 -1
  126. openstackclient/network/v2/network_trunk.py +38 -22
  127. openstackclient/network/v2/port.py +54 -29
  128. openstackclient/network/v2/router.py +75 -52
  129. openstackclient/network/v2/security_group.py +87 -157
  130. openstackclient/network/v2/security_group_rule.py +100 -280
  131. openstackclient/network/v2/subnet.py +49 -28
  132. openstackclient/network/v2/subnet_pool.py +30 -17
  133. openstackclient/network/v2/taas/tap_flow.py +22 -11
  134. openstackclient/network/v2/taas/tap_mirror.py +22 -11
  135. openstackclient/network/v2/taas/tap_service.py +23 -12
  136. openstackclient/object/client.py +7 -2
  137. openstackclient/object/v1/account.py +13 -6
  138. openstackclient/object/v1/container.py +25 -15
  139. openstackclient/object/v1/object.py +25 -15
  140. openstackclient/py.typed +0 -0
  141. openstackclient/shell.py +46 -10
  142. openstackclient/tests/functional/base.py +55 -20
  143. openstackclient/tests/functional/common/test_extension.py +4 -0
  144. openstackclient/tests/functional/common/test_quota.py +3 -1
  145. openstackclient/tests/functional/compute/v2/common.py +14 -13
  146. openstackclient/tests/functional/compute/v2/test_flavor.py +3 -1
  147. openstackclient/tests/functional/compute/v2/test_server.py +3 -0
  148. openstackclient/tests/functional/identity/v2/common.py +10 -6
  149. openstackclient/tests/functional/identity/v2/test_role.py +4 -4
  150. openstackclient/tests/functional/identity/v3/common.py +25 -19
  151. openstackclient/tests/functional/identity/v3/test_group.py +20 -20
  152. openstackclient/tests/functional/identity/v3/test_idp.py +3 -1
  153. openstackclient/tests/functional/identity/v3/test_limit.py +47 -0
  154. openstackclient/tests/functional/identity/v3/test_project.py +10 -10
  155. openstackclient/tests/functional/identity/v3/test_role.py +18 -18
  156. openstackclient/tests/functional/identity/v3/test_role_assignment.py +12 -12
  157. openstackclient/tests/functional/identity/v3/test_user.py +8 -8
  158. openstackclient/tests/functional/image/base.py +1 -6
  159. openstackclient/tests/functional/image/v2/test_metadef_objects.py +69 -0
  160. openstackclient/tests/functional/network/v2/common.py +5 -2
  161. openstackclient/tests/functional/network/v2/test_floating_ip.py +10 -4
  162. openstackclient/tests/functional/network/v2/test_ip_availability.py +4 -0
  163. openstackclient/tests/functional/network/v2/test_network_meter_rule.py +3 -2
  164. openstackclient/tests/functional/network/v2/test_network_segment.py +5 -0
  165. openstackclient/tests/functional/network/v2/test_subnet.py +13 -9
  166. openstackclient/tests/functional/object/v1/common.py +4 -0
  167. openstackclient/tests/functional/volume/v2/common.py +4 -0
  168. openstackclient/tests/functional/volume/v2/test_volume_snapshot.py +27 -11
  169. openstackclient/tests/functional/volume/v2/test_volume_type.py +2 -2
  170. openstackclient/tests/functional/volume/v3/common.py +4 -0
  171. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +56 -138
  172. openstackclient/tests/functional/volume/v3/test_volume_type.py +2 -2
  173. openstackclient/tests/unit/common/test_availability_zone.py +35 -49
  174. openstackclient/tests/unit/common/test_extension.py +2 -2
  175. openstackclient/tests/unit/common/test_module.py +12 -7
  176. openstackclient/tests/unit/common/test_project_cleanup.py +3 -1
  177. openstackclient/tests/unit/common/test_quota.py +62 -23
  178. openstackclient/tests/unit/compute/v2/fakes.py +25 -0
  179. openstackclient/tests/unit/compute/v2/test_flavor.py +28 -2
  180. openstackclient/tests/unit/compute/v2/test_keypair.py +6 -6
  181. openstackclient/tests/unit/compute/v2/test_server.py +17 -104
  182. openstackclient/tests/unit/compute/v2/test_server_share.py +287 -0
  183. openstackclient/tests/unit/identity/v3/fakes.py +3 -0
  184. openstackclient/tests/unit/identity/v3/test_group.py +4 -14
  185. openstackclient/tests/unit/identity/v3/test_identity_provider.py +303 -299
  186. openstackclient/tests/unit/identity/v3/test_limit.py +197 -145
  187. openstackclient/tests/unit/identity/v3/test_project.py +831 -512
  188. openstackclient/tests/unit/identity/v3/test_protocol.py +97 -88
  189. openstackclient/tests/unit/identity/v3/test_registered_limit.py +355 -220
  190. openstackclient/tests/unit/identity/v3/test_user.py +4 -4
  191. openstackclient/tests/unit/image/v2/test_image.py +16 -16
  192. openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +105 -6
  193. openstackclient/tests/unit/network/test_common.py +0 -155
  194. openstackclient/tests/unit/network/v2/bgpvpn/__init__.py +0 -0
  195. openstackclient/tests/unit/network/v2/bgpvpn/fakes.py +179 -0
  196. openstackclient/tests/unit/network/v2/bgpvpn/test_bgpvpn.py +584 -0
  197. openstackclient/tests/unit/network/v2/bgpvpn/test_network_association.py +285 -0
  198. openstackclient/tests/unit/network/v2/bgpvpn/test_port_association.py +384 -0
  199. openstackclient/tests/unit/network/v2/bgpvpn/test_router_association.py +297 -0
  200. openstackclient/tests/unit/network/v2/fwaas/__init__.py +0 -0
  201. openstackclient/tests/unit/network/v2/fwaas/test_group.py +897 -0
  202. openstackclient/tests/unit/network/v2/fwaas/test_policy.py +869 -0
  203. openstackclient/tests/unit/network/v2/fwaas/test_rule.py +980 -0
  204. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_flow.py → test_tap_flow.py} +18 -25
  205. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_mirror.py → test_tap_mirror.py} +19 -29
  206. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_service.py → test_tap_service.py} +19 -29
  207. openstackclient/tests/unit/network/v2/test_address_group.py +2 -2
  208. openstackclient/tests/unit/network/v2/{test_floating_ip_network.py → test_floating_ip.py} +3 -2
  209. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +13 -13
  210. openstackclient/tests/unit/network/v2/test_network_agent.py +8 -4
  211. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +3 -3
  212. openstackclient/tests/unit/network/v2/test_network_flavor.py +2 -2
  213. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +1 -1
  214. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +2 -2
  215. openstackclient/tests/unit/network/v2/test_network_rbac.py +1 -1
  216. openstackclient/tests/unit/network/v2/test_network_segment.py +1 -1
  217. openstackclient/tests/unit/network/v2/test_network_segment_range.py +7 -10
  218. openstackclient/tests/unit/network/v2/test_network_trunk.py +1 -1
  219. openstackclient/tests/unit/network/v2/test_router.py +8 -9
  220. openstackclient/tests/unit/network/v2/{test_security_group_network.py → test_security_group.py} +1 -20
  221. openstackclient/tests/unit/network/v2/{test_security_group_rule_network.py → test_security_group_rule.py} +7 -41
  222. openstackclient/tests/unit/network/v2/test_subnet.py +2 -1
  223. openstackclient/tests/unit/network/v2/test_subnet_pool.py +2 -1
  224. openstackclient/tests/unit/object/v1/fakes.py +8 -7
  225. openstackclient/tests/unit/object/v1/test_container.py +65 -101
  226. openstackclient/tests/unit/object/v1/test_container_all.py +8 -1
  227. openstackclient/tests/unit/object/v1/test_object.py +44 -84
  228. openstackclient/tests/unit/object/v1/test_object_all.py +8 -1
  229. openstackclient/tests/unit/test_hacking.py +108 -0
  230. openstackclient/tests/unit/volume/v2/fakes.py +1 -0
  231. openstackclient/tests/unit/volume/v2/test_consistency_group.py +8 -2
  232. openstackclient/tests/unit/volume/v2/test_volume.py +7 -6
  233. openstackclient/tests/unit/volume/v2/test_volume_backup.py +1 -5
  234. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +2 -1
  235. openstackclient/tests/unit/volume/v2/test_volume_type.py +2 -4
  236. openstackclient/tests/unit/volume/v3/fakes.py +1 -0
  237. openstackclient/tests/unit/volume/v3/test_volume.py +94 -15
  238. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +1 -1
  239. openstackclient/tests/unit/volume/v3/test_volume_backup.py +1 -5
  240. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +55 -1
  241. openstackclient/tests/unit/volume/v3/test_volume_type.py +2 -4
  242. openstackclient/volume/client.py +7 -3
  243. openstackclient/volume/v2/backup_record.py +15 -6
  244. openstackclient/volume/v2/consistency_group.py +37 -25
  245. openstackclient/volume/v2/consistency_group_snapshot.py +27 -12
  246. openstackclient/volume/v2/qos_specs.py +30 -19
  247. openstackclient/volume/v2/service.py +17 -6
  248. openstackclient/volume/v2/volume.py +69 -34
  249. openstackclient/volume/v2/volume_backend.py +19 -6
  250. openstackclient/volume/v2/volume_backup.py +48 -22
  251. openstackclient/volume/v2/volume_host.py +6 -4
  252. openstackclient/volume/v2/volume_snapshot.py +52 -26
  253. openstackclient/volume/v2/volume_transfer_request.py +33 -15
  254. openstackclient/volume/v2/volume_type.py +46 -27
  255. openstackclient/volume/v3/block_storage_cleanup.py +11 -3
  256. openstackclient/volume/v3/block_storage_cluster.py +19 -7
  257. openstackclient/volume/v3/block_storage_log_level.py +15 -6
  258. openstackclient/volume/v3/block_storage_manage.py +10 -4
  259. openstackclient/volume/v3/block_storage_resource_filter.py +17 -5
  260. openstackclient/volume/v3/service.py +16 -6
  261. openstackclient/volume/v3/volume.py +103 -46
  262. openstackclient/volume/v3/volume_attachment.py +43 -21
  263. openstackclient/volume/v3/volume_backup.py +55 -26
  264. openstackclient/volume/v3/volume_group.py +23 -13
  265. openstackclient/volume/v3/volume_group_snapshot.py +32 -13
  266. openstackclient/volume/v3/volume_group_type.py +26 -13
  267. openstackclient/volume/v3/volume_message.py +15 -7
  268. openstackclient/volume/v3/volume_snapshot.py +71 -34
  269. openstackclient/volume/v3/volume_transfer_request.py +33 -15
  270. openstackclient/volume/v3/volume_type.py +45 -27
  271. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/METADATA +6 -6
  272. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/RECORD +279 -267
  273. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/WHEEL +1 -1
  274. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/entry_points.txt +53 -1
  275. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/AUTHORS +9 -0
  276. python_openstackclient-10.0.0.dist-info/pbr.json +1 -0
  277. openstackclient/api/image_v1.py +0 -69
  278. openstackclient/api/image_v2.py +0 -79
  279. openstackclient/network/v2/floating_ip_pool.py +0 -38
  280. openstackclient/tests/functional/image/v1/test_image.py +0 -97
  281. openstackclient/tests/unit/api/test_image_v1.py +0 -96
  282. openstackclient/tests/unit/api/test_image_v2.py +0 -96
  283. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +0 -248
  284. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +0 -49
  285. openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +0 -39
  286. openstackclient/tests/unit/network/v2/test_network_compute.py +0 -404
  287. openstackclient/tests/unit/network/v2/test_security_group_compute.py +0 -392
  288. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +0 -555
  289. python_openstackclient-8.3.0.dist-info/pbr.json +0 -1
  290. /openstackclient/{tests/functional/image/v1 → network/v2/bgpvpn}/__init__.py +0 -0
  291. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/licenses/LICENSE +0 -0
  292. {python_openstackclient-8.3.0.dist-info → python_openstackclient-10.0.0.dist-info}/top_level.txt +0 -0
@@ -16,9 +16,11 @@
16
16
 
17
17
  """Network segment action implementations"""
18
18
 
19
+ import argparse
20
+ from collections.abc import Iterable, Sequence
19
21
  import itertools
20
22
  import logging
21
- import typing as ty
23
+ from typing import Any
22
24
 
23
25
  from osc_lib import exceptions
24
26
  from osc_lib import utils
@@ -32,14 +34,14 @@ from openstackclient.network import common
32
34
  LOG = logging.getLogger(__name__)
33
35
 
34
36
 
35
- def _get_columns(item):
37
+ def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
36
38
  hidden_columns = ['location', 'tenant_id']
37
39
  return utils.get_osc_show_columns_for_sdk_resource(
38
40
  item, {}, hidden_columns
39
41
  )
40
42
 
41
43
 
42
- def _get_ranges(item):
44
+ def _get_ranges(item: Any) -> Iterable[str]:
43
45
  item = sorted([int(i) for i in item])
44
46
  for a, b in itertools.groupby(enumerate(item), lambda xy: xy[1] - xy[0]):
45
47
  c = list(b)
@@ -48,18 +50,24 @@ def _get_ranges(item):
48
50
  )
49
51
 
50
52
 
51
- def _hack_tuple_value_update_by_index(tup, index, value):
53
+ def _hack_tuple_value_update_by_index(
54
+ tup: tuple[Any, ...], index: int, value: Any
55
+ ) -> tuple[Any, ...]:
52
56
  lot = list(tup)
53
57
  lot[index] = value
54
58
  return tuple(lot)
55
59
 
56
60
 
57
- def _is_prop_empty(columns, props, prop_name):
61
+ def _is_prop_empty(
62
+ columns: tuple[str, ...], props: tuple[Any, ...], prop_name: str
63
+ ) -> bool:
58
64
  return True if not props[columns.index(prop_name)] else False
59
65
 
60
66
 
61
- def _exchange_dict_keys_with_values(orig_dict):
62
- updated_dict: dict[str, ty.Any] = {}
67
+ def _exchange_dict_keys_with_values(
68
+ orig_dict: dict[Any, Any],
69
+ ) -> dict[str, Any]:
70
+ updated_dict: dict[str, Any] = {}
63
71
  for k, v in orig_dict.items():
64
72
  k = [k]
65
73
  if not updated_dict.get(v):
@@ -69,7 +77,9 @@ def _exchange_dict_keys_with_values(orig_dict):
69
77
  return updated_dict
70
78
 
71
79
 
72
- def _update_available_from_props(columns, props):
80
+ def _update_available_from_props(
81
+ columns: tuple[str, ...], props: tuple[Any, ...]
82
+ ) -> tuple[Any, ...]:
73
83
  index_available = columns.index('available')
74
84
  props = _hack_tuple_value_update_by_index(
75
85
  props, index_available, list(_get_ranges(props[index_available]))
@@ -77,7 +87,9 @@ def _update_available_from_props(columns, props):
77
87
  return props
78
88
 
79
89
 
80
- def _update_used_from_props(columns, props):
90
+ def _update_used_from_props(
91
+ columns: tuple[str, ...], props: tuple[Any, ...]
92
+ ) -> tuple[Any, ...]:
81
93
  index_used = columns.index('used')
82
94
  updated_used = _exchange_dict_keys_with_values(props[index_used])
83
95
  for k, v in updated_used.items():
@@ -86,7 +98,9 @@ def _update_used_from_props(columns, props):
86
98
  return props
87
99
 
88
100
 
89
- def _update_additional_fields_from_props(columns, props):
101
+ def _update_additional_fields_from_props(
102
+ columns: tuple[str, ...], props: tuple[Any, ...]
103
+ ) -> tuple[Any, ...]:
90
104
  props = _update_available_from_props(columns, props)
91
105
  props = _update_used_from_props(columns, props)
92
106
  return props
@@ -97,7 +111,7 @@ class CreateNetworkSegmentRange(
97
111
  ):
98
112
  _description = _("Create new network segment range")
99
113
 
100
- def get_parser(self, prog_name):
114
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
101
115
  parser = super().get_parser(prog_name)
102
116
  shared_group = parser.add_mutually_exclusive_group()
103
117
  shared_group.add_argument(
@@ -170,7 +184,9 @@ class CreateNetworkSegmentRange(
170
184
 
171
185
  return parser
172
186
 
173
- def take_action(self, parsed_args):
187
+ def take_action(
188
+ self, parsed_args: argparse.Namespace
189
+ ) -> tuple[Sequence[str], Iterable[Any]]:
174
190
  network_client = self.app.client_manager.network
175
191
  try:
176
192
  # Verify that the extension exists.
@@ -251,7 +267,7 @@ class CreateNetworkSegmentRange(
251
267
  class DeleteNetworkSegmentRange(command.Command):
252
268
  _description = _("Delete network segment range(s)")
253
269
 
254
- def get_parser(self, prog_name):
270
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
255
271
  parser = super().get_parser(prog_name)
256
272
  parser.add_argument(
257
273
  'network_segment_range',
@@ -261,7 +277,7 @@ class DeleteNetworkSegmentRange(command.Command):
261
277
  )
262
278
  return parser
263
279
 
264
- def take_action(self, parsed_args):
280
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
265
281
  network_client = self.app.client_manager.network
266
282
  try:
267
283
  # Verify that the extension exists.
@@ -304,7 +320,7 @@ class DeleteNetworkSegmentRange(command.Command):
304
320
  class ListNetworkSegmentRange(command.Lister):
305
321
  _description = _("List network segment ranges")
306
322
 
307
- def get_parser(self, prog_name):
323
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
308
324
  parser = super().get_parser(prog_name)
309
325
  parser.add_argument(
310
326
  '--long',
@@ -344,7 +360,9 @@ class ListNetworkSegmentRange(command.Lister):
344
360
  )
345
361
  return parser
346
362
 
347
- def take_action(self, parsed_args):
363
+ def take_action(
364
+ self, parsed_args: argparse.Namespace
365
+ ) -> tuple[tuple[str, ...], tuple[Any, ...]]:
348
366
  network_client = self.app.client_manager.network
349
367
  try:
350
368
  # Verify that the extension exists.
@@ -402,18 +420,25 @@ class ListNetworkSegmentRange(command.Lister):
402
420
  'available',
403
421
  )
404
422
 
405
- display_props: tuple[ty.Any, ...] = tuple()
423
+ display_props: tuple[Any, ...] = tuple()
406
424
  for s in data:
407
425
  props = utils.get_item_properties(s, columns)
408
426
  if (
409
- parsed_args.available
410
- and _is_prop_empty(columns, props, 'available')
411
- or parsed_args.unavailable
412
- and not _is_prop_empty(columns, props, 'available')
413
- or parsed_args.used
414
- and _is_prop_empty(columns, props, 'used')
415
- or parsed_args.unused
416
- and not _is_prop_empty(columns, props, 'used')
427
+ (
428
+ parsed_args.available
429
+ and _is_prop_empty(columns, props, 'available')
430
+ )
431
+ or (
432
+ parsed_args.unavailable
433
+ and not _is_prop_empty(columns, props, 'available')
434
+ )
435
+ or (
436
+ parsed_args.used and _is_prop_empty(columns, props, 'used')
437
+ )
438
+ or (
439
+ parsed_args.unused
440
+ and not _is_prop_empty(columns, props, 'used')
441
+ )
417
442
  ):
418
443
  continue
419
444
  if parsed_args.long:
@@ -426,7 +451,7 @@ class ListNetworkSegmentRange(command.Lister):
426
451
  class SetNetworkSegmentRange(common.NeutronCommandWithExtraArgs):
427
452
  _description = _("Set network segment range properties")
428
453
 
429
- def get_parser(self, prog_name):
454
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
430
455
  parser = super().get_parser(prog_name)
431
456
  parser.add_argument(
432
457
  'network_segment_range',
@@ -452,7 +477,7 @@ class SetNetworkSegmentRange(common.NeutronCommandWithExtraArgs):
452
477
  )
453
478
  return parser
454
479
 
455
- def take_action(self, parsed_args):
480
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
456
481
  network_client = self.app.client_manager.network
457
482
  try:
458
483
  # Verify that the extension exists.
@@ -490,7 +515,7 @@ class SetNetworkSegmentRange(common.NeutronCommandWithExtraArgs):
490
515
  class ShowNetworkSegmentRange(command.ShowOne):
491
516
  _description = _("Display network segment range details")
492
517
 
493
- def get_parser(self, prog_name):
518
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
494
519
  parser = super().get_parser(prog_name)
495
520
  parser.add_argument(
496
521
  'network_segment_range',
@@ -499,7 +524,9 @@ class ShowNetworkSegmentRange(command.ShowOne):
499
524
  )
500
525
  return parser
501
526
 
502
- def take_action(self, parsed_args):
527
+ def take_action(
528
+ self, parsed_args: argparse.Namespace
529
+ ) -> tuple[Sequence[str], Iterable[Any]]:
503
530
  network_client = self.app.client_manager.network
504
531
  try:
505
532
  # Verify that the extension exists.
@@ -13,6 +13,10 @@
13
13
 
14
14
  """Network Service Providers Implementation"""
15
15
 
16
+ import argparse
17
+ from collections.abc import Iterable
18
+ from typing import Any
19
+
16
20
  from osc_lib import utils
17
21
 
18
22
  from openstackclient import command
@@ -22,7 +26,9 @@ from openstackclient.i18n import _
22
26
  class ListNetworkServiceProvider(command.Lister):
23
27
  _description = _("List Service Providers")
24
28
 
25
- def take_action(self, parsed_args):
29
+ def take_action(
30
+ self, parsed_args: argparse.Namespace
31
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
26
32
  client = self.app.client_manager.network
27
33
 
28
34
  columns = (
@@ -16,8 +16,10 @@
16
16
 
17
17
  """Network trunk and subports action implementations"""
18
18
 
19
+ import argparse
20
+ from collections.abc import Iterable, Sequence
19
21
  import logging
20
- import typing as ty
22
+ from typing import Any
21
23
 
22
24
  from cliff import columns as cliff_columns
23
25
  from osc_lib.cli import format_columns
@@ -37,14 +39,14 @@ SUB_PORTS = 'sub_ports'
37
39
 
38
40
 
39
41
  class AdminStateColumn(cliff_columns.FormattableColumn[bool]):
40
- def human_readable(self):
42
+ def human_readable(self) -> str:
41
43
  return 'UP' if self._value else 'DOWN'
42
44
 
43
45
 
44
46
  class CreateNetworkTrunk(command.ShowOne):
45
47
  """Create a network trunk for a given project"""
46
48
 
47
- def get_parser(self, prog_name):
49
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
48
50
  parser = super().get_parser(prog_name)
49
51
  parser.add_argument(
50
52
  'name', metavar='<name>', help=_("Name of the trunk to create")
@@ -87,7 +89,9 @@ class CreateNetworkTrunk(command.ShowOne):
87
89
  identity_utils.add_project_owner_option_to_parser(parser)
88
90
  return parser
89
91
 
90
- def take_action(self, parsed_args):
92
+ def take_action(
93
+ self, parsed_args: argparse.Namespace
94
+ ) -> tuple[Sequence[str], Iterable[Any]]:
91
95
  network_client = self.app.client_manager.network
92
96
  identity_client = self.app.client_manager.identity
93
97
  attrs = _get_attrs_for_trunk(
@@ -104,7 +108,7 @@ class CreateNetworkTrunk(command.ShowOne):
104
108
  class DeleteNetworkTrunk(command.Command):
105
109
  """Delete a given network trunk"""
106
110
 
107
- def get_parser(self, prog_name):
111
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
108
112
  parser = super().get_parser(prog_name)
109
113
  parser.add_argument(
110
114
  'trunk',
@@ -114,7 +118,7 @@ class DeleteNetworkTrunk(command.Command):
114
118
  )
115
119
  return parser
116
120
 
117
- def take_action(self, parsed_args):
121
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
118
122
  network_client = self.app.client_manager.network
119
123
  result = 0
120
124
  for trunk in parsed_args.trunk:
@@ -145,7 +149,7 @@ class DeleteNetworkTrunk(command.Command):
145
149
  class ListNetworkTrunk(command.Lister):
146
150
  """List all network trunks"""
147
151
 
148
- def get_parser(self, prog_name):
152
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
149
153
  parser = super().get_parser(prog_name)
150
154
  parser.add_argument(
151
155
  '--long',
@@ -155,7 +159,9 @@ class ListNetworkTrunk(command.Lister):
155
159
  )
156
160
  return parser
157
161
 
158
- def take_action(self, parsed_args):
162
+ def take_action(
163
+ self, parsed_args: argparse.Namespace
164
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
159
165
  network_client = self.app.client_manager.network
160
166
  data = network_client.trunks()
161
167
  headers: tuple[str, ...] = ('ID', 'Name', 'Parent Port', 'Description')
@@ -184,7 +190,7 @@ class ListNetworkTrunk(command.Lister):
184
190
  class SetNetworkTrunk(command.Command):
185
191
  """Set network trunk properties"""
186
192
 
187
- def get_parser(self, prog_name):
193
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
188
194
  parser = super().get_parser(prog_name)
189
195
  parser.add_argument(
190
196
  'trunk', metavar="<trunk>", help=_("Trunk to modify (name or ID)")
@@ -220,7 +226,7 @@ class SetNetworkTrunk(command.Command):
220
226
  )
221
227
  return parser
222
228
 
223
- def take_action(self, parsed_args):
229
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
224
230
  network_client = self.app.client_manager.network
225
231
  identity_client = self.app.client_manager.identity
226
232
  trunk_id = network_client.find_trunk(
@@ -255,14 +261,16 @@ class SetNetworkTrunk(command.Command):
255
261
  class ShowNetworkTrunk(command.ShowOne):
256
262
  """Show information of a given network trunk"""
257
263
 
258
- def get_parser(self, prog_name):
264
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
259
265
  parser = super().get_parser(prog_name)
260
266
  parser.add_argument(
261
267
  'trunk', metavar="<trunk>", help=_("Trunk to display (name or ID)")
262
268
  )
263
269
  return parser
264
270
 
265
- def take_action(self, parsed_args):
271
+ def take_action(
272
+ self, parsed_args: argparse.Namespace
273
+ ) -> tuple[Sequence[str], Iterable[Any]]:
266
274
  network_client = self.app.client_manager.network
267
275
  trunk_id = network_client.find_trunk(
268
276
  parsed_args.trunk,
@@ -279,7 +287,7 @@ class ShowNetworkTrunk(command.ShowOne):
279
287
  class ListNetworkSubport(command.Lister):
280
288
  """List all subports for a given network trunk"""
281
289
 
282
- def get_parser(self, prog_name):
290
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
283
291
  parser = super().get_parser(prog_name)
284
292
  parser.add_argument(
285
293
  '--trunk',
@@ -289,7 +297,9 @@ class ListNetworkSubport(command.Lister):
289
297
  )
290
298
  return parser
291
299
 
292
- def take_action(self, parsed_args):
300
+ def take_action(
301
+ self, parsed_args: argparse.Namespace
302
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
293
303
  network_client = self.app.client_manager.network
294
304
  trunk_id = network_client.find_trunk(
295
305
  parsed_args.trunk,
@@ -321,7 +331,7 @@ class ListNetworkSubport(command.Lister):
321
331
  class UnsetNetworkTrunk(command.Command):
322
332
  """Unset subports from a given network trunk"""
323
333
 
324
- def get_parser(self, prog_name):
334
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
325
335
  parser = super().get_parser(prog_name)
326
336
  parser.add_argument(
327
337
  'trunk',
@@ -341,7 +351,7 @@ class UnsetNetworkTrunk(command.Command):
341
351
  )
342
352
  return parser
343
353
 
344
- def take_action(self, parsed_args):
354
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
345
355
  network_client = self.app.client_manager.network
346
356
  attrs = _get_attrs_for_subports(network_client, parsed_args)
347
357
  trunk_id = network_client.find_trunk(
@@ -357,15 +367,17 @@ _formatters = {
357
367
  }
358
368
 
359
369
 
360
- def _get_columns(item):
370
+ def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
361
371
  hidden_columns = ['location', 'tenant_id']
362
372
  return osc_utils.get_osc_show_columns_for_sdk_resource(
363
373
  item, {}, hidden_columns
364
374
  )
365
375
 
366
376
 
367
- def _get_attrs_for_trunk(network_client, identity_client, parsed_args):
368
- attrs: dict[str, ty.Any] = {}
377
+ def _get_attrs_for_trunk(
378
+ network_client: Any, identity_client: Any, parsed_args: argparse.Namespace
379
+ ) -> dict[str, Any]:
380
+ attrs: dict[str, Any] = {}
369
381
  if parsed_args.name is not None:
370
382
  attrs['name'] = str(parsed_args.name)
371
383
  if parsed_args.description is not None:
@@ -392,12 +404,14 @@ def _get_attrs_for_trunk(network_client, identity_client, parsed_args):
392
404
  parsed_args.project,
393
405
  parsed_args.project_domain,
394
406
  ).id
395
- attrs['tenant_id'] = project_id
407
+ attrs['project_id'] = project_id
396
408
 
397
409
  return attrs
398
410
 
399
411
 
400
- def _format_subports(network_client, subports):
412
+ def _format_subports(
413
+ network_client: Any, subports: list[dict[str, Any]]
414
+ ) -> list[dict[str, Any]]:
401
415
  attrs = []
402
416
  for subport in subports:
403
417
  subport_attrs = {}
@@ -424,7 +438,9 @@ def _format_subports(network_client, subports):
424
438
  return attrs
425
439
 
426
440
 
427
- def _get_attrs_for_subports(network_client, parsed_args):
441
+ def _get_attrs_for_subports(
442
+ network_client: Any, parsed_args: argparse.Namespace
443
+ ) -> list[dict[str, Any]]:
428
444
  attrs = []
429
445
  if 'set_subports' in parsed_args and parsed_args.set_subports is not None:
430
446
  attrs = _format_subports(network_client, parsed_args.set_subports)
@@ -14,10 +14,11 @@
14
14
  """Port action implementations"""
15
15
 
16
16
  import argparse
17
+ from collections.abc import Iterable, Sequence
17
18
  import copy
18
19
  import json
19
20
  import logging
20
- import typing as ty
21
+ from typing import Any
21
22
 
22
23
  from cliff import columns as cliff_columns
23
24
  from osc_lib.cli import format_columns
@@ -35,22 +36,22 @@ LOG = logging.getLogger(__name__)
35
36
 
36
37
 
37
38
  class AdminStateColumn(cliff_columns.FormattableColumn[bool]):
38
- def human_readable(self):
39
+ def human_readable(self) -> str:
39
40
  return 'UP' if self._value else 'DOWN'
40
41
 
41
42
 
42
43
  class SubPortColumn(format_columns.ListDictColumn):
43
- _value: ty.Any
44
+ _value: Any
44
45
 
45
- def _retrieve_subports(self):
46
+ def _retrieve_subports(self) -> None:
46
47
  if isinstance(self._value, dict):
47
48
  self._value = self._value['sub_ports']
48
49
 
49
- def human_readable(self):
50
+ def human_readable(self) -> str:
50
51
  self._retrieve_subports()
51
52
  return super().human_readable()
52
53
 
53
- def machine_readable(self):
54
+ def machine_readable(self) -> Any:
54
55
  self._retrieve_subports()
55
56
  return super().machine_readable()
56
57
 
@@ -73,7 +74,7 @@ _list_formatters = copy.deepcopy(_formatters)
73
74
  _list_formatters.update({'trunk_details': SubPortColumn})
74
75
 
75
76
 
76
- def _get_columns(item):
77
+ def _get_columns(item: Any) -> tuple[tuple[str, ...], tuple[str, ...]]:
77
78
  column_data_mapping = {
78
79
  'admin_state_up': 'is_admin_state_up',
79
80
  'allowed_address_pairs': 'allowed_address_pairs',
@@ -127,7 +128,13 @@ class JSONKeyValueAction(argparse.Action):
127
128
  Ensures that ``dest`` is a dict
128
129
  """
129
130
 
130
- def __call__(self, parser, namespace, values, option_string=None):
131
+ def __call__(
132
+ self,
133
+ parser: argparse.ArgumentParser,
134
+ namespace: argparse.Namespace,
135
+ values: Any,
136
+ option_string: str | None = None,
137
+ ) -> None:
131
138
  # Make sure we have an empty dict rather than None
132
139
  if getattr(namespace, self.dest, None) is None:
133
140
  setattr(namespace, self.dest, {})
@@ -148,8 +155,10 @@ class JSONKeyValueAction(argparse.Action):
148
155
  raise argparse.ArgumentError(self, msg)
149
156
 
150
157
 
151
- def _get_attrs(client_manager, parsed_args):
152
- attrs = {}
158
+ def _get_attrs(
159
+ client_manager: Any, parsed_args: argparse.Namespace
160
+ ) -> dict[str, Any]:
161
+ attrs: dict[str, Any] = {}
153
162
 
154
163
  if parsed_args.description is not None:
155
164
  attrs['description'] = parsed_args.description
@@ -250,7 +259,9 @@ def _get_attrs(client_manager, parsed_args):
250
259
  return attrs
251
260
 
252
261
 
253
- def _prepare_fixed_ips(client_manager, parsed_args):
262
+ def _prepare_fixed_ips(
263
+ client_manager: Any, parsed_args: argparse.Namespace
264
+ ) -> None:
254
265
  """Fix and properly format fixed_ip option.
255
266
 
256
267
  Appropriately convert any subnet names to their respective ids.
@@ -281,7 +292,9 @@ def _prepare_fixed_ips(client_manager, parsed_args):
281
292
  parsed_args.fixed_ip = ips
282
293
 
283
294
 
284
- def _prepare_filter_fixed_ips(client_manager, parsed_args):
295
+ def _prepare_filter_fixed_ips(
296
+ client_manager: Any, parsed_args: argparse.Namespace
297
+ ) -> list[str]:
285
298
  """Fix and properly format fixed_ip option for filtering.
286
299
 
287
300
  Appropriately convert any subnet names to their respective ids.
@@ -308,7 +321,9 @@ def _prepare_filter_fixed_ips(client_manager, parsed_args):
308
321
  return ips
309
322
 
310
323
 
311
- def _add_updatable_args(parser, create=False):
324
+ def _add_updatable_args(
325
+ parser: argparse.ArgumentParser, create: bool = False
326
+ ) -> None:
312
327
  parser.add_argument(
313
328
  '--description',
314
329
  metavar='<description>',
@@ -434,7 +449,9 @@ def _add_updatable_args(parser, create=False):
434
449
 
435
450
  # TODO(abhiraut): Use the SDK resource mapped attribute names once the
436
451
  # OSC minimum requirements include SDK 1.0.
437
- def _convert_address_pairs(parsed_args):
452
+ def _convert_address_pairs(
453
+ parsed_args: argparse.Namespace,
454
+ ) -> list[dict[str, Any]]:
438
455
  ops = []
439
456
  for opt in parsed_args.allowed_address_pairs:
440
457
  addr = {}
@@ -445,7 +462,9 @@ def _convert_address_pairs(parsed_args):
445
462
  return ops
446
463
 
447
464
 
448
- def _convert_extra_dhcp_options(parsed_args):
465
+ def _convert_extra_dhcp_options(
466
+ parsed_args: argparse.Namespace,
467
+ ) -> list[dict[str, Any]]:
449
468
  dhcp_options = []
450
469
  for opt in parsed_args.extra_dhcp_options:
451
470
  option = {}
@@ -460,7 +479,7 @@ def _convert_extra_dhcp_options(parsed_args):
460
479
 
461
480
  # When we have multiple hints, we'll need to refactor this to allow
462
481
  # arbitrary combinations. But until then let's have it as simple as possible.
463
- def _validate_port_hints(hints):
482
+ def _validate_port_hints(hints: dict[str, Any]) -> None:
464
483
  if hints not in (
465
484
  {},
466
485
  # by hint alias
@@ -477,7 +496,7 @@ def _validate_port_hints(hints):
477
496
  # When we have multiple hints, we'll need to refactor this to expand aliases
478
497
  # without losing other hints. But until then let's have it as simple as
479
498
  # possible.
480
- def _expand_port_hint_aliases(hints):
499
+ def _expand_port_hint_aliases(hints: dict[str, Any]) -> dict[str, Any]:
481
500
  if hints == {'ovs-tx-steering': 'thread'}:
482
501
  return {'openvswitch': {'other_config': {'tx-steering': 'thread'}}}
483
502
  elif hints == {'ovs-tx-steering': 'hash'}:
@@ -489,7 +508,7 @@ def _expand_port_hint_aliases(hints):
489
508
  class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
490
509
  _description = _("Create a new port")
491
510
 
492
- def get_parser(self, prog_name):
511
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
493
512
  parser = super().get_parser(prog_name)
494
513
 
495
514
  parser.add_argument(
@@ -635,7 +654,9 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
635
654
  _tag.add_tag_option_to_parser_for_create(parser, _('port'))
636
655
  return parser
637
656
 
638
- def take_action(self, parsed_args):
657
+ def take_action(
658
+ self, parsed_args: argparse.Namespace
659
+ ) -> tuple[Sequence[str], Iterable[Any]]:
639
660
  network_client = self.app.client_manager.network
640
661
  network = network_client.find_network(
641
662
  parsed_args.network, ignore_missing=False
@@ -727,7 +748,7 @@ class CreatePort(command.ShowOne, common.NeutronCommandWithExtraArgs):
727
748
  class DeletePort(command.Command):
728
749
  _description = _("Delete port(s)")
729
750
 
730
- def get_parser(self, prog_name):
751
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
731
752
  parser = super().get_parser(prog_name)
732
753
  parser.add_argument(
733
754
  'port',
@@ -737,7 +758,7 @@ class DeletePort(command.Command):
737
758
  )
738
759
  return parser
739
760
 
740
- def take_action(self, parsed_args):
761
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
741
762
  client = self.app.client_manager.network
742
763
  result = 0
743
764
 
@@ -769,7 +790,7 @@ class DeletePort(command.Command):
769
790
  class ListPort(command.Lister):
770
791
  _description = _("List ports")
771
792
 
772
- def get_parser(self, prog_name):
793
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
773
794
  parser = super().get_parser(prog_name)
774
795
  parser.add_argument(
775
796
  '--device-owner',
@@ -867,7 +888,9 @@ class ListPort(command.Lister):
867
888
  _tag.add_tag_filtering_option_to_parser(parser, _('ports'))
868
889
  return parser
869
890
 
870
- def take_action(self, parsed_args):
891
+ def take_action(
892
+ self, parsed_args: argparse.Namespace
893
+ ) -> tuple[Sequence[str], Iterable[tuple[Any, ...]]]:
871
894
  network_client = self.app.client_manager.network
872
895
  identity_client = self.app.client_manager.identity
873
896
 
@@ -966,7 +989,7 @@ class ListPort(command.Lister):
966
989
  class SetPort(common.NeutronCommandWithExtraArgs):
967
990
  _description = _("Set port properties")
968
991
 
969
- def get_parser(self, prog_name):
992
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
970
993
  parser = super().get_parser(prog_name)
971
994
  _add_updatable_args(parser)
972
995
  admin_group = parser.add_mutually_exclusive_group()
@@ -1120,7 +1143,7 @@ class SetPort(common.NeutronCommandWithExtraArgs):
1120
1143
 
1121
1144
  return parser
1122
1145
 
1123
- def take_action(self, parsed_args):
1146
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
1124
1147
  client = self.app.client_manager.network
1125
1148
 
1126
1149
  _prepare_fixed_ips(self.app.client_manager, parsed_args)
@@ -1222,14 +1245,16 @@ class SetPort(common.NeutronCommandWithExtraArgs):
1222
1245
  class ShowPort(command.ShowOne):
1223
1246
  _description = _("Display port details")
1224
1247
 
1225
- def get_parser(self, prog_name):
1248
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
1226
1249
  parser = super().get_parser(prog_name)
1227
1250
  parser.add_argument(
1228
1251
  'port', metavar="<port>", help=_("Port to display (name or ID)")
1229
1252
  )
1230
1253
  return parser
1231
1254
 
1232
- def take_action(self, parsed_args):
1255
+ def take_action(
1256
+ self, parsed_args: argparse.Namespace
1257
+ ) -> tuple[Sequence[str], Iterable[Any]]:
1233
1258
  client = self.app.client_manager.network
1234
1259
  obj = client.find_port(parsed_args.port, ignore_missing=False)
1235
1260
  display_columns, columns = _get_columns(obj)
@@ -1242,7 +1267,7 @@ class ShowPort(command.ShowOne):
1242
1267
  class UnsetPort(common.NeutronUnsetCommandWithExtraArgs):
1243
1268
  _description = _("Unset port properties")
1244
1269
 
1245
- def get_parser(self, prog_name):
1270
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
1246
1271
  parser = super().get_parser(prog_name)
1247
1272
  parser.add_argument(
1248
1273
  '--fixed-ip',
@@ -1339,7 +1364,7 @@ class UnsetPort(common.NeutronUnsetCommandWithExtraArgs):
1339
1364
 
1340
1365
  return parser
1341
1366
 
1342
- def take_action(self, parsed_args):
1367
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
1343
1368
  client = self.app.client_manager.network
1344
1369
  obj = client.find_port(parsed_args.port, ignore_missing=False)
1345
1370
  # SDK ignores update() if it receives a modified obj and attrs