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
@@ -25,56 +25,64 @@ def process_get(get_data):
25
25
 
26
26
  if get_data[constants.OBJECT] == lib_consts.LOADBALANCERS:
27
27
  lb_repo = repositories.LoadBalancerRepository()
28
- db_lb = lb_repo.get(session, id=get_data[lib_consts.ID],
29
- show_deleted=False)
28
+ with session.begin():
29
+ db_lb = lb_repo.get(session, id=get_data[lib_consts.ID],
30
+ show_deleted=False)
30
31
  if db_lb:
31
32
  provider_lb = (
32
33
  driver_utils.db_loadbalancer_to_provider_loadbalancer(db_lb))
33
34
  return provider_lb.to_dict(recurse=True, render_unsets=True)
34
35
  elif get_data[constants.OBJECT] == lib_consts.LISTENERS:
35
36
  listener_repo = repositories.ListenerRepository()
36
- db_listener = listener_repo.get(
37
- session, id=get_data[lib_consts.ID], show_deleted=False)
37
+ with session.begin():
38
+ db_listener = listener_repo.get(
39
+ session, id=get_data[lib_consts.ID], show_deleted=False)
38
40
  if db_listener:
39
41
  provider_listener = (
40
42
  driver_utils.db_listener_to_provider_listener(db_listener))
41
43
  return provider_listener.to_dict(recurse=True, render_unsets=True)
42
44
  elif get_data[constants.OBJECT] == lib_consts.POOLS:
43
45
  pool_repo = repositories.PoolRepository()
44
- db_pool = pool_repo.get(session, id=get_data[lib_consts.ID],
45
- show_deleted=False)
46
+ with session.begin():
47
+ db_pool = pool_repo.get(session, id=get_data[lib_consts.ID],
48
+ show_deleted=False)
46
49
  if db_pool:
47
50
  provider_pool = (
48
51
  driver_utils.db_pool_to_provider_pool(db_pool))
49
52
  return provider_pool.to_dict(recurse=True, render_unsets=True)
50
53
  elif get_data[constants.OBJECT] == lib_consts.MEMBERS:
51
54
  member_repo = repositories.MemberRepository()
52
- db_member = member_repo.get(session, id=get_data[lib_consts.ID],
53
- show_deleted=False)
55
+ with session.begin():
56
+ db_member = member_repo.get(session, id=get_data[lib_consts.ID],
57
+ show_deleted=False)
54
58
  if db_member:
55
59
  provider_member = (
56
60
  driver_utils.db_member_to_provider_member(db_member))
57
61
  return provider_member.to_dict(recurse=True, render_unsets=True)
58
62
  elif get_data[constants.OBJECT] == lib_consts.HEALTHMONITORS:
59
63
  hm_repo = repositories.HealthMonitorRepository()
60
- db_hm = hm_repo.get(session, id=get_data[lib_consts.ID],
61
- show_deleted=False)
64
+ with session.begin():
65
+ db_hm = hm_repo.get(session, id=get_data[lib_consts.ID],
66
+ show_deleted=False)
62
67
  if db_hm:
63
68
  provider_hm = (
64
69
  driver_utils.db_HM_to_provider_HM(db_hm))
65
70
  return provider_hm.to_dict(recurse=True, render_unsets=True)
66
71
  elif get_data[constants.OBJECT] == lib_consts.L7POLICIES:
67
72
  l7policy_repo = repositories.L7PolicyRepository()
68
- db_l7policy = l7policy_repo.get(session, id=get_data[lib_consts.ID],
69
- show_deleted=False)
73
+ with session.begin():
74
+ db_l7policy = l7policy_repo.get(session,
75
+ id=get_data[lib_consts.ID],
76
+ show_deleted=False)
70
77
  if db_l7policy:
71
78
  provider_l7policy = (
72
79
  driver_utils.db_l7policy_to_provider_l7policy(db_l7policy))
73
80
  return provider_l7policy.to_dict(recurse=True, render_unsets=True)
