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.
Files changed (135) hide show
  1. octavia/amphorae/backends/agent/api_server/lvs_listener_base.py +1 -1
  2. octavia/amphorae/backends/agent/api_server/osutils.py +5 -5
  3. octavia/amphorae/backends/agent/api_server/plug.py +3 -2
  4. octavia/amphorae/backends/agent/api_server/rules_schema.py +52 -0
  5. octavia/amphorae/backends/agent/api_server/server.py +28 -1
  6. octavia/amphorae/backends/utils/interface.py +45 -6
  7. octavia/amphorae/backends/utils/interface_file.py +9 -6
  8. octavia/amphorae/backends/utils/nftable_utils.py +125 -0
  9. octavia/amphorae/drivers/driver_base.py +27 -0
  10. octavia/amphorae/drivers/haproxy/rest_api_driver.py +42 -10
  11. octavia/amphorae/drivers/health/heartbeat_udp.py +2 -2
  12. octavia/amphorae/drivers/keepalived/vrrp_rest_driver.py +2 -1
  13. octavia/amphorae/drivers/noop_driver/driver.py +25 -0
  14. octavia/api/app.py +3 -0
  15. octavia/api/common/pagination.py +2 -2
  16. octavia/api/drivers/amphora_driver/flavor_schema.py +6 -1
  17. octavia/api/root_controller.py +4 -1
  18. octavia/api/v2/controllers/health_monitor.py +0 -1
  19. octavia/api/v2/controllers/l7policy.py +0 -1
  20. octavia/api/v2/controllers/l7rule.py +0 -1
  21. octavia/api/v2/controllers/listener.py +0 -1
  22. octavia/api/v2/controllers/load_balancer.py +13 -7
  23. octavia/api/v2/controllers/member.py +6 -3
  24. octavia/api/v2/controllers/pool.py +6 -7
  25. octavia/api/v2/types/load_balancer.py +5 -1
  26. octavia/api/v2/types/pool.py +1 -1
  27. octavia/certificates/common/pkcs12.py +9 -9
  28. octavia/certificates/manager/barbican.py +24 -16
  29. octavia/certificates/manager/castellan_mgr.py +12 -7
  30. octavia/certificates/manager/local.py +4 -4
  31. octavia/certificates/manager/noop.py +106 -0
  32. octavia/cmd/driver_agent.py +1 -1
  33. octavia/cmd/health_checker.py +0 -4
  34. octavia/cmd/health_manager.py +1 -5
  35. octavia/cmd/house_keeping.py +1 -1
  36. octavia/cmd/interface.py +0 -4
  37. octavia/cmd/octavia_worker.py +0 -4
  38. octavia/cmd/prometheus_proxy.py +0 -5
  39. octavia/cmd/status.py +0 -6
  40. octavia/common/base_taskflow.py +1 -1
  41. octavia/common/clients.py +15 -3
  42. octavia/common/config.py +24 -6
  43. octavia/common/constants.py +34 -0
  44. octavia/common/data_models.py +3 -1
  45. octavia/common/exceptions.py +11 -0
  46. octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 +7 -5
  47. octavia/common/keystone.py +7 -7
  48. octavia/common/tls_utils/cert_parser.py +24 -10
  49. octavia/common/utils.py +6 -0
  50. octavia/common/validate.py +2 -2
  51. octavia/compute/drivers/nova_driver.py +23 -5
  52. octavia/controller/worker/task_utils.py +28 -6
  53. octavia/controller/worker/v2/controller_worker.py +49 -15
  54. octavia/controller/worker/v2/flows/amphora_flows.py +120 -21
  55. octavia/controller/worker/v2/flows/flow_utils.py +15 -13
  56. octavia/controller/worker/v2/flows/listener_flows.py +95 -5
  57. octavia/controller/worker/v2/flows/load_balancer_flows.py +74 -30
  58. octavia/controller/worker/v2/taskflow_jobboard_driver.py +17 -1
  59. octavia/controller/worker/v2/tasks/amphora_driver_tasks.py +145 -24
  60. octavia/controller/worker/v2/tasks/compute_tasks.py +1 -1
  61. octavia/controller/worker/v2/tasks/database_tasks.py +72 -41
  62. octavia/controller/worker/v2/tasks/lifecycle_tasks.py +97 -41
  63. octavia/controller/worker/v2/tasks/network_tasks.py +57 -60
  64. octavia/controller/worker/v2/tasks/shim_tasks.py +28 -0
  65. octavia/db/migration/alembic_migrations/versions/55874a4ceed6_add_l7policy_action_redirect_prefix.py +1 -1
  66. octavia/db/migration/alembic_migrations/versions/5a3ee5472c31_add_cert_expiration__infor_in_amphora_table.py +1 -1
  67. octavia/db/migration/alembic_migrations/versions/6742ca1b27c2_add_l7policy_redirect_http_code.py +1 -1
  68. octavia/db/migration/alembic_migrations/versions/db2a73e82626_add_vnic_type_for_vip.py +36 -0
  69. octavia/db/models.py +1 -0
  70. octavia/db/prepare.py +1 -1
  71. octavia/db/repositories.py +53 -34
  72. octavia/distributor/drivers/driver_base.py +1 -1
  73. octavia/network/base.py +3 -16
  74. octavia/network/data_models.py +4 -1
  75. octavia/network/drivers/neutron/allowed_address_pairs.py +27 -26
  76. octavia/network/drivers/noop_driver/driver.py +10 -23
  77. octavia/tests/common/sample_certs.py +115 -0
  78. octavia/tests/common/sample_haproxy_prometheus +1 -1
  79. octavia/tests/functional/amphorae/backend/agent/api_server/test_server.py +37 -0
  80. octavia/tests/functional/api/test_healthcheck.py +2 -2
  81. octavia/tests/functional/api/v2/base.py +1 -1
  82. octavia/tests/functional/api/v2/test_listener.py +45 -0
  83. octavia/tests/functional/api/v2/test_load_balancer.py +17 -0
  84. octavia/tests/functional/db/base.py +9 -0
  85. octavia/tests/functional/db/test_models.py +2 -1
  86. octavia/tests/functional/db/test_repositories.py +55 -99
  87. octavia/tests/unit/amphorae/backends/agent/api_server/test_osutils.py +4 -2
  88. octavia/tests/unit/amphorae/backends/utils/test_interface.py +201 -1
  89. octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py +1 -1
  90. octavia/tests/unit/amphorae/backends/utils/test_nftable_utils.py +194 -0
  91. octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver.py +27 -5
  92. octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver_1_0.py +15 -2
  93. octavia/tests/unit/amphorae/drivers/keepalived/test_vrrp_rest_driver.py +17 -0
  94. octavia/tests/unit/amphorae/drivers/noop_driver/test_driver.py +2 -1
  95. octavia/tests/unit/api/v2/types/test_pool.py +71 -0
  96. octavia/tests/unit/certificates/manager/test_barbican.py +3 -3
  97. octavia/tests/unit/certificates/manager/test_noop.py +53 -0
  98. octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py +16 -17
  99. octavia/tests/unit/common/sample_configs/sample_configs_combined.py +5 -3
  100. octavia/tests/unit/common/test_config.py +35 -0
  101. octavia/tests/unit/common/test_keystone.py +32 -0
  102. octavia/tests/unit/common/test_utils.py +39 -0
  103. octavia/tests/unit/compute/drivers/test_nova_driver.py +22 -0
  104. octavia/tests/unit/controller/worker/test_task_utils.py +58 -2
  105. octavia/tests/unit/controller/worker/v2/flows/test_amphora_flows.py +28 -5
  106. octavia/tests/unit/controller/worker/v2/flows/test_listener_flows.py +64 -16
  107. octavia/tests/unit/controller/worker/v2/flows/test_load_balancer_flows.py +49 -9
  108. octavia/tests/unit/controller/worker/v2/tasks/test_amphora_driver_tasks.py +265 -17
  109. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py +101 -1
  110. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks_quota.py +19 -19
  111. octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py +105 -42
  112. octavia/tests/unit/controller/worker/v2/tasks/test_shim_tasks.py +33 -0
  113. octavia/tests/unit/controller/worker/v2/test_controller_worker.py +85 -42
  114. octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py +48 -51
  115. octavia/tests/unit/network/drivers/neutron/test_utils.py +2 -0
  116. octavia/tests/unit/network/drivers/noop_driver/test_driver.py +0 -7
  117. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/README.rst +6 -1
  118. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/diskimage-create.sh +10 -4
  119. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/requirements.txt +0 -2
  120. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/tox.ini +30 -13
  121. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/AUTHORS +5 -0
  122. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/METADATA +6 -6
  123. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/RECORD +134 -126
  124. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/entry_points.txt +1 -1
  125. octavia-14.0.0.dist-info/pbr.json +1 -0
  126. octavia-13.0.0.0rc1.dist-info/pbr.json +0 -1
  127. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/LICENSE +0 -0
  128. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/README.rst +0 -0
  129. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
  130. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
  131. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/version.txt +0 -0
  132. {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/scripts/octavia-wsgi +0 -0
  133. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/LICENSE +0 -0
  134. {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/WHEEL +0 -0
  135. {octavia-13.0.0.0rc1.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, mock_session, data_model,
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, mock_session,
241
+ calls = [mock.call(mock_session,
242
242
  data_models.Pool, project_id),
243
- mock.call(mock_session, mock_session,
243
+ mock.call(mock_session,
244
244
  data_models.HealthMonitor, project_id),
245
- mock.call(mock_session, mock_session,
245
+ mock.call(mock_session,
246
246
  data_models.Member, project_id),
247
- mock.call(mock_session, 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, mock_session,
264
+ calls = [mock.call(mock_session,
265
265
  data_models.Pool, project_id),
266
- mock.call(mock_session, mock_session,
266
+ mock.call(mock_session,
267
267
  data_models.HealthMonitor, project_id),
268
- mock.call(mock_session, mock_session,
268
+ mock.call(mock_session,
269
269
  data_models.Member, project_id),
270
- mock.call(mock_session, 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, mock_session,
288
+ calls = [mock.call(mock_session,
289
289
  data_models.Pool, project_id),
290
- mock.call(mock_session, mock_session,
290
+ mock.call(mock_session,
291
291
  data_models.HealthMonitor, project_id),
292
- mock.call(mock_session, mock_session,
292
+ mock.call(mock_session,
293
293
  data_models.Member, project_id),
294
- mock.call(mock_session, 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, mock_session,
373
+ calls = [mock.call(mock_session,
374
374
  data_models.L7Policy, project_id),
375
- mock.call(mock_session, mock_session,
375
+ mock.call(mock_session,
376
376
  data_models.L7Rule, project_id),
377
- mock.call(mock_session, 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, mock_session,
394
+ calls = [mock.call(mock_session,
395
395
  data_models.L7Policy, project_id),
396
- mock.call(mock_session, mock_session,
396
+ mock.call(mock_session,
397
397
  data_models.L7Rule, project_id),
398
- mock.call(mock_session, 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))