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.
- 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.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/README.rst +6 -1
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/diskimage-create.sh +10 -4
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/requirements.txt +0 -2
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/tox.ini +30 -13
- {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/AUTHORS +5 -0
- {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/METADATA +6 -6
- {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/RECORD +134 -126
- {octavia-13.0.0.0rc1.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.0rc1.dist-info/pbr.json +0 -1
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/LICENSE +0 -0
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/README.rst +0 -0
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/version.txt +0 -0
- {octavia-13.0.0.0rc1.data → octavia-14.0.0.data}/scripts/octavia-wsgi +0 -0
- {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/LICENSE +0 -0
- {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/WHEEL +0 -0
- {octavia-13.0.0.0rc1.dist-info → octavia-14.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
2
|
+
# not use this file except in compliance with the License. You may obtain
|
3
|
+
# a copy of the License at
|
4
|
+
#
|
5
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
6
|
+
#
|
7
|
+
# Unless required by applicable law or agreed to in writing, software
|
8
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
9
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
10
|
+
# License for the specific language governing permissions and limitations
|
11
|
+
# under the License.
|
12
|
+
|
13
|
+
"""Add vnic_type for VIP
|
14
|
+
|
15
|
+
Revision ID: db2a73e82626
|
16
|
+
Revises: 632152d2d32e
|
17
|
+
Create Date: 2023-11-09 21:57:05.302435
|
18
|
+
|
19
|
+
"""
|
20
|
+
|
21
|
+
from alembic import op
|
22
|
+
import sqlalchemy as sa
|
23
|
+
|
24
|
+
from octavia.common import constants
|
25
|
+
|
26
|
+
# revision identifiers, used by Alembic.
|
27
|
+
revision = 'db2a73e82626'
|
28
|
+
down_revision = '632152d2d32e'
|
29
|
+
|
30
|
+
|
31
|
+
def upgrade():
|
32
|
+
op.add_column(
|
33
|
+
u'vip',
|
34
|
+
sa.Column(u'vnic_type', sa.String(64), nullable=False,
|
35
|
+
server_default=constants.VNIC_TYPE_NORMAL)
|
36
|
+
)
|
octavia/db/models.py
CHANGED
@@ -506,6 +506,7 @@ class Vip(base_models.BASE):
|
|
506
506
|
network_id = sa.Column(sa.String(36), nullable=True)
|
507
507
|
qos_policy_id = sa.Column(sa.String(36), nullable=True)
|
508
508
|
octavia_owned = sa.Column(sa.Boolean(), nullable=True)
|
509
|
+
vnic_type = sa.Column(sa.String(64), nullable=True)
|
509
510
|
|
510
511
|
|
511
512
|
class AdditionalVip(base_models.BASE):
|
octavia/db/prepare.py
CHANGED
@@ -31,7 +31,7 @@ def create_load_balancer(lb_dict):
|
|
31
31
|
lb_dict[constants.PROVISIONING_STATUS] = constants.PENDING_CREATE
|
32
32
|
lb_dict[constants.OPERATING_STATUS] = constants.OFFLINE
|
33
33
|
|
34
|
-
# Set defaults later possibly
|
34
|
+
# Set defaults later possibly overridden by flavors later
|
35
35
|
lb_dict['topology'] = CONF.controller_worker.loadbalancer_topology
|
36
36
|
|
37
37
|
return lb_dict
|
octavia/db/repositories.py
CHANGED
@@ -39,7 +39,9 @@ from sqlalchemy import update
|
|
39
39
|
from octavia.common import constants as consts
|
40
40
|
from octavia.common import data_models
|
41
41
|
from octavia.common import exceptions
|
42
|
+
from octavia.common import utils
|
42
43
|
from octavia.common import validate
|
44
|
+
from octavia.db import api as db_api
|
43
45
|
from octavia.db import models
|
44
46
|
|
45
47
|
CONF = cfg.CONF
|
@@ -364,8 +366,7 @@ class Repositories(object):
|
|
364
366
|
provisioning_status=lb_prov_status)
|
365
367
|
return success
|
366
368
|
|
367
|
-
def check_quota_met(self, session
|
368
|
-
count=1):
|
369
|
+
def check_quota_met(self, session: Session, _class, project_id, count=1):
|
369
370
|
"""Checks and updates object quotas.
|
370
371
|
|
371
372
|
This method makes sure the project has available quota
|
@@ -373,7 +374,6 @@ class Repositories(object):
|
|
373
374
|
new ussage.
|
374
375
|
|
375
376
|
:param session: Context database session
|
376
|
-
:param lock_session: Locking database session (autocommit=False)
|
377
377
|
:param _class: Data model object requesting quota
|
378
378
|
:param project_id: Project ID requesting quota
|
379
379
|
:param count: Number of objects we're going to create (default=1)
|
@@ -390,19 +390,14 @@ class Repositories(object):
|
|
390
390
|
if not project_id:
|
391
391
|
raise exceptions.MissingProjectID()
|
392
392
|
|
393
|
-
|
394
|
-
|
395
|
-
# Make sure we have a record to lock
|
396
|
-
self.quotas.update(
|
397
|
-
session,
|
398
|
-
project_id,
|
399
|
-
quota={})
|
393
|
+
self.quotas.ensure_project_exists(project_id)
|
394
|
+
|
400
395
|
# Lock the project record in the database to block other quota checks
|
401
396
|
#
|
402
397
|
# Note: You cannot just use the current count as the in-use
|
403
398
|
# value as we don't want to lock the whole resource table
|
404
399
|
try:
|
405
|
-
quotas = (
|
400
|
+
quotas = (session.query(models.Quotas)
|
406
401
|
.filter_by(project_id=project_id)
|
407
402
|
.populate_existing()
|
408
403
|
.with_for_update()
|
@@ -1091,6 +1086,23 @@ class ListenerRepository(BaseRepository):
|
|
1091
1086
|
update({self.model_class.provisioning_status: consts.ACTIVE},
|
1092
1087
|
synchronize_session='fetch'))
|
1093
1088
|
|
1089
|
+
def get_port_protocol_cidr_for_lb(self, session, loadbalancer_id):
|
1090
|
+
# readability variables
|
1091
|
+
Listener = self.model_class
|
1092
|
+
ListenerCidr = models.ListenerCidr
|
1093
|
+
|
1094
|
+
stmt = (select(Listener.protocol,
|
1095
|
+
ListenerCidr.cidr,
|
1096
|
+
Listener.protocol_port.label(consts.PORT))
|
1097
|
+
.select_from(Listener)
|
1098
|
+
.join(models.ListenerCidr,
|
1099
|
+
Listener.id == ListenerCidr.listener_id, isouter=True)
|
1100
|
+
.where(Listener.load_balancer_id == loadbalancer_id))
|
1101
|
+
rows = session.execute(stmt)
|
1102
|
+
|
1103
|
+
return [utils.map_protocol_to_nftable_protocol(u._asdict()) for u
|
1104
|
+
in rows.all()]
|
1105
|
+
|
1094
1106
|
|
1095
1107
|
class ListenerStatisticsRepository(BaseRepository):
|
1096
1108
|
model_class = models.ListenerStatistics
|
@@ -1244,23 +1256,22 @@ class AmphoraRepository(BaseRepository):
|
|
1244
1256
|
:param amphora_id: The amphora id to list the load balancers from
|
1245
1257
|
:returns: [octavia.common.data_model]
|
1246
1258
|
"""
|
1247
|
-
|
1248
|
-
|
1249
|
-
|
1250
|
-
|
1251
|
-
|
1252
|
-
|
1253
|
-
|
1254
|
-
|
1255
|
-
|
1256
|
-
|
1257
|
-
|
1258
|
-
|
1259
|
-
|
1260
|
-
|
1261
|
-
|
1262
|
-
|
1263
|
-
return None
|
1259
|
+
db_lb = (
|
1260
|
+
# Get LB records
|
1261
|
+
session.query(models.LoadBalancer)
|
1262
|
+
# Joined to amphora records
|
1263
|
+
.filter(models.LoadBalancer.id ==
|
1264
|
+
models.Amphora.load_balancer_id)
|
1265
|
+
# For just this amphora
|
1266
|
+
.filter(models.Amphora.id == amphora_id)
|
1267
|
+
# Where the amphora is not DELETED
|
1268
|
+
.filter(models.Amphora.status != consts.DELETED)
|
1269
|
+
# And the LB is also not DELETED
|
1270
|
+
.filter(models.LoadBalancer.provisioning_status !=
|
1271
|
+
consts.DELETED)).first()
|
1272
|
+
if db_lb:
|
1273
|
+
return db_lb.to_data_model()
|
1274
|
+
return None
|
1264
1275
|
|
1265
1276
|
def get_cert_expiring_amphora(self, session):
|
1266
1277
|
"""Retrieves an amphora whose cert is close to expiring..
|
@@ -1372,7 +1383,7 @@ class AmphoraRepository(BaseRepository):
|
|
1372
1383
|
|
1373
1384
|
Puts a lock on the amphora table to check the status of the
|
1374
1385
|
amphora. The status must be either AMPHORA_READY or ERROR to
|
1375
|
-
|
1386
|
+
successfully update the amphora status.
|
1376
1387
|
|
1377
1388
|
:param lock_session: A Sql Alchemy database session.
|
1378
1389
|
:param id: id of Load Balancer
|
@@ -1884,11 +1895,6 @@ class L7PolicyRepository(BaseRepository):
|
|
1884
1895
|
class QuotasRepository(BaseRepository):
|
1885
1896
|
model_class = models.Quotas
|
1886
1897
|
|
1887
|
-
# Since this is for the initial quota record creation it locks the table
|
1888
|
-
# which can lead to recoverable deadlocks. Thus we use the deadlock
|
1889
|
-
# retry wrapper here. This may not be appropriate for other sessions
|
1890
|
-
# and or queries. Use with caution.
|
1891
|
-
@oslo_db_api.wrap_db_retry(max_retries=5, retry_on_deadlock=True)
|
1892
1898
|
def update(self, session, project_id, **model_kwargs):
|
1893
1899
|
kwargs_quota = model_kwargs['quota']
|
1894
1900
|
quotas = (
|
@@ -1905,6 +1911,19 @@ class QuotasRepository(BaseRepository):
|
|
1905
1911
|
session.flush()
|
1906
1912
|
return self.get(session, project_id=project_id)
|
1907
1913
|
|
1914
|
+
# Since this is for the initial quota record creation it locks the table
|
1915
|
+
# which can lead to recoverable deadlocks. Thus we use the deadlock
|
1916
|
+
# retry wrapper here. This may not be appropriate for other sessions
|
1917
|
+
# and or queries. Use with caution.
|
1918
|
+
@oslo_db_api.wrap_db_retry(max_retries=5, retry_on_deadlock=True)
|
1919
|
+
def ensure_project_exists(self, project_id):
|
1920
|
+
with db_api.session().begin() as session:
|
1921
|
+
quotas = self.get(session, project_id=project_id)
|
1922
|
+
if not quotas:
|
1923
|
+
# Make sure we have a record to lock
|
1924
|
+
self.update(session, project_id, quota={})
|
1925
|
+
session.commit()
|
1926
|
+
|
1908
1927
|
def delete(self, session, project_id):
|
1909
1928
|
quotas = (
|
1910
1929
|
session.query(self.model_class)
|
@@ -64,7 +64,7 @@ class DistributorDriver(object, metaclass=abc.ABCMeta):
|
|
64
64
|
:returns: A TaskFlow Flow that will add a VIP to the distributor
|
65
65
|
|
66
66
|
This method will return a TaskFlow Flow that adds a VIP to the
|
67
|
-
distributor by
|
67
|
+
distributor by performing the necessary steps to plug the VIP and
|
68
68
|
configure the distributor to start receiving requests on this VIP.
|
69
69
|
"""
|
70
70
|
|
octavia/network/base.py
CHANGED
@@ -14,6 +14,7 @@
|
|
14
14
|
|
15
15
|
import abc
|
16
16
|
|
17
|
+
from octavia.common import constants
|
17
18
|
from octavia.common import exceptions
|
18
19
|
|
19
20
|
|
@@ -108,7 +109,8 @@ class AbstractNetworkDriver(object, metaclass=abc.ABCMeta):
|
|
108
109
|
@abc.abstractmethod
|
109
110
|
def create_port(self, network_id, name=None, fixed_ips=(),
|
110
111
|
secondary_ips=(), security_group_ids=(),
|
111
|
-
admin_state_up=True, qos_policy_id=None
|
112
|
+
admin_state_up=True, qos_policy_id=None,
|
113
|
+
vnic_type=constants.VNIC_TYPE_NORMAL):
|
112
114
|
"""Creates a network port.
|
113
115
|
|
114
116
|
fixed_ips = [{'subnet_id': <id>, ('ip_address': <IP>')},]
|
@@ -141,21 +143,6 @@ class AbstractNetworkDriver(object, metaclass=abc.ABCMeta):
|
|
141
143
|
:returns: None
|
142
144
|
"""
|
143
145
|
|
144
|
-
@abc.abstractmethod
|
145
|
-
def plug_vip(self, load_balancer, vip):
|
146
|
-
"""Plugs a virtual ip as the frontend connection of a load balancer.
|
147
|
-
|
148
|
-
Sets up the routing of traffic from the vip to the load balancer
|
149
|
-
and its amphorae.
|
150
|
-
|
151
|
-
:param load_balancer: octavia.common.data_models.LoadBalancer instance
|
152
|
-
:param vip: octavia.common.data_models.VIP instance
|
153
|
-
:return: dict consisting of amphora_id as key and bind_ip as value.
|
154
|
-
bind_ip is the ip that the amphora should listen on to
|
155
|
-
receive traffic to load balance.
|
156
|
-
:raises: PlugVIPException, PortNotFound
|
157
|
-
"""
|
158
|
-
|
159
146
|
@abc.abstractmethod
|
160
147
|
def unplug_vip(self, load_balancer, vip):
|
161
148
|
"""Unplugs a virtual ip as the frontend connection of a load balancer.
|
octavia/network/data_models.py
CHANGED
@@ -12,6 +12,7 @@
|
|
12
12
|
# License for the specific language governing permissions and limitations
|
13
13
|
# under the License.
|
14
14
|
|
15
|
+
from octavia.common import constants
|
15
16
|
from octavia.common import data_models
|
16
17
|
|
17
18
|
|
@@ -81,7 +82,8 @@ class Port(data_models.BaseDataModel):
|
|
81
82
|
def __init__(self, id=None, name=None, device_id=None, device_owner=None,
|
82
83
|
mac_address=None, network_id=None, status=None,
|
83
84
|
project_id=None, admin_state_up=None, fixed_ips=None,
|
84
|
-
network=None, qos_policy_id=None, security_group_ids=None
|
85
|
+
network=None, qos_policy_id=None, security_group_ids=None,
|
86
|
+
vnic_type=constants.VNIC_TYPE_NORMAL):
|
85
87
|
self.id = id
|
86
88
|
self.name = name
|
87
89
|
self.device_id = device_id
|
@@ -95,6 +97,7 @@ class Port(data_models.BaseDataModel):
|
|
95
97
|
self.network = network
|
96
98
|
self.qos_policy_id = qos_policy_id
|
97
99
|
self.security_group_ids = security_group_ids or []
|
100
|
+
self.vnic_type = vnic_type
|
98
101
|
|
99
102
|
def get_subnet_id(self, fixed_ip_address):
|
100
103
|
for fixed_ip in self.fixed_ips:
|
@@ -34,7 +34,6 @@ from octavia.network.drivers.neutron import utils
|
|
34
34
|
LOG = logging.getLogger(__name__)
|
35
35
|
AAP_EXT_ALIAS = 'allowed-address-pairs'
|
36
36
|
PROJECT_ID_ALIAS = 'project-id'
|
37
|
-
OCTAVIA_OWNER = 'Octavia'
|
38
37
|
|
39
38
|
CONF = cfg.CONF
|
40
39
|
|
@@ -89,7 +88,7 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
|
|
89
88
|
constants.NETWORK_ID: subnet.network_id,
|
90
89
|
constants.FIXED_IPS: [{'subnet_id': subnet.id}],
|
91
90
|
constants.ADMIN_STATE_UP: True,
|
92
|
-
constants.DEVICE_OWNER: OCTAVIA_OWNER,
|
91
|
+
constants.DEVICE_OWNER: constants.OCTAVIA_OWNER,
|
93
92
|
}
|
94
93
|
new_port = self.network_proxy.create_port(**port)
|
95
94
|
new_port = utils.convert_port_to_model(new_port)
|
@@ -364,12 +363,13 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
|
|
364
363
|
"""
|
365
364
|
try:
|
366
365
|
for amphora in vip.load_balancer.amphorae:
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
366
|
+
if amphora.vrrp_port_id:
|
367
|
+
try:
|
368
|
+
self.network_proxy.delete_port(amphora.vrrp_port_id)
|
369
|
+
except os_exceptions.ResourceNotFound:
|
370
|
+
LOG.debug(
|
371
|
+
'VIP instance port %s already deleted. Skipping.',
|
372
|
+
amphora.vrrp_port_id)
|
373
373
|
except AttributeError as ex:
|
374
374
|
LOG.warning(f"Cannot delete port from amphorae. Object does not "
|
375
375
|
f"exist ({ex!r})")
|
@@ -384,7 +384,7 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
|
|
384
384
|
|
385
385
|
self._delete_security_group(vip, port)
|
386
386
|
|
387
|
-
if port and port.device_owner == OCTAVIA_OWNER:
|
387
|
+
if port and port.device_owner == constants.OCTAVIA_OWNER:
|
388
388
|
try:
|
389
389
|
self.network_proxy.delete_port(vip.port_id)
|
390
390
|
except os_exceptions.ResourceNotFound:
|
@@ -442,18 +442,6 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
|
|
442
442
|
vrrp_port_id=interface.port_id,
|
443
443
|
ha_port_id=vip.port_id)
|
444
444
|
|
445
|
-
# todo (xgerman): Delete later
|
446
|
-
def plug_vip(self, load_balancer, vip):
|
447
|
-
self.update_vip_sg(load_balancer, vip)
|
448
|
-
plugged_amphorae = []
|
449
|
-
subnet = self.get_subnet(vip.subnet_id)
|
450
|
-
for amphora in filter(
|
451
|
-
lambda amp: amp.status == constants.AMPHORA_ALLOCATED,
|
452
|
-
load_balancer.amphorae):
|
453
|
-
plugged_amphorae.append(self.plug_aap_port(load_balancer, vip,
|
454
|
-
amphora, subnet))
|
455
|
-
return plugged_amphorae
|
456
|
-
|
457
445
|
def _validate_fixed_ip(self, fixed_ips, subnet_id, ip_address):
|
458
446
|
"""Validate an IP address exists in a fixed_ips dict
|
459
447
|
|
@@ -479,6 +467,16 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
|
|
479
467
|
return list_of_dicts
|
480
468
|
|
481
469
|
def allocate_vip(self, load_balancer):
|
470
|
+
"""Allocates a virtual ip.
|
471
|
+
|
472
|
+
Reserves the IP for later use as the frontend connection of a load
|
473
|
+
balancer.
|
474
|
+
|
475
|
+
:param load_balancer: octavia.common.data_models.LoadBalancer instance
|
476
|
+
:return: octavia.common.data_models.Vip,
|
477
|
+
list(octavia.common.data_models.AdditionalVip)
|
478
|
+
:raises: AllocateVIPException, PortNotFound, SubnetNotFound
|
479
|
+
"""
|
482
480
|
if load_balancer.vip.port_id:
|
483
481
|
try:
|
484
482
|
port = self.get_port(load_balancer.vip.port_id)
|
@@ -490,7 +488,7 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
|
|
490
488
|
LOG.info('Port %s already exists. Nothing to be done.',
|
491
489
|
load_balancer.vip.port_id)
|
492
490
|
return self._port_to_vip(port, load_balancer)
|
493
|
-
LOG.error('Neutron VIP
|
491
|
+
LOG.error('Neutron VIP mismatch. Expected ip %s on '
|
494
492
|
'subnet %s in network %s. Neutron has fixed_ips %s '
|
495
493
|
'in network %s. Deleting and recreating the VIP '
|
496
494
|
'port.', load_balancer.vip.ip_address,
|
@@ -523,7 +521,7 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
|
|
523
521
|
|
524
522
|
fixed_ip = {}
|
525
523
|
if load_balancer.vip.subnet_id:
|
526
|
-
fixed_ip[
|
524
|
+
fixed_ip[constants.SUBNET_ID] = load_balancer.vip.subnet_id
|
527
525
|
if load_balancer.vip.ip_address:
|
528
526
|
fixed_ip[constants.IP_ADDRESS] = load_balancer.vip.ip_address
|
529
527
|
|
@@ -555,7 +553,7 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
|
|
555
553
|
constants.NETWORK_ID: load_balancer.vip.network_id,
|
556
554
|
constants.ADMIN_STATE_UP: False,
|
557
555
|
'device_id': 'lb-{0}'.format(load_balancer.id),
|
558
|
-
constants.DEVICE_OWNER: OCTAVIA_OWNER,
|
556
|
+
constants.DEVICE_OWNER: constants.OCTAVIA_OWNER,
|
559
557
|
project_id_key: load_balancer.project_id}
|
560
558
|
|
561
559
|
if fixed_ips:
|
@@ -828,7 +826,8 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
|
|
828
826
|
|
829
827
|
def create_port(self, network_id, name=None, fixed_ips=(),
|
830
828
|
secondary_ips=(), security_group_ids=(),
|
831
|
-
admin_state_up=True, qos_policy_id=None
|
829
|
+
admin_state_up=True, qos_policy_id=None,
|
830
|
+
vnic_type=constants.VNIC_TYPE_NORMAL):
|
832
831
|
"""Creates a network port.
|
833
832
|
|
834
833
|
fixed_ips = [{'subnet_id': <id>, ('ip_addrss': <IP>')},]
|
@@ -840,6 +839,7 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
|
|
840
839
|
:param secondary_ips: A list of secondary IPs to add to the port.
|
841
840
|
:param security_group_ids: A list of security group IDs for the port.
|
842
841
|
:param qos_policy_id: The QoS policy ID to apply to the port.
|
842
|
+
:param vnic_type: The vNIC type this port should attach to.
|
843
843
|
:returns port: A port data model object.
|
844
844
|
"""
|
845
845
|
try:
|
@@ -848,7 +848,8 @@ class AllowedAddressPairsDriver(neutron_base.BaseNeutronDriver):
|
|
848
848
|
aap_list.append({constants.IP_ADDRESS: ip})
|
849
849
|
port = {constants.NETWORK_ID: network_id,
|
850
850
|
constants.ADMIN_STATE_UP: admin_state_up,
|
851
|
-
constants.DEVICE_OWNER: OCTAVIA_OWNER
|
851
|
+
constants.DEVICE_OWNER: constants.OCTAVIA_OWNER,
|
852
|
+
constants.BINDING_VNIC_TYPE: vnic_type}
|
852
853
|
if aap_list:
|
853
854
|
port[constants.ALLOWED_ADDRESS_PAIRS] = aap_list
|
854
855
|
if fixed_ips:
|
@@ -15,6 +15,7 @@
|
|
15
15
|
from oslo_log import log as logging
|
16
16
|
from oslo_utils import uuidutils
|
17
17
|
|
18
|
+
from octavia.common import constants
|
18
19
|
from octavia.common import data_models
|
19
20
|
from octavia.network import base as driver_base
|
20
21
|
from octavia.network import data_models as network_models
|
@@ -73,19 +74,6 @@ class NoopManager(object):
|
|
73
74
|
self.networkconfigconfig[vip.ip_address] = (vip,
|
74
75
|
'deallocate_vip')
|
75
76
|
|
76
|
-
def plug_vip(self, loadbalancer, vip):
|
77
|
-
LOG.debug("Network %s no-op, plug_vip loadbalancer %s, vip %s",
|
78
|
-
self.__class__.__name__,
|
79
|
-
loadbalancer.id, vip.ip_address)
|
80
|
-
self.update_vip_sg(loadbalancer, vip)
|
81
|
-
amps = []
|
82
|
-
for amphora in loadbalancer.amphorae:
|
83
|
-
amps.append(self.plug_aap_port(loadbalancer, vip, amphora, None))
|
84
|
-
self.networkconfigconfig[(loadbalancer.id,
|
85
|
-
vip.ip_address)] = (loadbalancer, vip,
|
86
|
-
'plug_vip')
|
87
|
-
return amps
|
88
|
-
|
89
77
|
def update_vip_sg(self, load_balancer, vip):
|
90
78
|
LOG.debug("Network %s no-op, update_vip_sg loadbalancer %s, vip %s",
|
91
79
|
self.__class__.__name__,
|
@@ -204,8 +192,7 @@ class NoopManager(object):
|
|
204
192
|
return len(self.known_subnets) + 1
|
205
193
|
|
206
194
|
def __iter__(self):
|
207
|
-
|
208
|
-
yield subnet_id
|
195
|
+
yield from self.known_subnets
|
209
196
|
subnet = network_models.Subnet(id=uuidutils.generate_uuid(),
|
210
197
|
network_id=self.network.id)
|
211
198
|
self.known_subnets[subnet.id] = subnet
|
@@ -395,7 +382,8 @@ class NoopManager(object):
|
|
395
382
|
|
396
383
|
def create_port(self, network_id, name=None, fixed_ips=(),
|
397
384
|
secondary_ips=(), security_group_ids=(),
|
398
|
-
admin_state_up=True, qos_policy_id=None
|
385
|
+
admin_state_up=True, qos_policy_id=None,
|
386
|
+
vnic_type=constants.VNIC_TYPE_NORMAL):
|
399
387
|
LOG.debug("Network %s no-op, create_port network_id %s",
|
400
388
|
self.__class__.__name__, network_id)
|
401
389
|
if not name:
|
@@ -421,13 +409,14 @@ class NoopManager(object):
|
|
421
409
|
|
422
410
|
self.networkconfigconfig[(network_id, 'create_port')] = (
|
423
411
|
network_id, name, fixed_ip_obj_list, secondary_ips,
|
424
|
-
security_group_ids, admin_state_up, qos_policy_id)
|
412
|
+
security_group_ids, admin_state_up, qos_policy_id, vnic_type)
|
425
413
|
return network_models.Port(
|
426
414
|
id=port_id, name=name, device_id='no-op-device-id',
|
427
415
|
device_owner='Octavia', mac_address='00:00:5E:00:53:05',
|
428
416
|
network_id=network_id, status='UP', project_id=project_id,
|
429
417
|
admin_state_up=admin_state_up, fixed_ips=fixed_ip_obj_list,
|
430
|
-
qos_policy_id=qos_policy_id, security_group_ids=security_group_ids
|
418
|
+
qos_policy_id=qos_policy_id, security_group_ids=security_group_ids,
|
419
|
+
vnic_type=vnic_type)
|
431
420
|
|
432
421
|
def plug_fixed_ip(self, port_id, subnet_id, ip_address=None):
|
433
422
|
LOG.debug("Network %s no-op, plug_fixed_ip port_id %s, subnet_id "
|
@@ -462,9 +451,6 @@ class NoopNetworkDriver(driver_base.AbstractNetworkDriver):
|
|
462
451
|
def deallocate_vip(self, vip):
|
463
452
|
self.driver.deallocate_vip(vip)
|
464
453
|
|
465
|
-
def plug_vip(self, loadbalancer, vip):
|
466
|
-
return self.driver.plug_vip(loadbalancer, vip)
|
467
|
-
|
468
454
|
def unplug_vip(self, loadbalancer, vip):
|
469
455
|
self.driver.unplug_vip(loadbalancer, vip)
|
470
456
|
|
@@ -542,10 +528,11 @@ class NoopNetworkDriver(driver_base.AbstractNetworkDriver):
|
|
542
528
|
|
543
529
|
def create_port(self, network_id, name=None, fixed_ips=(),
|
544
530
|
secondary_ips=(), security_group_ids=(),
|
545
|
-
admin_state_up=True, qos_policy_id=None
|
531
|
+
admin_state_up=True, qos_policy_id=None,
|
532
|
+
vnic_type=constants.VNIC_TYPE_NORMAL):
|
546
533
|
return self.driver.create_port(
|
547
534
|
network_id, name, fixed_ips, secondary_ips, security_group_ids,
|
548
|
-
admin_state_up, qos_policy_id)
|
535
|
+
admin_state_up, qos_policy_id, vnic_type)
|
549
536
|
|
550
537
|
def plug_fixed_ip(self, port_id, subnet_id, ip_address=None):
|
551
538
|
return self.driver.plug_fixed_ip(port_id, subnet_id, ip_address)
|
@@ -872,3 +872,118 @@ phYuPfZekoNbsOIPDTiPFniuP2saOF4TSRCW4KnpgblRkds6c8X+1ExdlSo5GjNa
|
|
872
872
|
PftOKlYtE7T7Kw4CI9+O2H38IUOYjDt/c2twy954K4pKe4x9Ud8mImpS/oEzOsoz
|
873
873
|
/Mn++bjO55LdaAUKQ3wa8LZ5WFB+Gs6b2kmBfzGarWEiX64=
|
874
874
|
-----END X509 CRL-----"""
|
875
|
+
|
876
|
+
# An invalid certificate due to no subject and no subjectAltName
|
877
|
+
NOCN_NOSUBALT_CRT = b"""-----BEGIN CERTIFICATE-----
|
878
|
+
MIIE4zCCAsugAwIBAgIUTo7POpWDLecy0B7fY2OAbLztmswwDQYJKoZIhvcNAQEL
|
879
|
+
BQAwADAgFw0yMzExMjIyMjE4MzBaGA8yMTIzMTAyOTIyMTgzMFowADCCAiIwDQYJ
|
880
|
+
KoZIhvcNAQEBBQADggIPADCCAgoCggIBAPClqkTqRyjlp+LXE4oElYGvg7y710yZ
|
881
|
+
pR96TNqgugXxNLmIgzx2A3wWJ77z6qn3XoTFEXNnT6f4WrVr1Eh5/Zd1ioyj1r0G
|
882
|
+
hIuEWMkm42UsTv+bId6BkXrr4wTgXgU+ss82dmRsYArV1b+c+89oYlEjQorhQ6eT
|
883
|
+
2aWnt1XJbtpgRYCy5DsBKg1Iq63QRXp5svEr4iX+jAiDCQnBBLhrkfMUf8zuMCev
|
884
|
+
Ij5119OGY5ihLuopIZi6OurA0fyN9e2MFlnYmWcxSZu49+6yBnXGmhmev3qzWj1+
|
885
|
+
9DA50Pqu+NS9rVpYBNhhKuBTBxaTeZPDAl67DC2Mc8TFI1OfpiOwb+w/ewRYznry
|
886
|
+
ZceASFovPFsAlUddwu/94sxgUSCmSE81Op+VlXS0LRgg8o/OZHp/eFsG2NM0OGAH
|
887
|
+
v2uJly4OTPTd/kT50zViX3wJlRYIH+4szSjpbNXE0aF+cqQ56PBrGEe6j+SaGZEV
|
888
|
+
6k4N9WMHNipffkq10N2d6fkRQjAD9B7gHOB6AAQ1mxoZtgchCKL7E8FuA803Yx8B
|
889
|
+
a7h9J65SJq9nbr0z4eTscFZPulW8wMZT/ZeooQJJWqvA+g2FZf0dExk46gqU3F2F
|
890
|
+
IRMvfGzSbIQF7bp/Yj4fLMUwLVaYv6NNdzhI+/eC0wVDWwbQ2rZkkvcvysSteGT4
|
891
|
+
IDuFKuIWt4UnAgMBAAGjUzBRMB0GA1UdDgQWBBSEDhho9+R5JhsAZlQ0wU4Rjbqn
|
892
|
+
OjAfBgNVHSMEGDAWgBSEDhho9+R5JhsAZlQ0wU4RjbqnOjAPBgNVHRMBAf8EBTAD
|
893
|
+
AQH/MA0GCSqGSIb3DQEBCwUAA4ICAQAZ8E7l2H56z08yJiAa5DFmT8jmBHUCoJlM
|
894
|
+
HiZSn04mtzZEfho/21Zdnb2Pa2SDrRkVXmrO+DebO5sK1Kn/EFC9P3SAOeZ3LB+m
|
895
|
+
bJUX4WGEJ+7fv9uVRwSRfF21Lxo9QFgSVfQlQAhmXcKCE/8VtKB34oOZRhR8tAxH
|
896
|
+
I4VvHUPyCT8ZwNhofP2TYHEjRi/4fsXueBH4kBHDy0/pyHMy1b5crWQAjlOhFXhW
|
897
|
+
+qauSXkbIXNXd+wX23UF2uQ8YH819V7cHAidx9ikwn6HC5hxXjzMjViDwI451V6Q
|
898
|
+
eAgrVuKTgx6cdnd2mgra8k7Bd2S+uTxwcrzVVzNfF+D2Al43xgeFF02M8Wp6ZDsh
|
899
|
+
3/mJ7NOJGTJbXLRP+u73PEh1mGGU8H2QoGvaRO7R599sbmU4LedWX/VJc2GXojzF
|
900
|
+
ibPWaMkKtX31QiOeNiLTMSkUWiyDTvzFW2ErqyzARv/yYFcEixEFl1GV8Bqb+ujj
|
901
|
+
cxO5/y9cK6aM+qPb/FrXivXQsNArrpE3T1C54RvhUWOi+kyCiV/mDIG+oOp7sfZ5
|
902
|
+
tBPenwWB2/LGS4rS67jZdwyIC5UbVySaVxtqJrdQXTRNjGfj2m963CHbiaQLSoSF
|
903
|
+
2Zh2e8W4ixo6k6mhih2YjZVtpHrXyzNEtHT9HpPHDeElVcWteIceZMI2Ah0C6Ggj
|
904
|
+
uTbEBYW85Q==
|
905
|
+
-----END CERTIFICATE-----"""
|
906
|
+
|
907
|
+
# A certificate with no subject but with Subject Alternative Name
|
908
|
+
NOCN_SUBALT_CRT = b"""-----BEGIN CERTIFICATE-----
|
909
|
+
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
|
936
|
+
-----END CERTIFICATE-----"""
|
937
|
+
|
938
|
+
NOCN_SUBALT_KEY = b"""-----BEGIN PRIVATE KEY-----
|
939
|
+
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
|
988
|
+
SYVTfCHpvJIgjRkRMP2yZCk3g6T4XA==
|
989
|
+
-----END PRIVATE KEY-----"""
|
@@ -25,7 +25,7 @@ haproxy_process_pool_failures_total 0
|
|
25
25
|
# HELP haproxy_process_max_fds Maximum number of open file descriptors; 0=unset.
|
26
26
|
# TYPE haproxy_process_max_fds gauge
|
27
27
|
haproxy_process_max_fds 375033
|
28
|
-
# HELP haproxy_process_max_sockets Maximum
|
28
|
+
# HELP haproxy_process_max_sockets Maximum number of open sockets.
|
29
29
|
# TYPE haproxy_process_max_sockets gauge
|
30
30
|
haproxy_process_max_sockets 375033
|
31
31
|
# HELP haproxy_process_max_connections Maximum number of concurrent connections.
|