74
81
  elif get_data[constants.OBJECT] == lib_consts.L7RULES:
75
82
  l7rule_repo = repositories.L7RuleRepository()
76
- db_l7rule = l7rule_repo.get(session, id=get_data[lib_consts.ID],
77
- show_deleted=False)
83
+ with session.begin():
84
+ db_l7rule = l7rule_repo.get(session, id=get_data[lib_consts.ID],
85
+ show_deleted=False)
78
86
  if db_l7rule:
79
87
  provider_l7rule = (
80
88
  driver_utils.db_l7rule_to_provider_l7rule(db_l7rule))
@@ -46,7 +46,8 @@ class DriverUpdater(object):
46
46
  super().__init__(**kwargs)
47
47
 
48
48
  def _check_for_lb_vip_deallocate(self, repo, lb_id):
49
- lb = repo.get(self.db_session, id=lb_id)
49
+ with self.db_session.begin():
50
+ lb = repo.get(self.db_session, id=lb_id)
50
51
  if lb.vip.octavia_owned:
51
52
  vip = lb.vip
52
53
  # We need a backreference
@@ -56,7 +57,8 @@ class DriverUpdater(object):
56
57
  network_driver.deallocate_vip(vip)
57
58
 
58
59
  def _decrement_quota(self, repo, object_name, record_id):
59
- lock_session = db_apis.get_session(autocommit=False)
60
+ lock_session = self.db_session
61
+ lock_session.begin()
60
62
  db_object = repo.get(lock_session, id=record_id)
61
63
  if db_object is None:
62
64
  lock_session.rollback()
@@ -106,7 +108,8 @@ class DriverUpdater(object):
106
108
  return
107
109
 
108
110
  if delete_record and object_name != consts.LOADBALANCERS:
109
- repo.delete(self.db_session, id=record_id)
111
+ with self.db_session.begin():
112
+ repo.delete(self.db_session, id=record_id)
110
113
  return
111
114
 
112
115
  record_kwargs[consts.PROVISIONING_STATUS] = prov_status
@@ -114,7 +117,8 @@ class DriverUpdater(object):
114
117
  if op_status:
115
118
  record_kwargs[consts.OPERATING_STATUS] = op_status
116
119
  if prov_status or op_status:
117
- repo.update(self.db_session, record_id, **record_kwargs)
120
+ with self.db_session.begin():
121
+ repo.update(self.db_session, record_id, **record_kwargs)
118
122
  except Exception as e:
119
123
  # We need to raise a failure here to notify the driver it is
120
124
  # sending bad status data.
