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,584 @@
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 copy
18
+ import operator
19
+ from unittest import mock
20
+
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.network.v2.bgpvpn import bgpvpn
26
+ from openstackclient.tests.unit.network.v2.bgpvpn import fakes
27
+
28
+
29
+ columns_short = tuple(
30
+ col
31
+ for col, _, listing_mode in bgpvpn._attr_map
32
+ if listing_mode in (column_util.LIST_BOTH, column_util.LIST_SHORT_ONLY)
33
+ )
34
+ columns_long = tuple(
35
+ col
36
+ for col, _, listing_mode in bgpvpn._attr_map
37
+ if listing_mode in (column_util.LIST_BOTH, column_util.LIST_LONG_ONLY)
38
+ )
39
+ headers_short = tuple(
40
+ head
41
+ for _, head, listing_mode in bgpvpn._attr_map
42
+ if listing_mode in (column_util.LIST_BOTH, column_util.LIST_SHORT_ONLY)
43
+ )
44
+ headers_long = tuple(
45
+ head
46
+ for _, head, listing_mode in bgpvpn._attr_map
47
+ if listing_mode in (column_util.LIST_BOTH, column_util.LIST_LONG_ONLY)
48
+ )
49
+ sorted_attr_map = sorted(bgpvpn._attr_map, key=operator.itemgetter(1))
50
+ sorted_columns = tuple(col for col, _, _ in sorted_attr_map)
51
+ sorted_headers = tuple(head for _, head, _ in sorted_attr_map)
52
+
53
+
54
+ def _get_data(attrs, columns=sorted_columns):
55
+ return osc_utils.get_dict_properties(
56
+ attrs, columns, formatters=bgpvpn._formatters
57
+ )
58
+
59
+
60
+ class TestCreateBgpvpn(fakes.TestNeutronClientBgpvpn):
61
+ def setUp(self):
62
+ super().setUp()
63
+ self.cmd = bgpvpn.CreateBgpvpn(self.app, None)
64
+
65
+ def test_create_bgpvpn_with_no_args(self):
66
+ fake_bgpvpn = fakes.create_one_bgpvpn()
67
+ self.network_client.create_bgpvpn.return_value = fake_bgpvpn
68
+ arglist = []
69
+ verifylist = [
70
+ ('project', None),
71
+ ('name', None),
72
+ ('type', 'l3'),
73
+ ('vni', None),
74
+ ('local_pref', None),
75
+ ('route_targets', None),
76
+ ('import_targets', None),
77
+ ('export_targets', None),
78
+ ('route_distinguishers', None),
79
+ ]
80
+
81
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
82
+
83
+ cols, _data = self.cmd.take_action(parsed_args)
84
+
85
+ self.network_client.create_bgpvpn.assert_called_once_with(
86
+ **{'type': 'l3'}
87
+ )
88
+
89
+ self.assertEqual(sorted(sorted_columns), sorted(cols))
90
+
91
+ @mock.patch('osc_lib.cli.identity.find_project')
92
+ def test_create_bgpvpn_with_all_args(self, mock_find_project):
93
+ attrs = {
94
+ 'project_id': 'new_fake_project_id',
95
+ 'name': 'fake_name',
96
+ 'type': 'l2',
97
+ 'vni': 100,
98
+ 'local_pref': 777,
99
+ 'route_targets': ['fake_rt1', 'fake_rt2', 'fake_rt3'],
100
+ 'import_targets': ['fake_irt1', 'fake_irt2', 'fake_irt3'],
101
+ 'export_targets': ['fake_ert1', 'fake_ert2', 'fake_ert3'],
102
+ 'route_distinguishers': ['fake_rd1', 'fake_rd2', 'fake_rd3'],
103
+ }
104
+ fake_bgpvpn = fakes.create_one_bgpvpn(attrs)
105
+ self.network_client.create_bgpvpn.return_value = fake_bgpvpn
106
+ mock_find_project.return_value = mock.Mock(
107
+ id=fake_bgpvpn['project_id']
108
+ )
109
+ arglist = [
110
+ '--project',
111
+ fake_bgpvpn['project_id'],
112
+ '--name',
113
+ fake_bgpvpn['name'],
114
+ '--type',
115
+ fake_bgpvpn['type'],
116
+ '--vni',
117
+ str(fake_bgpvpn['vni']),
118
+ '--local-pref',
119
+ str(fake_bgpvpn['local_pref']),
120
+ ]
121
+ for rt in fake_bgpvpn['route_targets']:
122
+ arglist.extend(['--route-target', rt])
123
+ for rt in fake_bgpvpn['import_targets']:
124
+ arglist.extend(['--import-target', rt])
125
+ for rt in fake_bgpvpn['export_targets']:
126
+ arglist.extend(['--export-target', rt])
127
+ for rd in fake_bgpvpn['route_distinguishers']:
128
+ arglist.extend(['--route-distinguisher', rd])
129
+ verifylist = [
130
+ ('project', fake_bgpvpn['project_id']),
131
+ ('name', fake_bgpvpn['name']),
132
+ ('type', fake_bgpvpn['type']),
133
+ ('vni', fake_bgpvpn['vni']),
134
+ ('local_pref', fake_bgpvpn['local_pref']),
135
+ ('route_targets', fake_bgpvpn['route_targets']),
136
+ ('import_targets', fake_bgpvpn['import_targets']),
137
+ ('export_targets', fake_bgpvpn['export_targets']),
138
+ ('route_distinguishers', fake_bgpvpn['route_distinguishers']),
139
+ ]
140
+
141
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
142
+
143
+ cols, _data = self.cmd.take_action(parsed_args)
144
+
145
+ fake_bgpvpn_call = copy.deepcopy(attrs)
146
+
147
+ self.network_client.create_bgpvpn.assert_called_once_with(
148
+ **fake_bgpvpn_call
149
+ )
150
+ self.assertEqual(sorted(sorted_columns), sorted(cols))
151
+
152
+
153
+ class TestSetBgpvpn(fakes.TestNeutronClientBgpvpn):
154
+ def setUp(self):
155
+ super().setUp()
156
+ self.network_client.find_bgpvpn.side_effect = (
157
+ lambda name_or_id, **kwargs: {'id': name_or_id}
158
+ )
159
+
160
+ self.cmd = bgpvpn.SetBgpvpn(self.app, None)
161
+
162
+ def test_set_bgpvpn(self):
163
+ attrs = {
164
+ 'route_targets': ['set_rt1', 'set_rt2', 'set_rt3'],
165
+ 'import_targets': ['set_irt1', 'set_irt2', 'set_irt3'],
166
+ 'export_targets': ['set_ert1', 'set_ert2', 'set_ert3'],
167
+ 'route_distinguishers': ['set_rd1', 'set_rd2', 'set_rd3'],
168
+ }
169
+ fake_bgpvpn = fakes.create_one_bgpvpn(attrs)
170
+ self.network_client.get_bgpvpn.return_value = fake_bgpvpn
171
+ arglist = [
172
+ fake_bgpvpn['id'],
173
+ '--name',
174
+ 'set_name',
175
+ '--route-target',
176
+ 'set_rt1',
177
+ '--import-target',
178
+ 'set_irt1',
179
+ '--export-target',
180
+ 'set_ert1',
181
+ '--route-distinguisher',
182
+ 'set_rd1',
183
+ ]
184
+ verifylist = [
185
+ ('bgpvpn', fake_bgpvpn['id']),
186
+ ('name', 'set_name'),
187
+ ('route_targets', ['set_rt1']),
188
+ ('purge_route_target', False),
189
+ ('import_targets', ['set_irt1']),
190
+ ('purge_import_target', False),
191
+ ('export_targets', ['set_ert1']),
192
+ ('purge_export_target', False),
193
+ ('route_distinguishers', ['set_rd1']),
194
+ ('purge_route_distinguisher', False),
195
+ ]
196
+
197
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
198
+
199
+ result = self.cmd.take_action(parsed_args)
200
+
201
+ attrs = {
202
+ 'name': 'set_name',
203
+ 'route_targets': list(
204
+ set(fake_bgpvpn['route_targets']) | set(['set_rt1'])
205
+ ),
206
+ 'import_targets': list(
207
+ set(fake_bgpvpn['import_targets']) | set(['set_irt1'])
208
+ ),
209
+ 'export_targets': list(
210
+ set(fake_bgpvpn['export_targets']) | set(['set_ert1'])
211
+ ),
212
+ 'route_distinguishers': list(
213
+ set(fake_bgpvpn['route_distinguishers']) | set(['set_rd1'])
214
+ ),
215
+ }
216
+ self.network_client.update_bgpvpn.assert_called_once_with(
217
+ fake_bgpvpn['id'], **attrs
218
+ )
219
+ self.assertIsNone(result)
220
+
221
+ def test_set_bgpvpn_with_purge_list(self):
222
+ fake_bgpvpn = fakes.create_one_bgpvpn()
223
+ self.network_client.get_bgpvpn.return_value = fake_bgpvpn
224
+ arglist = [
225
+ fake_bgpvpn['id'],
226
+ '--route-target',
227
+ 'set_rt1',
228
+ '--no-route-target',
229
+ '--import-target',
230
+ 'set_irt1',
231
+ '--no-import-target',
232
+ '--export-target',
233
+ 'set_ert1',
234
+ '--no-export-target',
235
+ '--route-distinguisher',
236
+ 'set_rd1',
237
+ '--no-route-distinguisher',
238
+ ]
239
+ verifylist = [
240
+ ('bgpvpn', fake_bgpvpn['id']),
241
+ ('route_targets', ['set_rt1']),
242
+ ('purge_route_target', True),
243
+ ('import_targets', ['set_irt1']),
244
+ ('purge_import_target', True),
245
+ ('export_targets', ['set_ert1']),
246
+ ('purge_export_target', True),
247
+ ('route_distinguishers', ['set_rd1']),
248
+ ('purge_route_distinguisher', True),
249
+ ]
250
+
251
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
252
+
253
+ result = self.cmd.take_action(parsed_args)
254
+
255
+ attrs = {
256
+ 'route_targets': [],
257
+ 'import_targets': [],
258
+ 'export_targets': [],
259
+ 'route_distinguishers': [],
260
+ }
261
+ self.network_client.update_bgpvpn.assert_called_once_with(
262
+ fake_bgpvpn['id'], **attrs
263
+ )
264
+ self.assertIsNone(result)
265
+
266
+
267
+ class TestUnsetBgpvpn(fakes.TestNeutronClientBgpvpn):
268
+ def setUp(self):
269
+ super().setUp()
270
+ self.network_client.find_bgpvpn.side_effect = (
271
+ lambda name_or_id, **kwargs: {'id': name_or_id}
272
+ )
273
+ self.cmd = bgpvpn.UnsetBgpvpn(self.app, None)
274
+
275
+ def test_unset_bgpvpn(self):
276
+ attrs = {
277
+ 'route_targets': ['unset_rt1', 'unset_rt2', 'unset_rt3'],
278
+ 'import_targets': ['unset_irt1', 'unset_irt2', 'unset_irt3'],
279
+ 'export_targets': ['unset_ert1', 'unset_ert2', 'unset_ert3'],
280
+ 'route_distinguishers': ['unset_rd1', 'unset_rd2', 'unset_rd3'],
281
+ }
282
+ fake_bgpvpn = fakes.create_one_bgpvpn(attrs)
283
+ self.network_client.get_bgpvpn.return_value = fake_bgpvpn
284
+ arglist = [
285
+ fake_bgpvpn['id'],
286
+ '--route-target',
287
+ 'unset_rt1',
288
+ '--import-target',
289
+ 'unset_irt1',
290
+ '--export-target',
291
+ 'unset_ert1',
292
+ '--route-distinguisher',
293
+ 'unset_rd1',
294
+ ]
295
+ verifylist = [
296
+ ('bgpvpn', fake_bgpvpn['id']),
297
+ ('route_targets', ['unset_rt1']),
298
+ ('purge_route_target', False),
299
+ ('import_targets', ['unset_irt1']),
300
+ ('purge_import_target', False),
301
+ ('export_targets', ['unset_ert1']),
302
+ ('purge_export_target', False),
303
+ ('route_distinguishers', ['unset_rd1']),
304
+ ('purge_route_distinguisher', False),
305
+ ]
306
+
307
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
308
+
309
+ result = self.cmd.take_action(parsed_args)
310
+
311
+ attrs = {
312
+ 'route_targets': list(
313
+ set(fake_bgpvpn['route_targets']) - set(['unset_rt1'])
314
+ ),
315
+ 'import_targets': list(
316
+ set(fake_bgpvpn['import_targets']) - set(['unset_irt1'])
317
+ ),
318
+ 'export_targets': list(
319
+ set(fake_bgpvpn['export_targets']) - set(['unset_ert1'])
320
+ ),
321
+ 'route_distinguishers': list(
322
+ set(fake_bgpvpn['route_distinguishers']) - set(['unset_rd1'])
323
+ ),
324
+ }
325
+ self.network_client.update_bgpvpn.assert_called_once_with(
326
+ fake_bgpvpn['id'], **attrs
327
+ )
328
+ self.assertIsNone(result)
329
+
330
+ def test_unset_bgpvpn_with_purge_list(self):
331
+ fake_bgpvpn = fakes.create_one_bgpvpn()
332
+ self.network_client.get_bgpvpn.return_value = fake_bgpvpn
333
+ arglist = [
334
+ fake_bgpvpn['id'],
335
+ '--route-target',
336
+ 'unset_rt1',
337
+ '--all-route-target',
338
+ '--import-target',
339
+ 'unset_irt1',
340
+ '--all-import-target',
341
+ '--export-target',
342
+ 'unset_ert1',
343
+ '--all-export-target',
344
+ '--route-distinguisher',
345
+ 'unset_rd1',
346
+ '--all-route-distinguisher',
347
+ ]
348
+ verifylist = [
349
+ ('bgpvpn', fake_bgpvpn['id']),
350
+ ('route_targets', ['unset_rt1']),
351
+ ('purge_route_target', True),
352
+ ('import_targets', ['unset_irt1']),
353
+ ('purge_import_target', True),
354
+ ('export_targets', ['unset_ert1']),
355
+ ('purge_export_target', True),
356
+ ('route_distinguishers', ['unset_rd1']),
357
+ ('purge_route_distinguisher', True),
358
+ ]
359
+
360
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
361
+
362
+ result = self.cmd.take_action(parsed_args)
363
+
364
+ attrs = {
365
+ 'route_targets': [],
366
+ 'import_targets': [],
367
+ 'export_targets': [],
368
+ 'route_distinguishers': [],
369
+ }
370
+ self.network_client.update_bgpvpn.assert_called_once_with(
371
+ fake_bgpvpn['id'], **attrs
372
+ )
373
+ self.assertIsNone(result)
374
+
375
+
376
+ class TestDeleteBgpvpn(fakes.TestNeutronClientBgpvpn):
377
+ def setUp(self):
378
+ super().setUp()
379
+ self.network_client.find_bgpvpn.side_effect = (
380
+ lambda name_or_id, **kwargs: {'id': name_or_id}
381
+ )
382
+ self.cmd = bgpvpn.DeleteBgpvpn(self.app, None)
383
+
384
+ def test_delete_one_bgpvpn(self):
385
+ fake_bgpvpn = fakes.create_one_bgpvpn()
386
+ arglist = [
387
+ fake_bgpvpn['id'],
388
+ ]
389
+ verifylist = [
390
+ ('bgpvpns', [fake_bgpvpn['id']]),
391
+ ]
392
+
393
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
394
+
395
+ result = self.cmd.take_action(parsed_args)
396
+
397
+ self.network_client.delete_bgpvpn.assert_called_once_with(
398
+ fake_bgpvpn['id']
399
+ )
400
+ self.assertIsNone(result)
401
+
402
+ def test_delete_multi_bpgvpn(self):
403
+ fake_bgpvpns = fakes.create_bgpvpns(count=3)
404
+ fake_bgpvpn_ids = [fake_bgpvpn['id'] for fake_bgpvpn in fake_bgpvpns]
405
+ arglist = fake_bgpvpn_ids
406
+ verifylist = [
407
+ ('bgpvpns', fake_bgpvpn_ids),
408
+ ]
409
+
410
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
411
+
412
+ result = self.cmd.take_action(parsed_args)
413
+
414
+ self.network_client.delete_bgpvpn.assert_has_calls(
415
+ [mock.call(id) for id in fake_bgpvpn_ids]
416
+ )
417
+ self.assertIsNone(result)
418
+
419
+ def test_delete_multi_bpgvpn_with_unknown(self):
420
+ count = 3
421
+ fake_bgpvpns = fakes.create_bgpvpns(count=count)
422
+ fake_bgpvpn_ids = [fake_bgpvpn['id'] for fake_bgpvpn in fake_bgpvpns]
423
+
424
+ def raise_unknonw_resource(resource_path, name_or_id):
425
+ if str(count - 2) in name_or_id:
426
+ raise Exception()
427
+
428
+ self.network_client.delete_bgpvpn.side_effect = raise_unknonw_resource
429
+ arglist = fake_bgpvpn_ids
430
+ verifylist = [
431
+ ('bgpvpns', fake_bgpvpn_ids),
432
+ ]
433
+
434
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
435
+
436
+ self.assertRaises(
437
+ exceptions.CommandError, self.cmd.take_action, parsed_args
438
+ )
439
+
440
+ self.network_client.delete_bgpvpn.assert_has_calls(
441
+ [mock.call(id) for id in fake_bgpvpn_ids]
442
+ )
443
+
444
+
445
+ class TestListBgpvpn(fakes.TestNeutronClientBgpvpn):
446
+ def setUp(self):
447
+ super().setUp()
448
+ self.cmd = bgpvpn.ListBgpvpn(self.app, None)
449
+
450
+ def test_list_all_bgpvpn(self):
451
+ count = 3
452
+ fake_bgpvpns = fakes.create_bgpvpns(count=count)
453
+ self.network_client.bgpvpns.return_value = fake_bgpvpns
454
+ arglist = []
455
+ verifylist = []
456
+
457
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
458
+
459
+ headers, data = self.cmd.take_action(parsed_args)
460
+
461
+ self.network_client.bgpvpns.assert_called_once()
462
+ self.assertEqual(headers, list(headers_short))
463
+ self.assertListEqual(
464
+ list(data),
465
+ [
466
+ _get_data(fake_bgpvpn, columns_short)
467
+ for fake_bgpvpn in fake_bgpvpns
468
+ ],
469
+ )
470
+
471
+ def test_list_all_bgpvpn_long_mode(self):
472
+ count = 3
473
+ fake_bgpvpns = fakes.create_bgpvpns(count=count)
474
+ self.network_client.bgpvpns.return_value = fake_bgpvpns
475
+ arglist = [
476
+ '--long',
477
+ ]
478
+ verifylist = [
479
+ ('long', True),
480
+ ]
481
+
482
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
483
+
484
+ headers, data = self.cmd.take_action(parsed_args)
485
+
486
+ self.network_client.bgpvpns.assert_called_once()
487
+ self.assertEqual(headers, list(headers_long))
488
+ self.assertListEqual(
489
+ list(data),
490
+ [
491
+ _get_data(fake_bgpvpn, columns_long)
492
+ for fake_bgpvpn in fake_bgpvpns
493
+ ],
494
+ )
495
+
496
+ @mock.patch('osc_lib.cli.identity.find_project')
497
+ def test_list_project_bgpvpn(self, mock_find_project):
498
+ count = 3
499
+ project_id = 'list_fake_project_id'
500
+ attrs = {'project_id': project_id}
501
+ fake_bgpvpns = fakes.create_bgpvpns(count=count, attrs=attrs)
502
+ self.network_client.bgpvpns.return_value = fake_bgpvpns
503
+ mock_find_project.return_value = mock.Mock(id=project_id)
504
+ arglist = [
505
+ '--project',
506
+ project_id,
507
+ ]
508
+ verifylist = [
509
+ ('project', project_id),
510
+ ]
511
+
512
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
513
+
514
+ headers, data = self.cmd.take_action(parsed_args)
515
+
516
+ self.network_client.bgpvpns.assert_called_once_with(
517
+ project_id=project_id
518
+ )
519
+ self.assertEqual(headers, list(headers_short))
520
+ self.assertListEqual(
521
+ list(data),
522
+ [
523
+ _get_data(fake_bgpvpn, columns_short)
524
+ for fake_bgpvpn in fake_bgpvpns
525
+ ],
526
+ )
527
+
528
+ def test_list_bgpvpn_with_filters(self):
529
+ count = 3
530
+ name = 'fake_id0'
531
+ layer_type = 'l2'
532
+ attrs = {'type': layer_type}
533
+ fake_bgpvpns = fakes.create_bgpvpns(count=count, attrs=attrs)
534
+ returned_bgpvpn = fake_bgpvpns[0]
535
+ self.network_client.bgpvpns.return_value = [returned_bgpvpn]
536
+ arglist = [
537
+ '--property',
538
+ f'name={name}',
539
+ '--property',
540
+ f'type={layer_type}',
541
+ ]
542
+ verifylist = [
543
+ ('property', {'name': name, 'type': layer_type}),
544
+ ]
545
+
546
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
547
+
548
+ headers, data = self.cmd.take_action(parsed_args)
549
+
550
+ self.network_client.bgpvpns.assert_called_once_with(
551
+ name=name, type=layer_type
552
+ )
553
+ self.assertEqual(headers, list(headers_short))
554
+ self.assertListEqual(
555
+ list(data), [_get_data(returned_bgpvpn, columns_short)]
556
+ )
557
+
558
+
559
+ class TestShowBgpvpn(fakes.TestNeutronClientBgpvpn):
560
+ def setUp(self):
561
+ super().setUp()
562
+ self.cmd = bgpvpn.ShowBgpvpn(self.app, None)
563
+ self.network_client.find_bgpvpn.side_effect = (
564
+ lambda name_or_id, **kwargs: {'id': name_or_id}
565
+ )
566
+
567
+ def test_show_bgpvpn(self):
568
+ fake_bgpvpn = fakes.create_one_bgpvpn()
569
+ self.network_client.get_bgpvpn.return_value = fake_bgpvpn
570
+ arglist = [
571
+ fake_bgpvpn['id'],
572
+ ]
573
+ verifylist = [
574
+ ('bgpvpn', fake_bgpvpn['id']),
575
+ ]
576
+
577
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
578
+
579
+ headers, _data = self.cmd.take_action(parsed_args)
580
+
581
+ self.network_client.get_bgpvpn.assert_called_once_with(
582
+ fake_bgpvpn['id']
583
+ )
584
+ self.assertEqual(sorted(sorted_columns), sorted(headers))