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
@@ -24,6 +24,7 @@ from oslo_config import fixture as oslo_fixture
|
|
24
24
|
from oslo_serialization import jsonutils
|
25
25
|
from oslo_utils.secretutils import md5
|
26
26
|
from oslo_utils import uuidutils
|
27
|
+
import webob
|
27
28
|
|
28
29
|
from octavia.amphorae.backends.agent import api_server
|
29
30
|
from octavia.amphorae.backends.agent.api_server import certificate_update
|
@@ -3055,3 +3056,39 @@ class TestServerTestCase(base.TestCase):
|
|
3055
3056
|
self.assertEqual(200, rv.status_code)
|
3056
3057
|
self.assertEqual(expected_dict,
|
3057
3058
|
jsonutils.loads(rv.data.decode('utf-8')))
|
3059
|
+
|
3060
|
+
@mock.patch('octavia.amphorae.backends.utils.nftable_utils.'
|
3061
|
+
'load_nftables_file')
|
3062
|
+
@mock.patch('octavia.amphorae.backends.utils.nftable_utils.'
|
3063
|
+
'write_nftable_vip_rules_file')
|
3064
|
+
@mock.patch('octavia.amphorae.backends.agent.api_server.amphora_info.'
|
3065
|
+
'AmphoraInfo.get_interface')
|
3066
|
+
def test_set_interface_rules(self, mock_get_int, mock_write_rules,
|
3067
|
+
mock_load_rules):
|
3068
|
+
mock_get_int.side_effect = [
|
3069
|
+
webob.Response(status=400),
|
3070
|
+
webob.Response(status=200, json={'interface': 'fake1'}),
|
3071
|
+
webob.Response(status=200, json={'interface': 'fake1'})]
|
3072
|
+
|
3073
|
+
# Test can't find interface
|
3074
|
+
rv = self.ubuntu_app.put('/' + api_server.VERSION +
|
3075
|
+
'/interface/192.0.2.10/rules', data='fake')
|
3076
|
+
self.assertEqual(400, rv.status_code)
|
3077
|
+
mock_write_rules.assert_not_called()
|
3078
|
+
|
3079
|
+
# Test schema validation failure
|
3080
|
+
rv = self.ubuntu_app.put('/' + api_server.VERSION +
|
3081
|
+
'/interface/192.0.2.10/rules', data='fake')
|
3082
|
+
self.assertEqual('400 Bad Request', rv.status)
|
3083
|
+
|
3084
|
+
# Test successful path
|
3085
|
+
rules_json = ('[{"protocol":"TCP","cidr":"192.0.2.0/24","port":8080},'
|
3086
|
+
'{"protocol":"UDP","cidr":null,"port":80}]')
|
3087
|
+
rv = self.ubuntu_app.put('/' + api_server.VERSION +
|
3088
|
+
'/interface/192.0.2.10/rules',
|
3089
|
+
data=rules_json,
|
3090
|
+
content_type='application/json')
|
3091
|
+
self.assertEqual('200 OK', rv.status)
|
3092
|
+
mock_write_rules.assert_called_once_with('fake1',
|
3093
|
+
jsonutils.loads(rules_json))
|
3094
|
+
mock_load_rules.assert_called_once()
|
@@ -111,7 +111,7 @@ class TestHealthCheck(base_db_test.OctaviaDBTestBase):
|
|
111
111
|
self.assertEqual(200, response.status_code)
|
112
112
|
self.assertEqual('OK', response.text)
|
113
113
|
|
114
|
-
# Note: For whatever reason, detailed=True text has no
|
114
|
+
# Note: For whatever reason, detailed=True text has no additional info
|
115
115
|
def test_healthcheck_get_text_detailed(self):
|
116
116
|
self.conf.config(group='healthcheck', detailed=True)
|
117
117
|
response = self._get(self._get_enabled_app(), '/healthcheck')
|
@@ -275,7 +275,7 @@ class TestHealthCheck(base_db_test.OctaviaDBTestBase):
|
|
275
275
|
self.assertIn('boom', response.text)
|
276
276
|
self.assertIn('Garbage collector', response.text)
|
277
277
|
|
278
|
-
# Note: For whatever reason, detailed=True text has no
|
278
|
+
# Note: For whatever reason, detailed=True text has no additional info
|
279
279
|
@mock.patch('octavia.db.api.get_session')
|
280
280
|
def test_healthcheck_get_text_detailed_failed(self, mock_get_session):
|
281
281
|
self.conf.config(group='healthcheck', detailed=True)
|
@@ -140,7 +140,7 @@ class BaseAPITest(base_db_test.OctaviaDBTestBase):
|
|
140
140
|
self.addCleanup(reset_pecan)
|
141
141
|
|
142
142
|
def start_quota_mock(self, object_type):
|
143
|
-
def mock_quota(session,
|
143
|
+
def mock_quota(session, _class, project_id, count=1):
|
144
144
|
return _class == object_type
|
145
145
|
check_quota_met_true_mock = mock.patch(
|
146
146
|
'octavia.db.repositories.Repositories.check_quota_met',
|
@@ -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)
|
@@ -2829,6 +2829,7 @@ class TestLoadBalancerGraph(base.BaseAPITest):
|
|
2829
2829
|
'flavor_id': None,
|
2830
2830
|
'provider': 'noop_driver',
|
2831
2831
|
'tags': [],
|
2832
|
+
'vip_vnic_type': constants.VNIC_TYPE_NORMAL,
|
2832
2833
|
}
|
2833
2834
|
expected_lb.update(create_lb)
|
2834
2835
|
expected_lb['listeners'] = expected_listeners
|
@@ -3194,6 +3195,22 @@ class TestLoadBalancerGraph(base.BaseAPITest):
|
|
3194
3195
|
self.assertIn('All VIP subnets must belong to the same network.',
|
3195
3196
|
error_text)
|
3196
3197
|
|
3198
|
+
@mock.patch('octavia.api.v2.controllers.load_balancer.'
|
3199
|
+
'LoadBalancersController._apply_flavor_to_lb_dict',
|
3200
|
+
return_value={constants.SRIOV_VIP: True})
|
3201
|
+
def test_with_vip_vnic_type_direct(self, mock_flavor_dict):
|
3202
|
+
create_lb, expected_lb = self._get_lb_bodies(
|
3203
|
+
[], [])
|
3204
|
+
expected_lb[constants.VIP_VNIC_TYPE] = constants.VNIC_TYPE_DIRECT
|
3205
|
+
|
3206
|
+
body = self._build_body(create_lb)
|
3207
|
+
|
3208
|
+
response = self.post(self.LBS_PATH, body)
|
3209
|
+
self._assert_graphs_equal(expected_lb, response.json['loadbalancer'])
|
3210
|
+
|
3211
|
+
api_lb = response.json.get(self.root_tag)
|
3212
|
+
self._assert_graphs_equal(expected_lb, api_lb)
|
3213
|
+
|
3197
3214
|
def test_with_one_listener(self):
|
3198
3215
|
create_listener, expected_listener = self._get_listener_bodies()
|
3199
3216
|
create_lb, expected_lb = self._get_lb_bodies([create_listener],
|
@@ -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,
|
@@ -622,7 +622,8 @@ class VipModelTest(base.OctaviaDBTestBase, ModelTestMixin):
|
|
622
622
|
self.assertEqual(f"Vip(ip_address=None, "
|
623
623
|
f"load_balancer_id={obj.load_balancer_id!r}, "
|
624
624
|
f"network_id=None, octavia_owned=None, port_id=None, "
|
625
|
-
f"qos_policy_id=None, subnet_id=None
|
625
|
+
f"qos_policy_id=None, subnet_id=None, "
|
626
|
+
f"vnic_type=None)", str(obj))
|
626
627
|
|
627
628
|
def test_update(self):
|
628
629
|
vip = self.create_vip(self.session, self.load_balancer.id)
|