@@ -132,8 +132,10 @@ def lb_dict_to_provider_dict(lb_dict, vip=None, add_vips=None, db_pools=None,
132
132
  new_lb_dict['vip_qos_policy_id'] = vip.qos_policy_id
133
133
  if 'flavor_id' in lb_dict and lb_dict['flavor_id']:
134
134
  flavor_repo = repositories.FlavorRepository()
135
- new_lb_dict['flavor'] = flavor_repo.get_flavor_metadata_dict(
136
- db_api.get_session(), lb_dict['flavor_id'])
135
+ session = db_api.get_session()
136
+ with session.begin():
137
+ new_lb_dict['flavor'] = flavor_repo.get_flavor_metadata_dict(
138
+ session, lb_dict['flavor_id'])
137
139
  if add_vips:
138
140
  new_lb_dict['additional_vips'] = db_additional_vips_to_provider_vips(
139
141
  add_vips)
@@ -42,8 +42,10 @@ class OctaviaDBHealthcheck(pluginbase.HealthcheckBaseExtension):
42
42
  result = self.last_result
43
43
  message = self.last_message
44
44
  else:
45
- result, message = healthcheck.check_database_connection(
46
- db_apis.get_session())
45
+ session = db_apis.get_session()
46
+ with session.begin():
47
+ result, message = healthcheck.check_database_connection(
48
+ session)
47
49
  self.last_check = datetime.datetime.now()
48
50
  self.last_result = result
49
51
  self.last_message = message
@@ -143,6 +143,9 @@ class RootController(object):
143
143
  self._add_a_version(versions, 'v2.25', 'v2', 'SUPPORTED',
144
144
  '2021-10-02T00:00:00Z', host_url)
145
145
  # Additional VIPs
146
- self._add_a_version(versions, 'v2.26', 'v2', 'CURRENT',
146
+ self._add_a_version(versions, 'v2.26', 'v2', 'SUPPORTED',
147
147
  '2022-08-29T00:00:00Z', host_url)
148
+ # HTTP Strict Transport Security (HSTS)
149
+ self._add_a_version(versions, 'v2.27', 'v2', 'CURRENT',
150
+ '2023-05-05T00:00:00Z', host_url)
148
151
  return {'versions': versions}
@@ -28,7 +28,6 @@ from octavia.api.v2.types import amphora as amp_types
28
28
  from octavia.common import constants
29
29
  from octavia.common import exceptions
30
30
  from octavia.common import rpc
31
- from octavia.db import api as db_api
32
31
 
33
32
  CONF = cfg.CONF
34
33
  LOG = logging.getLogger(__name__)
@@ -50,7 +49,8 @@ class AmphoraController(base.BaseController):
50
49
  def get_one(self, id, fields=None):
51
50
  """Gets a single amphora's details."""
52
51
  context = pecan_request.context.get('octavia_context')
53
- db_amp = self._get_db_amp(context.session, id, show_deleted=False)
52
+ with context.session.begin():
53
+ db_amp = self._get_db_amp(context.session, id, show_deleted=False)
54
54
 
55
55
  self._auth_validate_action(context, context.project_id,
56
56
  constants.RBAC_GET_ONE)
@@ -71,9 +71,10 @@ class AmphoraController(base.BaseController):
71
71
  self._auth_validate_action(context, context.project_id,
72
72
  constants.RBAC_GET_ALL)
73
73
 
74
- db_amp, links = self.repositories.amphora.get_all_API_list(
75
- context.session, show_deleted=False,
76
- pagination_helper=pcontext.get(constants.PAGINATION_HELPER))
74
+ with context.session.begin():
75
+ db_amp, links = self.repositories.amphora.get_all_API_list(
76
+ context.session, show_deleted=False,
77
+ pagination_helper=pcontext.get(constants.PAGINATION_HELPER))
77
78
  result = self._convert_db_to_type(
78
79
  db_amp, [amp_types.AmphoraResponse])
79
80
  if fields is not None:
@@ -89,10 +90,10 @@ class AmphoraController(base.BaseController):
89
90
  self._auth_validate_action(context, context.project_id,
90
91
  constants.RBAC_DELETE)
91
92
 
92
- with db_api.get_lock_session() as lock_session:
93
+ with context.session.begin():
93
94
  try:
94
95
  self.repositories.amphora.test_and_set_status_for_delete(
95
- lock_session, id)
96
+ context.session, id)
96
97
  except sa_exception.NoResultFound as e:
97
98
  raise exceptions.NotFound(resource='Amphora', id=id) from e
98
99
 
@@ -124,12 +125,8 @@ class FailoverController(base.BaseController):
124
125
 
125
126
  def __init__(self, amp_id):
126
127
  super().__init__()
127
- if CONF.api_settings.default_provider_driver == constants.AMPHORAV1:
128
- topic = cfg.CONF.oslo_messaging.topic
129
- version = "1.0"
130
- else:
131
- topic = constants.TOPIC_AMPHORA_V2
132
- version = "2.0"
128
+ topic = constants.TOPIC_AMPHORA_V2
129
+ version = "2.0"
133
130
  self.target = messaging.Target(
134
131
  namespace=constants.RPC_NAMESPACE_CONTROLLER_AGENT,
135
132
  topic=topic, version=version, fanout=False)
@@ -141,27 +138,29 @@ class FailoverController(base.BaseController):
141
138
  """Fails over an amphora"""
142
139
  pcontext = pecan_request.context
143
140
  context = pcontext.get('octavia_context')
144
- db_amp = self._get_db_amp(context.session, self.amp_id,
145
- show_deleted=False)
141
+ with context.session.begin():
142
+ db_amp = self._get_db_amp(context.session, self.amp_id,
143
+ show_deleted=False)
146
144
 
147
145
  self._auth_validate_action(
148
146
  context, db_amp.load_balancer.project_id,
149
147
  constants.RBAC_PUT_FAILOVER)
150
148
 
151
- self.repositories.load_balancer.test_and_set_provisioning_status(
152
- context.session, db_amp.load_balancer_id,
153
- status=constants.PENDING_UPDATE, raise_exception=True)
149
+ with context.session.begin():
150
+ self.repositories.load_balancer.test_and_set_provisioning_status(
151
+ context.session, db_amp.load_balancer_id,
152
+ status=constants.PENDING_UPDATE, raise_exception=True)
154
153
 
155
- try:
156
- LOG.info("Sending failover request for amphora %s to the queue",
157
- self.amp_id)
158
- payload = {constants.AMPHORA_ID: db_amp.id}
159
- self.client.cast({}, 'failover_amphora', **payload)
160
- except Exception:
161
- with excutils.save_and_reraise_exception(reraise=False):
162
- self.repositories.load_balancer.update(
163
- context.session, db_amp.load_balancer.id,
164
- provisioning_status=constants.ERROR)
154
+ try:
155
+ LOG.info("Sending failover request for amphora %s to the "
156
+ "queue", self.amp_id)
157
+ payload = {constants.AMPHORA_ID: db_amp.id}
158
+ self.client.cast({}, 'failover_amphora', **payload)
159
+ except Exception:
160
+ with excutils.save_and_reraise_exception(reraise=False):
161
+ self.repositories.load_balancer.update(
162
+ context.session, db_amp.load_balancer.id,
163
+ provisioning_status=constants.ERROR)
165
164
 
166
165
 
167
166
  class AmphoraUpdateController(base.BaseController):
@@ -170,12 +169,8 @@ class AmphoraUpdateController(base.BaseController):
170
169
  def __init__(self, amp_id):
171
170
  super().__init__()
172
171
 
173
- if CONF.api_settings.default_provider_driver == constants.AMPHORAV1:
174
- topic = cfg.CONF.oslo_messaging.topic
175
- version = "1.0"
176
- else:
177
- topic = constants.TOPIC_AMPHORA_V2
178
- version = "2.0"
172
+ topic = constants.TOPIC_AMPHORA_V2
173
+ version = "2.0"
179
174
  self.target = messaging.Target(
180
175
  namespace=constants.RPC_NAMESPACE_CONTROLLER_AGENT,
181
176
  topic=topic, version=version, fanout=False)
@@ -187,8 +182,9 @@ class AmphoraUpdateController(base.BaseController):
187
182
  """Update amphora agent configuration"""
188
183
  pcontext = pecan_request.context
189
184
  context = pcontext.get('octavia_context')
190
- db_amp = self._get_db_amp(context.session, self.amp_id,
191
- show_deleted=False)
185
+ with context.session.begin():
186
+ db_amp = self._get_db_amp(context.session, self.amp_id,
187
+ show_deleted=False)
192
188
 
193
189
  self._auth_validate_action(
194
190
  context, db_amp.load_balancer.project_id,
@@ -220,8 +216,9 @@ class AmphoraStatsController(base.BaseController):
220
216
  self._auth_validate_action(context, context.project_id,
221
217
  constants.RBAC_GET_STATS)
222
218
 
223
- stats = self.repositories.get_amphora_stats(context.session,
224
- self.amp_id)
219
+ with context.session.begin():
220
+ stats = self.repositories.get_amphora_stats(context.session,
221
+ self.amp_id)
225
222
  if not stats:
226
223
  raise exceptions.NotFound(resource='Amphora stats for',
227
224
  id=self.amp_id)
@@ -28,7 +28,6 @@ from octavia.api.v2.controllers import base
28
28
  from octavia.api.v2.types import availability_zone_profile as profile_types
29
29
  from octavia.common import constants
30
30
  from octavia.common import exceptions
31
- from octavia.db import api as db_api
32
31
 
33
32
  LOG = logging.getLogger(__name__)
34
33
 
@@ -49,8 +48,9 @@ class AvailabilityZoneProfileController(base.BaseController):
49
48
  if id == constants.NIL_UUID:
50
49
  raise exceptions.NotFound(resource='Availability Zone Profile',
51
50
  id=constants.NIL_UUID)
52
- db_availability_zone_profile = self._get_db_availability_zone_profile(
53
- context.session, id)
51
+ with context.session.begin():
52
+ db_availability_zone_profile = (
53
+ self._get_db_availability_zone_profile(context.session, id))
54
54
  result = self._convert_db_to_type(
55
55
  db_availability_zone_profile,
56
56
  profile_types.AvailabilityZoneProfileResponse)
@@ -67,10 +67,12 @@ class AvailabilityZoneProfileController(base.BaseController):
67
67
  context = pcontext.get('octavia_context')
68
68
  self._auth_validate_action(context, context.project_id,
69
69
  constants.RBAC_GET_ALL)
70
- db_availability_zone_profiles, links = (
71
- self.repositories.availability_zone_profile.get_all(
72
- context.session,
73
- pagination_helper=pcontext.get(constants.PAGINATION_HELPER)))
70
+ with context.session.begin():
71
+ db_availability_zone_profiles, links = (
72
+ self.repositories.availability_zone_profile.get_all(
73
+ context.session,
74
+ pagination_helper=pcontext.get(
75
+ constants.PAGINATION_HELPER)))
74
76
  result = self._convert_db_to_type(
75
77
  db_availability_zone_profiles,
76
78
  [profile_types.AvailabilityZoneProfileResponse])
@@ -106,21 +108,21 @@ class AvailabilityZoneProfileController(base.BaseController):
106
108
  driver.name, driver.validate_availability_zone,
107
109
  availability_zone_data_dict)
108
110
 
109
- lock_session = db_api.get_session(autocommit=False)
111
+ context.session.begin()
110
112
  try:
111
113
  availability_zone_profile_dict = availability_zone_profile.to_dict(
112
114
  render_unsets=True)
113
115
  availability_zone_profile_dict['id'] = uuidutils.generate_uuid()
114
116
  db_availability_zone_profile = (
115
117
  self.repositories.availability_zone_profile.create(
116
- lock_session, **availability_zone_profile_dict))
117
- lock_session.commit()
118
+ context.session, **availability_zone_profile_dict))
119
+ context.session.commit()
118
120
  except odb_exceptions.DBDuplicateEntry as e:
