octavia 13.0.0__py3-none-any.whl → 13.0.1__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/keepalivedlvs.py +9 -0
- octavia/amphorae/backends/agent/api_server/osutils.py +1 -2
- octavia/amphorae/backends/agent/api_server/util.py +35 -2
- octavia/amphorae/backends/utils/interface.py +4 -5
- octavia/amphorae/drivers/driver_base.py +16 -0
- octavia/amphorae/drivers/haproxy/rest_api_driver.py +13 -8
- octavia/amphorae/drivers/keepalived/jinja/jinja_cfg.py +0 -1
- octavia/amphorae/drivers/keepalived/jinja/templates/keepalived_base.template +0 -1
- octavia/amphorae/drivers/keepalived/vrrp_rest_driver.py +2 -1
- octavia/amphorae/drivers/noop_driver/driver.py +3 -0
- octavia/api/common/pagination.py +1 -1
- octavia/api/v2/controllers/health_monitor.py +3 -2
- 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 +18 -5
- octavia/api/v2/controllers/pool.py +6 -7
- 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/noop.py +106 -0
- octavia/common/clients.py +22 -4
- octavia/common/config.py +21 -5
- octavia/common/constants.py +4 -0
- octavia/common/exceptions.py +6 -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 +23 -9
- octavia/controller/worker/task_utils.py +28 -6
- octavia/controller/worker/v2/controller_worker.py +2 -2
- octavia/controller/worker/v2/flows/amphora_flows.py +41 -10
- octavia/controller/worker/v2/flows/flow_utils.py +6 -4
- octavia/controller/worker/v2/flows/load_balancer_flows.py +17 -3
- octavia/controller/worker/v2/tasks/amphora_driver_tasks.py +114 -23
- octavia/controller/worker/v2/tasks/database_tasks.py +36 -47
- octavia/controller/worker/v2/tasks/lifecycle_tasks.py +96 -40
- octavia/controller/worker/v2/tasks/network_tasks.py +12 -13
- octavia/db/base_models.py +16 -4
- octavia/db/repositories.py +34 -33
- octavia/network/drivers/neutron/allowed_address_pairs.py +10 -8
- octavia/network/drivers/noop_driver/driver.py +1 -2
- octavia/tests/common/sample_certs.py +115 -0
- octavia/tests/functional/api/v2/base.py +1 -1
- octavia/tests/functional/api/v2/test_health_monitor.py +18 -0
- octavia/tests/functional/api/v2/test_listener.py +45 -0
- octavia/tests/functional/api/v2/test_member.py +32 -0
- octavia/tests/functional/db/base.py +9 -0
- octavia/tests/functional/db/test_repositories.py +45 -98
- octavia/tests/unit/amphorae/backends/agent/api_server/test_util.py +89 -1
- octavia/tests/unit/amphorae/backends/utils/test_interface.py +3 -1
- octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver.py +3 -3
- octavia/tests/unit/amphorae/drivers/keepalived/jinja/test_jinja_cfg.py +0 -4
- octavia/tests/unit/amphorae/drivers/keepalived/test_vrrp_rest_driver.py +17 -0
- octavia/tests/unit/api/common/test_pagination.py +78 -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/cmd/test_prometheus_proxy.py +8 -1
- octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py +16 -17
- octavia/tests/unit/common/test_config.py +35 -0
- octavia/tests/unit/common/test_keystone.py +32 -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_load_balancer_flows.py +10 -5
- octavia/tests/unit/controller/worker/v2/tasks/test_amphora_driver_tasks.py +234 -17
- octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py +28 -6
- 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 +57 -2
- octavia/tests/unit/controller/worker/v2/test_controller_worker.py +56 -1
- octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py +24 -1
- {octavia-13.0.0.dist-info → octavia-13.0.1.dist-info}/AUTHORS +8 -0
- octavia-13.0.1.dist-info/METADATA +155 -0
- {octavia-13.0.0.dist-info → octavia-13.0.1.dist-info}/RECORD +90 -88
- {octavia-13.0.0.dist-info → octavia-13.0.1.dist-info}/WHEEL +1 -1
- {octavia-13.0.0.dist-info → octavia-13.0.1.dist-info}/entry_points.txt +1 -1
- octavia-13.0.1.dist-info/pbr.json +1 -0
- octavia-13.0.0.dist-info/METADATA +0 -158
- octavia-13.0.0.dist-info/pbr.json +0 -1
- {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/LICENSE +0 -0
- {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/README.rst +0 -0
- {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/diskimage-create/README.rst +0 -0
- {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/diskimage-create/diskimage-create.sh +0 -0
- {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
- {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/diskimage-create/requirements.txt +0 -0
- {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
- {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/diskimage-create/tox.ini +0 -0
- {octavia-13.0.0.data → octavia-13.0.1.data}/data/share/octavia/diskimage-create/version.txt +0 -0
- {octavia-13.0.0.data → octavia-13.0.1.data}/scripts/octavia-wsgi +0 -0
- {octavia-13.0.0.dist-info → octavia-13.0.1.dist-info}/LICENSE +0 -0
- {octavia-13.0.0.dist-info → octavia-13.0.1.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)
|
@@ -1568,6 +1568,57 @@ class TestNetworkTasks(base.TestCase):
|
|
1568
1568
|
mock_driver.unplug_aap_port.assert_called_once_with(
|
1569
1569
|
LB.vip, self.db_amphora_mock, mockSubnet)
|
1570
1570
|
|
1571
|
+
@mock.patch('octavia.db.repositories.AmphoraRepository.get')
|
1572
|
+
@mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
|
1573
|
+
@mock.patch('octavia.db.api.get_session', return_value=_session_mock)
|
1574
|
+
def test_revert_plug_vip_amphora_subnet_not_found(
|
1575
|
+
self, mock_session, mock_lb_get, mock_get, mock_get_net_driver):
|
1576
|
+
mock_driver = mock.MagicMock()
|
1577
|
+
mock_lb_get.return_value = LB
|
1578
|
+
mock_get.return_value = self.db_amphora_mock
|
1579
|
+
mock_get_net_driver.return_value = mock_driver
|
1580
|
+
net = network_tasks.PlugVIPAmphora()
|
1581
|
+
amphora = {constants.ID: AMPHORA_ID,
|
1582
|
+
constants.LB_NETWORK_IP: IP_ADDRESS}
|
1583
|
+
subnet = {constants.ID: SUBNET_ID}
|
1584
|
+
err_msg = 'Subnet not found'
|
1585
|
+
mock_driver.get_subnet.side_effect = net_base.SubnetNotFound(err_msg)
|
1586
|
+
result = AMPS_DATA[0].to_dict()
|
1587
|
+
net.revert(result, self.load_balancer_mock, amphora, subnet)
|
1588
|
+
mock_driver.unplug_aap_port.assert_not_called()
|
1589
|
+
network_tasks.LOG.error.assert_called_once_with(
|
1590
|
+
'Failed to unplug AAP port for load balancer: %s. '
|
1591
|
+
'Resources may still be in use for VRRP port: %s. '
|
1592
|
+
'Due to error: %s',
|
1593
|
+
self.load_balancer_mock[constants.LOADBALANCER_ID],
|
1594
|
+
result[constants.VRRP_PORT_ID], err_msg
|
1595
|
+
)
|
1596
|
+
|
1597
|
+
@mock.patch('octavia.db.repositories.AmphoraRepository.get')
|
1598
|
+
@mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
|
1599
|
+
@mock.patch('octavia.db.api.get_session', return_value=_session_mock)
|
1600
|
+
def test_revert_plug_vip_amphora_raise_db_error(
|
1601
|
+
self, mock_session, mock_lb_get, mock_get, mock_get_net_driver):
|
1602
|
+
mock_driver = mock.MagicMock()
|
1603
|
+
mock_lb_get.return_value = LB
|
1604
|
+
err_msg = 'Some Error'
|
1605
|
+
mock_get.side_effect = Exception(err_msg)
|
1606
|
+
net = network_tasks.PlugVIPAmphora()
|
1607
|
+
amphora = {constants.ID: AMPHORA_ID,
|
1608
|
+
constants.LB_NETWORK_IP: IP_ADDRESS}
|
1609
|
+
subnet = {constants.ID: SUBNET_ID}
|
1610
|
+
result = AMPS_DATA[0].to_dict()
|
1611
|
+
net.revert(result, self.load_balancer_mock, amphora, subnet)
|
1612
|
+
mock_driver.unplug_aap_port.assert_not_called()
|
1613
|
+
mock_lb_get.assert_not_called()
|
1614
|
+
network_tasks.LOG.error.assert_called_once_with(
|
1615
|
+
'Failed to unplug AAP port for load balancer: %s. '
|
1616
|
+
'Resources may still be in use for VRRP port: %s. '
|
1617
|
+
'Due to error: %s',
|
1618
|
+
self.load_balancer_mock[constants.LOADBALANCER_ID],
|
1619
|
+
result[constants.VRRP_PORT_ID], err_msg
|
1620
|
+
)
|
1621
|
+
|
1571
1622
|
@mock.patch('octavia.controller.worker.v2.tasks.network_tasks.DeletePort.'
|
1572
1623
|
'update_progress')
|
1573
1624
|
def test_delete_port(self, mock_update_progress, mock_get_net_driver):
|
@@ -1712,7 +1763,11 @@ class TestNetworkTasks(base.TestCase):
|
|
1712
1763
|
# Test revert
|
1713
1764
|
mock_driver.reset_mock()
|
1714
1765
|
|
1715
|
-
|
1766
|
+
# The execute path generates a port dict, so this will be the result
|
1767
|
+
# passed into the revert method by Taskflow
|
1768
|
+
port_dict = {constants.ID: PORT_ID}
|
1769
|
+
|
1770
|
+
net_task.revert(port_dict, vip_dict, VIP_SG_ID, AMP_ID,
|
1716
1771
|
additional_vips)
|
1717
1772
|
|
1718
1773
|
mock_driver.delete_port.assert_called_once_with(PORT_ID)
|
@@ -1720,7 +1775,7 @@ class TestNetworkTasks(base.TestCase):
|
|
1720
1775
|
# Test revert exception
|
1721
1776
|
mock_driver.reset_mock()
|
1722
1777
|
|
1723
|
-
net_task.revert(
|
1778
|
+
net_task.revert(port_dict, vip_dict, VIP_SG_ID, AMP_ID,
|
1724
1779
|
additional_vips)
|
1725
1780
|
|
1726
1781
|
mock_driver.delete_port.assert_called_once_with(PORT_ID)
|
@@ -27,7 +27,7 @@ from octavia.controller.worker.v2 import controller_worker
|
|
27
27
|
from octavia.controller.worker.v2.flows import flow_utils
|
28
28
|
import octavia.tests.unit.base as base
|
29
29
|
|
30
|
-
|
30
|
+
TLS_CERT_ID = uuidutils.generate_uuid()
|
31
31
|
AMP_ID = uuidutils.generate_uuid()
|
32
32
|
LB_ID = uuidutils.generate_uuid()
|
33
33
|
LISTENER_ID = uuidutils.generate_uuid()
|
@@ -771,6 +771,61 @@ class TestControllerWorker(base.TestCase):
|
|
771
771
|
})
|
772
772
|
)
|
773
773
|
|
774
|
+
@mock.patch(
|
775
|
+
"octavia.common.tls_utils.cert_parser.load_certificates_data",
|
776
|
+
side_effect=RuntimeError
|
777
|
+
)
|
778
|
+
def test_delete_load_balancer_with_cascade_tls_unavailable(
|
779
|
+
self,
|
780
|
+
mock_load_tls_cert,
|
781
|
+
mock_api_get_session,
|
782
|
+
mock_dyn_log_listener,
|
783
|
+
mock_taskflow_load,
|
784
|
+
mock_pool_repo_get,
|
785
|
+
mock_member_repo_get,
|
786
|
+
mock_l7rule_repo_get,
|
787
|
+
mock_l7policy_repo_get,
|
788
|
+
mock_listener_repo_get,
|
789
|
+
mock_lb_repo_get,
|
790
|
+
mock_health_mon_repo_get,
|
791
|
+
mock_amp_repo_get
|
792
|
+
):
|
793
|
+
_flow_mock.reset_mock()
|
794
|
+
|
795
|
+
_listener_mock.tls_certificate_id = TLS_CERT_ID
|
796
|
+
_listener_mock.to_dict.return_value[
|
797
|
+
constants.TLS_CERTIFICATE_ID] = TLS_CERT_ID
|
798
|
+
|
799
|
+
cw = controller_worker.ControllerWorker()
|
800
|
+
cw.delete_load_balancer(_load_balancer_mock, cascade=True)
|
801
|
+
|
802
|
+
mock_lb_repo_get.assert_called_once_with(
|
803
|
+
_db_session,
|
804
|
+
id=LB_ID)
|
805
|
+
|
806
|
+
# Check load_certificates_data called and error is raised
|
807
|
+
# Error must be ignored because it is not critical for current flow
|
808
|
+
mock_load_tls_cert.assert_called_once()
|
809
|
+
|
810
|
+
listener_list = [{constants.LISTENER_ID: LISTENER_ID,
|
811
|
+
constants.LOADBALANCER_ID: LB_ID,
|
812
|
+
constants.PROJECT_ID: PROJECT_ID,
|
813
|
+
"default_tls_container_ref": TLS_CERT_ID}]
|
814
|
+
|
815
|
+
(cw.services_controller.run_poster.
|
816
|
+
assert_called_once_with(
|
817
|
+
flow_utils.get_cascade_delete_load_balancer_flow,
|
818
|
+
_load_balancer_mock, listener_list, [],
|
819
|
+
store={constants.LOADBALANCER: _load_balancer_mock,
|
820
|
+
constants.LOADBALANCER_ID: LB_ID,
|
821
|
+
constants.SERVER_GROUP_ID:
|
822
|
+
_db_load_balancer_mock.server_group_id,
|
823
|
+
constants.PROJECT_ID: _db_load_balancer_mock.project_id,
|
824
|
+
})
|
825
|
+
)
|
826
|
+
|
827
|
+
_listener_mock.reset_mock()
|
828
|
+
|
774
829
|
@mock.patch('octavia.db.repositories.ListenerRepository.get_all',
|
775
830
|
return_value=([_listener_mock], None))
|
776
831
|
def test_update_load_balancer(self,
|
@@ -122,6 +122,28 @@ class TestAllowedAddressPairsDriver(base.TestCase):
|
|
122
122
|
delete_port.assert_has_calls(calls, any_order=True)
|
123
123
|
delete_sec_grp.assert_called_once_with(sec_grp_id)
|
124
124
|
|
125
|
+
def test_deallocate_vip_no_vrrp_port(self):
|
126
|
+
lb = dmh.generate_load_balancer_tree()
|
127
|
+
lb.vip.load_balancer = lb
|
128
|
+
# amphora 0 doesn't have a vrrp_port_id
|
129
|
+
lb.amphorae[0].vrrp_port_id = None
|
130
|
+
vip = lb.vip
|
131
|
+
sec_grp_id = 'lb-sec-grp1'
|
132
|
+
show_port = self.driver.network_proxy.get_port
|
133
|
+
show_port.return_value = Port(
|
134
|
+
device_owner=allowed_address_pairs.OCTAVIA_OWNER)
|
135
|
+
delete_port = self.driver.network_proxy.delete_port
|
136
|
+
delete_sec_grp = self.driver.network_proxy.delete_security_group
|
137
|
+
list_security_groups = self.driver.network_proxy.find_security_group
|
138
|
+
list_security_groups.return_value = SecurityGroup(id=sec_grp_id)
|
139
|
+
self.driver.deallocate_vip(vip)
|
140
|
+
# not called for lb.amphorae[0]
|
141
|
+
calls = [mock.call(vip.port_id),
|
142
|
+
mock.call(lb.amphorae[1].vrrp_port_id)]
|
143
|
+
delete_port.assert_has_calls(calls, any_order=True)
|
144
|
+
self.assertEqual(2, delete_port.call_count)
|
145
|
+
delete_sec_grp.assert_called_once_with(sec_grp_id)
|
146
|
+
|
125
147
|
def test_deallocate_vip_no_port(self):
|
126
148
|
lb = dmh.generate_load_balancer_tree()
|
127
149
|
lb.vip.load_balancer = lb
|
@@ -1076,7 +1098,8 @@ class TestAllowedAddressPairsDriver(base.TestCase):
|
|
1076
1098
|
fake_rules = [
|
1077
1099
|
{'id': 'rule-80', 'port_range_max': 80, 'protocol': 'tcp',
|
1078
1100
|
'remote_ip_prefix': '10.0.101.0/24'},
|
1079
|
-
{'id': 'rule-22', 'port_range_max': 22, 'protocol': 'tcp'}
|
1101
|
+
{'id': 'rule-22', 'port_range_max': 22, 'protocol': 'tcp'},
|
1102
|
+
{'id': 'rule-None', 'port_range_max': 22},
|
1080
1103
|
]
|
1081
1104
|
list_rules = self.driver.network_proxy.security_group_rules
|
1082
1105
|
list_rules.return_value = fake_rules
|
@@ -69,6 +69,7 @@ Elena Ezhova <eezhova@mirantis.com>
|
|
69
69
|
EranRaichstein <eranra@il.ibm.com>
|
70
70
|
Erik Olof Gunnar Andersson <eandersson@blizzard.com>
|
71
71
|
Evan Gray <evanscottgray@gmail.com>
|
72
|
+
Evgeniy Bykov <chypakabre@gmail.com>
|
72
73
|
Evgeny Fedoruk <evgenyf@radware.com>
|
73
74
|
Fei Long Wang <flwang@catalyst.net.nz>
|
74
75
|
Fernando Royo <froyo@redhat.com>
|
@@ -101,6 +102,7 @@ Hongbin Lu <hongbin.lu@huawei.com>
|
|
101
102
|
Ian Wienand <iwienand@redhat.com>
|
102
103
|
Ihar Hrachyshka <ihrachys@redhat.com>
|
103
104
|
Ildar Iskhakov <iiskhako@cisco.com>
|
105
|
+
Ilia Kerbs <ikerbs@protonmail.com>
|
104
106
|
Itzik Brown <itzikb@redhat.com>
|
105
107
|
Jacky Hu <hudayou@hotmail.com>
|
106
108
|
James Arendt <james.arendt@hp.com>
|
@@ -159,6 +161,7 @@ Nakul Dahiwade <nakul.dahiwade@intel.com>
|
|
159
161
|
Nam Nguyen Hoai <namnh@vn.fujitsu.com>
|
160
162
|
Ngo Quoc Cuong <cuongnq@vn.fujitsu.com>
|
161
163
|
Nguyen Hai <nguyentrihai93@gmail.com>
|
164
|
+
Nguyen Ngoc Hieu <hieunn23@fpt.com>
|
162
165
|
Nguyen Van Trung <trungnv@vn.fujitsu.com>
|
163
166
|
Nir Magnezi <nmagnezi@redhat.com>
|
164
167
|
Noboru Iwamatsu <n_iwamatsu@jp.fujitsu.com>
|
@@ -185,6 +188,8 @@ Santhosh Fernandes <santhosh.fernandes@gmail.com>
|
|
185
188
|
Sean McGinnis <sean.mcginnis@gmail.com>
|
186
189
|
Selvakumar S <selvakumar.s2@hp.com>
|
187
190
|
Sergey Belous <sbelous@mirantis.com>
|
191
|
+
Sergey Kraynev <sergejyit@gmail.com>
|
192
|
+
Seunghun Lee <seunghun@stackhpc.com>
|
188
193
|
ShangXiao <shangxiaobj@inspur.com>
|
189
194
|
Shashank Kumar Shankar <shashank.kumar.shankar@intel.com>
|
190
195
|
Sherif Abdelwahab <sherif.abdelwahab@hp.com>
|
@@ -198,6 +203,7 @@ Stephen Balukoff <stephen@balukoff.com>
|
|
198
203
|
Stephen Finucane <stephenfin@redhat.com>
|
199
204
|
Susanne Balle <sleipnir012@gmail.com>
|
200
205
|
Sven Wegener <sven.wegener@inovex.de>
|
206
|
+
Takashi Kajinami <kajinamit@oss.nttdata.com>
|
201
207
|
Takashi Kajinami <tkajinam@redhat.com>
|
202
208
|
Takashi Natsume <takanattie@gmail.com>
|
203
209
|
Tatsuma Matsuki <matsuki.tatsuma@jp.fujitsu.com>
|
@@ -214,6 +220,7 @@ Tuan Do Anh <tuanda@vn.fujitsu.com>
|
|
214
220
|
Vadim Ponomarev <velizarx@gmail.com>
|
215
221
|
Valeria Perelman <perelman@il.ibm.com>
|
216
222
|
Van Hung Pham <hungpv@vn.fujitsu.com>
|
223
|
+
Vasyl Saienko <vsaienko@mirantis.com>
|
217
224
|
Vieri <15050873171@163.com>
|
218
225
|
Vlad Gusev <vlad.esten@gmail.com>
|
219
226
|
Vu Cong Tuan <tuanvc@vn.fujitsu.com>
|
@@ -276,6 +283,7 @@ ptoohill1 <phillip.toohill@rackspace.com>
|
|
276
283
|
qinchunhua <qin.chunhua@zte.com.cn>
|
277
284
|
rajat29 <rajat.sharma@nectechnologies.in>
|
278
285
|
ramboman <lijie@unitedstack.com>
|
286
|
+
ricolin <rlin@vexxhost.com>
|
279
287
|
root <liusu@chinac.com>
|
280
288
|
root <sandyada@redhat.com>
|
281
289
|
sapd <saphi070@gmail.com>
|
@@ -0,0 +1,155 @@
|
|
1
|
+
Metadata-Version: 2.1
|
2
|
+
Name: octavia
|
3
|
+
Version: 13.0.1
|
4
|
+
Summary: OpenStack Octavia Scalable Load Balancer as a Service
|
5
|
+
Home-page: https://docs.openstack.org/octavia/latest/
|
6
|
+
Author: OpenStack
|
7
|
+
Author-email: openstack-discuss@lists.openstack.org
|
8
|
+
Classifier: Development Status :: 5 - Production/Stable
|
9
|
+
Classifier: Environment :: OpenStack
|
10
|
+
Classifier: Intended Audience :: Developers
|
11
|
+
Classifier: Intended Audience :: Information Technology
|
12
|
+
Classifier: Intended Audience :: System Administrators
|
13
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
14
|
+
Classifier: Operating System :: POSIX :: Linux
|
15
|
+
Classifier: Programming Language :: Python
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
17
|
+
Classifier: Programming Language :: Python :: 3.8
|
18
|
+
Classifier: Programming Language :: Python :: 3.9
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
20
|
+
Requires-Python: >=3.8
|
21
|
+
License-File: LICENSE
|
22
|
+
License-File: AUTHORS
|
23
|
+
Requires-Dist: alembic >=0.9.6
|
24
|
+
Requires-Dist: cotyledon >=1.3.0
|
25
|
+
Requires-Dist: pecan >=1.3.2
|
26
|
+
Requires-Dist: pbr >=3.1.1
|
27
|
+
Requires-Dist: SQLAlchemy >=1.2.19
|
28
|
+
Requires-Dist: SQLAlchemy-Utils >=0.30.11
|
29
|
+
Requires-Dist: futurist >=1.2.0
|
30
|
+
Requires-Dist: requests >=2.23.0
|
31
|
+
Requires-Dist: rfc3986 >=1.2.0
|
32
|
+
Requires-Dist: keystoneauth1 >=3.4.0
|
33
|
+
Requires-Dist: keystonemiddleware >=9.5.0
|
34
|
+
Requires-Dist: WebOb >=1.8.2
|
35
|
+
Requires-Dist: stevedore >=1.20.0
|
36
|
+
Requires-Dist: openstacksdk >=0.103.0
|
37
|
+
Requires-Dist: oslo.config >=6.8.0
|
38
|
+
Requires-Dist: oslo.context >=2.22.0
|
39
|
+
Requires-Dist: oslo.db[mysql] >=8.4.0
|
40
|
+
Requires-Dist: oslo.i18n >=3.20.0
|
41
|
+
Requires-Dist: oslo.log >=4.3.0
|
42
|
+
Requires-Dist: oslo.messaging >=14.1.0
|
43
|
+
Requires-Dist: oslo.middleware >=4.0.1
|
44
|
+
Requires-Dist: oslo.policy >=3.7.0
|
45
|
+
Requires-Dist: oslo.reports >=1.18.0
|
46
|
+
Requires-Dist: oslo.serialization >=2.28.1
|
47
|
+
Requires-Dist: oslo.upgradecheck >=1.3.0
|
48
|
+
Requires-Dist: oslo.utils >=4.7.0
|
49
|
+
Requires-Dist: psutil >=5.7.1
|
50
|
+
Requires-Dist: pyasn1 !=0.2.3,>=0.1.8
|
51
|
+
Requires-Dist: pyasn1-modules >=0.0.6
|
52
|
+
Requires-Dist: python-barbicanclient >=4.5.2
|
53
|
+
Requires-Dist: python-glanceclient >=2.8.0
|
54
|
+
Requires-Dist: python-novaclient >=9.1.0
|
55
|
+
Requires-Dist: python-cinderclient >=3.3.0
|
56
|
+
Requires-Dist: WSME >=0.8.0
|
57
|
+
Requires-Dist: Jinja2 >=2.10
|
58
|
+
Requires-Dist: taskflow >=4.4.0
|
59
|
+
Requires-Dist: castellan >=0.16.0
|
60
|
+
Requires-Dist: tenacity >=5.0.4
|
61
|
+
Requires-Dist: distro >=1.2.0
|
62
|
+
Requires-Dist: jsonschema >=3.2.0
|
63
|
+
Requires-Dist: octavia-lib >=3.3.0
|
64
|
+
Requires-Dist: simplejson >=3.13.2
|
65
|
+
Requires-Dist: setproctitle >=1.1.10
|
66
|
+
Requires-Dist: python-dateutil >=2.7.0
|
67
|
+
Requires-Dist: Flask !=0.11,>=0.10
|
68
|
+
Requires-Dist: cryptography >=3.0
|
69
|
+
Requires-Dist: gunicorn >=19.9.0
|
70
|
+
Requires-Dist: Werkzeug >=0.14.1
|
71
|
+
Requires-Dist: pyroute2 >=0.5.14 ; (sys_platform!='win32')
|
72
|
+
Provides-Extra: redis
|
73
|
+
Requires-Dist: redis >=2.10.0 ; extra == 'redis'
|
74
|
+
Provides-Extra: test
|
75
|
+
Requires-Dist: hacking <6.1.0 ; extra == 'test'
|
76
|
+
Requires-Dist: requests-mock >=1.2.0 ; extra == 'test'
|
77
|
+
Requires-Dist: coverage !=4.4,>=4.0 ; extra == 'test'
|
78
|
+
Requires-Dist: fixtures >=3.0.0 ; extra == 'test'
|
79
|
+
Requires-Dist: flake8-import-order ==0.12 ; extra == 'test'
|
80
|
+
Requires-Dist: python-subunit >=1.0.0 ; extra == 'test'
|
81
|
+
Requires-Dist: oslotest >=3.2.0 ; extra == 'test'
|
82
|
+
Requires-Dist: pylint <=3.0.4,>=2.5.3 ; extra == 'test'
|
83
|
+
Requires-Dist: testrepository >=0.0.18 ; extra == 'test'
|
84
|
+
Requires-Dist: testtools >=2.2.0 ; extra == 'test'
|
85
|
+
Requires-Dist: testresources >=2.0.0 ; extra == 'test'
|
86
|
+
Requires-Dist: testscenarios >=0.4 ; extra == 'test'
|
87
|
+
Requires-Dist: doc8 >=0.6.0 ; extra == 'test'
|
88
|
+
Requires-Dist: bandit !=1.6.0,>=1.1.0 ; extra == 'test'
|
89
|
+
Requires-Dist: tempest >=23.0.0 ; extra == 'test'
|
90
|
+
Requires-Dist: sphinx !=2.1.0,>=2.0.0 ; extra == 'test'
|
91
|
+
Requires-Dist: bashate >=0.5.1 ; extra == 'test'
|
92
|
+
Requires-Dist: WebTest >=2.0.26 ; extra == 'test'
|
93
|
+
Provides-Extra: zookeeper
|
94
|
+
Requires-Dist: kazoo >=2.6.0 ; extra == 'zookeeper'
|
95
|
+
Requires-Dist: zake >=0.1.6 ; extra == 'zookeeper'
|
96
|
+
|
97
|
+
========================
|
98
|
+
Team and repository tags
|
99
|
+
========================
|
100
|
+
|
101
|
+
.. image:: https://governance.openstack.org/tc/badges/octavia.svg
|
102
|
+
:target: https://governance.openstack.org/tc/reference/tags/index.html
|
103
|
+
|
104
|
+
.. Change things from this point on
|
105
|
+
|
106
|
+
=======
|
107
|
+
Octavia
|
108
|
+
=======
|
109
|
+
|
110
|
+
.. image:: https://img.shields.io/pypi/v/octavia.svg
|
111
|
+
:target: https://pypi.org/project/octavia/
|
112
|
+
:alt: Latest Version
|
113
|
+
|
114
|
+
Octavia is an operator-grade open source scalable load balancer for use in
|
115
|
+
large OpenStack deployments.
|
116
|
+
|
117
|
+
Octavia provides the load balancing API for OpenStack. It supports multiple
|
118
|
+
"provider drivers" that implement load balancing, including the "amphora"
|
119
|
+
reference driver included with Octavia.
|
120
|
+
|
121
|
+
Octavia is distributed under the terms of the Apache License, Version 2.0.
|
122
|
+
The full terms and conditions of this license are detailed in the LICENSE
|
123
|
+
file.
|
124
|
+
|
125
|
+
Project resources
|
126
|
+
~~~~~~~~~~~~~~~~~
|
127
|
+
|
128
|
+
Developer documentation for the Octavia project is available at
|
129
|
+
https://docs.openstack.org/octavia/latest/
|
130
|
+
|
131
|
+
Release notes for the Octavia project are available at
|
132
|
+
https://docs.openstack.org/releasenotes/octavia/
|
133
|
+
|
134
|
+
The project source code repository is located at
|
135
|
+
https://opendev.org/openstack/octavia
|
136
|
+
|
137
|
+
Project status, bugs, and requests for feature enhancements are tracked on
|
138
|
+
https://launchpad.net/octavia
|
139
|
+
|
140
|
+
For more information on project direction and guiding principles for
|
141
|
+
contributors, please see the CONSTITUTION.rst file in this directory, or
|
142
|
+
specifications in the specs/ sub-directory.
|
143
|
+
|
144
|
+
The project roadmap is available at
|
145
|
+
https://wiki.openstack.org/wiki/Octavia/Roadmap
|
146
|
+
|
147
|
+
External Resources
|
148
|
+
~~~~~~~~~~~~~~~~~~
|
149
|
+
|
150
|
+
* Octavia Wiki: https://wiki.openstack.org/wiki/Octavia
|
151
|
+
|
152
|
+
* For help on usage and hacking of Octavia, please send an email to
|
153
|
+
OpenStack-dev Mailing List <mailto:openstack-discuss@lists.openstack.org>
|
154
|
+
with **[Octavia]** tag.
|
155
|
+
|