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
@@ -31,6 +31,9 @@ from octavia.tests.common import sample_certs
31
31
  from octavia.tests.common import sample_data_models
32
32
  from octavia.tests.functional.db import base
33
33
 
34
+ from oslo_log import log as logging
35
+ LOG = logging.getLogger(__name__)
36
+
34
37
  CONF = cfg.CONF
35
38
 
36
39
 
@@ -267,18 +270,252 @@ class DriverAgentTest(base.OctaviaDBTestBase):
267
270
  l7rule2_dict = copy.deepcopy(self.sample_data.test_l7rule2_dict)
268
271
  self.repos.l7rule.create(self.session, **l7rule2_dict)
269
272
 
273
+ self.session.commit()
274
+
270
275
  self.provider_lb_dict = copy.deepcopy(
271
276
  self.sample_data.provider_loadbalancer_tree_dict)
272
277
  self.provider_lb_dict[lib_consts.POOLS] = [self.provider_pool_dict]
273
278
  self.provider_lb_dict[
274
279
  lib_consts.LISTENERS] = [self.provider_listener_dict]
275
280
 
281
+ def _compare_load_balancer_dicts(self,
282
+ provider_lb_dict,
283
+ result_dict):
284
+ for key in (lib_consts.LOADBALANCER_ID,
285
+ lib_consts.NAME,
286
+ lib_consts.DESCRIPTION,
287
+ lib_consts.PROJECT_ID,
288
+ lib_consts.ADMIN_STATE_UP,
289
+ lib_consts.VIP_ADDRESS,
290
+ lib_consts.VIP_NETWORK_ID,
291
+ lib_consts.VIP_SUBNET_ID,
292
+ lib_consts.VIP_PORT_ID,
293
+ lib_consts.VIP_QOS_POLICY_ID,
294
+ lib_consts.FLAVOR,
295
+ lib_consts.AVAILABILITY_ZONE,
296
+ lib_consts.ADDITIONAL_VIPS):
297
+ self.assertEqual(provider_lb_dict.get(key),
298
+ result_dict.get(key))
299
+
300
+ provider_listener_dicts = provider_lb_dict[lib_consts.LISTENERS]
301
+ result_listener_dicts = result_dict[lib_consts.LISTENERS]
302
+
303
+ self.assertEqual(len(provider_listener_dicts),
304
+ len(result_listener_dicts))
305
+
306
+ for listener_dicts in zip(provider_listener_dicts,
307
+ result_listener_dicts):
308
+ provider_listener_dict = listener_dicts[0]
309
+ result_listener_dict = listener_dicts[1]
310
+ self._compare_listener_dicts(provider_listener_dict,
311
+ result_listener_dict)
312
+
313
+ self.assertEqual(len(provider_lb_dict[lib_consts.POOLS]),
314
+ len(result_dict[lib_consts.POOLS]))
315
+
316
+ for pool_dicts in zip(provider_lb_dict[lib_consts.POOLS],
317
+ result_dict[lib_consts.POOLS]):
318
+ provider_pool_dict = pool_dicts[0]
319
+ result_pool_dict = pool_dicts[1]
320
+ self._compare_pool_dicts(provider_pool_dict,
321
+ result_pool_dict)
322
+
323
+ def _compare_listener_dicts(self,
324
+ provider_listener_dict,
325
+ result_listener_dict):
326
+ for key in (lib_consts.LISTENER_ID,
327
+ lib_consts.LOADBALANCER_ID,
328
+ lib_consts.NAME,
329
+ lib_consts.DESCRIPTION,
330
+ lib_consts.PROJECT_ID,
331
+ lib_consts.ADMIN_STATE_UP,
332
+ lib_consts.PROTOCOL,
333
+ lib_consts.PROTOCOL_PORT,
334
+ lib_consts.CONNECTION_LIMIT,
335
+ lib_consts.DEFAULT_POOL_ID,
336
+ lib_consts.TIMEOUT_CLIENT_DATA,
337
+ lib_consts.TIMEOUT_MEMBER_CONNECT,
338
+ lib_consts.TIMEOUT_MEMBER_DATA,
339
+ lib_consts.TIMEOUT_TCP_INSPECT,
340
+ lib_consts.INSERT_HEADERS,
341
+ lib_consts.ALLOWED_CIDRS,
342
+ lib_consts.DEFAULT_TLS_CONTAINER_REF,
343
+ lib_consts.DEFAULT_TLS_CONTAINER_DATA,
344
+ lib_consts.SNI_CONTAINER_REFS,
345
+ lib_consts.SNI_CONTAINER_DATA,
346
+ lib_consts.CLIENT_CA_TLS_CONTAINER_REF,
347
+ lib_consts.CLIENT_CA_TLS_CONTAINER_DATA,
348
+ lib_consts.CLIENT_AUTHENTICATION,
349
+ lib_consts.CLIENT_CRL_CONTAINER_REF,
350
+ lib_consts.CLIENT_CRL_CONTAINER_DATA,
351
+ lib_consts.TLS_CIPHERS,
352
+ lib_consts.TLS_VERSIONS):
353
+ self.assertEqual(provider_listener_dict.get(key),
354
+ result_listener_dict.get(key))
355
+
356
+ provider_l7policy_dicts = provider_listener_dict.get(
357
+ lib_consts.L7POLICIES)
358
+ result_l7policy_dicts = result_listener_dict.get(
359
+ lib_consts.L7POLICIES)
360
+
361
+ self.assertEqual(len(provider_l7policy_dicts),
362
+ len(result_l7policy_dicts))
363
+
364
+ for l7policy_dicts in zip(provider_l7policy_dicts,
365
+ result_l7policy_dicts):
366
+ provider_l7policy_dict = l7policy_dicts[0]
367
+ result_l7policy_dict = l7policy_dicts[1]
368
+ self._compare_l7policy_dicts(provider_l7policy_dict,
369
+ result_l7policy_dict)
370
+
371
+ def _compare_l7policy_dicts(self,
372
+ provider_l7policy_dict,
373
+ result_l7policy_dict):
374
+ for key in (lib_consts.L7POLICY_ID,
375
+ lib_consts.LISTENER_ID,
376
+ lib_consts.NAME,
377
+ lib_consts.DESCRIPTION,
378
+ lib_consts.PROJECT_ID,
379
+ lib_consts.ADMIN_STATE_UP,
380
+ lib_consts.ACTION,
381
+ lib_consts.POSITION,
382
+ lib_consts.REDIRECT_POOL_ID,
383
+ lib_consts.REDIRECT_URL,
384
+ lib_consts.REDIRECT_PREFIX,
385
+ lib_consts.REDIRECT_HTTP_CODE):
386
+ self.assertEqual(provider_l7policy_dict.get(key),
387
+ result_l7policy_dict.get(key))
388
+
389
+ provider_l7rule_dicts = provider_l7policy_dict.get(lib_consts.L7RULES)
390
+ result_l7rule_dicts = result_l7policy_dict.get(lib_consts.L7RULES)
391
+
392
+ if provider_l7rule_dicts or result_l7rule_dicts:
393
+ self.assertIsNotNone(provider_l7rule_dicts)
394
+ self.assertIsNotNone(result_l7rule_dicts)
395
+
396
+ self.assertEqual(len(provider_l7rule_dicts),
397
+ len(result_l7rule_dicts))
398
+
399
+ for l7rule_dicts in zip(provider_l7rule_dicts,
400
+ result_l7rule_dicts):
401
+ provider_l7rule_dict = l7rule_dicts[0]
402
+ result_l7rule_dict = l7rule_dicts[1]
403
+ self._compare_l7rule_dicts(provider_l7rule_dict,
404
+ result_l7rule_dict)
405
+
406
+ def _compare_l7rule_dicts(self,
407
+ provider_l7rule_dict,
408
+ result_l7rule_dict):
409
+ for key in (lib_consts.L7RULE_ID,
410
+ lib_consts.L7POLICY_ID,
411
+ lib_consts.LISTENER_ID,
412
+ lib_consts.NAME,
413
+ lib_consts.DESCRIPTION,
414
+ lib_consts.PROJECT_ID,
415
+ lib_consts.ADMIN_STATE_UP,
416
+ lib_consts.TYPE,
417
+ lib_consts.COMPARE_TYPE,
418
+ lib_consts.KEY,
419
+ lib_consts.VALUE,
420
+ lib_consts.INVERT):
421
+ self.assertEqual(provider_l7rule_dict.get(key),
422
+ result_l7rule_dict.get(key))
423
+
424
+ def _compare_pool_dicts(self,
425
+ provider_pool_dict,
426
+ result_pool_dict):
427
+ for key in (lib_consts.POOL_ID,
428
+ lib_consts.NAME,
429
+ lib_consts.DESCRIPTION,
430
+ lib_consts.PROJECT_ID,
431
+ lib_consts.ADMIN_STATE_UP,
432
+ lib_consts.LB_ALGORITHM,
433
+ lib_consts.LOADBALANCER_ID,
434
+ lib_consts.PROTOCOL,
435
+ lib_consts.SESSION_PERSISTENCE,
436
+ lib_consts.TLS_ENABLED,
437
+ lib_consts.TLS_CONTAINER_REF,
438
+ lib_consts.TLS_CONTAINER_DATA,
439
+ lib_consts.CA_TLS_CONTAINER_REF,
440
+ lib_consts.CA_TLS_CONTAINER_DATA,
441
+ lib_consts.CRL_CONTAINER_REF,
442
+ lib_consts.CRL_CONTAINER_DATA,
443
+ lib_consts.TLS_CIPHERS,
444
+ lib_consts.TLS_VERSIONS,
445
+ lib_consts.ALPN_PROTOCOLS):
446
+ self.assertEqual(provider_pool_dict.get(key),
447
+ result_pool_dict.get(key))
448
+
449
+ provider_hm_dict = provider_pool_dict.get(
450
+ lib_consts.HEALTHMONITOR)
451
+ result_hm_dict = result_pool_dict.get(
452
+ lib_consts.HEALTHMONITOR)
453
+ if provider_hm_dict or result_hm_dict:
454
+ self._compare_hm_dicts(provider_hm_dict,
455
+ result_hm_dict)
456
+
457
+ provider_member_dicts = provider_pool_dict.get(
458
+ lib_consts.MEMBERS)
459
+ result_member_dicts = result_pool_dict.get(
460
+ lib_consts.MEMBERS)
461
+ self.assertEqual(len(provider_member_dicts),
462
+ len(result_member_dicts))
463
+
464
+ for member_dicts in zip(provider_member_dicts,
465
+ result_member_dicts):
466
+ provider_member_dict = member_dicts[0]
467
+ result_member_dict = member_dicts[1]
468
+ self._compare_member_dicts(provider_member_dict,
469
+ result_member_dict)
470
+
471
+ def _compare_hm_dicts(self,
472
+ provider_hm_dict,
473
+ result_hm_dict):
474
+ for key in (lib_consts.HEALTHMONITOR_ID,
475
+ lib_consts.POOL_ID,
476
+ lib_consts.NAME,
477
+ lib_consts.DESCRIPTION,
478
+ lib_consts.PROJECT_ID,
479
+ lib_consts.ADMIN_STATE_UP,
480
+ lib_consts.TYPE,
481
+ lib_consts.DELAY,
482
+ lib_consts.TIMEOUT,
483
+ lib_consts.MAX_RETRIES,
484
+ lib_consts.MAX_RETRIES_DOWN,
485
+ lib_consts.DOMAIN_NAME,
486
+ lib_consts.EXPECTED_CODES,
487
+ lib_consts.HTTP_METHOD,
488
+ lib_consts.HTTP_VERSION,
489
+ lib_consts.URL_PATH):
490
+ self.assertEqual(provider_hm_dict.get(key),
491
+ result_hm_dict.get(key))
492
+
493
+ def _compare_member_dicts(self,
494
+ provider_member_dict,
495
+ result_member_dict):
496
+ for key in (lib_consts.MEMBER_ID,
497
+ lib_consts.POOL_ID,
498
+ lib_consts.NAME,
499
+ lib_consts.DESCRIPTION,
500
+ lib_consts.PROJECT_ID,
501
+ lib_consts.ADMIN_STATE_UP,
502
+ lib_consts.ADDRESS,
503
+ lib_consts.PROTOCOL_PORT,
504
+ lib_consts.MONITOR_ADDRESS,
505
+ lib_consts.MONITOR_PORT,
506
+ lib_consts.SUBNET_ID,
507
+ lib_consts.WEIGHT,
508
+ lib_consts.BACKUP):
509
+ self.assertEqual(provider_member_dict.get(key),
510
+ result_member_dict.get(key))
511
+
276
512
  @mock.patch('octavia_lib.api.drivers.driver_lib.SOCKET_TIMEOUT', 30)