119
- lock_session.rollback()
121
+ context.session.rollback()
120
122
  raise exceptions.IDAlreadyExists() from e
121
123
  except Exception:
122
124
  with excutils.save_and_reraise_exception():
123
- lock_session.rollback()
125
+ context.session.rollback()
124
126
  result = self._convert_db_to_type(
125
127
  db_availability_zone_profile,
126
128
  profile_types.AvailabilityZoneProfileResponse)
@@ -159,7 +161,8 @@ class AvailabilityZoneProfileController(base.BaseController):
159
161
  self._auth_validate_action(context, context.project_id,
160
162
  constants.RBAC_PUT)
161
163
 
162
- self._validate_update_azp(context, id, availability_zone_profile)
164
+ with context.session.begin():
165
+ self._validate_update_azp(context, id, availability_zone_profile)
163
166
  if id == constants.NIL_UUID:
164
167
  raise exceptions.NotFound(resource='Availability Zone Profile',
165
168
  id=constants.NIL_UUID)
@@ -177,9 +180,10 @@ class AvailabilityZoneProfileController(base.BaseController):
177
180
 
178
181
  if isinstance(availability_zone_profile.provider_name,
179
182
  wtypes.UnsetType):
180
- db_availability_zone_profile = (
181
- self._get_db_availability_zone_profile(
182
- context.session, id))
183
+ with context.session.begin():
184
+ db_availability_zone_profile = (
185
+ self._get_db_availability_zone_profile(
186
+ context.session, id))
183
187
  provider_driver = db_availability_zone_profile.provider_name
