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,980 @@
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 re
18
+ from unittest import mock
19
+
20
+ from cliff import columns as cliff_columns
21
+ from openstack.network.v2 import firewall_rule
22
+ from openstack.test import fakes as sdk_fakes
23
+ from osc_lib import exceptions
24
+ import testtools
25
+
26
+ from openstackclient.network.v2.fwaas import rule as fwaas_rule
27
+ from openstackclient.tests.unit.network.v2 import fakes as network_fakes
28
+ from openstackclient.tests.unit import utils as test_utils
29
+
30
+
31
+ CONVERT_MAP = {
32
+ 'project': 'project_id',
33
+ }
34
+
35
+
36
+ def _generate_data(source=None, data=None):
37
+ if data:
38
+ source.update(data)
39
+ ret = tuple(_replace_display_columns(key, source[key]) for key in source)
40
+ return ret
41
+
42
+
43
+ def _replace_display_columns(key, val):
44
+ if key == 'protocol':
45
+ return fwaas_rule.ProtocolColumn(val)
46
+ return val
47
+
48
+
49
+ def _generate_req_and_res(verifylist, response):
50
+ request = dict(verifylist)
51
+ for key, val in verifylist:
52
+ converted = CONVERT_MAP.get(key, key)
53
+ del request[key]
54
+ if re.match('^no_', key) and val is True:
55
+ new_value = None
56
+ elif key == 'protocol' and val and val.lower() == 'any':
57
+ new_value = None
58
+ elif val is True or val is False:
59
+ new_value = val
60
+ elif key in ('name', 'description'):
61
+ new_value = val
62
+ else:
63
+ new_value = val
64
+ request[converted] = new_value
65
+ response[converted] = new_value
66
+ return request, response
67
+
68
+
69
+ class TestFirewallRule(network_fakes.TestNetworkV2):
70
+ def check_results(self, headers, data, exp_req=None, is_list=False):
71
+ if is_list:
72
+ req_body = {self.res_plural: [exp_req]}
73
+ else:
74
+ req_body = exp_req
75
+ if not exp_req:
76
+ self.mocked.assert_called_once_with()
77
+ else:
78
+ self.mocked.assert_called_once_with(**req_body)
79
+ self.assertEqual(self.ordered_headers, headers)
80
+
81
+ # TODO(slaweq): remove this method once network_fakes.TestNetworkV2 will
82
+ # inherit from the osc_lib.test.base.TestCommand
83
+ def assertListItemEqual(self, expected, actual):
84
+ self.assertEqual(len(expected), len(actual))
85
+ for item_expected, item_actual in zip(expected, actual):
86
+ self.assertItemEqual(item_expected, item_actual)
87
+
88
+ # TODO(slaweq): remove this method once network_fakes.TestNetworkV2 will
89
+ # inherit from the osc_lib.test.base.TestCommand
90
+ def assertItemEqual(self, expected, actual):
91
+ self.assertEqual(len(expected), len(actual))
92
+ for col_expected, col_actual in zip(expected, actual):
93
+ if isinstance(col_expected, cliff_columns.FormattableColumn):
94
+ self.assertIsInstance(col_actual, col_expected.__class__)
95
+ self.assertEqual(
96
+ col_expected.human_readable(), col_actual.human_readable()
97
+ )
98
+ else:
99
+ self.assertEqual(col_expected, col_actual)
100
+
101
+ def setUp(self):
102
+ super().setUp()
103
+
104
+ self.identity_client.projects.get.side_effect = lambda x: mock.Mock(
105
+ id=x
106
+ )
107
+ self.res = 'firewall_rule'
108
+ self.res_plural = 'firewall_rules'
109
+ self.resource = sdk_fakes.generate_fake_resource(
110
+ firewall_rule.FirewallRule
111
+ )
112
+ self.headers = (
113
+ 'ID',
114
+ 'Name',
115
+ 'Enabled',
116
+ 'Description',
117
+ 'Firewall Policy',
118
+ 'IP Version',
119
+ 'Action',
120
+ 'Protocol',
121
+ 'Source IP Address',
122
+ 'Source Port',
123
+ 'Destination IP Address',
124
+ 'Destination Port',
125
+ 'Shared',
126
+ 'Project',
127
+ 'Source Firewall Group ID',
128
+ 'Destination Firewall Group ID',
129
+ )
130
+ self.data = _generate_data(self.resource)
131
+ self.ordered_headers = (
132
+ 'Action',
133
+ 'Description',
134
+ 'Destination Firewall Group ID',
135
+ 'Destination IP Address',
136
+ 'Destination Port',
137
+ 'Enabled',
138
+ 'Firewall Policy',
139
+ 'ID',
140
+ 'IP Version',
141
+ 'Name',
142
+ 'Project',
143
+ 'Protocol',
144
+ 'Shared',
145
+ 'Source Firewall Group ID',
146
+ 'Source IP Address',
147
+ 'Source Port',
148
+ 'Summary',
149
+ )
150
+ self.ordered_data = (
151
+ self.resource['action'],
152
+ self.resource['description'],
153
+ self.resource['destination_ip_address'],
154
+ self.resource['destination_port'],
155
+ self.resource['firewall_policy_id'],
156
+ self.resource['enabled'],
157
+ self.resource['id'],
158
+ self.resource['ip_version'],
159
+ self.resource['name'],
160
+ self.resource['project_id'],
161
+ _replace_display_columns('protocol', self.resource['protocol']),
162
+ self.resource['shared'],
163
+ self.resource['source_ip_address'],
164
+ self.resource['source_port'],
165
+ )
166
+ self.ordered_columns = (
167
+ 'action',
168
+ 'description',
169
+ 'destination_ip_address',
170
+ 'destination_port',
171
+ 'enabled',
172
+ 'id',
173
+ 'ip_version',
174
+ 'name',
175
+ 'project_id',
176
+ 'protocol',
177
+ 'shared',
178
+ 'source_ip_address',
179
+ 'source_port',
180
+ )
181
+
182
+
183
+ class TestCreateFirewallRule(TestFirewallRule):
184
+ def setUp(self):
185
+ super().setUp()
186
+ self.network_client.create_firewall_rule.return_value = self.resource
187
+ self.mocked = self.network_client.create_firewall_rule
188
+
189
+ def _mock_find_group(*args, **kwargs):
190
+ return self.resource
191
+
192
+ self.network_client.find_firewall_group.side_effect = _mock_find_group
193
+
194
+ self.cmd = fwaas_rule.CreateFirewallRule(self.app, None)
195
+
196
+ def _update_expect_response(self, request, response):
197
+ """Set expected request and response
198
+
199
+ :param request
200
+ A dictionary of request body(dict of verifylist)
201
+ :param response
202
+ A OrderedDict of request body
203
+ """
204
+ # Update response body
205
+ self.network_client.create_firewall_rule.return_value = response
206
+ # Update response(finally returns 'data')
207
+ self.data = _generate_data(source=response)
208
+ self.ordered_data = tuple(
209
+ _replace_display_columns(column, response[column])
210
+ for column in self.ordered_columns
211
+ )
212
+
213
+ def _set_all_params(self, args={}):
214
+ name = args.get('name') or 'my-name'
215
+ description = args.get('description') or 'my-desc'
216
+ source_ip = args.get('source_ip_address') or '192.168.1.0/24'
217
+ destination_ip = args.get('destination_ip_address') or '192.168.2.0/24'
218
+ source_port = args.get('source_port') or '0:65535'
219
+ protocol = args.get('protocol') or 'udp'
220
+ action = args.get('action') or 'deny'
221
+ ip_version = args.get('ip_version') or '4'
222
+ destination_port = args.get('destination_port') or '0:65535'
223
+ project_id = args.get('project_id') or 'my-tenant'
224
+ arglist = [
225
+ '--description',
226
+ description,
227
+ '--name',
228
+ name,
229
+ '--protocol',
230
+ protocol,
231
+ '--ip-version',
232
+ ip_version,
233
+ '--source-ip-address',
234
+ source_ip,
235
+ '--destination-ip-address',
236
+ destination_ip,
237
+ '--source-port',
238
+ source_port,
239
+ '--destination-port',
240
+ destination_port,
241
+ '--action',
242
+ action,
243
+ '--project',
244
+ project_id,
245
+ '--disable-rule',
246
+ '--share',
247
+ ]
248
+
249
+ verifylist = [
250
+ ('name', name),
251
+ ('description', description),
252
+ ('shared', True),
253
+ ('protocol', protocol),
254
+ ('ip_version', ip_version),
255
+ ('source_ip_address', source_ip),
256
+ ('destination_ip_address', destination_ip),
257
+ ('source_port', source_port),
258
+ ('destination_port', destination_port),
259
+ ('action', action),
260
+ ('enabled', False),
261
+ ('project', project_id),
262
+ ]
263
+ return arglist, verifylist
264
+
265
+ def _test_create_with_all_params(self, args={}):
266
+ arglist, verifylist = self._set_all_params(args)
267
+ request, response = _generate_req_and_res(verifylist, self.resource)
268
+ self._update_expect_response(request, response)
269
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
270
+ headers, data = self.cmd.take_action(parsed_args)
271
+
272
+ self.check_results(headers, data, request)
273
+
274
+ def test_create_with_no_options(self):
275
+ arglist = []
276
+ verifylist = []
277
+
278
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
279
+ headers, data = self.cmd.take_action(parsed_args)
280
+ self.check_results(headers, data, None)
281
+
282
+ def test_create_with_all_params(self):
283
+ self._test_create_with_all_params()
284
+
285
+ def test_create_with_all_params_protocol_any(self):
286
+ self._test_create_with_all_params({'protocol': 'any'})
287
+
288
+ def test_create_with_all_params_ip_version_6(self):
289
+ self._test_create_with_all_params({'ip_version': '6'})
290
+
291
+ def test_create_with_all_params_invalid_ip_version(self):
292
+ arglist, verifylist = self._set_all_params({'ip_version': '128'})
293
+ self.assertRaises(
294
+ test_utils.ParserException,
295
+ self.check_parser,
296
+ self.cmd,
297
+ arglist,
298
+ verifylist,
299
+ )
300
+
301
+ def test_create_with_all_params_action_upper_capitalized(self):
302
+ for action in ('Allow', 'DENY', 'Reject'):
303
+ arglist, verifylist = self._set_all_params({'action': action})
304
+ self.assertRaises(
305
+ testtools.matchers._impl.MismatchError,
306
+ self.check_parser,
307
+ self.cmd,
308
+ arglist,
309
+ verifylist,
310
+ )
311
+
312
+ def test_create_with_all_params_protocol_upper_capitalized(self):
313
+ for protocol in ('TCP', 'Tcp', 'ANY', 'AnY', 'iCMp'):
314
+ arglist, verifylist = self._set_all_params({'protocol': protocol})
315
+ self.assertRaises(
316
+ testtools.matchers._impl.MismatchError,
317
+ self.check_parser,
318
+ self.cmd,
319
+ arglist,
320
+ verifylist,
321
+ )
322
+
323
+
324
+ class TestListFirewallRule(TestFirewallRule):
325
+ def _setup_summary(self, expect=None):
326
+ protocol = (self.resource['protocol'] or 'any').upper()
327
+ src = 'source(port): 192.168.1.0/24(1:11111)'
328
+ dst = 'dest(port): 192.168.2.2(2:22222)'
329
+ action = 'deny'
330
+ if expect:
331
+ if expect.get('protocol'):
332
+ protocol = expect['protocol'].upper()
333
+ if expect.get('source_ip_address'):
334
+ src_ip = expect['source_ip_address']
335
+ if expect.get('source_port'):
336
+ src_port = expect['source_port']
337
+ if expect.get('destination_ip_address'):
338
+ dst_ip = expect['destination_ip_address']
339
+ if expect.get('destination_port'):
340
+ dst_port = expect['destination_port']
341
+ if expect.get('action'):
342
+ action = expect['action']
343
+ src = 'source(port): ' + src_ip + '(' + src_port + ')'
344
+ dst = 'dest(port): ' + dst_ip + '(' + dst_port + ')'
345
+ return ',\n '.join([protocol, src, dst, action])
346
+
347
+ def setUp(self):
348
+ super().setUp()
349
+ self.cmd = fwaas_rule.ListFirewallRule(self.app, None)
350
+
351
+ self.short_header = (
352
+ 'ID',
353
+ 'Name',
354
+ 'Enabled',
355
+ 'Summary',
356
+ 'Firewall Policy',
357
+ )
358
+
359
+ summary = self._setup_summary(self.resource)
360
+
361
+ self.short_data = (
362
+ self.resource['id'],
363
+ self.resource['name'],
364
+ self.resource['enabled'],
365
+ summary,
366
+ self.resource['firewall_policy_id'],
367
+ )
368
+ self.network_client.firewall_rules.return_value = [self.resource]
369
+ self.mocked = self.network_client.firewall_rules
370
+
371
+ def test_list_with_long_option(self):
372
+ arglist = ['--long']
373
+ verifylist = [('long', True)]
374
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
375
+ headers, _data = self.cmd.take_action(parsed_args)
376
+
377
+ self.mocked.assert_called_once_with()
378
+ self.assertEqual(list(self.headers), headers)
379
+
380
+ def test_list_with_no_option(self):
381
+ arglist = []
382
+ verifylist = []
383
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
384
+ headers, data = self.cmd.take_action(parsed_args)
385
+
386
+ self.mocked.assert_called_once_with()
387
+ self.assertEqual(list(self.short_header), headers)
388
+ self.assertListItemEqual([self.short_data], list(data))
389
+
390
+
391
+ class TestShowFirewallRule(TestFirewallRule):
392
+ def setUp(self):
393
+ super().setUp()
394
+ self.network_client.get_firewall_rule.return_value = self.resource
395
+ self.mocked = self.network_client.get_firewall_rule
396
+ self.cmd = fwaas_rule.ShowFirewallRule(self.app, None)
397
+
398
+ def test_show_filtered_by_id_or_name(self):
399
+ target = self.resource['id']
400
+
401
+ def _mock_fwaas(*args, **kwargs):
402
+ return sdk_fakes.generate_fake_resource(
403
+ firewall_rule.FirewallRule, id=args[0]
404
+ )
405
+
406
+ self.network_client.find_firewall_rule.side_effect = _mock_fwaas
407
+
408
+ arglist = [target]
409
+ verifylist = [(self.res, target)]
410
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
411
+ headers, _data = self.cmd.take_action(parsed_args)
412
+
413
+ self.mocked.assert_called_once_with(target)
414
+ self.assertEqual(self.ordered_headers, headers)
415
+
416
+
417
+ class TestSetFirewallRule(TestFirewallRule):
418
+ def setUp(self):
419
+ super().setUp()
420
+ self.network_client.update_firewall_rule.return_value = self.resource
421
+ self.mocked = self.network_client.update_firewall_rule
422
+
423
+ def _mock_find_rule(*args, **kwargs):
424
+ return sdk_fakes.generate_fake_resource(
425
+ firewall_rule.FirewallRule, id=args[0]
426
+ )
427
+
428
+ self.network_client.find_firewall_rule.side_effect = _mock_find_rule
429
+
430
+ self.cmd = fwaas_rule.SetFirewallRule(self.app, None)
431
+
432
+ def test_set_name(self):
433
+ target = self.resource['id']
434
+ update = 'change'
435
+ arglist = [target, '--name', update]
436
+ verifylist = [
437
+ (self.res, target),
438
+ ('name', update),
439
+ ]
440
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
441
+ result = self.cmd.take_action(parsed_args)
442
+
443
+ self.mocked.assert_called_once_with(target, **{'name': update})
444
+ self.assertIsNone(result)
445
+
446
+ def test_set_options(self):
447
+ target = self.resource['id']
448
+ updated_desc = 'change-desc'
449
+ arglist = [target, '--description', updated_desc, '--share']
450
+ verifylist = [
451
+ (self.res, target),
452
+ ('description', updated_desc),
453
+ ('shared', True),
454
+ ]
455
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
456
+ result = self.cmd.take_action(parsed_args)
457
+
458
+ self.mocked.assert_called_once_with(
459
+ target, shared=True, description=updated_desc
460
+ )
461
+ self.assertIsNone(result)
462
+
463
+ def test_set_protocol_with_any(self):
464
+ target = self.resource['id']
465
+ protocol = 'any'
466
+ arglist = [target, '--protocol', protocol]
467
+ verifylist = [
468
+ (self.res, target),
469
+ ('protocol', protocol),
470
+ ]
471
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
472
+ result = self.cmd.take_action(parsed_args)
473
+
474
+ self.mocked.assert_called_once_with(target, **{'protocol': None})
475
+ self.assertIsNone(result)
476
+
477
+ def test_set_protocol_with_udp(self):
478
+ target = self.resource['id']
479
+ protocol = 'udp'
480
+ arglist = [target, '--protocol', protocol]
481
+ verifylist = [
482
+ (self.res, target),
483
+ ('protocol', protocol),
484
+ ]
485
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
486
+ result = self.cmd.take_action(parsed_args)
487
+
488
+ self.mocked.assert_called_once_with(target, **{'protocol': protocol})
489
+ self.assertIsNone(result)
490
+
491
+ def test_set_source_ip_address(self):
492
+ target = self.resource['id']
493
+ src_ip = '192.192.192.192'
494
+ arglist = [target, '--source-ip-address', src_ip]
495
+ verifylist = [
496
+ (self.res, target),
497
+ ('source_ip_address', src_ip),
498
+ ]
499
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
500
+ result = self.cmd.take_action(parsed_args)
501
+
502
+ self.mocked.assert_called_once_with(
503
+ target, **{'source_ip_address': src_ip}
504
+ )
505
+ self.assertIsNone(result)
506
+
507
+ def test_set_source_port(self):
508
+ target = self.resource['id']
509
+ src_port = '32678'
510
+ arglist = [target, '--source-port', src_port]
511
+ verifylist = [
512
+ (self.res, target),
513
+ ('source_port', src_port),
514
+ ]
515
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
516
+ result = self.cmd.take_action(parsed_args)
517
+
518
+ self.mocked.assert_called_once_with(
519
+ target, **{'source_port': src_port}
520
+ )
521
+ self.assertIsNone(result)
522
+
523
+ def test_set_destination_ip_address(self):
524
+ target = self.resource['id']
525
+ dst_ip = '0.1.0.1'
526
+ arglist = [target, '--destination-ip-address', dst_ip]
527
+ verifylist = [
528
+ (self.res, target),
529
+ ('destination_ip_address', dst_ip),
530
+ ]
531
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
532
+ result = self.cmd.take_action(parsed_args)
533
+
534
+ self.mocked.assert_called_once_with(
535
+ target, **{'destination_ip_address': dst_ip}
536
+ )
537
+ self.assertIsNone(result)
538
+
539
+ def test_set_destination_port(self):
540
+ target = self.resource['id']
541
+ dst_port = '65432'
542
+ arglist = [target, '--destination-port', dst_port]
543
+ verifylist = [
544
+ (self.res, target),
545
+ ('destination_port', dst_port),
546
+ ]
547
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
548
+ result = self.cmd.take_action(parsed_args)
549
+
550
+ self.mocked.assert_called_once_with(
551
+ target, **{'destination_port': dst_port}
552
+ )
553
+ self.assertIsNone(result)
554
+
555
+ def test_set_enable_rule(self):
556
+ target = self.resource['id']
557
+ arglist = [target, '--enable-rule']
558
+ verifylist = [
559
+ (self.res, target),
560
+ ('enabled', True),
561
+ ]
562
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
563
+ result = self.cmd.take_action(parsed_args)
564
+
565
+ self.mocked.assert_called_once_with(target, **{'enabled': True})
566
+ self.assertIsNone(result)
567
+
568
+ def test_set_disable_rule(self):
569
+ target = self.resource['id']
570
+ arglist = [target, '--disable-rule']
571
+ verifylist = [
572
+ (self.res, target),
573
+ ('enabled', False),
574
+ ]
575
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
576
+ result = self.cmd.take_action(parsed_args)
577
+
578
+ self.mocked.assert_called_once_with(target, **{'enabled': False})
579
+ self.assertIsNone(result)
580
+
581
+ def test_set_action(self):
582
+ target = self.resource['id']
583
+ action = 'reject'
584
+ arglist = [target, '--action', action]
585
+ verifylist = [
586
+ (self.res, target),
587
+ ('action', action),
588
+ ]
589
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
590
+ result = self.cmd.take_action(parsed_args)
591
+
592
+ self.mocked.assert_called_once_with(target, **{'action': action})
593
+ self.assertIsNone(result)
594
+
595
+ def test_set_enable_rule_and_disable_rule(self):
596
+ target = self.resource['id']
597
+ arglist = [target, '--enable-rule', '--disable-rule']
598
+ verifylist = [
599
+ (self.res, target),
600
+ ('enabled', True),
601
+ ]
602
+ self.assertRaises(
603
+ test_utils.ParserException,
604
+ self.check_parser,
605
+ self.cmd,
606
+ arglist,
607
+ verifylist,
608
+ )
609
+
610
+ def test_set_no_source_ip_address(self):
611
+ target = self.resource['id']
612
+ arglist = [
613
+ target,
614
+ '--no-source-ip-address',
615
+ ]
616
+ verifylist = [
617
+ (self.res, target),
618
+ ('no_source_ip_address', True),
619
+ ]
620
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
621
+ result = self.cmd.take_action(parsed_args)
622
+
623
+ self.mocked.assert_called_once_with(
624
+ target, **{'source_ip_address': None}
625
+ )
626
+ self.assertIsNone(result)
627
+
628
+ def test_set_no_source_port(self):
629
+ target = self.resource['id']
630
+ arglist = [
631
+ target,
632
+ '--no-source-port',
633
+ ]
634
+ verifylist = [
635
+ (self.res, target),
636
+ ('no_source_port', True),
637
+ ]
638
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
639
+ result = self.cmd.take_action(parsed_args)
640
+
641
+ self.mocked.assert_called_once_with(target, **{'source_port': None})
642
+ self.assertIsNone(result)
643
+
644
+ def test_set_no_destination_ip_address(self):
645
+ target = self.resource['id']
646
+ arglist = [
647
+ target,
648
+ '--no-destination-ip-address',
649
+ ]
650
+ verifylist = [
651
+ (self.res, target),
652
+ ('no_destination_ip_address', True),
653
+ ]
654
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
655
+ result = self.cmd.take_action(parsed_args)
656
+
657
+ self.mocked.assert_called_once_with(
658
+ target, **{'destination_ip_address': None}
659
+ )
660
+ self.assertIsNone(result)
661
+
662
+ def test_set_no_destination_port(self):
663
+ target = self.resource['id']
664
+ arglist = [
665
+ target,
666
+ '--no-destination-port',
667
+ ]
668
+ verifylist = [
669
+ (self.res, target),
670
+ ('no_destination_port', True),
671
+ ]
672
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
673
+ result = self.cmd.take_action(parsed_args)
674
+
675
+ self.mocked.assert_called_once_with(
676
+ target, **{'destination_port': None}
677
+ )
678
+ self.assertIsNone(result)
679
+
680
+ def test_set_source_ip_address_and_no(self):
681
+ target = self.resource['id']
682
+ arglist = [
683
+ target,
684
+ '--source-ip-address',
685
+ '192.168.1.0/24',
686
+ '--no-source-ip-address',
687
+ ]
688
+ verifylist = [
689
+ (self.res, target),
690
+ ('source_ip_address', '192.168.1.0/24'),
691
+ ('no_source_ip_address', 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_destination_ip_address_and_no(self):
702
+ target = self.resource['id']
703
+ arglist = [
704
+ target,
705
+ '--destination-ip-address',
706
+ '192.168.2.0/24',
707
+ '--no-destination-ip-address',
708
+ ]
709
+ verifylist = [
710
+ (self.res, target),
711
+ ('destination_ip_address', '192.168.2.0/24'),
712
+ ('no_destination_ip_address', True),
713
+ ]
714
+ self.assertRaises(
715
+ test_utils.ParserException,
716
+ self.check_parser,
717
+ self.cmd,
718
+ arglist,
719
+ verifylist,
720
+ )
721
+
722
+ def test_set_source_port_and_no(self):
723
+ target = self.resource['id']
724
+ arglist = [
725
+ target,
726
+ '--source-port',
727
+ '1:12345',
728
+ '--no-source-port',
729
+ ]
730
+ verifylist = [
731
+ (self.res, target),
732
+ ('source_port', '1:12345'),
733
+ ('no_source_port', True),
734
+ ]
735
+ self.assertRaises(
736
+ test_utils.ParserException,
737
+ self.check_parser,
738
+ self.cmd,
739
+ arglist,
740
+ verifylist,
741
+ )
742
+
743
+ def test_set_destination_port_and_no(self):
744
+ target = self.resource['id']
745
+ arglist = [
746
+ target,
747
+ '--destination-port',
748
+ '1:54321',
749
+ '--no-destination-port',
750
+ ]
751
+ verifylist = [
752
+ (self.res, target),
753
+ ('destination_port', '1:54321'),
754
+ ('no_destination_port', True),
755
+ ]
756
+ self.assertRaises(
757
+ test_utils.ParserException,
758
+ self.check_parser,
759
+ self.cmd,
760
+ arglist,
761
+ verifylist,
762
+ )
763
+
764
+ def test_set_and_raises(self):
765
+ self.network_client.update_firewall_rule.side_effect = Exception
766
+ target = self.resource['id']
767
+ arglist = [target, '--name', 'my-name']
768
+ verifylist = [(self.res, target), ('name', 'my-name')]
769
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
770
+
771
+ self.assertRaises(
772
+ exceptions.CommandError, self.cmd.take_action, parsed_args
773
+ )
774
+
775
+
776
+ class TestUnsetFirewallRule(TestFirewallRule):
777
+ def setUp(self):
778
+ super().setUp()
779
+ self.mocked = self.network_client.update_firewall_rule
780
+
781
+ def _mock_find_rule(*args, **kwargs):
782
+ return sdk_fakes.generate_fake_resource(
783
+ firewall_rule.FirewallRule, id=args[0]
784
+ )
785
+
786
+ self.network_client.find_firewall_rule.side_effect = _mock_find_rule
787
+
788
+ self.cmd = fwaas_rule.UnsetFirewallRule(self.app, None)
789
+
790
+ def test_unset_shared(self):
791
+ target = self.resource['id']
792
+ arglist = [
793
+ target,
794
+ '--share',
795
+ ]
796
+ verifylist = [
797
+ (self.res, target),
798
+ ('share', True),
799
+ ]
800
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
801
+ with mock.patch.object(fwaas_rule.LOG, 'warning') as mock_warning:
802
+ result = self.cmd.take_action(parsed_args)
803
+ mock_warning.assert_called_once_with(
804
+ 'The --share option is deprecated, please use '
805
+ '"firewall rule set --no-share" instead.'
806
+ )
807
+ self.mocked.assert_called_once_with(target, **{'shared': False})
808
+ self.assertIsNone(result)
809
+
810
+ def test_unset_protocol_and_raise(self):
811
+ self.network_client.update_firewall_rule.side_effect = Exception
812
+ target = self.resource['id']
813
+ arglist = [
814
+ target,
815
+ '--protocol',
816
+ ]
817
+ verifylist = [(self.res, target), ('protocol', False)]
818
+ self.assertRaises(
819
+ test_utils.ParserException,
820
+ self.check_parser,
821
+ self.cmd,
822
+ arglist,
823
+ verifylist,
824
+ )
825
+
826
+ def test_unset_source_port(self):
827
+ target = self.resource['id']
828
+ arglist = [
829
+ target,
830
+ '--source-port',
831
+ ]
832
+ verifylist = [
833
+ (self.res, target),
834
+ ('source_port', True),
835
+ ]
836
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
837
+ result = self.cmd.take_action(parsed_args)
838
+
839
+ self.mocked.assert_called_once_with(target, **{'source_port': None})
840
+ self.assertIsNone(result)
841
+
842
+ def test_unset_destination_port(self):
843
+ target = self.resource['id']
844
+ arglist = [
845
+ target,
846
+ '--destination-port',
847
+ ]
848
+ verifylist = [
849
+ (self.res, target),
850
+ ('destination_port', True),
851
+ ]
852
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
853
+ result = self.cmd.take_action(parsed_args)
854
+
855
+ self.mocked.assert_called_once_with(
856
+ target, **{'destination_port': None}
857
+ )
858
+ self.assertIsNone(result)
859
+
860
+ def test_unset_source_ip_address(self):
861
+ target = self.resource['id']
862
+ arglist = [
863
+ target,
864
+ '--source-ip-address',
865
+ ]
866
+ verifylist = [
867
+ (self.res, target),
868
+ ('source_ip_address', True),
869
+ ]
870
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
871
+ result = self.cmd.take_action(parsed_args)
872
+
873
+ self.mocked.assert_called_once_with(
874
+ target, **{'source_ip_address': None}
875
+ )
876
+ self.assertIsNone(result)
877
+
878
+ def test_unset_destination_ip_address(self):
879
+ target = self.resource['id']
880
+ arglist = [
881
+ target,
882
+ '--destination-ip-address',
883
+ ]
884
+ verifylist = [
885
+ (self.res, target),
886
+ ('destination_ip_address', True),
887
+ ]
888
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
889
+ result = self.cmd.take_action(parsed_args)
890
+
891
+ self.mocked.assert_called_once_with(
892
+ target, **{'destination_ip_address': None}
893
+ )
894
+ self.assertIsNone(result)
895
+
896
+ def test_unset_enable_rule(self):
897
+ target = self.resource['id']
898
+ arglist = [
899
+ target,
900
+ '--enable-rule',
901
+ ]
902
+ verifylist = [
903
+ (self.res, target),
904
+ ('enable_rule', True),
905
+ ]
906
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
907
+ with mock.patch.object(fwaas_rule.LOG, 'warning') as mock_warning:
908
+ result = self.cmd.take_action(parsed_args)
909
+ mock_warning.assert_called_once_with(
910
+ 'The --enable-rule option is deprecated, please use '
911
+ '"firewall rule set --disable-rule" instead.'
912
+ )
913
+ self.mocked.assert_called_once_with(target, **{'enabled': False})
914
+ self.assertIsNone(result)
915
+
916
+
917
+ class TestDeleteFirewallRule(TestFirewallRule):
918
+ def setUp(self):
919
+ super().setUp()
920
+ self.mocked = self.network_client.delete_firewall_rule
921
+ self.cmd = fwaas_rule.DeleteFirewallRule(self.app, None)
922
+
923
+ def test_delete_with_one_resource(self):
924
+ target = self.resource['id']
925
+
926
+ def _mock_fwaas(*args, **kwargs):
927
+ return sdk_fakes.generate_fake_resource(
928
+ firewall_rule.FirewallRule, id=args[0]
929
+ )
930
+
931
+ self.network_client.find_firewall_rule.side_effect = _mock_fwaas
932
+
933
+ arglist = [target]
934
+ verifylist = [(self.res, [target])]
935
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
936
+ result = self.cmd.take_action(parsed_args)
937
+
938
+ self.mocked.assert_called_once_with(target)
939
+ self.assertIsNone(result)
940
+
941
+ def test_delete_with_multiple_resources(self):
942
+
943
+ def _mock_fwaas(*args, **kwargs):
944
+ return sdk_fakes.generate_fake_resource(
945
+ firewall_rule.FirewallRule, id=args[0]
946
+ )
947
+
948
+ self.network_client.find_firewall_rule.side_effect = _mock_fwaas
949
+
950
+ target1 = 'target1'
951
+ target2 = 'target2'
952
+ arglist = [target1, target2]
953
+ verifylist = [(self.res, [target1, target2])]
954
+
955
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
956
+ result = self.cmd.take_action(parsed_args)
957
+ self.assertIsNone(result)
958
+
959
+ self.assertEqual(2, self.mocked.call_count)
960
+ for idx, reference in enumerate([target1, target2]):
961
+ actual = ''.join(self.mocked.call_args_list[idx][0][0])
962
+ self.assertEqual(reference, actual)
963
+
964
+ def test_delete_multiple_with_exception(self):
965
+ target1 = 'target1'
966
+ target2 = 'target2'
967
+ arglist = [target1, target2]
968
+ verifylist = [(self.res, [target1, target2])]
969
+
970
+ def _mock_find(*args, **kwargs):
971
+ if args[0] == target2:
972
+ raise Exception('Not found')
973
+ return self.resource
974
+
975
+ self.network_client.find_firewall_rule.side_effect = _mock_find
976
+
977
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
978
+ self.assertRaises(
979
+ exceptions.CommandError, self.cmd.take_action, parsed_args
980
+ )