277
513
  def test_get_loadbalancer(self):
278
514
  result = self.driver_lib.get_loadbalancer(self.sample_data.lb_id)
515
+ result_dict = result.to_dict(render_unsets=True, recurse=True)
279
516
 
280
- self.assertEqual(self.provider_lb_dict,
281
- result.to_dict(render_unsets=True, recurse=True))
517
+ self._compare_load_balancer_dicts(self.provider_lb_dict,
518
+ result_dict)
282
519
 
283
520
  # Test non-existent load balancer
284
521
  result = self.driver_lib.get_loadbalancer('bogus')
@@ -287,10 +524,10 @@ class DriverAgentTest(base.OctaviaDBTestBase):
287
524
  @mock.patch('octavia_lib.api.drivers.driver_lib.SOCKET_TIMEOUT', 30)
288
525
  def test_get_listener(self):
289
526
  result = self.driver_lib.get_listener(self.sample_data.listener1_id)
527
+ result_dict = result.to_dict(render_unsets=True, recurse=True)
290
528
 
291
- # We need to recurse here to pick up the SNI data
292
- self.assertEqual(self.provider_listener_dict,
293
- result.to_dict(render_unsets=True, recurse=True))
529
+ self._compare_listener_dicts(self.provider_listener_dict,
530
+ result_dict)
294
531
 
