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
@@ -29,7 +29,6 @@ from octavia.api.v2.controllers import base
|
|
29
29
|
from octavia.api.v2.types import flavor_profile as profile_types
|
30
30
|
from octavia.common import constants
|
31
31
|
from octavia.common import exceptions
|
32
|
-
from octavia.db import api as db_api
|
33
32
|
|
34
33
|
LOG = logging.getLogger(__name__)
|
35
34
|
|
@@ -50,7 +49,9 @@ class FlavorProfileController(base.BaseController):
|
|
50
49
|
if id == constants.NIL_UUID:
|
51
50
|
raise exceptions.NotFound(resource='Flavor profile',
|
52
51
|
id=constants.NIL_UUID)
|
53
|
-
|
52
|
+
with context.session.begin():
|
53
|
+
db_flavor_profile = self._get_db_flavor_profile(context.session,
|
54
|
+
id)
|
54
55
|
result = self._convert_db_to_type(db_flavor_profile,
|
55
56
|
profile_types.FlavorProfileResponse)
|
56
57
|
if fields is not None:
|
@@ -65,9 +66,12 @@ class FlavorProfileController(base.BaseController):
|
|
65
66
|
context = pcontext.get('octavia_context')
|
66
67
|
self._auth_validate_action(context, context.project_id,
|
67
68
|
constants.RBAC_GET_ALL)
|
68
|
-
|
69
|
-
|
70
|
-
|
69
|
+
with context.session.begin():
|
70
|
+
db_flavor_profiles, links = (
|
71
|
+
self.repositories.flavor_profile.get_all(
|
72
|
+
context.session,
|
73
|
+
pagination_helper=pcontext.get(
|
74
|
+
constants.PAGINATION_HELPER)))
|
71
75
|
result = self._convert_db_to_type(
|
72
76
|
db_flavor_profiles, [profile_types.FlavorProfileResponse])
|
73
77
|
if fields is not None:
|
@@ -97,19 +101,19 @@ class FlavorProfileController(base.BaseController):
|
|
97
101
|
driver_utils.call_provider(driver.name, driver.validate_flavor,
|
98
102
|
flavor_data_dict)
|
99
103
|
|
100
|
-
|
104
|
+
context.session.begin()
|
101
105
|
try:
|
102
106
|
flavorprofile_dict = flavorprofile.to_dict(render_unsets=True)
|
103
107
|
flavorprofile_dict['id'] = uuidutils.generate_uuid()
|
104
108
|
db_flavor_profile = self.repositories.flavor_profile.create(
|
105
|
-
|
106
|
-
|
109
|
+
context.session, **flavorprofile_dict)
|
110
|
+
context.session.commit()
|
107
111
|
except odb_exceptions.DBDuplicateEntry as e:
|
108
|
-
|
112
|
+
context.session.rollback()
|
109
113
|
raise exceptions.IDAlreadyExists() from e
|
110
114
|
except Exception:
|
111
115
|
with excutils.save_and_reraise_exception():
|
112
|
-
|
116
|
+
context.session.rollback()
|
113
117
|
result = self._convert_db_to_type(
|
114
118
|
db_flavor_profile, profile_types.FlavorProfileResponse)
|
115
119
|
return profile_types.FlavorProfileRootResponse(flavorprofile=result)
|
@@ -142,7 +146,8 @@ class FlavorProfileController(base.BaseController):
|
|
142
146
|
self._auth_validate_action(context, context.project_id,
|
143
147
|
constants.RBAC_PUT)
|
144
148
|
|
145
|
-
|
149
|
+
with context.session.begin():
|
150
|
+
self._validate_update_fp(context, id, flavorprofile)
|
146
151
|
if id == constants.NIL_UUID:
|
147
152
|
raise exceptions.NotFound(resource='Flavor profile',
|
148
153
|
id=constants.NIL_UUID)
|
@@ -157,8 +162,9 @@ class FlavorProfileController(base.BaseController):
|
|
157
162
|
option=constants.FLAVOR_DATA) from e
|
158
163
|
|
159
164
|
if isinstance(flavorprofile.provider_name, wtypes.UnsetType):
|
160
|
-
|
161
|
-
|
165
|
+
with context.session.begin():
|
166
|
+
db_flavor_profile = self._get_db_flavor_profile(
|
167
|
+
context.session, id)
|
162
168
|
provider_driver = db_flavor_profile.provider_name
|
163
169
|
else:
|
164
170
|
provider_driver = flavorprofile.provider_name
|
@@ -168,21 +174,23 @@ class FlavorProfileController(base.BaseController):
|
|
168
174
|
driver_utils.call_provider(driver.name, driver.validate_flavor,
|
169
175
|
flavor_data_dict)
|
170
176
|
|
171
|
-
|
177
|
+
context.session.begin()
|
172
178
|
try:
|
173
179
|
flavorprofile_dict = flavorprofile.to_dict(render_unsets=False)
|
174
180
|
if flavorprofile_dict:
|
175
|
-
self.repositories.flavor_profile.update(
|
181
|
+
self.repositories.flavor_profile.update(context.session, id,
|
176
182
|
**flavorprofile_dict)
|
177
|
-
|
183
|
+
context.session.commit()
|
178
184
|
except Exception:
|
179
185
|
with excutils.save_and_reraise_exception():
|
180
|
-
|
186
|
+
context.session.rollback()
|
181
187
|
|
182
188
|
# Force SQL alchemy to query the DB, otherwise we get inconsistent
|
183
189
|
# results
|
184
190
|
context.session.expire_all()
|
185
|
-
|
191
|
+
with context.session.begin():
|
192
|
+
db_flavor_profile = self._get_db_flavor_profile(context.session,
|
193
|
+
id)
|
186
194
|
result = self._convert_db_to_type(
|
187
195
|
db_flavor_profile, profile_types.FlavorProfileResponse)
|
188
196
|
return profile_types.FlavorProfileRootResponse(flavorprofile=result)
|
@@ -200,13 +208,14 @@ class FlavorProfileController(base.BaseController):
|
|
200
208
|
id=constants.NIL_UUID)
|
201
209
|
|
202
210
|
# Don't allow it to be deleted if it is in use by a flavor
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
211
|
+
with context.session.begin():
|
212
|
+
if self.repositories.flavor.count(
|
213
|
+
context.session, flavor_profile_id=flavor_profile_id) > 0:
|
214
|
+
raise exceptions.ObjectInUse(object='Flavor profile',
|
215
|
+
id=flavor_profile_id)
|
216
|
+
try:
|
217
|
+
self.repositories.flavor_profile.delete(context.session,
|
218
|
+
id=flavor_profile_id)
|
219
|
+
except sa_exception.NoResultFound as e:
|
220
|
+
raise exceptions.NotFound(
|
221
|
+
resource='Flavor profile', id=flavor_profile_id) from e
|
@@ -47,7 +47,8 @@ class FlavorsController(base.BaseController):
|
|
47
47
|
constants.RBAC_GET_ONE)
|
48
48
|
if id == constants.NIL_UUID:
|
49
49
|
raise exceptions.NotFound(resource='Flavor', id=constants.NIL_UUID)
|
50
|
-
|
50
|
+
with context.session.begin():
|
51
|
+
db_flavor = self._get_db_flavor(context.session, id)
|
51
52
|
result = self._convert_db_to_type(db_flavor,
|
52
53
|
flavor_types.FlavorResponse)
|
53
54
|
if fields is not None:
|
@@ -62,9 +63,10 @@ class FlavorsController(base.BaseController):
|
|
62
63
|
context = pcontext.get('octavia_context')
|
63
64
|
self._auth_validate_action(context, context.project_id,
|
64
65
|
constants.RBAC_GET_ALL)
|
65
|
-
|
66
|
-
|
67
|
-
|
66
|
+
with context.session.begin():
|
67
|
+
db_flavors, links = self.repositories.flavor.get_all(
|
68
|
+
context.session,
|
69
|
+
pagination_helper=pcontext.get(constants.PAGINATION_HELPER))
|
68
70
|
result = self._convert_db_to_type(
|
69
71
|
db_flavors, [flavor_types.FlavorResponse])
|
70
72
|
if fields is not None:
|
@@ -83,20 +85,20 @@ class FlavorsController(base.BaseController):
|
|
83
85
|
|
84
86
|
# TODO(johnsom) Validate the flavor profile ID
|
85
87
|
|
86
|
-
|
88
|
+
context.session.begin()
|
87
89
|
try:
|
88
90
|
flavor_dict = flavor.to_dict(render_unsets=True)
|
89
91
|
flavor_dict['id'] = uuidutils.generate_uuid()
|
90
|
-
db_flavor = self.repositories.flavor.create(
|
92
|
+
db_flavor = self.repositories.flavor.create(context.session,
|
91
93
|
**flavor_dict)
|
92
|
-
|
94
|
+
context.session.commit()
|
93
95
|
except odb_exceptions.DBDuplicateEntry as e:
|
94
|
-
|
96
|
+
context.session.rollback()
|
95
97
|
raise exceptions.RecordAlreadyExists(field='flavor',
|
96
98
|
name=flavor.name) from e
|
97
99
|
except Exception:
|
98
100
|
with excutils.save_and_reraise_exception():
|
99
|
-
|
101
|
+
context.session.rollback()
|
100
102
|
result = self._convert_db_to_type(db_flavor,
|
101
103
|
flavor_types.FlavorResponse)
|
102
104
|
return flavor_types.FlavorRootResponse(flavor=result)
|
@@ -111,21 +113,22 @@ class FlavorsController(base.BaseController):
|
|
111
113
|
constants.RBAC_PUT)
|
112
114
|
if id == constants.NIL_UUID:
|
113
115
|
raise exceptions.NotFound(resource='Flavor', id=constants.NIL_UUID)
|
114
|
-
|
116
|
+
context.session.begin()
|
115
117
|
try:
|
116
118
|
flavor_dict = flavor.to_dict(render_unsets=False)
|
117
119
|
if flavor_dict:
|
118
|
-
self.repositories.flavor.update(
|
120
|
+
self.repositories.flavor.update(context.session, id,
|
119
121
|
**flavor_dict)
|
120
|
-
|
122
|
+
context.session.commit()
|
121
123
|
except Exception:
|
122
124
|
with excutils.save_and_reraise_exception():
|
123
|
-
|
125
|
+
context.session.rollback()
|
124
126
|
|
125
127
|
# Force SQL alchemy to query the DB, otherwise we get inconsistent
|
126
128
|
# results
|
127
129
|
context.session.expire_all()
|
128
|
-
|
130
|
+
with context.session.begin():
|
131
|
+
db_flavor = self._get_db_flavor(context.session, id)
|
129
132
|
result = self._convert_db_to_type(db_flavor,
|
130
133
|
flavor_types.FlavorResponse)
|
131
134
|
return flavor_types.FlavorRootResponse(flavor=result)
|
@@ -140,7 +143,8 @@ class FlavorsController(base.BaseController):
|
|
140
143
|
constants.RBAC_DELETE)
|
141
144
|
if flavor_id == constants.NIL_UUID:
|
142
145
|
raise exceptions.NotFound(resource='Flavor', id=constants.NIL_UUID)
|
143
|
-
serial_session = db_api.get_session(
|
146
|
+
serial_session = db_api.get_session()
|
147
|
+
serial_session.begin()
|
144
148
|
serial_session.connection(
|
145
149
|
execution_options={'isolation_level': 'SERIALIZABLE'})
|
146
150
|
try:
|
@@ -30,7 +30,6 @@ from octavia.api.v2.types import health_monitor as hm_types
|
|
30
30
|
from octavia.common import constants as consts
|
31
31
|
from octavia.common import data_models
|
32
32
|
from octavia.common import exceptions
|
33
|
-
from octavia.db import api as db_api
|
34
33
|
from octavia.db import prepare as db_prepare
|
35
34
|
from octavia.i18n import _
|
36
35
|
|
@@ -50,7 +49,8 @@ class HealthMonitorController(base.BaseController):
|
|
50
49
|
def get_one(self, id, fields=None):
|
51
50
|
"""Gets a single healthmonitor's details."""
|
52
51
|
context = pecan_request.context.get('octavia_context')
|
53
|
-
|
52
|
+
with context.session.begin():
|
53
|
+
db_hm = self._get_db_hm(context.session, id, show_deleted=False)
|
54
54
|
|
55
55
|
self._auth_validate_action(context, db_hm.project_id,
|
56
56
|
consts.RBAC_GET_ONE)
|
@@ -70,10 +70,11 @@ class HealthMonitorController(base.BaseController):
|
|
70
70
|
|
71
71
|
query_filter = self._auth_get_all(context, project_id)
|
72
72
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
73
|
+
with context.session.begin():
|
74
|
+
db_hm, links = self.repositories.health_monitor.get_all_API_list(
|
75
|
+
context.session, show_deleted=False,
|
76
|
+
pagination_helper=pcontext.get(consts.PAGINATION_HELPER),
|
77
|
+
**query_filter)
|
77
78
|
result = self._convert_db_to_type(
|
78
79
|
db_hm, [hm_types.HealthMonitorResponse])
|
79
80
|
if fields is not None:
|
@@ -155,8 +156,10 @@ class HealthMonitorController(base.BaseController):
|
|
155
156
|
option='health monitors HTTP 1.1 domain name health check')
|
156
157
|
|
157
158
|
try:
|
158
|
-
|
159
|
+
ret = self.repositories.health_monitor.create(
|
159
160
|
lock_session, **hm_dict)
|
161
|
+
lock_session.flush()
|
162
|
+
return ret
|
160
163
|
except odb_exceptions.DBDuplicateEntry as e:
|
161
164
|
raise exceptions.DuplicateHealthMonitor() from e
|
162
165
|
except odb_exceptions.DBReferenceError as e:
|
@@ -200,10 +203,12 @@ class HealthMonitorController(base.BaseController):
|
|
200
203
|
context = pecan_request.context.get('octavia_context')
|
201
204
|
health_monitor = health_monitor_.healthmonitor
|
202
205
|
|
203
|
-
|
206
|
+
with context.session.begin():
|
207
|
+
pool = self._get_db_pool(context.session, health_monitor.pool_id)
|
204
208
|
|
205
|
-
|
206
|
-
|
209
|
+
health_monitor.project_id, provider = (
|
210
|
+
self._get_lb_project_id_provider(context.session,
|
211
|
+
pool.load_balancer_id))
|
207
212
|
|
208
213
|
self._auth_validate_action(context, health_monitor.project_id,
|
209
214
|
consts.RBAC_POST)
|
@@ -230,11 +235,11 @@ class HealthMonitorController(base.BaseController):
|
|
230
235
|
# Load the driver early as it also provides validation
|
231
236
|
driver = driver_factory.get_driver(provider)
|
232
237
|
|
233
|
-
|
238
|
+
context.session.begin()
|
234
239
|
try:
|
235
240
|
if self.repositories.check_quota_met(
|
236
241
|
context.session,
|
237
|
-
|
242
|
+
context.session,
|
238
243
|
data_models.HealthMonitor,
|
239
244
|
health_monitor.project_id):
|
240
245
|
raise exceptions.QuotaException(
|
@@ -244,8 +249,8 @@ class HealthMonitorController(base.BaseController):
|
|
244
249
|
health_monitor.to_dict(render_unsets=True))
|
245
250
|
|
246
251
|
self._test_lb_and_listener_and_pool_statuses(
|
247
|
-
|
248
|
-
db_hm = self._validate_create_hm(
|
252
|
+
context.session, health_monitor)
|
253
|
+
db_hm = self._validate_create_hm(context.session, hm_dict)
|
249
254
|
|
250
255
|
# Prepare the data for the driver data model
|
251
256
|
provider_healthmon = driver_utils.db_HM_to_provider_HM(db_hm)
|
@@ -256,16 +261,17 @@ class HealthMonitorController(base.BaseController):
|
|
256
261
|
driver_utils.call_provider(
|
257
262
|
driver.name, driver.health_monitor_create, provider_healthmon)
|
258
263
|
|
259
|
-
|
264
|
+
context.session.commit()
|
260
265
|
except odb_exceptions.DBError as e:
|
261
|
-
|
266
|
+
context.session.rollback()
|
262
267
|
raise exceptions.InvalidOption(
|
263
268
|
value=hm_dict.get('type'), option='type') from e
|
264
269
|
except Exception:
|
265
270
|
with excutils.save_and_reraise_exception():
|
266
|
-
|
271
|
+
context.session.rollback()
|
267
272
|
|
268
|
-
|
273
|
+
with context.session.begin():
|
274
|
+
db_hm = self._get_db_hm(context.session, db_hm.id)
|
269
275
|
result = self._convert_db_to_type(
|
270
276
|
db_hm, hm_types.HealthMonitorResponse)
|
271
277
|
return hm_types.HealthMonitorRootResponse(healthmonitor=result)
|
@@ -342,11 +348,12 @@ class HealthMonitorController(base.BaseController):
|
|
342
348
|
"""Updates a health monitor."""
|
343
349
|
context = pecan_request.context.get('octavia_context')
|
344
350
|
health_monitor = health_monitor_.healthmonitor
|
345
|
-
|
351
|
+
with context.session.begin():
|
352
|
+
db_hm = self._get_db_hm(context.session, id, show_deleted=False)
|
346
353
|
|
347
|
-
|
348
|
-
|
349
|
-
|
354
|
+
pool = self._get_db_pool(context.session, db_hm.pool_id)
|
355
|
+
project_id, provider = self._get_lb_project_id_provider(
|
356
|
+
context.session, pool.load_balancer_id)
|
350
357
|
|
351
358
|
self._auth_validate_action(context, project_id, consts.RBAC_PUT)
|
352
359
|
|
@@ -363,9 +370,10 @@ class HealthMonitorController(base.BaseController):
|
|
363
370
|
# Load the driver early as it also provides validation
|
364
371
|
driver = driver_factory.get_driver(provider)
|
365
372
|
|
366
|
-
with
|
373
|
+
with context.session.begin():
|
367
374
|
|
368
|
-
self._test_lb_and_listener_and_pool_statuses(
|
375
|
+
self._test_lb_and_listener_and_pool_statuses(context.session,
|
376
|
+
db_hm)
|
369
377
|
|
370
378
|
# Prepare the data for the driver data model
|
371
379
|
healthmon_dict = health_monitor.to_dict(render_unsets=False)
|
@@ -387,13 +395,14 @@ class HealthMonitorController(base.BaseController):
|
|
387
395
|
# Update the database to reflect what the driver just accepted
|
388
396
|
health_monitor.provisioning_status = consts.PENDING_UPDATE
|
389
397
|
db_hm_dict = health_monitor.to_dict(render_unsets=False)
|
390
|
-
self.repositories.health_monitor.update(
|
398
|
+
self.repositories.health_monitor.update(context.session, id,
|
391
399
|
**db_hm_dict)
|
392
400
|
|
393
401
|
# Force SQL alchemy to query the DB, otherwise we get inconsistent
|
394
402
|
# results
|
395
403
|
context.session.expire_all()
|
396
|
-
|
404
|
+
with context.session.begin():
|
405
|
+
db_hm = self._get_db_hm(context.session, id)
|
397
406
|
result = self._convert_db_to_type(
|
398
407
|
db_hm, hm_types.HealthMonitorResponse)
|
399
408
|
return hm_types.HealthMonitorRootResponse(healthmonitor=result)
|
@@ -402,11 +411,12 @@ class HealthMonitorController(base.BaseController):
|
|
402
411
|
def delete(self, id):
|
403
412
|
"""Deletes a health monitor."""
|
404
413
|
context = pecan_request.context.get('octavia_context')
|
405
|
-
|
414
|
+
with context.session.begin():
|
415
|
+
db_hm = self._get_db_hm(context.session, id, show_deleted=False)
|
406
416
|
|
407
|
-
|
408
|
-
|
409
|
-
|
417
|
+
pool = self._get_db_pool(context.session, db_hm.pool_id)
|
418
|
+
project_id, provider = self._get_lb_project_id_provider(
|
419
|
+
context.session, pool.load_balancer_id)
|
410
420
|
|
411
421
|
self._auth_validate_action(context, project_id, consts.RBAC_DELETE)
|
412
422
|
|
@@ -416,12 +426,13 @@ class HealthMonitorController(base.BaseController):
|
|
416
426
|
# Load the driver early as it also provides validation
|
417
427
|
driver = driver_factory.get_driver(provider)
|
418
428
|
|
419
|
-
with
|
429
|
+
with context.session.begin():
|
420
430
|
|
421
|
-
self._test_lb_and_listener_and_pool_statuses(
|
431
|
+
self._test_lb_and_listener_and_pool_statuses(context.session,
|
432
|
+
db_hm)
|
422
433
|
|
423
434
|
self.repositories.health_monitor.update(
|
424
|
-
|
435
|
+
context.session, db_hm.id,
|
425
436
|
provisioning_status=consts.PENDING_DELETE)
|
426
437
|
|
427
438
|
LOG.info("Sending delete Health Monitor %s to provider %s",
|
@@ -32,7 +32,6 @@ from octavia.common import constants
|
|
32
32
|
from octavia.common import data_models
|
33
33
|
from octavia.common import exceptions
|
34
34
|
from octavia.common import validate
|
35
|
-
from octavia.db import api as db_api
|
36
35
|
from octavia.db import prepare as db_prepare
|
37
36
|
|
38
37
|
|
@@ -51,8 +50,9 @@ class L7PolicyController(base.BaseController):
|
|
51
50
|
def get(self, id, fields=None):
|
52
51
|
"""Gets a single l7policy's details."""
|
53
52
|
context = pecan_request.context.get('octavia_context')
|
54
|
-
|
55
|
-
|
53
|
+
with context.session.begin():
|
54
|
+
db_l7policy = self._get_db_l7policy(context.session, id,
|
55
|
+
show_deleted=False)
|
56
56
|
|
57
57
|
self._auth_validate_action(context, db_l7policy.project_id,
|
58
58
|
constants.RBAC_GET_ONE)
|
@@ -72,10 +72,11 @@ class L7PolicyController(base.BaseController):
|
|
72
72
|
|
73
73
|
query_filter = self._auth_get_all(context, project_id)
|
74
74
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
75
|
+
with context.session.begin():
|
76
|
+
db_l7policies, links = self.repositories.l7policy.get_all_API_list(
|
77
|
+
context.session, show_deleted=False,
|
78
|
+
pagination_helper=pcontext.get(constants.PAGINATION_HELPER),
|
79
|
+
**query_filter)
|
79
80
|
result = self._convert_db_to_type(
|
80
81
|
db_l7policies, [l7policy_types.L7PolicyResponse])
|
81
82
|
if fields is not None:
|
@@ -121,11 +122,12 @@ class L7PolicyController(base.BaseController):
|
|
121
122
|
|
122
123
|
# Verify the parent listener exists
|
123
124
|
listener_id = l7policy.listener_id
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
125
|
+
with context.session.begin():
|
126
|
+
listener = self._get_db_listener(
|
127
|
+
context.session, listener_id)
|
128
|
+
load_balancer_id = listener.load_balancer_id
|
129
|
+
l7policy.project_id, provider = self._get_lb_project_id_provider(
|
130
|
+
context.session, load_balancer_id)
|
129
131
|
|
130
132
|
self._auth_validate_action(context, l7policy.project_id,
|
131
133
|
constants.RBAC_POST)
|
@@ -137,14 +139,16 @@ class L7PolicyController(base.BaseController):
|
|
137
139
|
|
138
140
|
# Make sure any pool specified by redirect_pool_id exists
|
139
141
|
if l7policy.redirect_pool_id:
|
140
|
-
|
141
|
-
|
142
|
+
with context.session.begin():
|
143
|
+
db_pool = self._get_db_pool(
|
144
|
+
context.session, l7policy.redirect_pool_id)
|
142
145
|
self._validate_protocol(listener.protocol, db_pool.protocol)
|
143
146
|
|
144
147
|
# Load the driver early as it also provides validation
|
145
148
|
driver = driver_factory.get_driver(provider)
|
146
149
|
|
147
|
-
lock_session =
|
150
|
+
lock_session = context.session
|
151
|
+
lock_session.begin()
|
148
152
|
try:
|
149
153
|
if self.repositories.check_quota_met(
|
150
154
|
context.session,
|
@@ -179,7 +183,9 @@ class L7PolicyController(base.BaseController):
|
|
179
183
|
with excutils.save_and_reraise_exception():
|
180
184
|
lock_session.rollback()
|
181
185
|
|
182
|
-
|
186
|
+
with context.session.begin():
|
187
|
+
db_l7policy = self._get_db_l7policy(context.session,
|
188
|
+
db_l7policy.id)
|
183
189
|
result = self._convert_db_to_type(db_l7policy,
|
184
190
|
l7policy_types.L7PolicyResponse)
|
185
191
|
return l7policy_types.L7PolicyRootResponse(l7policy=result)
|
@@ -209,12 +215,13 @@ class L7PolicyController(base.BaseController):
|
|
209
215
|
"""Updates a l7policy."""
|
210
216
|
l7policy = l7policy_.l7policy
|
211
217
|
context = pecan_request.context.get('octavia_context')
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
+
with context.session.begin():
|
219
|
+
db_l7policy = self._get_db_l7policy(context.session, id,
|
220
|
+
show_deleted=False)
|
221
|
+
load_balancer_id, listener_id = (
|
222
|
+
self._get_listener_and_loadbalancer_id(db_l7policy))
|
223
|
+
project_id, provider = self._get_lb_project_id_provider(
|
224
|
+
context.session, load_balancer_id)
|
218
225
|
|
219
226
|
self._auth_validate_action(context, project_id, constants.RBAC_PUT)
|
220
227
|
|
@@ -226,18 +233,21 @@ class L7PolicyController(base.BaseController):
|
|
226
233
|
l7policy_dict[attr] = l7policy_dict.pop(val)
|
227
234
|
sanitized_l7policy = l7policy_types.L7PolicyPUT(**l7policy_dict)
|
228
235
|
|
229
|
-
|
230
|
-
|
236
|
+
with context.session.begin():
|
237
|
+
listener = self._get_db_listener(
|
238
|
+
context.session, db_l7policy.listener_id)
|
231
239
|
# Make sure any specified redirect_pool_id exists
|
232
240
|
if l7policy_dict.get('redirect_pool_id'):
|
233
|
-
|
234
|
-
|
241
|
+
with context.session.begin():
|
242
|
+
db_pool = self._get_db_pool(
|
243
|
+
context.session, l7policy_dict['redirect_pool_id'])
|
235
244
|
self._validate_protocol(listener.protocol, db_pool.protocol)
|
236
245
|
|
237
246
|
# Load the driver early as it also provides validation
|
238
247
|
driver = driver_factory.get_driver(provider)
|
239
248
|
|
240
|
-
with
|
249
|
+
with context.session.begin():
|
250
|
+
lock_session = context.session
|
241
251
|
|
242
252
|
self._test_lb_and_listener_statuses(lock_session,
|
243
253
|
lb_id=load_balancer_id,
|
@@ -270,7 +280,8 @@ class L7PolicyController(base.BaseController):
|
|
270
280
|
# Force SQL alchemy to query the DB, otherwise we get inconsistent
|
271
281
|
# results
|
272
282
|
context.session.expire_all()
|
273
|
-
|
283
|
+
with context.session.begin():
|
284
|
+
db_l7policy = self._get_db_l7policy(context.session, id)
|
274
285
|
result = self._convert_db_to_type(db_l7policy,
|
275
286
|
l7policy_types.L7PolicyResponse)
|
276
287
|
return l7policy_types.L7PolicyRootResponse(l7policy=result)
|
@@ -279,12 +290,13 @@ class L7PolicyController(base.BaseController):
|
|
279
290
|
def delete(self, id):
|
280
291
|
"""Deletes a l7policy."""
|
281
292
|
context = pecan_request.context.get('octavia_context')
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
293
|
+
with context.session.begin():
|
294
|
+
db_l7policy = self._get_db_l7policy(context.session, id,
|
295
|
+
show_deleted=False)
|
296
|
+
load_balancer_id, listener_id = (
|
297
|
+
self._get_listener_and_loadbalancer_id(db_l7policy))
|
298
|
+
project_id, provider = self._get_lb_project_id_provider(
|
299
|
+
context.session, load_balancer_id)
|
288
300
|
|
289
301
|
self._auth_validate_action(context, project_id, constants.RBAC_DELETE)
|
290
302
|
|
@@ -294,13 +306,12 @@ class L7PolicyController(base.BaseController):
|
|
294
306
|
# Load the driver early as it also provides validation
|
295
307
|
driver = driver_factory.get_driver(provider)
|
296
308
|
|
297
|
-
with
|
298
|
-
|
299
|
-
self._test_lb_and_listener_statuses(lock_session,
|
309
|
+
with context.session.begin():
|
310
|
+
self._test_lb_and_listener_statuses(context.session,
|
300
311
|
lb_id=load_balancer_id,
|
301
312
|
listener_ids=[listener_id])
|
302
313
|
self.repositories.l7policy.update(
|
303
|
-
|
314
|
+
context.session, db_l7policy.id,
|
304
315
|
provisioning_status=constants.PENDING_DELETE)
|
305
316
|
|
306
317
|
LOG.info("Sending delete L7 Policy %s to provider %s",
|
@@ -320,8 +331,9 @@ class L7PolicyController(base.BaseController):
|
|
320
331
|
context = pecan_request.context.get('octavia_context')
|
321
332
|
if l7policy_id and remainder and remainder[0] == 'rules':
|
322
333
|
remainder = remainder[1:]
|
323
|
-
|
324
|
-
|
334
|
+
with context.session.begin():
|
335
|
+
db_l7policy = self.repositories.l7policy.get(
|
336
|
+
context.session, id=l7policy_id)
|
325
337
|
if not db_l7policy:
|
326
338
|
LOG.info("L7Policy %s not found.", l7policy_id)
|
327
339
|
raise exceptions.NotFound(
|