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
@@ -80,20 +80,23 @@ class AmpListenersUpdate(BaseAmphoraTask):
80
80
  # health manager fix it.
81
81
  # TODO(johnsom) Optimize this to use the dicts and not need the
82
82
  # DB lookups
83
- db_amp = self.amphora_repo.get(db_apis.get_session(),
84
- id=amphora[constants.ID])
85
83
  try:
86
- db_lb = self.loadbalancer_repo.get(
87
- db_apis.get_session(),
88
- id=loadbalancer[constants.LOADBALANCER_ID])
84
+ session = db_apis.get_session()
85
+ with session.begin():
86
+ db_amp = self.amphora_repo.get(session,
87
+ id=amphora[constants.ID])
88
+ db_lb = self.loadbalancer_repo.get(
89
+ session,
90
+ id=loadbalancer[constants.LOADBALANCER_ID])
89
91
  self.amphora_driver.update_amphora_listeners(
90
92
  db_lb, db_amp, timeout_dict)
91
93
  except Exception as e:
92
94
  LOG.error('Failed to update listeners on amphora %s. Skipping '
93
95
  'this amphora as it is failing to update due to: %s',
94
96
  db_amp.id, str(e))
95
- self.amphora_repo.update(db_apis.get_session(), db_amp.id,
96
- status=constants.ERROR)
97
+ with session.begin():
98
+ self.amphora_repo.update(session, db_amp.id,
99
+ status=constants.ERROR)
97
100
 
98
101
 
99
102
  class AmphoraIndexListenerUpdate(BaseAmphoraTask):
@@ -106,12 +109,14 @@ class AmphoraIndexListenerUpdate(BaseAmphoraTask):
106
109
  try:
107
110
  # TODO(johnsom) Optimize this to use the dicts and not need the
108
111
  # DB lookups
109
- db_amp = self.amphora_repo.get(
110
- db_apis.get_session(),
111
- id=amphorae[amphora_index][constants.ID])
112
- db_lb = self.loadbalancer_repo.get(
113
- db_apis.get_session(),
114
- id=loadbalancer[constants.LOADBALANCER_ID])
112
+ session = db_apis.get_session()
113
+ with session.begin():
114
+ db_amp = self.amphora_repo.get(
115
+ session,
116
+ id=amphorae[amphora_index][constants.ID])
117
+ db_lb = self.loadbalancer_repo.get(
118
+ session,
119
+ id=loadbalancer[constants.LOADBALANCER_ID])
115
120
  self.amphora_driver.update_amphora_listeners(
116
121
  db_lb, db_amp, timeout_dict)
117
122
  except Exception as e:
@@ -119,8 +124,10 @@ class AmphoraIndexListenerUpdate(BaseAmphoraTask):
119
124
  LOG.error('Failed to update listeners on amphora %s. Skipping '
120
125
  'this amphora as it is failing to update due to: %s',
121
126
  amphora_id, str(e))
122
- self.amphora_repo.update(db_apis.get_session(), amphora_id,
123
- status=constants.ERROR)
127
+ session = db_apis.get_session()
128
+ with session.begin():
129
+ self.amphora_repo.update(session, amphora_id,
130
+ status=constants.ERROR)
124
131
 
125
132
 
126
133
  class ListenersUpdate(BaseAmphoraTask):
@@ -128,8 +135,10 @@ class ListenersUpdate(BaseAmphoraTask):
128
135
 
129
136
  def execute(self, loadbalancer_id):
130
137
  """Execute updates per listener for an amphora."""
131
- loadbalancer = self.loadbalancer_repo.get(db_apis.get_session(),
132
- id=loadbalancer_id)
138
+ session = db_apis.get_session()
139
+ with session.begin():
140
+ loadbalancer = self.loadbalancer_repo.get(session,
141
+ id=loadbalancer_id)
133
142
  if loadbalancer:
134
143
  self.amphora_driver.update(loadbalancer)
135
144
  else:
@@ -140,8 +149,10 @@ class ListenersUpdate(BaseAmphoraTask):
140
149
  """Handle failed listeners updates."""
141
150
 
142
151
  LOG.warning("Reverting listeners updates.")
143
- loadbalancer = self.loadbalancer_repo.get(db_apis.get_session(),
144
- id=loadbalancer_id)
152
+ session = db_apis.get_session()
153
+ with session.begin():
154
+ loadbalancer = self.loadbalancer_repo.get(session,
155
+ id=loadbalancer_id)
145
156
  for listener in loadbalancer.listeners:
