octavia 12.0.0.0rc2__py3-none-any.whl → 13.0.0.0rc1__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/osutils.py +1 -0
- octavia/amphorae/backends/agent/api_server/plug.py +21 -7
- octavia/amphorae/backends/agent/api_server/templates/amphora-netns.systemd.j2 +2 -2
- octavia/amphorae/backends/agent/api_server/util.py +21 -0
- octavia/amphorae/backends/health_daemon/health_daemon.py +9 -3
- octavia/amphorae/backends/health_daemon/health_sender.py +2 -0
- octavia/amphorae/backends/utils/interface.py +14 -6
- octavia/amphorae/backends/utils/interface_file.py +6 -3
- octavia/amphorae/backends/utils/keepalivedlvs_query.py +8 -9
- octavia/amphorae/drivers/driver_base.py +1 -2
- octavia/amphorae/drivers/haproxy/rest_api_driver.py +11 -25
- octavia/amphorae/drivers/health/heartbeat_udp.py +34 -24
- octavia/amphorae/drivers/keepalived/jinja/jinja_cfg.py +3 -12
- octavia/amphorae/drivers/noop_driver/driver.py +3 -5
- octavia/api/common/pagination.py +4 -4
- octavia/api/drivers/amphora_driver/v2/driver.py +11 -5
- octavia/api/drivers/driver_agent/driver_get.py +22 -14
- octavia/api/drivers/driver_agent/driver_updater.py +8 -4
- octavia/api/drivers/utils.py +4 -2
- octavia/api/healthcheck/healthcheck_plugins.py +4 -2
- octavia/api/root_controller.py +4 -1
- octavia/api/v2/controllers/amphora.py +35 -38
- octavia/api/v2/controllers/availability_zone_profiles.py +43 -33
- octavia/api/v2/controllers/availability_zones.py +22 -18
- octavia/api/v2/controllers/flavor_profiles.py +37 -28
- octavia/api/v2/controllers/flavors.py +19 -15
- octavia/api/v2/controllers/health_monitor.py +44 -33
- octavia/api/v2/controllers/l7policy.py +52 -40
- octavia/api/v2/controllers/l7rule.py +68 -55
- octavia/api/v2/controllers/listener.py +88 -61
- octavia/api/v2/controllers/load_balancer.py +52 -34
- octavia/api/v2/controllers/member.py +63 -52
- octavia/api/v2/controllers/pool.py +55 -42
- octavia/api/v2/controllers/quotas.py +5 -3
- octavia/api/v2/types/listener.py +15 -0
- octavia/cmd/octavia_worker.py +0 -3
- octavia/cmd/status.py +1 -4
- octavia/common/clients.py +25 -45
- octavia/common/config.py +64 -22
- octavia/common/constants.py +3 -2
- octavia/common/data_models.py +7 -1
- octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py +12 -1
- octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 +5 -2
- octavia/common/jinja/lvs/jinja_cfg.py +4 -2
- octavia/common/keystone.py +58 -5
- octavia/common/validate.py +35 -0
- octavia/compute/drivers/noop_driver/driver.py +6 -0
- octavia/controller/healthmanager/health_manager.py +3 -6
- octavia/controller/housekeeping/house_keeping.py +36 -37
- octavia/controller/worker/amphora_rate_limit.py +5 -4
- octavia/controller/worker/task_utils.py +57 -41
- octavia/controller/worker/v2/controller_worker.py +160 -103
- octavia/controller/worker/v2/flows/listener_flows.py +3 -0
- octavia/controller/worker/v2/flows/load_balancer_flows.py +9 -14
- octavia/controller/worker/v2/tasks/amphora_driver_tasks.py +152 -91
- octavia/controller/worker/v2/tasks/compute_tasks.py +4 -2
- octavia/controller/worker/v2/tasks/database_tasks.py +542 -400
- octavia/controller/worker/v2/tasks/network_tasks.py +119 -79
- octavia/db/api.py +26 -23
- octavia/db/base_models.py +2 -2
- octavia/db/healthcheck.py +2 -1
- octavia/db/migration/alembic_migrations/versions/632152d2d32e_add_http_strict_transport_security_.py +42 -0
- octavia/db/models.py +12 -2
- octavia/db/prepare.py +2 -0
- octavia/db/repositories.py +462 -482
- octavia/hacking/checks.py +1 -1
- octavia/network/base.py +0 -14
- octavia/network/drivers/neutron/allowed_address_pairs.py +92 -135
- octavia/network/drivers/neutron/base.py +65 -77
- octavia/network/drivers/neutron/utils.py +69 -85
- octavia/network/drivers/noop_driver/driver.py +0 -7
- octavia/statistics/drivers/update_db.py +10 -10
- octavia/tests/common/constants.py +91 -84
- octavia/tests/common/sample_data_models.py +13 -1
- octavia/tests/fixtures.py +32 -0
- octavia/tests/functional/amphorae/backend/agent/api_server/test_server.py +9 -10
- octavia/tests/functional/api/drivers/driver_agent/test_driver_agent.py +260 -15
- octavia/tests/functional/api/test_root_controller.py +3 -28
- octavia/tests/functional/api/v2/base.py +5 -3
- octavia/tests/functional/api/v2/test_amphora.py +18 -5
- octavia/tests/functional/api/v2/test_availability_zone_profiles.py +1 -0
- octavia/tests/functional/api/v2/test_listener.py +51 -19
- octavia/tests/functional/api/v2/test_load_balancer.py +10 -1
- octavia/tests/functional/db/base.py +31 -16
- octavia/tests/functional/db/test_models.py +27 -28
- octavia/tests/functional/db/test_repositories.py +407 -50
- octavia/tests/unit/amphorae/backends/agent/api_server/test_amphora_info.py +2 -0
- octavia/tests/unit/amphorae/backends/agent/api_server/test_osutils.py +1 -1
- octavia/tests/unit/amphorae/backends/agent/api_server/test_plug.py +54 -6
- octavia/tests/unit/amphorae/backends/agent/api_server/test_util.py +35 -0
- octavia/tests/unit/amphorae/backends/health_daemon/test_health_daemon.py +8 -0
- octavia/tests/unit/amphorae/backends/health_daemon/test_health_sender.py +18 -0
- octavia/tests/unit/amphorae/backends/utils/test_interface.py +81 -0
- octavia/tests/unit/amphorae/backends/utils/test_interface_file.py +2 -0
- octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py +129 -5
- octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver_1_0.py +42 -20
- octavia/tests/unit/amphorae/drivers/health/test_heartbeat_udp.py +18 -20
- octavia/tests/unit/amphorae/drivers/keepalived/jinja/test_jinja_cfg.py +4 -4
- octavia/tests/unit/amphorae/drivers/noop_driver/test_driver.py +4 -1
- octavia/tests/unit/api/drivers/driver_agent/test_driver_get.py +3 -3
- octavia/tests/unit/api/drivers/driver_agent/test_driver_updater.py +11 -13
- octavia/tests/unit/base.py +6 -0
- octavia/tests/unit/cmd/test_interface.py +2 -2
- octavia/tests/unit/cmd/test_status.py +2 -2
- octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py +152 -1
- octavia/tests/unit/common/sample_configs/sample_configs_combined.py +10 -3
- octavia/tests/unit/common/test_clients.py +0 -39
- octavia/tests/unit/common/test_keystone.py +54 -0
- octavia/tests/unit/common/test_validate.py +67 -0
- octavia/tests/unit/controller/healthmanager/test_health_manager.py +8 -22
- octavia/tests/unit/controller/housekeeping/test_house_keeping.py +3 -64
- octavia/tests/unit/controller/worker/test_amphora_rate_limit.py +1 -1
- octavia/tests/unit/controller/worker/test_task_utils.py +44 -24
- octavia/tests/unit/controller/worker/v2/flows/test_load_balancer_flows.py +0 -1
- octavia/tests/unit/controller/worker/v2/tasks/test_amphora_driver_tasks.py +49 -26
- octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py +399 -196
- octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks_quota.py +37 -64
- octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py +3 -14
- octavia/tests/unit/controller/worker/v2/test_controller_worker.py +2 -2
- octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py +456 -561
- octavia/tests/unit/network/drivers/neutron/test_base.py +181 -194
- octavia/tests/unit/network/drivers/neutron/test_utils.py +14 -30
- octavia/tests/unit/statistics/drivers/test_update_db.py +7 -5
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/README.rst +1 -1
- {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/AUTHORS +4 -0
- {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/METADATA +4 -4
- {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/RECORD +141 -189
- {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/entry_points.txt +1 -2
- octavia-13.0.0.0rc1.dist-info/pbr.json +1 -0
- octavia/api/drivers/amphora_driver/v1/__init__.py +0 -11
- octavia/api/drivers/amphora_driver/v1/driver.py +0 -547
- octavia/controller/queue/v1/__init__.py +0 -11
- octavia/controller/queue/v1/consumer.py +0 -64
- octavia/controller/queue/v1/endpoints.py +0 -160
- octavia/controller/worker/v1/__init__.py +0 -11
- octavia/controller/worker/v1/controller_worker.py +0 -1157
- octavia/controller/worker/v1/flows/__init__.py +0 -11
- octavia/controller/worker/v1/flows/amphora_flows.py +0 -610
- octavia/controller/worker/v1/flows/health_monitor_flows.py +0 -105
- octavia/controller/worker/v1/flows/l7policy_flows.py +0 -94
- octavia/controller/worker/v1/flows/l7rule_flows.py +0 -100
- octavia/controller/worker/v1/flows/listener_flows.py +0 -128
- octavia/controller/worker/v1/flows/load_balancer_flows.py +0 -692
- octavia/controller/worker/v1/flows/member_flows.py +0 -230
- octavia/controller/worker/v1/flows/pool_flows.py +0 -127
- octavia/controller/worker/v1/tasks/__init__.py +0 -11
- octavia/controller/worker/v1/tasks/amphora_driver_tasks.py +0 -453
- octavia/controller/worker/v1/tasks/cert_task.py +0 -51
- octavia/controller/worker/v1/tasks/compute_tasks.py +0 -335
- octavia/controller/worker/v1/tasks/database_tasks.py +0 -2756
- octavia/controller/worker/v1/tasks/lifecycle_tasks.py +0 -173
- octavia/controller/worker/v1/tasks/model_tasks.py +0 -41
- octavia/controller/worker/v1/tasks/network_tasks.py +0 -970
- octavia/controller/worker/v1/tasks/retry_tasks.py +0 -74
- octavia/tests/unit/api/drivers/amphora_driver/v1/__init__.py +0 -11
- octavia/tests/unit/api/drivers/amphora_driver/v1/test_driver.py +0 -824
- octavia/tests/unit/controller/queue/v1/__init__.py +0 -11
- octavia/tests/unit/controller/queue/v1/test_consumer.py +0 -61
- octavia/tests/unit/controller/queue/v1/test_endpoints.py +0 -189
- octavia/tests/unit/controller/worker/v1/__init__.py +0 -11
- octavia/tests/unit/controller/worker/v1/flows/__init__.py +0 -11
- octavia/tests/unit/controller/worker/v1/flows/test_amphora_flows.py +0 -474
- octavia/tests/unit/controller/worker/v1/flows/test_health_monitor_flows.py +0 -72
- octavia/tests/unit/controller/worker/v1/flows/test_l7policy_flows.py +0 -67
- octavia/tests/unit/controller/worker/v1/flows/test_l7rule_flows.py +0 -67
- octavia/tests/unit/controller/worker/v1/flows/test_listener_flows.py +0 -91
- octavia/tests/unit/controller/worker/v1/flows/test_load_balancer_flows.py +0 -431
- octavia/tests/unit/controller/worker/v1/flows/test_member_flows.py +0 -106
- octavia/tests/unit/controller/worker/v1/flows/test_pool_flows.py +0 -77
- octavia/tests/unit/controller/worker/v1/tasks/__init__.py +0 -11
- octavia/tests/unit/controller/worker/v1/tasks/test_amphora_driver_tasks.py +0 -792
- octavia/tests/unit/controller/worker/v1/tasks/test_cert_task.py +0 -46
- octavia/tests/unit/controller/worker/v1/tasks/test_compute_tasks.py +0 -634
- octavia/tests/unit/controller/worker/v1/tasks/test_database_tasks.py +0 -2615
- octavia/tests/unit/controller/worker/v1/tasks/test_database_tasks_quota.py +0 -415
- octavia/tests/unit/controller/worker/v1/tasks/test_lifecycle_tasks.py +0 -401
- octavia/tests/unit/controller/worker/v1/tasks/test_model_tasks.py +0 -44
- octavia/tests/unit/controller/worker/v1/tasks/test_network_tasks.py +0 -1788
- octavia/tests/unit/controller/worker/v1/tasks/test_retry_tasks.py +0 -47
- octavia/tests/unit/controller/worker/v1/test_controller_worker.py +0 -2096
- octavia-12.0.0.0rc2.dist-info/pbr.json +0 -1
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/LICENSE +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/README.rst +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/diskimage-create.sh +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/requirements.txt +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/tox.ini +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/version.txt +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/scripts/octavia-wsgi +0 -0
- {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/LICENSE +0 -0
- {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/WHEEL +0 -0
- {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -38,7 +38,6 @@ from octavia.common import exceptions
|
|
38
38
|
from octavia.common import stats
|
39
39
|
from octavia.common import utils
|
40
40
|
from octavia.common import validate
|
41
|
-
from octavia.db import api as db_api
|
42
41
|
from octavia.db import prepare as db_prepare
|
43
42
|
from octavia.i18n import _
|
44
43
|
from octavia.network import base as network_base
|
@@ -59,8 +58,9 @@ class LoadBalancersController(base.BaseController):
|
|
59
58
|
def get_one(self, id, fields=None):
|
60
59
|
"""Gets a single load balancer's details."""
|
61
60
|
context = pecan_request.context.get('octavia_context')
|
62
|
-
|
63
|
-
|
61
|
+
with context.session.begin():
|
62
|
+
load_balancer = self._get_db_lb(context.session, id,
|
63
|
+
show_deleted=False)
|
64
64
|
|
65
65
|
if not load_balancer:
|
66
66
|
raise exceptions.NotFound(
|
@@ -85,11 +85,13 @@ class LoadBalancersController(base.BaseController):
|
|
85
85
|
|
86
86
|
query_filter = self._auth_get_all(context, project_id)
|
87
87
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
88
|
+
with context.session.begin():
|
89
|
+
load_balancers, links = (
|
90
|
+
self.repositories.load_balancer.get_all_API_list(
|
91
|
+
context.session, show_deleted=False,
|
92
|
+
pagination_helper=pcontext.get(
|
93
|
+
constants.PAGINATION_HELPER),
|
94
|
+
**query_filter))
|
93
95
|
result = self._convert_db_to_type(
|
94
96
|
load_balancers, [lb_types.LoadBalancerResponse])
|
95
97
|
if fields is not None:
|
@@ -327,8 +329,9 @@ class LoadBalancersController(base.BaseController):
|
|
327
329
|
provider = None
|
328
330
|
if not isinstance(load_balancer.flavor_id, wtypes.UnsetType):
|
329
331
|
try:
|
330
|
-
|
331
|
-
|
332
|
+
with session.begin():
|
333
|
+
provider = self.repositories.flavor.get_flavor_provider(
|
334
|
+
session, load_balancer.flavor_id)
|
332
335
|
except sa_exception.NoResultFound as e:
|
333
336
|
raise exceptions.ValidationException(
|
334
337
|
detail=_("Invalid flavor_id.")) from e
|
@@ -377,8 +380,9 @@ class LoadBalancersController(base.BaseController):
|
|
377
380
|
|
378
381
|
def _validate_flavor(self, session, load_balancer):
|
379
382
|
if not isinstance(load_balancer.flavor_id, wtypes.UnsetType):
|
380
|
-
|
381
|
-
|
383
|
+
with session.begin():
|
384
|
+
flavor = self.repositories.flavor.get(
|
385
|
+
session, id=load_balancer.flavor_id)
|
382
386
|
if not flavor:
|
383
387
|
raise exceptions.ValidationException(
|
384
388
|
detail=_("Invalid flavor_id."))
|
@@ -416,8 +420,9 @@ class LoadBalancersController(base.BaseController):
|
|
416
420
|
|
417
421
|
def _validate_availability_zone(self, session, load_balancer):
|
418
422
|
if not isinstance(load_balancer.availability_zone, wtypes.UnsetType):
|
419
|
-
|
420
|
-
|
423
|
+
with session.begin():
|
424
|
+
az = self.repositories.availability_zone.get(
|
425
|
+
session, name=load_balancer.availability_zone)
|
421
426
|
if not az:
|
422
427
|
raise exceptions.ValidationException(
|
423
428
|
detail=_("Invalid availability zone."))
|
@@ -456,7 +461,8 @@ class LoadBalancersController(base.BaseController):
|
|
456
461
|
# Load the driver early as it also provides validation
|
457
462
|
driver = driver_factory.get_driver(provider)
|
458
463
|
|
459
|
-
lock_session =
|
464
|
+
lock_session = context.session
|
465
|
+
lock_session.begin()
|
460
466
|
try:
|
461
467
|
if self.repositories.check_quota_met(
|
462
468
|
context.session,
|
@@ -553,6 +559,8 @@ class LoadBalancersController(base.BaseController):
|
|
553
559
|
driver_lb_dict = driver_utils.lb_dict_to_provider_dict(
|
554
560
|
lb_dict, vip, add_vips, db_pools, db_lists)
|
555
561
|
|
562
|
+
lock_session.flush()
|
563
|
+
|
556
564
|
# Dispatch to the driver
|
557
565
|
LOG.info("Sending create Load Balancer %s to provider %s",
|
558
566
|
db_lb.id, driver.name)
|
@@ -568,7 +576,8 @@ class LoadBalancersController(base.BaseController):
|
|
568
576
|
with excutils.save_and_reraise_exception():
|
569
577
|
lock_session.rollback()
|
570
578
|
|
571
|
-
|
579
|
+
with context.session.begin():
|
580
|
+
db_lb = self._get_db_lb(context.session, db_lb.id)
|
572
581
|
|
573
582
|
result = self._convert_db_to_type(
|
574
583
|
db_lb, lb_types.LoadBalancerFullResponse)
|
@@ -689,7 +698,8 @@ class LoadBalancersController(base.BaseController):
|
|
689
698
|
"""Updates a load balancer."""
|
690
699
|
load_balancer = load_balancer.loadbalancer
|
691
700
|
context = pecan_request.context.get('octavia_context')
|
692
|
-
|
701
|
+
with context.session.begin():
|
702
|
+
db_lb = self._get_db_lb(context.session, id, show_deleted=False)
|
693
703
|
|
694
704
|
self._auth_validate_action(context, db_lb.project_id,
|
695
705
|
constants.RBAC_PUT)
|
@@ -704,8 +714,8 @@ class LoadBalancersController(base.BaseController):
|
|
704
714
|
# Load the driver early as it also provides validation
|
705
715
|
driver = driver_factory.get_driver(db_lb.provider)
|
706
716
|
|
707
|
-
with
|
708
|
-
self._test_lb_status(
|
717
|
+
with context.session.begin():
|
718
|
+
self._test_lb_status(context.session, id)
|
709
719
|
|
710
720
|
# Prepare the data for the driver data model
|
711
721
|
lb_dict = load_balancer.to_dict(render_unsets=False)
|
@@ -731,15 +741,17 @@ class LoadBalancersController(base.BaseController):
|
|
731
741
|
db_lb_dict = load_balancer.to_dict(render_unsets=False)
|
732
742
|
if 'vip' in db_lb_dict:
|
733
743
|
db_vip_dict = db_lb_dict.pop('vip')
|
734
|
-
self.repositories.vip.update(
|
744
|
+
self.repositories.vip.update(context.session, id,
|
745
|
+
**db_vip_dict)
|
735
746
|
if db_lb_dict:
|
736
|
-
self.repositories.load_balancer.update(
|
747
|
+
self.repositories.load_balancer.update(context.session, id,
|
737
748
|
**db_lb_dict)
|
738
749
|
|
739
750
|
# Force SQL alchemy to query the DB, otherwise we get inconsistent
|
740
751
|
# results
|
741
752
|
context.session.expire_all()
|
742
|
-
|
753
|
+
with context.session.begin():
|
754
|
+
db_lb = self._get_db_lb(context.session, id)
|
743
755
|
result = self._convert_db_to_type(db_lb, lb_types.LoadBalancerResponse)
|
744
756
|
return lb_types.LoadBalancerRootResponse(loadbalancer=result)
|
745
757
|
|
@@ -748,7 +760,8 @@ class LoadBalancersController(base.BaseController):
|
|
748
760
|
"""Deletes a load balancer."""
|
749
761
|
context = pecan_request.context.get('octavia_context')
|
750
762
|
cascade = strutils.bool_from_string(cascade)
|
751
|
-
|
763
|
+
with context.session.begin():
|
764
|
+
db_lb = self._get_db_lb(context.session, id, show_deleted=False)
|
752
765
|
|
753
766
|
self._auth_validate_action(context, db_lb.project_id,
|
754
767
|
constants.RBAC_DELETE)
|
@@ -756,13 +769,13 @@ class LoadBalancersController(base.BaseController):
|
|
756
769
|
# Load the driver early as it also provides validation
|
757
770
|
driver = driver_factory.get_driver(db_lb.provider)
|
758
771
|
|
759
|
-
with
|
772
|
+
with context.session.begin():
|
760
773
|
if (db_lb.listeners or db_lb.pools) and not cascade:
|
761
774
|
msg = _("Cannot delete Load Balancer %s - "
|
762
775
|
"it has children") % id
|
763
776
|
LOG.warning(msg)
|
764
777
|
raise exceptions.ValidationException(detail=msg)
|
765
|
-
self._test_lb_status(
|
778
|
+
self._test_lb_status(context.session, id,
|
766
779
|
lb_status=constants.PENDING_DELETE)
|
767
780
|
|
768
781
|
LOG.info("Sending delete Load Balancer %s to provider %s",
|
@@ -813,8 +826,9 @@ class StatusController(base.BaseController):
|
|
813
826
|
status_code=200)
|
814
827
|
def get(self):
|
815
828
|
context = pecan_request.context.get('octavia_context')
|
816
|
-
|
817
|
-
|
829
|
+
with context.session.begin():
|
830
|
+
load_balancer = self._get_db_lb(context.session, self.id,
|
831
|
+
show_deleted=False)
|
818
832
|
if not load_balancer:
|
819
833
|
LOG.info("Load balancer %s not found.", id)
|
820
834
|
raise exceptions.NotFound(
|
@@ -841,8 +855,9 @@ class StatisticsController(base.BaseController, stats.StatsMixin):
|
|
841
855
|
status_code=200)
|
842
856
|
def get(self):
|
843
857
|
context = pecan_request.context.get('octavia_context')
|
844
|
-
|
845
|
-
|
858
|
+
with context.session.begin():
|
859
|
+
load_balancer = self._get_db_lb(context.session, self.id,
|
860
|
+
show_deleted=False)
|
846
861
|
if not load_balancer:
|
847
862
|
LOG.info("Load balancer %s not found.", id)
|
848
863
|
raise exceptions.NotFound(
|
@@ -852,7 +867,8 @@ class StatisticsController(base.BaseController, stats.StatsMixin):
|
|
852
867
|
self._auth_validate_action(context, load_balancer.project_id,
|
853
868
|
constants.RBAC_GET_STATS)
|
854
869
|
|
855
|
-
|
870
|
+
with context.session.begin():
|
871
|
+
lb_stats = self.get_loadbalancer_stats(context.session, self.id)
|
856
872
|
|
857
873
|
result = self._convert_db_to_type(
|
858
874
|
lb_stats, lb_types.LoadBalancerStatisticsResponse)
|
@@ -869,8 +885,9 @@ class FailoverController(LoadBalancersController):
|
|
869
885
|
def put(self, **kwargs):
|
870
886
|
"""Fails over a loadbalancer"""
|
871
887
|
context = pecan_request.context.get('octavia_context')
|
872
|
-
|
873
|
-
|
888
|
+
with context.session.begin():
|
889
|
+
db_lb = self._get_db_lb(context.session, self.lb_id,
|
890
|
+
show_deleted=False)
|
874
891
|
|
875
892
|
self._auth_validate_action(context, db_lb.project_id,
|
876
893
|
constants.RBAC_PUT_FAILOVER)
|
@@ -878,8 +895,9 @@ class FailoverController(LoadBalancersController):
|
|
878
895
|
# Load the driver early as it also provides validation
|
879
896
|
driver = driver_factory.get_driver(db_lb.provider)
|
880
897
|
|
881
|
-
with
|
882
|
-
self._test_and_set_failover_prov_status(
|
898
|
+
with context.session.begin():
|
899
|
+
self._test_and_set_failover_prov_status(context.session,
|
900
|
+
self.lb_id)
|
883
901
|
LOG.info("Sending failover request for load balancer %s to the "
|
884
902
|
"provider %s", self.lb_id, driver.name)
|
885
903
|
driver_utils.call_provider(
|
@@ -30,7 +30,6 @@ from octavia.common import constants
|
|
30
30
|
from octavia.common import data_models
|
31
31
|
from octavia.common import exceptions
|
32
32
|
from octavia.common import validate
|
33
|
-
from octavia.db import api as db_api
|
34
33
|
from octavia.db import prepare as db_prepare
|
35
34
|
|
36
35
|
|
@@ -49,8 +48,9 @@ class MemberController(base.BaseController):
|
|
49
48
|
def get(self, id, fields=None):
|
50
49
|
"""Gets a single pool member's details."""
|
51
50
|
context = pecan_request.context.get('octavia_context')
|
52
|
-
|
53
|
-
|
51
|
+
with context.session.begin():
|
52
|
+
db_member = self._get_db_member(context.session, id,
|
53
|
+
show_deleted=False)
|
54
54
|
|
55
55
|
self._auth_validate_action(context, db_member.project_id,
|
56
56
|
constants.RBAC_GET_ONE)
|
@@ -70,16 +70,17 @@ class MemberController(base.BaseController):
|
|
70
70
|
pcontext = pecan_request.context
|
71
71
|
context = pcontext.get('octavia_context')
|
72
72
|
|
73
|
-
|
74
|
-
|
73
|
+
with context.session.begin():
|
74
|
+
pool = self._get_db_pool(context.session, self.pool_id,
|
75
|
+
show_deleted=False)
|
75
76
|
|
76
|
-
|
77
|
-
|
77
|
+
self._auth_validate_action(context, pool.project_id,
|
78
|
+
constants.RBAC_GET_ALL)
|
78
79
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
80
|
+
db_members, links = self.repositories.member.get_all_API_list(
|
81
|
+
context.session, show_deleted=False,
|
82
|
+
pool_id=self.pool_id,
|
83
|
+
pagination_helper=pcontext.get(constants.PAGINATION_HELPER))
|
83
84
|
result = self._convert_db_to_type(
|
84
85
|
db_members, [member_types.MemberResponse])
|
85
86
|
if fields is not None:
|
@@ -118,7 +119,9 @@ class MemberController(base.BaseController):
|
|
118
119
|
def _validate_create_member(self, lock_session, member_dict):
|
119
120
|
"""Validate creating member on pool."""
|
120
121
|
try:
|
121
|
-
|
122
|
+
ret = self.repositories.member.create(lock_session, **member_dict)
|
123
|
+
lock_session.flush()
|
124
|
+
return ret
|
122
125
|
except odb_exceptions.DBDuplicateEntry as e:
|
123
126
|
raise exceptions.DuplicateMemberEntry(
|
124
127
|
ip_address=member_dict.get('ip_address'),
|
@@ -141,9 +144,10 @@ class MemberController(base.BaseController):
|
|
141
144
|
member = member_.member
|
142
145
|
context = pecan_request.context.get('octavia_context')
|
143
146
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
+
with context.session.begin():
|
148
|
+
pool = self.repositories.pool.get(context.session, id=self.pool_id)
|
149
|
+
member.project_id, provider = self._get_lb_project_id_provider(
|
150
|
+
context.session, pool.load_balancer_id)
|
147
151
|
|
148
152
|
self._auth_validate_action(context, member.project_id,
|
149
153
|
constants.RBAC_POST)
|
@@ -158,11 +162,11 @@ class MemberController(base.BaseController):
|
|
158
162
|
# Load the driver early as it also provides validation
|
159
163
|
driver = driver_factory.get_driver(provider)
|
160
164
|
|
161
|
-
|
165
|
+
context.session.begin()
|
162
166
|
try:
|
163
167
|
if self.repositories.check_quota_met(
|
164
168
|
context.session,
|
165
|
-
|
169
|
+
context.session,
|
166
170
|
data_models.Member,
|
167
171
|
member.project_id):
|
168
172
|
raise exceptions.QuotaException(
|
@@ -171,9 +175,10 @@ class MemberController(base.BaseController):
|
|
171
175
|
member_dict = db_prepare.create_member(member.to_dict(
|
172
176
|
render_unsets=True), self.pool_id, bool(pool.health_monitor))
|
173
177
|
|
174
|
-
self._test_lb_and_listener_and_pool_statuses(
|
178
|
+
self._test_lb_and_listener_and_pool_statuses(context.session)
|
175
179
|
|
176
|
-
db_member = self._validate_create_member(
|
180
|
+
db_member = self._validate_create_member(context.session,
|
181
|
+
member_dict)
|
177
182
|
|
178
183
|
# Prepare the data for the driver data model
|
179
184
|
provider_member = (
|
@@ -185,12 +190,13 @@ class MemberController(base.BaseController):
|
|
185
190
|
driver_utils.call_provider(
|
186
191
|
driver.name, driver.member_create, provider_member)
|
187
192
|
|
188
|
-
|
193
|
+
context.session.commit()
|
189
194
|
except Exception:
|
190
195
|
with excutils.save_and_reraise_exception():
|
191
|
-
|
196
|
+
context.session.rollback()
|
192
197
|
|
193
|
-
|
198
|
+
with context.session.begin():
|
199
|
+
db_member = self._get_db_member(context.session, db_member.id)
|
194
200
|
result = self._convert_db_to_type(db_member,
|
195
201
|
member_types.MemberResponse)
|
196
202
|
return member_types.MemberRootResponse(member=result)
|
@@ -226,12 +232,13 @@ class MemberController(base.BaseController):
|
|
226
232
|
"""Updates a pool member."""
|
227
233
|
member = member_.member
|
228
234
|
context = pecan_request.context.get('octavia_context')
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
+
with context.session.begin():
|
236
|
+
db_member = self._get_db_member(context.session, id,
|
237
|
+
show_deleted=False)
|
238
|
+
pool = self.repositories.pool.get(context.session,
|
239
|
+
id=db_member.pool_id)
|
240
|
+
project_id, provider = self._get_lb_project_id_provider(
|
241
|
+
context.session, pool.load_balancer_id)
|
235
242
|
|
236
243
|
self._auth_validate_action(context, project_id, constants.RBAC_PUT)
|
237
244
|
|
@@ -242,8 +249,8 @@ class MemberController(base.BaseController):
|
|
242
249
|
# Load the driver early as it also provides validation
|
243
250
|
driver = driver_factory.get_driver(provider)
|
244
251
|
|
245
|
-
with
|
246
|
-
self._test_lb_and_listener_and_pool_statuses(
|
252
|
+
with context.session.begin():
|
253
|
+
self._test_lb_and_listener_and_pool_statuses(context.session,
|
247
254
|
member=db_member)
|
248
255
|
|
249
256
|
# Prepare the data for the driver data model
|
@@ -267,12 +274,14 @@ class MemberController(base.BaseController):
|
|
267
274
|
# Update the database to reflect what the driver just accepted
|
268
275
|
member.provisioning_status = constants.PENDING_UPDATE
|
269
276
|
db_member_dict = member.to_dict(render_unsets=False)
|
270
|
-
self.repositories.member.update(
|
277
|
+
self.repositories.member.update(context.session, id,
|
278
|
+
**db_member_dict)
|
271
279
|
|
272
280
|
# Force SQL alchemy to query the DB, otherwise we get inconsistent
|
273
281
|
# results
|
274
282
|
context.session.expire_all()
|
275
|
-
|
283
|
+
with context.session.begin():
|
284
|
+
db_member = self._get_db_member(context.session, id)
|
276
285
|
result = self._convert_db_to_type(db_member,
|
277
286
|
member_types.MemberResponse)
|
278
287
|
return member_types.MemberRootResponse(member=result)
|
@@ -281,13 +290,14 @@ class MemberController(base.BaseController):
|
|
281
290
|
def delete(self, id):
|
282
291
|
"""Deletes a pool member."""
|
283
292
|
context = pecan_request.context.get('octavia_context')
|
284
|
-
|
285
|
-
|
293
|
+
with context.session.begin():
|
294
|
+
db_member = self._get_db_member(context.session, id,
|
295
|
+
show_deleted=False)
|
286
296
|
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
297
|
+
pool = self.repositories.pool.get(context.session,
|
298
|
+
id=db_member.pool_id)
|
299
|
+
project_id, provider = self._get_lb_project_id_provider(
|
300
|
+
context.session, pool.load_balancer_id)
|
291
301
|
|
292
302
|
self._auth_validate_action(context, project_id, constants.RBAC_DELETE)
|
293
303
|
|
@@ -296,11 +306,11 @@ class MemberController(base.BaseController):
|
|
296
306
|
# Load the driver early as it also provides validation
|
297
307
|
driver = driver_factory.get_driver(provider)
|
298
308
|
|
299
|
-
with
|
300
|
-
self._test_lb_and_listener_and_pool_statuses(
|
309
|
+
with context.session.begin():
|
310
|
+
self._test_lb_and_listener_and_pool_statuses(context.session,
|
301
311
|
member=db_member)
|
302
312
|
self.repositories.member.update(
|
303
|
-
|
313
|
+
context.session, db_member.id,
|
304
314
|
provisioning_status=constants.PENDING_DELETE)
|
305
315
|
|
306
316
|
LOG.info("Sending delete Member %s to provider %s", id,
|
@@ -324,11 +334,12 @@ class MembersController(MemberController):
|
|
324
334
|
additive_only = strutils.bool_from_string(additive_only)
|
325
335
|
context = pecan_request.context.get('octavia_context')
|
326
336
|
|
327
|
-
|
328
|
-
|
337
|
+
with context.session.begin():
|
338
|
+
db_pool = self._get_db_pool(context.session, self.pool_id)
|
339
|
+
old_members = db_pool.members
|
329
340
|
|
330
|
-
|
331
|
-
|
341
|
+
project_id, provider = self._get_lb_project_id_provider(
|
342
|
+
context.session, db_pool.load_balancer_id)
|
332
343
|
|
333
344
|
# Check POST+PUT+DELETE since this operation is all of 'CUD'
|
334
345
|
self._auth_validate_action(context, project_id, constants.RBAC_POST)
|
@@ -340,8 +351,8 @@ class MembersController(MemberController):
|
|
340
351
|
# Load the driver early as it also provides validation
|
341
352
|
driver = driver_factory.get_driver(provider)
|
342
353
|
|
343
|
-
with
|
344
|
-
self._test_lb_and_listener_and_pool_statuses(
|
354
|
+
with context.session.begin():
|
355
|
+
self._test_lb_and_listener_and_pool_statuses(context.session)
|
345
356
|
|
346
357
|
old_member_uniques = {
|
347
358
|
(m.ip_address, m.protocol_port): m.id for m in old_members}
|
@@ -368,7 +379,7 @@ class MembersController(MemberController):
|
|
368
379
|
if not (deleted_members or new_members or updated_members):
|
369
380
|
LOG.info("Member batch update is a noop, rolling back and "
|
370
381
|
"returning early.")
|
371
|
-
|
382
|
+
context.session.rollback()
|
372
383
|
return
|
373
384
|
|
374
385
|
if additive_only:
|
@@ -376,7 +387,7 @@ class MembersController(MemberController):
|
|
376
387
|
else:
|
377
388
|
member_count_diff = len(new_members) - len(deleted_members)
|
378
389
|
if member_count_diff > 0 and self.repositories.check_quota_met(
|
379
|
-
context.session,
|
390
|
+
context.session, context.session, data_models.Member,
|
380
391
|
db_pool.project_id, count=member_count_diff):
|
381
392
|
raise exceptions.QuotaException(
|
382
393
|
resource=data_models.Member._name())
|
@@ -405,7 +416,7 @@ class MembersController(MemberController):
|
|
405
416
|
|
406
417
|
m = m.to_dict(render_unsets=False)
|
407
418
|
m['project_id'] = db_pool.project_id
|
408
|
-
created_member = self._graph_create(
|
419
|
+
created_member = self._graph_create(context.session, m)
|
409
420
|
provider_member = driver_utils.db_member_to_provider_member(
|
410
421
|
created_member)
|
411
422
|
provider_members.append(provider_member)
|
@@ -416,7 +427,7 @@ class MembersController(MemberController):
|
|
416
427
|
db_member_dict = m.to_dict(render_unsets=False)
|
417
428
|
db_member_dict.pop('id')
|
418
429
|
self.repositories.member.update(
|
419
|
-
|
430
|
+
context.session, m.id, **db_member_dict)
|
420
431
|
|
421
432
|
m.pool_id = self.pool_id
|
422
433
|
provider_members.append(
|
@@ -434,7 +445,7 @@ class MembersController(MemberController):
|
|
434
445
|
else:
|
435
446
|
# Members are changed to PENDING_DELETE and not passed.
|
436
447
|
self.repositories.member.update(
|
437
|
-
|
448
|
+
context.session, m.id,
|
438
449
|
provisioning_status=constants.PENDING_DELETE)
|
439
450
|
|
440
451
|
# Dispatch to the driver
|