octavia 12.0.0.0rc2__py3-none-any.whl → 13.0.0.0rc1__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 (193) hide show
  1. octavia/amphorae/backends/agent/api_server/osutils.py +1 -0
  2. octavia/amphorae/backends/agent/api_server/plug.py +21 -7
  3. octavia/amphorae/backends/agent/api_server/templates/amphora-netns.systemd.j2 +2 -2
  4. octavia/amphorae/backends/agent/api_server/util.py +21 -0
  5. octavia/amphorae/backends/health_daemon/health_daemon.py +9 -3
  6. octavia/amphorae/backends/health_daemon/health_sender.py +2 -0
  7. octavia/amphorae/backends/utils/interface.py +14 -6
  8. octavia/amphorae/backends/utils/interface_file.py +6 -3
  9. octavia/amphorae/backends/utils/keepalivedlvs_query.py +8 -9
  10. octavia/amphorae/drivers/driver_base.py +1 -2
  11. octavia/amphorae/drivers/haproxy/rest_api_driver.py +11 -25
  12. octavia/amphorae/drivers/health/heartbeat_udp.py +34 -24
  13. octavia/amphorae/drivers/keepalived/jinja/jinja_cfg.py +3 -12
  14. octavia/amphorae/drivers/noop_driver/driver.py +3 -5
  15. octavia/api/common/pagination.py +4 -4
  16. octavia/api/drivers/amphora_driver/v2/driver.py +11 -5
  17. octavia/api/drivers/driver_agent/driver_get.py +22 -14
  18. octavia/api/drivers/driver_agent/driver_updater.py +8 -4
  19. octavia/api/drivers/utils.py +4 -2
  20. octavia/api/healthcheck/healthcheck_plugins.py +4 -2
  21. octavia/api/root_controller.py +4 -1
  22. octavia/api/v2/controllers/amphora.py +35 -38
  23. octavia/api/v2/controllers/availability_zone_profiles.py +43 -33
  24. octavia/api/v2/controllers/availability_zones.py +22 -18
  25. octavia/api/v2/controllers/flavor_profiles.py +37 -28
  26. octavia/api/v2/controllers/flavors.py +19 -15
  27. octavia/api/v2/controllers/health_monitor.py +44 -33
  28. octavia/api/v2/controllers/l7policy.py +52 -40
  29. octavia/api/v2/controllers/l7rule.py +68 -55
  30. octavia/api/v2/controllers/listener.py +88 -61
  31. octavia/api/v2/controllers/load_balancer.py +52 -34
  32. octavia/api/v2/controllers/member.py +63 -52
  33. octavia/api/v2/controllers/pool.py +55 -42
  34. octavia/api/v2/controllers/quotas.py +5 -3
  35. octavia/api/v2/types/listener.py +15 -0
  36. octavia/cmd/octavia_worker.py +0 -3
  37. octavia/cmd/status.py +1 -4
  38. octavia/common/clients.py +25 -45
  39. octavia/common/config.py +64 -22
  40. octavia/common/constants.py +3 -2
  41. octavia/common/data_models.py +7 -1
  42. octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py +12 -1
  43. octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 +5 -2
  44. octavia/common/jinja/lvs/jinja_cfg.py +4 -2
  45. octavia/common/keystone.py +58 -5
  46. octavia/common/validate.py +35 -0
  47. octavia/compute/drivers/noop_driver/driver.py +6 -0
  48. octavia/controller/healthmanager/health_manager.py +3 -6
  49. octavia/controller/housekeeping/house_keeping.py +36 -37
  50. octavia/controller/worker/amphora_rate_limit.py +5 -4
  51. octavia/controller/worker/task_utils.py +57 -41
  52. octavia/controller/worker/v2/controller_worker.py +160 -103
  53. octavia/controller/worker/v2/flows/listener_flows.py +3 -0
  54. octavia/controller/worker/v2/flows/load_balancer_flows.py +9 -14
  55. octavia/controller/worker/v2/tasks/amphora_driver_tasks.py +152 -91
  56. octavia/controller/worker/v2/tasks/compute_tasks.py +4 -2
  57. octavia/controller/worker/v2/tasks/database_tasks.py +542 -400
  58. octavia/controller/worker/v2/tasks/network_tasks.py +119 -79
  59. octavia/db/api.py +26 -23
  60. octavia/db/base_models.py +2 -2
  61. octavia/db/healthcheck.py +2 -1
  62. octavia/db/migration/alembic_migrations/versions/632152d2d32e_add_http_strict_transport_security_.py +42 -0
  63. octavia/db/models.py +12 -2
  64. octavia/db/prepare.py +2 -0
  65. octavia/db/repositories.py +462 -482
  66. octavia/hacking/checks.py +1 -1
  67. octavia/network/base.py +0 -14
  68. octavia/network/drivers/neutron/allowed_address_pairs.py +92 -135
  69. octavia/network/drivers/neutron/base.py +65 -77
  70. octavia/network/drivers/neutron/utils.py +69 -85
  71. octavia/network/drivers/noop_driver/driver.py +0 -7
  72. octavia/statistics/drivers/update_db.py +10 -10
  73. octavia/tests/common/constants.py +91 -84
  74. octavia/tests/common/sample_data_models.py +13 -1
  75. octavia/tests/fixtures.py +32 -0
  76. octavia/tests/functional/amphorae/backend/agent/api_server/test_server.py +9 -10
  77. octavia/tests/functional/api/drivers/driver_agent/test_driver_agent.py +260 -15
  78. octavia/tests/functional/api/test_root_controller.py +3 -28
  79. octavia/tests/functional/api/v2/base.py +5 -3
  80. octavia/tests/functional/api/v2/test_amphora.py +18 -5
  81. octavia/tests/functional/api/v2/test_availability_zone_profiles.py +1 -0
  82. octavia/tests/functional/api/v2/test_listener.py +51 -19
  83. octavia/tests/functional/api/v2/test_load_balancer.py +10 -1
  84. octavia/tests/functional/db/base.py +31 -16
  85. octavia/tests/functional/db/test_models.py +27 -28
  86. octavia/tests/functional/db/test_repositories.py +407 -50
  87. octavia/tests/unit/amphorae/backends/agent/api_server/test_amphora_info.py +2 -0
  88. octavia/tests/unit/amphorae/backends/agent/api_server/test_osutils.py +1 -1
  89. octavia/tests/unit/amphorae/backends/agent/api_server/test_plug.py +54 -6
  90. octavia/tests/unit/amphorae/backends/agent/api_server/test_util.py +35 -0
  91. octavia/tests/unit/amphorae/backends/health_daemon/test_health_daemon.py +8 -0
  92. octavia/tests/unit/amphorae/backends/health_daemon/test_health_sender.py +18 -0
  93. octavia/tests/unit/amphorae/backends/utils/test_interface.py +81 -0
  94. octavia/tests/unit/amphorae/backends/utils/test_interface_file.py +2 -0
  95. octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py +129 -5
  96. octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver_1_0.py +42 -20
  97. octavia/tests/unit/amphorae/drivers/health/test_heartbeat_udp.py +18 -20
  98. octavia/tests/unit/amphorae/drivers/keepalived/jinja/test_jinja_cfg.py +4 -4
  99. octavia/tests/unit/amphorae/drivers/noop_driver/test_driver.py +4 -1
  100. octavia/tests/unit/api/drivers/driver_agent/test_driver_get.py +3 -3
  101. octavia/tests/unit/api/drivers/driver_agent/test_driver_updater.py +11 -13
  102. octavia/tests/unit/base.py +6 -0
  103. octavia/tests/unit/cmd/test_interface.py +2 -2
  104. octavia/tests/unit/cmd/test_status.py +2 -2
  105. octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py +152 -1
  106. octavia/tests/unit/common/sample_configs/sample_configs_combined.py +10 -3
  107. octavia/tests/unit/common/test_clients.py +0 -39
  108. octavia/tests/unit/common/test_keystone.py +54 -0
  109. octavia/tests/unit/common/test_validate.py +67 -0
  110. octavia/tests/unit/controller/healthmanager/test_health_manager.py +8 -22
  111. octavia/tests/unit/controller/housekeeping/test_house_keeping.py +3 -64
  112. octavia/tests/unit/controller/worker/test_amphora_rate_limit.py +1 -1
  113. octavia/tests/unit/controller/worker/test_task_utils.py +44 -24
  114. octavia/tests/unit/controller/worker/v2/flows/test_load_balancer_flows.py +0 -1
  115. octavia/tests/unit/controller/worker/v2/tasks/test_amphora_driver_tasks.py +49 -26
  116. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py +399 -196
  117. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks_quota.py +37 -64
  118. octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py +3 -14
  119. octavia/tests/unit/controller/worker/v2/test_controller_worker.py +2 -2
  120. octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py +456 -561
  121. octavia/tests/unit/network/drivers/neutron/test_base.py +181 -194
  122. octavia/tests/unit/network/drivers/neutron/test_utils.py +14 -30
  123. octavia/tests/unit/statistics/drivers/test_update_db.py +7 -5
  124. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/README.rst +1 -1
  125. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/AUTHORS +4 -0
  126. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/METADATA +4 -4
  127. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/RECORD +141 -189
  128. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/entry_points.txt +1 -2
  129. octavia-13.0.0.0rc1.dist-info/pbr.json +1 -0
  130. octavia/api/drivers/amphora_driver/v1/__init__.py +0 -11
  131. octavia/api/drivers/amphora_driver/v1/driver.py +0 -547
  132. octavia/controller/queue/v1/__init__.py +0 -11
  133. octavia/controller/queue/v1/consumer.py +0 -64
  134. octavia/controller/queue/v1/endpoints.py +0 -160
  135. octavia/controller/worker/v1/__init__.py +0 -11
  136. octavia/controller/worker/v1/controller_worker.py +0 -1157
  137. octavia/controller/worker/v1/flows/__init__.py +0 -11
  138. octavia/controller/worker/v1/flows/amphora_flows.py +0 -610
  139. octavia/controller/worker/v1/flows/health_monitor_flows.py +0 -105
  140. octavia/controller/worker/v1/flows/l7policy_flows.py +0 -94
  141. octavia/controller/worker/v1/flows/l7rule_flows.py +0 -100
  142. octavia/controller/worker/v1/flows/listener_flows.py +0 -128
  143. octavia/controller/worker/v1/flows/load_balancer_flows.py +0 -692
  144. octavia/controller/worker/v1/flows/member_flows.py +0 -230
  145. octavia/controller/worker/v1/flows/pool_flows.py +0 -127
  146. octavia/controller/worker/v1/tasks/__init__.py +0 -11
  147. octavia/controller/worker/v1/tasks/amphora_driver_tasks.py +0 -453
  148. octavia/controller/worker/v1/tasks/cert_task.py +0 -51
  149. octavia/controller/worker/v1/tasks/compute_tasks.py +0 -335
  150. octavia/controller/worker/v1/tasks/database_tasks.py +0 -2756
  151. octavia/controller/worker/v1/tasks/lifecycle_tasks.py +0 -173
  152. octavia/controller/worker/v1/tasks/model_tasks.py +0 -41
  153. octavia/controller/worker/v1/tasks/network_tasks.py +0 -970
  154. octavia/controller/worker/v1/tasks/retry_tasks.py +0 -74
  155. octavia/tests/unit/api/drivers/amphora_driver/v1/__init__.py +0 -11
  156. octavia/tests/unit/api/drivers/amphora_driver/v1/test_driver.py +0 -824
  157. octavia/tests/unit/controller/queue/v1/__init__.py +0 -11
  158. octavia/tests/unit/controller/queue/v1/test_consumer.py +0 -61
  159. octavia/tests/unit/controller/queue/v1/test_endpoints.py +0 -189
  160. octavia/tests/unit/controller/worker/v1/__init__.py +0 -11
  161. octavia/tests/unit/controller/worker/v1/flows/__init__.py +0 -11
  162. octavia/tests/unit/controller/worker/v1/flows/test_amphora_flows.py +0 -474
  163. octavia/tests/unit/controller/worker/v1/flows/test_health_monitor_flows.py +0 -72
  164. octavia/tests/unit/controller/worker/v1/flows/test_l7policy_flows.py +0 -67
  165. octavia/tests/unit/controller/worker/v1/flows/test_l7rule_flows.py +0 -67
  166. octavia/tests/unit/controller/worker/v1/flows/test_listener_flows.py +0 -91
  167. octavia/tests/unit/controller/worker/v1/flows/test_load_balancer_flows.py +0 -431
  168. octavia/tests/unit/controller/worker/v1/flows/test_member_flows.py +0 -106
  169. octavia/tests/unit/controller/worker/v1/flows/test_pool_flows.py +0 -77
  170. octavia/tests/unit/controller/worker/v1/tasks/__init__.py +0 -11
  171. octavia/tests/unit/controller/worker/v1/tasks/test_amphora_driver_tasks.py +0 -792
  172. octavia/tests/unit/controller/worker/v1/tasks/test_cert_task.py +0 -46
  173. octavia/tests/unit/controller/worker/v1/tasks/test_compute_tasks.py +0 -634
  174. octavia/tests/unit/controller/worker/v1/tasks/test_database_tasks.py +0 -2615
  175. octavia/tests/unit/controller/worker/v1/tasks/test_database_tasks_quota.py +0 -415
  176. octavia/tests/unit/controller/worker/v1/tasks/test_lifecycle_tasks.py +0 -401
  177. octavia/tests/unit/controller/worker/v1/tasks/test_model_tasks.py +0 -44
  178. octavia/tests/unit/controller/worker/v1/tasks/test_network_tasks.py +0 -1788
  179. octavia/tests/unit/controller/worker/v1/tasks/test_retry_tasks.py +0 -47
  180. octavia/tests/unit/controller/worker/v1/test_controller_worker.py +0 -2096
  181. octavia-12.0.0.0rc2.dist-info/pbr.json +0 -1
  182. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/LICENSE +0 -0
  183. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/README.rst +0 -0
  184. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/diskimage-create.sh +0 -0
  185. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
  186. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/requirements.txt +0 -0
  187. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
  188. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/tox.ini +0 -0
  189. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/version.txt +0 -0
  190. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/scripts/octavia-wsgi +0 -0
  191. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/LICENSE +0 -0
  192. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/WHEEL +0 -0
  193. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -1,91 +0,0 @@
