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
@@ -94,7 +94,9 @@ class ControllerWorker(object):
|
|
94
94
|
CONF.haproxy_amphora.api_db_commit_retry_attempts))
|
95
95
|
def _get_db_obj_until_pending_update(self, repo, id):
|
96
96
|
|
97
|
-
|
97
|
+
session = db_apis.get_session()
|
98
|
+
with session.begin():
|
99
|
+
return repo.get(session, id=id)
|
98
100
|
|
99
101
|
@property
|
100
102
|
def services_controller(self):
|
@@ -118,8 +120,10 @@ class ControllerWorker(object):
|
|
118
120
|
:raises AmphoraNotFound: The referenced Amphora was not found
|
119
121
|
"""
|
120
122
|
try:
|
121
|
-
|
122
|
-
|
123
|
+
session = db_apis.get_session()
|
124
|
+
with session.begin():
|
125
|
+
amphora = self._amphora_repo.get(session,
|
126
|
+
id=amphora_id)
|
123
127
|
store = {constants.AMPHORA: amphora.to_dict()}
|
124
128
|
self.run_flow(
|
125
129
|
flow_utils.get_delete_amphora_flow,
|
@@ -145,9 +149,11 @@ class ControllerWorker(object):
|
|
145
149
|
:returns: None
|
146
150
|
:raises NoResultFound: Unable to find the object
|
147
151
|
"""
|
148
|
-
|
149
|
-
|
150
|
-
|
152
|
+
session = db_apis.get_session()
|
153
|
+
with session.begin():
|
154
|
+
db_health_monitor = self._health_mon_repo.get(
|
155
|
+
session,
|
156
|
+
id=health_monitor[constants.HEALTHMONITOR_ID])
|
151
157
|
|
152
158
|
if not db_health_monitor:
|
153
159
|
LOG.warning('Failed to fetch %s %s from DB. Retrying for up to '
|
@@ -178,9 +184,11 @@ class ControllerWorker(object):
|
|
178
184
|
:returns: None
|
179
185
|
:raises HMNotFound: The referenced health monitor was not found
|
180
186
|
"""
|
181
|
-
|
182
|
-
|
183
|
-
|
187
|
+
session = db_apis.get_session()
|
188
|
+
with session.begin():
|
189
|
+
db_health_monitor = self._health_mon_repo.get(
|
190
|
+
session,
|
191
|
+
id=health_monitor[constants.HEALTHMONITOR_ID])
|
184
192
|
|
185
193
|
pool = db_health_monitor.pool
|
186
194
|
load_balancer = pool.load_balancer
|
@@ -251,8 +259,10 @@ class ControllerWorker(object):
|
|
251
259
|
:returns: None
|
252
260
|
:raises NoResultFound: Unable to find the object
|
253
261
|
"""
|
254
|
-
|
255
|
-
|
262
|
+
session = db_apis.get_session()
|
263
|
+
with session.begin():
|
264
|
+
db_listener = self._listener_repo.get(
|
265
|
+
session, id=listener[constants.LISTENER_ID])
|
256
266
|
if not db_listener:
|
257
267
|
LOG.warning('Failed to fetch %s %s from DB. Retrying for up to '
|
258
268
|
'60 seconds.', 'listener',
|
@@ -333,8 +343,10 @@ class ControllerWorker(object):
|
|
333
343
|
:returns: None
|
334
344
|
:raises NoResultFound: Unable to find the object
|
335
345
|
"""
|
336
|
-
|
337
|
-
|
346
|
+
session = db_apis.get_session()
|
347
|
+
with session.begin():
|
348
|
+
lb = self._lb_repo.get(session,
|
349
|
+
id=loadbalancer[constants.LOADBALANCER_ID])
|
338
350
|
if not lb:
|
339
351
|
LOG.warning('Failed to fetch %s %s from DB. Retrying for up to '
|
340
352
|
'60 seconds.', 'load_balancer',
|
@@ -374,7 +386,9 @@ class ControllerWorker(object):
|
|
374
386
|
:raises LBNotFound: The referenced load balancer was not found
|
375
387
|
"""
|
376
388
|
loadbalancer_id = load_balancer[constants.LOADBALANCER_ID]
|
377
|
-
|
389
|
+
session = db_apis.get_session()
|
390
|
+
with session.begin():
|
391
|
+
db_lb = self._lb_repo.get(session, id=loadbalancer_id)
|
378
392
|
store = {constants.LOADBALANCER: load_balancer,
|
379
393
|
constants.LOADBALANCER_ID: loadbalancer_id,
|
380
394
|
constants.SERVER_GROUP_ID: db_lb.server_group_id,
|
@@ -436,8 +450,10 @@ class ControllerWorker(object):
|
|
436
450
|
:returns: None
|
437
451
|
:raises NoSuitablePool: Unable to find the node pool
|
438
452
|
"""
|
439
|
-
|
440
|
-
|
453
|
+
session = db_apis.get_session()
|
454
|
+
with session.begin():
|
455
|
+
db_member = self._member_repo.get(session,
|
456
|
+
id=member[constants.MEMBER_ID])
|
441
457
|
if not db_member:
|
442
458
|
LOG.warning('Failed to fetch %s %s from DB. Retrying for up to '
|
443
459
|
'60 seconds.', 'l7member',
|
@@ -457,9 +473,10 @@ class ControllerWorker(object):
|
|
457
473
|
constants.LOADBALANCER: provider_lb,
|
458
474
|
constants.POOL_ID: pool.id}
|
459
475
|
if load_balancer.availability_zone:
|
460
|
-
|
461
|
-
|
462
|
-
|
476
|
+
with session.begin():
|
477
|
+
store[constants.AVAILABILITY_ZONE] = (
|
478
|
+
self._az_repo.get_availability_zone_metadata_dict(
|
479
|
+
session, load_balancer.availability_zone))
|
463
480
|
else:
|
464
481
|
store[constants.AVAILABILITY_ZONE] = {}
|
465
482
|
|
@@ -474,8 +491,10 @@ class ControllerWorker(object):
|
|
474
491
|
:returns: None
|
475
492
|
:raises MemberNotFound: The referenced member was not found
|
476
493
|
"""
|
477
|
-
|
478
|
-
|
494
|
+
session = db_apis.get_session()
|
495
|
+
with session.begin():
|
496
|
+
pool = self._pool_repo.get(session,
|
497
|
+
id=member[constants.POOL_ID])
|
479
498
|
|
480
499
|
load_balancer = pool.load_balancer
|
481
500
|
provider_lb = provider_utils.db_loadbalancer_to_provider_loadbalancer(
|
@@ -490,9 +509,10 @@ class ControllerWorker(object):
|
|
490
509
|
constants.POOL_ID: pool.id,
|
491
510
|
constants.PROJECT_ID: load_balancer.project_id}
|
492
511
|
if load_balancer.availability_zone:
|
493
|
-
|
494
|
-
|
495
|
-
|
512
|
+
with session.begin():
|
513
|
+
store[constants.AVAILABILITY_ZONE] = (
|
514
|
+
self._az_repo.get_availability_zone_metadata_dict(
|
515
|
+
session, load_balancer.availability_zone))
|
496
516
|
else:
|
497
517
|
store[constants.AVAILABILITY_ZONE] = {}
|
498
518
|
|
@@ -510,9 +530,12 @@ class ControllerWorker(object):
|
|
510
530
|
CONF.haproxy_amphora.api_db_commit_retry_attempts))
|
511
531
|
def batch_update_members(self, old_members, new_members,
|
512
532
|
updated_members):
|
513
|
-
|
514
|
-
|
515
|
-
|
533
|
+
session = db_apis.get_session()
|
534
|
+
with session.begin():
|
535
|
+
db_new_members = [
|
536
|
+
self._member_repo.get(
|
537
|
+
session, id=member[constants.MEMBER_ID])
|
538
|
+
for member in new_members]
|
516
539
|
# The API may not have commited all of the new member records yet.
|
517
540
|
# Make sure we retry looking them up.
|
518
541
|
if None in db_new_members or len(db_new_members) != len(new_members):
|
@@ -520,27 +543,28 @@ class ControllerWorker(object):
|
|
520
543
|
'Retrying for up to 60 seconds.')
|
521
544
|
raise db_exceptions.NoResultFound
|
522
545
|
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
546
|
+
with session.begin():
|
547
|
+
updated_members = [
|
548
|
+
(provider_utils.db_member_to_provider_member(
|
549
|
+
self._member_repo.get(session,
|
550
|
+
id=m.get(constants.ID))).to_dict(),
|
551
|
+
m)
|
552
|
+
for m in updated_members]
|
553
|
+
provider_old_members = [
|
554
|
+
provider_utils.db_member_to_provider_member(
|
555
|
+
self._member_repo.get(session,
|
556
|
+
id=m.get(constants.ID))).to_dict()
|
557
|
+
for m in old_members]
|
558
|
+
if old_members:
|
559
|
+
pool = self._pool_repo.get(
|
560
|
+
session, id=old_members[0][constants.POOL_ID])
|
561
|
+
elif new_members:
|
562
|
+
pool = self._pool_repo.get(
|
563
|
+
session, id=new_members[0][constants.POOL_ID])
|
564
|
+
else:
|
565
|
+
pool = self._pool_repo.get(
|
566
|
+
session,
|
567
|
+
id=updated_members[0][0][constants.POOL_ID])
|
544
568
|
load_balancer = pool.load_balancer
|
545
569
|
|
546
570
|
provider_lb = provider_utils.db_loadbalancer_to_provider_loadbalancer(
|
@@ -554,9 +578,10 @@ class ControllerWorker(object):
|
|
554
578
|
constants.POOL_ID: pool.id,
|
555
579
|
constants.PROJECT_ID: load_balancer.project_id}
|
556
580
|
if load_balancer.availability_zone:
|
557
|
-
|
558
|
-
|
559
|
-
|
581
|
+
with session.begin():
|
582
|
+
store[constants.AVAILABILITY_ZONE] = (
|
583
|
+
self._az_repo.get_availability_zone_metadata_dict(
|
584
|
+
session, load_balancer.availability_zone))
|
560
585
|
else:
|
561
586
|
store[constants.AVAILABILITY_ZONE] = {}
|
562
587
|
|
@@ -598,9 +623,11 @@ class ControllerWorker(object):
|
|
598
623
|
constants.POOL_ID: pool.id,
|
599
624
|
constants.UPDATE_DICT: member_updates}
|
600
625
|
if load_balancer.availability_zone:
|
601
|
-
|
602
|
-
|
603
|
-
|
626
|
+
session = db_apis.get_session()
|
627
|
+
with session.begin():
|
628
|
+
store[constants.AVAILABILITY_ZONE] = (
|
629
|
+
self._az_repo.get_availability_zone_metadata_dict(
|
630
|
+
session, load_balancer.availability_zone))
|
604
631
|
else:
|
605
632
|
store[constants.AVAILABILITY_ZONE] = {}
|
606
633
|
|
@@ -626,8 +653,10 @@ class ControllerWorker(object):
|
|
626
653
|
|
627
654
|
# TODO(ataraday) It seems we need to get db pool here anyway to get
|
628
655
|
# proper listeners
|
629
|
-
|
630
|
-
|
656
|
+
session = db_apis.get_session()
|
657
|
+
with session.begin():
|
658
|
+
db_pool = self._pool_repo.get(session,
|
659
|
+
id=pool[constants.POOL_ID])
|
631
660
|
if not db_pool:
|
632
661
|
LOG.warning('Failed to fetch %s %s from DB. Retrying for up to '
|
633
662
|
'60 seconds.', 'pool', pool[constants.POOL_ID])
|
@@ -653,8 +682,10 @@ class ControllerWorker(object):
|
|
653
682
|
:returns: None
|
654
683
|
:raises PoolNotFound: The referenced pool was not found
|
655
684
|
"""
|
656
|
-
|
657
|
-
|
685
|
+
session = db_apis.get_session()
|
686
|
+
with session.begin():
|
687
|
+
db_pool = self._pool_repo.get(session,
|
688
|
+
id=pool[constants.POOL_ID])
|
658
689
|
|
659
690
|
load_balancer = db_pool.load_balancer
|
660
691
|
provider_lb = provider_utils.db_loadbalancer_to_provider_loadbalancer(
|
@@ -718,8 +749,10 @@ class ControllerWorker(object):
|
|
718
749
|
:returns: None
|
719
750
|
:raises NoResultFound: Unable to find the object
|
720
751
|
"""
|
721
|
-
|
722
|
-
|
752
|
+
session = db_apis.get_session()
|
753
|
+
with session.begin():
|
754
|
+
db_l7policy = self._l7policy_repo.get(
|
755
|
+
session, id=l7policy[constants.L7POLICY_ID])
|
723
756
|
if not db_l7policy:
|
724
757
|
LOG.warning('Failed to fetch %s %s from DB. Retrying for up to '
|
725
758
|
'60 seconds.', 'l7policy',
|
@@ -747,8 +780,10 @@ class ControllerWorker(object):
|
|
747
780
|
:returns: None
|
748
781
|
:raises L7PolicyNotFound: The referenced l7policy was not found
|
749
782
|
"""
|
750
|
-
|
751
|
-
|
783
|
+
session = db_apis.get_session()
|
784
|
+
with session.begin():
|
785
|
+
db_listener = self._listener_repo.get(
|
786
|
+
session, id=l7policy[constants.LISTENER_ID])
|
752
787
|
listeners_dicts = (
|
753
788
|
provider_utils.db_listeners_to_provider_dicts_list_of_dicts(
|
754
789
|
[db_listener]))
|
@@ -809,8 +844,10 @@ class ControllerWorker(object):
|
|
809
844
|
:returns: None
|
810
845
|
:raises NoResultFound: Unable to find the object
|
811
846
|
"""
|
812
|
-
|
813
|
-
|
847
|
+
session = db_apis.get_session()
|
848
|
+
with session.begin():
|
849
|
+
db_l7rule = self._l7rule_repo.get(session,
|
850
|
+
id=l7rule[constants.L7RULE_ID])
|
814
851
|
if not db_l7rule:
|
815
852
|
LOG.warning('Failed to fetch %s %s from DB. Retrying for up to '
|
816
853
|
'60 seconds.', 'l7rule',
|
@@ -844,8 +881,10 @@ class ControllerWorker(object):
|
|
844
881
|
:returns: None
|
845
882
|
:raises L7RuleNotFound: The referenced l7rule was not found
|
846
883
|
"""
|
847
|
-
|
848
|
-
|
884
|
+
session = db_apis.get_session()
|
885
|
+
with session.begin():
|
886
|
+
db_l7policy = self._l7policy_repo.get(
|
887
|
+
session, id=l7rule[constants.L7POLICY_ID])
|
849
888
|
l7policy = provider_utils.db_l7policy_to_provider_l7policy(db_l7policy)
|
850
889
|
load_balancer = db_l7policy.listener.load_balancer
|
851
890
|
|
@@ -914,8 +953,10 @@ class ControllerWorker(object):
|
|
914
953
|
"""
|
915
954
|
amphora = None
|
916
955
|
try:
|
917
|
-
|
918
|
-
|
956
|
+
session = db_apis.get_session()
|
957
|
+
with session.begin():
|
958
|
+
amphora = self._amphora_repo.get(session,
|
959
|
+
id=amphora_id)
|
919
960
|
if amphora is None:
|
920
961
|
LOG.error('Amphora failover for amphora %s failed because '
|
921
962
|
'there is no record of this amphora in the '
|
@@ -930,14 +971,16 @@ class ControllerWorker(object):
|
|
930
971
|
'was submitted for failover. Deleting it from the '
|
931
972
|
'amphora health table to exclude it from health '
|
932
973
|
'checks and skipping the failover.', amphora.id)
|
933
|
-
|
934
|
-
|
974
|
+
with session.begin():
|
975
|
+
self._amphora_health_repo.delete(session,
|
976
|
+
amphora_id=amphora.id)
|
935
977
|
return
|
936
978
|
|
937
979
|
loadbalancer = None
|
938
980
|
if amphora.load_balancer_id:
|
939
|
-
|
940
|
-
|
981
|
+
with session.begin():
|
982
|
+
loadbalancer = self._lb_repo.get(
|
983
|
+
session, id=amphora.load_balancer_id)
|
941
984
|
lb_amp_count = None
|
942
985
|
if loadbalancer:
|
943
986
|
if loadbalancer.topology == constants.TOPOLOGY_ACTIVE_STANDBY:
|
@@ -956,18 +999,21 @@ class ControllerWorker(object):
|
|
956
999
|
# Even if the LB doesn't have a flavor, create one and
|
957
1000
|
# pass through the topology.
|
958
1001
|
if loadbalancer.flavor_id:
|
959
|
-
|
960
|
-
|
1002
|
+
with session.begin():
|
1003
|
+
flavor_dict = (
|
1004
|
+
self._flavor_repo.get_flavor_metadata_dict(
|
1005
|
+
session, loadbalancer.flavor_id))
|
961
1006
|
flavor_dict[constants.LOADBALANCER_TOPOLOGY] = (
|
962
1007
|
loadbalancer.topology)
|
963
1008
|
else:
|
964
1009
|
flavor_dict = {constants.LOADBALANCER_TOPOLOGY:
|
965
1010
|
loadbalancer.topology}
|
966
1011
|
if loadbalancer.availability_zone:
|
967
|
-
|
968
|
-
|
969
|
-
|
970
|
-
|
1012
|
+
with session.begin():
|
1013
|
+
az_metadata = (
|
1014
|
+
self._az_repo.get_availability_zone_metadata_dict(
|
1015
|
+
session,
|
1016
|
+
loadbalancer.availability_zone))
|
971
1017
|
vip_dict = loadbalancer.vip.to_dict()
|
972
1018
|
additional_vip_dicts = [
|
973
1019
|
av.to_dict()
|
@@ -1003,12 +1049,14 @@ class ControllerWorker(object):
|
|
1003
1049
|
with excutils.save_and_reraise_exception(reraise=reraise):
|
1004
1050
|
LOG.exception("Amphora %s failover exception: %s",
|
1005
1051
|
amphora_id, str(e))
|
1006
|
-
|
1007
|
-
|
1008
|
-
|
1009
|
-
|
1010
|
-
|
1011
|
-
|
1052
|
+
with session.begin():
|
1053
|
+
self._amphora_repo.update(session,
|
1054
|
+
amphora_id,
|
1055
|
+
status=constants.ERROR)
|
1056
|
+
if amphora and amphora.load_balancer_id:
|
1057
|
+
self._lb_repo.update(
|
1058
|
+
session, amphora.load_balancer_id,
|
1059
|
+
provisioning_status=constants.ERROR)
|
1012
1060
|
|
1013
1061
|
@staticmethod
|
1014
1062
|
def _get_amphorae_for_failover(load_balancer):
|
@@ -1084,8 +1132,10 @@ class ControllerWorker(object):
|
|
1084
1132
|
found.
|
1085
1133
|
"""
|
1086
1134
|
try:
|
1087
|
-
|
1088
|
-
|
1135
|
+
session = db_apis.get_session()
|
1136
|
+
with session.begin():
|
1137
|
+
lb = self._lb_repo.get(session,
|
1138
|
+
id=load_balancer_id)
|
1089
1139
|
if lb is None:
|
1090
1140
|
raise exceptions.NotFound(resource=constants.LOADBALANCER,
|
1091
1141
|
id=load_balancer_id)
|
@@ -1113,8 +1163,9 @@ class ControllerWorker(object):
|
|
1113
1163
|
# here for the amphora to be created with the correct
|
1114
1164
|
# configuration.
|
1115
1165
|
if lb.flavor_id:
|
1116
|
-
|
1117
|
-
|
1166
|
+
with session.begin():
|
1167
|
+
flavor = self._flavor_repo.get_flavor_metadata_dict(
|
1168
|
+
session, lb.flavor_id)
|
1118
1169
|
flavor[constants.LOADBALANCER_TOPOLOGY] = lb.topology
|
1119
1170
|
else:
|
1120
1171
|
flavor = {constants.LOADBALANCER_TOPOLOGY: lb.topology}
|
@@ -1136,9 +1187,10 @@ class ControllerWorker(object):
|
|
1136
1187
|
constants.FLAVOR: flavor}
|
1137
1188
|
|
1138
1189
|
if lb.availability_zone:
|
1139
|
-
|
1140
|
-
|
1141
|
-
|
1190
|
+
with session.begin():
|
1191
|
+
stored_params[constants.AVAILABILITY_ZONE] = (
|
1192
|
+
self._az_repo.get_availability_zone_metadata_dict(
|
1193
|
+
session, lb.availability_zone))
|
1142
1194
|
else:
|
1143
1195
|
stored_params[constants.AVAILABILITY_ZONE] = {}
|
1144
1196
|
|
@@ -1153,9 +1205,10 @@ class ControllerWorker(object):
|
|
1153
1205
|
with excutils.save_and_reraise_exception(reraise=False):
|
1154
1206
|
LOG.exception("LB %(lbid)s failover exception: %(exc)s",
|
1155
1207
|
{'lbid': load_balancer_id, 'exc': str(e)})
|
1156
|
-
|
1157
|
-
|
1158
|
-
|
1208
|
+
with session.begin():
|
1209
|
+
self._lb_repo.update(
|
1210
|
+
session, load_balancer_id,
|
1211
|
+
provisioning_status=constants.ERROR)
|
1159
1212
|
|
1160
1213
|
def amphora_cert_rotation(self, amphora_id):
|
1161
1214
|
"""Perform cert rotation for an amphora.
|
@@ -1165,8 +1218,10 @@ class ControllerWorker(object):
|
|
1165
1218
|
:raises AmphoraNotFound: The referenced amphora was not found
|
1166
1219
|
"""
|
1167
1220
|
|
1168
|
-
|
1169
|
-
|
1221
|
+
session = db_apis.get_session()
|
1222
|
+
with session.begin():
|
1223
|
+
amp = self._amphora_repo.get(session,
|
1224
|
+
id=amphora_id)
|
1170
1225
|
LOG.info("Start amphora cert rotation, amphora's id is: %s",
|
1171
1226
|
amphora_id)
|
1172
1227
|
|
@@ -1191,13 +1246,15 @@ class ControllerWorker(object):
|
|
1191
1246
|
"""
|
1192
1247
|
LOG.info("Start amphora agent configuration update, amphora's id "
|
1193
1248
|
"is: %s", amphora_id)
|
1194
|
-
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1199
|
-
flavor =
|
1200
|
-
|
1249
|
+
session = db_apis.get_session()
|
1250
|
+
with session.begin():
|
1251
|
+
amp = self._amphora_repo.get(session, id=amphora_id)
|
1252
|
+
lb = self._amphora_repo.get_lb_for_amphora(session,
|
1253
|
+
amphora_id)
|
1254
|
+
flavor = {}
|
1255
|
+
if lb.flavor_id:
|
1256
|
+
flavor = self._flavor_repo.get_flavor_metadata_dict(
|
1257
|
+
session, lb.flavor_id)
|
1201
1258
|
|
1202
1259
|
store = {constants.AMPHORA: amp.to_dict(),
|
1203
1260
|
constants.FLAVOR: flavor}
|
@@ -60,6 +60,9 @@ class ListenerFlows(object):
|
|
60
60
|
requires=constants.LOADBALANCER_ID))
|
61
61
|
create_all_listeners_flow.add(network_tasks.UpdateVIP(
|
62
62
|
requires=constants.LISTENERS))
|
63
|
+
create_all_listeners_flow.add(
|
64
|
+
database_tasks.MarkHealthMonitorsOnlineInDB(
|
65
|
+
requires=constants.LOADBALANCER))
|
63
66
|
return create_all_listeners_flow
|
64
67
|
|
65
68
|
def get_delete_listener_flow(self):
|
@@ -91,12 +91,18 @@ class LoadBalancerFlows(object):
|
|
91
91
|
|
92
92
|
post_amp_prefix = constants.POST_LB_AMP_ASSOCIATION_SUBFLOW
|
93
93
|
lb_create_flow.add(
|
94
|
-
self.get_post_lb_amp_association_flow(
|
95
|
-
post_amp_prefix, topology, mark_active=not listeners))
|
94
|
+
self.get_post_lb_amp_association_flow(post_amp_prefix, topology))
|
96
95
|
|
97
96
|
if listeners:
|
98
97
|
lb_create_flow.add(*self._create_listeners_flow())
|
99
98
|
|
99
|
+
lb_create_flow.add(
|
100
|
+
database_tasks.MarkLBActiveInDB(
|
101
|
+
mark_subobjects=True,
|
102
|
+
requires=constants.LOADBALANCER
|
103
|
+
)
|
104
|
+
)
|
105
|
+
|
100
106
|
if CONF.controller_worker.event_notifications:
|
101
107
|
lb_create_flow.add(
|
102
108
|
notification_tasks.SendCreateNotification(
|
@@ -225,16 +231,9 @@ class LoadBalancerFlows(object):
|
|
225
231
|
flows.append(
|
226
232
|
self.listener_flows.get_create_all_listeners_flow()
|
227
233
|
)
|
228
|
-
flows.append(
|
229
|
-
database_tasks.MarkLBActiveInDB(
|
230
|
-
mark_subobjects=True,
|
231
|
-
requires=constants.LOADBALANCER
|
232
|
-
)
|
233
|
-
)
|
234
234
|
return flows
|
235
235
|
|
236
|
-
def get_post_lb_amp_association_flow(self, prefix, topology
|
237
|
-
mark_active=True):
|
236
|
+
def get_post_lb_amp_association_flow(self, prefix, topology):
|
238
237
|
"""Reload the loadbalancer and create networking subflows for
|
239
238
|
|
240
239
|
created/allocated amphorae.
|
@@ -257,10 +256,6 @@ class LoadBalancerFlows(object):
|
|
257
256
|
|
258
257
|
post_create_LB_flow.add(database_tasks.UpdateLoadbalancerInDB(
|
259
258
|
requires=[constants.LOADBALANCER, constants.UPDATE_DICT]))
|
260
|
-
if mark_active:
|
261
|
-
post_create_LB_flow.add(database_tasks.MarkLBActiveInDB(
|
262
|
-
name=sf_name + '-' + constants.MARK_LB_ACTIVE_INDB,
|
263
|
-
requires=constants.LOADBALANCER))
|
264
259
|
return post_create_LB_flow
|
265
260
|
|
266
261
|
def _get_delete_listeners_flow(self, listeners):
|