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
@@ -38,7 +38,6 @@ from octavia.common import exceptions
38
38
  from octavia.common import stats
39
39
  from octavia.common import utils
40
40
  from octavia.common import validate
41
- from octavia.db import api as db_api
42
41
  from octavia.db import prepare as db_prepare
43
42
  from octavia.i18n import _
44
43
  from octavia.network import base as network_base
@@ -59,8 +58,9 @@ class LoadBalancersController(base.BaseController):
59
58
  def get_one(self, id, fields=None):
60
59
  """Gets a single load balancer's details."""
61
60
  context = pecan_request.context.get('octavia_context')
62
- load_balancer = self._get_db_lb(context.session, id,
63
- show_deleted=False)
61
+ with context.session.begin():
62
+ load_balancer = self._get_db_lb(context.session, id,
63
+ show_deleted=False)
64
64
 
65
65
  if not load_balancer:
66
66
  raise exceptions.NotFound(
@@ -85,11 +85,13 @@ class LoadBalancersController(base.BaseController):
85
85
 
86
86
  query_filter = self._auth_get_all(context, project_id)
87
87
 
88
- load_balancers, links = (
89
- self.repositories.load_balancer.get_all_API_list(
90
- context.session, show_deleted=False,
91
- pagination_helper=pcontext.get(constants.PAGINATION_HELPER),
92
- **query_filter))
88
+ with context.session.begin():
89
+ load_balancers, links = (
90
+ self.repositories.load_balancer.get_all_API_list(
91
+ context.session, show_deleted=False,
92
+ pagination_helper=pcontext.get(
93
+ constants.PAGINATION_HELPER),
94
+ **query_filter))
93
95
  result = self._convert_db_to_type(
94
96
  load_balancers, [lb_types.LoadBalancerResponse])
95
97
  if fields is not None:
@@ -327,8 +329,9 @@ class LoadBalancersController(base.BaseController):
327
329
  provider = None
328
330
  if not isinstance(load_balancer.flavor_id, wtypes.UnsetType):
329
331
  try:
330
- provider = self.repositories.flavor.get_flavor_provider(
331
- session, load_balancer.flavor_id)
332
+ with session.begin():
333
+ provider = self.repositories.flavor.get_flavor_provider(
334
+ session, load_balancer.flavor_id)
332
335
  except sa_exception.NoResultFound as e:
333
336
  raise exceptions.ValidationException(
334
337
  detail=_("Invalid flavor_id.")) from e
@@ -377,8 +380,9 @@ class LoadBalancersController(base.BaseController):
377
380
 
378
381
  def _validate_flavor(self, session, load_balancer):
379
382
  if not isinstance(load_balancer.flavor_id, wtypes.UnsetType):
380
- flavor = self.repositories.flavor.get(session,
381
- id=load_balancer.flavor_id)
383
+ with session.begin():
384
+ flavor = self.repositories.flavor.get(
385
+ session, id=load_balancer.flavor_id)
382
386
  if not flavor:
383
387
  raise exceptions.ValidationException(
384
388
  detail=_("Invalid flavor_id."))
@@ -416,8 +420,9 @@ class LoadBalancersController(base.BaseController):
416
420
 
417
421
  def _validate_availability_zone(self, session, load_balancer):
418
422
  if not isinstance(load_balancer.availability_zone, wtypes.UnsetType):
419
- az = self.repositories.availability_zone.get(
420
- session, name=load_balancer.availability_zone)
423
+ with session.begin():
424
+ az = self.repositories.availability_zone.get(
425
+ session, name=load_balancer.availability_zone)
421
426
  if not az:
422
427
  raise exceptions.ValidationException(
423
428
  detail=_("Invalid availability zone."))
@@ -456,7 +461,8 @@ class LoadBalancersController(base.BaseController):
456
461
  # Load the driver early as it also provides validation
457
462
  driver = driver_factory.get_driver(provider)
458
463
 
459
- lock_session = db_api.get_session(autocommit=False)
464
+ lock_session = context.session
465
+ lock_session.begin()
460
466
  try:
461
467
  if self.repositories.check_quota_met(
462
468
  context.session,
@@ -553,6 +559,8 @@ class LoadBalancersController(base.BaseController):
553
559
  driver_lb_dict = driver_utils.lb_dict_to_provider_dict(
554
560
  lb_dict, vip, add_vips, db_pools, db_lists)
555
561
 
562
+ lock_session.flush()
563
+
556
564
  # Dispatch to the driver
557
565
  LOG.info("Sending create Load Balancer %s to provider %s",
558
566
  db_lb.id, driver.name)
@@ -568,7 +576,8 @@ class LoadBalancersController(base.BaseController):
568
576
  with excutils.save_and_reraise_exception():
569
577
  lock_session.rollback()
570
578
 
571
- db_lb = self._get_db_lb(context.session, db_lb.id)
579
+ with context.session.begin():
580
+ db_lb = self._get_db_lb(context.session, db_lb.id)
572
581
 
573
582
  result = self._convert_db_to_type(
574
583
  db_lb, lb_types.LoadBalancerFullResponse)
@@ -689,7 +698,8 @@ class LoadBalancersController(base.BaseController):
689
698
  """Updates a load balancer."""
690
699
  load_balancer = load_balancer.loadbalancer
691
700
  context = pecan_request.context.get('octavia_context')
692
- db_lb = self._get_db_lb(context.session, id, show_deleted=False)
701
+ with context.session.begin():
702
+ db_lb = self._get_db_lb(context.session, id, show_deleted=False)
693
703
 
694
704
  self._auth_validate_action(context, db_lb.project_id,
695
705
  constants.RBAC_PUT)
@@ -704,8 +714,8 @@ class LoadBalancersController(base.BaseController):
704
714
  # Load the driver early as it also provides validation
705
715
  driver = driver_factory.get_driver(db_lb.provider)
706
716
 
707
- with db_api.get_lock_session() as lock_session:
708
- self._test_lb_status(lock_session, id)
717
+ with context.session.begin():
718
+ self._test_lb_status(context.session, id)
709
719
 
710
720
  # Prepare the data for the driver data model
711
721
  lb_dict = load_balancer.to_dict(render_unsets=False)
@@ -731,15 +741,17 @@ class LoadBalancersController(base.BaseController):
731
741
  db_lb_dict = load_balancer.to_dict(render_unsets=False)
732
742
  if 'vip' in db_lb_dict:
733
743
  db_vip_dict = db_lb_dict.pop('vip')
734
- self.repositories.vip.update(lock_session, id, **db_vip_dict)
744
+ self.repositories.vip.update(context.session, id,
745
+ **db_vip_dict)
735
746
  if db_lb_dict:
736
- self.repositories.load_balancer.update(lock_session, id,
747
+ self.repositories.load_balancer.update(context.session, id,
737
748
  **db_lb_dict)
738
749
 
739
750
  # Force SQL alchemy to query the DB, otherwise we get inconsistent
740
751
  # results
741
752
  context.session.expire_all()
742
- db_lb = self._get_db_lb(context.session, id)
753
+ with context.session.begin():
754
+ db_lb = self._get_db_lb(context.session, id)
743
755
  result = self._convert_db_to_type(db_lb, lb_types.LoadBalancerResponse)
744
756
  return lb_types.LoadBalancerRootResponse(loadbalancer=result)
745
757
 
@@ -748,7 +760,8 @@ class LoadBalancersController(base.BaseController):
748
760
  """Deletes a load balancer."""
749
761
  context = pecan_request.context.get('octavia_context')
750
762
  cascade = strutils.bool_from_string(cascade)
751
- db_lb = self._get_db_lb(context.session, id, show_deleted=False)
763
+ with context.session.begin():
764
+ db_lb = self._get_db_lb(context.session, id, show_deleted=False)
752
765
 
753
766
  self._auth_validate_action(context, db_lb.project_id,
754
767
  constants.RBAC_DELETE)
@@ -756,13 +769,13 @@ class LoadBalancersController(base.BaseController):
756
769
  # Load the driver early as it also provides validation
757
770
  driver = driver_factory.get_driver(db_lb.provider)
758
771
 
759
- with db_api.get_lock_session() as lock_session:
772
+ with context.session.begin():
760
773
  if (db_lb.listeners or db_lb.pools) and not cascade:
761
774
  msg = _("Cannot delete Load Balancer %s - "
762
775
  "it has children") % id
763
776
  LOG.warning(msg)
764
777
  raise exceptions.ValidationException(detail=msg)
765
- self._test_lb_status(lock_session, id,
778
+ self._test_lb_status(context.session, id,
766
779
  lb_status=constants.PENDING_DELETE)
767
780
 
768
781
  LOG.info("Sending delete Load Balancer %s to provider %s",
@@ -813,8 +826,9 @@ class StatusController(base.BaseController):
813
826
  status_code=200)
814
827
  def get(self):
815
828
  context = pecan_request.context.get('octavia_context')
816
- load_balancer = self._get_db_lb(context.session, self.id,
817
- show_deleted=False)
829
+ with context.session.begin():
830
+ load_balancer = self._get_db_lb(context.session, self.id,
831
+ show_deleted=False)
818
832
  if not load_balancer:
819
833
  LOG.info("Load balancer %s not found.", id)
820
834
  raise exceptions.NotFound(
@@ -841,8 +855,9 @@ class StatisticsController(base.BaseController, stats.StatsMixin):
841
855
  status_code=200)
842
856
  def get(self):
843
857
  context = pecan_request.context.get('octavia_context')
844
- load_balancer = self._get_db_lb(context.session, self.id,
845
- show_deleted=False)
858
+ with context.session.begin():
859
+ load_balancer = self._get_db_lb(context.session, self.id,
860
+ show_deleted=False)
846
861
  if not load_balancer:
847
862
  LOG.info("Load balancer %s not found.", id)
848
863
  raise exceptions.NotFound(
@@ -852,7 +867,8 @@ class StatisticsController(base.BaseController, stats.StatsMixin):
852
867
  self._auth_validate_action(context, load_balancer.project_id,
853
868
  constants.RBAC_GET_STATS)
854
869
 
855
- lb_stats = self.get_loadbalancer_stats(context.session, self.id)
870
+ with context.session.begin():
871
+ lb_stats = self.get_loadbalancer_stats(context.session, self.id)
856
872
 
857
873
  result = self._convert_db_to_type(
858
874
  lb_stats, lb_types.LoadBalancerStatisticsResponse)
@@ -869,8 +885,9 @@ class FailoverController(LoadBalancersController):
869
885
  def put(self, **kwargs):
870
886
  """Fails over a loadbalancer"""
871
887
  context = pecan_request.context.get('octavia_context')
872
- db_lb = self._get_db_lb(context.session, self.lb_id,
873
- show_deleted=False)
888
+ with context.session.begin():
889
+ db_lb = self._get_db_lb(context.session, self.lb_id,
890
+ show_deleted=False)
874
891
 
875
892
  self._auth_validate_action(context, db_lb.project_id,
876
893
  constants.RBAC_PUT_FAILOVER)
@@ -878,8 +895,9 @@ class FailoverController(LoadBalancersController):
878
895
  # Load the driver early as it also provides validation
879
896
  driver = driver_factory.get_driver(db_lb.provider)
880
897
 
881
- with db_api.get_lock_session() as lock_session:
882
- self._test_and_set_failover_prov_status(lock_session, self.lb_id)
898
+ with context.session.begin():
899
+ self._test_and_set_failover_prov_status(context.session,
900
+ self.lb_id)
883
901
  LOG.info("Sending failover request for load balancer %s to the "
884
902
  "provider %s", self.lb_id, driver.name)
885
903
  driver_utils.call_provider(
@@ -30,7 +30,6 @@ from octavia.common import constants
30
30
  from octavia.common import data_models
31
31
  from octavia.common import exceptions
32
32
  from octavia.common import validate
33
- from octavia.db import api as db_api
34
33
  from octavia.db import prepare as db_prepare
35
34
 
36
35
 
@@ -49,8 +48,9 @@ class MemberController(base.BaseController):
49
48
  def get(self, id, fields=None):
50
49
  """Gets a single pool member's details."""
51
50
  context = pecan_request.context.get('octavia_context')
52
- db_member = self._get_db_member(context.session, id,
53
- show_deleted=False)
51
+ with context.session.begin():
52
+ db_member = self._get_db_member(context.session, id,
53
+ show_deleted=False)
54
54
 
55
55
  self._auth_validate_action(context, db_member.project_id,
56
56
  constants.RBAC_GET_ONE)
@@ -70,16 +70,17 @@ class MemberController(base.BaseController):
70
70
  pcontext = pecan_request.context
71
71
  context = pcontext.get('octavia_context')
72
72
 
73
- pool = self._get_db_pool(context.session, self.pool_id,
74
- show_deleted=False)
73
+ with context.session.begin():
74
+ pool = self._get_db_pool(context.session, self.pool_id,
75
+ show_deleted=False)
75
76
 
76
- self._auth_validate_action(context, pool.project_id,
77
- constants.RBAC_GET_ALL)
77
+ self._auth_validate_action(context, pool.project_id,
78
+ constants.RBAC_GET_ALL)
78
79
 
79
- db_members, links = self.repositories.member.get_all_API_list(
80
- context.session, show_deleted=False,
81
- pool_id=self.pool_id,
82
- pagination_helper=pcontext.get(constants.PAGINATION_HELPER))
80
+ db_members, links = self.repositories.member.get_all_API_list(
81
+ context.session, show_deleted=False,
82
+ pool_id=self.pool_id,
83
+ pagination_helper=pcontext.get(constants.PAGINATION_HELPER))
83
84
  result = self._convert_db_to_type(
84
85
  db_members, [member_types.MemberResponse])
85
86
  if fields is not None:
@@ -118,7 +119,9 @@ class MemberController(base.BaseController):
118
119
  def _validate_create_member(self, lock_session, member_dict):
119
120
  """Validate creating member on pool."""
120
121
  try:
121
- return self.repositories.member.create(lock_session, **member_dict)
122
+ ret = self.repositories.member.create(lock_session, **member_dict)
123
+ lock_session.flush()
124
+ return ret
122
125
  except odb_exceptions.DBDuplicateEntry as e:
123
126
  raise exceptions.DuplicateMemberEntry(
124
127
  ip_address=member_dict.get('ip_address'),
@@ -141,9 +144,10 @@ class MemberController(base.BaseController):
141
144
  member = member_.member
142
145
  context = pecan_request.context.get('octavia_context')
143
146
 
144
- pool = self.repositories.pool.get(context.session, id=self.pool_id)
145
- member.project_id, provider = self._get_lb_project_id_provider(
146
- context.session, pool.load_balancer_id)
147
+ with context.session.begin():
148
+ pool = self.repositories.pool.get(context.session, id=self.pool_id)
149
+ member.project_id, provider = self._get_lb_project_id_provider(
150
+ context.session, pool.load_balancer_id)
147
151
 
148
152
  self._auth_validate_action(context, member.project_id,
149
153
  constants.RBAC_POST)
@@ -158,11 +162,11 @@ class MemberController(base.BaseController):
158
162
  # Load the driver early as it also provides validation
159
163
  driver = driver_factory.get_driver(provider)
160
164
 
161
- lock_session = db_api.get_session(autocommit=False)
165
+ context.session.begin()
162
166
  try:
163
167
  if self.repositories.check_quota_met(
164
168
  context.session,
165
- lock_session,
169
+ context.session,
166
170
  data_models.Member,
167
171
  member.project_id):
168
172
  raise exceptions.QuotaException(
@@ -171,9 +175,10 @@ class MemberController(base.BaseController):
171
175
  member_dict = db_prepare.create_member(member.to_dict(
172
176
  render_unsets=True), self.pool_id, bool(pool.health_monitor))
173
177
 
174
- self._test_lb_and_listener_and_pool_statuses(lock_session)
178
+ self._test_lb_and_listener_and_pool_statuses(context.session)
175
179
 
176
- db_member = self._validate_create_member(lock_session, member_dict)
180
+ db_member = self._validate_create_member(context.session,
181
+ member_dict)
177
182
 
178
183
  # Prepare the data for the driver data model
179
184
  provider_member = (
@@ -185,12 +190,13 @@ class MemberController(base.BaseController):
185
190
  driver_utils.call_provider(
186
191
  driver.name, driver.member_create, provider_member)
187
192
 
188
- lock_session.commit()
193
+ context.session.commit()
189
194
  except Exception:
190
195
  with excutils.save_and_reraise_exception():
191
- lock_session.rollback()
196
+ context.session.rollback()
192
197
 
193
- db_member = self._get_db_member(context.session, db_member.id)
198
+ with context.session.begin():
199
+ db_member = self._get_db_member(context.session, db_member.id)
194
200
  result = self._convert_db_to_type(db_member,
195
201
  member_types.MemberResponse)
196
202
  return member_types.MemberRootResponse(member=result)
@@ -226,12 +232,13 @@ class MemberController(base.BaseController):
226
232
  """Updates a pool member."""
227
233
  member = member_.member
228
234
  context = pecan_request.context.get('octavia_context')
229
- db_member = self._get_db_member(context.session, id,
230
- show_deleted=False)
231
- pool = self.repositories.pool.get(context.session,
232
- id=db_member.pool_id)
233
- project_id, provider = self._get_lb_project_id_provider(
234
- context.session, pool.load_balancer_id)
235
+ with context.session.begin():
236
+ db_member = self._get_db_member(context.session, id,
237
+ show_deleted=False)
238
+ pool = self.repositories.pool.get(context.session,
239
+ id=db_member.pool_id)
240
+ project_id, provider = self._get_lb_project_id_provider(
241
+ context.session, pool.load_balancer_id)
235
242
 
236
243
  self._auth_validate_action(context, project_id, constants.RBAC_PUT)
237
244
 
@@ -242,8 +249,8 @@ class MemberController(base.BaseController):
242
249
  # Load the driver early as it also provides validation
243
250
  driver = driver_factory.get_driver(provider)
244
251
 
245
- with db_api.get_lock_session() as lock_session:
246
- self._test_lb_and_listener_and_pool_statuses(lock_session,
252
+ with context.session.begin():
253
+ self._test_lb_and_listener_and_pool_statuses(context.session,
247
254
  member=db_member)
248
255
 
249
256
  # Prepare the data for the driver data model
@@ -267,12 +274,14 @@ class MemberController(base.BaseController):
267
274
  # Update the database to reflect what the driver just accepted
268
275
  member.provisioning_status = constants.PENDING_UPDATE
269
276
  db_member_dict = member.to_dict(render_unsets=False)
270
- self.repositories.member.update(lock_session, id, **db_member_dict)
277
+ self.repositories.member.update(context.session, id,
278
+ **db_member_dict)
271
279
 
272
280
  # Force SQL alchemy to query the DB, otherwise we get inconsistent
273
281
  # results
274
282
  context.session.expire_all()
275
- db_member = self._get_db_member(context.session, id)
283
+ with context.session.begin():
284
+ db_member = self._get_db_member(context.session, id)
276
285
  result = self._convert_db_to_type(db_member,
277
286
  member_types.MemberResponse)
278
287
  return member_types.MemberRootResponse(member=result)
@@ -281,13 +290,14 @@ class MemberController(base.BaseController):
281
290
  def delete(self, id):
282
291
  """Deletes a pool member."""
283
292
  context = pecan_request.context.get('octavia_context')
284
- db_member = self._get_db_member(context.session, id,
285
- show_deleted=False)
293
+ with context.session.begin():
294
+ db_member = self._get_db_member(context.session, id,
295
+ show_deleted=False)
286
296
 
287
- pool = self.repositories.pool.get(context.session,
288
- id=db_member.pool_id)
289
- project_id, provider = self._get_lb_project_id_provider(
290
- context.session, pool.load_balancer_id)
297
+ pool = self.repositories.pool.get(context.session,
298
+ id=db_member.pool_id)
299
+ project_id, provider = self._get_lb_project_id_provider(
300
+ context.session, pool.load_balancer_id)
291
301
 
292
302
  self._auth_validate_action(context, project_id, constants.RBAC_DELETE)
293
303
 
@@ -296,11 +306,11 @@ class MemberController(base.BaseController):
296
306
  # Load the driver early as it also provides validation
297
307
  driver = driver_factory.get_driver(provider)
298
308
 
299
- with db_api.get_lock_session() as lock_session:
300
- self._test_lb_and_listener_and_pool_statuses(lock_session,
309
+ with context.session.begin():
310
+ self._test_lb_and_listener_and_pool_statuses(context.session,
301
311
  member=db_member)
302
312
  self.repositories.member.update(
303
- lock_session, db_member.id,
313
+ context.session, db_member.id,
304
314
  provisioning_status=constants.PENDING_DELETE)
305
315
 
306
316
  LOG.info("Sending delete Member %s to provider %s", id,
@@ -324,11 +334,12 @@ class MembersController(MemberController):
324
334
  additive_only = strutils.bool_from_string(additive_only)
325
335
  context = pecan_request.context.get('octavia_context')
326
336
 
327
- db_pool = self._get_db_pool(context.session, self.pool_id)
328
- old_members = db_pool.members
337
+ with context.session.begin():
338
+ db_pool = self._get_db_pool(context.session, self.pool_id)
339
+ old_members = db_pool.members
329
340
 
330
- project_id, provider = self._get_lb_project_id_provider(
331
- context.session, db_pool.load_balancer_id)
341
+ project_id, provider = self._get_lb_project_id_provider(
342
+ context.session, db_pool.load_balancer_id)
332
343
 
333
344
  # Check POST+PUT+DELETE since this operation is all of 'CUD'
334
345
  self._auth_validate_action(context, project_id, constants.RBAC_POST)
@@ -340,8 +351,8 @@ class MembersController(MemberController):
340
351
  # Load the driver early as it also provides validation
341
352
  driver = driver_factory.get_driver(provider)
342
353
 
343
- with db_api.get_lock_session() as lock_session:
344
- self._test_lb_and_listener_and_pool_statuses(lock_session)
354
+ with context.session.begin():
355
+ self._test_lb_and_listener_and_pool_statuses(context.session)
345
356
 
346
357
  old_member_uniques = {
347
358
  (m.ip_address, m.protocol_port): m.id for m in old_members}
@@ -368,7 +379,7 @@ class MembersController(MemberController):
368
379
  if not (deleted_members or new_members or updated_members):
369
380
  LOG.info("Member batch update is a noop, rolling back and "
370
381
  "returning early.")
371
- lock_session.rollback()
382
+ context.session.rollback()
372
383
  return
373
384
 
374
385
  if additive_only:
@@ -376,7 +387,7 @@ class MembersController(MemberController):
376
387
  else:
377
388
  member_count_diff = len(new_members) - len(deleted_members)
378
389
  if member_count_diff > 0 and self.repositories.check_quota_met(
379
- context.session, lock_session, data_models.Member,
390
+ context.session, context.session, data_models.Member,
380
391
  db_pool.project_id, count=member_count_diff):
381
392
  raise exceptions.QuotaException(
382
393
  resource=data_models.Member._name())
@@ -405,7 +416,7 @@ class MembersController(MemberController):
405
416
 
406
417
  m = m.to_dict(render_unsets=False)
407
418
  m['project_id'] = db_pool.project_id
408
- created_member = self._graph_create(lock_session, m)
419
+ created_member = self._graph_create(context.session, m)
409
420
  provider_member = driver_utils.db_member_to_provider_member(
410
421
  created_member)
411
422
  provider_members.append(provider_member)
@@ -416,7 +427,7 @@ class MembersController(MemberController):
416
427
  db_member_dict = m.to_dict(render_unsets=False)
417
428
  db_member_dict.pop('id')
418
429
  self.repositories.member.update(
419
- lock_session, m.id, **db_member_dict)
430
+ context.session, m.id, **db_member_dict)
420
431
 
421
432
  m.pool_id = self.pool_id
422
433
  provider_members.append(
@@ -434,7 +445,7 @@ class MembersController(MemberController):
434
445
  else:
435
446
  # Members are changed to PENDING_DELETE and not passed.
436
447
  self.repositories.member.update(
437
- lock_session, m.id,
448
+ context.session, m.id,
438
449
  provisioning_status=constants.PENDING_DELETE)
439
450
 
440
451
  # Dispatch to the driver