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.
- octavia/amphorae/backends/agent/api_server/osutils.py +1 -0
- octavia/amphorae/backends/agent/api_server/plug.py +21 -7
- octavia/amphorae/backends/agent/api_server/templates/amphora-netns.systemd.j2 +2 -2
- octavia/amphorae/backends/agent/api_server/util.py +21 -0
- octavia/amphorae/backends/health_daemon/health_daemon.py +9 -3
- octavia/amphorae/backends/health_daemon/health_sender.py +2 -0
- octavia/amphorae/backends/utils/interface.py +14 -6
- octavia/amphorae/backends/utils/interface_file.py +6 -3
- octavia/amphorae/backends/utils/keepalivedlvs_query.py +8 -9
- octavia/amphorae/drivers/driver_base.py +1 -2
- octavia/amphorae/drivers/haproxy/rest_api_driver.py +11 -25
- octavia/amphorae/drivers/health/heartbeat_udp.py +34 -24
- octavia/amphorae/drivers/keepalived/jinja/jinja_cfg.py +3 -12
- octavia/amphorae/drivers/noop_driver/driver.py +3 -5
- octavia/api/common/pagination.py +4 -4
- octavia/api/drivers/amphora_driver/v2/driver.py +11 -5
- octavia/api/drivers/driver_agent/driver_get.py +22 -14
- octavia/api/drivers/driver_agent/driver_updater.py +8 -4
- octavia/api/drivers/utils.py +4 -2
- octavia/api/healthcheck/healthcheck_plugins.py +4 -2
- octavia/api/root_controller.py +4 -1
- octavia/api/v2/controllers/amphora.py +35 -38
- octavia/api/v2/controllers/availability_zone_profiles.py +43 -33
- octavia/api/v2/controllers/availability_zones.py +22 -18
- octavia/api/v2/controllers/flavor_profiles.py +37 -28
- octavia/api/v2/controllers/flavors.py +19 -15
- octavia/api/v2/controllers/health_monitor.py +44 -33
- octavia/api/v2/controllers/l7policy.py +52 -40
- octavia/api/v2/controllers/l7rule.py +68 -55
- octavia/api/v2/controllers/listener.py +88 -61
- octavia/api/v2/controllers/load_balancer.py +52 -34
- octavia/api/v2/controllers/member.py +63 -52
- octavia/api/v2/controllers/pool.py +55 -42
- octavia/api/v2/controllers/quotas.py +5 -3
- octavia/api/v2/types/listener.py +15 -0
- octavia/cmd/octavia_worker.py +0 -3
- octavia/cmd/status.py +1 -4
- octavia/common/clients.py +25 -45
- octavia/common/config.py +64 -22
- octavia/common/constants.py +3 -2
- octavia/common/data_models.py +7 -1
- octavia/common/jinja/haproxy/combined_listeners/jinja_cfg.py +12 -1
- octavia/common/jinja/haproxy/combined_listeners/templates/macros.j2 +5 -2
- octavia/common/jinja/lvs/jinja_cfg.py +4 -2
- octavia/common/keystone.py +58 -5
- octavia/common/validate.py +35 -0
- octavia/compute/drivers/noop_driver/driver.py +6 -0
- octavia/controller/healthmanager/health_manager.py +3 -6
- octavia/controller/housekeeping/house_keeping.py +36 -37
- octavia/controller/worker/amphora_rate_limit.py +5 -4
- octavia/controller/worker/task_utils.py +57 -41
- octavia/controller/worker/v2/controller_worker.py +160 -103
- octavia/controller/worker/v2/flows/listener_flows.py +3 -0
- octavia/controller/worker/v2/flows/load_balancer_flows.py +9 -14
- octavia/controller/worker/v2/tasks/amphora_driver_tasks.py +152 -91
- octavia/controller/worker/v2/tasks/compute_tasks.py +4 -2
- octavia/controller/worker/v2/tasks/database_tasks.py +542 -400
- octavia/controller/worker/v2/tasks/network_tasks.py +119 -79
- octavia/db/api.py +26 -23
- octavia/db/base_models.py +2 -2
- octavia/db/healthcheck.py +2 -1
- octavia/db/migration/alembic_migrations/versions/632152d2d32e_add_http_strict_transport_security_.py +42 -0
- octavia/db/models.py +12 -2
- octavia/db/prepare.py +2 -0
- octavia/db/repositories.py +462 -482
- octavia/hacking/checks.py +1 -1
- octavia/network/base.py +0 -14
- octavia/network/drivers/neutron/allowed_address_pairs.py +92 -135
- octavia/network/drivers/neutron/base.py +65 -77
- octavia/network/drivers/neutron/utils.py +69 -85
- octavia/network/drivers/noop_driver/driver.py +0 -7
- octavia/statistics/drivers/update_db.py +10 -10
- octavia/tests/common/constants.py +91 -84
- octavia/tests/common/sample_data_models.py +13 -1
- octavia/tests/fixtures.py +32 -0
- octavia/tests/functional/amphorae/backend/agent/api_server/test_server.py +9 -10
- octavia/tests/functional/api/drivers/driver_agent/test_driver_agent.py +260 -15
- octavia/tests/functional/api/test_root_controller.py +3 -28
- octavia/tests/functional/api/v2/base.py +5 -3
- octavia/tests/functional/api/v2/test_amphora.py +18 -5
- octavia/tests/functional/api/v2/test_availability_zone_profiles.py +1 -0
- octavia/tests/functional/api/v2/test_listener.py +51 -19
- octavia/tests/functional/api/v2/test_load_balancer.py +10 -1
- octavia/tests/functional/db/base.py +31 -16
- octavia/tests/functional/db/test_models.py +27 -28
- octavia/tests/functional/db/test_repositories.py +407 -50
- octavia/tests/unit/amphorae/backends/agent/api_server/test_amphora_info.py +2 -0
- octavia/tests/unit/amphorae/backends/agent/api_server/test_osutils.py +1 -1
- octavia/tests/unit/amphorae/backends/agent/api_server/test_plug.py +54 -6
- octavia/tests/unit/amphorae/backends/agent/api_server/test_util.py +35 -0
- octavia/tests/unit/amphorae/backends/health_daemon/test_health_daemon.py +8 -0
- octavia/tests/unit/amphorae/backends/health_daemon/test_health_sender.py +18 -0
- octavia/tests/unit/amphorae/backends/utils/test_interface.py +81 -0
- octavia/tests/unit/amphorae/backends/utils/test_interface_file.py +2 -0
- octavia/tests/unit/amphorae/backends/utils/test_keepalivedlvs_query.py +129 -5
- octavia/tests/unit/amphorae/drivers/haproxy/test_rest_api_driver_1_0.py +42 -20
- octavia/tests/unit/amphorae/drivers/health/test_heartbeat_udp.py +18 -20
- octavia/tests/unit/amphorae/drivers/keepalived/jinja/test_jinja_cfg.py +4 -4
- octavia/tests/unit/amphorae/drivers/noop_driver/test_driver.py +4 -1
- octavia/tests/unit/api/drivers/driver_agent/test_driver_get.py +3 -3
- octavia/tests/unit/api/drivers/driver_agent/test_driver_updater.py +11 -13
- octavia/tests/unit/base.py +6 -0
- octavia/tests/unit/cmd/test_interface.py +2 -2
- octavia/tests/unit/cmd/test_status.py +2 -2
- octavia/tests/unit/common/jinja/haproxy/combined_listeners/test_jinja_cfg.py +152 -1
- octavia/tests/unit/common/sample_configs/sample_configs_combined.py +10 -3
- octavia/tests/unit/common/test_clients.py +0 -39
- octavia/tests/unit/common/test_keystone.py +54 -0
- octavia/tests/unit/common/test_validate.py +67 -0
- octavia/tests/unit/controller/healthmanager/test_health_manager.py +8 -22
- octavia/tests/unit/controller/housekeeping/test_house_keeping.py +3 -64
- octavia/tests/unit/controller/worker/test_amphora_rate_limit.py +1 -1
- octavia/tests/unit/controller/worker/test_task_utils.py +44 -24
- octavia/tests/unit/controller/worker/v2/flows/test_load_balancer_flows.py +0 -1
- octavia/tests/unit/controller/worker/v2/tasks/test_amphora_driver_tasks.py +49 -26
- octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks.py +399 -196
- octavia/tests/unit/controller/worker/v2/tasks/test_database_tasks_quota.py +37 -64
- octavia/tests/unit/controller/worker/v2/tasks/test_network_tasks.py +3 -14
- octavia/tests/unit/controller/worker/v2/test_controller_worker.py +2 -2
- octavia/tests/unit/network/drivers/neutron/test_allowed_address_pairs.py +456 -561
- octavia/tests/unit/network/drivers/neutron/test_base.py +181 -194
- octavia/tests/unit/network/drivers/neutron/test_utils.py +14 -30
- octavia/tests/unit/statistics/drivers/test_update_db.py +7 -5
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/README.rst +1 -1
- {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/AUTHORS +4 -0
- {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/METADATA +4 -4
- {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/RECORD +141 -189
- {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/entry_points.txt +1 -2
- octavia-13.0.0.0rc1.dist-info/pbr.json +1 -0
- octavia/api/drivers/amphora_driver/v1/__init__.py +0 -11
- octavia/api/drivers/amphora_driver/v1/driver.py +0 -547
- octavia/controller/queue/v1/__init__.py +0 -11
- octavia/controller/queue/v1/consumer.py +0 -64
- octavia/controller/queue/v1/endpoints.py +0 -160
- octavia/controller/worker/v1/__init__.py +0 -11
- octavia/controller/worker/v1/controller_worker.py +0 -1157
- octavia/controller/worker/v1/flows/__init__.py +0 -11
- octavia/controller/worker/v1/flows/amphora_flows.py +0 -610
- octavia/controller/worker/v1/flows/health_monitor_flows.py +0 -105
- octavia/controller/worker/v1/flows/l7policy_flows.py +0 -94
- octavia/controller/worker/v1/flows/l7rule_flows.py +0 -100
- octavia/controller/worker/v1/flows/listener_flows.py +0 -128
- octavia/controller/worker/v1/flows/load_balancer_flows.py +0 -692
- octavia/controller/worker/v1/flows/member_flows.py +0 -230
- octavia/controller/worker/v1/flows/pool_flows.py +0 -127
- octavia/controller/worker/v1/tasks/__init__.py +0 -11
- octavia/controller/worker/v1/tasks/amphora_driver_tasks.py +0 -453
- octavia/controller/worker/v1/tasks/cert_task.py +0 -51
- octavia/controller/worker/v1/tasks/compute_tasks.py +0 -335
- octavia/controller/worker/v1/tasks/database_tasks.py +0 -2756
- octavia/controller/worker/v1/tasks/lifecycle_tasks.py +0 -173
- octavia/controller/worker/v1/tasks/model_tasks.py +0 -41
- octavia/controller/worker/v1/tasks/network_tasks.py +0 -970
- octavia/controller/worker/v1/tasks/retry_tasks.py +0 -74
- octavia/tests/unit/api/drivers/amphora_driver/v1/__init__.py +0 -11
- octavia/tests/unit/api/drivers/amphora_driver/v1/test_driver.py +0 -824
- octavia/tests/unit/controller/queue/v1/__init__.py +0 -11
- octavia/tests/unit/controller/queue/v1/test_consumer.py +0 -61
- octavia/tests/unit/controller/queue/v1/test_endpoints.py +0 -189
- octavia/tests/unit/controller/worker/v1/__init__.py +0 -11
- octavia/tests/unit/controller/worker/v1/flows/__init__.py +0 -11
- octavia/tests/unit/controller/worker/v1/flows/test_amphora_flows.py +0 -474
- octavia/tests/unit/controller/worker/v1/flows/test_health_monitor_flows.py +0 -72
- octavia/tests/unit/controller/worker/v1/flows/test_l7policy_flows.py +0 -67
- octavia/tests/unit/controller/worker/v1/flows/test_l7rule_flows.py +0 -67
- octavia/tests/unit/controller/worker/v1/flows/test_listener_flows.py +0 -91
- octavia/tests/unit/controller/worker/v1/flows/test_load_balancer_flows.py +0 -431
- octavia/tests/unit/controller/worker/v1/flows/test_member_flows.py +0 -106
- octavia/tests/unit/controller/worker/v1/flows/test_pool_flows.py +0 -77
- octavia/tests/unit/controller/worker/v1/tasks/__init__.py +0 -11
- octavia/tests/unit/controller/worker/v1/tasks/test_amphora_driver_tasks.py +0 -792
- octavia/tests/unit/controller/worker/v1/tasks/test_cert_task.py +0 -46
- octavia/tests/unit/controller/worker/v1/tasks/test_compute_tasks.py +0 -634
- octavia/tests/unit/controller/worker/v1/tasks/test_database_tasks.py +0 -2615
- octavia/tests/unit/controller/worker/v1/tasks/test_database_tasks_quota.py +0 -415
- octavia/tests/unit/controller/worker/v1/tasks/test_lifecycle_tasks.py +0 -401
- octavia/tests/unit/controller/worker/v1/tasks/test_model_tasks.py +0 -44
- octavia/tests/unit/controller/worker/v1/tasks/test_network_tasks.py +0 -1788
- octavia/tests/unit/controller/worker/v1/tasks/test_retry_tasks.py +0 -47
- octavia/tests/unit/controller/worker/v1/test_controller_worker.py +0 -2096
- octavia-12.0.0.0rc2.dist-info/pbr.json +0 -1
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/LICENSE +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/README.rst +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/diskimage-create.sh +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/image-tests.sh +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/requirements.txt +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/test-requirements.txt +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/tox.ini +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/data/share/octavia/diskimage-create/version.txt +0 -0
- {octavia-12.0.0.0rc2.data → octavia-13.0.0.0rc1.data}/scripts/octavia-wsgi +0 -0
- {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/LICENSE +0 -0
- {octavia-12.0.0.0rc2.dist-info → octavia-13.0.0.0rc1.dist-info}/WHEEL +0 -0
- {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.
|
281
|
-
|
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
|
-
|
292
|
-
|
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.
|
304
|
-
|
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.
|
315
|
-
|
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.
|
326
|
-
|
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.
|
337
|
-
|
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.
|
348
|
-
|
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
|
-
|
49
|
-
|
50
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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,
|
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
|
-
|
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
|
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':
|
1272
|
+
'loadbalancer_id': lb_id,
|
1263
1273
|
'allowed_cidrs': ['10.0.1.0/24']}
|
1264
|
-
|
1265
|
-
|
1266
|
-
|
1267
|
-
|
1268
|
-
|
1269
|
-
|
1270
|
-
|
1271
|
-
|
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']
|
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',
|