146
157
  self.task_utils.mark_listener_prov_status_error(
147
158
  listener.id)
@@ -152,12 +163,15 @@ class ListenersStart(BaseAmphoraTask):
152
163
 
153
164
  def execute(self, loadbalancer, amphora=None):
154
165
  """Execute listener start routines for listeners on an amphora."""
155
- db_lb = self.loadbalancer_repo.get(
156
- db_apis.get_session(), id=loadbalancer[constants.LOADBALANCER_ID])
166
+ session = db_apis.get_session()
167
+ with session.begin():
168
+ db_lb = self.loadbalancer_repo.get(
169
+ session, id=loadbalancer[constants.LOADBALANCER_ID])
157
170
  if db_lb.listeners:
158
171
  if amphora is not None:
159
- db_amp = self.amphora_repo.get(db_apis.get_session(),
160
- id=amphora[constants.ID])
172
+ with session.begin():
173
+ db_amp = self.amphora_repo.get(session,
174
+ id=amphora[constants.ID])
161
175
  else:
162
176
  db_amp = amphora
163
177
  self.amphora_driver.start(db_lb, db_amp)
@@ -167,8 +181,10 @@ class ListenersStart(BaseAmphoraTask):
167
181
  """Handle failed listeners starts."""
168
182
 
169
183
  LOG.warning("Reverting listeners starts.")
170
- db_lb = self.loadbalancer_repo.get(
171
- db_apis.get_session(), id=loadbalancer[constants.LOADBALANCER_ID])
184
+ session = db_apis.get_session()
185
+ with session.begin():
186
+ db_lb = self.loadbalancer_repo.get(
187
+ session, id=loadbalancer[constants.LOADBALANCER_ID])
172
188
  for listener in db_lb.listeners:
173
189
  self.task_utils.mark_listener_prov_status_error(listener.id)
174
190
 
@@ -183,11 +199,13 @@ class AmphoraIndexListenersReload(BaseAmphoraTask):
183
199
  return
184
200
  # TODO(johnsom) Optimize this to use the dicts and not need the
185
201
  # DB lookups
186
- db_amp = self.amphora_repo.get(
187
- db_apis.get_session(), id=amphorae[amphora_index][constants.ID])
188
- db_lb = self.loadbalancer_repo.get(
189
- db_apis.get_session(),
190
- id=loadbalancer[constants.LOADBALANCER_ID])
202
+ session = db_apis.get_session()
203
+ with session.begin():
204
+ db_amp = self.amphora_repo.get(
205
+ session, id=amphorae[amphora_index][constants.ID])
206
+ db_lb = self.loadbalancer_repo.get(
207
+ session,
208
+ id=loadbalancer[constants.LOADBALANCER_ID])
191
209
  if db_lb.listeners:
192
210
  try:
193
211
  self.amphora_driver.reload(db_lb, db_amp, timeout_dict)
@@ -196,8 +214,9 @@ class AmphoraIndexListenersReload(BaseAmphoraTask):
196
214
  LOG.warning('Failed to reload listeners on amphora %s. '
197
215
  'Skipping this amphora as it is failing to '
198
216
  'reload due to: %s', amphora_id, str(e))
199
- self.amphora_repo.update(db_apis.get_session(), amphora_id,
200
- status=constants.ERROR)
217
+ with session.begin():
218
+ self.amphora_repo.update(session, amphora_id,
219
+ status=constants.ERROR)
201
220
 
202
221
 
203
222
  class ListenerDelete(BaseAmphoraTask):
@@ -205,8 +224,10 @@ class ListenerDelete(BaseAmphoraTask):
205
224
 
206
225
  def execute(self, listener):
207
226
  """Execute listener delete routines for an amphora."""
208
- db_listener = self.listener_repo.get(
209
- db_apis.get_session(), id=listener[constants.LISTENER_ID])
227
+ session = db_apis.get_session()
228
+ with session.begin():
229
+ db_listener = self.listener_repo.get(
230
+ session, id=listener[constants.LISTENER_ID])
210
231
  self.amphora_driver.delete(db_listener)
211
232
  LOG.debug("Deleted the listener on the vip")
212
233
 
@@ -224,8 +245,10 @@ class AmphoraGetInfo(BaseAmphoraTask):
224
245
 
225
246
  def execute(self, amphora):
226
247
  """Execute get_info routine for an amphora."""
