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
@@ -25,56 +25,64 @@ def process_get(get_data):
|
|
25
25
|
|
26
26
|
if get_data[constants.OBJECT] == lib_consts.LOADBALANCERS:
|
27
27
|
lb_repo = repositories.LoadBalancerRepository()
|
28
|
-
|
29
|
-
|
28
|
+
with session.begin():
|
29
|
+
db_lb = lb_repo.get(session, id=get_data[lib_consts.ID],
|
30
|
+
show_deleted=False)
|
30
31
|
if db_lb:
|
31
32
|
provider_lb = (
|
32
33
|
driver_utils.db_loadbalancer_to_provider_loadbalancer(db_lb))
|
33
34
|
return provider_lb.to_dict(recurse=True, render_unsets=True)
|
34
35
|
elif get_data[constants.OBJECT] == lib_consts.LISTENERS:
|
35
36
|
listener_repo = repositories.ListenerRepository()
|
36
|
-
|
37
|
-
|
37
|
+
with session.begin():
|
38
|
+
db_listener = listener_repo.get(
|
39
|
+
session, id=get_data[lib_consts.ID], show_deleted=False)
|
38
40
|
if db_listener:
|
39
41
|
provider_listener = (
|
40
42
|
driver_utils.db_listener_to_provider_listener(db_listener))
|
41
43
|
return provider_listener.to_dict(recurse=True, render_unsets=True)
|
42
44
|
elif get_data[constants.OBJECT] == lib_consts.POOLS:
|
43
45
|
pool_repo = repositories.PoolRepository()
|
44
|
-
|
45
|
-
|
46
|
+
with session.begin():
|
47
|
+
db_pool = pool_repo.get(session, id=get_data[lib_consts.ID],
|
48
|
+
show_deleted=False)
|
46
49
|
if db_pool:
|
47
50
|
provider_pool = (
|
48
51
|
driver_utils.db_pool_to_provider_pool(db_pool))
|
49
52
|
return provider_pool.to_dict(recurse=True, render_unsets=True)
|
50
53
|
elif get_data[constants.OBJECT] == lib_consts.MEMBERS:
|
51
54
|
member_repo = repositories.MemberRepository()
|
52
|
-
|
53
|
-
|
55
|
+
with session.begin():
|
56
|
+
db_member = member_repo.get(session, id=get_data[lib_consts.ID],
|
57
|
+
show_deleted=False)
|
54
58
|
if db_member:
|
55
59
|
provider_member = (
|
56
60
|
driver_utils.db_member_to_provider_member(db_member))
|
57
61
|
return provider_member.to_dict(recurse=True, render_unsets=True)
|
58
62
|
elif get_data[constants.OBJECT] == lib_consts.HEALTHMONITORS:
|
59
63
|
hm_repo = repositories.HealthMonitorRepository()
|
60
|
-
|
61
|
-
|
64
|
+
with session.begin():
|
65
|
+
db_hm = hm_repo.get(session, id=get_data[lib_consts.ID],
|
66
|
+
show_deleted=False)
|
62
67
|
if db_hm:
|
63
68
|
provider_hm = (
|
64
69
|
driver_utils.db_HM_to_provider_HM(db_hm))
|
65
70
|
return provider_hm.to_dict(recurse=True, render_unsets=True)
|
66
71
|
elif get_data[constants.OBJECT] == lib_consts.L7POLICIES:
|
67
72
|
l7policy_repo = repositories.L7PolicyRepository()
|
68
|
-
|
69
|
-
|
73
|
+
with session.begin():
|
74
|
+
db_l7policy = l7policy_repo.get(session,
|
75
|
+
id=get_data[lib_consts.ID],
|
76
|
+
show_deleted=False)
|
70
77
|
if db_l7policy:
|
71
78
|
provider_l7policy = (
|
72
79
|
driver_utils.db_l7policy_to_provider_l7policy(db_l7policy))
|
73
80
|
return provider_l7policy.to_dict(recurse=True, render_unsets=True)
|
74
81
|
elif get_data[constants.OBJECT] == lib_consts.L7RULES:
|
75
82
|
l7rule_repo = repositories.L7RuleRepository()
|
76
|
-
|
77
|
-
|
83
|
+
with session.begin():
|
84
|
+
db_l7rule = l7rule_repo.get(session, id=get_data[lib_consts.ID],
|
85
|
+
show_deleted=False)
|
78
86
|
if db_l7rule:
|
79
87
|
provider_l7rule = (
|
80
88
|
driver_utils.db_l7rule_to_provider_l7rule(db_l7rule))
|
@@ -46,7 +46,8 @@ class DriverUpdater(object):
|
|
46
46
|
super().__init__(**kwargs)
|
47
47
|
|
48
48
|
def _check_for_lb_vip_deallocate(self, repo, lb_id):
|
49
|
-
|
49
|
+
with self.db_session.begin():
|
50
|
+
lb = repo.get(self.db_session, id=lb_id)
|
50
51
|
if lb.vip.octavia_owned:
|
51
52
|
vip = lb.vip
|
52
53
|
# We need a backreference
|
@@ -56,7 +57,8 @@ class DriverUpdater(object):
|
|
56
57
|
network_driver.deallocate_vip(vip)
|
57
58
|
|
58
59
|
def _decrement_quota(self, repo, object_name, record_id):
|
59
|
-
lock_session =
|
60
|
+
lock_session = self.db_session
|
61
|
+
lock_session.begin()
|
60
62
|
db_object = repo.get(lock_session, id=record_id)
|
61
63
|
if db_object is None:
|
62
64
|
lock_session.rollback()
|
@@ -106,7 +108,8 @@ class DriverUpdater(object):
|
|
106
108
|
return
|
107
109
|
|
108
110
|
if delete_record and object_name != consts.LOADBALANCERS:
|
109
|
-
|
111
|
+
with self.db_session.begin():
|
112
|
+
repo.delete(self.db_session, id=record_id)
|
110
113
|
return
|
111
114
|
|
112
115
|
record_kwargs[consts.PROVISIONING_STATUS] = prov_status
|
@@ -114,7 +117,8 @@ class DriverUpdater(object):
|
|
114
117
|
if op_status:
|
115
118
|
record_kwargs[consts.OPERATING_STATUS] = op_status
|
116
119
|
if prov_status or op_status:
|
117
|
-
|
120
|
+
with self.db_session.begin():
|
121
|
+
repo.update(self.db_session, record_id, **record_kwargs)
|
118
122
|
except Exception as e:
|
119
123
|
# We need to raise a failure here to notify the driver it is
|
120
124
|
# sending bad status data.
|
octavia/api/drivers/utils.py
CHANGED
@@ -132,8 +132,10 @@ def lb_dict_to_provider_dict(lb_dict, vip=None, add_vips=None, db_pools=None,
|
|
132
132
|
new_lb_dict['vip_qos_policy_id'] = vip.qos_policy_id
|
133
133
|
if 'flavor_id' in lb_dict and lb_dict['flavor_id']:
|
134
134
|
flavor_repo = repositories.FlavorRepository()
|
135
|
-
|
136
|
-
|
135
|
+
session = db_api.get_session()
|
136
|
+
with session.begin():
|
137
|
+
new_lb_dict['flavor'] = flavor_repo.get_flavor_metadata_dict(
|
138
|
+
session, lb_dict['flavor_id'])
|
137
139
|
if add_vips:
|
138
140
|
new_lb_dict['additional_vips'] = db_additional_vips_to_provider_vips(
|
139
141
|
add_vips)
|
@@ -42,8 +42,10 @@ class OctaviaDBHealthcheck(pluginbase.HealthcheckBaseExtension):
|
|
42
42
|
result = self.last_result
|
43
43
|
message = self.last_message
|
44
44
|
else:
|
45
|
-
|
46
|
-
|
45
|
+
session = db_apis.get_session()
|
46
|
+
with session.begin():
|
47
|
+
result, message = healthcheck.check_database_connection(
|
48
|
+
session)
|
47
49
|
self.last_check = datetime.datetime.now()
|
48
50
|
self.last_result = result
|
49
51
|
self.last_message = message
|
octavia/api/root_controller.py
CHANGED
@@ -143,6 +143,9 @@ class RootController(object):
|
|
143
143
|
self._add_a_version(versions, 'v2.25', 'v2', 'SUPPORTED',
|
144
144
|
'2021-10-02T00:00:00Z', host_url)
|
145
145
|
# Additional VIPs
|
146
|
-
self._add_a_version(versions, 'v2.26', 'v2', '
|
146
|
+
self._add_a_version(versions, 'v2.26', 'v2', 'SUPPORTED',
|
147
147
|
'2022-08-29T00:00:00Z', host_url)
|
148
|
+
# HTTP Strict Transport Security (HSTS)
|
149
|
+
self._add_a_version(versions, 'v2.27', 'v2', 'CURRENT',
|
150
|
+
'2023-05-05T00:00:00Z', host_url)
|
148
151
|
return {'versions': versions}
|
@@ -28,7 +28,6 @@ from octavia.api.v2.types import amphora as amp_types
|
|
28
28
|
from octavia.common import constants
|
29
29
|
from octavia.common import exceptions
|
30
30
|
from octavia.common import rpc
|
31
|
-
from octavia.db import api as db_api
|
32
31
|
|
33
32
|
CONF = cfg.CONF
|
34
33
|
LOG = logging.getLogger(__name__)
|
@@ -50,7 +49,8 @@ class AmphoraController(base.BaseController):
|
|
50
49
|
def get_one(self, id, fields=None):
|
51
50
|
"""Gets a single amphora's details."""
|
52
51
|
context = pecan_request.context.get('octavia_context')
|
53
|
-
|
52
|
+
with context.session.begin():
|
53
|
+
db_amp = self._get_db_amp(context.session, id, show_deleted=False)
|
54
54
|
|
55
55
|
self._auth_validate_action(context, context.project_id,
|
56
56
|
constants.RBAC_GET_ONE)
|
@@ -71,9 +71,10 @@ class AmphoraController(base.BaseController):
|
|
71
71
|
self._auth_validate_action(context, context.project_id,
|
72
72
|
constants.RBAC_GET_ALL)
|
73
73
|
|
74
|
-
|
75
|
-
|
76
|
-
|
74
|
+
with context.session.begin():
|
75
|
+
db_amp, links = self.repositories.amphora.get_all_API_list(
|
76
|
+
context.session, show_deleted=False,
|
77
|
+
pagination_helper=pcontext.get(constants.PAGINATION_HELPER))
|
77
78
|
result = self._convert_db_to_type(
|
78
79
|
db_amp, [amp_types.AmphoraResponse])
|
79
80
|
if fields is not None:
|
@@ -89,10 +90,10 @@ class AmphoraController(base.BaseController):
|
|
89
90
|
self._auth_validate_action(context, context.project_id,
|
90
91
|
constants.RBAC_DELETE)
|
91
92
|
|
92
|
-
with
|
93
|
+
with context.session.begin():
|
93
94
|
try:
|
94
95
|
self.repositories.amphora.test_and_set_status_for_delete(
|
95
|
-
|
96
|
+
context.session, id)
|
96
97
|
except sa_exception.NoResultFound as e:
|
97
98
|
raise exceptions.NotFound(resource='Amphora', id=id) from e
|
98
99
|
|
@@ -124,12 +125,8 @@ class FailoverController(base.BaseController):
|
|
124
125
|
|
125
126
|
def __init__(self, amp_id):
|
126
127
|
super().__init__()
|
127
|
-
|
128
|
-
|
129
|
-
version = "1.0"
|
130
|
-
else:
|
131
|
-
topic = constants.TOPIC_AMPHORA_V2
|
132
|
-
version = "2.0"
|
128
|
+
topic = constants.TOPIC_AMPHORA_V2
|
129
|
+
version = "2.0"
|
133
130
|
self.target = messaging.Target(
|
134
131
|
namespace=constants.RPC_NAMESPACE_CONTROLLER_AGENT,
|
135
132
|
topic=topic, version=version, fanout=False)
|
@@ -141,27 +138,29 @@ class FailoverController(base.BaseController):
|
|
141
138
|
"""Fails over an amphora"""
|
142
139
|
pcontext = pecan_request.context
|
143
140
|
context = pcontext.get('octavia_context')
|
144
|
-
|
145
|
-
|
141
|
+
with context.session.begin():
|
142
|
+
db_amp = self._get_db_amp(context.session, self.amp_id,
|
143
|
+
show_deleted=False)
|
146
144
|
|
147
145
|
self._auth_validate_action(
|
148
146
|
context, db_amp.load_balancer.project_id,
|
149
147
|
constants.RBAC_PUT_FAILOVER)
|
150
148
|
|
151
|
-
|
152
|
-
|
153
|
-
|
149
|
+
with context.session.begin():
|
150
|
+
self.repositories.load_balancer.test_and_set_provisioning_status(
|
151
|
+
context.session, db_amp.load_balancer_id,
|
152
|
+
status=constants.PENDING_UPDATE, raise_exception=True)
|
154
153
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
154
|
+
try:
|
155
|
+
LOG.info("Sending failover request for amphora %s to the "
|
156
|
+
"queue", self.amp_id)
|
157
|
+
payload = {constants.AMPHORA_ID: db_amp.id}
|
158
|
+
self.client.cast({}, 'failover_amphora', **payload)
|
159
|
+
except Exception:
|
160
|
+
with excutils.save_and_reraise_exception(reraise=False):
|
161
|
+
self.repositories.load_balancer.update(
|
162
|
+
context.session, db_amp.load_balancer.id,
|
163
|
+
provisioning_status=constants.ERROR)
|
165
164
|
|
166
165
|
|
167
166
|
class AmphoraUpdateController(base.BaseController):
|
@@ -170,12 +169,8 @@ class AmphoraUpdateController(base.BaseController):
|
|
170
169
|
def __init__(self, amp_id):
|
171
170
|
super().__init__()
|
172
171
|
|
173
|
-
|
174
|
-
|
175
|
-
version = "1.0"
|
176
|
-
else:
|
177
|
-
topic = constants.TOPIC_AMPHORA_V2
|
178
|
-
version = "2.0"
|
172
|
+
topic = constants.TOPIC_AMPHORA_V2
|
173
|
+
version = "2.0"
|
179
174
|
self.target = messaging.Target(
|
180
175
|
namespace=constants.RPC_NAMESPACE_CONTROLLER_AGENT,
|
181
176
|
topic=topic, version=version, fanout=False)
|
@@ -187,8 +182,9 @@ class AmphoraUpdateController(base.BaseController):
|
|
187
182
|
"""Update amphora agent configuration"""
|
188
183
|
pcontext = pecan_request.context
|
189
184
|
context = pcontext.get('octavia_context')
|
190
|
-
|
191
|
-
|
185
|
+
with context.session.begin():
|
186
|
+
db_amp = self._get_db_amp(context.session, self.amp_id,
|
187
|
+
show_deleted=False)
|
192
188
|
|
193
189
|
self._auth_validate_action(
|
194
190
|
context, db_amp.load_balancer.project_id,
|
@@ -220,8 +216,9 @@ class AmphoraStatsController(base.BaseController):
|
|
220
216
|
self._auth_validate_action(context, context.project_id,
|
221
217
|
constants.RBAC_GET_STATS)
|
222
218
|
|
223
|
-
|
224
|
-
|
219
|
+
with context.session.begin():
|
220
|
+
stats = self.repositories.get_amphora_stats(context.session,
|
221
|
+
self.amp_id)
|
225
222
|
if not stats:
|
226
223
|
raise exceptions.NotFound(resource='Amphora stats for',
|
227
224
|
id=self.amp_id)
|
@@ -28,7 +28,6 @@ from octavia.api.v2.controllers import base
|
|
28
28
|
from octavia.api.v2.types import availability_zone_profile as profile_types
|
29
29
|
from octavia.common import constants
|
30
30
|
from octavia.common import exceptions
|
31
|
-
from octavia.db import api as db_api
|
32
31
|
|
33
32
|
LOG = logging.getLogger(__name__)
|
34
33
|
|
@@ -49,8 +48,9 @@ class AvailabilityZoneProfileController(base.BaseController):
|
|
49
48
|
if id == constants.NIL_UUID:
|
50
49
|
raise exceptions.NotFound(resource='Availability Zone Profile',
|
51
50
|
id=constants.NIL_UUID)
|
52
|
-
|
53
|
-
|
51
|
+
with context.session.begin():
|
52
|
+
db_availability_zone_profile = (
|
53
|
+
self._get_db_availability_zone_profile(context.session, id))
|
54
54
|
result = self._convert_db_to_type(
|
55
55
|
db_availability_zone_profile,
|
56
56
|
profile_types.AvailabilityZoneProfileResponse)
|
@@ -67,10 +67,12 @@ class AvailabilityZoneProfileController(base.BaseController):
|
|
67
67
|
context = pcontext.get('octavia_context')
|
68
68
|
self._auth_validate_action(context, context.project_id,
|
69
69
|
constants.RBAC_GET_ALL)
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
70
|
+
with context.session.begin():
|
71
|
+
db_availability_zone_profiles, links = (
|
72
|
+
self.repositories.availability_zone_profile.get_all(
|
73
|
+
context.session,
|
74
|
+
pagination_helper=pcontext.get(
|
75
|
+
constants.PAGINATION_HELPER)))
|
74
76
|
result = self._convert_db_to_type(
|
75
77
|
db_availability_zone_profiles,
|
76
78
|
[profile_types.AvailabilityZoneProfileResponse])
|
@@ -106,21 +108,21 @@ class AvailabilityZoneProfileController(base.BaseController):
|
|
106
108
|
driver.name, driver.validate_availability_zone,
|
107
109
|
availability_zone_data_dict)
|
108
110
|
|
109
|
-
|
111
|
+
context.session.begin()
|
110
112
|
try:
|
111
113
|
availability_zone_profile_dict = availability_zone_profile.to_dict(
|
112
114
|
render_unsets=True)
|
113
115
|
availability_zone_profile_dict['id'] = uuidutils.generate_uuid()
|
114
116
|
db_availability_zone_profile = (
|
115
117
|
self.repositories.availability_zone_profile.create(
|
116
|
-
|
117
|
-
|
118
|
+
context.session, **availability_zone_profile_dict))
|
119
|
+
context.session.commit()
|
118
120
|
except odb_exceptions.DBDuplicateEntry as e:
|
119
|
-
|
121
|
+
context.session.rollback()
|
120
122
|
raise exceptions.IDAlreadyExists() from e
|
121
123
|
except Exception:
|
122
124
|
with excutils.save_and_reraise_exception():
|
123
|
-
|
125
|
+
context.session.rollback()
|
124
126
|
result = self._convert_db_to_type(
|
125
127
|
db_availability_zone_profile,
|
126
128
|
profile_types.AvailabilityZoneProfileResponse)
|
@@ -159,7 +161,8 @@ class AvailabilityZoneProfileController(base.BaseController):
|
|
159
161
|
self._auth_validate_action(context, context.project_id,
|
160
162
|
constants.RBAC_PUT)
|
161
163
|
|
162
|
-
|
164
|
+
with context.session.begin():
|
165
|
+
self._validate_update_azp(context, id, availability_zone_profile)
|
163
166
|
if id == constants.NIL_UUID:
|
164
167
|
raise exceptions.NotFound(resource='Availability Zone Profile',
|
165
168
|
id=constants.NIL_UUID)
|
@@ -177,9 +180,10 @@ class AvailabilityZoneProfileController(base.BaseController):
|
|
177
180
|
|
178
181
|
if isinstance(availability_zone_profile.provider_name,
|
179
182
|
wtypes.UnsetType):
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
+
with context.session.begin():
|
184
|
+
db_availability_zone_profile = (
|
185
|
+
self._get_db_availability_zone_profile(
|
186
|
+
context.session, id))
|
183
187
|
provider_driver = db_availability_zone_profile.provider_name
|
184
188
|
else:
|
185
189
|
provider_driver = availability_zone_profile.provider_name
|
@@ -190,23 +194,25 @@ class AvailabilityZoneProfileController(base.BaseController):
|
|
190
194
|
driver.name, driver.validate_availability_zone,
|
191
195
|
availability_zone_data_dict)
|
192
196
|
|
193
|
-
|
197
|
+
context.session.begin()
|
194
198
|
try:
|
195
199
|
availability_zone_profile_dict = availability_zone_profile.to_dict(
|
196
200
|
render_unsets=False)
|
197
201
|
if availability_zone_profile_dict:
|
198
202
|
self.repositories.availability_zone_profile.update(
|
199
|
-
|
200
|
-
|
203
|
+
context.session, id, **availability_zone_profile_dict)
|
204
|
+
context.session.commit()
|
201
205
|
except Exception:
|
202
206
|
with excutils.save_and_reraise_exception():
|
203
|
-
|
207
|
+
context.session.rollback()
|
204
208
|
|
205
209
|
# Force SQL alchemy to query the DB, otherwise we get inconsistent
|
206
210
|
# results
|
207
211
|
context.session.expire_all()
|
208
|
-
|
209
|
-
|
212
|
+
with context.session.begin():
|
213
|
+
db_availability_zone_profile = (
|
214
|
+
self._get_db_availability_zone_profile(context.session,
|
215
|
+
id))
|
210
216
|
result = self._convert_db_to_type(
|
211
217
|
db_availability_zone_profile,
|
212
218
|
profile_types.AvailabilityZoneProfileResponse)
|
@@ -224,14 +230,18 @@ class AvailabilityZoneProfileController(base.BaseController):
|
|
224
230
|
raise exceptions.NotFound(resource='Availability Zone Profile',
|
225
231
|
id=constants.NIL_UUID)
|
226
232
|
# Don't allow it to be deleted if it is in use by an availability zone
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
233
|
+
with context.session.begin():
|
234
|
+
if self.repositories.availability_zone.count(
|
235
|
+
context.session,
|
236
|
+
availability_zone_profile_id=availability_zone_profile_id
|
237
|
+
) > 0:
|
238
|
+
raise exceptions.ObjectInUse(
|
239
|
+
object='Availability Zone Profile',
|
240
|
+
id=availability_zone_profile_id)
|
241
|
+
try:
|
242
|
+
self.repositories.availability_zone_profile.delete(
|
243
|
+
context.session, id=availability_zone_profile_id)
|
244
|
+
except sa_exception.NoResultFound as e:
|
245
|
+
raise exceptions.NotFound(
|
246
|
+
resource='Availability Zone Profile',
|
247
|
+
id=availability_zone_profile_id) from e
|
@@ -46,8 +46,9 @@ class AvailabilityZonesController(base.BaseController):
|
|
46
46
|
if name == constants.NIL_UUID:
|
47
47
|
raise exceptions.NotFound(resource='Availability Zone',
|
48
48
|
id=constants.NIL_UUID)
|
49
|
-
|
50
|
-
|
49
|
+
with context.session.begin():
|
50
|
+
db_availability_zone = self._get_db_availability_zone(
|
51
|
+
context.session, name)
|
51
52
|
result = self._convert_db_to_type(
|
52
53
|
db_availability_zone,
|
53
54
|
availability_zone_types.AvailabilityZoneResponse)
|
@@ -64,10 +65,12 @@ class AvailabilityZonesController(base.BaseController):
|
|
64
65
|
context = pcontext.get('octavia_context')
|
65
66
|
self._auth_validate_action(context, context.project_id,
|
66
67
|
constants.RBAC_GET_ALL)
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
68
|
+
with context.session.begin():
|
69
|
+
db_availability_zones, links = (
|
70
|
+
self.repositories.availability_zone.get_all(
|
71
|
+
context.session,
|
72
|
+
pagination_helper=pcontext.get(
|
73
|
+
constants.PAGINATION_HELPER)))
|
71
74
|
result = self._convert_db_to_type(
|
72
75
|
db_availability_zones,
|
73
76
|
[availability_zone_types.AvailabilityZoneResponse])
|
@@ -86,20 +89,20 @@ class AvailabilityZonesController(base.BaseController):
|
|
86
89
|
self._auth_validate_action(context, context.project_id,
|
87
90
|
constants.RBAC_POST)
|
88
91
|
|
89
|
-
|
92
|
+
context.session.begin()
|
90
93
|
try:
|
91
94
|
availability_zone_dict = availability_zone.to_dict(
|
92
95
|
render_unsets=True)
|
93
96
|
db_availability_zone = self.repositories.availability_zone.create(
|
94
|
-
|
95
|
-
|
97
|
+
context.session, **availability_zone_dict)
|
98
|
+
context.session.commit()
|
96
99
|
except odb_exceptions.DBDuplicateEntry as e:
|
97
|
-
|
100
|
+
context.session.rollback()
|
98
101
|
raise exceptions.RecordAlreadyExists(
|
99
102
|
field='availability zone', name=availability_zone.name) from e
|
100
103
|
except Exception:
|
101
104
|
with excutils.save_and_reraise_exception():
|
102
|
-
|
105
|
+
context.session.rollback()
|
103
106
|
result = self._convert_db_to_type(
|
104
107
|
db_availability_zone,
|
105
108
|
availability_zone_types.AvailabilityZoneResponse)
|
@@ -117,23 +120,24 @@ class AvailabilityZonesController(base.BaseController):
|
|
117
120
|
if name == constants.NIL_UUID:
|
118
121
|
raise exceptions.NotFound(resource='Availability Zone',
|
119
122
|
id=constants.NIL_UUID)
|
120
|
-
|
123
|
+
context.session.begin()
|
121
124
|
try:
|
122
125
|
availability_zone_dict = availability_zone.to_dict(
|
123
126
|
render_unsets=False)
|
124
127
|
if availability_zone_dict:
|
125
128
|
self.repositories.availability_zone.update(
|
126
|
-
|
127
|
-
|
129
|
+
context.session, name, **availability_zone_dict)
|
130
|
+
context.session.commit()
|
128
131
|
except Exception:
|
129
132
|
with excutils.save_and_reraise_exception():
|
130
|
-
|
133
|
+
context.session.rollback()
|
131
134
|
|
132
135
|
# Force SQL alchemy to query the DB, otherwise we get inconsistent
|
133
136
|
# results
|
134
137
|
context.session.expire_all()
|
135
|
-
|
136
|
-
|
138
|
+
with context.session.begin():
|
139
|
+
db_availability_zone = self._get_db_availability_zone(
|
140
|
+
context.session, name)
|
137
141
|
result = self._convert_db_to_type(
|
138
142
|
db_availability_zone,
|
139
143
|
availability_zone_types.AvailabilityZoneResponse)
|
@@ -151,7 +155,7 @@ class AvailabilityZonesController(base.BaseController):
|
|
151
155
|
if availability_zone_name == constants.NIL_UUID:
|
152
156
|
raise exceptions.NotFound(resource='Availability Zone',
|
153
157
|
id=constants.NIL_UUID)
|
154
|
-
serial_session = db_api.get_session(
|
158
|
+
serial_session = db_api.get_session()
|
155
159
|
serial_session.connection(
|
156
160
|
execution_options={'isolation_level': 'SERIALIZABLE'})
|
157
161
|
try:
|