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,897 @@
1
+ # Copyright 2016 FUJITSU LIMITED
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 re
19
+ from unittest import mock
20
+
21
+ from openstack.network.v2 import firewall_group
22
+ from openstack.test import fakes as sdk_fakes
23
+ from osc_lib import exceptions
24
+
25
+ from openstackclient.network.v2.fwaas import group as fwaas_group
26
+ from openstackclient.tests.unit.network.v2 import fakes as network_fakes
27
+ from openstackclient.tests.unit import utils as test_utils
28
+
29
+
30
+ CONVERT_MAP = {
31
+ 'ingress_firewall_policy': 'ingress_firewall_policy_id',
32
+ 'egress_firewall_policy': 'egress_firewall_policy_id',
33
+ 'no_ingress_firewall_policy': 'ingress_firewall_policy_id',
34
+ 'no_egress_firewall_policy': 'egress_firewall_policy_id',
35
+ 'project': 'project_id',
36
+ 'port': 'ports',
37
+ }
38
+
39
+
40
+ def _generate_response(source=None, data=None):
41
+ source = source if source else {}
42
+ up = {
43
+ 'admin_state_up': fwaas_group.AdminStateColumn(
44
+ source['admin_state_up']
45
+ )
46
+ }
47
+ if data:
48
+ up.append(data)
49
+ source.update(up)
50
+ return source
51
+
52
+
53
+ def _generate_req_and_res(verifylist, response):
54
+ request = dict(verifylist)
55
+ for key, val in verifylist:
56
+ del request[key]
57
+ if re.match('^no_', key) and val is True:
58
+ new_value = None
59
+ elif val is True or val is False:
60
+ new_value = val
61
+ elif key in ('name', 'description'):
62
+ new_value = val
63
+ else:
64
+ new_value = val
65
+ converted = CONVERT_MAP.get(key, key)
66
+ request[converted] = new_value
67
+ response[converted] = new_value
68
+ return request, response
69
+
70
+
71
+ class TestFirewallGroup(network_fakes.TestNetworkV2):
72
+ def check_results(self, headers, data, exp_req, is_list=False):
73
+ if is_list:
74
+ req_body = {self.res_plural: list(exp_req)}
75
+ else:
76
+ req_body = exp_req
77
+ self.mocked.assert_called_once_with(**req_body)
78
+ self.assertEqual(self.ordered_headers, tuple(sorted(headers)))
79
+
80
+ def setUp(self):
81
+ super().setUp()
82
+
83
+ self.resource = sdk_fakes.generate_fake_resource(
84
+ firewall_group.FirewallGroup
85
+ )
86
+
87
+ def _find_resource(*args, **kwargs):
88
+ return self.resource
89
+
90
+ self.network_client.find_firewall_group.side_effect = _find_resource
91
+ self.identity_client.projects.get.side_effect = lambda x: mock.Mock(
92
+ id=x
93
+ )
94
+ self.res = 'firewall_group'
95
+ self.res_plural = 'firewall_groups'
96
+ self.list_headers = (
97
+ 'ID',
98
+ 'Name',
99
+ 'Ingress Policy ID',
100
+ 'Egress Policy ID',
101
+ )
102
+ self.list_data = (
103
+ self.resource['id'],
104
+ self.resource['name'],
105
+ self.resource['ingress_firewall_policy_id'],
106
+ self.resource['egress_firewall_policy_id'],
107
+ )
108
+ self.headers = tuple(
109
+ (
110
+ *self.list_headers,
111
+ 'Description',
112
+ 'Status',
113
+ 'Ports',
114
+ 'State',
115
+ 'Shared',
116
+ 'Project',
117
+ )
118
+ )
119
+ self.data = _generate_response(self.resource)
120
+ self.ordered_headers = copy.deepcopy(tuple(sorted(self.headers)))
121
+ self.expected_data = (
122
+ self.resource['description'],
123
+ self.resource['egress_firewall_policy_id'],
124
+ self.resource['id'],
125
+ self.resource['ingress_firewall_policy_id'],
126
+ self.resource['name'],
127
+ self.resource['ports'],
128
+ self.resource['project_id'],
129
+ self.resource['shared'],
130
+ fwaas_group.AdminStateColumn(self.resource['admin_state_up']),
131
+ self.resource['status'],
132
+ )
133
+ self.ordered_columns = (
134
+ 'description',
135
+ 'egress_firewall_policy_id',
136
+ 'id',
137
+ 'ingress_firewall_policy_id',
138
+ 'name',
139
+ 'ports',
140
+ 'project_id',
141
+ 'shared',
142
+ 'admin_state_up',
143
+ 'status',
144
+ )
145
+
146
+
147
+ class TestCreateFirewallGroup(TestFirewallGroup):
148
+ def setUp(self):
149
+ super().setUp()
150
+ self.network_client.create_firewall_group.return_value = self.resource
151
+ self.mocked = self.network_client.create_firewall_group
152
+ self.cmd = fwaas_group.CreateFirewallGroup(self.app, None)
153
+
154
+ def _update_expect_response(self, request, response):
155
+ """Set expected request and response
156
+
157
+ :param request
158
+ A dictionary of request body(dict of verifylist)
159
+ :param response
160
+ A OrderedDict of request body
161
+ """
162
+ # Update response body
163
+ self.network_client.create_firewall_group.return_value = response
164
+ # Update response(finally returns 'data')
165
+ self.data = _generate_response(source=response)
166
+ self.expected_data = response
167
+
168
+ def test_create_with_no_option(self):
169
+ # firewall_group-create with mandatory (none) params.
170
+ arglist = []
171
+ verifylist = []
172
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
173
+ headers, _data = self.cmd.take_action(parsed_args)
174
+ self.assertEqual(self.ordered_headers, tuple(sorted(headers)))
175
+
176
+ def test_create_with_port(self):
177
+ # firewall_group-create with 'port'
178
+ port_id = 'id_for_port'
179
+
180
+ def _mock_find(*args, **kwargs):
181
+ return mock.Mock(id=args[0])
182
+
183
+ self.network_client.find_port.side_effect = _mock_find
184
+ arglist = ['--port', port_id]
185
+ verifylist = [('port', [port_id])]
186
+ request, response = _generate_req_and_res(verifylist, self.resource)
187
+ self._update_expect_response(request, response)
188
+
189
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
190
+ headers, data = self.cmd.take_action(parsed_args)
191
+
192
+ self.check_results(headers, data, request)
193
+
194
+ def test_create_with_ingress_policy(self):
195
+ ingress_policy = 'my-ingress-policy'
196
+
197
+ def _mock_port_fwg(*args, **kwargs):
198
+ return mock.Mock(id=args[0])
199
+
200
+ self.network_client.find_firewall_policy.side_effect = _mock_port_fwg
201
+
202
+ arglist = ['--ingress-firewall-policy', ingress_policy]
203
+ verifylist = [('ingress_firewall_policy', ingress_policy)]
204
+ request, response = _generate_req_and_res(verifylist, self.resource)
205
+ self._update_expect_response(request, response)
206
+
207
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
208
+ headers, data = self.cmd.take_action(parsed_args)
209
+ self.network_client.find_firewall_policy.assert_called_once_with(
210
+ ingress_policy, ignore_missing=False
211
+ )
212
+
213
+ self.check_results(headers, data, request)
214
+
215
+ def test_create_with_egress_policy(self):
216
+ egress_policy = 'my-egress-policy'
217
+
218
+ def _mock_find(*args, **kwargs):
219
+ return mock.Mock(id=args[0])
220
+
221
+ self.network_client.find_firewall_group.side_effect = _mock_find
222
+ self.network_client.find_firewall_policy.side_effect = _mock_find
223
+
224
+ arglist = ['--egress-firewall-policy', egress_policy]
225
+ verifylist = [('egress_firewall_policy', egress_policy)]
226
+ request, response = _generate_req_and_res(verifylist, self.resource)
227
+ self._update_expect_response(request, response)
228
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
229
+ headers, data = self.cmd.take_action(parsed_args)
230
+
231
+ self.network_client.find_firewall_policy.assert_called_once_with(
232
+ egress_policy, ignore_missing=False
233
+ )
234
+ self.check_results(headers, data, request)
235
+
236
+ def test_create_with_all_params(self):
237
+ name = 'my-name'
238
+ description = 'my-desc'
239
+ ingress_policy = 'my-ingress-policy'
240
+ egress_policy = 'my-egress-policy'
241
+
242
+ def _mock_find(*args, **kwargs):
243
+ return mock.Mock(id=args[0])
244
+
245
+ self.network_client.find_firewall_policy.side_effect = _mock_find
246
+ port = 'port'
247
+ self.network_client.find_port.side_effect = _mock_find
248
+ project_id = 'my-project'
249
+ arglist = [
250
+ '--name',
251
+ name,
252
+ '--description',
253
+ description,
254
+ '--ingress-firewall-policy',
255
+ ingress_policy,
256
+ '--egress-firewall-policy',
257
+ egress_policy,
258
+ '--port',
259
+ port,
260
+ '--project',
261
+ project_id,
262
+ '--share',
263
+ '--disable',
264
+ ]
265
+ verifylist = [
266
+ ('name', name),
267
+ ('description', description),
268
+ ('ingress_firewall_policy', ingress_policy),
269
+ ('egress_firewall_policy', egress_policy),
270
+ ('port', [port]),
271
+ ('shared', True),
272
+ ('project', project_id),
273
+ ('admin_state_up', False),
274
+ ]
275
+ request, response = _generate_req_and_res(verifylist, self.resource)
276
+ self._update_expect_response(request, response)
277
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
278
+ headers, data = self.cmd.take_action(parsed_args)
279
+
280
+ self.check_results(headers, data, request)
281
+
282
+ def test_create_with_shared_and_no_share(self):
283
+ arglist = [
284
+ '--share',
285
+ '--no-share',
286
+ ]
287
+ verifylist = [
288
+ ('shared', True),
289
+ ]
290
+ self.assertRaises(
291
+ test_utils.ParserException,
292
+ self.check_parser,
293
+ self.cmd,
294
+ arglist,
295
+ verifylist,
296
+ )
297
+
298
+ def test_create_with_ports_and_no(self):
299
+ port = 'my-port'
300
+ arglist = [
301
+ '--port',
302
+ port,
303
+ '--no-port',
304
+ ]
305
+ verifylist = [
306
+ ('port', [port]),
307
+ ('no_port', True),
308
+ ]
309
+ self.assertRaises(
310
+ test_utils.ParserException,
311
+ self.check_parser,
312
+ self.cmd,
313
+ arglist,
314
+ verifylist,
315
+ )
316
+
317
+ def test_create_with_ingress_policy_and_no(self):
318
+ policy = 'my-policy'
319
+ arglist = [
320
+ '--ingress-firewall-policy',
321
+ policy,
322
+ '--no-ingress-firewall-policy',
323
+ ]
324
+ verifylist = [
325
+ ('ingress_firewall_policy', policy),
326
+ ('no_ingress_firewall_policy', True),
327
+ ]
328
+ self.assertRaises(
329
+ test_utils.ParserException,
330
+ self.check_parser,
331
+ self.cmd,
332
+ arglist,
333
+ verifylist,
334
+ )
335
+
336
+ def test_create_with_egress_policy_and_no(self):
337
+ policy = 'my-policy'
338
+ arglist = [
339
+ '--egress-firewall-policy',
340
+ policy,
341
+ '--no-egress-firewall-policy',
342
+ ]
343
+ verifylist = [
344
+ ('egress_firewall_policy', policy),
345
+ ('no_egress_firewall_policy', True),
346
+ ]
347
+ self.assertRaises(
348
+ test_utils.ParserException,
349
+ self.check_parser,
350
+ self.cmd,
351
+ arglist,
352
+ verifylist,
353
+ )
354
+
355
+
356
+ class TestListFirewallGroup(TestFirewallGroup):
357
+ def setUp(self):
358
+ super().setUp()
359
+ self.network_client.firewall_groups.return_value = [self.resource]
360
+ self.mocked = self.network_client.firewall_groups
361
+ self.cmd = fwaas_group.ListFirewallGroup(self.app, None)
362
+
363
+ def test_list_with_no_option(self):
364
+ arglist = []
365
+ verifylist = []
366
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
367
+ headers, data = self.cmd.take_action(parsed_args)
368
+
369
+ self.mocked.assert_called_once_with()
370
+ self.assertEqual(list(self.list_headers), headers)
371
+ self.assertEqual([self.list_data], list(data))
372
+
373
+ def test_list_with_long_option(self):
374
+ arglist = ['--long']
375
+ verifylist = [('long', True)]
376
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
377
+ headers, _data = self.cmd.take_action(parsed_args)
378
+
379
+ self.mocked.assert_called_once_with()
380
+ self.assertEqual(list(self.headers), headers)
381
+
382
+
383
+ class TestShowFirewallGroup(TestFirewallGroup):
384
+ def setUp(self):
385
+ super().setUp()
386
+ self.network_client.get_firewall_group.return_value = self.resource
387
+ self.mocked = self.network_client.get_firewall_group
388
+ self.cmd = fwaas_group.ShowFirewallGroup(self.app, None)
389
+
390
+ def test_show_filtered_by_id_or_name(self):
391
+ target = self.resource['id']
392
+
393
+ def _mock_fwaas(*args, **kwargs):
394
+ return mock.Mock(id=args[0])
395
+
396
+ self.network_client.find_firewall_group.side_effect = _mock_fwaas
397
+
398
+ arglist = [target]
399
+ verifylist = [(self.res, target)]
400
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
401
+ headers, _data = self.cmd.take_action(parsed_args)
402
+
403
+ self.mocked.assert_called_once_with(target)
404
+ self.assertEqual(self.ordered_headers, headers)
405
+
406
+
407
+ class TestSetFirewallGroup(TestFirewallGroup):
408
+ def setUp(self):
409
+ super().setUp()
410
+ self.resource['ports'] = ['old_port']
411
+ self.network_client.update_firewall_group.return_value = {
412
+ self.res: self.resource
413
+ }
414
+ self.mocked = self.network_client.update_firewall_group
415
+
416
+ def _mock_find_port(*args, **kwargs):
417
+ return mock.Mock(id=args[0])
418
+
419
+ self.network_client.find_port.side_effect = _mock_find_port
420
+
421
+ self.cmd = fwaas_group.SetFirewallGroup(self.app, None)
422
+
423
+ def _update_expect_response(self, request, response):
424
+ """Set expected request and response
425
+
426
+ :param request
427
+ A dictionary of request body(dict of verifylist)
428
+ :param response
429
+ A OrderedDict of request body
430
+ """
431
+ # Update response(finally returns 'data')
432
+ self.data = _generate_response(source=response)
433
+ self.ordered_data = tuple(
434
+ response[column] for column in self.ordered_columns
435
+ )
436
+
437
+ def test_set_name(self):
438
+ target = self.resource['id']
439
+ update = 'change'
440
+ arglist = [target, '--name', update]
441
+ verifylist = [
442
+ (self.res, target),
443
+ ('name', update),
444
+ ]
445
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
446
+ result = self.cmd.take_action(parsed_args)
447
+
448
+ self.mocked.assert_called_once_with(target, **{'name': update})
449
+ self.assertIsNone(result)
450
+
451
+ def test_set_options(self):
452
+ target = self.resource['id']
453
+ updated_desc = 'change-desc'
454
+ arglist = [target, '--description', updated_desc, '--share']
455
+ verifylist = [
456
+ (self.res, target),
457
+ ('description', updated_desc),
458
+ ('shared', True),
459
+ ]
460
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
461
+ result = self.cmd.take_action(parsed_args)
462
+
463
+ self.mocked.assert_called_once_with(
464
+ target, shared=True, description=updated_desc
465
+ )
466
+ self.assertIsNone(result)
467
+
468
+ def test_set_ingress_policy_and_egress_policy(self):
469
+ target = self.resource['id']
470
+ ingress_policy = 'ingress_policy'
471
+ egress_policy = 'egress_policy'
472
+
473
+ def _mock_fwg_policy(*args, **kwargs):
474
+ return mock.Mock(id=args[0])
475
+
476
+ self.network_client.find_firewall_group.side_effect = _mock_fwg_policy
477
+ self.network_client.find_firewall_policy.side_effect = _mock_fwg_policy
478
+
479
+ arglist = [
480
+ target,
481
+ '--ingress-firewall-policy',
482
+ ingress_policy,
483
+ '--egress-firewall-policy',
484
+ egress_policy,
485
+ ]
486
+ verifylist = [
487
+ (self.res, target),
488
+ ('ingress_firewall_policy', ingress_policy),
489
+ ('egress_firewall_policy', egress_policy),
490
+ ]
491
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
492
+ result = self.cmd.take_action(parsed_args)
493
+
494
+ self.mocked.assert_called_once_with(
495
+ target,
496
+ **{
497
+ 'ingress_firewall_policy_id': ingress_policy,
498
+ 'egress_firewall_policy_id': egress_policy,
499
+ },
500
+ )
501
+ self.assertIsNone(result)
502
+
503
+ def test_set_port(self):
504
+ target = self.resource['id']
505
+ port1 = 'additional_port1'
506
+ port2 = 'additional_port2'
507
+
508
+ def _mock_port_fwg(*args, **kwargs):
509
+ return mock.Mock(id=args[0], ports=self.resource['ports'])
510
+
511
+ self.network_client.find_firewall_group.side_effect = _mock_port_fwg
512
+ self.network_client.find_port.side_effect = _mock_port_fwg
513
+
514
+ arglist = [
515
+ target,
516
+ '--port',
517
+ port1,
518
+ '--port',
519
+ port2,
520
+ ]
521
+ verifylist = [
522
+ (self.res, target),
523
+ ('port', [port1, port2]),
524
+ ]
525
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
526
+ result = self.cmd.take_action(parsed_args)
527
+
528
+ expect = {'ports': sorted(self.resource['ports'] + [port1, port2])}
529
+ self.mocked.assert_called_once_with(target, **expect)
530
+ self.assertEqual(2, self.network_client.find_firewall_group.call_count)
531
+ self.assertIsNone(result)
532
+
533
+ def test_set_no_port(self):
534
+ # firewall_group-update myid --policy newpolicy.
535
+ target = self.resource['id']
536
+ arglist = [target, '--no-port']
537
+ verifylist = [
538
+ (self.res, target),
539
+ ('no_port', True),
540
+ ]
541
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
542
+ result = self.cmd.take_action(parsed_args)
543
+
544
+ self.mocked.assert_called_once_with(target, **{'ports': []})
545
+ self.assertIsNone(result)
546
+
547
+ def test_set_admin_state(self):
548
+ target = self.resource['id']
549
+ arglist = [target, '--enable']
550
+ verifylist = [
551
+ (self.res, target),
552
+ ('admin_state_up', True),
553
+ ]
554
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
555
+ result = self.cmd.take_action(parsed_args)
556
+
557
+ self.mocked.assert_called_once_with(target, **{'admin_state_up': True})
558
+ self.assertIsNone(result)
559
+
560
+ def test_set_shared(self):
561
+ target = self.resource['id']
562
+ arglist = [target, '--share']
563
+ verifylist = [
564
+ (self.res, target),
565
+ ('shared', True),
566
+ ]
567
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
568
+ result = self.cmd.take_action(parsed_args)
569
+
570
+ self.mocked.assert_called_once_with(target, **{'shared': True})
571
+ self.assertIsNone(result)
572
+
573
+ def test_set_no_share(self):
574
+ target = self.resource['id']
575
+ arglist = [target, '--no-share']
576
+ verifylist = [
577
+ (self.res, target),
578
+ ('shared', False),
579
+ ]
580
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
581
+ result = self.cmd.take_action(parsed_args)
582
+
583
+ self.mocked.assert_called_once_with(target, **{'shared': False})
584
+ self.assertIsNone(result)
585
+
586
+ def test_set_egress_policy(self):
587
+ target = self.resource['id']
588
+ policy = 'egress_policy'
589
+
590
+ def _mock_find_policy(*args, **kwargs):
591
+ return mock.Mock(id=args[0])
592
+
593
+ self.network_client.find_firewall_policy.side_effect = (
594
+ _mock_find_policy
595
+ )
596
+
597
+ arglist = [target, '--egress-firewall-policy', policy]
598
+ verifylist = [
599
+ (self.res, target),
600
+ ('egress_firewall_policy', policy),
601
+ ]
602
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
603
+ result = self.cmd.take_action(parsed_args)
604
+
605
+ self.mocked.assert_called_once_with(
606
+ target, **{'egress_firewall_policy_id': policy}
607
+ )
608
+ self.assertIsNone(result)
609
+
610
+ def test_set_no_ingress_policies(self):
611
+ target = self.resource['id']
612
+ arglist = [target, '--no-ingress-firewall-policy']
613
+ verifylist = [
614
+ (self.res, target),
615
+ ('no_ingress_firewall_policy', True),
616
+ ]
617
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
618
+ result = self.cmd.take_action(parsed_args)
619
+
620
+ self.mocked.assert_called_once_with(
621
+ target, **{'ingress_firewall_policy_id': None}
622
+ )
623
+ self.assertIsNone(result)
624
+
625
+ def test_set_no_egress_policies(self):
626
+ target = self.resource['id']
627
+ arglist = [target, '--no-egress-firewall-policy']
628
+ verifylist = [
629
+ (self.res, target),
630
+ ('no_egress_firewall_policy', True),
631
+ ]
632
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
633
+ result = self.cmd.take_action(parsed_args)
634
+
635
+ self.mocked.assert_called_once_with(
636
+ target, **{'egress_firewall_policy_id': None}
637
+ )
638
+ self.assertIsNone(result)
639
+
640
+ def test_set_port_and_no_port(self):
641
+ target = self.resource['id']
642
+ port = 'my-port'
643
+ arglist = [
644
+ target,
645
+ '--port',
646
+ port,
647
+ '--no-port',
648
+ ]
649
+ verifylist = [
650
+ (self.res, target),
651
+ ('port', [port]),
652
+ ('no_port', True),
653
+ ]
654
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
655
+ result = self.cmd.take_action(parsed_args)
656
+ self.mocked.assert_called_once_with(target, **{'ports': [port]})
657
+ self.assertIsNone(result)
658
+
659
+ def test_set_ingress_policy_and_no_ingress_policy(self):
660
+ target = self.resource['id']
661
+ arglist = [
662
+ target,
663
+ '--ingress-firewall-policy',
664
+ 'my-ingress',
665
+ '--no-ingress-firewall-policy',
666
+ ]
667
+ verifylist = [
668
+ (self.res, target),
669
+ ('ingress_firewall_policy', 'my-ingress'),
670
+ ('no_ingress_firewall_policy', True),
671
+ ]
672
+ self.assertRaises(
673
+ test_utils.ParserException,
674
+ self.check_parser,
675
+ self.cmd,
676
+ arglist,
677
+ verifylist,
678
+ )
679
+
680
+ def test_set_egress_policy_and_no_egress_policy(self):
681
+ target = self.resource['id']
682
+ arglist = [
683
+ target,
684
+ '--egress-firewall-policy',
685
+ 'my-egress',
686
+ '--no-egress-firewall-policy',
687
+ ]
688
+ verifylist = [
689
+ (self.res, target),
690
+ ('egress_firewall_policy', 'my-egress'),
691
+ ('no_egress_firewall_policy', True),
692
+ ]
693
+ self.assertRaises(
694
+ test_utils.ParserException,
695
+ self.check_parser,
696
+ self.cmd,
697
+ arglist,
698
+ verifylist,
699
+ )
700
+
701
+ def test_set_and_raises(self):
702
+ self.network_client.update_firewall_group.side_effect = Exception
703
+ target = self.resource['id']
704
+ arglist = [target, '--name', 'my-name']
705
+ verifylist = [(self.res, target), ('name', 'my-name')]
706
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
707
+
708
+ self.assertRaises(
709
+ exceptions.CommandError, self.cmd.take_action, parsed_args
710
+ )
711
+
712
+
713
+ class TestDeleteFirewallGroup(TestFirewallGroup):
714
+ def setUp(self):
715
+ super().setUp()
716
+ # Mock objects
717
+ self.mocked = self.network_client.delete_firewall_group
718
+ self.cmd = fwaas_group.DeleteFirewallGroup(self.app, None)
719
+
720
+ def test_delete_with_one_resource(self):
721
+ target = self.resource['id']
722
+
723
+ def _mock_fwaas(*args, **kwargs):
724
+ return mock.Mock(id=args[0])
725
+
726
+ self.network_client.find_firewall_group.side_effect = _mock_fwaas
727
+
728
+ arglist = [target]
729
+ verifylist = [(self.res, [target])]
730
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
731
+ result = self.cmd.take_action(parsed_args)
732
+
733
+ self.mocked.assert_called_once_with(target)
734
+ self.assertIsNone(result)
735
+
736
+ def test_delete_with_multiple_resources(self):
737
+
738
+ def _mock_fwaas(*args, **kwargs):
739
+ return mock.Mock(id=args[0])
740
+
741
+ self.network_client.find_firewall_group.side_effect = _mock_fwaas
742
+
743
+ target1 = 'target1'
744
+ target2 = 'target2'
745
+ arglist = [target1, target2]
746
+ verifylist = [(self.res, [target1, target2])]
747
+
748
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
749
+ result = self.cmd.take_action(parsed_args)
750
+ self.assertIsNone(result)
751
+
752
+ self.assertEqual(2, self.mocked.call_count)
753
+ for idx, reference in enumerate([target1, target2]):
754
+ actual = ''.join(self.mocked.call_args_list[idx][0][0])
755
+ self.assertEqual(reference, actual)
756
+
757
+ def test_delete_multiple_with_exception(self):
758
+ target1 = 'target1'
759
+ target2 = 'target2'
760
+ arglist = [target1, target2]
761
+ verifylist = [(self.res, [target1, target2])]
762
+
763
+ def _mock_find(*args, **kwargs):
764
+ if args[0] == target2:
765
+ raise Exception('Not found')
766
+ return mock.Mock(id=args[0])
767
+
768
+ self.network_client.find_firewall_group.side_effect = _mock_find
769
+
770
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
771
+ self.assertRaises(
772
+ exceptions.CommandError, self.cmd.take_action, parsed_args
773
+ )
774
+
775
+
776
+ class TestUnsetFirewallGroup(TestFirewallGroup):
777
+ def setUp(self):
778
+ super().setUp()
779
+ self.resource['ports'] = ['old_port']
780
+ # Mock objects
781
+ self.mocked = self.network_client.update_firewall_group
782
+ self.cmd = fwaas_group.UnsetFirewallGroup(self.app, None)
783
+
784
+ def test_unset_shared(self):
785
+ target = self.resource['id']
786
+ arglist = [
787
+ target,
788
+ '--share',
789
+ ]
790
+ verifylist = [
791
+ (self.res, target),
792
+ ('share', True),
793
+ ]
794
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
795
+ with mock.patch.object(fwaas_group.LOG, 'warning') as mock_warning:
796
+ result = self.cmd.take_action(parsed_args)
797
+ mock_warning.assert_called_once_with(
798
+ 'The --share option is deprecated, please use '
799
+ '"firewall group set --no-share" instead.'
800
+ )
801
+ self.mocked.assert_called_once_with(target, **{'shared': False})
802
+ self.assertIsNone(result)
803
+
804
+ def test_unset_ingress_policy(self):
805
+ target = self.resource['id']
806
+ arglist = [
807
+ target,
808
+ '--ingress-firewall-policy',
809
+ ]
810
+ verifylist = [
811
+ (self.res, target),
812
+ ('ingress_firewall_policy', True),
813
+ ]
814
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
815
+ result = self.cmd.take_action(parsed_args)
816
+ self.mocked.assert_called_once_with(
817
+ target, **{'ingress_firewall_policy_id': None}
818
+ )
819
+ self.assertIsNone(result)
820
+
821
+ def test_unset_egress_policy(self):
822
+ target = self.resource['id']
823
+ arglist = [
824
+ target,
825
+ '--egress-firewall-policy',
826
+ ]
827
+ verifylist = [
828
+ (self.res, target),
829
+ ('egress_firewall_policy', True),
830
+ ]
831
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
832
+ result = self.cmd.take_action(parsed_args)
833
+ self.mocked.assert_called_once_with(
834
+ target, **{'egress_firewall_policy_id': None}
835
+ )
836
+ self.assertIsNone(result)
837
+
838
+ def test_unset_enable(self):
839
+ target = self.resource['id']
840
+ arglist = [
841
+ target,
842
+ '--enable',
843
+ ]
844
+ verifylist = [
845
+ (self.res, target),
846
+ ('enable', True),
847
+ ]
848
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
849
+ with mock.patch.object(fwaas_group.LOG, 'warning') as mock_warning:
850
+ result = self.cmd.take_action(parsed_args)
851
+ mock_warning.assert_called_once_with(
852
+ 'The --enable option is deprecated, please use '
853
+ '"firewall group set --disable" instead.'
854
+ )
855
+ self.mocked.assert_called_once_with(
856
+ target, **{'admin_state_up': False}
857
+ )
858
+ self.assertIsNone(result)
859
+
860
+ def test_unset_port(self):
861
+ target = self.resource['id']
862
+ port = 'old_port'
863
+
864
+ def _mock_port_fwg(*args, **kwargs):
865
+ return mock.Mock(id=args[0], ports=self.resource['ports'])
866
+
867
+ self.network_client.find_firewall_group.side_effect = _mock_port_fwg
868
+ self.network_client.find_port.side_effect = _mock_port_fwg
869
+
870
+ arglist = [
871
+ target,
872
+ '--port',
873
+ port,
874
+ ]
875
+ verifylist = [
876
+ (self.res, target),
877
+ ('port', [port]),
878
+ ]
879
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
880
+ result = self.cmd.take_action(parsed_args)
881
+ self.mocked.assert_called_once_with(target, **{'ports': []})
882
+ self.assertIsNone(result)
883
+
884
+ def test_unset_all_port(self):
885
+ target = self.resource['id']
886
+ arglist = [
887
+ target,
888
+ '--all-port',
889
+ ]
890
+ verifylist = [
891
+ (self.res, target),
892
+ ('all_port', True),
893
+ ]
894
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
895
+ result = self.cmd.take_action(parsed_args)
896
+ self.mocked.assert_called_once_with(target, **{'ports': []})
897
+ self.assertIsNone(result)