227
- db_amp = self.amphora_repo.get(db_apis.get_session(),
228
- id=amphora[constants.ID])
248
+ session = db_apis.get_session()
249
+ with session.begin():
250
+ db_amp = self.amphora_repo.get(session,
251
+ id=amphora[constants.ID])
229
252
  self.amphora_driver.get_info(db_amp)
230
253
 
231
254
 
@@ -242,8 +265,10 @@ class AmphoraFinalize(BaseAmphoraTask):
242
265
 
243
266
  def execute(self, amphora):
244
267
  """Execute finalize_amphora routine."""
245
- db_amp = self.amphora_repo.get(db_apis.get_session(),
246
- id=amphora.get(constants.ID))
268
+ session = db_apis.get_session()
269
+ with session.begin():
270
+ db_amp = self.amphora_repo.get(session,
271
+ id=amphora.get(constants.ID))
247
272
  self.amphora_driver.finalize_amphora(db_amp)
248
273
  LOG.debug("Finalized the amphora.")
249
274
 
@@ -261,8 +286,10 @@ class AmphoraPostNetworkPlug(BaseAmphoraTask):
261
286
 
262
287
  def execute(self, amphora, ports, amphora_network_config):
263
288
  """Execute post_network_plug routine."""
264
- db_amp = self.amphora_repo.get(db_apis.get_session(),
265
- id=amphora[constants.ID])
289
+ session = db_apis.get_session()
290
+ with session.begin():
291
+ db_amp = self.amphora_repo.get(session,
292
+ id=amphora[constants.ID])
266
293
 
267
294
  for port in ports:
268
295
  net = data_models.Network(**port.pop(constants.NETWORK))
@@ -302,8 +329,10 @@ class AmphoraePostNetworkPlug(BaseAmphoraTask):
302
329
  def execute(self, loadbalancer, updated_ports, amphorae_network_config):
303
330
  """Execute post_network_plug routine."""
304
331
  amp_post_plug = AmphoraPostNetworkPlug()
305
- db_lb = self.loadbalancer_repo.get(
306
- db_apis.get_session(), id=loadbalancer[constants.LOADBALANCER_ID])
332
+ session = db_apis.get_session()
333
+ with session.begin():
334
+ db_lb = self.loadbalancer_repo.get(
335
+ session, id=loadbalancer[constants.LOADBALANCER_ID])
307
336
  for amphora in db_lb.amphorae:
308
337
  if amphora.id in updated_ports:
309
338
  amp_post_plug.execute(amphora.to_dict(),
@@ -314,8 +343,10 @@ class AmphoraePostNetworkPlug(BaseAmphoraTask):
314
343
  """Handle a failed post network plug."""
315
344
  if isinstance(result, failure.Failure):
316
345
  return
317
- db_lb = self.loadbalancer_repo.get(
318
- db_apis.get_session(), id=loadbalancer[constants.LOADBALANCER_ID])
346
+ session = db_apis.get_session()
347
+ with session.begin():
348
+ db_lb = self.loadbalancer_repo.get(
349
+ session, id=loadbalancer[constants.LOADBALANCER_ID])
319
350
  LOG.warning("Reverting post network plug.")
320
351
  for amphora in filter(
321
352
  lambda amp: amp.status == constants.AMPHORA_ALLOCATED,
@@ -329,10 +360,12 @@ class AmphoraPostVIPPlug(BaseAmphoraTask):
329
360
 
330
361
  def execute(self, amphora, loadbalancer, amphorae_network_config):
331
362
  """Execute post_vip_routine."""
332
- db_amp = self.amphora_repo.get(db_apis.get_session(),
333
- id=amphora.get(constants.ID))
334
- db_lb = self.loadbalancer_repo.get(
335
- db_apis.get_session(), id=loadbalancer[constants.LOADBALANCER_ID])
363
+ session = db_apis.get_session()
364
+ with session.begin():
365
+ db_amp = self.amphora_repo.get(session,
366
+ id=amphora.get(constants.ID))
367
+ db_lb = self.loadbalancer_repo.get(
368
+ session, id=loadbalancer[constants.LOADBALANCER_ID])
336
369
  vrrp_port = data_models.Port(
337
370
  **amphorae_network_config[
338
371
  amphora.get(constants.ID)][constants.VRRP_PORT])
@@ -367,8 +400,8 @@ class AmphoraPostVIPPlug(BaseAmphoraTask):
367
400
  subnet=subnet))
368
401
 