295
532
  # Test non-existent listener
296
533
  result = self.driver_lib.get_listener('bogus')
@@ -299,9 +536,10 @@ class DriverAgentTest(base.OctaviaDBTestBase):
299
536
  @mock.patch('octavia_lib.api.drivers.driver_lib.SOCKET_TIMEOUT', 30)
300
537
  def test_get_pool(self):
301
538
  result = self.driver_lib.get_pool(self.sample_data.pool1_id)
539
+ result_dict = result.to_dict(render_unsets=True, recurse=True)
302
540
 
303
- self.assertEqual(self.provider_pool_dict,
304
- result.to_dict(render_unsets=True, recurse=True))
541
+ self._compare_pool_dicts(self.provider_pool_dict,
542
+ result_dict)
305
543
 
306
544
  # Test non-existent pool
307
545
  result = self.driver_lib.get_pool('bogus')
@@ -310,9 +548,10 @@ class DriverAgentTest(base.OctaviaDBTestBase):
310
548
  @mock.patch('octavia_lib.api.drivers.driver_lib.SOCKET_TIMEOUT', 30)
311
549
  def test_get_member(self):
312
550
  result = self.driver_lib.get_member(self.sample_data.member1_id)
551
+ result_dict = result.to_dict(render_unsets=True)
313
552
 
