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