369
402
  self.amphora_driver.post_vip_plug(
370
- db_amp, db_lb, amphorae_network_config, vrrp_port=vrrp_port,
371
- vip_subnet=vip_subnet, additional_vip_data=additional_vip_data)
403
+ db_amp, db_lb, amphorae_network_config, vrrp_port,
404
+ vip_subnet, additional_vip_data=additional_vip_data)
372
405
  LOG.debug("Notified amphora of vip plug")
373
406
 
374
407
  def revert(self, result, amphora, loadbalancer, *args, **kwargs):
@@ -385,8 +418,10 @@ class AmphoraePostVIPPlug(BaseAmphoraTask):
385
418
  def execute(self, loadbalancer, amphorae_network_config):
386
419
  """Execute post_vip_plug across the amphorae."""
387
420
  amp_post_vip_plug = AmphoraPostVIPPlug()
388
- db_lb = self.loadbalancer_repo.get(
389
- db_apis.get_session(), id=loadbalancer[constants.LOADBALANCER_ID])
421
+ session = db_apis.get_session()
422
+ with session.begin():
423
+ db_lb = self.loadbalancer_repo.get(
424
+ session, id=loadbalancer[constants.LOADBALANCER_ID])
390
425
  for amphora in db_lb.amphorae:
391
426
  amp_post_vip_plug.execute(amphora.to_dict(),
392
427
  loadbalancer,
@@ -401,8 +436,10 @@ class AmphoraCertUpload(BaseAmphoraTask):
401
436
  LOG.debug("Upload cert in amphora REST driver")
402
437
  key = utils.get_compatible_server_certs_key_passphrase()
403
438
  fer = fernet.Fernet(key)
404
- db_amp = self.amphora_repo.get(db_apis.get_session(),
405
- id=amphora.get(constants.ID))
439
+ session = db_apis.get_session()
440
+ with session.begin():
441
+ db_amp = self.amphora_repo.get(session,
442
+ id=amphora.get(constants.ID))
406
443
  self.amphora_driver.upload_cert_amp(
407
444
  db_amp, fer.decrypt(server_pem.encode('utf-8')))
408
445
 
@@ -415,8 +452,10 @@ class AmphoraUpdateVRRPInterface(BaseAmphoraTask):
415
452
  try:
416
453
  # TODO(johnsom) Optimize this to use the dicts and not need the
417
454
  # DB lookups
418
- db_amp = self.amphora_repo.get(db_apis.get_session(),
419
- id=amphora[constants.ID])
455
+ session = db_apis.get_session()
456
+ with session.begin():
457
+ db_amp = self.amphora_repo.get(session,
458
+ id=amphora[constants.ID])
420
459
  interface = self.amphora_driver.get_interface_from_ip(
421
460
  db_amp, db_amp.vrrp_ip, timeout_dict=timeout_dict)
422
461
  except Exception as e:
@@ -424,13 +463,15 @@ class AmphoraUpdateVRRPInterface(BaseAmphoraTask):
424
463
  LOG.error('Failed to get amphora VRRP interface on amphora '
425
464
  '%s. Skipping this amphora as it is failing due to: '
426
465
  '%s', amphora.get(constants.ID), str(e))
427
- self.amphora_repo.update(db_apis.get_session(),
428
- amphora.get(constants.ID),
429
- status=constants.ERROR)
466
+ with session.begin():
467
+ self.amphora_repo.update(session,
468
+ amphora.get(constants.ID),
469
+ status=constants.ERROR)
430
470
  return None
431
471
 
432
- self.amphora_repo.update(db_apis.get_session(), amphora[constants.ID],
433
- vrrp_interface=interface)
472
+ with session.begin():
473
+ self.amphora_repo.update(session, amphora[constants.ID],
474
+ vrrp_interface=interface)
434
475
  return interface
435
476
 
436
477
 
@@ -442,8 +483,10 @@ class AmphoraIndexUpdateVRRPInterface(BaseAmphoraTask):
442
483
  try:
443
484
  # TODO(johnsom) Optimize this to use the dicts and not need the
444
485
  # DB lookups
445
- db_amp = self.amphora_repo.get(db_apis.get_session(),
446
- id=amphora_id)
486
+ session = db_apis.get_session()
487
+ with session.begin():
488
+ db_amp = self.amphora_repo.get(session,
489
+ id=amphora_id)
447
490
  interface = self.amphora_driver.get_interface_from_ip(
448
491
  db_amp, db_amp.vrrp_ip, timeout_dict=timeout_dict)
449
492
  except Exception as e:
@@ -451,12 +494,14 @@ class AmphoraIndexUpdateVRRPInterface(BaseAmphoraTask):
451
494
  LOG.error('Failed to get amphora VRRP interface on amphora '
452
495
  '%s. Skipping this amphora as it is failing due to: '
453
496
  '%s', amphora_id, str(e))
454
- self.amphora_repo.update(db_apis.get_session(), amphora_id,
455
- status=constants.ERROR)
497
+ with session.begin():
498
+ self.amphora_repo.update(session, amphora_id,
499
+ status=constants.ERROR)
456
500
  return None
457
501
 
458
- self.amphora_repo.update(db_apis.get_session(), amphora_id,
459
- vrrp_interface=interface)
502
+ with session.begin():
503
+ self.amphora_repo.update(session, amphora_id,
504
+ vrrp_interface=interface)
460
505
  return interface
461
506
 
462
507
 
@@ -473,10 +518,12 @@ class AmphoraVRRPUpdate(BaseAmphoraTask):
473
518
  try:
474
519
  # TODO(johnsom) Optimize this to use the dicts and not need the
475
520
  # DB lookups
476
- db_amp = self.amphora_repo.get(db_apis.get_session(),
477
- id=amphora_id)
478
- loadbalancer = self.loadbalancer_repo.get(db_apis.get_session(),
479
- id=loadbalancer_id)
521
+ session = db_apis.get_session()
522
+ with session.begin():
523
+ db_amp = self.amphora_repo.get(session,
524
+ id=amphora_id)
525
+ loadbalancer = self.loadbalancer_repo.get(session,
526
+ id=loadbalancer_id)
480
527
  db_amp.vrrp_interface = amp_vrrp_int
481
528
  self.amphora_driver.update_vrrp_conf(
482
529
  loadbalancer, amphorae_network_config, db_amp, timeout_dict)
@@ -484,8 +531,9 @@ class AmphoraVRRPUpdate(BaseAmphoraTask):
484
531
  LOG.error('Failed to update VRRP configuration amphora %s. '
485
532
  'Skipping this amphora as it is failing to update due '
486
533
  'to: %s', amphora_id, str(e))
487
- self.amphora_repo.update(db_apis.get_session(), amphora_id,
488
- status=constants.ERROR)
534
+ with session.begin():
535
+ self.amphora_repo.update(session, amphora_id,
536
+ status=constants.ERROR)
489
537
 
490
538
  LOG.debug("Uploaded VRRP configuration of amphora %s.", amphora_id)
491
539
 
@@ -503,10 +551,12 @@ class AmphoraIndexVRRPUpdate(BaseAmphoraTask):
503
551
  try:
504
552
  # TODO(johnsom) Optimize this to use the dicts and not need the
505
553
  # DB lookups
506
- db_amp = self.amphora_repo.get(db_apis.get_session(),
507
- id=amphora_id)
508
- loadbalancer = self.loadbalancer_repo.get(db_apis.get_session(),
509
- id=loadbalancer_id)
554
+ session = db_apis.get_session()
555
+ with session.begin():
556
+ db_amp = self.amphora_repo.get(session,
557
+ id=amphora_id)
558
+ loadbalancer = self.loadbalancer_repo.get(session,
559
+ id=loadbalancer_id)
510
560
  db_amp.vrrp_interface = amp_vrrp_int
511
561
  self.amphora_driver.update_vrrp_conf(
512
562
  loadbalancer, amphorae_network_config, db_amp, timeout_dict)
@@ -514,8 +564,9 @@ class AmphoraIndexVRRPUpdate(BaseAmphoraTask):
514
564
  LOG.error('Failed to update VRRP configuration amphora %s. '
515
565
  'Skipping this amphora as it is failing to update due '
516
566
  'to: %s', amphora_id, str(e))
517
- self.amphora_repo.update(db_apis.get_session(), amphora_id,
518
- status=constants.ERROR)
567
+ with session.begin():
568
+ self.amphora_repo.update(session, amphora_id,
569
+ status=constants.ERROR)
519
570
  return
520
571
  LOG.debug("Uploaded VRRP configuration of amphora %s.", amphora_id)
521
572
 
@@ -529,8 +580,10 @@ class AmphoraVRRPStart(BaseAmphoraTask):
529
580
  def execute(self, amphora, timeout_dict=None):
530
581
  # TODO(johnsom) Optimize this to use the dicts and not need the
531
582
  # DB lookups
532
- db_amp = self.amphora_repo.get(
533
- db_apis.get_session(), id=amphora[constants.ID])
583
+ session = db_apis.get_session()
584
+ with session.begin():
585
+ db_amp = self.amphora_repo.get(
586
+ session, id=amphora[constants.ID])
534
587
  self.amphora_driver.start_vrrp_service(db_amp, timeout_dict)
535
588
  LOG.debug("Started VRRP on amphora %s.", amphora[constants.ID])
536
589
 
@@ -545,15 +598,18 @@ class AmphoraIndexVRRPStart(BaseAmphoraTask):
545
598
  # TODO(johnsom) Optimize this to use the dicts and not need the
546
599
  # DB lookups
547
600
  amphora_id = amphorae[amphora_index][constants.ID]
548
- db_amp = self.amphora_repo.get(db_apis.get_session(), id=amphora_id)
601
+ session = db_apis.get_session()
602
+ with session.begin():
603
+ db_amp = self.amphora_repo.get(session, id=amphora_id)
549
604
  try:
550
605
  self.amphora_driver.start_vrrp_service(db_amp, timeout_dict)
551
606
  except Exception as e:
552
607
  LOG.error('Failed to start VRRP on amphora %s. '
553
608
  'Skipping this amphora as it is failing to start due '
554
609
  'to: %s', amphora_id, str(e))
555
- self.amphora_repo.update(db_apis.get_session(), amphora_id,
556
- status=constants.ERROR)
610
+ with session.begin():
611
+ self.amphora_repo.update(session, amphora_id,
612
+ status=constants.ERROR)
557
613
  return
558
614
  LOG.debug("Started VRRP on amphora %s.",
559
615
  amphorae[amphora_index][constants.ID])
@@ -565,8 +621,10 @@ class AmphoraComputeConnectivityWait(BaseAmphoraTask):
565
621
  def execute(self, amphora, raise_retry_exception=False):
566
622
  """Execute get_info routine for an amphora until it responds."""
567
623
  try:
568
- db_amphora = self.amphora_repo.get(
569
- db_apis.get_session(), id=amphora.get(constants.ID))
624
+ session = db_apis.get_session()
625
+ with session.begin():
626
+ db_amphora = self.amphora_repo.get(
627
+ session, id=amphora.get(constants.ID))
570
628
  amp_info = self.amphora_driver.get_info(
571
629
  db_amphora, raise_retry_exception=raise_retry_exception)
572
630
  LOG.debug('Successfuly connected to amphora %s: %s',
@@ -576,9 +634,10 @@ class AmphoraComputeConnectivityWait(BaseAmphoraTask):
576
634
  "This either means the compute driver failed to fully "
577
635
  "boot the instance inside the timeout interval or the "
578
636
  "instance is not reachable via the lb-mgmt-net.")
579
- self.amphora_repo.update(db_apis.get_session(),
580
- amphora.get(constants.ID),
581
- status=constants.ERROR)
637
+ with session.begin():
638
+ self.amphora_repo.update(session,
639
+ amphora.get(constants.ID),
640
+ status=constants.ERROR)
582
641
  raise
583
642
 
584
643
 
@@ -597,8 +656,10 @@ class AmphoraConfigUpdate(BaseAmphoraTask):
597
656
  agent_cfg_tmpl = agent_jinja_cfg.AgentJinjaTemplater()
598
657
  agent_config = agent_cfg_tmpl.build_agent_config(
599
658
  amphora.get(constants.ID), topology)
600
- db_amp = self.amphora_repo.get(db_apis.get_session(),
601
- id=amphora[constants.ID])
659
+ session = db_apis.get_session()
660
+ with session.begin():
661
+ db_amp = self.amphora_repo.get(session,
662
+ id=amphora[constants.ID])
602
663
  # Push the new configuration to the amphora
603
664
  try:
604
665
  self.amphora_driver.update_amphora_agent_config(db_amp,
@@ -210,8 +210,10 @@ class DeleteAmphoraeOnLoadBalancer(BaseComputeTask):
210
210
  """
211
211
 
212
212
  def execute(self, loadbalancer):
213
- db_lb = self.loadbalancer_repo.get(
214
- db_apis.get_session(), id=loadbalancer[constants.LOADBALANCER_ID])
213
+ session = db_apis.get_session()
214
+ with session.begin():
215
+ db_lb = self.loadbalancer_repo.get(
216
+ session, id=loadbalancer[constants.LOADBALANCER_ID])
215
217
  for amp in db_lb.amphorae:
216
218
  # The compute driver will already handle NotFound
217
219
  try: