octavia 13.0.0.0rc1__py3-none-any.whl → 14.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- octavia/amphorae/backends/agent/api_server/lvs_listener_base.py +1 -1
- octavia/amphorae/backends/agent/api_server/osutils.py +5 -5
- octavia/amphorae/backends/agent/api_server/plug.py +3 -2
- octavia/amphorae/backends/agent/api_server/rules_schema.py +52 -0
- octavia/amphorae/backends/agent/api_server/server.py +28 -1
- octavia/amphorae/backends/utils/interface.py +45 -6
- octavia/amphorae/backends/utils/interface_file.py +9 -6
- octavia/amphorae/backends/utils/nftable_utils.py +125 -0
- octavia/amphorae/drivers/driver_base.py +27 -0
- octavia/amphorae/drivers/haproxy/rest_api_driver.py +42 -10
- octavia/amphorae/drivers/health/heartbeat_udp.py +2 -2
- octavia/amphorae/drivers/keepalived/vrrp_rest_driver.py +2 -1
- octavia/amphorae/drivers/noop_driver/driver.py +25 -0
- octavia/api/app.py +3 -0
- octavia/api/common/pagination.py +2 -2
- octavia/api/drivers/amphora_driver/flavor_schema.py +6 -1
- octavia/api/root_controller.py +4 -1
- octavia/api/v2/controllers/health_monitor.py +0 -1
- octavia/api/v2/controllers/l7policy.py +0 -1
- octavia/api/v2/controllers/l7rule.py +0 -1
- octavia/api/v2/controllers/listener.py +0 -1
- octavia/api/v2/controllers/load_balancer.py +13 -7
- octavia/api/v2/controllers/member.py +6 -3
- octavia/api/v2/controllers/pool.py +6 -7
- octavia/api/v2/types/load_balancer.py +5 -1
- octavia/api/v2/types/pool.py +1 -1
- octavia/certificates/common/pkcs12.py +9 -9
- octavia/certificates/manager/barbican.py +24 -16
- octavia/certificates/manager/castellan_mgr.py +12 -7
- octavia/certificates/manager/local.py +4 -4
- octavia/certificates/manager/noop.py +106 -0
- octavia/cmd/driver_agent.py +1 -1
- octavia/cmd/health_checker.py +0 -4
- octavia/cmd/health_manager.py +1 -5
- octavia/cmd/house_keeping.py +1 -1
- octavia/cmd/interface.py +0 -4
- octavia/cmd/octavia_worker.py +0 -4
- octavia/cmd/prometheus_proxy.py +0 -5
- octavia/cmd/status.py +0 -6
- octavia/common/base_taskflow.py +1 -1
- octavia/common/clients.py +15 -3
- octavia/common/config.py +24 -6
- octavia/common/constants.py +34 -0
- octavia/common/data_models.py +3 -1
- octavia/common/exceptions.py +11 -0
- octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 +7 -5
- octavia/common/keystone.py +7 -7
- octavia/common/tls_utils/cert_parser.py +24 -10
- octavia/common/utils.py +6 -0
- octavia/common/validate.py +2 -2
- octavia/compute/drivers/nova_driver.py +23 -5
- octavia/controller/worker/task_utils.py +28 -6
- octavia/controller/worker/v2/controller_worker.py +49 -15
- octavia/controller/worker/v2/flows/amphora_flows.py +120 -21
- octavia/controller/worker/v2/flows/flow_utils.py +15 -13
- octavia/controller/worker/v2/flows/listener_flows.py +95 -5
- octavia/controller/worker/v2/flows/load_balancer_flows.py +74 -30
- octavia/controller/worker/v2/taskflow_jobboard_driver.py +17 -1
- octavia/controller/worker/v2/tasks/amphora_driver_tasks.py +145 -24
- octavia/controller/worker/v2/tasks/compute_tasks.py +1 -1
- octavia/controller/worker/v2/tasks/database_tasks.py +72 -41
- octavia/controller/worker/v2/tasks/lifecycle_tasks.py +97 -41
- octavia/controller/worker/v2/tasks/network_tasks.py +57 -60
- octavia/controller/worker/v2/tasks/shim_tasks.py +28 -0
- octavia/db/migration/alembic_migrations/versions/55874a4ceed6_add_l7policy_action_redirect_prefix.py +1 -1
- octavia/db/migration/alembic_migrations/versions/5a3ee5472c31_add_cert_expiration__infor_in_amphora_table.py +1 -1
- octavia/db/migration/alembic_migrations/versions/6742ca1b27c2_add_l7policy_redirect_http_code.py +1 -1
- octavia/db/migration/alembic_migrations/versions/db2a73e82626_add_vnic_type_for_vip.py +36 -0
- octavia/db/models.py +1 -0
- octavia/db/prepare.py +1 -1
- octavia/db/repositories.py +53 -34
- octavia/distributor/drivers/driver_base.py +1 -1
- octavia/network/base.py +3 -16
- octavia/network/data_models.py +4 -1
- octavia/network/drivers/neutron/allowed_address_pairs.py +27 -26
- octavia/network/drivers/noop_driver/driver.py +10 -23
- octavia/tests/common/sample_certs.py +115 -0
- octavia/tests/common/sample_haproxy_prometheus +1 -1
- octavia/tests/functional/amphorae/backend/agent/api_server/test_server.py +37 -0
- octavia/tests/functional/api/test_healthcheck.py +2 -2
- octavia/tests/functional/api/v2/base.py +1 -1
- octavia/tests/functional/api/v2/test_listener.py +45 -0
- octavia/tests/functional/api/v2/test_load_balancer.py +17 -0
- octavia/tests/functional/db/base.py +9 -0
- octavia/tests/functional/db/test_models.py +2 -1
- octavia/tests/functional/db/test_repositories.py +55 -99
- octavia/tests/unit/amphorae/backends/agent/api_server/test_osutils.py +4 -2
- octavia/tests/unit/amphorae/backends/utils/test_interface.py +201 -1
- octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py +1 -1
- octavia/tests/unit/amphorae/backends/utils/test_nftable_utils.py +194 -0
- octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver.py +27 -5
- octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver_1_0.py +15 -2
- octavia/tests/unit/amphorae/drivers/keepalived/test_vrrp_rest_driver.py +17 -0
- octavia/tests/unit/amphorae/drivers/noop_driver/test_driver.py +2 -1
- octavia/tests/unit/api/v2/types/test_pool.py +71 -0
- octavia/tests/unit/certificates/manager/test_barbican.py +3 -3
- octavia/tests/unit/certificates/manager/test_noop.py +53 -0
- octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py +16 -17
- octavia/tests/unit/common/sample_configs/sample_configs_combined.py +5 -3
- octavia/tests/unit/common/test_config.py +35 -0
- octavia/tests/unit/common/test_keystone.py +32 -0
- octavia/tests/unit/common/test_utils.py +39 -0
- octavia/tests/unit/compute/drivers/test_nova_driver.py +22 -0
- octavia/tests/unit/controller/worker/test_task_utils.py +58 -2
- octavia/tests/unit/controller/worker/v2/flows/test_amphora_flows.py +28 -5
- octavia/tests/unit/controller/worker/v2/flows/test_listener_flows.py +64 -16
- octavia/tests/unit/controller/worker/v2/flows/test_load_balancer_flows.py +49 -9
- octavia/tests/unit/controller/worker/v2/tasks/test_amphora_driver_tasks.py +265 -17
- octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py +101 -1
- octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks_quota.py +19 -19
- octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py +105 -42
- octavia/tests/unit/controller/worker/v2/tasks/test_shim_tasks.py +33 -0
- octavia/tests/unit/controller/worker/v2/test_controller_worker.py +85 -42
- octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py +48 -51
- octavia/tests/unit/network/drivers/neutron/test_utils.py +2 -0
- octavia/tests/unit/network/drivers/noop_driver/test_driver.py +0 -7
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/README.rst +6 -1
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/diskimage-create.sh +10 -4
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/requirements.txt +0 -2
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/tox.ini +30 -13
- {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/AUTHORS +5 -0
- {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/METADATA +6 -6
- {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/RECORD +134 -126
- {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/entry_points.txt +1 -1
- octavia-14.0.0.dist-info/pbr.json +1 -0
- octavia-13.0.0.0rc1.dist-info/pbr.json +0 -1
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/LICENSE +0 -0
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/README.rst +0 -0
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/version.txt +0 -0
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/scripts/octavia-wsgi +0 -0
- {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/LICENSE +0 -0
- {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/WHEEL +0 -0
- {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/top_level.txt +0 -0
@@ -96,6 +96,32 @@ class TestLoadBalancerFlows(base.TestCase):
|
|
96
96
|
self.LBFlow.get_create_load_balancer_flow,
|
97
97
|
'BOGUS')
|
98
98
|
|
99
|
+
@mock.patch('octavia.common.rpc.NOTIFIER',
|
100
|
+
new_callable=MockNOTIFIER)
|
101
|
+
def test_get_create_load_balancer_flow_SRIOV(self, mock_get_net_driver,
|
102
|
+
mock_notifier):
|
103
|
+
amp_flow = self.LBFlow.get_create_load_balancer_flow(
|
104
|
+
constants.TOPOLOGY_SINGLE, flavor_dict={constants.SRIOV_VIP: True})
|
105
|
+
self.assertIsInstance(amp_flow, flow.Flow)
|
106
|
+
self.assertIn(constants.AVAILABILITY_ZONE, amp_flow.requires)
|
107
|
+
self.assertIn(constants.BUILD_TYPE_PRIORITY, amp_flow.requires)
|
108
|
+
self.assertIn(constants.FLAVOR, amp_flow.requires)
|
109
|
+
self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)
|
110
|
+
self.assertIn(constants.SERVER_GROUP_ID, amp_flow.requires)
|
111
|
+
self.assertIn(constants.UPDATE_DICT, amp_flow.requires)
|
112
|
+
self.assertIn(constants.ADDITIONAL_VIPS, amp_flow.provides)
|
113
|
+
self.assertIn(constants.AMP_DATA, amp_flow.provides)
|
114
|
+
self.assertIn(constants.AMPHORA, amp_flow.provides)
|
115
|
+
self.assertIn(constants.AMPHORA_ID, amp_flow.provides)
|
116
|
+
self.assertIn(constants.AMPHORA_NETWORK_CONFIG, amp_flow.provides)
|
117
|
+
self.assertIn(constants.COMPUTE_ID, amp_flow.provides)
|
118
|
+
self.assertIn(constants.COMPUTE_OBJ, amp_flow.provides)
|
119
|
+
self.assertIn(constants.LOADBALANCER, amp_flow.provides)
|
120
|
+
self.assertIn(constants.PORT_DATA, amp_flow.provides)
|
121
|
+
self.assertIn(constants.SERVER_PEM, amp_flow.provides)
|
122
|
+
self.assertIn(constants.SUBNET, amp_flow.provides)
|
123
|
+
self.assertIn(constants.VIP, amp_flow.provides)
|
124
|
+
|
99
125
|
@mock.patch('octavia.common.rpc.NOTIFIER',
|
100
126
|
new_callable=MockNOTIFIER)
|
101
127
|
def test_get_delete_load_balancer_flow(self, mock_get_net_driver,
|
@@ -199,14 +225,16 @@ class TestLoadBalancerFlows(base.TestCase):
|
|
199
225
|
|
200
226
|
self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)
|
201
227
|
self.assertIn(constants.UPDATE_DICT, amp_flow.requires)
|
228
|
+
self.assertIn(constants.AMPHORA_ID, amp_flow.requires)
|
202
229
|
|
203
230
|
self.assertIn(constants.AMPHORAE, amp_flow.provides)
|
231
|
+
self.assertIn(constants.AMPHORAE_STATUS, amp_flow.provides)
|
204
232
|
self.assertIn(constants.AMP_VRRP_INT, amp_flow.provides)
|
205
233
|
self.assertIn(constants.AMPHORAE_NETWORK_CONFIG, amp_flow.provides)
|
206
234
|
self.assertIn(constants.LOADBALANCER, amp_flow.provides)
|
207
235
|
|
208
|
-
self.assertEqual(
|
209
|
-
self.assertEqual(
|
236
|
+
self.assertEqual(3, len(amp_flow.requires), amp_flow.requires)
|
237
|
+
self.assertEqual(5, len(amp_flow.provides), amp_flow.provides)
|
210
238
|
|
211
239
|
amp_flow = self.LBFlow.get_post_lb_amp_association_flow(
|
212
240
|
'123', constants.TOPOLOGY_ACTIVE_STANDBY)
|
@@ -215,14 +243,16 @@ class TestLoadBalancerFlows(base.TestCase):
|
|
215
243
|
|
216
244
|
self.assertIn(constants.LOADBALANCER_ID, amp_flow.requires)
|
217
245
|
self.assertIn(constants.UPDATE_DICT, amp_flow.requires)
|
246
|
+
self.assertIn(constants.AMPHORA_ID, amp_flow.requires)
|
218
247
|
|
219
248
|
self.assertIn(constants.AMPHORAE, amp_flow.provides)
|
249
|
+
self.assertIn(constants.AMPHORAE_STATUS, amp_flow.provides)
|
220
250
|
self.assertIn(constants.AMPHORAE_NETWORK_CONFIG, amp_flow.provides)
|
221
251
|
self.assertIn(constants.AMP_VRRP_INT, amp_flow.provides)
|
222
252
|
self.assertIn(constants.LOADBALANCER, amp_flow.provides)
|
223
253
|
|
224
|
-
self.assertEqual(
|
225
|
-
self.assertEqual(
|
254
|
+
self.assertEqual(3, len(amp_flow.requires), amp_flow.requires)
|
255
|
+
self.assertEqual(5, len(amp_flow.provides), amp_flow.provides)
|
226
256
|
|
227
257
|
@mock.patch('octavia.common.rpc.NOTIFIER',
|
228
258
|
new_callable=MockNOTIFIER)
|
@@ -285,6 +315,7 @@ class TestLoadBalancerFlows(base.TestCase):
|
|
285
315
|
self.assertIn(constants.AMPHORA_ID, create_flow.provides)
|
286
316
|
self.assertIn(constants.AMPHORA_NETWORK_CONFIG, create_flow.provides)
|
287
317
|
self.assertIn(constants.AMPHORAE_NETWORK_CONFIG, create_flow.provides)
|
318
|
+
self.assertIn(constants.AMPHORAE_STATUS, create_flow.provides)
|
288
319
|
self.assertIn(constants.COMPUTE_ID, create_flow.provides)
|
289
320
|
self.assertIn(constants.COMPUTE_OBJ, create_flow.provides)
|
290
321
|
self.assertIn(constants.DELTAS, create_flow.provides)
|
@@ -296,7 +327,7 @@ class TestLoadBalancerFlows(base.TestCase):
|
|
296
327
|
self.assertIn(constants.ADDITIONAL_VIPS, create_flow.provides)
|
297
328
|
|
298
329
|
self.assertEqual(6, len(create_flow.requires), create_flow.requires)
|
299
|
-
self.assertEqual(
|
330
|
+
self.assertEqual(18, len(create_flow.provides),
|
300
331
|
create_flow.provides)
|
301
332
|
|
302
333
|
def _test_get_failover_LB_flow_single(self, amphorae):
|
@@ -313,6 +344,7 @@ class TestLoadBalancerFlows(base.TestCase):
|
|
313
344
|
self.assertIn(constants.FLAVOR, failover_flow.requires)
|
314
345
|
self.assertIn(constants.LOADBALANCER, failover_flow.requires)
|
315
346
|
self.assertIn(constants.LOADBALANCER_ID, failover_flow.requires)
|
347
|
+
self.assertIn(constants.AMPHORAE_STATUS, failover_flow.requires)
|
316
348
|
|
317
349
|
self.assertIn(constants.UPDATED_PORTS, failover_flow.provides)
|
318
350
|
self.assertIn(constants.AMPHORA, failover_flow.provides)
|
@@ -328,10 +360,13 @@ class TestLoadBalancerFlows(base.TestCase):
|
|
328
360
|
self.assertIn(constants.VIP, failover_flow.provides)
|
329
361
|
self.assertIn(constants.ADDITIONAL_VIPS, failover_flow.provides)
|
330
362
|
self.assertIn(constants.VIP_SG_ID, failover_flow.provides)
|
363
|
+
self.assertIn(constants.AMPHORA_FIREWALL_RULES, failover_flow.provides)
|
364
|
+
self.assertIn(constants.SUBNET, failover_flow.provides)
|
365
|
+
self.assertIn(constants.NEW_AMPHORAE, failover_flow.provides)
|
331
366
|
|
332
|
-
self.assertEqual(
|
367
|
+
self.assertEqual(7, len(failover_flow.requires),
|
333
368
|
failover_flow.requires)
|
334
|
-
self.assertEqual(
|
369
|
+
self.assertEqual(16, len(failover_flow.provides),
|
335
370
|
failover_flow.provides)
|
336
371
|
|
337
372
|
@mock.patch('octavia.common.rpc.NOTIFIER',
|
@@ -389,6 +424,7 @@ class TestLoadBalancerFlows(base.TestCase):
|
|
389
424
|
self.assertIn(constants.FLAVOR, failover_flow.requires)
|
390
425
|
self.assertIn(constants.LOADBALANCER, failover_flow.requires)
|
391
426
|
self.assertIn(constants.LOADBALANCER_ID, failover_flow.requires)
|
427
|
+
self.assertIn(constants.AMPHORAE_STATUS, failover_flow.requires)
|
392
428
|
|
393
429
|
self.assertIn(constants.UPDATED_PORTS, failover_flow.provides)
|
394
430
|
self.assertIn(constants.AMPHORA, failover_flow.provides)
|
@@ -404,10 +440,14 @@ class TestLoadBalancerFlows(base.TestCase):
|
|
404
440
|
self.assertIn(constants.VIP, failover_flow.provides)
|
405
441
|
self.assertIn(constants.ADDITIONAL_VIPS, failover_flow.provides)
|
406
442
|
self.assertIn(constants.VIP_SG_ID, failover_flow.provides)
|
443
|
+
self.assertIn(constants.SUBNET, failover_flow.provides)
|
444
|
+
self.assertIn(constants.AMPHORA_FIREWALL_RULES, failover_flow.provides)
|
445
|
+
self.assertIn(constants.SUBNET, failover_flow.provides)
|
446
|
+
self.assertIn(constants.NEW_AMPHORAE, failover_flow.provides)
|
407
447
|
|
408
|
-
self.assertEqual(
|
448
|
+
self.assertEqual(7, len(failover_flow.requires),
|
409
449
|
failover_flow.requires)
|
410
|
-
self.assertEqual(
|
450
|
+
self.assertEqual(16, len(failover_flow.provides),
|
411
451
|
failover_flow.provides)
|
412
452
|
|
413
453
|
@mock.patch('octavia.common.rpc.NOTIFIER',
|
@@ -132,21 +132,54 @@ class TestAmphoraDriverTasks(base.TestCase):
|
|
132
132
|
|
133
133
|
mock_amphora_repo_get.return_value = _db_amphora_mock
|
134
134
|
mock_lb_get.return_value = _db_load_balancer_mock
|
135
|
+
amphorae_status = {
|
136
|
+
_amphora_mock[constants.ID]: {
|
137
|
+
constants.UNREACHABLE: False
|
138
|
+
}
|
139
|
+
}
|
140
|
+
|
135
141
|
amp_list_update_obj = amphora_driver_tasks.AmphoraIndexListenerUpdate()
|
136
142
|
amp_list_update_obj.execute(_LB_mock, 0, [_amphora_mock],
|
143
|
+
amphorae_status,
|
144
|
+
_amphora_mock[constants.ID],
|
137
145
|
self.timeout_dict)
|
138
146
|
|
139
147
|
mock_driver.update_amphora_listeners.assert_called_once_with(
|
140
148
|
_db_load_balancer_mock, _db_amphora_mock, self.timeout_dict)
|
141
149
|
|
150
|
+
# Unreachable amp
|
151
|
+
mock_driver.reset_mock()
|
152
|
+
amphorae_status = {
|
153
|
+
_amphora_mock[constants.ID]: {
|
154
|
+
constants.UNREACHABLE: True
|
155
|
+
}
|
156
|
+
}
|
157
|
+
amp_list_update_obj.execute(_LB_mock, 0, [_amphora_mock],
|
158
|
+
amphorae_status,
|
159
|
+
_amphora_mock[constants.ID],
|
160
|
+
self.timeout_dict)
|
161
|
+
mock_driver.update_amphora_listeners.assert_not_called()
|
162
|
+
|
163
|
+
# Test exception
|
142
164
|
mock_driver.update_amphora_listeners.side_effect = Exception('boom')
|
143
165
|
|
144
|
-
amp_list_update_obj.execute(_LB_mock, 0,
|
145
|
-
[
|
166
|
+
amp_list_update_obj.execute(_LB_mock, 0, [_amphora_mock], {},
|
167
|
+
_amphora_mock[constants.ID],
|
168
|
+
self.timeout_dict)
|
146
169
|
|
147
170
|
mock_amphora_repo_update.assert_called_once_with(
|
148
171
|
_session_mock, AMP_ID, status=constants.ERROR)
|
149
172
|
|
173
|
+
# Test exception, secondary amp
|
174
|
+
mock_amphora_repo_update.reset_mock()
|
175
|
+
mock_driver.update_amphora_listeners.side_effect = Exception('boom')
|
176
|
+
|
177
|
+
amp_list_update_obj.execute(_LB_mock, 0, [_amphora_mock], {},
|
178
|
+
'1234',
|
179
|
+
self.timeout_dict)
|
180
|
+
|
181
|
+
mock_amphora_repo_update.assert_not_called()
|
182
|
+
|
150
183
|
@mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
|
151
184
|
@mock.patch('octavia.db.api.session')
|
152
185
|
def test_listeners_update(self,
|
@@ -198,39 +231,70 @@ class TestAmphoraDriverTasks(base.TestCase):
|
|
198
231
|
mock_driver, mock_generate_uuid, mock_log, mock_get_session,
|
199
232
|
mock_listener_repo_get, mock_listener_repo_update,
|
200
233
|
mock_amphora_repo_get, mock_amphora_repo_update):
|
201
|
-
amphora_mock = mock.MagicMock()
|
202
234
|
listeners_reload_obj = (
|
203
235
|
amphora_driver_tasks.AmphoraIndexListenersReload())
|
204
236
|
mock_lb = mock.MagicMock()
|
205
237
|
mock_listener = mock.MagicMock()
|
206
238
|
mock_listener.id = '12345'
|
207
|
-
mock_amphora_repo_get.return_value =
|
239
|
+
mock_amphora_repo_get.return_value = _amphora_mock
|
208
240
|
mock_lb_repo_get.return_value = mock_lb
|
209
241
|
mock_driver.reload.side_effect = [mock.DEFAULT, Exception('boom')]
|
210
242
|
|
211
243
|
# Test no listeners
|
212
244
|
mock_lb.listeners = None
|
213
|
-
listeners_reload_obj.execute(mock_lb, 0, None
|
245
|
+
listeners_reload_obj.execute(mock_lb, 0, None, {},
|
246
|
+
_amphora_mock[constants.ID])
|
214
247
|
mock_driver.reload.assert_not_called()
|
215
248
|
|
216
249
|
# Test with listeners
|
217
|
-
|
250
|
+
amphorae_status = {
|
251
|
+
_amphora_mock[constants.ID]: {
|
252
|
+
constants.UNREACHABLE: False
|
253
|
+
}
|
254
|
+
}
|
255
|
+
mock_driver.reload.reset_mock()
|
218
256
|
mock_lb.listeners = [mock_listener]
|
219
|
-
listeners_reload_obj.execute(mock_lb, 0, [
|
257
|
+
listeners_reload_obj.execute(mock_lb, 0, [_amphora_mock],
|
258
|
+
amphorae_status,
|
259
|
+
_amphora_mock[constants.ID],
|
220
260
|
timeout_dict=self.timeout_dict)
|
221
|
-
mock_driver.reload.assert_called_once_with(mock_lb,
|
261
|
+
mock_driver.reload.assert_called_once_with(mock_lb, _amphora_mock,
|
222
262
|
self.timeout_dict)
|
223
263
|
|
264
|
+
# Unreachable amp
|
265
|
+
amphorae_status = {
|
266
|
+
_amphora_mock[constants.ID]: {
|
267
|
+
constants.UNREACHABLE: True
|
268
|
+
}
|
269
|
+
}
|
270
|
+
mock_driver.reload.reset_mock()
|
271
|
+
listeners_reload_obj.execute(mock_lb, 0, [_amphora_mock],
|
272
|
+
amphorae_status,
|
273
|
+
_amphora_mock[constants.ID],
|
274
|
+
timeout_dict=self.timeout_dict)
|
275
|
+
mock_driver.reload.assert_not_called()
|
276
|
+
|
224
277
|
# Test with reload exception
|
225
278
|
mock_driver.reload.reset_mock()
|
226
|
-
listeners_reload_obj.execute(mock_lb, 0, [
|
279
|
+
listeners_reload_obj.execute(mock_lb, 0, [_amphora_mock], {},
|
280
|
+
_amphora_mock[constants.ID],
|
227
281
|
timeout_dict=self.timeout_dict)
|
228
|
-
mock_driver.reload.assert_called_once_with(mock_lb,
|
282
|
+
mock_driver.reload.assert_called_once_with(mock_lb, _amphora_mock,
|
229
283
|
self.timeout_dict)
|
230
284
|
mock_amphora_repo_update.assert_called_once_with(
|
231
|
-
_session_mock,
|
285
|
+
_session_mock, _amphora_mock[constants.ID],
|
232
286
|
status=constants.ERROR)
|
233
287
|
|
288
|
+
# Test with reload exception, secondary amp
|
289
|
+
mock_driver.reload.reset_mock()
|
290
|
+
mock_amphora_repo_update.reset_mock()
|
291
|
+
listeners_reload_obj.execute(mock_lb, 0, [_amphora_mock], {},
|
292
|
+
'1234',
|
293
|
+
timeout_dict=self.timeout_dict)
|
294
|
+
mock_driver.reload.assert_called_once_with(mock_lb, _amphora_mock,
|
295
|
+
self.timeout_dict)
|
296
|
+
mock_amphora_repo_update.assert_not_called()
|
297
|
+
|
234
298
|
@mock.patch('octavia.controller.worker.task_utils.TaskUtils.'
|
235
299
|
'mark_listener_prov_status_error')
|
236
300
|
@mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
|
@@ -827,6 +891,11 @@ class TestAmphoraDriverTasks(base.TestCase):
|
|
827
891
|
FAKE_INTERFACE = 'fake0'
|
828
892
|
mock_driver.get_interface_from_ip.side_effect = [FAKE_INTERFACE,
|
829
893
|
Exception('boom')]
|
894
|
+
amphorae_status = {
|
895
|
+
_amphora_mock[constants.ID]: {
|
896
|
+
constants.UNREACHABLE: False
|
897
|
+
}
|
898
|
+
}
|
830
899
|
|
831
900
|
timeout_dict = {constants.CONN_MAX_RETRIES: CONN_MAX_RETRIES,
|
832
901
|
constants.CONN_RETRY_INTERVAL: CONN_RETRY_INTERVAL}
|
@@ -834,20 +903,39 @@ class TestAmphoraDriverTasks(base.TestCase):
|
|
834
903
|
amphora_update_vrrp_interface_obj = (
|
835
904
|
amphora_driver_tasks.AmphoraIndexUpdateVRRPInterface())
|
836
905
|
amphora_update_vrrp_interface_obj.execute(
|
837
|
-
0, [_amphora_mock],
|
906
|
+
0, [_amphora_mock], amphorae_status, _amphora_mock[constants.ID],
|
907
|
+
timeout_dict)
|
838
908
|
mock_driver.get_interface_from_ip.assert_called_once_with(
|
839
909
|
_db_amphora_mock, _db_amphora_mock.vrrp_ip,
|
840
910
|
timeout_dict=timeout_dict)
|
841
911
|
mock_amphora_repo_update.assert_called_once_with(
|
842
912
|
_session_mock, _db_amphora_mock.id, vrrp_interface=FAKE_INTERFACE)
|
843
913
|
|
914
|
+
# Unreachable amp
|
915
|
+
mock_driver.reset_mock()
|
916
|
+
amphorae_status = {
|
917
|
+
_amphora_mock[constants.ID]: {
|
918
|
+
constants.UNREACHABLE: True
|
919
|
+
}
|
920
|
+
}
|
921
|
+
amphora_update_vrrp_interface_obj.execute(
|
922
|
+
0, [_amphora_mock], amphorae_status, _amphora_mock[constants.ID],
|
923
|
+
timeout_dict)
|
924
|
+
mock_driver.get_interface_from_ip.assert_not_called()
|
925
|
+
|
844
926
|
# Test with an exception
|
845
927
|
mock_amphora_repo_update.reset_mock()
|
846
928
|
amphora_update_vrrp_interface_obj.execute(
|
847
|
-
0, [_amphora_mock], timeout_dict)
|
929
|
+
0, [_amphora_mock], {}, _amphora_mock[constants.ID], timeout_dict)
|
848
930
|
mock_amphora_repo_update.assert_called_once_with(
|
849
931
|
_session_mock, _db_amphora_mock.id, status=constants.ERROR)
|
850
932
|
|
933
|
+
# Test with an exception, secondary amp
|
934
|
+
mock_amphora_repo_update.reset_mock()
|
935
|
+
amphora_update_vrrp_interface_obj.execute(
|
936
|
+
0, [_amphora_mock], {}, '1234', timeout_dict)
|
937
|
+
mock_amphora_repo_update.assert_not_called()
|
938
|
+
|
851
939
|
@mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
|
852
940
|
def test_amphora_vrrp_update(self,
|
853
941
|
mock_lb_get,
|
@@ -895,23 +983,52 @@ class TestAmphoraDriverTasks(base.TestCase):
|
|
895
983
|
Exception('boom')]
|
896
984
|
mock_lb_get.return_value = _db_load_balancer_mock
|
897
985
|
mock_amphora_repo_get.return_value = _db_amphora_mock
|
986
|
+
amphorae_status = {
|
987
|
+
_amphora_mock[constants.ID]: {
|
988
|
+
constants.UNREACHABLE: False
|
989
|
+
}
|
990
|
+
}
|
991
|
+
|
898
992
|
amphora_vrrp_update_obj = (
|
899
993
|
amphora_driver_tasks.AmphoraIndexVRRPUpdate())
|
900
994
|
|
901
995
|
amphora_vrrp_update_obj.execute(LB_ID, amphorae_network_config,
|
902
|
-
0, [_amphora_mock],
|
996
|
+
0, [_amphora_mock], amphorae_status,
|
997
|
+
'fakeint0',
|
998
|
+
_amphora_mock[constants.ID],
|
903
999
|
timeout_dict=self.timeout_dict)
|
904
1000
|
mock_driver.update_vrrp_conf.assert_called_once_with(
|
905
1001
|
_db_load_balancer_mock, amphorae_network_config, _db_amphora_mock,
|
906
1002
|
self.timeout_dict)
|
907
1003
|
|
1004
|
+
# Unreachable amp
|
1005
|
+
amphorae_status = {
|
1006
|
+
_amphora_mock[constants.ID]: {
|
1007
|
+
constants.UNREACHABLE: True
|
1008
|
+
}
|
1009
|
+
}
|
1010
|
+
mock_amphora_repo_update.reset_mock()
|
1011
|
+
mock_driver.update_vrrp_conf.reset_mock()
|
1012
|
+
amphora_vrrp_update_obj.execute(LB_ID, amphorae_network_config,
|
1013
|
+
0, [_amphora_mock], amphorae_status,
|
1014
|
+
None, _amphora_mock[constants.ID])
|
1015
|
+
mock_driver.update_vrrp_conf.assert_not_called()
|
1016
|
+
|
908
1017
|
# Test with an exception
|
909
1018
|
mock_amphora_repo_update.reset_mock()
|
910
1019
|
amphora_vrrp_update_obj.execute(LB_ID, amphorae_network_config,
|
911
|
-
0, [_amphora_mock], 'fakeint0'
|
1020
|
+
0, [_amphora_mock], {}, 'fakeint0',
|
1021
|
+
_amphora_mock[constants.ID])
|
912
1022
|
mock_amphora_repo_update.assert_called_once_with(
|
913
1023
|
_session_mock, _db_amphora_mock.id, status=constants.ERROR)
|
914
1024
|
|
1025
|
+
# Test with an exception, secondary amp
|
1026
|
+
mock_amphora_repo_update.reset_mock()
|
1027
|
+
amphora_vrrp_update_obj.execute(LB_ID, amphorae_network_config,
|
1028
|
+
0, [_amphora_mock], {}, 'fakeint0',
|
1029
|
+
'1234')
|
1030
|
+
mock_amphora_repo_update.assert_not_called()
|
1031
|
+
|
915
1032
|
def test_amphora_vrrp_start(self,
|
916
1033
|
mock_driver,
|
917
1034
|
mock_generate_uuid,
|
@@ -939,25 +1056,54 @@ class TestAmphoraDriverTasks(base.TestCase):
|
|
939
1056
|
mock_amphora_repo_get,
|
940
1057
|
mock_amphora_repo_update):
|
941
1058
|
mock_amphora_repo_get.return_value = _db_amphora_mock
|
1059
|
+
amphorae_status = {
|
1060
|
+
_amphora_mock[constants.ID]: {
|
1061
|
+
constants.UNREACHABLE: False
|
1062
|
+
}
|
1063
|
+
}
|
1064
|
+
|
942
1065
|
amphora_vrrp_start_obj = (
|
943
1066
|
amphora_driver_tasks.AmphoraIndexVRRPStart())
|
944
1067
|
mock_driver.start_vrrp_service.side_effect = [mock.DEFAULT,
|
945
1068
|
Exception('boom')]
|
946
1069
|
|
947
|
-
amphora_vrrp_start_obj.execute(0, [_amphora_mock],
|
1070
|
+
amphora_vrrp_start_obj.execute(0, [_amphora_mock], amphorae_status,
|
1071
|
+
_amphora_mock[constants.ID],
|
948
1072
|
timeout_dict=self.timeout_dict)
|
949
1073
|
mock_driver.start_vrrp_service.assert_called_once_with(
|
950
1074
|
_db_amphora_mock, self.timeout_dict)
|
951
1075
|
|
1076
|
+
# Unreachable amp
|
1077
|
+
mock_driver.start_vrrp_service.reset_mock()
|
1078
|
+
amphorae_status = {
|
1079
|
+
_amphora_mock[constants.ID]: {
|
1080
|
+
constants.UNREACHABLE: True
|
1081
|
+
}
|
1082
|
+
}
|
1083
|
+
amphora_vrrp_start_obj.execute(0, [_amphora_mock], amphorae_status,
|
1084
|
+
_amphora_mock[constants.ID],
|
1085
|
+
timeout_dict=self.timeout_dict)
|
1086
|
+
mock_driver.start_vrrp_service.assert_not_called()
|
1087
|
+
|
952
1088
|
# Test with a start exception
|
953
1089
|
mock_driver.start_vrrp_service.reset_mock()
|
954
|
-
amphora_vrrp_start_obj.execute(0, [_amphora_mock],
|
1090
|
+
amphora_vrrp_start_obj.execute(0, [_amphora_mock], {},
|
1091
|
+
_amphora_mock[constants.ID],
|
955
1092
|
timeout_dict=self.timeout_dict)
|
956
1093
|
mock_driver.start_vrrp_service.assert_called_once_with(
|
957
1094
|
_db_amphora_mock, self.timeout_dict)
|
958
1095
|
mock_amphora_repo_update.assert_called_once_with(
|
959
1096
|
_session_mock, _db_amphora_mock.id, status=constants.ERROR)
|
960
1097
|
|
1098
|
+
# Test with a start exception, secondary amp
|
1099
|
+
mock_driver.start_vrrp_service.reset_mock()
|
1100
|
+
mock_amphora_repo_update.reset_mock()
|
1101
|
+
amphora_vrrp_start_obj.execute(0, [_amphora_mock], {}, '1234',
|
1102
|
+
timeout_dict=self.timeout_dict)
|
1103
|
+
mock_driver.start_vrrp_service.assert_called_once_with(
|
1104
|
+
_db_amphora_mock, self.timeout_dict)
|
1105
|
+
mock_amphora_repo_update.assert_not_called()
|
1106
|
+
|
961
1107
|
def test_amphora_compute_connectivity_wait(self,
|
962
1108
|
mock_driver,
|
963
1109
|
mock_generate_uuid,
|
@@ -1029,3 +1175,105 @@ class TestAmphoraDriverTasks(base.TestCase):
|
|
1029
1175
|
self.assertRaises(driver_except.TimeOutException,
|
1030
1176
|
amp_config_update_obj.execute,
|
1031
1177
|
_amphora_mock, flavor)
|
1178
|
+
|
1179
|
+
def test_amphorae_get_connectivity_status(self,
|
1180
|
+
mock_driver,
|
1181
|
+
mock_generate_uuid,
|
1182
|
+
mock_log,
|
1183
|
+
mock_get_session,
|
1184
|
+
mock_listener_repo_get,
|
1185
|
+
mock_listener_repo_update,
|
1186
|
+
mock_amphora_repo_get,
|
1187
|
+
mock_amphora_repo_update):
|
1188
|
+
amphora1_mock = mock.MagicMock()
|
1189
|
+
amphora1_mock[constants.ID] = 'id1'
|
1190
|
+
amphora2_mock = mock.MagicMock()
|
1191
|
+
amphora2_mock[constants.ID] = 'id2'
|
1192
|
+
db_amphora1_mock = mock.Mock()
|
1193
|
+
db_amphora2_mock = mock.Mock()
|
1194
|
+
|
1195
|
+
amp_get_connectivity_status = (
|
1196
|
+
amphora_driver_tasks.AmphoraeGetConnectivityStatus())
|
1197
|
+
|
1198
|
+
# All amphorae reachable
|
1199
|
+
mock_amphora_repo_get.side_effect = [
|
1200
|
+
db_amphora1_mock,
|
1201
|
+
db_amphora2_mock]
|
1202
|
+
mock_driver.check.return_value = None
|
1203
|
+
|
1204
|
+
ret = amp_get_connectivity_status.execute(
|
1205
|
+
[amphora1_mock, amphora2_mock],
|
1206
|
+
amphora1_mock[constants.ID],
|
1207
|
+
timeout_dict=self.timeout_dict)
|
1208
|
+
mock_driver.check.assert_has_calls(
|
1209
|
+
[mock.call(db_amphora1_mock, timeout_dict=self.timeout_dict),
|
1210
|
+
mock.call(db_amphora2_mock, timeout_dict=self.timeout_dict)])
|
1211
|
+
self.assertFalse(
|
1212
|
+
ret[amphora1_mock[constants.ID]][constants.UNREACHABLE])
|
1213
|
+
self.assertFalse(
|
1214
|
+
ret[amphora2_mock[constants.ID]][constants.UNREACHABLE])
|
1215
|
+
|
1216
|
+
# amphora1 unreachable
|
1217
|
+
mock_driver.check.reset_mock()
|
1218
|
+
mock_amphora_repo_get.side_effect = [
|
1219
|
+
db_amphora1_mock,
|
1220
|
+
db_amphora2_mock]
|
1221
|
+
mock_driver.check.side_effect = [
|
1222
|
+
driver_except.TimeOutException, None]
|
1223
|
+
self.assertRaises(driver_except.TimeOutException,
|
1224
|
+
amp_get_connectivity_status.execute,
|
1225
|
+
[amphora1_mock, amphora2_mock],
|
1226
|
+
amphora1_mock[constants.ID],
|
1227
|
+
timeout_dict=self.timeout_dict)
|
1228
|
+
mock_driver.check.assert_called_with(
|
1229
|
+
db_amphora1_mock, timeout_dict=self.timeout_dict)
|
1230
|
+
|
1231
|
+
# amphora2 unreachable
|
1232
|
+
mock_driver.check.reset_mock()
|
1233
|
+
mock_amphora_repo_get.side_effect = [
|
1234
|
+
db_amphora1_mock,
|
1235
|
+
db_amphora2_mock]
|
1236
|
+
mock_driver.check.side_effect = [
|
1237
|
+
None, driver_except.TimeOutException]
|
1238
|
+
ret = amp_get_connectivity_status.execute(
|
1239
|
+
[amphora1_mock, amphora2_mock],
|
1240
|
+
amphora1_mock[constants.ID],
|
1241
|
+
timeout_dict=self.timeout_dict)
|
1242
|
+
mock_driver.check.assert_has_calls(
|
1243
|
+
[mock.call(db_amphora1_mock, timeout_dict=self.timeout_dict),
|
1244
|
+
mock.call(db_amphora2_mock, timeout_dict=self.timeout_dict)])
|
1245
|
+
self.assertFalse(
|
1246
|
+
ret[amphora1_mock[constants.ID]][constants.UNREACHABLE])
|
1247
|
+
self.assertTrue(
|
1248
|
+
ret[amphora2_mock[constants.ID]][constants.UNREACHABLE])
|
1249
|
+
|
1250
|
+
def test_set_amphora_firewall_rules(self,
|
1251
|
+
mock_driver,
|
1252
|
+
mock_generate_uuid,
|
1253
|
+
mock_log,
|
1254
|
+
mock_get_session,
|
1255
|
+
mock_listener_repo_get,
|
1256
|
+
mock_listener_repo_update,
|
1257
|
+
mock_amphora_repo_get,
|
1258
|
+
mock_amphora_repo_update):
|
1259
|
+
amphora = {constants.ID: AMP_ID, constants.VRRP_IP: '192.0.2.88'}
|
1260
|
+
mock_amphora_repo_get.return_value = _db_amphora_mock
|
1261
|
+
|
1262
|
+
set_amp_fw_rules = amphora_driver_tasks.SetAmphoraFirewallRules()
|
1263
|
+
|
1264
|
+
# Test non-SRIOV VIP path
|
1265
|
+
set_amp_fw_rules.execute([amphora], 0, [{'non-sriov-vip': True}], {},
|
1266
|
+
timeout_dict=None)
|
1267
|
+
|
1268
|
+
mock_get_session.assert_not_called()
|
1269
|
+
mock_driver.set_interface_rules.assert_not_called()
|
1270
|
+
|
1271
|
+
# Test SRIOV VIP path
|
1272
|
+
set_amp_fw_rules.execute([amphora], 0, [{'fake_rule': True}], {},
|
1273
|
+
timeout_dict=None)
|
1274
|
+
|
1275
|
+
mock_amphora_repo_get.assert_called_once_with(_session_mock, id=AMP_ID)
|
1276
|
+
|
1277
|
+
mock_driver.set_interface_rules.assert_called_once_with(
|
1278
|
+
_db_amphora_mock, '192.0.2.88', [{'fake_rule': True}],
|
1279
|
+
timeout_dict=None)
|
@@ -12,6 +12,7 @@
|
|
12
12
|
# License for the specific language governing permissions and limitations
|
13
13
|
# under the License.
|
14
14
|
#
|
15
|
+
import copy
|
15
16
|
import random
|
16
17
|
from unittest import mock
|
17
18
|
|
@@ -24,6 +25,7 @@ from taskflow.types import failure
|
|
24
25
|
from octavia.api.drivers import utils as provider_utils
|
25
26
|
from octavia.common import constants
|
26
27
|
from octavia.common import data_models
|
28
|
+
from octavia.common import exceptions
|
27
29
|
from octavia.common import utils
|
28
30
|
from octavia.controller.worker.v2.tasks import database_tasks
|
29
31
|
from octavia.db import repositories as repo
|
@@ -31,6 +33,7 @@ import octavia.tests.unit.base as base
|
|
31
33
|
|
32
34
|
|
33
35
|
AMP_ID = uuidutils.generate_uuid()
|
36
|
+
AMP2_ID = uuidutils.generate_uuid()
|
34
37
|
COMPUTE_ID = uuidutils.generate_uuid()
|
35
38
|
LB_ID = uuidutils.generate_uuid()
|
36
39
|
SERVER_GROUP_ID = uuidutils.generate_uuid()
|
@@ -1424,7 +1427,7 @@ class TestDatabaseTasks(base.TestCase):
|
|
1424
1427
|
provisioning_status=constants.ERROR)
|
1425
1428
|
])
|
1426
1429
|
self.assertEqual(2, repo.HealthMonitorRepository.update.call_count)
|
1427
|
-
repo.HealthMonitorRepository.update.
|
1430
|
+
repo.HealthMonitorRepository.update.assert_has_calls(
|
1428
1431
|
[mock.call(mock_session, health_monitor.id,
|
1429
1432
|
provisioning_status=constants.ERROR)])
|
1430
1433
|
self.assertEqual(1, repo.L7PolicyRepository.update.call_count)
|
@@ -2987,3 +2990,100 @@ class TestDatabaseTasks(base.TestCase):
|
|
2987
2990
|
mock_session,
|
2988
2991
|
POOL_ID,
|
2989
2992
|
operating_status=constants.ONLINE)
|
2993
|
+
|
2994
|
+
@mock.patch('octavia.common.utils.ip_version')
|
2995
|
+
@mock.patch('octavia.db.api.get_session')
|
2996
|
+
@mock.patch('octavia.db.repositories.ListenerRepository.'
|
2997
|
+
'get_port_protocol_cidr_for_lb')
|
2998
|
+
def test_get_amphora_firewall_rules(self,
|
2999
|
+
mock_get_port_for_lb,
|
3000
|
+
mock_db_get_session,
|
3001
|
+
mock_ip_version,
|
3002
|
+
mock_generate_uuid,
|
3003
|
+
mock_LOG,
|
3004
|
+
mock_get_session,
|
3005
|
+
mock_loadbalancer_repo_update,
|
3006
|
+
mock_listener_repo_update,
|
3007
|
+
mock_amphora_repo_update,
|
3008
|
+
mock_amphora_repo_delete):
|
3009
|
+
|
3010
|
+
amphora_dict = {constants.ID: AMP_ID}
|
3011
|
+
rules = [{'protocol': 'TCP', 'cidr': '192.0.2.0/24', 'port': 80},
|
3012
|
+
{'protocol': 'TCP', 'cidr': '198.51.100.0/24', 'port': 80}]
|
3013
|
+
vrrp_rules = [
|
3014
|
+
{'protocol': 'TCP', 'cidr': '192.0.2.0/24', 'port': 80},
|
3015
|
+
{'protocol': 'TCP', 'cidr': '198.51.100.0/24', 'port': 80},
|
3016
|
+
{'cidr': '203.0.113.5/32', 'port': 112, 'protocol': 'vrrp'}]
|
3017
|
+
mock_get_port_for_lb.side_effect = [
|
3018
|
+
copy.deepcopy(rules), copy.deepcopy(rules), copy.deepcopy(rules),
|
3019
|
+
copy.deepcopy(rules)]
|
3020
|
+
mock_ip_version.side_effect = [4, 6, 55]
|
3021
|
+
|
3022
|
+
get_amp_fw_rules = database_tasks.GetAmphoraFirewallRules()
|
3023
|
+
|
3024
|
+
# Test non-SRIOV VIP
|
3025
|
+
amphora_net_cfg_dict = {
|
3026
|
+
AMP_ID: {constants.AMPHORA: {
|
3027
|
+
'load_balancer': {constants.VIP: {
|
3028
|
+
constants.VNIC_TYPE: constants.VNIC_TYPE_NORMAL}}}}}
|
3029
|
+
result = get_amp_fw_rules.execute([amphora_dict], 0,
|
3030
|
+
amphora_net_cfg_dict)
|
3031
|
+
self.assertEqual([{'non-sriov-vip': True}], result)
|
3032
|
+
|
3033
|
+
# Test SRIOV VIP - Single
|
3034
|
+
amphora_net_cfg_dict = {
|
3035
|
+
AMP_ID: {constants.AMPHORA: {
|
3036
|
+
'load_balancer': {constants.VIP: {
|
3037
|
+
constants.VNIC_TYPE: constants.VNIC_TYPE_DIRECT},
|
3038
|
+
constants.TOPOLOGY: constants.TOPOLOGY_SINGLE},
|
3039
|
+
constants.LOAD_BALANCER_ID: LB_ID}}}
|
3040
|
+
result = get_amp_fw_rules.execute([amphora_dict], 0,
|
3041
|
+
amphora_net_cfg_dict)
|
3042
|
+
mock_get_port_for_lb.assert_called_once_with(mock_db_get_session(),
|
3043
|
+
LB_ID)
|
3044
|
+
self.assertEqual(rules, result)
|
3045
|
+
|
3046
|
+
mock_get_port_for_lb.reset_mock()
|
3047
|
+
|
3048
|
+
# Test SRIOV VIP - Active/Standby
|
3049
|
+
amphora_net_cfg_dict = {
|
3050
|
+
AMP_ID: {constants.AMPHORA: {
|
3051
|
+
'load_balancer': {constants.VIP: {
|
3052
|
+
constants.VNIC_TYPE: constants.VNIC_TYPE_DIRECT},
|
3053
|
+
constants.TOPOLOGY: constants.TOPOLOGY_ACTIVE_STANDBY,
|
3054
|
+
constants.AMPHORAE: [{
|
3055
|
+
constants.ID: AMP_ID,
|
3056
|
+
constants.STATUS: constants.AMPHORA_ALLOCATED},
|
3057
|
+
{constants.ID: AMP2_ID,
|
3058
|
+
constants.STATUS: constants.AMPHORA_ALLOCATED,
|
3059
|
+
constants.VRRP_IP: '203.0.113.5'}]},
|
3060
|
+
constants.LOAD_BALANCER_ID: LB_ID}}}
|
3061
|
+
|
3062
|
+
# IPv4 path
|
3063
|
+
mock_get_port_for_lb.reset_mock()
|
3064
|
+
vrrp_rules = [
|
3065
|
+
{'protocol': 'TCP', 'cidr': '192.0.2.0/24', 'port': 80},
|
3066
|
+
{'protocol': 'TCP', 'cidr': '198.51.100.0/24', 'port': 80},
|
3067
|
+
{'cidr': '203.0.113.5/32', 'port': 112, 'protocol': 'vrrp'}]
|
3068
|
+
result = get_amp_fw_rules.execute([amphora_dict], 0,
|
3069
|
+
amphora_net_cfg_dict)
|
3070
|
+
mock_get_port_for_lb.assert_called_once_with(mock_db_get_session(),
|
3071
|
+
LB_ID)
|
3072
|
+
self.assertEqual(vrrp_rules, result)
|
3073
|
+
|
3074
|
+
# IPv6 path
|
3075
|
+
mock_get_port_for_lb.reset_mock()
|
3076
|
+
vrrp_rules = [
|
3077
|
+
{'protocol': 'TCP', 'cidr': '192.0.2.0/24', 'port': 80},
|
3078
|
+
{'protocol': 'TCP', 'cidr': '198.51.100.0/24', 'port': 80},
|
3079
|
+
{'cidr': '203.0.113.5/128', 'port': 112, 'protocol': 'vrrp'}]
|
3080
|
+
result = get_amp_fw_rules.execute([amphora_dict], 0,
|
3081
|
+
amphora_net_cfg_dict)
|
3082
|
+
mock_get_port_for_lb.assert_called_once_with(mock_db_get_session(),
|
3083
|
+
LB_ID)
|
3084
|
+
self.assertEqual(vrrp_rules, result)
|
3085
|
+
|
3086
|
+
# Bogus IP version path
|
3087
|
+
self.assertRaises(exceptions.InvalidIPAddress,
|
3088
|
+
get_amp_fw_rules.execute, [amphora_dict], 0,
|
3089
|
+
amphora_net_cfg_dict)
|