314
- self.assertEqual(self.sample_data.provider_member1_dict,
315
- result.to_dict(render_unsets=True))
553
+ self._compare_member_dicts(self.sample_data.provider_member1_dict,
554
+ result_dict)
316
555
 
317
556
  # Test non-existent member
318
557
  result = self.driver_lib.get_member('bogus')
@@ -321,9 +560,10 @@ class DriverAgentTest(base.OctaviaDBTestBase):
321
560
  @mock.patch('octavia_lib.api.drivers.driver_lib.SOCKET_TIMEOUT', 30)
322
561
  def test_get_healthmonitor(self):
323
562
  result = self.driver_lib.get_healthmonitor(self.sample_data.hm1_id)
563
+ result_dict = result.to_dict(render_unsets=True)
324
564
 
325
- self.assertEqual(self.sample_data.provider_hm1_dict,
326
- result.to_dict(render_unsets=True))
565
+ self._compare_hm_dicts(self.sample_data.provider_hm1_dict,
566
+ result_dict)
327
567
 
328
568
  # Test non-existent health monitor
329
569
  result = self.driver_lib.get_healthmonitor('bogus')
@@ -332,9 +572,11 @@ class DriverAgentTest(base.OctaviaDBTestBase):
332
572
  @mock.patch('octavia_lib.api.drivers.driver_lib.SOCKET_TIMEOUT', 30)
333
573
  def test_get_l7policy(self):
334
574
  result = self.driver_lib.get_l7policy(self.sample_data.l7policy1_id)
575
+ result_dict = result.to_dict(render_unsets=True, recurse=True)
335
576
 
336
- self.assertEqual(self.sample_data.provider_l7policy1_dict,
337
- result.to_dict(render_unsets=True, recurse=True))
577
+ self._compare_l7policy_dicts(
578
+ self.sample_data.provider_l7policy1_dict,
579
+ result_dict)
338
580
 
339
581
  # Test non-existent L7 policy
340
582
  result = self.driver_lib.get_l7policy('bogus')
@@ -343,9 +585,11 @@ class DriverAgentTest(base.OctaviaDBTestBase):
343
585
  @mock.patch('octavia_lib.api.drivers.driver_lib.SOCKET_TIMEOUT', 30)
344
586
  def test_get_l7rule(self):
345
587
  result = self.driver_lib.get_l7rule(self.sample_data.l7rule1_id)
588
+ result_dict = result.to_dict(render_unsets=True)
346
589
 
347
- self.assertEqual(self.sample_data.provider_l7rule1_dict,
348
- result.to_dict(render_unsets=True))
590
+ self._compare_l7rule_dicts(
591
+ self.sample_data.provider_l7rule1_dict,
592
+ result_dict)
349
593
 
350
594
  # Test non-existent L7 rule
351
595
  result = self.driver_lib.get_l7rule('bogus')
@@ -355,6 +599,7 @@ class DriverAgentTest(base.OctaviaDBTestBase):
355
599
  # Add a new member
356
600
  member_dict = copy.deepcopy(self.sample_data.test_member2_dict)
