python-openstackclient 9.0.0__py3-none-any.whl → 10.1.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 (352) 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 +59 -43
  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 +36 -34
  14. openstackclient/common/pagination.py +50 -6
  15. openstackclient/common/progressbar.py +7 -6
  16. openstackclient/common/project_cleanup.py +11 -6
  17. openstackclient/common/quota.py +105 -103
  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 +42 -22
  25. openstackclient/compute/v2/host.py +14 -6
  26. openstackclient/compute/v2/hypervisor.py +16 -5
  27. openstackclient/compute/v2/hypervisor_stats.py +10 -2
  28. openstackclient/compute/v2/keypair.py +35 -16
  29. openstackclient/compute/v2/server.py +268 -179
  30. openstackclient/compute/v2/server_backup.py +10 -4
  31. openstackclient/compute/v2/server_event.py +28 -12
  32. openstackclient/compute/v2/server_group.py +23 -11
  33. openstackclient/compute/v2/server_image.py +19 -10
  34. openstackclient/compute/v2/server_migration.py +27 -10
  35. openstackclient/compute/v2/server_share.py +274 -0
  36. openstackclient/compute/v2/server_volume.py +13 -5
  37. openstackclient/compute/v2/service.py +17 -8
  38. openstackclient/compute/v2/usage.py +28 -23
  39. openstackclient/identity/client.py +8 -3
  40. openstackclient/identity/common.py +82 -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 +32 -12
  51. openstackclient/identity/v3/application_credential.py +66 -24
  52. openstackclient/identity/v3/catalog.py +14 -7
  53. openstackclient/identity/v3/consumer.py +22 -11
  54. openstackclient/identity/v3/credential.py +39 -17
  55. openstackclient/identity/v3/domain.py +40 -19
  56. openstackclient/identity/v3/ec2creds.py +25 -12
  57. openstackclient/identity/v3/endpoint.py +98 -64
  58. openstackclient/identity/v3/endpoint_group.py +28 -17
  59. openstackclient/identity/v3/federation_protocol.py +44 -20
  60. openstackclient/identity/v3/group.py +64 -40
  61. openstackclient/identity/v3/identity_provider.py +95 -57
  62. openstackclient/identity/v3/implied_role.py +21 -9
  63. openstackclient/identity/v3/limit.py +42 -17
  64. openstackclient/identity/v3/mapping.py +58 -28
  65. openstackclient/identity/v3/policy.py +23 -12
  66. openstackclient/identity/v3/project.py +59 -26
  67. openstackclient/identity/v3/region.py +39 -17
  68. openstackclient/identity/v3/registered_limit.py +41 -16
  69. openstackclient/identity/v3/role.py +62 -31
  70. openstackclient/identity/v3/role_assignment.py +25 -7
  71. openstackclient/identity/v3/service.py +39 -17
  72. openstackclient/identity/v3/service_provider.py +40 -16
  73. openstackclient/identity/v3/tag.py +23 -6
  74. openstackclient/identity/v3/token.py +30 -14
  75. openstackclient/identity/v3/trust.py +39 -18
  76. openstackclient/identity/v3/unscoped_saml.py +10 -2
  77. openstackclient/identity/v3/user.py +86 -36
  78. openstackclient/image/client.py +7 -3
  79. openstackclient/image/v1/image.py +33 -26
  80. openstackclient/image/v2/cache.py +16 -11
  81. openstackclient/image/v2/image.py +88 -56
  82. openstackclient/image/v2/info.py +7 -1
  83. openstackclient/image/v2/metadef_namespaces.py +117 -20
  84. openstackclient/image/v2/metadef_objects.py +32 -19
  85. openstackclient/image/v2/metadef_properties.py +30 -16
  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 +25 -27
  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 +27 -54
  93. openstackclient/network/v2/address_group.py +39 -16
  94. openstackclient/network/v2/address_scope.py +36 -20
  95. openstackclient/network/v2/bgpvpn/bgpvpn.py +477 -0
  96. openstackclient/network/v2/bgpvpn/constants.py +30 -0
  97. openstackclient/network/v2/bgpvpn/network_association.py +226 -0
  98. openstackclient/network/v2/bgpvpn/port_association.py +504 -0
  99. openstackclient/network/v2/bgpvpn/router_association.py +301 -0
  100. openstackclient/network/v2/default_security_group_rule.py +31 -14
  101. openstackclient/network/v2/floating_ip.py +121 -162
  102. openstackclient/network/v2/floating_ip_port_forwarding.py +41 -19
  103. openstackclient/network/v2/fwaas/__init__.py +0 -0
  104. openstackclient/network/v2/fwaas/group.py +499 -0
  105. openstackclient/network/v2/fwaas/policy.py +518 -0
  106. openstackclient/network/v2/fwaas/rule.py +610 -0
  107. openstackclient/network/v2/ip_availability.py +25 -8
  108. openstackclient/network/v2/l3_conntrack_helper.py +35 -13
  109. openstackclient/network/v2/local_ip.py +27 -13
  110. openstackclient/network/v2/local_ip_association.py +17 -7
  111. openstackclient/network/v2/ndp_proxy.py +23 -11
  112. openstackclient/network/v2/network.py +213 -213
  113. openstackclient/network/v2/network_agent.py +77 -34
  114. openstackclient/network/v2/network_auto_allocated_topology.py +27 -15
  115. openstackclient/network/v2/network_flavor.py +45 -21
  116. openstackclient/network/v2/network_flavor_profile.py +42 -17
  117. openstackclient/network/v2/network_meter.py +39 -15
  118. openstackclient/network/v2/network_meter_rule.py +40 -12
  119. openstackclient/network/v2/network_qos_policy.py +39 -21
  120. openstackclient/network/v2/network_qos_rule.py +48 -18
  121. openstackclient/network/v2/network_qos_rule_type.py +28 -9
  122. openstackclient/network/v2/network_rbac.py +34 -16
  123. openstackclient/network/v2/network_segment.py +32 -11
  124. openstackclient/network/v2/network_segment_range.py +70 -31
  125. openstackclient/network/v2/network_service_provider.py +7 -1
  126. openstackclient/network/v2/network_trunk.py +41 -22
  127. openstackclient/network/v2/port.py +141 -40
  128. openstackclient/network/v2/router.py +101 -67
  129. openstackclient/network/v2/security_group.py +97 -198
  130. openstackclient/network/v2/security_group_rule.py +115 -282
  131. openstackclient/network/v2/subnet.py +63 -34
  132. openstackclient/network/v2/subnet_pool.py +42 -24
  133. openstackclient/network/v2/taas/tap_flow.py +35 -14
  134. openstackclient/network/v2/taas/tap_mirror.py +28 -14
  135. openstackclient/network/v2/taas/tap_service.py +26 -12
  136. openstackclient/object/client.py +7 -2
  137. openstackclient/object/v1/account.py +13 -6
  138. openstackclient/object/v1/container.py +28 -16
  139. openstackclient/object/v1/object.py +28 -16
  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 +59 -19
  151. openstackclient/tests/functional/identity/v3/test_application_credential.py +1 -1
  152. openstackclient/tests/functional/identity/v3/test_group.py +20 -20
  153. openstackclient/tests/functional/identity/v3/test_idp.py +3 -1
  154. openstackclient/tests/functional/identity/v3/test_mapping.py +81 -0
  155. openstackclient/tests/functional/identity/v3/test_project.py +10 -10
  156. openstackclient/tests/functional/identity/v3/test_role.py +18 -18
  157. openstackclient/tests/functional/identity/v3/test_role_assignment.py +12 -12
  158. openstackclient/tests/functional/identity/v3/test_user.py +8 -8
  159. openstackclient/tests/functional/image/base.py +1 -6
  160. openstackclient/tests/functional/network/v2/common.py +5 -2
  161. openstackclient/tests/functional/network/v2/test_floating_ip.py +10 -4
  162. openstackclient/tests/functional/network/v2/test_ip_availability.py +4 -0
  163. openstackclient/tests/functional/network/v2/test_network_meter_rule.py +3 -2
  164. openstackclient/tests/functional/network/v2/test_network_segment.py +5 -0
  165. openstackclient/tests/functional/network/v2/test_subnet.py +13 -9
  166. openstackclient/tests/functional/object/v1/common.py +4 -0
  167. openstackclient/tests/functional/volume/v2/common.py +4 -0
  168. openstackclient/tests/functional/volume/v2/test_volume_snapshot.py +27 -11
  169. openstackclient/tests/functional/volume/v2/test_volume_type.py +2 -2
  170. openstackclient/tests/functional/volume/v3/common.py +4 -0
  171. openstackclient/tests/functional/volume/v3/test_volume_group.py +163 -0
  172. openstackclient/tests/functional/volume/v3/test_volume_snapshot.py +11 -7
  173. openstackclient/tests/functional/volume/v3/test_volume_type.py +2 -2
  174. openstackclient/tests/unit/common/test_availability_zone.py +35 -49
  175. openstackclient/tests/unit/common/test_extension.py +2 -2
  176. openstackclient/tests/unit/common/test_limits.py +1 -1
  177. openstackclient/tests/unit/common/test_module.py +82 -44
  178. openstackclient/tests/unit/common/test_project_cleanup.py +3 -1
  179. openstackclient/tests/unit/common/test_quota.py +15 -26
  180. openstackclient/tests/unit/compute/v2/fakes.py +26 -57
  181. openstackclient/tests/unit/compute/v2/test_agent.py +4 -4
  182. openstackclient/tests/unit/compute/v2/test_aggregate.py +1 -1
  183. openstackclient/tests/unit/compute/v2/test_console.py +2 -2
  184. openstackclient/tests/unit/compute/v2/test_console_connection.py +1 -1
  185. openstackclient/tests/unit/compute/v2/test_flavor.py +29 -3
  186. openstackclient/tests/unit/compute/v2/test_host.py +3 -3
  187. openstackclient/tests/unit/compute/v2/test_hypervisor.py +2 -2
  188. openstackclient/tests/unit/compute/v2/test_hypervisor_stats.py +1 -1
  189. openstackclient/tests/unit/compute/v2/test_keypair.py +7 -7
  190. openstackclient/tests/unit/compute/v2/test_server.py +26 -111
  191. openstackclient/tests/unit/compute/v2/test_server_backup.py +1 -1
  192. openstackclient/tests/unit/compute/v2/test_server_event.py +2 -2
  193. openstackclient/tests/unit/compute/v2/test_server_group.py +1 -1
  194. openstackclient/tests/unit/compute/v2/test_server_image.py +1 -1
  195. openstackclient/tests/unit/compute/v2/test_server_migration.py +4 -4
  196. openstackclient/tests/unit/compute/v2/test_server_share.py +287 -0
  197. openstackclient/tests/unit/compute/v2/test_server_volume.py +2 -2
  198. openstackclient/tests/unit/compute/v2/test_service.py +3 -3
  199. openstackclient/tests/unit/compute/v2/test_usage.py +1 -1
  200. openstackclient/tests/unit/identity/v2_0/fakes.py +3 -7
  201. openstackclient/tests/unit/identity/v2_0/test_endpoint.py +1 -1
  202. openstackclient/tests/unit/identity/v2_0/test_project.py +1 -1
  203. openstackclient/tests/unit/identity/v2_0/test_role.py +1 -1
  204. openstackclient/tests/unit/identity/v2_0/test_role_assignment.py +1 -1
  205. openstackclient/tests/unit/identity/v2_0/test_service.py +1 -1
  206. openstackclient/tests/unit/identity/v2_0/test_token.py +2 -2
  207. openstackclient/tests/unit/identity/v2_0/test_user.py +1 -1
  208. openstackclient/tests/unit/identity/v3/fakes.py +8 -38
  209. openstackclient/tests/unit/identity/v3/test_access_rule.py +3 -3
  210. openstackclient/tests/unit/identity/v3/test_application_credential.py +4 -4
  211. openstackclient/tests/unit/identity/v3/test_credential.py +5 -5
  212. openstackclient/tests/unit/identity/v3/test_domain.py +5 -5
  213. openstackclient/tests/unit/identity/v3/test_endpoint.py +6 -6
  214. openstackclient/tests/unit/identity/v3/test_endpoint_group.py +1 -1
  215. openstackclient/tests/unit/identity/v3/test_group.py +12 -22
  216. openstackclient/tests/unit/identity/v3/test_identity_provider.py +303 -299
  217. openstackclient/tests/unit/identity/v3/test_implied_role.py +1 -1
  218. openstackclient/tests/unit/identity/v3/test_limit.py +5 -5
  219. openstackclient/tests/unit/identity/v3/test_mappings.py +163 -79
  220. openstackclient/tests/unit/identity/v3/test_project.py +28 -5
  221. openstackclient/tests/unit/identity/v3/test_protocol.py +3 -3
  222. openstackclient/tests/unit/identity/v3/test_region.py +5 -5
  223. openstackclient/tests/unit/identity/v3/test_registered_limit.py +5 -5
  224. openstackclient/tests/unit/identity/v3/test_role.py +8 -8
  225. openstackclient/tests/unit/identity/v3/test_role_assignment.py +1 -1
  226. openstackclient/tests/unit/identity/v3/test_service.py +5 -5
  227. openstackclient/tests/unit/identity/v3/test_token.py +2 -2
  228. openstackclient/tests/unit/identity/v3/test_trust.py +4 -4
  229. openstackclient/tests/unit/identity/v3/test_user.py +77 -10
  230. openstackclient/tests/unit/image/v2/test_image.py +11 -11
  231. openstackclient/tests/unit/image/v2/test_metadef_namespaces.py +105 -6
  232. openstackclient/tests/unit/network/test_common.py +0 -155
  233. openstackclient/tests/unit/network/v2/bgpvpn/__init__.py +0 -0
  234. openstackclient/tests/unit/network/v2/bgpvpn/fakes.py +179 -0
  235. openstackclient/tests/unit/network/v2/bgpvpn/test_bgpvpn.py +584 -0
  236. openstackclient/tests/unit/network/v2/bgpvpn/test_network_association.py +285 -0
  237. openstackclient/tests/unit/network/v2/bgpvpn/test_port_association.py +384 -0
  238. openstackclient/tests/unit/network/v2/bgpvpn/test_router_association.py +297 -0
  239. openstackclient/tests/unit/network/v2/fakes.py +5 -77
  240. openstackclient/tests/unit/network/v2/fwaas/__init__.py +0 -0
  241. openstackclient/tests/unit/network/v2/fwaas/test_group.py +923 -0
  242. openstackclient/tests/unit/network/v2/fwaas/test_policy.py +869 -0
  243. openstackclient/tests/unit/network/v2/fwaas/test_rule.py +1005 -0
  244. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_flow.py → test_tap_flow.py} +18 -25
  245. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_mirror.py → test_tap_mirror.py} +19 -29
  246. openstackclient/tests/unit/network/v2/taas/{test_osc_tap_service.py → test_tap_service.py} +19 -29
  247. openstackclient/tests/unit/network/v2/test_address_group.py +26 -2
  248. openstackclient/tests/unit/network/v2/test_address_scope.py +24 -0
  249. openstackclient/tests/unit/network/v2/{test_floating_ip_network.py → test_floating_ip.py} +27 -2
  250. openstackclient/tests/unit/network/v2/test_floating_ip_port_forwarding.py +37 -13
  251. openstackclient/tests/unit/network/v2/test_ip_availability.py +25 -0
  252. openstackclient/tests/unit/network/v2/test_l3_conntrack_helper.py +29 -3
  253. openstackclient/tests/unit/network/v2/test_network.py +74 -12
  254. openstackclient/tests/unit/network/v2/test_network_agent.py +58 -5
  255. openstackclient/tests/unit/network/v2/test_network_auto_allocated_topology.py +3 -3
  256. openstackclient/tests/unit/network/v2/test_network_flavor.py +26 -2
  257. openstackclient/tests/unit/network/v2/test_network_flavor_profile.py +24 -0
  258. openstackclient/tests/unit/network/v2/test_network_meter.py +24 -0
  259. openstackclient/tests/unit/network/v2/test_network_qos_policy.py +25 -1
  260. openstackclient/tests/unit/network/v2/test_network_qos_rule.py +2 -2
  261. openstackclient/tests/unit/network/v2/test_network_qos_rule_type.py +24 -0
  262. openstackclient/tests/unit/network/v2/test_network_rbac.py +25 -1
  263. openstackclient/tests/unit/network/v2/test_network_segment.py +25 -1
  264. openstackclient/tests/unit/network/v2/test_network_segment_range.py +31 -10
  265. openstackclient/tests/unit/network/v2/test_network_trunk.py +1 -1
  266. openstackclient/tests/unit/network/v2/test_port.py +166 -0
  267. openstackclient/tests/unit/network/v2/test_router.py +36 -16
  268. openstackclient/tests/unit/network/v2/{test_security_group_network.py → test_security_group.py} +11 -8
  269. openstackclient/tests/unit/network/v2/{test_security_group_rule_network.py → test_security_group_rule.py} +28 -37
  270. openstackclient/tests/unit/network/v2/test_subnet.py +30 -5
  271. openstackclient/tests/unit/network/v2/test_subnet_pool.py +26 -1
  272. openstackclient/tests/unit/object/v1/fakes.py +8 -7
  273. openstackclient/tests/unit/object/v1/test_container.py +65 -101
  274. openstackclient/tests/unit/object/v1/test_container_all.py +8 -1
  275. openstackclient/tests/unit/object/v1/test_object.py +44 -84
  276. openstackclient/tests/unit/object/v1/test_object_all.py +8 -1
  277. openstackclient/tests/unit/test_hacking.py +108 -0
  278. openstackclient/tests/unit/volume/v2/fakes.py +21 -140
  279. openstackclient/tests/unit/volume/v2/test_volume_backup.py +6 -14
  280. openstackclient/tests/unit/volume/v2/test_volume_snapshot.py +8 -1
  281. openstackclient/tests/unit/volume/v2/test_volume_type.py +2 -4
  282. openstackclient/tests/unit/volume/v3/fakes.py +205 -100
  283. openstackclient/tests/unit/volume/v3/test_backup_record.py +114 -0
  284. openstackclient/tests/unit/volume/v3/test_consistency_group.py +720 -0
  285. openstackclient/tests/unit/volume/v3/test_consistency_group_snapshot.py +354 -0
  286. openstackclient/tests/unit/volume/v3/test_qos_specs.py +455 -0
  287. openstackclient/tests/unit/volume/v3/test_volume.py +60 -3
  288. openstackclient/tests/unit/volume/v3/test_volume_attachment.py +3 -1
  289. openstackclient/tests/unit/volume/v3/test_volume_backend.py +158 -0
  290. openstackclient/tests/unit/volume/v3/test_volume_backup.py +6 -14
  291. openstackclient/tests/unit/volume/v3/test_volume_group_type.py +65 -0
  292. openstackclient/tests/unit/volume/v3/test_volume_host.py +115 -0
  293. openstackclient/tests/unit/volume/v3/test_volume_snapshot.py +61 -1
  294. openstackclient/tests/unit/volume/v3/test_volume_type.py +2 -4
  295. openstackclient/volume/client.py +7 -3
  296. openstackclient/volume/v2/backup_record.py +15 -6
  297. openstackclient/volume/v2/consistency_group.py +29 -17
  298. openstackclient/volume/v2/consistency_group_snapshot.py +25 -10
  299. openstackclient/volume/v2/qos_specs.py +28 -17
  300. openstackclient/volume/v2/service.py +17 -6
  301. openstackclient/volume/v2/volume.py +60 -30
  302. openstackclient/volume/v2/volume_backend.py +19 -6
  303. openstackclient/volume/v2/volume_backup.py +48 -23
  304. openstackclient/volume/v2/volume_host.py +6 -4
  305. openstackclient/volume/v2/volume_snapshot.py +49 -24
  306. openstackclient/volume/v2/volume_transfer_request.py +31 -13
  307. openstackclient/volume/v2/volume_type.py +43 -24
  308. openstackclient/volume/v3/backup_record.py +94 -0
  309. openstackclient/volume/v3/block_storage_cleanup.py +11 -3
  310. openstackclient/volume/v3/block_storage_cluster.py +19 -7
  311. openstackclient/volume/v3/block_storage_log_level.py +15 -6
  312. openstackclient/volume/v3/block_storage_manage.py +10 -4
  313. openstackclient/volume/v3/block_storage_resource_filter.py +17 -5
  314. openstackclient/volume/v3/consistency_group.py +400 -0
  315. openstackclient/volume/v3/consistency_group_snapshot.py +225 -0
  316. openstackclient/volume/v3/qos_specs.py +389 -0
  317. openstackclient/volume/v3/service.py +16 -6
  318. openstackclient/volume/v3/volume.py +92 -40
  319. openstackclient/volume/v3/volume_attachment.py +47 -21
  320. openstackclient/volume/v3/volume_backend.py +130 -0
  321. openstackclient/volume/v3/volume_backup.py +55 -27
  322. openstackclient/volume/v3/volume_group.py +23 -13
  323. openstackclient/volume/v3/volume_group_snapshot.py +34 -17
  324. openstackclient/volume/v3/volume_group_type.py +27 -14
  325. openstackclient/volume/v3/volume_host.py +74 -0
  326. openstackclient/volume/v3/volume_message.py +18 -8
  327. openstackclient/volume/v3/volume_snapshot.py +70 -32
  328. openstackclient/volume/v3/volume_transfer_request.py +31 -13
  329. openstackclient/volume/v3/volume_type.py +42 -24
  330. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/METADATA +7 -8
  331. python_openstackclient-10.1.0.dist-info/RECORD +524 -0
  332. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/WHEEL +1 -1
  333. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/entry_points.txt +77 -25
  334. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/licenses/AUTHORS +9 -0
  335. python_openstackclient-10.1.0.dist-info/pbr.json +1 -0
  336. openstackclient/api/image_v1.py +0 -69
  337. openstackclient/api/image_v2.py +0 -79
  338. openstackclient/network/v2/floating_ip_pool.py +0 -38
  339. openstackclient/tests/functional/image/v1/test_image.py +0 -97
  340. openstackclient/tests/unit/api/test_image_v1.py +0 -96
  341. openstackclient/tests/unit/api/test_image_v2.py +0 -96
  342. openstackclient/tests/unit/network/v2/test_floating_ip_compute.py +0 -248
  343. openstackclient/tests/unit/network/v2/test_floating_ip_pool_compute.py +0 -49
  344. openstackclient/tests/unit/network/v2/test_floating_ip_pool_network.py +0 -39
  345. openstackclient/tests/unit/network/v2/test_network_compute.py +0 -404
  346. openstackclient/tests/unit/network/v2/test_security_group_compute.py +0 -392
  347. openstackclient/tests/unit/network/v2/test_security_group_rule_compute.py +0 -555
  348. python_openstackclient-9.0.0.dist-info/RECORD +0 -499
  349. python_openstackclient-9.0.0.dist-info/pbr.json +0 -1
  350. /openstackclient/{tests/functional/image/v1 → network/v2/bgpvpn}/__init__.py +0 -0
  351. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/licenses/LICENSE +0 -0
  352. {python_openstackclient-9.0.0.dist-info → python_openstackclient-10.1.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1005 @@
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
+ 'positional_name': 'name',
33
+ 'project': 'project_id',
34
+ }
35
+
36
+
37
+ def _generate_data(source=None, data=None):
38
+ if data:
39
+ source.update(data)
40
+ ret = tuple(_replace_display_columns(key, source[key]) for key in source)
41
+ return ret
42
+
43
+
44
+ def _replace_display_columns(key, val):
45
+ if key == 'protocol':
46
+ return fwaas_rule.ProtocolColumn(val)
47
+ return val
48
+
49
+
50
+ def _generate_req_and_res(verifylist, response):
51
+ request = dict(verifylist)
52
+ for key, val in verifylist:
53
+ converted = CONVERT_MAP.get(key, key)
54
+ del request[key]
55
+ if re.match('^no_', key) and val is True:
56
+ new_value = None
57
+ elif key == 'protocol' and val and val.lower() == 'any':
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
+ request[converted] = new_value
66
+ response[converted] = new_value
67
+ return request, response
68
+
69
+
70
+ class TestFirewallRule(network_fakes.TestNetworkV2):
71
+ def check_results(self, headers, data, exp_req=None, is_list=False):
72
+ if is_list:
73
+ req_body = {self.res_plural: [exp_req]}
74
+ else:
75
+ req_body = exp_req
76
+ if not exp_req:
77
+ self.mocked.assert_called_once_with()
78
+ else:
79
+ self.mocked.assert_called_once_with(**req_body)
80
+ self.assertEqual(self.ordered_headers, headers)
81
+
82
+ # TODO(slaweq): remove this method once network_fakes.TestNetworkV2 will
83
+ # inherit from the osc_lib.test.base.TestCommand
84
+ def assertListItemEqual(self, expected, actual):
85
+ self.assertEqual(len(expected), len(actual))
86
+ for item_expected, item_actual in zip(expected, actual):
87
+ self.assertItemEqual(item_expected, item_actual)
88
+
89
+ # TODO(slaweq): remove this method once network_fakes.TestNetworkV2 will
90
+ # inherit from the osc_lib.test.base.TestCommand
91
+ def assertItemEqual(self, expected, actual):
92
+ self.assertEqual(len(expected), len(actual))
93
+ for col_expected, col_actual in zip(expected, actual):
94
+ if isinstance(col_expected, cliff_columns.FormattableColumn):
95
+ self.assertIsInstance(col_actual, col_expected.__class__)
96
+ self.assertEqual(
97
+ col_expected.human_readable(), col_actual.human_readable()
98
+ )
99
+ else:
100
+ self.assertEqual(col_expected, col_actual)
101
+
102
+ def setUp(self):
103
+ super().setUp()
104
+
105
+ self.identity_client.projects.get.side_effect = lambda x: mock.Mock(
106
+ id=x
107
+ )
108
+ self.res = 'firewall_rule'
109
+ self.res_plural = 'firewall_rules'
110
+ self.resource = sdk_fakes.generate_fake_resource(
111
+ firewall_rule.FirewallRule
112
+ )
113
+ self.headers = (
114
+ 'ID',
115
+ 'Name',
116
+ 'Enabled',
117
+ 'Description',
118
+ 'Firewall Policy',
119
+ 'IP Version',
120
+ 'Action',
121
+ 'Protocol',
122
+ 'Source IP Address',
123
+ 'Source Port',
124
+ 'Destination IP Address',
125
+ 'Destination Port',
126
+ 'Shared',
127
+ 'Project',
128
+ 'Source Firewall Group ID',
129
+ 'Destination Firewall Group ID',
130
+ )
131
+ self.data = _generate_data(self.resource)
132
+ self.ordered_headers = (
133
+ 'Action',
134
+ 'Description',
135
+ 'Destination Firewall Group ID',
136
+ 'Destination IP Address',
137
+ 'Destination Port',
138
+ 'Enabled',
139
+ 'Firewall Policy',
140
+ 'ID',
141
+ 'IP Version',
142
+ 'Name',
143
+ 'Project',
144
+ 'Protocol',
145
+ 'Shared',
146
+ 'Source Firewall Group ID',
147
+ 'Source IP Address',
148
+ 'Source Port',
149
+ 'Summary',
150
+ )
151
+ self.ordered_data = (
152
+ self.resource['action'],
153
+ self.resource['description'],
154
+ self.resource['destination_ip_address'],
155
+ self.resource['destination_port'],
156
+ self.resource['firewall_policy_id'],
157
+ self.resource['enabled'],
158
+ self.resource['id'],
159
+ self.resource['ip_version'],
160
+ self.resource['name'],
161
+ self.resource['project_id'],
162
+ _replace_display_columns('protocol', self.resource['protocol']),
163
+ self.resource['shared'],
164
+ self.resource['source_ip_address'],
165
+ self.resource['source_port'],
166
+ )
167
+ self.ordered_columns = (
168
+ 'action',
169
+ 'description',
170
+ 'destination_ip_address',
171
+ 'destination_port',
172
+ 'enabled',
173
+ 'id',
174
+ 'ip_version',
175
+ 'name',
176
+ 'project_id',
177
+ 'protocol',
178
+ 'shared',
179
+ 'source_ip_address',
180
+ 'source_port',
181
+ )
182
+
183
+
184
+ class TestCreateFirewallRule(TestFirewallRule):
185
+ def setUp(self):
186
+ super().setUp()
187
+ self.network_client.create_firewall_rule.return_value = self.resource
188
+ self.mocked = self.network_client.create_firewall_rule
189
+
190
+ def _mock_find_group(*args, **kwargs):
191
+ return self.resource
192
+
193
+ self.network_client.find_firewall_group.side_effect = _mock_find_group
194
+
195
+ self.cmd = fwaas_rule.CreateFirewallRule(self.app, None)
196
+
197
+ def _update_expect_response(self, request, response):
198
+ """Set expected request and response
199
+
200
+ :param request
201
+ A dictionary of request body(dict of verifylist)
202
+ :param response
203
+ A OrderedDict of request body
204
+ """
205
+ # Update response body
206
+ self.network_client.create_firewall_rule.return_value = response
207
+ # Update response(finally returns 'data')
208
+ self.data = _generate_data(source=response)
209
+ self.ordered_data = tuple(
210
+ _replace_display_columns(column, response[column])
211
+ for column in self.ordered_columns
212
+ )
213
+
214
+ def _set_all_params(self, args={}):
215
+ name = args.get('name') or 'my-name'
216
+ description = args.get('description') or 'my-desc'
217
+ source_ip = args.get('source_ip_address') or '192.168.1.0/24'
218
+ destination_ip = args.get('destination_ip_address') or '192.168.2.0/24'
219
+ source_port = args.get('source_port') or '0:65535'
220
+ protocol = args.get('protocol') or 'udp'
221
+ action = args.get('action') or 'deny'
222
+ ip_version = args.get('ip_version') or '4'
223
+ destination_port = args.get('destination_port') or '0:65535'
224
+ project_id = args.get('project_id') or 'my-tenant'
225
+ arglist = [
226
+ name,
227
+ '--description',
228
+ description,
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
+ ('positional_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
+ def test_create_with_name_option_deprecated(self):
324
+ name = 'my-name'
325
+ arglist = ['--name', name]
326
+ verifylist = [('name', name)]
327
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
328
+ with mock.patch.object(fwaas_rule.LOG, 'warning') as mock_warning:
329
+ _headers, _data = self.cmd.take_action(parsed_args)
330
+ mock_warning.assert_called_once_with(
331
+ 'The --name option is deprecated for the "firewall group '
332
+ 'rule create" command, please pass the name as a positional '
333
+ 'argument instead.'
334
+ )
335
+
336
+ def test_create_with_both_positional_and_option_name(self):
337
+ name = 'my-name'
338
+ arglist = [name, '--name', 'other-name']
339
+ verifylist = [
340
+ ('positional_name', name),
341
+ ('name', 'other-name'),
342
+ ]
343
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
344
+ self.assertRaises(
345
+ exceptions.CommandError, self.cmd.take_action, parsed_args
346
+ )
347
+
348
+
349
+ class TestListFirewallRule(TestFirewallRule):
350
+ def _setup_summary(self, expect=None):
351
+ protocol = (self.resource['protocol'] or 'any').upper()
352
+ src = 'source(port): 192.168.1.0/24(1:11111)'
353
+ dst = 'dest(port): 192.168.2.2(2:22222)'
354
+ action = 'deny'
355
+ if expect:
356
+ if expect.get('protocol'):
357
+ protocol = expect['protocol'].upper()
358
+ if expect.get('source_ip_address'):
359
+ src_ip = expect['source_ip_address']
360
+ if expect.get('source_port'):
361
+ src_port = expect['source_port']
362
+ if expect.get('destination_ip_address'):
363
+ dst_ip = expect['destination_ip_address']
364
+ if expect.get('destination_port'):
365
+ dst_port = expect['destination_port']
366
+ if expect.get('action'):
367
+ action = expect['action']
368
+ src = 'source(port): ' + src_ip + '(' + src_port + ')'
369
+ dst = 'dest(port): ' + dst_ip + '(' + dst_port + ')'
370
+ return ',\n '.join([protocol, src, dst, action])
371
+
372
+ def setUp(self):
373
+ super().setUp()
374
+ self.cmd = fwaas_rule.ListFirewallRule(self.app, None)
375
+
376
+ self.short_header = (
377
+ 'ID',
378
+ 'Name',
379
+ 'Enabled',
380
+ 'Summary',
381
+ 'Firewall Policy',
382
+ )
383
+
384
+ summary = self._setup_summary(self.resource)
385
+
386
+ self.short_data = (
387
+ self.resource['id'],
388
+ self.resource['name'],
389
+ self.resource['enabled'],
390
+ summary,
391
+ self.resource['firewall_policy_id'],
392
+ )
393
+ self.network_client.firewall_rules.return_value = [self.resource]
394
+ self.mocked = self.network_client.firewall_rules
395
+
396
+ def test_list_with_long_option(self):
397
+ arglist = ['--long']
398
+ verifylist = [('long', True)]
399
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
400
+ headers, _data = self.cmd.take_action(parsed_args)
401
+
402
+ self.mocked.assert_called_once_with()
403
+ self.assertEqual(list(self.headers), headers)
404
+
405
+ def test_list_with_no_option(self):
406
+ arglist = []
407
+ verifylist = []
408
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
409
+ headers, data = self.cmd.take_action(parsed_args)
410
+
411
+ self.mocked.assert_called_once_with()
412
+ self.assertEqual(list(self.short_header), headers)
413
+ self.assertListItemEqual([self.short_data], list(data))
414
+
415
+
416
+ class TestShowFirewallRule(TestFirewallRule):
417
+ def setUp(self):
418
+ super().setUp()
419
+ self.network_client.get_firewall_rule.return_value = self.resource
420
+ self.mocked = self.network_client.get_firewall_rule
421
+ self.cmd = fwaas_rule.ShowFirewallRule(self.app, None)
422
+
423
+ def test_show_filtered_by_id_or_name(self):
424
+ target = self.resource['id']
425
+
426
+ def _mock_fwaas(*args, **kwargs):
427
+ return sdk_fakes.generate_fake_resource(
428
+ firewall_rule.FirewallRule, id=args[0]
429
+ )
430
+
431
+ self.network_client.find_firewall_rule.side_effect = _mock_fwaas
432
+
433
+ arglist = [target]
434
+ verifylist = [(self.res, target)]
435
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
436
+ headers, _data = self.cmd.take_action(parsed_args)
437
+
438
+ self.mocked.assert_called_once_with(target)
439
+ self.assertEqual(self.ordered_headers, headers)
440
+
441
+
442
+ class TestSetFirewallRule(TestFirewallRule):
443
+ def setUp(self):
444
+ super().setUp()
445
+ self.network_client.update_firewall_rule.return_value = self.resource
446
+ self.mocked = self.network_client.update_firewall_rule
447
+
448
+ def _mock_find_rule(*args, **kwargs):
449
+ return sdk_fakes.generate_fake_resource(
450
+ firewall_rule.FirewallRule, id=args[0]
451
+ )
452
+
453
+ self.network_client.find_firewall_rule.side_effect = _mock_find_rule
454
+
455
+ self.cmd = fwaas_rule.SetFirewallRule(self.app, None)
456
+
457
+ def test_set_name(self):
458
+ target = self.resource['id']
459
+ update = 'change'
460
+ arglist = [target, '--name', update]
461
+ verifylist = [
462
+ (self.res, target),
463
+ ('name', update),
464
+ ]
465
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
466
+ result = self.cmd.take_action(parsed_args)
467
+
468
+ self.mocked.assert_called_once_with(target, **{'name': update})
469
+ self.assertIsNone(result)
470
+
471
+ def test_set_options(self):
472
+ target = self.resource['id']
473
+ updated_desc = 'change-desc'
474
+ arglist = [target, '--description', updated_desc, '--share']
475
+ verifylist = [
476
+ (self.res, target),
477
+ ('description', updated_desc),
478
+ ('shared', True),
479
+ ]
480
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
481
+ result = self.cmd.take_action(parsed_args)
482
+
483
+ self.mocked.assert_called_once_with(
484
+ target, shared=True, description=updated_desc
485
+ )
486
+ self.assertIsNone(result)
487
+
488
+ def test_set_protocol_with_any(self):
489
+ target = self.resource['id']
490
+ protocol = 'any'
491
+ arglist = [target, '--protocol', protocol]
492
+ verifylist = [
493
+ (self.res, target),
494
+ ('protocol', protocol),
495
+ ]
496
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
497
+ result = self.cmd.take_action(parsed_args)
498
+
499
+ self.mocked.assert_called_once_with(target, **{'protocol': None})
500
+ self.assertIsNone(result)
501
+
502
+ def test_set_protocol_with_udp(self):
503
+ target = self.resource['id']
504
+ protocol = 'udp'
505
+ arglist = [target, '--protocol', protocol]
506
+ verifylist = [
507
+ (self.res, target),
508
+ ('protocol', protocol),
509
+ ]
510
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
511
+ result = self.cmd.take_action(parsed_args)
512
+
513
+ self.mocked.assert_called_once_with(target, **{'protocol': protocol})
514
+ self.assertIsNone(result)
515
+
516
+ def test_set_source_ip_address(self):
517
+ target = self.resource['id']
518
+ src_ip = '192.192.192.192'
519
+ arglist = [target, '--source-ip-address', src_ip]
520
+ verifylist = [
521
+ (self.res, target),
522
+ ('source_ip_address', src_ip),
523
+ ]
524
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
525
+ result = self.cmd.take_action(parsed_args)
526
+
527
+ self.mocked.assert_called_once_with(
528
+ target, **{'source_ip_address': src_ip}
529
+ )
530
+ self.assertIsNone(result)
531
+
532
+ def test_set_source_port(self):
533
+ target = self.resource['id']
534
+ src_port = '32678'
535
+ arglist = [target, '--source-port', src_port]
536
+ verifylist = [
537
+ (self.res, target),
538
+ ('source_port', src_port),
539
+ ]
540
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
541
+ result = self.cmd.take_action(parsed_args)
542
+
543
+ self.mocked.assert_called_once_with(
544
+ target, **{'source_port': src_port}
545
+ )
546
+ self.assertIsNone(result)
547
+
548
+ def test_set_destination_ip_address(self):
549
+ target = self.resource['id']
550
+ dst_ip = '0.1.0.1'
551
+ arglist = [target, '--destination-ip-address', dst_ip]
552
+ verifylist = [
553
+ (self.res, target),
554
+ ('destination_ip_address', dst_ip),
555
+ ]
556
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
557
+ result = self.cmd.take_action(parsed_args)
558
+
559
+ self.mocked.assert_called_once_with(
560
+ target, **{'destination_ip_address': dst_ip}
561
+ )
562
+ self.assertIsNone(result)
563
+
564
+ def test_set_destination_port(self):
565
+ target = self.resource['id']
566
+ dst_port = '65432'
567
+ arglist = [target, '--destination-port', dst_port]
568
+ verifylist = [
569
+ (self.res, target),
570
+ ('destination_port', dst_port),
571
+ ]
572
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
573
+ result = self.cmd.take_action(parsed_args)
574
+
575
+ self.mocked.assert_called_once_with(
576
+ target, **{'destination_port': dst_port}
577
+ )
578
+ self.assertIsNone(result)
579
+
580
+ def test_set_enable_rule(self):
581
+ target = self.resource['id']
582
+ arglist = [target, '--enable-rule']
583
+ verifylist = [
584
+ (self.res, target),
585
+ ('enabled', True),
586
+ ]
587
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
588
+ result = self.cmd.take_action(parsed_args)
589
+
590
+ self.mocked.assert_called_once_with(target, **{'enabled': True})
591
+ self.assertIsNone(result)
592
+
593
+ def test_set_disable_rule(self):
594
+ target = self.resource['id']
595
+ arglist = [target, '--disable-rule']
596
+ verifylist = [
597
+ (self.res, target),
598
+ ('enabled', False),
599
+ ]
600
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
601
+ result = self.cmd.take_action(parsed_args)
602
+
603
+ self.mocked.assert_called_once_with(target, **{'enabled': False})
604
+ self.assertIsNone(result)
605
+
606
+ def test_set_action(self):
607
+ target = self.resource['id']
608
+ action = 'reject'
609
+ arglist = [target, '--action', action]
610
+ verifylist = [
611
+ (self.res, target),
612
+ ('action', action),
613
+ ]
614
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
615
+ result = self.cmd.take_action(parsed_args)
616
+
617
+ self.mocked.assert_called_once_with(target, **{'action': action})
618
+ self.assertIsNone(result)
619
+
620
+ def test_set_enable_rule_and_disable_rule(self):
621
+ target = self.resource['id']
622
+ arglist = [target, '--enable-rule', '--disable-rule']
623
+ verifylist = [
624
+ (self.res, target),
625
+ ('enabled', True),
626
+ ]
627
+ self.assertRaises(
628
+ test_utils.ParserException,
629
+ self.check_parser,
630
+ self.cmd,
631
+ arglist,
632
+ verifylist,
633
+ )
634
+
635
+ def test_set_no_source_ip_address(self):
636
+ target = self.resource['id']
637
+ arglist = [
638
+ target,
639
+ '--no-source-ip-address',
640
+ ]
641
+ verifylist = [
642
+ (self.res, target),
643
+ ('no_source_ip_address', True),
644
+ ]
645
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
646
+ result = self.cmd.take_action(parsed_args)
647
+
648
+ self.mocked.assert_called_once_with(
649
+ target, **{'source_ip_address': None}
650
+ )
651
+ self.assertIsNone(result)
652
+
653
+ def test_set_no_source_port(self):
654
+ target = self.resource['id']
655
+ arglist = [
656
+ target,
657
+ '--no-source-port',
658
+ ]
659
+ verifylist = [
660
+ (self.res, target),
661
+ ('no_source_port', True),
662
+ ]
663
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
664
+ result = self.cmd.take_action(parsed_args)
665
+
666
+ self.mocked.assert_called_once_with(target, **{'source_port': None})
667
+ self.assertIsNone(result)
668
+
669
+ def test_set_no_destination_ip_address(self):
670
+ target = self.resource['id']
671
+ arglist = [
672
+ target,
673
+ '--no-destination-ip-address',
674
+ ]
675
+ verifylist = [
676
+ (self.res, target),
677
+ ('no_destination_ip_address', True),
678
+ ]
679
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
680
+ result = self.cmd.take_action(parsed_args)
681
+
682
+ self.mocked.assert_called_once_with(
683
+ target, **{'destination_ip_address': None}
684
+ )
685
+ self.assertIsNone(result)
686
+
687
+ def test_set_no_destination_port(self):
688
+ target = self.resource['id']
689
+ arglist = [
690
+ target,
691
+ '--no-destination-port',
692
+ ]
693
+ verifylist = [
694
+ (self.res, target),
695
+ ('no_destination_port', True),
696
+ ]
697
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
698
+ result = self.cmd.take_action(parsed_args)
699
+
700
+ self.mocked.assert_called_once_with(
701
+ target, **{'destination_port': None}
702
+ )
703
+ self.assertIsNone(result)
704
+
705
+ def test_set_source_ip_address_and_no(self):
706
+ target = self.resource['id']
707
+ arglist = [
708
+ target,
709
+ '--source-ip-address',
710
+ '192.168.1.0/24',
711
+ '--no-source-ip-address',
712
+ ]
713
+ verifylist = [
714
+ (self.res, target),
715
+ ('source_ip_address', '192.168.1.0/24'),
716
+ ('no_source_ip_address', True),
717
+ ]
718
+ self.assertRaises(
719
+ test_utils.ParserException,
720
+ self.check_parser,
721
+ self.cmd,
722
+ arglist,
723
+ verifylist,
724
+ )
725
+
726
+ def test_set_destination_ip_address_and_no(self):
727
+ target = self.resource['id']
728
+ arglist = [
729
+ target,
730
+ '--destination-ip-address',
731
+ '192.168.2.0/24',
732
+ '--no-destination-ip-address',
733
+ ]
734
+ verifylist = [
735
+ (self.res, target),
736
+ ('destination_ip_address', '192.168.2.0/24'),
737
+ ('no_destination_ip_address', True),
738
+ ]
739
+ self.assertRaises(
740
+ test_utils.ParserException,
741
+ self.check_parser,
742
+ self.cmd,
743
+ arglist,
744
+ verifylist,
745
+ )
746
+
747
+ def test_set_source_port_and_no(self):
748
+ target = self.resource['id']
749
+ arglist = [
750
+ target,
751
+ '--source-port',
752
+ '1:12345',
753
+ '--no-source-port',
754
+ ]
755
+ verifylist = [
756
+ (self.res, target),
757
+ ('source_port', '1:12345'),
758
+ ('no_source_port', True),
759
+ ]
760
+ self.assertRaises(
761
+ test_utils.ParserException,
762
+ self.check_parser,
763
+ self.cmd,
764
+ arglist,
765
+ verifylist,
766
+ )
767
+
768
+ def test_set_destination_port_and_no(self):
769
+ target = self.resource['id']
770
+ arglist = [
771
+ target,
772
+ '--destination-port',
773
+ '1:54321',
774
+ '--no-destination-port',
775
+ ]
776
+ verifylist = [
777
+ (self.res, target),
778
+ ('destination_port', '1:54321'),
779
+ ('no_destination_port', True),
780
+ ]
781
+ self.assertRaises(
782
+ test_utils.ParserException,
783
+ self.check_parser,
784
+ self.cmd,
785
+ arglist,
786
+ verifylist,
787
+ )
788
+
789
+ def test_set_and_raises(self):
790
+ self.network_client.update_firewall_rule.side_effect = Exception
791
+ target = self.resource['id']
792
+ arglist = [target, '--name', 'my-name']
793
+ verifylist = [(self.res, target), ('name', 'my-name')]
794
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
795
+
796
+ self.assertRaises(
797
+ exceptions.CommandError, self.cmd.take_action, parsed_args
798
+ )
799
+
800
+
801
+ class TestUnsetFirewallRule(TestFirewallRule):
802
+ def setUp(self):
803
+ super().setUp()
804
+ self.mocked = self.network_client.update_firewall_rule
805
+
806
+ def _mock_find_rule(*args, **kwargs):
807
+ return sdk_fakes.generate_fake_resource(
808
+ firewall_rule.FirewallRule, id=args[0]
809
+ )
810
+
811
+ self.network_client.find_firewall_rule.side_effect = _mock_find_rule
812
+
813
+ self.cmd = fwaas_rule.UnsetFirewallRule(self.app, None)
814
+
815
+ def test_unset_shared(self):
816
+ target = self.resource['id']
817
+ arglist = [
818
+ target,
819
+ '--share',
820
+ ]
821
+ verifylist = [
822
+ (self.res, target),
823
+ ('share', True),
824
+ ]
825
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
826
+ with mock.patch.object(fwaas_rule.LOG, 'warning') as mock_warning:
827
+ result = self.cmd.take_action(parsed_args)
828
+ mock_warning.assert_called_once_with(
829
+ 'The --share option is deprecated, please use '
830
+ '"firewall rule set --no-share" instead.'
831
+ )
832
+ self.mocked.assert_called_once_with(target, **{'shared': False})
833
+ self.assertIsNone(result)
834
+
835
+ def test_unset_protocol_and_raise(self):
836
+ self.network_client.update_firewall_rule.side_effect = Exception
837
+ target = self.resource['id']
838
+ arglist = [
839
+ target,
840
+ '--protocol',
841
+ ]
842
+ verifylist = [(self.res, target), ('protocol', False)]
843
+ self.assertRaises(
844
+ test_utils.ParserException,
845
+ self.check_parser,
846
+ self.cmd,
847
+ arglist,
848
+ verifylist,
849
+ )
850
+
851
+ def test_unset_source_port(self):
852
+ target = self.resource['id']
853
+ arglist = [
854
+ target,
855
+ '--source-port',
856
+ ]
857
+ verifylist = [
858
+ (self.res, target),
859
+ ('source_port', True),
860
+ ]
861
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
862
+ result = self.cmd.take_action(parsed_args)
863
+
864
+ self.mocked.assert_called_once_with(target, **{'source_port': None})
865
+ self.assertIsNone(result)
866
+
867
+ def test_unset_destination_port(self):
868
+ target = self.resource['id']
869
+ arglist = [
870
+ target,
871
+ '--destination-port',
872
+ ]
873
+ verifylist = [
874
+ (self.res, target),
875
+ ('destination_port', True),
876
+ ]
877
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
878
+ result = self.cmd.take_action(parsed_args)
879
+
880
+ self.mocked.assert_called_once_with(
881
+ target, **{'destination_port': None}
882
+ )
883
+ self.assertIsNone(result)
884
+
885
+ def test_unset_source_ip_address(self):
886
+ target = self.resource['id']
887
+ arglist = [
888
+ target,
889
+ '--source-ip-address',
890
+ ]
891
+ verifylist = [
892
+ (self.res, target),
893
+ ('source_ip_address', True),
894
+ ]
895
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
896
+ result = self.cmd.take_action(parsed_args)
897
+
898
+ self.mocked.assert_called_once_with(
899
+ target, **{'source_ip_address': None}
900
+ )
901
+ self.assertIsNone(result)
902
+
903
+ def test_unset_destination_ip_address(self):
904
+ target = self.resource['id']
905
+ arglist = [
906
+ target,
907
+ '--destination-ip-address',
908
+ ]
909
+ verifylist = [
910
+ (self.res, target),
911
+ ('destination_ip_address', True),
912
+ ]
913
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
914
+ result = self.cmd.take_action(parsed_args)
915
+
916
+ self.mocked.assert_called_once_with(
917
+ target, **{'destination_ip_address': None}
918
+ )
919
+ self.assertIsNone(result)
920
+
921
+ def test_unset_enable_rule(self):
922
+ target = self.resource['id']
923
+ arglist = [
924
+ target,
925
+ '--enable-rule',
926
+ ]
927
+ verifylist = [
928
+ (self.res, target),
929
+ ('enable_rule', True),
930
+ ]
931
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
932
+ with mock.patch.object(fwaas_rule.LOG, 'warning') as mock_warning:
933
+ result = self.cmd.take_action(parsed_args)
934
+ mock_warning.assert_called_once_with(
935
+ 'The --enable-rule option is deprecated, please use '
936
+ '"firewall rule set --disable-rule" instead.'
937
+ )
938
+ self.mocked.assert_called_once_with(target, **{'enabled': False})
939
+ self.assertIsNone(result)
940
+
941
+
942
+ class TestDeleteFirewallRule(TestFirewallRule):
943
+ def setUp(self):
944
+ super().setUp()
945
+ self.mocked = self.network_client.delete_firewall_rule
946
+ self.cmd = fwaas_rule.DeleteFirewallRule(self.app, None)
947
+
948
+ def test_delete_with_one_resource(self):
949
+ target = self.resource['id']
950
+
951
+ def _mock_fwaas(*args, **kwargs):
952
+ return sdk_fakes.generate_fake_resource(
953
+ firewall_rule.FirewallRule, id=args[0]
954
+ )
955
+
956
+ self.network_client.find_firewall_rule.side_effect = _mock_fwaas
957
+
958
+ arglist = [target]
959
+ verifylist = [(self.res, [target])]
960
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
961
+ result = self.cmd.take_action(parsed_args)
962
+
963
+ self.mocked.assert_called_once_with(target)
964
+ self.assertIsNone(result)
965
+
966
+ def test_delete_with_multiple_resources(self):
967
+
968
+ def _mock_fwaas(*args, **kwargs):
969
+ return sdk_fakes.generate_fake_resource(
970
+ firewall_rule.FirewallRule, id=args[0]
971
+ )
972
+
973
+ self.network_client.find_firewall_rule.side_effect = _mock_fwaas
974
+
975
+ target1 = 'target1'
976
+ target2 = 'target2'
977
+ arglist = [target1, target2]
978
+ verifylist = [(self.res, [target1, target2])]
979
+
980
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
981
+ result = self.cmd.take_action(parsed_args)
982
+ self.assertIsNone(result)
983
+
984
+ self.assertEqual(2, self.mocked.call_count)
985
+ for idx, reference in enumerate([target1, target2]):
986
+ actual = ''.join(self.mocked.call_args_list[idx][0][0])
987
+ self.assertEqual(reference, actual)
988
+
989
+ def test_delete_multiple_with_exception(self):
990
+ target1 = 'target1'
991
+ target2 = 'target2'
992
+ arglist = [target1, target2]
993
+ verifylist = [(self.res, [target1, target2])]
994
+
995
+ def _mock_find(*args, **kwargs):
996
+ if args[0] == target2:
997
+ raise Exception('Not found')
998
+ return self.resource
999
+
1000
+ self.network_client.find_firewall_rule.side_effect = _mock_find
1001
+
1002
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
1003
+ self.assertRaises(
1004
+ exceptions.CommandError, self.cmd.take_action, parsed_args
1005
+ )