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
@@ -1044,6 +1044,51 @@ class TestListener(base.BaseAPITest):
|
|
1044
1044
|
self.assertEqual(constants.CLIENT_AUTH_NONE,
|
1045
1045
|
listener_api.get('client_authentication'))
|
1046
1046
|
|
1047
|
+
def test_create_tls_with_no_subject_no_alt_names(self):
|
1048
|
+
tls_cert_mock = mock.MagicMock()
|
1049
|
+
tls_cert_mock.get_certificate.return_value = (
|
1050
|
+
sample_certs.NOCN_NOSUBALT_CRT)
|
1051
|
+
self.cert_manager_mock().get_cert.return_value = tls_cert_mock
|
1052
|
+
|
1053
|
+
lb_listener = {'name': 'listener1-no-subject-no-alt-names',
|
1054
|
+
'default_pool_id': None,
|
1055
|
+
'description': 'desc1',
|
1056
|
+
'admin_state_up': False,
|
1057
|
+
'protocol': constants.PROTOCOL_TERMINATED_HTTPS,
|
1058
|
+
'protocol_port': 80, 'connection_limit': 10,
|
1059
|
+
'default_tls_container_ref': uuidutils.generate_uuid(),
|
1060
|
+
'insert_headers': {},
|
1061
|
+
'project_id': self.project_id,
|
1062
|
+
'loadbalancer_id': self.lb_id,
|
1063
|
+
'tags': ['test_tag']}
|
1064
|
+
body = self._build_body(lb_listener)
|
1065
|
+
response = self.post(self.LISTENERS_PATH, body, status=400)
|
1066
|
+
self.assertIn("No CN or DNSName", response)
|
1067
|
+
|
1068
|
+
def test_create_tls_with_no_subject_with_alt_names(self):
|
1069
|
+
tls_cert_mock = mock.MagicMock()
|
1070
|
+
tls_cert_mock.get_certificate.return_value = (
|
1071
|
+
sample_certs.NOCN_SUBALT_CRT)
|
1072
|
+
tls_cert_mock.get_private_key.return_value = (
|
1073
|
+
sample_certs.NOCN_SUBALT_KEY)
|
1074
|
+
tls_cert_mock.get_private_key_passphrase.return_value = None
|
1075
|
+
self.cert_manager_mock().get_cert.return_value = tls_cert_mock
|
1076
|
+
|
1077
|
+
lb_listener = {'name': 'listener1-no-subject',
|
1078
|
+
'default_pool_id': None,
|
1079
|
+
'description': 'desc1',
|
1080
|
+
'admin_state_up': False,
|
1081
|
+
'protocol': constants.PROTOCOL_TERMINATED_HTTPS,
|
1082
|
+
'protocol_port': 80, 'connection_limit': 10,
|
1083
|
+
'default_tls_container_ref': uuidutils.generate_uuid(),
|
1084
|
+
'insert_headers': {},
|
1085
|
+
'project_id': self.project_id,
|
1086
|
+
'loadbalancer_id': self.lb_id,
|
1087
|
+
'tags': ['test_tag']}
|
1088
|
+
body = self._build_body(lb_listener)
|
1089
|
+
response = self.post(self.LISTENERS_PATH, body, status=201)
|
1090
|
+
self.assertIn("PENDING_CREATE", response)
|
1091
|
+
|
1047
1092
|
def test_create_with_ca_cert_and_option(self):
|
1048
1093
|
self.cert_manager_mock().get_secret.return_value = (
|
1049
1094
|
sample_certs.X509_CA_CERT)
|
@@ -913,6 +913,38 @@ class TestMember(base.BaseAPITest):
|
|
913
913
|
m_subnet_exists.assert_called_once_with(
|
914
914
|
member1['subnet_id'], context=mock.ANY)
|
915
915
|
|
916
|
+
@mock.patch('octavia.api.drivers.driver_factory.get_driver')
|
917
|
+
@mock.patch('octavia.api.drivers.utils.call_provider')
|
918
|
+
def test_update_members_member_duplicate(
|
919
|
+
self, mock_provider, mock_get_driver):
|
920
|
+
mock_driver = mock.MagicMock()
|
921
|
+
mock_driver.name = 'noop_driver'
|
922
|
+
mock_get_driver.return_value = mock_driver
|
923
|
+
subnet_id = uuidutils.generate_uuid()
|
924
|
+
|
925
|
+
member1 = {'address': '192.0.2.1', 'protocol_port': 80,
|
926
|
+
'project_id': self.project_id, 'subnet_id': subnet_id}
|
927
|
+
|
928
|
+
req_dict = [member1]
|
929
|
+
body = {self.root_tag_list: req_dict}
|
930
|
+
path = self.MEMBERS_PATH.format(pool_id=self.pool_id)
|
931
|
+
self.put(path, body, status=202)
|
932
|
+
|
933
|
+
self.set_lb_status(self.lb_id)
|
934
|
+
|
935
|
+
# Same member (same address and protocol_port) updated twice in the
|
936
|
+
# same PUT request
|
937
|
+
member1 = {'address': '192.0.2.1', 'protocol_port': 80,
|
938
|
+
'project_id': self.project_id, 'subnet_id': subnet_id,
|
939
|
+
'name': 'member1'}
|
940
|
+
member2 = {'address': '192.0.2.1', 'protocol_port': 80,
|
941
|
+
'project_id': self.project_id, 'subnet_id': subnet_id,
|
942
|
+
'name': 'member2'}
|
943
|
+
|
944
|
+
req_dict = [member1, member2]
|
945
|
+
body = {self.root_tag_list: req_dict}
|
946
|
+
self.put(path, body, status=400)
|
947
|
+
|
916
948
|
@mock.patch('octavia.api.drivers.driver_factory.get_driver')
|
917
949
|
@mock.patch('octavia.api.drivers.utils.call_provider')
|
918
950
|
def test_update_members_subnet_not_found(
|
@@ -30,6 +30,8 @@ from octavia.tests import fixtures as oc_fixtures
|
|
30
30
|
|
31
31
|
class OctaviaDBTestBase(test_base.BaseTestCase):
|
32
32
|
|
33
|
+
facade = None
|
34
|
+
|
33
35
|
def setUp(self, connection_string='sqlite://'):
|
34
36
|
super().setUp()
|
35
37
|
|
@@ -73,11 +75,18 @@ class OctaviaDBTestBase(test_base.BaseTestCase):
|
|
73
75
|
sqlite_fk=True)
|
74
76
|
engine = facade.get_engine()
|
75
77
|
session = facade.get_session(expire_on_commit=True)
|
78
|
+
self.facade = facade
|
76
79
|
else:
|
77
80
|
engine = db_api.get_engine()
|
78
81
|
session = db_api.get_session()
|
79
82
|
return engine, session
|
80
83
|
|
84
|
+
def get_session(self):
|
85
|
+
if 'sqlite:///' in self.connection_string:
|
86
|
+
return self.facade.get_session(expire_on_commit=True)
|
87
|
+
else:
|
88
|
+
return db_api.get_session()
|
89
|
+
|
81
90
|
def _seed_lookup_tables(self, session):
|
82
91
|
self._seed_lookup_table(
|
83
92
|
session, constants.SUPPORTED_PROVISIONING_STATUSES,
|