357
601
  self.repos.member.create(self.session, **member_dict)
602
+ self.session.commit()
358
603
 
359
604
  result = self.driver_lib.get_member(member_dict[lib_consts.ID])
360
605
  self.assertEqual(self.sample_data.provider_member2_dict,
@@ -45,34 +45,9 @@ class TestRootController(base_db_test.OctaviaDBTestBase):
45
45
  def test_api_versions(self):
46
46
  versions = self._get_versions_with_config()
47
47
  version_ids = tuple(v.get('id') for v in versions)
48
- self.assertEqual(27, len(version_ids))
49
- self.assertIn('v2.0', version_ids)
50
- self.assertIn('v2.1', version_ids)
51
- self.assertIn('v2.2', version_ids)
52
- self.assertIn('v2.3', version_ids)
53
- self.assertIn('v2.4', version_ids)
54
- self.assertIn('v2.5', version_ids)
55
- self.assertIn('v2.6', version_ids)
56
- self.assertIn('v2.7', version_ids)
57
- self.assertIn('v2.8', version_ids)
58
- self.assertIn('v2.9', version_ids)
59
- self.assertIn('v2.10', version_ids)
60
- self.assertIn('v2.11', version_ids)
61
- self.assertIn('v2.12', version_ids)
62
- self.assertIn('v2.13', version_ids)
63
- self.assertIn('v2.14', version_ids)
64
- self.assertIn('v2.15', version_ids)
65
- self.assertIn('v2.16', version_ids)
66
- self.assertIn('v2.17', version_ids)
67
- self.assertIn('v2.18', version_ids)
68
- self.assertIn('v2.19', version_ids)
69
- self.assertIn('v2.20', version_ids)
70
- self.assertIn('v2.21', version_ids)
71
- self.assertIn('v2.22', version_ids)
72
- self.assertIn('v2.23', version_ids)
73
- self.assertIn('v2.24', version_ids)
74
- self.assertIn('v2.25', version_ids)
75
- self.assertIn('v2.26', version_ids)
48
+ expected_versions = (f"v2.{i}" for i in range(28))
49
+ for version in expected_versions:
50
+ self.assertIn(version, version_ids)
76
51
 
77
52
  # Each version should have a 'self' 'href' to the API version URL
78
53
  # [{u'rel': u'self', u'href': u'http://localhost/v2'}]
@@ -269,7 +269,7 @@ class BaseAPITest(base_db_test.OctaviaDBTestBase):
269
269
 
270
270
  def create_listener_stats(self, listener_id, amphora_id):
271
271
  db_ls = self.listener_stats_repo.create(
272
- db_api.get_session(), listener_id=listener_id,
272
+ self.session, listener_id=listener_id,
273
273
  amphora_id=amphora_id, bytes_in=0,
274
274
  bytes_out=0, active_connections=0, total_connections=0,
275
275
  request_errors=0)
@@ -280,7 +280,7 @@ class BaseAPITest(base_db_test.OctaviaDBTestBase):
280
280
  active_connections=0,
281
281
  total_connections=0, request_errors=0):
282
282
  db_ls = self.listener_stats_repo.create(
283
- db_api.get_session(), listener_id=listener_id,
283
+ self.session, listener_id=listener_id,
284
284
  amphora_id=amphora_id, bytes_in=bytes_in,
285
285
  bytes_out=bytes_out, active_connections=active_connections,
286
286
  total_connections=total_connections, request_errors=request_errors)
@@ -478,9 +478,11 @@ class BaseAPITest(base_db_test.OctaviaDBTestBase):
478
478
  @staticmethod
479
479
  def set_object_status(repo, id_, provisioning_status=constants.ACTIVE,
480
480
  operating_status=constants.ONLINE):
