octavia 13.0.0__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.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/README.rst +6 -1
- {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/diskimage-create.sh +10 -4
- {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/requirements.txt +0 -2
- {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/tox.ini +30 -13
- {octavia-13.0.0.dist-info → octavia-14.0.0.dist-info}/AUTHORS +5 -0
- {octavia-13.0.0.dist-info → octavia-14.0.0.dist-info}/METADATA +6 -6
- {octavia-13.0.0.dist-info → octavia-14.0.0.dist-info}/RECORD +134 -126
- {octavia-13.0.0.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.dist-info/pbr.json +0 -1
- {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/LICENSE +0 -0
- {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/README.rst +0 -0
- {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
- {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
- {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/version.txt +0 -0
- {octavia-13.0.0.data → octavia-14.0.0.data}/scripts/octavia-wsgi +0 -0
- {octavia-13.0.0.dist-info → octavia-14.0.0.dist-info}/LICENSE +0 -0
- {octavia-13.0.0.dist-info → octavia-14.0.0.dist-info}/WHEEL +0 -0
- {octavia-13.0.0.dist-info → octavia-14.0.0.dist-info}/top_level.txt +0 -0
@@ -134,7 +134,7 @@ class TestDatabaseTasksQuota(base.TestCase):
|
|
134
134
|
task.revert(test_object, None)
|
135
135
|
|
136
136
|
mock_check_quota_met.assert_called_once_with(
|
137
|
-
mock_session,
|
137
|
+
mock_session, data_model,
|
138
138
|
project_id)
|
139
139
|
|
140
140
|
mock_session.commit.assert_called_once_with()
|
@@ -238,13 +238,13 @@ class TestDatabaseTasksQuota(base.TestCase):
|
|
238
238
|
|
239
239
|
task.revert(project_id, pool_child_count, None)
|
240
240
|
|
241
|
-
calls = [mock.call(mock_session,
|
241
|
+
calls = [mock.call(mock_session,
|
242
242
|
data_models.Pool, project_id),
|
243
|
-
mock.call(mock_session,
|
243
|
+
mock.call(mock_session,
|
244
244
|
data_models.HealthMonitor, project_id),
|
245
|
-
mock.call(mock_session,
|
245
|
+
mock.call(mock_session,
|
246
246
|
data_models.Member, project_id),
|
247
|
-
mock.call(mock_session,
|
247
|
+
mock.call(mock_session,
|
248
248
|
data_models.Member, project_id)]
|
249
249
|
|
250
250
|
mock_check_quota_met.assert_has_calls(calls)
|
@@ -261,13 +261,13 @@ class TestDatabaseTasksQuota(base.TestCase):
|
|
261
261
|
|
262
262
|
task.revert(project_id, pool_child_count, None)
|
263
263
|
|
264
|
-
calls = [mock.call(mock_session,
|
264
|
+
calls = [mock.call(mock_session,
|
265
265
|
data_models.Pool, project_id),
|
266
|
-
mock.call(mock_session,
|
266
|
+
mock.call(mock_session,
|
267
267
|
data_models.HealthMonitor, project_id),
|
268
|
-
mock.call(mock_session,
|
268
|
+
mock.call(mock_session,
|
269
269
|
data_models.Member, project_id),
|
270
|
-
mock.call(mock_session,
|
270
|
+
mock.call(mock_session,
|
271
271
|
data_models.Member, project_id)]
|
272
272
|
|
273
273
|
mock_check_quota_met.assert_has_calls(calls)
|
@@ -285,13 +285,13 @@ class TestDatabaseTasksQuota(base.TestCase):
|
|
285
285
|
|
286
286
|
task.revert(project_id, pool_child_count, None)
|
287
287
|
|
288
|
-
calls = [mock.call(mock_session,
|
288
|
+
calls = [mock.call(mock_session,
|
289
289
|
data_models.Pool, project_id),
|
290
|
-
mock.call(mock_session,
|
290
|
+
mock.call(mock_session,
|
291
291
|
data_models.HealthMonitor, project_id),
|
292
|
-
mock.call(mock_session,
|
292
|
+
mock.call(mock_session,
|
293
293
|
data_models.Member, project_id),
|
294
|
-
mock.call(mock_session,
|
294
|
+
mock.call(mock_session,
|
295
295
|
data_models.Member, project_id)]
|
296
296
|
|
297
297
|
mock_check_quota_met.assert_has_calls(calls)
|
@@ -370,11 +370,11 @@ class TestDatabaseTasksQuota(base.TestCase):
|
|
370
370
|
|
371
371
|
task.revert(test_object, None)
|
372
372
|
|
373
|
-
calls = [mock.call(mock_session,
|
373
|
+
calls = [mock.call(mock_session,
|
374
374
|
data_models.L7Policy, project_id),
|
375
|
-
mock.call(mock_session,
|
375
|
+
mock.call(mock_session,
|
376
376
|
data_models.L7Rule, project_id),
|
377
|
-
mock.call(mock_session,
|
377
|
+
mock.call(mock_session,
|
378
378
|
data_models.L7Rule, project_id)]
|
379
379
|
|
380
380
|
mock_check_quota_met.assert_has_calls(calls)
|
@@ -391,11 +391,11 @@ class TestDatabaseTasksQuota(base.TestCase):
|
|
391
391
|
|
392
392
|
task.revert(test_object, None)
|
393
393
|
|
394
|
-
calls = [mock.call(mock_session,
|
394
|
+
calls = [mock.call(mock_session,
|
395
395
|
data_models.L7Policy, project_id),
|
396
|
-
mock.call(mock_session,
|
396
|
+
mock.call(mock_session,
|
397
397
|
data_models.L7Rule, project_id),
|
398
|
-
mock.call(mock_session,
|
398
|
+
mock.call(mock_session,
|
399
399
|
data_models.L7Rule, project_id)]
|
400
400
|
|
401
401
|
mock_check_quota_met.assert_has_calls(calls)
|
@@ -1115,36 +1115,6 @@ class TestNetworkTasks(base.TestCase):
|
|
1115
1115
|
net.revert(None, None, None)
|
1116
1116
|
mock_driver.unplug_network.assert_not_called()
|
1117
1117
|
|
1118
|
-
@mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
|
1119
|
-
@mock.patch('octavia.db.api.get_session', return_value=_session_mock)
|
1120
|
-
def test_plug_vip(self, mock_get_session, mock_get_lb,
|
1121
|
-
mock_get_net_driver):
|
1122
|
-
mock_driver = mock.MagicMock()
|
1123
|
-
mock_get_net_driver.return_value = mock_driver
|
1124
|
-
LB.amphorae = AMPS_DATA
|
1125
|
-
mock_get_lb.return_value = LB
|
1126
|
-
LB.amphorae = AMPS_DATA
|
1127
|
-
net = network_tasks.PlugVIP()
|
1128
|
-
amp = mock.MagicMock()
|
1129
|
-
amp.to_dict.return_value = 'vip'
|
1130
|
-
mock_driver.plug_vip.return_value = [amp]
|
1131
|
-
|
1132
|
-
data = net.execute(self.load_balancer_mock)
|
1133
|
-
mock_driver.plug_vip.assert_called_once_with(LB, LB.vip)
|
1134
|
-
self.assertEqual(["vip"], data)
|
1135
|
-
|
1136
|
-
# revert
|
1137
|
-
net.revert([o_data_models.Amphora().to_dict()],
|
1138
|
-
self.load_balancer_mock)
|
1139
|
-
mock_driver.unplug_vip.assert_called_once_with(LB, LB.vip)
|
1140
|
-
|
1141
|
-
# revert with exception
|
1142
|
-
mock_driver.reset_mock()
|
1143
|
-
mock_driver.unplug_vip.side_effect = Exception('UnplugVipException')
|
1144
|
-
net.revert([o_data_models.Amphora().to_dict()],
|
1145
|
-
self.load_balancer_mock)
|
1146
|
-
mock_driver.unplug_vip.assert_called_once_with(LB, LB.vip)
|
1147
|
-
|
1148
1118
|
@mock.patch('octavia.controller.worker.task_utils.TaskUtils.'
|
1149
1119
|
'get_current_loadbalancer_from_db')
|
1150
1120
|
@mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
|
@@ -1434,18 +1404,6 @@ class TestNetworkTasks(base.TestCase):
|
|
1434
1404
|
net_task.execute(self.load_balancer_mock)
|
1435
1405
|
mock_driver.get_network_configs.assert_called_once_with(lb)
|
1436
1406
|
|
1437
|
-
@mock.patch('octavia.db.repositories.AmphoraRepository.get')
|
1438
|
-
@mock.patch('octavia.db.api.get_session', return_value=mock.MagicMock())
|
1439
|
-
def test_failover_preparation_for_amphora(self, mock_session, mock_get,
|
1440
|
-
mock_get_net_driver):
|
1441
|
-
mock_driver = mock.MagicMock()
|
1442
|
-
mock_get.return_value = self.db_amphora_mock
|
1443
|
-
mock_get_net_driver.return_value = mock_driver
|
1444
|
-
failover = network_tasks.FailoverPreparationForAmphora()
|
1445
|
-
failover.execute(self.amphora_mock)
|
1446
|
-
mock_driver.failover_preparation.assert_called_once_with(
|
1447
|
-
self.db_amphora_mock)
|
1448
|
-
|
1449
1407
|
def test_retrieve_portids_on_amphora_except_lb_network(
|
1450
1408
|
self, mock_get_net_driver):
|
1451
1409
|
mock_driver = mock.MagicMock()
|
@@ -1842,3 +1800,108 @@ class TestNetworkTasks(base.TestCase):
|
|
1842
1800
|
self.assertIsNone(result)
|
1843
1801
|
mock_driver.get_security_group.assert_called_once_with(SG_NAME)
|
1844
1802
|
mock_get_sg_name.assert_called_once_with(LB_ID)
|
1803
|
+
|
1804
|
+
@mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
|
1805
|
+
@mock.patch('octavia.db.api.get_session', return_value=_session_mock)
|
1806
|
+
def test_create_SRIOV_base_port(self, mock_get_session, mock_lb_repo_get,
|
1807
|
+
mock_get_net_driver):
|
1808
|
+
AMP_ID = uuidutils.generate_uuid()
|
1809
|
+
LB_ID = uuidutils.generate_uuid()
|
1810
|
+
PORT_ID = uuidutils.generate_uuid()
|
1811
|
+
VIP_NETWORK_ID = uuidutils.generate_uuid()
|
1812
|
+
VIP_QOS_ID = uuidutils.generate_uuid()
|
1813
|
+
VIP_SUBNET_ID = uuidutils.generate_uuid()
|
1814
|
+
VIP_IP_ADDRESS = '203.0.113.81'
|
1815
|
+
VIP_IP_ADDRESS2 = 'fd08::1'
|
1816
|
+
mock_driver = mock.MagicMock()
|
1817
|
+
mock_get_net_driver.return_value = mock_driver
|
1818
|
+
port_mock = mock.MagicMock()
|
1819
|
+
port_mock.id = PORT_ID
|
1820
|
+
subnet_dict = {constants.ID: VIP_SUBNET_ID}
|
1821
|
+
amphora_dict = {constants.ID: AMP_ID}
|
1822
|
+
lb_dict = {constants.LOADBALANCER_ID: LB_ID,
|
1823
|
+
constants.VIP_ADDRESS: VIP_IP_ADDRESS,
|
1824
|
+
constants.VIP_NETWORK_ID: VIP_NETWORK_ID,
|
1825
|
+
constants.VIP_QOS_POLICY_ID: VIP_QOS_ID}
|
1826
|
+
addl_vips = [o_data_models.AdditionalVip(
|
1827
|
+
ip_address=VIP_IP_ADDRESS2)]
|
1828
|
+
lb_mock = mock.MagicMock()
|
1829
|
+
lb_mock.additional_vips = addl_vips
|
1830
|
+
mock_lb_repo_get.return_value = lb_mock
|
1831
|
+
|
1832
|
+
mock_driver.create_port.side_effect = [
|
1833
|
+
port_mock, exceptions.OctaviaException('boom'),
|
1834
|
+
exceptions.OctaviaException('boom'),
|
1835
|
+
exceptions.OctaviaException('boom')]
|
1836
|
+
mock_driver.delete_port.side_effect = [mock.DEFAULT, Exception('boom')]
|
1837
|
+
|
1838
|
+
net_task = network_tasks.CreateSRIOVBasePort()
|
1839
|
+
|
1840
|
+
# Limit the retry attempts for the test run to save time
|
1841
|
+
net_task.execute.retry.stop = tenacity.stop_after_attempt(2)
|
1842
|
+
|
1843
|
+
# Test execute
|
1844
|
+
result = net_task.execute(lb_dict, amphora_dict, subnet_dict)
|
1845
|
+
|
1846
|
+
self.assertEqual(port_mock.to_dict(), result)
|
1847
|
+
mock_driver.create_port.assert_called_once_with(
|
1848
|
+
VIP_NETWORK_ID, name=constants.AMP_BASE_PORT_PREFIX + AMP_ID,
|
1849
|
+
fixed_ips=[{constants.SUBNET_ID: VIP_SUBNET_ID}],
|
1850
|
+
secondary_ips=[VIP_IP_ADDRESS2, VIP_IP_ADDRESS],
|
1851
|
+
qos_policy_id=VIP_QOS_ID, vnic_type=constants.VNIC_TYPE_DIRECT)
|
1852
|
+
|
1853
|
+
# Test execute exception
|
1854
|
+
mock_driver.reset_mock()
|
1855
|
+
|
1856
|
+
self.assertRaises(exceptions.OctaviaException, net_task.execute,
|
1857
|
+
lb_dict, amphora_dict, subnet_dict)
|
1858
|
+
|
1859
|
+
# Test revert when this task failed
|
1860
|
+
mock_driver.reset_mock()
|
1861
|
+
|
1862
|
+
net_task.revert(failure.Failure.from_exception(Exception('boom')),
|
1863
|
+
lb_dict, amphora_dict, subnet_dict)
|
1864
|
+
|
1865
|
+
mock_driver.delete_port.assert_not_called()
|
1866
|
+
|
1867
|
+
# Test revert
|
1868
|
+
mock_driver.reset_mock()
|
1869
|
+
|
1870
|
+
# The execute path generates a port dict, so this will be the result
|
1871
|
+
# passed into the revert method by Taskflow
|
1872
|
+
port_dict = {constants.ID: PORT_ID}
|
1873
|
+
|
1874
|
+
net_task.revert(port_dict, lb_dict, amphora_dict, subnet_dict)
|
1875
|
+
|
1876
|
+
mock_driver.delete_port.assert_called_once_with(PORT_ID)
|
1877
|
+
|
1878
|
+
# Test revert exception
|
1879
|
+
mock_driver.reset_mock()
|
1880
|
+
|
1881
|
+
net_task.revert(port_dict, lb_dict, amphora_dict, subnet_dict)
|
1882
|
+
|
1883
|
+
mock_driver.delete_port.assert_called_once_with(PORT_ID)
|
1884
|
+
|
1885
|
+
def test_build_amp_data(self, mock_get_net_driver):
|
1886
|
+
VIP_ADDRESS = '203.0.113.33'
|
1887
|
+
VIP_PORT_ID = uuidutils.generate_uuid()
|
1888
|
+
lb_dict = {constants.VIP_ADDRESS: VIP_ADDRESS,
|
1889
|
+
constants.VIP_PORT_ID: VIP_PORT_ID}
|
1890
|
+
amphora_dict = {}
|
1891
|
+
BASE_PORT_ID = uuidutils.generate_uuid()
|
1892
|
+
BASE_PORT_IP = '203.0.113.50'
|
1893
|
+
port_data_dict = {
|
1894
|
+
constants.ID: BASE_PORT_ID,
|
1895
|
+
constants.FIXED_IPS: [{constants.IP_ADDRESS: BASE_PORT_IP}]}
|
1896
|
+
|
1897
|
+
expected_amp_data = {constants.HA_IP: VIP_ADDRESS,
|
1898
|
+
constants.HA_PORT_ID: VIP_PORT_ID,
|
1899
|
+
constants.VRRP_ID: 1,
|
1900
|
+
constants.VRRP_PORT_ID: BASE_PORT_ID,
|
1901
|
+
constants.VRRP_IP: BASE_PORT_IP}
|
1902
|
+
|
1903
|
+
net_task = network_tasks.BuildAMPData()
|
1904
|
+
|
1905
|
+
result = net_task.execute(lb_dict, amphora_dict, port_data_dict)
|
1906
|
+
|
1907
|
+
self.assertEqual(expected_amp_data, result)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Copyright 2024 Red Hat
|
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 octavia.common import constants
|
16
|
+
from octavia.controller.worker.v2.tasks import shim_tasks
|
17
|
+
import octavia.tests.unit.base as base
|
18
|
+
|
19
|
+
|
20
|
+
class TestShimTasks(base.TestCase):
|
21
|
+
|
22
|
+
def test_amphora_to_amphorae_with_vrrp_ip(self):
|
23
|
+
|
24
|
+
amp_to_amps = shim_tasks.AmphoraToAmphoraeWithVRRPIP()
|
25
|
+
|
26
|
+
base_port = {constants.FIXED_IPS:
|
27
|
+
[{constants.IP_ADDRESS: '192.0.2.43'}]}
|
28
|
+
amphora = {constants.ID: '123456'}
|
29
|
+
expected_amphora = [{constants.ID: '123456',
|
30
|
+
constants.VRRP_IP: '192.0.2.43'}]
|
31
|
+
|
32
|
+
self.assertEqual(expected_amphora,
|
33
|
+
amp_to_amps.execute(amphora, base_port))
|