184
188
  else:
185
189
  provider_driver = availability_zone_profile.provider_name
@@ -190,23 +194,25 @@ class AvailabilityZoneProfileController(base.BaseController):
190
194
  driver.name, driver.validate_availability_zone,
191
195
  availability_zone_data_dict)
192
196
 
193
- lock_session = db_api.get_session(autocommit=False)
197
+ context.session.begin()
194
198
  try:
195
199
  availability_zone_profile_dict = availability_zone_profile.to_dict(
196
200
  render_unsets=False)
197
201
  if availability_zone_profile_dict:
198
202
  self.repositories.availability_zone_profile.update(
199
- lock_session, id, **availability_zone_profile_dict)
200
- lock_session.commit()
203
+ context.session, id, **availability_zone_profile_dict)
204
+ context.session.commit()
201
205
  except Exception:
202
206
  with excutils.save_and_reraise_exception():
203
- lock_session.rollback()
207
+ context.session.rollback()
204
208
 
205
209
  # Force SQL alchemy to query the DB, otherwise we get inconsistent
206
210
  # results
207
211
  context.session.expire_all()
208
- db_availability_zone_profile = self._get_db_availability_zone_profile(
209
- context.session, id)
212
+ with context.session.begin():
213
+ db_availability_zone_profile = (
214
+ self._get_db_availability_zone_profile(context.session,
215
+ id))
210
216
  result = self._convert_db_to_type(
211
217
  db_availability_zone_profile,
212
218
  profile_types.AvailabilityZoneProfileResponse)