481
- repo.update(db_api.get_session(), id_,
481
+ session = db_api.get_session()
482
+ repo.update(session, id_,
482
483
  provisioning_status=provisioning_status,
483
484
  operating_status=operating_status)
485
+ session.commit()
484
486
 
485
487
  def assert_final_listener_statuses(self, lb_id, listener_id, delete=False):
486
488
  expected_prov_status = constants.ACTIVE
@@ -40,6 +40,7 @@ class TestAmphora(base.BaseAPITest):
40
40
  self.project_id = self.lb.get('project_id')
41
41
  self.set_lb_status(self.lb_id)
42
42
  self.amp_args = {
43
+ 'id': uuidutils.generate_uuid(),
43
44
  'load_balancer_id': self.lb_id,
44
45
  'compute_id': uuidutils.generate_uuid(),
45
46
  'lb_network_ip': '192.168.1.2',
@@ -91,9 +92,11 @@ class TestAmphora(base.BaseAPITest):
91
92
  'total_connections': 9}
92
93
  self.ref_amp_stats = [self.listener1_amp_stats,
93
94
  self.listener2_amp_stats]
95
+ self.session.commit()
94
96
 
95
97
  def _create_additional_amp(self):
96
98
  amp_args = {
99
+ 'id': uuidutils.generate_uuid(),
97
100
  'load_balancer_id': None,
98
101
  'compute_id': uuidutils.generate_uuid(),
99
102
  'lb_network_ip': '192.168.1.2',
@@ -109,7 +112,8 @@ class TestAmphora(base.BaseAPITest):
109
112
  'vrrp_id': 1,
110
113
  'vrrp_priority': 100,
111
114
  }
112
- return self.amphora_repo.create(self.session, **amp_args)
115
+ with self.session.begin():
116
+ return self.amphora_repo.create(self.session, **amp_args)
113
117
 
114
118
  def _assert_amp_equal(self, source, response):
115
119
  self.assertEqual(source.pop('load_balancer_id'),
@@ -130,9 +134,11 @@ class TestAmphora(base.BaseAPITest):
130
134
  @mock.patch('oslo_messaging.RPCClient.cast')
131
135
  def test_delete(self, mock_cast):
132
136
  self.amp_args = {
137
+ 'id': uuidutils.generate_uuid(),
133
138
  'status': constants.AMPHORA_READY,
134
139
  }
135
- amp = self.amphora_repo.create(self.session, **self.amp_args)
140
+ with self.session.begin():
141
+ amp = self.amphora_repo.create(self.session, **self.amp_args)
136
142
 
137
143
  self.delete(self.AMPHORA_PATH.format(
138
144
  amphora_id=amp.id), status=204)
@@ -154,9 +160,11 @@ class TestAmphora(base.BaseAPITest):
154
160
  @mock.patch('oslo_messaging.RPCClient.cast')
155
161
  def test_delete_immutable(self, mock_cast):
156
162
  self.amp_args = {
163
+ 'id': uuidutils.generate_uuid(),
157
164
  'status': constants.AMPHORA_ALLOCATED,
158
165
  }
159
- amp = self.amphora_repo.create(self.session, **self.amp_args)
166
+ with self.session.begin():
167
+ amp = self.amphora_repo.create(self.session, **self.amp_args)
160
168
 
161
169
  self.delete(self.AMPHORA_PATH.format(
162
170
  amphora_id=amp.id), status=409)
@@ -166,9 +174,11 @@ class TestAmphora(base.BaseAPITest):
166
174
  @mock.patch('oslo_messaging.RPCClient.cast')
167
175
  def test_delete_authorized(self, mock_cast):
168
176
  self.amp_args = {
177
+ 'id': uuidutils.generate_uuid(),
169
178
  'status': constants.AMPHORA_READY,
170
179
  }
171
- amp = self.amphora_repo.create(self.session, **self.amp_args)
180
+ with self.session.begin():
181
+ amp = self.amphora_repo.create(self.session, **self.amp_args)
172
182
 
173
183
  self.conf = self.useFixture(oslo_fixture.Config(cfg.CONF))
174
184
  auth_strategy = self.conf.conf.api_settings.get('auth_strategy')
@@ -208,9 +218,11 @@ class TestAmphora(base.BaseAPITest):
208
218
  @mock.patch('oslo_messaging.RPCClient.cast')
209
219
  def test_delete_not_authorized(self, mock_cast):
210
220
  self.amp_args = {
221
+ 'id': uuidutils.generate_uuid(),
211
222
  'status': constants.AMPHORA_READY,
212
223
  }
213
- amp = self.amphora_repo.create(self.session, **self.amp_args)
224
+ with self.session.begin():
225
+ amp = self.amphora_repo.create(self.session, **self.amp_args)
214
226
 
215
227
  self.conf = self.useFixture(oslo_fixture.Config(cfg.CONF))
216
228
  auth_strategy = self.conf.conf.api_settings.get('auth_strategy')
@@ -567,6 +579,7 @@ class TestAmphora(base.BaseAPITest):
567
579
  self.lb2_id = self.lb2.get('id')
568
580
  self.set_lb_status(self.lb2_id)
569
581
  self.amp2_args = {
582
+ 'id': uuidutils.generate_uuid(),
570
583
  'load_balancer_id': self.lb2_id,
571
584
  'compute_id': uuidutils.generate_uuid(),
572
585
  'lb_network_ip': '192.168.1.20',
@@ -531,6 +531,7 @@ class TestAvailabilityZoneProfiles(base.BaseAPITest):
531
531
  def test_delete_authorized(self):
532
532
  azp = self.create_availability_zone_profile(
533
533
  'test1', 'noop_driver', '{"compute_zone": "my_az_1"}')
534
+ self.session.commit()
534
535
  self.assertTrue(uuidutils.is_uuid_like(azp.get('id')))
535
536
  self.conf = self.useFixture(oslo_fixture.Config(cfg.CONF))
536
537
  auth_strategy = self.conf.conf.api_settings.get('auth_strategy')
@@ -1207,9 +1207,9 @@ class TestListener(base.BaseAPITest):
1207
1207
  "It must be a valid x509 PEM format certificate.",
1208
1208
  response['faultstring'])
1209
1209
 
1210
- def _test_create_with_allowed_cidrs(self, allowed_cidrs):
1210
+ def _test_create_with_allowed_cidrs(self, allowed_cidrs, lb_id):
1211
1211
  listener = self.create_listener(constants.PROTOCOL_TCP,
1212
- 80, self.lb_id,
1212
+ 80, lb_id,
1213
1213
  allowed_cidrs=allowed_cidrs)
1214
1214
  listener_path = self.LISTENER_PATH.format(
1215
1215
  listener_id=listener['listener']['id'])
@@ -1218,14 +1218,17 @@ class TestListener(base.BaseAPITest):
1218
1218
 
1219
1219
  def test_create_with_allowed_cidrs_ipv4(self):
1220
1220
  allowed_cidrs = ['10.0.1.0/24', '172.16.55.0/25']
1221
- self._test_create_with_allowed_cidrs(allowed_cidrs)
1221
+ self._test_create_with_allowed_cidrs(allowed_cidrs, self.lb_id)
1222
1222
 
1223
1223
  def test_create_with_allowed_cidrs_ipv6(self):
1224
+ lb_ipv6 = self.create_load_balancer(
1225
+ uuidutils.generate_uuid(),
1226
+ vip_address='2001:db9:a1b:13f0::1',
1227
+ )
1228
+ lb_id = lb_ipv6.get('loadbalancer').get('id')
1229
+ self.set_lb_status(lb_id)
1224
1230
  allowed_cidrs = ['2001:db8:a0b:12f0::/64', '2a02:8071:69e::/64']
1225
- with mock.patch('octavia.db.repositories.VipRepository.'
1226
- 'get') as repo_mock:
1227
- repo_mock.return_value.ip_address = "2001:db9:a1b:13f0::1"
1228
- self._test_create_with_allowed_cidrs(allowed_cidrs)
1231
+ self._test_create_with_allowed_cidrs(allowed_cidrs, lb_id)
1229
1232
 
1230
1233
  def test_create_with_bad_allowed_cidrs(self):
1231
1234
  allowed_cidrs = [u'10.0.1.0/33', u'172.16.55.1.0/25']
@@ -1251,24 +1254,42 @@ class TestListener(base.BaseAPITest):
1251
1254
  body = self._build_body(lb_listener)
1252
1255
  response = self.post(self.LISTENERS_PATH, body, status=400).json
1253
1256
  self.assertIn("Validation failure: CIDR 2001:db8:a0b:12f0::/64 IP "
1254
- "version incompatible with VIP 198.0.2.5 IP version.",
1257
+ "version incompatible with all VIPs ['198.0.2.5'] IP "
1258
+ "version.",
1255
1259
  response['faultstring'])
1256
1260
 
1257
1261
  def test_create_with_incompatible_allowed_cidrs_ipv4(self):
1262
+ lb_ipv6 = self.create_load_balancer(
1263
+ uuidutils.generate_uuid(),
1264
+ vip_address='2001:db9:a1b:13f0::1',
1265
+ )
1266
+ lb_id = lb_ipv6.get('loadbalancer').get('id')
1267
+ self.set_lb_status(lb_id)
1258
1268
  lb_listener = {
1259
1269
  'protocol': constants.PROTOCOL_TCP,
1260
1270
  'protocol_port': 80,
1261
1271
  'project_id': self.project_id,
1262
- 'loadbalancer_id': self.lb_id,
1272
+ 'loadbalancer_id': lb_id,
1263
1273
  'allowed_cidrs': ['10.0.1.0/24']}
1264
- with mock.patch('octavia.db.repositories.VipRepository.'
1265
- 'get') as repo_mock:
1266
- repo_mock.return_value.ip_address = "2001:db9:a1b:13f0::1"
1267
- body = self._build_body(lb_listener)
1268
- response = self.post(self.LISTENERS_PATH, body, status=400).json
1269
- self.assertIn("Validation failure: CIDR 10.0.1.0/24 IP version "
1270
- "incompatible with VIP 2001:db9:a1b:13f0::1 IP "
1271
- "version.", response['faultstring'])
1274
+ body = self._build_body(lb_listener)
1275
+ response = self.post(self.LISTENERS_PATH, body, status=400).json
1276
+ self.assertIn("Validation failure: CIDR 10.0.1.0/24 IP version "
1277
+ "incompatible with all VIPs "
1278
+ "['2001:db9:a1b:13f0::1'] IP version.",
1279
+ response['faultstring'])
1280
+
1281
+ def test_create_with_mixed_version_allowed_cidrs(self):
1282
+ lb_dualstack = self.create_load_balancer(
1283
+ uuidutils.generate_uuid(),
1284
+ additional_vips=[{'subnet_id': uuidutils.generate_uuid(),
1285
+ 'ip_address': '2001:db9:a1b:13f0::1',
1286
+ }],
1287
+ )
1288
+ lb_id = lb_dualstack.get('loadbalancer').get('id')
1289
+ self.set_lb_status(lb_id)
1290
+ self._test_create_with_allowed_cidrs(['10.0.1.0/24',
1291
+ '2001:db9:a1b:13f0::/64'],
1292
+ lb_id)
1272
1293
 
1273
1294
  def test_create_with_duplicated_allowed_cidrs(self):
1274
1295
  allowed_cidrs = ['10.0.1.0/24', '10.0.2.0/24', '10.0.2.0/24']
@@ -1873,7 +1894,10 @@ class TestListener(base.BaseAPITest):
1873
1894
  client_ca_tls_container_ref=ca_tls_uuid,
1874
1895
  tls_versions=[lib_consts.TLS_VERSION_1_3],
1875
1896
  tls_ciphers='TLS_AES_256_GCM_SHA384',
1876
- alpn_protocols=['http/1.0']).get(self.root_tag)
1897
+ alpn_protocols=['http/1.0'],
1898
+ hsts_max_age=20, hsts_include_subdomains=True,
1899
+ hsts_preload=True,
1900
+ ).get(self.root_tag)
1877
1901
  self.set_lb_status(self.lb_id)
