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,297 @@
1
+ # Copyright (c) 2018 Orange SA.
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 operator
18
+ from unittest import mock
19
+
20
+ from osc_lib import utils as osc_utils
21
+ from osc_lib.utils import columns as column_util
22
+
23
+ from openstackclient.network.v2.bgpvpn import router_association
24
+ from openstackclient.tests.unit.network.v2.bgpvpn import fakes
25
+ from openstackclient.tests.unit import utils
26
+
27
+
28
+ columns_short = tuple(
29
+ col
30
+ for col, _, listing_mode in router_association._attr_map
31
+ if listing_mode in (column_util.LIST_BOTH, column_util.LIST_SHORT_ONLY)
32
+ )
33
+ columns_long = tuple(
34
+ col
35
+ for col, _, listing_mode in router_association._attr_map
36
+ if listing_mode in (column_util.LIST_BOTH, column_util.LIST_LONG_ONLY)
37
+ )
38
+ headers_short = tuple(
39
+ head
40
+ for _, head, listing_mode in router_association._attr_map
41
+ if listing_mode in (column_util.LIST_BOTH, column_util.LIST_SHORT_ONLY)
42
+ )
43
+ headers_long = tuple(
44
+ head
45
+ for _, head, listing_mode in router_association._attr_map
46
+ if listing_mode in (column_util.LIST_BOTH, column_util.LIST_LONG_ONLY)
47
+ )
48
+ sorted_attr_map = sorted(
49
+ router_association._attr_map, key=operator.itemgetter(1)
50
+ )
51
+ sorted_columns = tuple(col for col, _, _ in sorted_attr_map)
52
+ sorted_headers = tuple(head for _, head, _ in sorted_attr_map)
53
+
54
+
55
+ def _get_data(attrs, columns=sorted_columns):
56
+ return osc_utils.get_dict_properties(
57
+ attrs, columns, formatters=router_association._formatters
58
+ )
59
+
60
+
61
+ class TestCreateRouterAssoc(fakes.TestNeutronClientBgpvpn):
62
+ def setUp(self):
63
+ super().setUp()
64
+ self.cmd = router_association.CreateBgpvpnRouterAssoc(self.app, None)
65
+ self.fake_bgpvpn = fakes.create_one_bgpvpn()
66
+ self.fake_router = fakes.create_one_resource()
67
+ self.network_client.find_bgpvpn.side_effect = (
68
+ lambda name_or_id, **kwargs: {'id': name_or_id}
69
+ )
70
+ self.network_client.find_router.side_effect = (
71
+ lambda name_or_id, **kwargs: {'id': name_or_id}
72
+ )
73
+ self.fake_project = mock.Mock(id='fake_project_id')
74
+ self.identity_sdk_client.find_project = mock.Mock(
75
+ return_value=self.fake_project
76
+ )
77
+
78
+ def _build_args(self, param=None):
79
+ arglist_base = [
80
+ self.fake_bgpvpn['id'],
81
+ self.fake_router['id'],
82
+ '--project',
83
+ self.fake_bgpvpn['project_id'],
84
+ ]
85
+ if param is not None:
86
+ if isinstance(param, list):
87
+ arglist_base.extend(param)
88
+ else:
89
+ arglist_base.append(param)
90
+ return arglist_base
91
+
92
+ def _build_verify_list(self, param=None):
93
+ verifylist = [
94
+ ('bgpvpn', self.fake_bgpvpn['id']),
95
+ ('resource', self.fake_router['id']),
96
+ ('project', self.fake_bgpvpn['project_id']),
97
+ ]
98
+ if param is not None:
99
+ verifylist.append(param)
100
+ return verifylist
101
+
102
+ def _exec_create_router_association(
103
+ self,
104
+ fake_assoc,
105
+ arglist,
106
+ verifylist,
107
+ ):
108
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
109
+
110
+ cols, data = self.cmd.take_action(parsed_args)
111
+
112
+ fake_assoc_call = {
113
+ 'router_id': self.fake_router['id'],
114
+ 'project_id': 'fake_project_id',
115
+ }
116
+ if verifylist:
117
+ for key, value in verifylist:
118
+ if (
119
+ key
120
+ not in (
121
+ 'bgpvpn',
122
+ 'resource',
123
+ 'project',
124
+ )
125
+ and value not in fake_assoc_call.values()
126
+ ):
127
+ fake_assoc_call[key] = value
128
+ self.network_client.create_bgpvpn_router_association.assert_called_once_with(
129
+ self.fake_bgpvpn['id'], **fake_assoc_call
130
+ )
131
+ return cols, data
132
+
133
+ def test_create_router_association(self):
134
+ fake_assoc = fakes.create_one_router_association()
135
+
136
+ self.network_client.create_bgpvpn_router_association.return_value = (
137
+ fake_assoc
138
+ )
139
+
140
+ arglist = self._build_args()
141
+ # advertise_extra_routes will be False since none
142
+ # of the mutually exclusive args present
143
+ verifylist = self._build_verify_list(('advertise_extra_routes', False))
144
+
145
+ self._exec_create_router_association(fake_assoc, arglist, verifylist)
146
+
147
+ def test_create_router_association_advertise(self):
148
+ fake_assoc = fakes.create_one_router_association(
149
+ {'advertise_extra_routes': True}
150
+ )
151
+
152
+ self.network_client.create_bgpvpn_router_association.return_value = (
153
+ fake_assoc
154
+ )
155
+
156
+ arglist = self._build_args('--advertise_extra_routes')
157
+ verifylist = self._build_verify_list(('advertise_extra_routes', True))
158
+
159
+ cols, data = self._exec_create_router_association(
160
+ fake_assoc, arglist, verifylist
161
+ )
162
+ self.assertEqual(sorted(sorted_columns), sorted(cols))
163
+ self.assertEqual(_get_data(fake_assoc, cols), data)
164
+
165
+ def test_create_router_association_no_advertise(self):
166
+ fake_assoc = fakes.create_one_router_association(
167
+ {'advertise_extra_routes': False}
168
+ )
169
+
170
+ self.network_client.create_bgpvpn_router_association.return_value = (
171
+ fake_assoc
172
+ )
173
+
174
+ arglist = self._build_args('--no-advertise_extra_routes')
175
+ verifylist = self._build_verify_list(('advertise_extra_routes', False))
176
+
177
+ cols, data = self._exec_create_router_association(
178
+ fake_assoc, arglist, verifylist
179
+ )
180
+ self.assertEqual(sorted(sorted_columns), sorted(cols))
181
+ self.assertEqual(_get_data(fake_assoc, cols), data)
182
+
183
+ def test_create_router_association_advertise_fault(self):
184
+ arglist = self._build_args(
185
+ ['--advertise_extra_routes', '--no-advertise_extra_routes']
186
+ )
187
+
188
+ try:
189
+ self._exec_create_router_association(None, arglist, None)
190
+ except utils.ParserException as e:
191
+ self.assertIn('Argument parse failed', format(e))
192
+
193
+ def test_router_association_unknown_arg(self):
194
+ arglist = self._build_args('--unknown arg')
195
+
196
+ try:
197
+ self._exec_create_router_association(None, arglist, None)
198
+ except utils.ParserException as e:
199
+ self.assertIn('Argument parse failed', format(e))
200
+
201
+
202
+ class TestSetRouterAssoc(fakes.TestNeutronClientBgpvpn):
203
+ def setUp(self):
204
+ super().setUp()
205
+ self.cmd = router_association.SetBgpvpnRouterAssoc(self.app, None)
206
+ self.fake_bgpvpn = fakes.create_one_bgpvpn()
207
+ self.fake_router = fakes.create_one_resource()
208
+ self.network_client.find_bgpvpn.side_effect = (
209
+ lambda name_or_id, **kwargs: {'id': name_or_id}
210
+ )
211
+
212
+ def _build_args(self, fake_assoc, param=None):
213
+ arglist_base = [fake_assoc['id'], self.fake_bgpvpn['id']]
214
+ if param is not None:
215
+ if isinstance(param, list):
216
+ arglist_base.extend(param)
217
+ else:
218
+ arglist_base.append(param)
219
+ return arglist_base
220
+
221
+ def test_set_router_association_no_advertise(self):
222
+ fake_assoc = fakes.create_one_router_association(
223
+ {'advertise_extra_routes': True}
224
+ )
225
+
226
+ arglist = self._build_args(fake_assoc, '--no-advertise_extra_routes')
227
+ verifylist = [
228
+ ('resource_association_id', fake_assoc['id']),
229
+ ('bgpvpn', self.fake_bgpvpn['id']),
230
+ ]
231
+
232
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
233
+ result = self.cmd.take_action(parsed_args)
234
+
235
+ self.network_client.update_bgpvpn_router_association.assert_called_once_with(
236
+ self.fake_bgpvpn['id'],
237
+ fake_assoc['id'],
238
+ **{'advertise_extra_routes': False},
239
+ )
240
+ self.assertIsNone(result)
241
+
242
+ def test_set_router_association_advertise(self):
243
+ fake_assoc = fakes.create_one_router_association(
244
+ {'advertise_extra_routes': False}
245
+ )
246
+
247
+ arglist = self._build_args(fake_assoc, '--advertise_extra_routes')
248
+ verifylist = [
249
+ ('resource_association_id', fake_assoc['id']),
250
+ ('bgpvpn', self.fake_bgpvpn['id']),
251
+ ]
252
+
253
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
254
+ result = self.cmd.take_action(parsed_args)
255
+
256
+ self.network_client.update_bgpvpn_router_association.assert_called_once_with(
257
+ self.fake_bgpvpn['id'],
258
+ fake_assoc['id'],
259
+ **{'advertise_extra_routes': True},
260
+ )
261
+ self.assertIsNone(result)
262
+
263
+
264
+ class TestShowRouterAssoc(fakes.TestNeutronClientBgpvpn):
265
+ def setUp(self):
266
+ super().setUp()
267
+ self.cmd = router_association.ShowBgpvpnRouterAssoc(self.app, None)
268
+ self.network_client.find_bgpvpn.side_effect = (
269
+ lambda name_or_id, **kwargs: {'id': name_or_id}
270
+ )
271
+
272
+ def test_show_router_association(self):
273
+ fake_bgpvpn = fakes.create_one_bgpvpn()
274
+ fake_assoc = fakes.create_one_router_association(
275
+ {'advertise_extra_routes': True}
276
+ )
277
+ self.network_client.get_bgpvpn_router_association.return_value = (
278
+ fake_assoc
279
+ )
280
+ arglist = [
281
+ fake_assoc['id'],
282
+ fake_bgpvpn['id'],
283
+ ]
284
+ verifylist = [
285
+ ('resource_association_id', fake_assoc['id']),
286
+ ('bgpvpn', fake_bgpvpn['id']),
287
+ ]
288
+
289
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
290
+
291
+ cols, data = self.cmd.take_action(parsed_args)
292
+
293
+ self.network_client.get_bgpvpn_router_association.assert_called_once_with(
294
+ fake_bgpvpn['id'], fake_assoc['id']
295
+ )
296
+ self.assertEqual(sorted(sorted_columns), sorted(cols))
297
+ self.assertEqual(data, _get_data(fake_assoc, cols))