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
@@ -0,0 +1,288 @@
1
+ # Copyright (c) 2016 Juniper networks Inc.
2
+ # All Rights Reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may
5
+ # not use this file except in compliance with the License. You may obtain
6
+ # a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations
14
+ # under the License.
15
+ #
16
+
17
+ import logging
18
+
19
+ from osc_lib.cli import identity as osc_id
20
+ from osc_lib.cli import parseractions
21
+ from osc_lib import exceptions
22
+ from osc_lib import utils as osc_utils
23
+ from osc_lib.utils import columns as column_util
24
+
25
+ from openstackclient import command
26
+ from openstackclient.i18n import _
27
+
28
+
29
+ LOG = logging.getLogger(__name__)
30
+
31
+ _attr_map = (
32
+ ('id', 'ID', column_util.LIST_BOTH),
33
+ ('project_id', 'Project', column_util.LIST_LONG_ONLY),
34
+ ('router_id', 'Router ID', column_util.LIST_BOTH),
35
+ (
36
+ 'advertise_extra_routes',
37
+ 'Advertise extra routes',
38
+ column_util.LIST_LONG_ONLY,
39
+ ),
40
+ )
41
+ _formatters: dict[str, osc_utils.FormatterT] = {}
42
+
43
+
44
+ def _get_columns(item):
45
+ column_map: dict[str, str] = {}
46
+ hidden_columns = ['location', 'name', 'tenant_id']
47
+ return osc_utils.get_osc_show_columns_for_sdk_resource(
48
+ item, column_map, hidden_columns
49
+ )
50
+
51
+
52
+ def _get_common_parser(parser, action):
53
+ """Adds to parser arguments common to create, set and unset commands.
54
+
55
+ :params ArgumentParser parser: argparse object contains all command's
56
+ arguments
57
+ :params string action: 'create', 'set' or 'unset'
58
+ """
59
+ ADVERTISE_ROUTES = _("Routes will be advertised to the BGP VPN%s") % (
60
+ _(' (default)') if action == 'create' else ""
61
+ )
62
+ NOT_ADVERTISE_ROUTES = _(
63
+ "Routes from the router will not be advertised to the BGP VPN"
64
+ )
65
+
66
+ group_advertise_extra_routes = parser.add_mutually_exclusive_group()
67
+ group_advertise_extra_routes.add_argument(
68
+ '--advertise_extra_routes',
69
+ action='store_true',
70
+ help=NOT_ADVERTISE_ROUTES if action == 'unset' else ADVERTISE_ROUTES,
71
+ )
72
+ group_advertise_extra_routes.add_argument(
73
+ '--no-advertise_extra_routes',
74
+ action='store_true',
75
+ help=ADVERTISE_ROUTES if action == 'unset' else NOT_ADVERTISE_ROUTES,
76
+ )
77
+
78
+
79
+ def _args2body(action, args):
80
+ attrs = {'advertise_extra_routes': False}
81
+ if args.advertise_extra_routes:
82
+ attrs['advertise_extra_routes'] = action != 'unset'
83
+ elif args.no_advertise_extra_routes:
84
+ attrs['advertise_extra_routes'] = action == 'unset'
85
+ return attrs
86
+
87
+
88
+ class CreateBgpvpnRouterAssoc(command.ShowOne):
89
+ _description = _("Create a BGP VPN router association")
90
+
91
+ def get_parser(self, prog_name):
92
+ parser = super().get_parser(prog_name)
93
+ osc_id.add_project_owner_option_to_parser(parser)
94
+ parser.add_argument(
95
+ 'bgpvpn',
96
+ metavar="<bgpvpn>",
97
+ help=_("BGP VPN to apply the router association (name or ID)"),
98
+ )
99
+ parser.add_argument(
100
+ 'resource',
101
+ metavar="<router>",
102
+ help=_("Router to associate the BGP VPN (name or ID)"),
103
+ )
104
+ _get_common_parser(parser, 'create')
105
+ return parser
106
+
107
+ def take_action(self, parsed_args):
108
+ client = self.app.client_manager.network
109
+ bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
110
+ router = client.find_router(parsed_args.resource, ignore_missing=False)
111
+ body = {'router_id': router['id']}
112
+ if 'project' in parsed_args and parsed_args.project is not None:
113
+ project_id = osc_id.find_project(
114
+ self.app.client_manager.sdk_connection,
115
+ parsed_args.project,
116
+ parsed_args.project_domain,
117
+ ).id
118
+ body['project_id'] = project_id
119
+
120
+ body.update(_args2body('create', parsed_args))
121
+
122
+ obj = client.create_bgpvpn_router_association(bgpvpn['id'], **body)
123
+ display_columns, columns = _get_columns(obj)
124
+ data = osc_utils.get_dict_properties(
125
+ obj, columns, formatters=_formatters
126
+ )
127
+ return display_columns, data
128
+
129
+
130
+ class SetBgpvpnRouterAssoc(command.Command):
131
+ _description = _("Set BGP VPN router association properties")
132
+ _action = 'set'
133
+
134
+ def get_parser(self, prog_name):
135
+ parser = super().get_parser(prog_name)
136
+ parser.add_argument(
137
+ 'resource_association_id',
138
+ metavar="<router association ID>",
139
+ help=_("Router association ID to update"),
140
+ )
141
+ parser.add_argument(
142
+ 'bgpvpn',
143
+ metavar="<bgpvpn>",
144
+ help=_("BGP VPN the router association belongs to (name or ID)"),
145
+ )
146
+ _get_common_parser(parser, self._action)
147
+ return parser
148
+
149
+ def take_action(self, parsed_args):
150
+ client = self.app.client_manager.network
151
+ bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
152
+ body = _args2body(self._action, parsed_args)
153
+ client.update_bgpvpn_router_association(
154
+ bgpvpn['id'], parsed_args.resource_association_id, **body
155
+ )
156
+
157
+
158
+ class UnsetBgpvpnRouterAssoc(SetBgpvpnRouterAssoc):
159
+ _description = _("Unset BGP VPN router association properties")
160
+ _action = 'unset'
161
+
162
+
163
+ class DeleteBgpvpnRouterAssoc(command.Command):
164
+ _description = _(
165
+ "Delete a BGP VPN router association(s) for a given BGP VPN"
166
+ )
167
+
168
+ def get_parser(self, prog_name):
169
+ parser = super().get_parser(prog_name)
170
+ parser.add_argument(
171
+ 'resource_association_ids',
172
+ metavar="<router association ID>",
173
+ nargs="+",
174
+ help=_("Router association ID(s) to remove"),
175
+ )
176
+ parser.add_argument(
177
+ 'bgpvpn',
178
+ metavar="<bgpvpn>",
179
+ help=_("BGP VPN the router association belongs to (name or ID)"),
180
+ )
181
+ return parser
182
+
183
+ def take_action(self, parsed_args):
184
+ client = self.app.client_manager.network
185
+ bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
186
+ fails = 0
187
+ for id in parsed_args.resource_association_ids:
188
+ try:
189
+ client.delete_bgpvpn_router_association(bgpvpn['id'], id)
190
+ LOG.warning(
191
+ "Router association %(id)s deleted",
192
+ {'id': id},
193
+ )
194
+ except Exception as e:
195
+ fails += 1
196
+ LOG.error(
197
+ "Failed to delete router "
198
+ "association with ID '%(id)s': %(e)s",
199
+ {'id': id, 'e': e},
200
+ )
201
+ if fails > 0:
202
+ msg = _(
203
+ "Failed to delete %(fails)s of %(total)s "
204
+ "router BGP VPN association(s)."
205
+ ) % {
206
+ 'fails': fails,
207
+ 'total': len(parsed_args.resource_association_ids),
208
+ }
209
+ raise exceptions.CommandError(msg)
210
+
211
+
212
+ class ListBgpvpnRouterAssoc(command.Lister):
213
+ _description = _("List BGP VPN router associations for a given BGP VPN")
214
+
215
+ def get_parser(self, prog_name):
216
+ parser = super().get_parser(prog_name)
217
+ parser.add_argument(
218
+ 'bgpvpn',
219
+ metavar="<bgpvpn>",
220
+ help=_("BGP VPN listed associations belong to (name or ID)"),
221
+ )
222
+ parser.add_argument(
223
+ '--long',
224
+ action='store_true',
225
+ help=_("List additional fields in output"),
226
+ )
227
+ parser.add_argument(
228
+ '--property',
229
+ metavar="<key=value>",
230
+ help=_(
231
+ "Filter property to apply on returned BGP VPNs (repeat to "
232
+ "filter on multiple properties)"
233
+ ),
234
+ action=parseractions.KeyValueAction,
235
+ )
236
+ return parser
237
+
238
+ def take_action(self, parsed_args):
239
+ client = self.app.client_manager.network
240
+ bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
241
+ params = {}
242
+ if parsed_args.property:
243
+ params.update(parsed_args.property)
244
+ objs = client.bgpvpn_router_associations(
245
+ bgpvpn['id'], retrieve_all=True, **params
246
+ )
247
+ headers, columns = column_util.get_column_definitions(
248
+ list(_attr_map), long_listing=parsed_args.long
249
+ )
250
+ return (
251
+ headers,
252
+ (
253
+ osc_utils.get_dict_properties(
254
+ s, columns, formatters=_formatters
255
+ )
256
+ for s in objs
257
+ ),
258
+ )
259
+
260
+
261
+ class ShowBgpvpnRouterAssoc(command.ShowOne):
262
+ _description = _("Show information of a given BGP VPN router association")
263
+
264
+ def get_parser(self, prog_name):
265
+ parser = super().get_parser(prog_name)
266
+ parser.add_argument(
267
+ 'resource_association_id',
268
+ metavar="<router association ID>",
269
+ help=_("Router association ID to look up"),
270
+ )
271
+ parser.add_argument(
272
+ 'bgpvpn',
273
+ metavar="<bgpvpn>",
274
+ help=_("BGP VPN the association belongs to (name or ID)"),
275
+ )
276
+ return parser
277
+
278
+ def take_action(self, parsed_args):
279
+ client = self.app.client_manager.network
280
+ bgpvpn = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)
281
+ obj = client.get_bgpvpn_router_association(
282
+ bgpvpn['id'], parsed_args.resource_association_id
283
+ )
284
+ display_columns, columns = _get_columns(obj)
285
+ data = osc_utils.get_dict_properties(
286
+ obj, columns, formatters=_formatters
287
+ )
288
+ return display_columns, data
@@ -13,7 +13,10 @@
13
13
 
14
14
  """Default Security Group Rule 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.cli import parseractions
19
22
  from osc_lib import exceptions
@@ -27,7 +30,7 @@ from openstackclient.network import utils as network_utils
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', 'name', 'revision_number']
32
35
  return utils.get_osc_show_columns_for_sdk_resource(
33
36
  item, {}, hidden_columns
@@ -44,7 +47,7 @@ class CreateDefaultSecurityGroupRule(
44
47
  groups.
45
48
  """
46
49
 
47
- def get_parser(self, prog_name):
50
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
48
51
  parser = super().get_parser(prog_name)
49
52
 
50
53
  parser.add_argument(
@@ -149,7 +152,9 @@ class CreateDefaultSecurityGroupRule(
149
152
  )
150
153
  return parser
151
154
 
152
- def take_action(self, parsed_args):
155
+ def take_action(
156
+ self, parsed_args: argparse.Namespace
157
+ ) -> tuple[Sequence[str], Iterable[Any]]:
153
158
  client = self.app.client_manager.network
154
159
  # Build the create attributes.
155
160
  attrs = {}
@@ -236,7 +241,7 @@ class DeleteDefaultSecurityGroupRule(command.Command):
236
241
  default security groups.
237
242
  """
238
243
 
239
- def get_parser(self, prog_name):
244
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
240
245
  parser = super().get_parser(prog_name)
241
246
  parser.add_argument(
242
247
  'rule',
@@ -246,7 +251,7 @@ class DeleteDefaultSecurityGroupRule(command.Command):
246
251
  )
247
252
  return parser
248
253
 
249
- def take_action(self, parsed_args):
254
+ def take_action(self, parsed_args: argparse.Namespace) -> None:
250
255
  result = 0
251
256
  client = self.app.client_manager.network
252
257
  for r in parsed_args.rule:
@@ -281,7 +286,7 @@ class ListDefaultSecurityGroupRule(command.Lister):
281
286
  security groups.
282
287
  """
283
288
 
284
- def _format_network_security_group_rule(self, rule):
289
+ def _format_network_security_group_rule(self, rule: Any) -> Any:
285
290
  """Transform the SDK DefaultSecurityGroupRule object to a dict
286
291
 
287
292
  The SDK object gets in the way of reformatting columns...
@@ -292,7 +297,7 @@ class ListDefaultSecurityGroupRule(command.Lister):
292
297
  rule['remote_ip_prefix'] = network_utils.format_remote_ip_prefix(rule)
293
298
  return rule
294
299
 
295
- def get_parser(self, prog_name):
300
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
296
301
  parser = super().get_parser(prog_name)
297
302
 
298
303
  parser.add_argument(
@@ -334,7 +339,9 @@ class ListDefaultSecurityGroupRule(command.Lister):
334
339
  )
335
340
  return parser
336
341
 
337
- def take_action(self, parsed_args):
342
+ def take_action(
343
+ self, parsed_args: argparse.Namespace
344
+ ) -> tuple[tuple[str, ...], Iterable[tuple[Any, ...]]]:
338
345
  client = self.app.client_manager.network
339
346
  column_headers = (
340
347
  'ID',
@@ -394,7 +401,7 @@ class ShowDefaultSecurityGroupRule(command.ShowOne):
394
401
  created. This rule may not be present on existing default security groups.
395
402
  """
396
403
 
397
- def get_parser(self, prog_name):
404
+ def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
398
405
  parser = super().get_parser(prog_name)
399
406
  parser.add_argument(
400
407
  'rule',
@@ -403,7 +410,9 @@ class ShowDefaultSecurityGroupRule(command.ShowOne):
403
410
  )
404
411
  return parser
405
412
 
406
- def take_action(self, parsed_args):
413
+ def take_action(
414
+ self, parsed_args: argparse.Namespace
415
+ ) -> tuple[Sequence[str], Iterable[Any]]:
407
416
  client = self.app.client_manager.network
408
417
  obj = client.find_default_security_group_rule(
409
418
  parsed_args.rule, ignore_missing=False