1878
1902
  unset_params = {
1879
1903
  'name': None, 'description': None, 'connection_limit': None,
@@ -1883,7 +1907,10 @@ class TestListener(base.BaseAPITest):
1883
1907
  'timeout_tcp_inspect': None, 'client_ca_tls_container_ref': None,
1884
1908
  'client_authentication': None, 'default_pool_id': None,
1885
1909
  'client_crl_container_ref': None, 'tls_versions': None,
1886
- 'tls_ciphers': None, 'alpn_protocols': None}
1910
+ 'tls_ciphers': None, 'alpn_protocols': None,
1911
+ 'hsts_max_age': None, 'hsts_include_subdomains': None,
1912
+ 'hsts_preload': None,
1913
+ }
1887
1914
  body = self._build_body(unset_params)
1888
1915
  listener_path = self.LISTENER_PATH.format(
1889
1916
  listener_id=listener['id'])
@@ -1910,6 +1937,9 @@ class TestListener(base.BaseAPITest):
1910
1937
  self.assertEqual(constants.CIPHERS_OWASP_SUITE_B,
1911
1938
  api_listener['tls_ciphers'])
1912
1939
  self.assertEqual(['http/1.1'], api_listener['alpn_protocols'])
1940
+ self.assertIsNone(api_listener['hsts_max_age'])
1941
+ self.assertFalse(api_listener['hsts_include_subdomains'])
1942
+ self.assertFalse(api_listener['hsts_preload'])
1913
1943
 
1914
1944
  @mock.patch('octavia.common.tls_utils.cert_parser.load_certificates_data')
1915
1945
  def test_update_with_bad_ca_cert(self, mock_cert_data):
@@ -2811,6 +2841,7 @@ class TestListener(base.BaseAPITest):
2811
2841
  bytes_out=random.randint(1, 9),
2812
2842
  total_connections=random.randint(1, 9),
2813
2843
  request_errors=random.randint(1, 9))
2844
+ self.session.commit()
2814
2845
 
2815
2846
  response = self._getStats(li['id'])
2816
2847
  self.assertEqual(ls['bytes_in'], response['bytes_in'])
@@ -2841,6 +2872,7 @@ class TestListener(base.BaseAPITest):
2841
2872
  self.conf = self.useFixture(oslo_fixture.Config(cfg.CONF))
2842
2873
  auth_strategy = self.conf.conf.api_settings.get('auth_strategy')
2843
2874
  self.conf.config(group='api_settings', auth_strategy=constants.TESTING)
2875
+ self.session.commit()
2844
2876
 
2845
2877
  with mock.patch.object(octavia.common.context.RequestContext,
2846
2878
  'project_id',