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.
Files changed (193) hide show
  1. octavia/amphorae/backends/agent/api_server/osutils.py +1 -0
  2. octavia/amphorae/backends/agent/api_server/plug.py +21 -7
  3. octavia/amphorae/backends/agent/api_server/templates/amphora-netns.systemd.j2 +2 -2
  4. octavia/amphorae/backends/agent/api_server/util.py +21 -0
  5. octavia/amphorae/backends/health_daemon/health_daemon.py +9 -3
  6. octavia/amphorae/backends/health_daemon/health_sender.py +2 -0
  7. octavia/amphorae/backends/utils/interface.py +14 -6
  8. octavia/amphorae/backends/utils/interface_file.py +6 -3
  9. octavia/amphorae/backends/utils/keepalivedlvs_query.py +8 -9
  10. octavia/amphorae/drivers/driver_base.py +1 -2
  11. octavia/amphorae/drivers/haproxy/rest_api_driver.py +11 -25
  12. octavia/amphorae/drivers/health/heartbeat_udp.py +34 -24
  13. octavia/amphorae/drivers/keepalived/jinja/jinja_cfg.py +3 -12
  14. octavia/amphorae/drivers/noop_driver/driver.py +3 -5
  15. octavia/api/common/pagination.py +4 -4
  16. octavia/api/drivers/amphora_driver/v2/driver.py +11 -5
  17. octavia/api/drivers/driver_agent/driver_get.py +22 -14
  18. octavia/api/drivers/driver_agent/driver_updater.py +8 -4
  19. octavia/api/drivers/utils.py +4 -2
  20. octavia/api/healthcheck/healthcheck_plugins.py +4 -2
  21. octavia/api/root_controller.py +4 -1
  22. octavia/api/v2/controllers/amphora.py +35 -38
  23. octavia/api/v2/controllers/availability_zone_profiles.py +43 -33
  24. octavia/api/v2/controllers/availability_zones.py +22 -18
  25. octavia/api/v2/controllers/flavor_profiles.py +37 -28
  26. octavia/api/v2/controllers/flavors.py +19 -15
  27. octavia/api/v2/controllers/health_monitor.py +44 -33
  28. octavia/api/v2/controllers/l7policy.py +52 -40
  29. octavia/api/v2/controllers/l7rule.py +68 -55
  30. octavia/api/v2/controllers/listener.py +88 -61
  31. octavia/api/v2/controllers/load_balancer.py +52 -34
  32. octavia/api/v2/controllers/member.py +63 -52
  33. octavia/api/v2/controllers/pool.py +55 -42
  34. octavia/api/v2/controllers/quotas.py +5 -3
  35. octavia/api/v2/types/listener.py +15 -0
  36. octavia/cmd/octavia_worker.py +0 -3
  37. octavia/cmd/status.py +1 -4
  38. octavia/common/clients.py +25 -45
  39. octavia/common/config.py +64 -22
  40. octavia/common/constants.py +3 -2
  41. octavia/common/data_models.py +7 -1
  42. octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py +12 -1
  43. octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 +5 -2
  44. octavia/common/jinja/lvs/jinja_cfg.py +4 -2
  45. octavia/common/keystone.py +58 -5
  46. octavia/common/validate.py +35 -0
  47. octavia/compute/drivers/noop_driver/driver.py +6 -0
  48. octavia/controller/healthmanager/health_manager.py +3 -6
  49. octavia/controller/housekeeping/house_keeping.py +36 -37
  50. octavia/controller/worker/amphora_rate_limit.py +5 -4
  51. octavia/controller/worker/task_utils.py +57 -41
  52. octavia/controller/worker/v2/controller_worker.py +160 -103
  53. octavia/controller/worker/v2/flows/listener_flows.py +3 -0
  54. octavia/controller/worker/v2/flows/load_balancer_flows.py +9 -14
  55. octavia/controller/worker/v2/tasks/amphora_driver_tasks.py +152 -91
  56. octavia/controller/worker/v2/tasks/compute_tasks.py +4 -2
  57. octavia/controller/worker/v2/tasks/database_tasks.py +542 -400
  58. octavia/controller/worker/v2/tasks/network_tasks.py +119 -79
  59. octavia/db/api.py +26 -23
  60. octavia/db/base_models.py +2 -2
  61. octavia/db/healthcheck.py +2 -1
  62. octavia/db/migration/alembic_migrations/versions/632152d2d32e_add_http_strict_transport_security_.py +42 -0
  63. octavia/db/models.py +12 -2
  64. octavia/db/prepare.py +2 -0
  65. octavia/db/repositories.py +462 -482
  66. octavia/hacking/checks.py +1 -1
  67. octavia/network/base.py +0 -14
  68. octavia/network/drivers/neutron/allowed_address_pairs.py +92 -135
  69. octavia/network/drivers/neutron/base.py +65 -77
  70. octavia/network/drivers/neutron/utils.py +69 -85
  71. octavia/network/drivers/noop_driver/driver.py +0 -7
  72. octavia/statistics/drivers/update_db.py +10 -10
  73. octavia/tests/common/constants.py +91 -84
  74. octavia/tests/common/sample_data_models.py +13 -1
  75. octavia/tests/fixtures.py +32 -0
  76. octavia/tests/functional/amphorae/backend/agent/api_server/test_server.py +9 -10
  77. octavia/tests/functional/api/drivers/driver_agent/test_driver_agent.py +260 -15
  78. octavia/tests/functional/api/test_root_controller.py +3 -28
  79. octavia/tests/functional/api/v2/base.py +5 -3
  80. octavia/tests/functional/api/v2/test_amphora.py +18 -5
  81. octavia/tests/functional/api/v2/test_availability_zone_profiles.py +1 -0
  82. octavia/tests/functional/api/v2/test_listener.py +51 -19
  83. octavia/tests/functional/api/v2/test_load_balancer.py +10 -1
  84. octavia/tests/functional/db/base.py +31 -16
  85. octavia/tests/functional/db/test_models.py +27 -28
  86. octavia/tests/functional/db/test_repositories.py +407 -50
  87. octavia/tests/unit/amphorae/backends/agent/api_server/test_amphora_info.py +2 -0
  88. octavia/tests/unit/amphorae/backends/agent/api_server/test_osutils.py +1 -1
  89. octavia/tests/unit/amphorae/backends/agent/api_server/test_plug.py +54 -6
  90. octavia/tests/unit/amphorae/backends/agent/api_server/test_util.py +35 -0
  91. octavia/tests/unit/amphorae/backends/health_daemon/test_health_daemon.py +8 -0
  92. octavia/tests/unit/amphorae/backends/health_daemon/test_health_sender.py +18 -0
  93. octavia/tests/unit/amphorae/backends/utils/test_interface.py +81 -0
  94. octavia/tests/unit/amphorae/backends/utils/test_interface_file.py +2 -0
  95. octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py +129 -5
  96. octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver_1_0.py +42 -20
  97. octavia/tests/unit/amphorae/drivers/health/test_heartbeat_udp.py +18 -20
  98. octavia/tests/unit/amphorae/drivers/keepalived/jinja/test_jinja_cfg.py +4 -4
  99. octavia/tests/unit/amphorae/drivers/noop_driver/test_driver.py +4 -1
  100. octavia/tests/unit/api/drivers/driver_agent/test_driver_get.py +3 -3
  101. octavia/tests/unit/api/drivers/driver_agent/test_driver_updater.py +11 -13
  102. octavia/tests/unit/base.py +6 -0
  103. octavia/tests/unit/cmd/test_interface.py +2 -2
  104. octavia/tests/unit/cmd/test_status.py +2 -2
  105. octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py +152 -1
  106. octavia/tests/unit/common/sample_configs/sample_configs_combined.py +10 -3
  107. octavia/tests/unit/common/test_clients.py +0 -39
  108. octavia/tests/unit/common/test_keystone.py +54 -0
  109. octavia/tests/unit/common/test_validate.py +67 -0
  110. octavia/tests/unit/controller/healthmanager/test_health_manager.py +8 -22
  111. octavia/tests/unit/controller/housekeeping/test_house_keeping.py +3 -64
  112. octavia/tests/unit/controller/worker/test_amphora_rate_limit.py +1 -1
  113. octavia/tests/unit/controller/worker/test_task_utils.py +44 -24
  114. octavia/tests/unit/controller/worker/v2/flows/test_load_balancer_flows.py +0 -1
  115. octavia/tests/unit/controller/worker/v2/tasks/test_amphora_driver_tasks.py +49 -26
  116. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py +399 -196
  117. octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks_quota.py +37 -64
  118. octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py +3 -14
  119. octavia/tests/unit/controller/worker/v2/test_controller_worker.py +2 -2
  120. octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py +456 -561
  121. octavia/tests/unit/network/drivers/neutron/test_base.py +181 -194
  122. octavia/tests/unit/network/drivers/neutron/test_utils.py +14 -30
  123. octavia/tests/unit/statistics/drivers/test_update_db.py +7 -5
  124. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/README.rst +1 -1
  125. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/AUTHORS +4 -0
  126. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/METADATA +4 -4
  127. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/RECORD +141 -189
  128. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/entry_points.txt +1 -2
  129. octavia-13.0.0.0rc1.dist-info/pbr.json +1 -0
  130. octavia/api/drivers/amphora_driver/v1/__init__.py +0 -11
  131. octavia/api/drivers/amphora_driver/v1/driver.py +0 -547
  132. octavia/controller/queue/v1/__init__.py +0 -11
  133. octavia/controller/queue/v1/consumer.py +0 -64
  134. octavia/controller/queue/v1/endpoints.py +0 -160
  135. octavia/controller/worker/v1/__init__.py +0 -11
  136. octavia/controller/worker/v1/controller_worker.py +0 -1157
  137. octavia/controller/worker/v1/flows/__init__.py +0 -11
  138. octavia/controller/worker/v1/flows/amphora_flows.py +0 -610
  139. octavia/controller/worker/v1/flows/health_monitor_flows.py +0 -105
  140. octavia/controller/worker/v1/flows/l7policy_flows.py +0 -94
  141. octavia/controller/worker/v1/flows/l7rule_flows.py +0 -100
  142. octavia/controller/worker/v1/flows/listener_flows.py +0 -128
  143. octavia/controller/worker/v1/flows/load_balancer_flows.py +0 -692
  144. octavia/controller/worker/v1/flows/member_flows.py +0 -230
  145. octavia/controller/worker/v1/flows/pool_flows.py +0 -127
  146. octavia/controller/worker/v1/tasks/__init__.py +0 -11
  147. octavia/controller/worker/v1/tasks/amphora_driver_tasks.py +0 -453
  148. octavia/controller/worker/v1/tasks/cert_task.py +0 -51
  149. octavia/controller/worker/v1/tasks/compute_tasks.py +0 -335
  150. octavia/controller/worker/v1/tasks/database_tasks.py +0 -2756
  151. octavia/controller/worker/v1/tasks/lifecycle_tasks.py +0 -173
  152. octavia/controller/worker/v1/tasks/model_tasks.py +0 -41
  153. octavia/controller/worker/v1/tasks/network_tasks.py +0 -970
  154. octavia/controller/worker/v1/tasks/retry_tasks.py +0 -74
  155. octavia/tests/unit/api/drivers/amphora_driver/v1/__init__.py +0 -11
  156. octavia/tests/unit/api/drivers/amphora_driver/v1/test_driver.py +0 -824
  157. octavia/tests/unit/controller/queue/v1/__init__.py +0 -11
  158. octavia/tests/unit/controller/queue/v1/test_consumer.py +0 -61
  159. octavia/tests/unit/controller/queue/v1/test_endpoints.py +0 -189
  160. octavia/tests/unit/controller/worker/v1/__init__.py +0 -11
  161. octavia/tests/unit/controller/worker/v1/flows/__init__.py +0 -11
  162. octavia/tests/unit/controller/worker/v1/flows/test_amphora_flows.py +0 -474
  163. octavia/tests/unit/controller/worker/v1/flows/test_health_monitor_flows.py +0 -72
  164. octavia/tests/unit/controller/worker/v1/flows/test_l7policy_flows.py +0 -67
  165. octavia/tests/unit/controller/worker/v1/flows/test_l7rule_flows.py +0 -67
  166. octavia/tests/unit/controller/worker/v1/flows/test_listener_flows.py +0 -91
  167. octavia/tests/unit/controller/worker/v1/flows/test_load_balancer_flows.py +0 -431
  168. octavia/tests/unit/controller/worker/v1/flows/test_member_flows.py +0 -106
  169. octavia/tests/unit/controller/worker/v1/flows/test_pool_flows.py +0 -77
  170. octavia/tests/unit/controller/worker/v1/tasks/__init__.py +0 -11
  171. octavia/tests/unit/controller/worker/v1/tasks/test_amphora_driver_tasks.py +0 -792
  172. octavia/tests/unit/controller/worker/v1/tasks/test_cert_task.py +0 -46
  173. octavia/tests/unit/controller/worker/v1/tasks/test_compute_tasks.py +0 -634
  174. octavia/tests/unit/controller/worker/v1/tasks/test_database_tasks.py +0 -2615
  175. octavia/tests/unit/controller/worker/v1/tasks/test_database_tasks_quota.py +0 -415
  176. octavia/tests/unit/controller/worker/v1/tasks/test_lifecycle_tasks.py +0 -401
  177. octavia/tests/unit/controller/worker/v1/tasks/test_model_tasks.py +0 -44
  178. octavia/tests/unit/controller/worker/v1/tasks/test_network_tasks.py +0 -1788
  179. octavia/tests/unit/controller/worker/v1/tasks/test_retry_tasks.py +0 -47
  180. octavia/tests/unit/controller/worker/v1/test_controller_worker.py +0 -2096
  181. octavia-12.0.0.0rc2.dist-info/pbr.json +0 -1
  182. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/LICENSE +0 -0
  183. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/README.rst +0 -0
  184. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/diskimage-create.sh +0 -0
  185. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
  186. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/requirements.txt +0 -0
  187. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
  188. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/tox.ini +0 -0
  189. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/version.txt +0 -0
  190. {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/scripts/octavia-wsgi +0 -0
  191. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/LICENSE +0 -0
  192. {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/WHEEL +0 -0
  193. {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
- db_flavor_profile = self._get_db_flavor_profile(context.session, id)
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
- db_flavor_profiles, links = self.repositories.flavor_profile.get_all(
69
- context.session,
70
- pagination_helper=pcontext.get(constants.PAGINATION_HELPER))
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
- lock_session = db_api.get_session(autocommit=False)
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
- lock_session, **flavorprofile_dict)
106
- lock_session.commit()
109
+ context.session, **flavorprofile_dict)
110
+ context.session.commit()
107
111
  except odb_exceptions.DBDuplicateEntry as e:
108
- lock_session.rollback()
112
+ context.session.rollback()
109
113
  raise exceptions.IDAlreadyExists() from e
110
114
  except Exception:
111
115
  with excutils.save_and_reraise_exception():
112
- lock_session.rollback()
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
- self._validate_update_fp(context, id, flavorprofile)
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
- db_flavor_profile = self._get_db_flavor_profile(
161
- context.session, id)
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
- lock_session = db_api.get_session(autocommit=False)
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(lock_session, id,
181
+ self.repositories.flavor_profile.update(context.session, id,
176
182
  **flavorprofile_dict)
177
- lock_session.commit()
183
+ context.session.commit()
178
184
  except Exception:
179
185
  with excutils.save_and_reraise_exception():
180
- lock_session.rollback()
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
- db_flavor_profile = self._get_db_flavor_profile(context.session, id)
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
- if self.repositories.flavor.count(
204
- context.session, flavor_profile_id=flavor_profile_id) > 0:
205
- raise exceptions.ObjectInUse(object='Flavor profile',
206
- id=flavor_profile_id)
207
- try:
208
- self.repositories.flavor_profile.delete(context.session,
209
- id=flavor_profile_id)
210
- except sa_exception.NoResultFound as e:
211
- raise exceptions.NotFound(
212
- resource='Flavor profile', id=flavor_profile_id) from e
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
- db_flavor = self._get_db_flavor(context.session, id)
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
- db_flavors, links = self.repositories.flavor.get_all(
66
- context.session,
67
- pagination_helper=pcontext.get(constants.PAGINATION_HELPER))
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
- lock_session = db_api.get_session(autocommit=False)
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(lock_session,
92
+ db_flavor = self.repositories.flavor.create(context.session,
91
93
  **flavor_dict)
92
- lock_session.commit()
94
+ context.session.commit()
93
95
  except odb_exceptions.DBDuplicateEntry as e:
94
- lock_session.rollback()
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
- lock_session.rollback()
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
- lock_session = db_api.get_session(autocommit=False)
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(lock_session, id,
120
+ self.repositories.flavor.update(context.session, id,
119
121
  **flavor_dict)
120
- lock_session.commit()
122
+ context.session.commit()
121
123
  except Exception:
122
124
  with excutils.save_and_reraise_exception():
123
- lock_session.rollback()
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
- db_flavor = self._get_db_flavor(context.session, id)
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(autocommit=False)
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
- db_hm = self._get_db_hm(context.session, id, show_deleted=False)
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
- db_hm, links = self.repositories.health_monitor.get_all_API_list(
74
- context.session, show_deleted=False,
75
- pagination_helper=pcontext.get(consts.PAGINATION_HELPER),
76
- **query_filter)
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
- return self.repositories.health_monitor.create(
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
- pool = self._get_db_pool(context.session, health_monitor.pool_id)
206
+ with context.session.begin():
207
+ pool = self._get_db_pool(context.session, health_monitor.pool_id)
204
208
 
205
- health_monitor.project_id, provider = self._get_lb_project_id_provider(
206
- context.session, pool.load_balancer_id)
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
- lock_session = db_api.get_session(autocommit=False)
238
+ context.session.begin()
234
239
  try:
235
240
  if self.repositories.check_quota_met(
236
241
  context.session,
237
- lock_session,
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
- lock_session, health_monitor)
248
- db_hm = self._validate_create_hm(lock_session, hm_dict)
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
- lock_session.commit()
264
+ context.session.commit()
260
265
  except odb_exceptions.DBError as e:
261
- lock_session.rollback()
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
- lock_session.rollback()
271
+ context.session.rollback()
267
272
 
268
- db_hm = self._get_db_hm(context.session, db_hm.id)
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
- db_hm = self._get_db_hm(context.session, id, show_deleted=False)
351
+ with context.session.begin():
352
+ db_hm = self._get_db_hm(context.session, id, show_deleted=False)
346
353
 
347
- pool = self._get_db_pool(context.session, db_hm.pool_id)
348
- project_id, provider = self._get_lb_project_id_provider(
349
- context.session, pool.load_balancer_id)
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 db_api.get_lock_session() as lock_session:
373
+ with context.session.begin():
367
374
 
368
- self._test_lb_and_listener_and_pool_statuses(lock_session, db_hm)
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(lock_session, id,
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
- db_hm = self._get_db_hm(context.session, id)
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
- db_hm = self._get_db_hm(context.session, id, show_deleted=False)
414
+ with context.session.begin():
415
+ db_hm = self._get_db_hm(context.session, id, show_deleted=False)
406
416
 
407
- pool = self._get_db_pool(context.session, db_hm.pool_id)
408
- project_id, provider = self._get_lb_project_id_provider(
409
- context.session, pool.load_balancer_id)
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 db_api.get_lock_session() as lock_session:
429
+ with context.session.begin():
420
430
 
421
- self._test_lb_and_listener_and_pool_statuses(lock_session, db_hm)
431
+ self._test_lb_and_listener_and_pool_statuses(context.session,
432
+ db_hm)
422
433
 
423
434
  self.repositories.health_monitor.update(
424
- lock_session, db_hm.id,
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
- db_l7policy = self._get_db_l7policy(context.session, id,
55
- show_deleted=False)
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
- db_l7policies, links = self.repositories.l7policy.get_all_API_list(
76
- context.session, show_deleted=False,
77
- pagination_helper=pcontext.get(constants.PAGINATION_HELPER),
78
- **query_filter)
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
- listener = self._get_db_listener(
125
- context.session, listener_id)
126
- load_balancer_id = listener.load_balancer_id
127
- l7policy.project_id, provider = self._get_lb_project_id_provider(
128
- context.session, load_balancer_id)
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
- db_pool = self._get_db_pool(
141
- context.session, l7policy.redirect_pool_id)
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 = db_api.get_session(autocommit=False)
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
- db_l7policy = self._get_db_l7policy(context.session, db_l7policy.id)
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
- db_l7policy = self._get_db_l7policy(context.session, id,
213
- show_deleted=False)
214
- load_balancer_id, listener_id = self._get_listener_and_loadbalancer_id(
215
- db_l7policy)
216
- project_id, provider = self._get_lb_project_id_provider(
217
- context.session, load_balancer_id)
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
- listener = self._get_db_listener(
230
- context.session, db_l7policy.listener_id)
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
- db_pool = self._get_db_pool(
234
- context.session, l7policy_dict['redirect_pool_id'])
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 db_api.get_lock_session() as lock_session:
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
- db_l7policy = self._get_db_l7policy(context.session, id)
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
- db_l7policy = self._get_db_l7policy(context.session, id,
283
- show_deleted=False)
284
- load_balancer_id, listener_id = self._get_listener_and_loadbalancer_id(
285
- db_l7policy)
286
- project_id, provider = self._get_lb_project_id_provider(
287
- context.session, load_balancer_id)
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 db_api.get_lock_session() as lock_session:
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
- lock_session, db_l7policy.id,
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
- db_l7policy = self.repositories.l7policy.get(
324
- context.session, id=l7policy_id)
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(