@@ -224,14 +230,18 @@ class AvailabilityZoneProfileController(base.BaseController):
224
230
  raise exceptions.NotFound(resource='Availability Zone Profile',
225
231
  id=constants.NIL_UUID)
226
232
  # Don't allow it to be deleted if it is in use by an availability zone
227
- if self.repositories.availability_zone.count(
228
- context.session,
229
- availability_zone_profile_id=availability_zone_profile_id) > 0:
230
- raise exceptions.ObjectInUse(object='Availability Zone Profile',
231
- id=availability_zone_profile_id)
232
- try:
233
- self.repositories.availability_zone_profile.delete(
234
- context.session, id=availability_zone_profile_id)
235
- except sa_exception.NoResultFound as e:
236
- raise exceptions.NotFound(resource='Availability Zone Profile',
237
- id=availability_zone_profile_id) from e
233
+ with context.session.begin():
234
+ if self.repositories.availability_zone.count(
235
+ context.session,
236
+ availability_zone_profile_id=availability_zone_profile_id
237
+ ) > 0:
238
+ raise exceptions.ObjectInUse(
239
+ object='Availability Zone Profile',
240
+ id=availability_zone_profile_id)
241
+ try:
242
+ self.repositories.availability_zone_profile.delete(
243
+ context.session, id=availability_zone_profile_id)
244
+ except sa_exception.NoResultFound as e:
245
+ raise exceptions.NotFound(
246
+ resource='Availability Zone Profile',
247
+ id=availability_zone_profile_id) from e
@@ -46,8 +46,9 @@ class AvailabilityZonesController(base.BaseController):
46
46
  if name == constants.NIL_UUID:
47
47
  raise exceptions.NotFound(resource='Availability Zone',
48
48
  id=constants.NIL_UUID)
49
- db_availability_zone = self._get_db_availability_zone(
50
- context.session, name)
49
+ with context.session.begin():
50
+ db_availability_zone = self._get_db_availability_zone(
51
+ context.session, name)
51
52
  result = self._convert_db_to_type(
52
53
  db_availability_zone,
53
54
  availability_zone_types.AvailabilityZoneResponse)
