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
@@ -0,0 +1,463 @@
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
+ import typing as ty
19
+
20
+ from osc_lib.cli import format_columns
21
+ from osc_lib.cli import identity as osc_id
22
+ from osc_lib.cli.parseractions import KeyValueAction
23
+ from osc_lib import exceptions
24
+ from osc_lib import utils as osc_utils
25
+ from osc_lib.utils import columns as column_util
26
+
27
+ from openstackclient import command
28
+ from openstackclient.i18n import _
29
+
30
+ LOG = logging.getLogger(__name__)
31
+
32
+ _attr_map = (
33
+ ('id', 'ID', column_util.LIST_BOTH),
34
+ ('project_id', 'Project', column_util.LIST_LONG_ONLY),
35
+ ('name', 'Name', column_util.LIST_BOTH),
36
+ ('type', 'Type', column_util.LIST_BOTH),
37
+ ('route_targets', 'Route Targets', column_util.LIST_LONG_ONLY),
38
+ ('import_targets', 'Import Targets', column_util.LIST_LONG_ONLY),
39
+ ('export_targets', 'Export Targets', column_util.LIST_LONG_ONLY),
40
+ (
41
+ 'route_distinguishers',
42
+ 'Route Distinguishers',
43
+ column_util.LIST_LONG_ONLY,
44
+ ),
45
+ ('networks', 'Associated Networks', column_util.LIST_LONG_ONLY),
46
+ ('routers', 'Associated Routers', column_util.LIST_LONG_ONLY),
47
+ ('ports', 'Associated Ports', column_util.LIST_LONG_ONLY),
48
+ ('vni', 'VNI', column_util.LIST_LONG_ONLY),
49
+ ('local_pref', 'Local Pref', column_util.LIST_LONG_ONLY),
50
+ )
51
+ _formatters = {
52
+ 'route_targets': format_columns.ListColumn,
53
+ 'import_targets': format_columns.ListColumn,
54
+ 'export_targets': format_columns.ListColumn,
55
+ 'route_distinguishers': format_columns.ListColumn,
56
+ 'networks': format_columns.ListColumn,
57
+ 'routers': format_columns.ListColumn,
58
+ 'ports': format_columns.ListColumn,
59
+ }
60
+
61
+
62
+ def _get_columns(item):
63
+ column_map: dict[str, str] = {}
64
+ hidden_columns = ['location', 'tenant_id']
65
+ return osc_utils.get_osc_show_columns_for_sdk_resource(
66
+ item, column_map, hidden_columns
67
+ )
68
+
69
+
70
+ def _get_common_parser(parser, update=None):
71
+ """Adds to parser arguments common to create, set and unset commands.
72
+
73
+ :params ArgumentParser parser: argparse object contains all command's
74
+ arguments
75
+ :params string update: Determines if it is a create command (value: None),
76
+ it is a set command (value: 'set') or if it is an unset command (value:
77
+ 'unset')
78
+ """
79
+ ADD_RT = _("Add Route Target to import/export list")
80
+ REMOVE_RT = _("Remove Route Target from import/export list")
81
+ ADD_IMPORT_RT = _("Add Route Target to import list")
82
+ DEL_IMPORT_RT = _("Remove Route Target from import list")
83
+ ADD_EXPORT_RT = _("Add Route Target to export list")
84
+ DEL_EXPORT_RT = _("Remove Route Target from export list")
85
+ ADD_RD = _(
86
+ "Add Route Distinguisher to the list of Route Distinguishers "
87
+ "from which a Route Distinguishers will be picked from to "
88
+ "advertise a VPN route"
89
+ )
90
+ REMOVE_RD = _(
91
+ "Remove Route Distinguisher from the list of Route "
92
+ "Distinguishers from which a Route Distinguishers will be "
93
+ "picked from to advertise a VPN route"
94
+ )
95
+ REPEAT_RT = _("repeat option for multiple Route Targets")
96
+ REPEAT_RD = _("repeat option for multiple Route Distinguishers")
97
+
98
+ def is_appended():
99
+ return update is None or update == 'set'
100
+
101
+ if update is None or update == 'set':
102
+ parser.add_argument(
103
+ '--name',
104
+ metavar="<name>",
105
+ help=_("Name of the BGP VPN"),
106
+ )
107
+ parser.add_argument(
108
+ '--route-target',
109
+ dest='route_targets',
110
+ action='append',
111
+ metavar="<route-target>",
112
+ help=f"{ADD_RT if is_appended() else REMOVE_RT} ({REPEAT_RT})",
113
+ )
114
+ if update:
115
+ parser.add_argument(
116
+ '--no-route-target' if update == 'set' else '--all-route-target',
117
+ dest='purge_route_target',
118
+ action='store_true',
119
+ help=_('Empty route target list'),
120
+ )
121
+ import_target_action = ADD_IMPORT_RT if is_appended() else DEL_IMPORT_RT
122
+ parser.add_argument(
123
+ '--import-target',
124
+ dest='import_targets',
125
+ action='append',
126
+ metavar="<import-target>",
127
+ help=f"{import_target_action} ({REPEAT_RT})",
128
+ )
129
+ if update:
130
+ parser.add_argument(
131
+ '--no-import-target' if update == 'set' else '--all-import-target',
132
+ dest='purge_import_target',
133
+ action='store_true',
134
+ help=_('Empty import route target list'),
135
+ )
136
+ export_target_action = ADD_EXPORT_RT if is_appended() else DEL_EXPORT_RT
137
+ parser.add_argument(
138
+ '--export-target',
139
+ dest='export_targets',
140
+ action='append',
141
+ metavar="<export-target>",
142
+ help=f"{export_target_action} ({REPEAT_RT})",
143
+ )
144
+ if update:
145
+ parser.add_argument(
146
+ '--no-export-target' if update == 'set' else '--all-export-target',
147
+ dest='purge_export_target',
148
+ action='store_true',
149
+ help=_('Empty export route target list'),
150
+ )
151
+ parser.add_argument(
152
+ '--route-distinguisher',
153
+ dest='route_distinguishers',
154
+ action='append',
155
+ metavar="<route-distinguisher>",
156
+ help=f"{ADD_RD if is_appended() else REMOVE_RD} ({REPEAT_RD})",
157
+ )
158
+ if update:
159
+ parser.add_argument(
160
+ '--no-route-distinguisher'
161
+ if update == 'set'
162
+ else '--all-route-distinguisher',
163
+ dest='purge_route_distinguisher',
164
+ action='store_true',
165
+ help=_('Empty route distinguisher list'),
166
+ )
167
+ parser.add_argument(
168
+ '--vni',
169
+ type=int,
170
+ help=_(
171
+ 'VXLAN Network Identifier to be used for this BGPVPN '
172
+ 'when a VXLAN encapsulation is used'
173
+ ),
174
+ )
175
+ parser.add_argument(
176
+ '--local-pref',
177
+ type=int,
178
+ dest='local_pref',
179
+ help=_(
180
+ 'Default BGP LOCAL_PREF to use in route advertisements'
181
+ 'towards this BGPVPN.'
182
+ ),
183
+ )
184
+
185
+
186
+ def _args2body(client_manager, id, action, args):
187
+
188
+ if not (
189
+ args.purge_route_target
190
+ and args.purge_import_target
191
+ and args.purge_export_target
192
+ and args.purge_route_distinguisher
193
+ ) and (
194
+ args.route_targets
195
+ or args.import_targets
196
+ or args.export_targets
197
+ or args.route_distinguishers
198
+ ):
199
+ bgpvpn = client_manager.network.get_bgpvpn(id)
200
+
201
+ attrs: dict[str, ty.Any] = {}
202
+
203
+ if 'name' in args and args.name is not None:
204
+ attrs['name'] = str(args.name)
205
+
206
+ if 'vni' in args and args.vni is not None:
207
+ attrs['vni'] = args.vni
208
+
209
+ if 'local_pref' in args and args.local_pref is not None:
210
+ attrs['local_pref'] = args.local_pref
211
+
212
+ if args.purge_route_target:
213
+ attrs['route_targets'] = []
214
+ elif args.route_targets:
215
+ if action == 'set':
216
+ attrs['route_targets'] = list(
217
+ set(bgpvpn['route_targets']) | set(args.route_targets)
218
+ )
219
+ elif action == 'unset':
220
+ attrs['route_targets'] = list(
221
+ set(bgpvpn['route_targets']) - set(args.route_targets)
222
+ )
223
+
224
+ if args.purge_import_target:
225
+ attrs['import_targets'] = []
226
+ elif args.import_targets:
227
+ if action == 'set':
228
+ attrs['import_targets'] = list(
229
+ set(bgpvpn['import_targets']) | set(args.import_targets)
230
+ )
231
+ elif action == 'unset':
232
+ attrs['import_targets'] = list(
233
+ set(bgpvpn['import_targets']) - set(args.import_targets)
234
+ )
235
+
236
+ if args.purge_export_target:
237
+ attrs['export_targets'] = []
238
+ elif args.export_targets:
239
+ if action == 'set':
240
+ attrs['export_targets'] = list(
241
+ set(bgpvpn['export_targets']) | set(args.export_targets)
242
+ )
243
+ elif action == 'unset':
244
+ attrs['export_targets'] = list(
245
+ set(bgpvpn['export_targets']) - set(args.export_targets)
246
+ )
247
+
248
+ if args.purge_route_distinguisher:
249
+ attrs['route_distinguishers'] = []
250
+ elif args.route_distinguishers:
251
+ if action == 'set':
252
+ attrs['route_distinguishers'] = list(
253
+ set(bgpvpn['route_distinguishers'])
254
+ | set(args.route_distinguishers)
255
+ )
256
+ elif action == 'unset':
257
+ attrs['route_distinguishers'] = list(
258
+ set(bgpvpn['route_distinguishers'])
259
+ - set(args.route_distinguishers)
260
+ )
261
+
262
+ return attrs
263
+
264
+
265
+ class CreateBgpvpn(command.ShowOne):
266
+ _description = _("Create BGP VPN resource")
267
+
268
+ def get_parser(self, prog_name):
269
+ parser = super().get_parser(prog_name)
270
+ osc_id.add_project_owner_option_to_parser(parser)
271
+ _get_common_parser(parser)
272
+ parser.add_argument(
273
+ '--type',
274
+ default='l3',
275
+ choices=['l2', 'l3'],
276
+ help=_(
277
+ "BGP VPN type selection between IP VPN (l3) and Ethernet "
278
+ "VPN (l2) (default: l3)"
279
+ ),
280
+ )
281
+ return parser
282
+
283
+ def take_action(self, parsed_args):
284
+ client = self.app.client_manager.network
285
+ attrs = {}
286
+ if parsed_args.name is not None:
287
+ attrs['name'] = str(parsed_args.name)
288
+ if parsed_args.type is not None:
289
+ attrs['type'] = parsed_args.type
290
+ if parsed_args.route_targets is not None:
291
+ attrs['route_targets'] = parsed_args.route_targets
292
+ if parsed_args.import_targets is not None:
293
+ attrs['import_targets'] = parsed_args.import_targets
294
+ if parsed_args.export_targets is not None:
295
+ attrs['export_targets'] = parsed_args.export_targets
296
+ if parsed_args.route_distinguishers is not None:
297
+ attrs['route_distinguishers'] = parsed_args.route_distinguishers
298
+ if parsed_args.vni is not None:
299
+ attrs['vni'] = parsed_args.vni
300
+ if parsed_args.local_pref is not None:
301
+ attrs['local_pref'] = parsed_args.local_pref
302
+ if 'project' in parsed_args and parsed_args.project is not None:
303
+ project_id = osc_id.find_project(
304
+ self.app.client_manager.sdk_connection,
305
+ parsed_args.project,
306
+ parsed_args.project_domain,
307
+ ).id
308
+ attrs['project_id'] = project_id
309
+ obj = client.create_bgpvpn(**attrs)
310
+ display_columns, columns = _get_columns(obj)
311
+ data = osc_utils.get_dict_properties(
312
+ obj, columns, formatters=_formatters
313
+ )
314
+ return display_columns, data
315
+
316
+
317
+ class SetBgpvpn(command.Command):
318
+ _description = _("Set BGP VPN properties")
319
+
320
+ def get_parser(self, prog_name):
321
+ parser = super().get_parser(prog_name)
322
+ parser.add_argument(
323
+ 'bgpvpn',
324
+ metavar="<bgpvpn>",
325
+ help=_("BGP VPN to update (name or ID)"),
326
+ )
327
+ _get_common_parser(parser, update='set')
328
+ return parser
329
+
330
+ def take_action(self, parsed_args):
331
+ client = self.app.client_manager.network
332
+ id = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)['id']
333
+ body = _args2body(self.app.client_manager, id, 'set', parsed_args)
334
+ client.update_bgpvpn(id, **body)
335
+
336
+
337
+ class UnsetBgpvpn(command.Command):
338
+ _description = _("Unset BGP VPN properties")
339
+
340
+ def get_parser(self, prog_name):
341
+ parser = super().get_parser(prog_name)
342
+ parser.add_argument(
343
+ 'bgpvpn',
344
+ metavar="<bgpvpn>",
345
+ help=_("BGP VPN to update (name or ID)"),
346
+ )
347
+ _get_common_parser(parser, update='unset')
348
+ return parser
349
+
350
+ def take_action(self, parsed_args):
351
+ client = self.app.client_manager.network
352
+ id = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)['id']
353
+ body = _args2body(self.app.client_manager, id, 'unset', parsed_args)
354
+ client.update_bgpvpn(id, **body)
355
+
356
+
357
+ class DeleteBgpvpn(command.Command):
358
+ _description = _("Delete BGP VPN resource(s)")
359
+
360
+ def get_parser(self, prog_name):
361
+ parser = super().get_parser(prog_name)
362
+ parser.add_argument(
363
+ 'bgpvpns',
364
+ metavar="<bgpvpn>",
365
+ nargs="+",
366
+ help=_("BGP VPN(s) to delete (name or ID)"),
367
+ )
368
+ return parser
369
+
370
+ def take_action(self, parsed_args):
371
+ client = self.app.client_manager.network
372
+ fails = 0
373
+ for id_or_name in parsed_args.bgpvpns:
374
+ try:
375
+ id = client.find_bgpvpn(id_or_name, ignore_missing=False)['id']
376
+ client.delete_bgpvpn(id)
377
+ LOG.warning("BGP VPN %(id)s deleted", {'id': id})
378
+ except Exception as e:
379
+ fails += 1
380
+ LOG.error(
381
+ "Failed to delete BGP VPN with name or ID "
382
+ "'%(id_or_name)s': %(e)s",
383
+ {'id_or_name': id_or_name, 'e': e},
384
+ )
385
+ if fails > 0:
386
+ msg = _("Failed to delete %(fails)s of %(total)s BGP VPN.") % {
387
+ 'fails': fails,
388
+ 'total': len(parsed_args.bgpvpns),
389
+ }
390
+ raise exceptions.CommandError(msg)
391
+
392
+
393
+ class ListBgpvpn(command.Lister):
394
+ _description = _("List BGP VPN resources")
395
+
396
+ def get_parser(self, prog_name):
397
+ parser = super().get_parser(prog_name)
398
+ osc_id.add_project_owner_option_to_parser(parser)
399
+ parser.add_argument(
400
+ '--long',
401
+ action='store_true',
402
+ help=_("List additional fields in output"),
403
+ )
404
+ parser.add_argument(
405
+ '--property',
406
+ metavar="<key=value>",
407
+ default=dict(),
408
+ help=_(
409
+ "Filter property to apply on returned BGP VPNs (repeat to "
410
+ "filter on multiple properties)"
411
+ ),
412
+ action=KeyValueAction,
413
+ )
414
+ return parser
415
+
416
+ def take_action(self, parsed_args):
417
+ client = self.app.client_manager.network
418
+ params = {}
419
+ if parsed_args.project is not None:
420
+ project_id = osc_id.find_project(
421
+ self.app.client_manager.sdk_connection,
422
+ parsed_args.project,
423
+ parsed_args.project_domain,
424
+ ).id
425
+ params['project_id'] = project_id
426
+ if parsed_args.property:
427
+ params.update(parsed_args.property)
428
+ objs = client.bgpvpns(**params)
429
+ headers, columns = column_util.get_column_definitions(
430
+ list(_attr_map), long_listing=parsed_args.long
431
+ )
432
+ return (
433
+ headers,
434
+ (
435
+ osc_utils.get_dict_properties(
436
+ s, columns, formatters=_formatters
437
+ )
438
+ for s in objs
439
+ ),
440
+ )
441
+
442
+
443
+ class ShowBgpvpn(command.ShowOne):
444
+ _description = _("Show information of a given BGP VPN")
445
+
446
+ def get_parser(self, prog_name):
447
+ parser = super().get_parser(prog_name)
448
+ parser.add_argument(
449
+ 'bgpvpn',
450
+ metavar="<bgpvpn>",
451
+ help=_("BGP VPN to display (name or ID)"),
452
+ )
453
+ return parser
454
+
455
+ def take_action(self, parsed_args):
456
+ client = self.app.client_manager.network
457
+ id = client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing=False)['id']
458
+ obj = client.get_bgpvpn(id)
459
+ display_columns, columns = _get_columns(obj)
460
+ data = osc_utils.get_dict_properties(
461
+ obj, columns, formatters=_formatters
462
+ )
463
+ return display_columns, data
@@ -0,0 +1,30 @@
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
+ BGPVPN = 'bgpvpn'
18
+ BGPVPNS = f'{BGPVPN}s'
19
+
20
+ NETWORK_RESOURCE_NAME = 'network'
21
+ NETWORK_ASSOCIATION = f'{NETWORK_RESOURCE_NAME}_association'
22
+ NETWORK_ASSOCIATIONS = f'{NETWORK_ASSOCIATION}s'
23
+
24
+ ROUTER_RESOURCE_NAME = 'router'
25
+ ROUTER_ASSOCIATION = f'{ROUTER_RESOURCE_NAME}_association'
26
+ ROUTER_ASSOCIATIONS = f'{ROUTER_ASSOCIATION}s'
27
+
28
+ PORT_RESOURCE_NAME = 'port'
29
+ PORT_ASSOCIATION = f'{PORT_RESOURCE_NAME}_association'
30
+ PORT_ASSOCIATIONS = f'{PORT_ASSOCIATION}s'