1
- # Copyright 2015 Hewlett-Packard Development Company, L.P.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License"); you may
4
- # not use this file except in compliance with the License. You may obtain
5
- # a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
- # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
- # License for the specific language governing permissions and limitations
13
- # under the License.
14
- #
15
- from unittest import mock
16
-
17
- from taskflow.patterns import linear_flow as flow
18
-
19
- from octavia.common import constants
20
- from octavia.controller.worker.v1.flows import listener_flows
21
- import octavia.tests.unit.base as base
22
-
23
-
24
- # NOTE: We patch the get_network_driver for all the calls so we don't
25
- # inadvertently make real calls.
26
- @mock.patch('octavia.common.utils.get_network_driver')
27
- class TestListenerFlows(base.TestCase):
28
-
29
- def setUp(self):
30
- self.ListenerFlow = listener_flows.ListenerFlows()
31
-
32
- super().setUp()
33
-
34
- def test_get_create_listener_flow(self, mock_get_net_driver):
35
-
36
- listener_flow = self.ListenerFlow.get_create_listener_flow()
37
-
38
- self.assertIsInstance(listener_flow, flow.Flow)
39
-
40
- self.assertIn(constants.LOADBALANCER, listener_flow.requires)
41
- self.assertIn(constants.LISTENERS, listener_flow.requires)
42
-
43
- self.assertEqual(2, len(listener_flow.requires))
44
- self.assertEqual(0, len(listener_flow.provides))
45
-
46
- def test_get_delete_listener_flow(self, mock_get_net_driver):
47
-
48
- listener_flow = self.ListenerFlow.get_delete_listener_flow()
49
-
50
- self.assertIsInstance(listener_flow, flow.Flow)
51
-
52
- self.assertIn(constants.LISTENER, listener_flow.requires)
53
- self.assertIn(constants.LOADBALANCER, listener_flow.requires)
54
-
55
- self.assertEqual(2, len(listener_flow.requires))
56
- self.assertEqual(0, len(listener_flow.provides))
57
-
58
- def test_get_delete_listener_internal_flow(self, mock_get_net_driver):
59
- listener_flow = self.ListenerFlow.get_delete_listener_internal_flow(
60
- 'test-listener')
61
-
62
- self.assertIsInstance(listener_flow, flow.Flow)
63
-
64
- self.assertIn('test-listener', listener_flow.requires)
65
- self.assertIn(constants.LOADBALANCER, listener_flow.requires)
66
-
67
- self.assertEqual(2, len(listener_flow.requires))
68
- self.assertEqual(0, len(listener_flow.provides))
69
-
70
- def test_get_update_listener_flow(self, mock_get_net_driver):
71
-
72
- listener_flow = self.ListenerFlow.get_update_listener_flow()
73
-
74
- self.assertIsInstance(listener_flow, flow.Flow)
75
-
76
- self.assertIn(constants.LISTENER, listener_flow.requires)
77
- self.assertIn(constants.LOADBALANCER, listener_flow.requires)
78
- self.assertIn(constants.UPDATE_DICT, listener_flow.requires)
79
- self.assertIn(constants.LISTENERS, listener_flow.requires)
80
-
81
- self.assertEqual(4, len(listener_flow.requires))
82
- self.assertEqual(0, len(listener_flow.provides))
83
-
84
- def test_get_create_all_listeners_flow(self, mock_get_net_driver):
85
- listeners_flow = self.ListenerFlow.get_create_all_listeners_flow()
86
- self.assertIsInstance(listeners_flow, flow.Flow)
87
- self.assertIn(constants.LOADBALANCER, listeners_flow.requires)
88
- self.assertIn(constants.LOADBALANCER_ID, listeners_flow.requires)
89
- self.assertIn(constants.LOADBALANCER, listeners_flow.provides)
90
- self.assertEqual(2, len(listeners_flow.requires))
91
- self.assertEqual(2, len(listeners_flow.provides))
@@ -1,431 +0,0 @@
1
- # Copyright 2015 Hewlett-Packard Development Company, L.P.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License"); you may
4
- # not use this file except in compliance with the License. You may obtain
5
- # a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
- # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
- # License for the specific language governing permissions and limitations
13
- # under the License.
14
- #
15
- from unittest import mock
16
-
17
- from oslo_config import cfg
18
- from oslo_config import fixture as oslo_fixture
19
- from oslo_utils import uuidutils
20
- from taskflow.patterns import linear_flow as flow
21
-
22
- from octavia.common import constants
23
- from octavia.common import exceptions
24
- from octavia.controller.worker.v1.flows import load_balancer_flows
25
- import octavia.tests.unit.base as base
26
-
27
-
28
- # NOTE: We patch the get_network_driver for all the calls so we don't
29
- # inadvertently make real calls.
30
- @mock.patch('octavia.common.utils.get_network_driver')
31
- class TestLoadBalancerFlows(base.TestCase):
32
-
33
- def setUp(self):
34
- super().setUp()
35
- self.conf = self.useFixture(oslo_fixture.Config(cfg.CONF))
36
- self.conf.config(
37
- group="controller_worker",
38
- amphora_driver='amphora_haproxy_rest_driver')
39
- self.conf.config(group="nova", enable_anti_affinity=False)
40
- self.LBFlow = load_balancer_flows.LoadBalancerFlows()
41
-
42
- def test_get_create_load_balancer_flow(self, mock_get_net_driver):
43
- amp_flow = self.LBFlow.get_create_load_balancer_flow(
44
- constants.TOPOLOGY_SINGLE)
45
- self.assertIsInstance(amp_flow, flow.Flow)
46
- self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)
47
- self.assertIn(constants.AMPHORA, amp_flow.provides)
48
- self.assertIn(constants.AMPHORA_ID, amp_flow.provides)
49
- self.assertIn(constants.COMPUTE_ID, amp_flow.provides)
50
- self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)
51
-
52
- def test_get_create_active_standby_load_balancer_flow(
53
- self, mock_get_net_driver):
54
- amp_flow = self.LBFlow.get_create_load_balancer_flow(
55
- constants.TOPOLOGY_ACTIVE_STANDBY)
56
- self.assertIsInstance(amp_flow, flow.Flow)
57
- self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)
58
- self.assertIn(constants.AMPHORA, amp_flow.provides)
59
- self.assertIn(constants.AMPHORA_ID, amp_flow.provides)
60
- self.assertIn(constants.COMPUTE_ID, amp_flow.provides)
61
- self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)
62
-
63
- def test_get_create_anti_affinity_active_standby_load_balancer_flow(
64
- self, mock_get_net_driver):
65
- self.conf.config(group="nova", enable_anti_affinity=True)
66
-
67
- self._LBFlow = load_balancer_flows.LoadBalancerFlows()
68
- amp_flow = self._LBFlow.get_create_load_balancer_flow(
69
- constants.TOPOLOGY_ACTIVE_STANDBY)
70
- self.assertIsInstance(amp_flow, flow.Flow)
71
- self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)
72
- self.assertIn(constants.SERVER_GROUP_ID, amp_flow.provides)
73
- self.assertIn(constants.AMPHORA, amp_flow.provides)
74
- self.assertIn(constants.AMPHORA_ID, amp_flow.provides)
75
- self.assertIn(constants.COMPUTE_ID, amp_flow.provides)
76
- self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)
77
- self.conf.config(group="nova", enable_anti_affinity=False)
78
-
79
- def test_get_create_bogus_topology_load_balancer_flow(
80
- self, mock_get_net_driver):
81
- self.assertRaises(exceptions.InvalidTopology,
82
- self.LBFlow.get_create_load_balancer_flow,
83
- 'BOGUS')
84
-
85
- def test_get_delete_load_balancer_flow(self, mock_get_net_driver):
86
- lb_mock = mock.Mock()
87
- listener_mock = mock.Mock()
88
- listener_mock.id = '123'
89
- lb_mock.listeners = [listener_mock]
90
-
91
- lb_flow, store = self.LBFlow.get_delete_load_balancer_flow(lb_mock)
92
-
93
- self.assertIsInstance(lb_flow, flow.Flow)
94
-
95
- self.assertIn(constants.LOADBALANCER, lb_flow.requires)
96
- self.assertIn(constants.SERVER_GROUP_ID, lb_flow.requires)
97
-
98
- self.assertEqual(0, len(lb_flow.provides))
99
- self.assertEqual(2, len(lb_flow.requires))
100
-
101
- def test_get_delete_load_balancer_flow_cascade(self, mock_get_net_driver):
102
- lb_mock = mock.Mock()
103
- listener_mock = mock.Mock()
104
- listener_mock.id = '123'
105
- lb_mock.listeners = [listener_mock]
106
- pool_mock = mock.Mock()
107
- pool_mock.id = '345'
108
- lb_mock.pools = [pool_mock]
109
- l7_mock = mock.Mock()
110
- l7_mock.id = '678'
111
- listener_mock.l7policies = [l7_mock]
112
-
113
- lb_flow, store = self.LBFlow.get_cascade_delete_load_balancer_flow(
114
- lb_mock)
115
-
116
- self.assertIsInstance(lb_flow, flow.Flow)
117
- self.assertEqual({'listener_123': listener_mock,
118
- 'pool345': pool_mock}, store)
119
-
120
- self.assertIn(constants.LOADBALANCER, lb_flow.requires)
121
-
122
- self.assertEqual(1, len(lb_flow.provides))
123
- self.assertEqual(4, len(lb_flow.requires))
124
-
125
- def test_get_update_load_balancer_flow(self, mock_get_net_driver):
126
-
127
- lb_flow = self.LBFlow.get_update_load_balancer_flow()
128
-
129
- self.assertIsInstance(lb_flow, flow.Flow)
130
-
131
- self.assertIn(constants.LOADBALANCER, lb_flow.requires)
132
- self.assertIn(constants.UPDATE_DICT, lb_flow.requires)
133
-
134
- self.assertEqual(0, len(lb_flow.provides))
135
- self.assertEqual(2, len(lb_flow.requires))
136
-
137
- def test_get_post_lb_amp_association_flow(self, mock_get_net_driver):
138
- amp_flow = self.LBFlow.get_post_lb_amp_association_flow(
139
- '123', constants.TOPOLOGY_SINGLE)
140
-
141
- self.assertIsInstance(amp_flow, flow.Flow)
142
-
143
- self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)
144
- self.assertIn(constants.UPDATE_DICT, amp_flow.requires)
145
- self.assertIn(constants.LOADBALANCER, amp_flow.provides)
146
-
147
- self.assertEqual(1, len(amp_flow.provides))
148
- self.assertEqual(2, len(amp_flow.requires))
149
-
150
- # Test Active/Standby path
151
- amp_flow = self.LBFlow.get_post_lb_amp_association_flow(
152
- '123', constants.TOPOLOGY_ACTIVE_STANDBY)
153
-
154
- self.assertIsInstance(amp_flow, flow.Flow)
155
-
156
- self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)
157
- self.assertIn(constants.UPDATE_DICT, amp_flow.requires)
158
- self.assertIn(constants.LOADBALANCER, amp_flow.provides)
159
-
160
- self.assertEqual(4, len(amp_flow.provides))
161
- self.assertEqual(2, len(amp_flow.requires))
162
-
163
- # Test mark_active=False
164
- amp_flow = self.LBFlow.get_post_lb_amp_association_flow(
165
- '123', constants.TOPOLOGY_ACTIVE_STANDBY)
166
-
167
- self.assertIsInstance(amp_flow, flow.Flow)
168
-
169
- self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)
170
- self.assertIn(constants.UPDATE_DICT, amp_flow.requires)
171
- self.assertIn(constants.LOADBALANCER, amp_flow.provides)
172
-
173
- self.assertEqual(4, len(amp_flow.provides))
174
- self.assertEqual(2, len(amp_flow.requires))
175
-
176
- def test_get_create_load_balancer_flows_single_listeners(
177
- self, mock_get_net_driver):
178
- create_flow = (
179
- self.LBFlow.get_create_load_balancer_flow(
180
- constants.TOPOLOGY_SINGLE, True
181
- )
182
- )
183
- self.assertIsInstance(create_flow, flow.Flow)
184
- self.assertIn(constants.LOADBALANCER_ID, create_flow.requires)
185
- self.assertIn(constants.UPDATE_DICT, create_flow.requires)
186
- self.assertIn(constants.BUILD_TYPE_PRIORITY, create_flow.requires)
187
- self.assertIn(constants.FLAVOR, create_flow.requires)
188
- self.assertIn(constants.AVAILABILITY_ZONE, create_flow.requires)
189
- self.assertIn(constants.SERVER_GROUP_ID, create_flow.requires)
190
-
191
- self.assertIn(constants.LISTENERS, create_flow.provides)
192
- self.assertIn(constants.SUBNET, create_flow.provides)
193
- self.assertIn(constants.AMPHORA, create_flow.provides)
194
- self.assertIn(constants.AMPHORA_ID, create_flow.provides)
195
- self.assertIn(constants.COMPUTE_ID, create_flow.provides)
196
- self.assertIn(constants.COMPUTE_OBJ, create_flow.provides)
197
- self.assertIn(constants.LOADBALANCER, create_flow.provides)
198
- self.assertIn(constants.DELTAS, create_flow.provides)
199
- self.assertIn(constants.UPDATED_PORTS, create_flow.provides)
200
- self.assertIn(constants.VIP, create_flow.provides)
201
- self.assertIn(constants.AMP_DATA, create_flow.provides)
202
- self.assertIn(constants.SERVER_PEM, create_flow.provides)
203
- self.assertIn(constants.AMPHORA_NETWORK_CONFIG, create_flow.provides)
204
- self.assertIn(constants.AMPHORAE_NETWORK_CONFIG, create_flow.provides)
205
-
206
- self.assertEqual(6, len(create_flow.requires))
207
- self.assertEqual(14, len(create_flow.provides))
208
-
209
- def test_get_create_load_balancer_flows_active_standby_listeners(
210
- self, mock_get_net_driver):
211
- create_flow = (
212
- self.LBFlow.get_create_load_balancer_flow(
213
- constants.TOPOLOGY_ACTIVE_STANDBY, True
214
- )
215
- )
216
- self.assertIsInstance(create_flow, flow.Flow)
217
- self.assertIn(constants.LOADBALANCER_ID, create_flow.requires)
218
- self.assertIn(constants.UPDATE_DICT, create_flow.requires)
219
-
220
- self.assertIn(constants.LISTENERS, create_flow.provides)
221
- self.assertIn(constants.AMPHORA, create_flow.provides)
222
- self.assertIn(constants.AMPHORA_ID, create_flow.provides)
223
- self.assertIn(constants.COMPUTE_ID, create_flow.provides)
224
- self.assertIn(constants.COMPUTE_OBJ, create_flow.provides)
225
- self.assertIn(constants.LOADBALANCER, create_flow.provides)
226
- self.assertIn(constants.DELTAS, create_flow.provides)
227
- self.assertIn(constants.UPDATED_PORTS, create_flow.provides)
228
- self.assertIn(constants.VIP, create_flow.provides)
229
- self.assertIn(constants.AMP_DATA, create_flow.provides)
230
- self.assertIn(constants.AMPHORAE_NETWORK_CONFIG,
231
- create_flow.provides)
232
-
233
- self.assertEqual(6, len(create_flow.requires))
234
- self.assertEqual(16, len(create_flow.provides),
235
- create_flow.provides)
236
-
237
- def _test_get_failover_LB_flow_single(self, amphorae):
238
- lb_mock = mock.MagicMock()
239
- lb_mock.id = uuidutils.generate_uuid()
240
- lb_mock.topology = constants.TOPOLOGY_SINGLE
241
-
242
- failover_flow = self.LBFlow.get_failover_LB_flow(amphorae, lb_mock)
243
-
244
- self.assertIsInstance(failover_flow, flow.Flow)
245
-
246
- self.assertIn(constants.AVAILABILITY_ZONE, failover_flow.requires)
247
- self.assertIn(constants.BUILD_TYPE_PRIORITY, failover_flow.requires)
248
- self.assertIn(constants.FLAVOR, failover_flow.requires)
249
- self.assertIn(constants.LOADBALANCER, failover_flow.requires)
250
- self.assertIn(constants.LOADBALANCER_ID, failover_flow.requires)
251
-
252
- self.assertIn(constants.UPDATED_PORTS, failover_flow.provides)
253
- self.assertIn(constants.AMPHORA, failover_flow.provides)
254
- self.assertIn(constants.AMPHORA_ID, failover_flow.provides)
255
- self.assertIn(constants.AMPHORAE_NETWORK_CONFIG,
256
- failover_flow.provides)
257
- self.assertIn(constants.BASE_PORT, failover_flow.provides)
258
- self.assertIn(constants.COMPUTE_ID, failover_flow.provides)
259
- self.assertIn(constants.COMPUTE_OBJ, failover_flow.provides)
260
- self.assertIn(constants.DELTA, failover_flow.provides)
261
- self.assertIn(constants.LOADBALANCER, failover_flow.provides)
262
- self.assertIn(constants.SERVER_PEM, failover_flow.provides)
263
- self.assertIn(constants.VIP, failover_flow.provides)
264
- self.assertIn(constants.VIP_SG_ID, failover_flow.provides)
265
-
266
- self.assertEqual(6, len(failover_flow.requires),
267
- failover_flow.requires)
268
- self.assertEqual(12, len(failover_flow.provides),
269
- failover_flow.provides)
270
-
271
- def test_get_failover_LB_flow_no_amps_single(self, mock_get_net_driver):
272
- self._test_get_failover_LB_flow_single([])
273
-
274
- def test_get_failover_LB_flow_one_amp_single(self, mock_get_net_driver):
275
- amphora_mock = mock.MagicMock()
276
- amphora_mock.role = constants.ROLE_STANDALONE
277
- amphora_mock.lb_network_id = uuidutils.generate_uuid()
278
- amphora_mock.compute_id = uuidutils.generate_uuid()
279
- amphora_mock.vrrp_port_id = None
280
- amphora_mock.vrrp_ip = None
281
-
282
- self._test_get_failover_LB_flow_single([amphora_mock])
283
-
284
- def test_get_failover_LB_flow_one_bogus_amp_single(self,
285
- mock_get_net_driver):
286
- amphora_mock = mock.MagicMock()
287
- amphora_mock.role = 'bogus'
288
- amphora_mock.lb_network_id = uuidutils.generate_uuid()
289
- amphora_mock.compute_id = uuidutils.generate_uuid()
290
- amphora_mock.vrrp_port_id = None
291
- amphora_mock.vrrp_ip = None
292
-
293
- self._test_get_failover_LB_flow_single([amphora_mock])
294
-
295
- def test_get_failover_LB_flow_two_amp_single(self, mock_get_net_driver):
296
- amphora_mock = mock.MagicMock()
297
- amphora2_mock = mock.MagicMock()
298
- amphora2_mock.role = constants.ROLE_STANDALONE
299
- amphora2_mock.lb_network_id = uuidutils.generate_uuid()
300
- amphora2_mock.compute_id = uuidutils.generate_uuid()
301
- amphora2_mock.vrrp_port_id = None
302
- amphora2_mock.vrrp_ip = None
303
-
304
- self._test_get_failover_LB_flow_single([amphora_mock, amphora2_mock])
305
-
306
- def _test_get_failover_LB_flow_no_amps_act_stdby(self, amphorae):
307
- lb_mock = mock.MagicMock()
308
- lb_mock.id = uuidutils.generate_uuid()
309
- lb_mock.topology = constants.TOPOLOGY_ACTIVE_STANDBY
310
-
311
- failover_flow = self.LBFlow.get_failover_LB_flow(amphorae, lb_mock)
312
-
313
- self.assertIsInstance(failover_flow, flow.Flow)
314
-
315
- self.assertIn(constants.AVAILABILITY_ZONE, failover_flow.requires)
316
- self.assertIn(constants.BUILD_TYPE_PRIORITY, failover_flow.requires)
317
- self.assertIn(constants.FLAVOR, failover_flow.requires)
318
- self.assertIn(constants.LOADBALANCER, failover_flow.requires)
319
- self.assertIn(constants.LOADBALANCER_ID, failover_flow.requires)
320
-
321
- self.assertIn(constants.UPDATED_PORTS, failover_flow.provides)
322
- self.assertIn(constants.AMP_VRRP_INT, failover_flow.provides)
323
- self.assertIn(constants.AMPHORA, failover_flow.provides)
324
- self.assertIn(constants.AMPHORA_ID, failover_flow.provides)
325
- self.assertIn(constants.AMPHORAE, failover_flow.provides)
326
- self.assertIn(constants.AMPHORAE_NETWORK_CONFIG,
327
- failover_flow.provides)
328
- self.assertIn(constants.BASE_PORT, failover_flow.provides)
329
- self.assertIn(constants.COMPUTE_ID, failover_flow.provides)
330
- self.assertIn(constants.COMPUTE_OBJ, failover_flow.provides)
331
- self.assertIn(constants.DELTA, failover_flow.provides)
332
- self.assertIn(constants.FIRST_AMP_NETWORK_CONFIGS,
333
- failover_flow.provides)
334
- self.assertIn(constants.FIRST_AMP_VRRP_INTERFACE,
335
- failover_flow.provides)
336
- self.assertIn(constants.LOADBALANCER, failover_flow.provides)
337
- self.assertIn(constants.SERVER_PEM, failover_flow.provides)
338
- self.assertIn(constants.VIP, failover_flow.provides)
339
- self.assertIn(constants.VIP_SG_ID, failover_flow.provides)
340
-
341
- self.assertEqual(6, len(failover_flow.requires),
342
- failover_flow.requires)
343
- self.assertEqual(16, len(failover_flow.provides),
344
- failover_flow.provides)
345
-
346
- def test_get_failover_LB_flow_no_amps_act_stdby(self, mock_get_net_driver):
347
- self._test_get_failover_LB_flow_no_amps_act_stdby([])
348
-
349
- def test_get_failover_LB_flow_one_amps_act_stdby(self, amphorae):
350
- amphora_mock = mock.MagicMock()
351
- amphora_mock.role = constants.ROLE_MASTER
352
- amphora_mock.lb_network_id = uuidutils.generate_uuid()
353
- amphora_mock.compute_id = uuidutils.generate_uuid()
354
- amphora_mock.vrrp_port_id = None
355
- amphora_mock.vrrp_ip = None
356
-
357
- self._test_get_failover_LB_flow_no_amps_act_stdby([amphora_mock])
358
-
359
- def test_get_failover_LB_flow_two_amps_act_stdby(self,
360
- mock_get_net_driver):
361
- amphora_mock = mock.MagicMock()
362
- amphora_mock.role = constants.ROLE_MASTER
363
- amphora_mock.lb_network_id = uuidutils.generate_uuid()
364
- amphora_mock.compute_id = uuidutils.generate_uuid()
365
- amphora_mock.vrrp_port_id = uuidutils.generate_uuid()
366
- amphora_mock.vrrp_ip = '192.0.2.46'
367
- amphora2_mock = mock.MagicMock()
368
- amphora2_mock.role = constants.ROLE_BACKUP
369
- amphora2_mock.lb_network_id = uuidutils.generate_uuid()
370
- amphora2_mock.compute_id = uuidutils.generate_uuid()
371
- amphora2_mock.vrrp_port_id = uuidutils.generate_uuid()
372
- amphora2_mock.vrrp_ip = '2001:db8::46'
373
-
374
- self._test_get_failover_LB_flow_no_amps_act_stdby([amphora_mock,
375
- amphora2_mock])
376
-
377
- def test_get_failover_LB_flow_three_amps_act_stdby(self,
378
- mock_get_net_driver):
379
- amphora_mock = mock.MagicMock()
380
- amphora_mock.role = constants.ROLE_MASTER
381
- amphora_mock.lb_network_id = uuidutils.generate_uuid()
382
- amphora_mock.compute_id = uuidutils.generate_uuid()
383
- amphora_mock.vrrp_port_id = uuidutils.generate_uuid()
384
- amphora_mock.vrrp_ip = '192.0.2.46'
385
- amphora2_mock = mock.MagicMock()
386
- amphora2_mock.role = constants.ROLE_BACKUP
387
- amphora2_mock.lb_network_id = uuidutils.generate_uuid()
388
- amphora2_mock.compute_id = uuidutils.generate_uuid()
389
- amphora2_mock.vrrp_port_id = uuidutils.generate_uuid()
390
- amphora2_mock.vrrp_ip = '2001:db8::46'
391
- amphora3_mock = mock.MagicMock()
392
- amphora3_mock.vrrp_ip = None
393
-
394
- self._test_get_failover_LB_flow_no_amps_act_stdby(
395
- [amphora_mock, amphora2_mock, amphora3_mock])
396
-
397
- def test_get_failover_LB_flow_two_amps_bogus_act_stdby(
398
- self, mock_get_net_driver):
399
- amphora_mock = mock.MagicMock()
400
- amphora_mock.role = 'bogus'
401
- amphora_mock.lb_network_id = uuidutils.generate_uuid()
402
- amphora_mock.compute_id = uuidutils.generate_uuid()
403
- amphora_mock.vrrp_port_id = uuidutils.generate_uuid()
404
- amphora_mock.vrrp_ip = '192.0.2.46'
405
- amphora2_mock = mock.MagicMock()
406
- amphora2_mock.role = constants.ROLE_MASTER
407
- amphora2_mock.lb_network_id = uuidutils.generate_uuid()
408
- amphora2_mock.compute_id = uuidutils.generate_uuid()
409
- amphora2_mock.vrrp_port_id = uuidutils.generate_uuid()
410
- amphora2_mock.vrrp_ip = '2001:db8::46'
411
-
412
- self._test_get_failover_LB_flow_no_amps_act_stdby([amphora_mock,
413
- amphora2_mock])
414
-
415
- def test_get_failover_LB_flow_two_amps_standalone_act_stdby(
416
- self, mock_get_net_driver):
417
- amphora_mock = mock.MagicMock()
418
- amphora_mock.role = constants.ROLE_STANDALONE
419
- amphora_mock.lb_network_id = uuidutils.generate_uuid()
420
- amphora_mock.compute_id = uuidutils.generate_uuid()
421
- amphora_mock.vrrp_port_id = uuidutils.generate_uuid()
422
- amphora_mock.vrrp_ip = '192.0.2.46'
423
- amphora2_mock = mock.MagicMock()
424
- amphora2_mock.role = constants.ROLE_MASTER
425
- amphora2_mock.lb_network_id = uuidutils.generate_uuid()
426
- amphora2_mock.compute_id = uuidutils.generate_uuid()
427
- amphora2_mock.vrrp_port_id = uuidutils.generate_uuid()
428
- amphora2_mock.vrrp_ip = '2001:db8::46'
429
-
430
- self._test_get_failover_LB_flow_no_amps_act_stdby([amphora_mock,
431
- amphora2_mock])
@@ -1,106 +0,0 @@
1
- # Copyright 2015 Hewlett-Packard Development Company, L.P.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License"); you may
4
- # not use this file except in compliance with the License. You may obtain
5
- # a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
- # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
- # License for the specific language governing permissions and limitations
13
- # under the License.
14
- #
15
- from unittest import mock
16
-
17
- from taskflow.patterns import linear_flow as flow
18
-
19
- from octavia.common import constants
20
- from octavia.controller.worker.v1.flows import member_flows
21
- import octavia.tests.unit.base as base
22
-
23
-
24
- # NOTE: We patch the get_network_driver for all the calls so we don't
25
- # inadvertently make real calls.
26
- @mock.patch('octavia.common.utils.get_network_driver')
27
- class TestMemberFlows(base.TestCase):
28
-
29
- def setUp(self):
30
- self.MemberFlow = member_flows.MemberFlows()
31
-
32
- super().setUp()
33
-
34
- def test_get_create_member_flow(self, mock_get_net_driver):
35
-
36
- member_flow = self.MemberFlow.get_create_member_flow()
37
-
38
- self.assertIsInstance(member_flow, flow.Flow)
39
-
40
- self.assertIn(constants.MEMBER, member_flow.requires)
41
- self.assertIn(constants.LISTENERS, member_flow.requires)
42
- self.assertIn(constants.LOADBALANCER, member_flow.requires)
43
- self.assertIn(constants.POOL, member_flow.requires)
44
- self.assertIn(constants.MEMBER, member_flow.requires)
45
- self.assertIn(constants.AVAILABILITY_ZONE, member_flow.requires)
46
-
47
- self.assertIn(constants.DELTAS, member_flow.provides)
48
- self.assertIn(constants.AMPHORAE_NETWORK_CONFIG, member_flow.provides)
49
- self.assertIn(constants.UPDATED_PORTS, member_flow.provides)
50
-
51
- self.assertEqual(6, len(member_flow.requires))
52
- self.assertEqual(3, len(member_flow.provides))
53
-
54
- def test_get_delete_member_flow(self, mock_get_net_driver):
55
-
56
- member_flow = self.MemberFlow.get_delete_member_flow()
57
-
58
- self.assertIsInstance(member_flow, flow.Flow)
59
-
60
- self.assertIn(constants.MEMBER, member_flow.requires)
61
- self.assertIn(constants.LISTENERS, member_flow.requires)
62
- self.assertIn(constants.LOADBALANCER, member_flow.requires)
63
- self.assertIn(constants.LOADBALANCER_ID, member_flow.requires)
64
- self.assertIn(constants.POOL, member_flow.requires)
65
- self.assertIn(constants.AVAILABILITY_ZONE, member_flow.requires)
66
-
67
- self.assertIn(constants.AMPHORAE_NETWORK_CONFIG, member_flow.provides)
68
- self.assertIn(constants.DELTAS, member_flow.provides)
69
- self.assertIn(constants.UPDATED_PORTS, member_flow.provides)
70
-
71
- self.assertEqual(6, len(member_flow.requires))
72
- self.assertEqual(3, len(member_flow.provides))
73
-
74
- def test_get_update_member_flow(self, mock_get_net_driver):
75
-
76
- member_flow = self.MemberFlow.get_update_member_flow()
77
-
78
- self.assertIsInstance(member_flow, flow.Flow)
79
-
80
- self.assertIn(constants.MEMBER, member_flow.requires)
81
- self.assertIn(constants.LISTENERS, member_flow.requires)
82
- self.assertIn(constants.LOADBALANCER, member_flow.requires)
83
- self.assertIn(constants.POOL, member_flow.requires)
84
- self.assertIn(constants.UPDATE_DICT, member_flow.requires)
85
-
86
- self.assertEqual(5, len(member_flow.requires))
87
- self.assertEqual(0, len(member_flow.provides))
88
-
89
- def test_get_batch_update_members_flow(self, mock_get_net_driver):
90
-
91
- member_flow = self.MemberFlow.get_batch_update_members_flow(
92
- [], [], [])
93
-
94
- self.assertIsInstance(member_flow, flow.Flow)
95
-
96
- self.assertIn(constants.LISTENERS, member_flow.requires)
97
- self.assertIn(constants.LOADBALANCER, member_flow.requires)
98
- self.assertIn(constants.POOL, member_flow.requires)
99
- self.assertIn(constants.AVAILABILITY_ZONE, member_flow.requires)
100
-
101
- self.assertIn(constants.DELTAS, member_flow.provides)
102
- self.assertIn(constants.UPDATED_PORTS, member_flow.provides)
103
- self.assertIn(constants.AMPHORAE_NETWORK_CONFIG, member_flow.provides)
104
-
105
- self.assertEqual(5, len(member_flow.requires))
106
- self.assertEqual(3, len(member_flow.provides))