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.
Files changed (135) hide show
  1. octavia/amphorae/backends/agent/api_server/lvs_listener_base.py +1 -1
  2. octavia/amphorae/backends/agent/api_server/osutils.py +5 -5
  3. octavia/amphorae/backends/agent/api_server/plug.py +3 -2
  4. octavia/amphorae/backends/agent/api_server/rules_schema.py +52 -0
  5. octavia/amphorae/backends/agent/api_server/server.py +28 -1
  6. octavia/amphorae/backends/utils/interface.py +45 -6
  7. octavia/amphorae/backends/utils/interface_file.py +9 -6
  8. octavia/amphorae/backends/utils/nftable_utils.py +125 -0
  9. octavia/amphorae/drivers/driver_base.py +27 -0
  10. octavia/amphorae/drivers/haproxy/rest_api_driver.py +42 -10
  11. octavia/amphorae/drivers/health/heartbeat_udp.py +2 -2
  12. octavia/amphorae/drivers/keepalived/vrrp_rest_driver.py +2 -1
  13. octavia/amphorae/drivers/noop_driver/driver.py +25 -0
  14. octavia/api/app.py +3 -0
  15. octavia/api/common/pagination.py +2 -2
  16. octavia/api/drivers/amphora_driver/flavor_schema.py +6 -1
  17. octavia/api/root_controller.py +4 -1
  18. octavia/api/v2/controllers/health_monitor.py +0 -1
  19. octavia/api/v2/controllers/l7policy.py +0 -1
  20. octavia/api/v2/controllers/l7rule.py +0 -1
  21. octavia/api/v2/controllers/listener.py +0 -1
  22. octavia/api/v2/controllers/load_balancer.py +13 -7
  23. octavia/api/v2/controllers/member.py +6 -3
  24. octavia/api/v2/controllers/pool.py +6 -7
  25. octavia/api/v2/types/load_balancer.py +5 -1
  26. octavia/api/v2/types/pool.py +1 -1
  27. octavia/certificates/common/pkcs12.py +9 -9
  28. octavia/certificates/manager/barbican.py +24 -16
  29. octavia/certificates/manager/castellan_mgr.py +12 -7
  30. octavia/certificates/manager/local.py +4 -4
  31. octavia/certificates/manager/noop.py +106 -0
  32. octavia/cmd/driver_agent.py +1 -1
  33. octavia/cmd/health_checker.py +0 -4
  34. octavia/cmd/health_manager.py +1 -5
  35. octavia/cmd/house_keeping.py +1 -1
  36. octavia/cmd/interface.py +0 -4
  37. octavia/cmd/octavia_worker.py +0 -4
  38. octavia/cmd/prometheus_proxy.py +0 -5
  39. octavia/cmd/status.py +0 -6
  40. octavia/common/base_taskflow.py +1 -1
  41. octavia/common/clients.py +15 -3
  42. octavia/common/config.py +24 -6
  43. octavia/common/constants.py +34 -0
  44. octavia/common/data_models.py +3 -1
  45. octavia/common/exceptions.py +11 -0
  46. octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 +7 -5
  47. octavia/common/keystone.py +7 -7
  48. octavia/common/tls_utils/cert_parser.py +24 -10
  49. octavia/common/utils.py +6 -0
  50. octavia/common/validate.py +2 -2
  51. octavia/compute/drivers/nova_driver.py +23 -5
  52. octavia/controller/worker/task_utils.py +28 -6
  53. octavia/controller/worker/v2/controller_worker.py +49 -15
  54. octavia/controller/worker/v2/flows/amphora_flows.py +120 -21
  55. octavia/controller/worker/v2/flows/flow_utils.py +15 -13
  56. octavia/controller/worker/v2/flows/listener_flows.py +95 -5
  57. octavia/controller/worker/v2/flows/load_balancer_flows.py +74 -30
  58. octavia/controller/worker/v2/taskflow_jobboard_driver.py +17 -1
  59. octavia/controller/worker/v2/tasks/amphora_driver_tasks.py +145 -24
  60. octavia/controller/worker/v2/tasks/compute_tasks.py +1 -1
  61. octavia/controller/worker/v2/tasks/database_tasks.py +72 -41
  62. octavia/controller/worker/v2/tasks/lifecycle_tasks.py +97 -41
  63. octavia/controller/worker/v2/tasks/network_tasks.py +57 -60
  64. octavia/controller/worker/v2/tasks/shim_tasks.py +28 -0
  65. octavia/db/migration/alembic_migrations/versions/55874a4ceed6_add_l7policy_action_redirect_prefix.py +1 -1
  66. octavia/db/migration/alembic_migrations/versions/5a3ee5472c31_add_cert_expiration__infor_in_amphora_table.py +1 -1
  67. octavia/db/migration/alembic_migrations/versions/6742ca1b27c2_add_l7policy_redirect_http_code.py +1 -1
  68. octavia/db/migration/alembic_migrations/versions/db2a73e82626_add_vnic_type_for_vip.py +36 -0
  69. octavia/db/models.py +1 -0
  70. octavia/db/prepare.py +1 -1
  71. octavia/db/repositories.py +53 -34
  72. octavia/distributor/drivers/driver_base.py +1 -1
  73. octavia/network/base.py +3 -16
  74. octavia/network/data_models.py +4 -1
  75. octavia/network/drivers/neutron/allowed_address_pairs.py +27 -26
  76. octavia/network/drivers/noop_driver/driver.py +10 -23
  77. octavia/tests/common/sample_certs.py +115 -0
  78. octavia/tests/common/sample_haproxy_prometheus +1 -1
  79. octavia/tests/functional/amphorae/backend/agent/api_server/test_server.py +37 -0
  80. octavia/tests/functional/api/test_healthcheck.py +2 -2
  81. octavia/tests/functional/api/v2/base.py +1 -1
  82. octavia/tests/functional/api/v2/test_listener.py +45 -0
  83. octavia/tests/functional/api/v2/test_load_balancer.py +17 -0
  84. octavia/tests/functional/db/base.py +9 -0
  85. octavia/tests/functional/db/test_models.py +2 -1
  86. octavia/tests/functional/db/test_repositories.py +55 -99
  87. octavia/tests/unit/amphorae/backends/agent/api_server/test_osutils.py +4 -2
  88. octavia/tests/unit/amphorae/backends/utils/test_interface.py +201 -1
  89. octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py +1 -1
  90. octavia/tests/unit/amphorae/backends/utils/test_nftable_utils.py +194 -0
  91. octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver.py +27 -5
  92. octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver_1_0.py +15 -2
  93. octavia/tests/unit/amphorae/drivers/keepalived/test_vrrp_rest_driver.py +17 -0
  94. octavia/tests/unit/amphorae/drivers/noop_driver/test_driver.py +2 -1
  95. octavia/tests/unit/api/v2/types/test_pool.py +71 -0
  96. octavia/tests/unit/certificates/manager/test_barbican.py +3 -3
  97. octavia/tests/unit/certificates/manager/test_noop.py +53 -0
  98. octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py +16 -17
  99. octavia/tests/unit/common/sample_configs/sample_configs_combined.py +5 -3
  100. octavia/tests/unit/common/test_config.py +35 -0
  101. octavia/tests/unit/common/test_keystone.py +32 -0
  102. octavia/tests/unit/common/test_utils.py +39 -0
  103. octavia/tests/unit/compute/drivers/test_nova_driver.py +22 -0
  104. octavia/tests/unit/controller/worker/test_task_utils.py +58 -2
  105. octavia/tests/unit/controller/worker/v2/flows/test_amphora_flows.py +28 -5
  106. octavia/tests/unit/controller/worker/v2/flows/test_listener_flows.py +64 -16
  107. octavia/tests/unit/controller/worker/v2/flows/test_load_balancer_flows.py +49 -9
  108. octavia/tests/unit/controller/worker/v2/tasks/test_amphora_driver_tasks.py +265 -17
  109. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py +101 -1
  110. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks_quota.py +19 -19
  111. octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py +105 -42
  112. octavia/tests/unit/controller/worker/v2/tasks/test_shim_tasks.py +33 -0
  113. octavia/tests/unit/controller/worker/v2/test_controller_worker.py +85 -42
  114. octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py +48 -51
  115. octavia/tests/unit/network/drivers/neutron/test_utils.py +2 -0
  116. octavia/tests/unit/network/drivers/noop_driver/test_driver.py +0 -7
  117. {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/README.rst +6 -1
  118. {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/diskimage-create.sh +10 -4
  119. {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/requirements.txt +0 -2
  120. {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/tox.ini +30 -13
  121. {octavia-13.0.0.dist-info → octavia-14.0.0.dist-info}/AUTHORS +5 -0
  122. {octavia-13.0.0.dist-info → octavia-14.0.0.dist-info}/METADATA +6 -6
  123. {octavia-13.0.0.dist-info → octavia-14.0.0.dist-info}/RECORD +134 -126
  124. {octavia-13.0.0.dist-info → octavia-14.0.0.dist-info}/entry_points.txt +1 -1
  125. octavia-14.0.0.dist-info/pbr.json +1 -0
  126. octavia-13.0.0.dist-info/pbr.json +0 -1
  127. {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/LICENSE +0 -0
  128. {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/README.rst +0 -0
  129. {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
  130. {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
  131. {octavia-13.0.0.data → octavia-14.0.0.data}/data/share/octavia/diskimage-create/version.txt +0 -0
  132. {octavia-13.0.0.data → octavia-14.0.0.data}/scripts/octavia-wsgi +0 -0
  133. {octavia-13.0.0.dist-info → octavia-14.0.0.dist-info}/LICENSE +0 -0
  134. {octavia-13.0.0.dist-info → octavia-14.0.0.dist-info}/WHEEL +0 -0
  135. {octavia-13.0.0.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 overriden by flavors later
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
@@ -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, lock_session, _class, project_id,
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
- quotas = self.quotas.get(session, project_id=project_id)
394
- if not quotas:
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 = (lock_session.query(models.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
- with session.begin():
1248
- db_lb = (
1249
- # Get LB records
1250
- session.query(models.LoadBalancer)
1251
- # Joined to amphora records
1252
- .filter(models.LoadBalancer.id ==
1253
- models.Amphora.load_balancer_id)
1254
- # For just this amphora
1255
- .filter(models.Amphora.id == amphora_id)
1256
- # Where the amphora is not DELETED
1257
- .filter(models.Amphora.status != consts.DELETED)
1258
- # And the LB is also not DELETED
1259
- .filter(models.LoadBalancer.provisioning_status !=
1260
- consts.DELETED)).first()
1261
- if db_lb:
1262
- return db_lb.to_data_model()
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
- successfuly update the amphora status.
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 perfoming the necessary steps to plug the VIP and
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.
@@ -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
- 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)
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 mis-match. Expected ip %s on '
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['subnet_id'] = load_balancer.vip.subnet_id
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
- for subnet_id in self.known_subnets:
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
+ MIIFAjCCAuqgAwIBAgIUNjJqSdaJ9FsivfRHbXpdmcZgJR4wDQYJKoZIhvcNAQEL
910
+ BQAwADAgFw0yMzExMzAyMTQyNTVaGA8yMTIzMTEwNjIxNDI1NVowADCCAiIwDQYJ
911
+ KoZIhvcNAQEBBQADggIPADCCAgoCggIBAKA8+0iJzx51kTufmIpxGCM/KUFWdJ0U
912
+ MmOPN1NmySNaj6nGI/Ix6m13A5SaezhbRlJvEwN7Hqg+tl+fqu0RgtQOXfBDMiJm
913
+ +kAl0CQiOH7XU41P6fyk/QL8WF3VVGBtawTWn3x9Jw7Itd/zFr+aepQOj5LIwcx1
914
+ ncHXreWdMLqDa7PpW1Ru6BW0FKVxX6WYQr2PI08nEIxu6DzLcaLHktRyNYg7r9X9
915
+ a0tLZcp5MCBG3h3EtVgUkL9qw8q6acJpDGBF7ssRTNDf3QUSg0jrfzkD9WJCi631
916
+ tefdAkDNIZXGZggbWsDGPseX4JG9p7WGzPx5QY2DkMqDJqi6FoS35tT+WNcY0n9V
917
+ oBQXtXFV/AqOC070NwrhxsNA3cBbpRqEQYJsIDaXq0cmFR4aoDWk4OXqs7I+dpyi
918
+ MFeRHEU7h4DpwzaOmOyaSmzsZqEMG2lsdJZmC+fIFkyKtP0BQv/movWY25oJSpF5
919
+ 4Q/PdwKn6PFO2bRVSLStlrhpuqXw2+CzlQT6YCAz+ajqDnn/w8NIrT6y+DiFd+kt
920
+ WCed/o4ZBzsxOexRph+t0bdkTmR8PNpnHwcxzVN33gCSc6Q5DW1/M2V8VGYqnPd/
921
+ taEaMlHm/wQ3y2/aH/tkyq85PM5tqCbUscD4TUZ7R6kb0k83Ak2iZOM5RHb4zc4p
922
+ mreNKLPfgrQ7AgMBAAGjcjBwMB0GA1UdDgQWBBT6/yXwr+5BhORB3cUkrrSgnreq
923
+ NTAfBgNVHSMEGDAWgBT6/yXwr+5BhORB3cUkrrSgnreqNTAPBgNVHRMBAf8EBTAD
924
+ AQH/MB0GA1UdEQEB/wQTMBGCD3d3dy5leGFtcGxlLmNvbTANBgkqhkiG9w0BAQsF
925
+ AAOCAgEAjxrBZ3v6wK7oZWvrzFV+aCs+KkoUkK0Y61TM4SCbWIT8oinN68nweha5
926
+ p48Jp+hSBHEsj9h0opHezihduKh5IVM7KtbcXn1GSeN2hmyAAPm/MbxyD+l+UEfB
927
+ G/behQcsYdVXXog7nwD2NXINvra8KGPqA7n/BnQ7RsxBXHVa9+IHF2L4LpbcvG7G
928
+ Ci/jmLSBk7Gi/75TsFphHAhfomovfnnNykfJ0u99ew14MxVmRWbZ+rbpMsUL/AhV
929
+ h8VujkfUs1hFbdxePTVyHwplqH65yjzzQ18q8CX7kMGi9sz2k8xJS04Nz0x1l7xQ
930
+ JDuhFMDDrcyb7vAqG7BHQ9zXWJ3IkTg9WrbfkOyTqQsJeInToWQybmr/7lY3PmC2
931
+ e/X0zNABF+ypX29RrKzWL+KfpbslysZIEPLEW28qAh3KOyml1du+lbDSNtcHxQcT
932
+ bnvz2rQlAYE70Ds3znLLuMXbq8GtS+h8EYH1jxcjZD9DAPhxi37v8QSY/ABIBGE2
933
+ lfbhbzZ5OWQLMA0L1tbTg7bG5JGoi/GmPl4oA+Dbz3+8Yd/v8XJUzQgI221tx+T+
934
+ isog5o96m62pW6hd1R+eZjVAOVMT/OxecJ9eIVva8EiZwu1Ja9arBkuhIBVK2htm
935
+ PVi6J1iFUrPZG+QrK/ZePo4xE06Lm31dr8pxdZ7Y860owwIuHfA=
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 numer of open sockets.
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.