@@ -64,10 +65,12 @@ class AvailabilityZonesController(base.BaseController):
64
65
  context = pcontext.get('octavia_context')
65
66
  self._auth_validate_action(context, context.project_id,
66
67
  constants.RBAC_GET_ALL)
67
- db_availability_zones, links = (
68
- self.repositories.availability_zone.get_all(
69
- context.session,
70
- pagination_helper=pcontext.get(constants.PAGINATION_HELPER)))
68
+ with context.session.begin():
69
+ db_availability_zones, links = (
70
+ self.repositories.availability_zone.get_all(
71
+ context.session,
72
+ pagination_helper=pcontext.get(
73
+ constants.PAGINATION_HELPER)))
71
74
  result = self._convert_db_to_type(
72
75
  db_availability_zones,
73
76
  [availability_zone_types.AvailabilityZoneResponse])
@@ -86,20 +89,20 @@ class AvailabilityZonesController(base.BaseController):
86
89
  self._auth_validate_action(context, context.project_id,
87
90
  constants.RBAC_POST)
88
91
 
89
- lock_session = db_api.get_session(autocommit=False)
92
+ context.session.begin()
90
93
  try:
91
94
  availability_zone_dict = availability_zone.to_dict(
92
95
  render_unsets=True)
93
96
  db_availability_zone = self.repositories.availability_zone.create(
94
- lock_session, **availability_zone_dict)
95
- lock_session.commit()
97
+ context.session, **availability_zone_dict)
98
+ context.session.commit()
96
99
  except odb_exceptions.DBDuplicateEntry as e:
97
- lock_session.rollback()
100
+ context.session.rollback()
98
101
  raise exceptions.RecordAlreadyExists(
99
102
  field='availability zone', name=availability_zone.name) from e
100
103
  except Exception:
101
104
  with excutils.save_and_reraise_exception():
102
- lock_session.rollback()
105
+ context.session.rollback()
103
106
  result = self._convert_db_to_type(
104
107
  db_availability_zone,
105
108
  availability_zone_types.AvailabilityZoneResponse)
@@ -117,23 +120,24 @@ class AvailabilityZonesController(base.BaseController):
117
120
  if name == constants.NIL_UUID:
118
121
  raise exceptions.NotFound(resource='Availability Zone',
119
122
  id=constants.NIL_UUID)
120
- lock_session = db_api.get_session(autocommit=False)
123
+ context.session.begin()
121
124
  try:
122
125
  availability_zone_dict = availability_zone.to_dict(
123
126
  render_unsets=False)
124
127
  if availability_zone_dict:
125
128
  self.repositories.availability_zone.update(
126
- lock_session, name, **availability_zone_dict)
127
- lock_session.commit()
129
+ context.session, name, **availability_zone_dict)
130
+ context.session.commit()
128
131
  except Exception:
129
132
  with excutils.save_and_reraise_exception():
130
- lock_session.rollback()
133
+ context.session.rollback()
131
134
 
132
135
  # Force SQL alchemy to query the DB, otherwise we get inconsistent
133
136
  # results
134
137
  context.session.expire_all()
135
- db_availability_zone = self._get_db_availability_zone(
136
- context.session, name)
138
+ with context.session.begin():
139
+ db_availability_zone = self._get_db_availability_zone(
140
+ context.session, name)
137
141
  result = self._convert_db_to_type(
138
142
  db_availability_zone,
139
143
  availability_zone_types.AvailabilityZoneResponse)
@@ -151,7 +155,7 @@ class AvailabilityZonesController(base.BaseController):
151
155
  if availability_zone_name == constants.NIL_UUID:
152
156
  raise exceptions.NotFound(resource='Availability Zone',
153
157
  id=constants.NIL_UUID)
154
- serial_session = db_api.get_session(autocommit=False)
158
+ serial_session = db_api.get_session()
155
159
  serial_session.connection(
156
160
  execution_options={'isolation_level': 'SERIALIZABLE'})
157
161
  try: