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
@@ -13,7 +13,6 @@ from unittest import mock
|
|
13
13
|
|
14
14
|
import cinderclient.v3
|
15
15
|
import glanceclient.v2
|
16
|
-
import neutronclient.v2_0
|
17
16
|
import novaclient.v2
|
18
17
|
from oslo_config import cfg
|
19
18
|
|
@@ -62,44 +61,6 @@ class TestNovaAuth(base.TestCase):
|
|
62
61
|
self.assertIs(bc1, bc2)
|
63
62
|
|
64
63
|
|
65
|
-
class TestNeutronAuth(base.TestCase):
|
66
|
-
|
67
|
-
def setUp(self):
|
68
|
-
# Reset the session and client
|
69
|
-
clients.NeutronAuth.neutron_client = None
|
70
|
-
keystone._SESSION = None
|
71
|
-
|
72
|
-
super().setUp()
|
73
|
-
|
74
|
-
@mock.patch('keystoneauth1.session.Session', mock.Mock())
|
75
|
-
def test_get_neutron_client(self):
|
76
|
-
# There should be no existing client
|
77
|
-
self.assertIsNone(
|
78
|
-
clients.NeutronAuth.neutron_client
|
79
|
-
)
|
80
|
-
|
81
|
-
# Mock out the keystone session and get the client
|
82
|
-
keystone._SESSION = mock.MagicMock()
|
83
|
-
bc1 = clients.NeutronAuth.get_neutron_client(
|
84
|
-
region=None, endpoint_type='publicURL')
|
85
|
-
|
86
|
-
# Our returned client should also be the saved client
|
87
|
-
self.assertIsInstance(
|
88
|
-
clients.NeutronAuth.neutron_client,
|
89
|
-
neutronclient.v2_0.client.Client
|
90
|
-
)
|
91
|
-
self.assertIs(
|
92
|
-
clients.NeutronAuth.neutron_client,
|
93
|
-
bc1
|
94
|
-
)
|
95
|
-
|
96
|
-
# Getting the session again should return the same object
|
97
|
-
bc2 = clients.NeutronAuth.get_neutron_client(
|
98
|
-
region="test-region", service_name="neutronEndpoint1",
|
99
|
-
endpoint="test-endpoint", endpoint_type='publicURL', insecure=True)
|
100
|
-
self.assertIs(bc1, bc2)
|
101
|
-
|
102
|
-
|
103
64
|
class TestGlanceAuth(base.TestCase):
|
104
65
|
|
105
66
|
def setUp(self):
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# Copyright Red Hat
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
4
|
+
# not use this file except in compliance with the License. You may obtain
|
5
|
+
# a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
11
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
12
|
+
# License for the specific language governing permissions and limitations
|
13
|
+
# under the License.
|
14
|
+
from unittest import mock
|
15
|
+
from unittest.mock import call
|
16
|
+
|
17
|
+
from keystoneauth1 import exceptions as ks_exceptions
|
18
|
+
from oslo_config import cfg
|
19
|
+
from oslo_config import fixture as oslo_fixture
|
20
|
+
|
21
|
+
import octavia.common.keystone as ks
|
22
|
+
import octavia.tests.unit.base as base
|
23
|
+
|
24
|
+
|
25
|
+
class TestKeystoneSession(base.TestCase):
|
26
|
+
|
27
|
+
@mock.patch("oslo_config.cfg.ConfigOpts.get_location", return_value=None)
|
28
|
+
@mock.patch("octavia.common.keystone.ks_loading"
|
29
|
+
".load_auth_from_conf_options")
|
30
|
+
@mock.patch("octavia.common.keystone.LOG")
|
31
|
+
def test_get_auth_neutron_override(self, mock_log, mock_load_auth,
|
32
|
+
mock_get_location):
|
33
|
+
opt_mock = mock.MagicMock()
|
34
|
+
opt_mock.dest = "foo"
|
35
|
+
conf = oslo_fixture.Config(cfg.CONF)
|
36
|
+
conf.conf.service_auth.cafile = "bar"
|
37
|
+
|
38
|
+
mock_load_auth.side_effect = [
|
39
|
+
ks_exceptions.auth_plugins.MissingRequiredOptions(
|
40
|
+
[opt_mock]),
|
41
|
+
None,
|
42
|
+
None
|
43
|
+
]
|
44
|
+
|
45
|
+
sess = ks.KeystoneSession("neutron")
|
46
|
+
sess.get_auth()
|
47
|
+
|
48
|
+
mock_load_auth.assert_has_calls([call(cfg.CONF, 'neutron'),
|
49
|
+
call(cfg.CONF, 'service_auth'),
|
50
|
+
call(cfg.CONF, 'neutron')])
|
51
|
+
mock_log.debug.assert_has_calls(
|
52
|
+
[call("Overriding [%s].%s with '%s'", 'neutron', 'cafile',
|
53
|
+
'bar')]
|
54
|
+
)
|
@@ -16,6 +16,7 @@ from unittest import mock
|
|
16
16
|
from oslo_config import cfg
|
17
17
|
from oslo_config import fixture as oslo_fixture
|
18
18
|
from oslo_utils import uuidutils
|
19
|
+
from wsme import types as wtypes
|
19
20
|
|
20
21
|
import octavia.common.constants as constants
|
21
22
|
import octavia.common.exceptions as exceptions
|
@@ -536,3 +537,69 @@ class TestValidations(base.TestCase):
|
|
536
537
|
'2001:db8::/32'))
|
537
538
|
self.assertFalse(validate.is_ip_member_of_cidr('::ffff:0:203.0.113.5',
|
538
539
|
'2001:db8::/32'))
|
540
|
+
|
541
|
+
def test_check_hsts_options(self):
|
542
|
+
self.assertRaises(
|
543
|
+
exceptions.ValidationException,
|
544
|
+
validate.check_hsts_options,
|
545
|
+
{'hsts_include_subdomains': True,
|
546
|
+
'hsts_preload': wtypes.Unset,
|
547
|
+
'hsts_max_age': wtypes.Unset}
|
548
|
+
)
|
549
|
+
self.assertRaises(
|
550
|
+
exceptions.ValidationException,
|
551
|
+
validate.check_hsts_options,
|
552
|
+
{'hsts_include_subdomains': wtypes.Unset,
|
553
|
+
'hsts_preload': True,
|
554
|
+
'hsts_max_age': wtypes.Unset}
|
555
|
+
)
|
556
|
+
self.assertRaises(
|
557
|
+
exceptions.ValidationException,
|
558
|
+
validate.check_hsts_options,
|
559
|
+
{'protocol': constants.PROTOCOL_UDP,
|
560
|
+
'hsts_include_subdomains': wtypes.Unset,
|
561
|
+
'hsts_preload': wtypes.Unset,
|
562
|
+
'hsts_max_age': 1}
|
563
|
+
)
|
564
|
+
self.assertIsNone(
|
565
|
+
validate.check_hsts_options(
|
566
|
+
{'protocol': constants.PROTOCOL_TERMINATED_HTTPS,
|
567
|
+
'hsts_include_subdomains': wtypes.Unset,
|
568
|
+
'hsts_preload': wtypes.Unset,
|
569
|
+
'hsts_max_age': 1})
|
570
|
+
)
|
571
|
+
|
572
|
+
def test_check_hsts_options_put(self):
|
573
|
+
listener = mock.MagicMock()
|
574
|
+
db_listener = mock.MagicMock()
|
575
|
+
db_listener.protocol = constants.PROTOCOL_TERMINATED_HTTPS
|
576
|
+
|
577
|
+
listener.hsts_max_age = wtypes.Unset
|
578
|
+
db_listener.hsts_max_age = None
|
579
|
+
for obj in (listener, db_listener):
|
580
|
+
obj.hsts_include_subdomains = False
|
581
|
+
obj.hsts_preload = False
|
582
|
+
self.assertIsNone(validate.check_hsts_options_put(
|
583
|
+
listener, db_listener))
|
584
|
+
|
585
|
+
for i in range(2):
|
586
|
+
listener.hsts_include_subdomains = bool(i % 2)
|
587
|
+
listener.hsts_preload = not bool(i % 2)
|
588
|
+
self.assertRaises(
|
589
|
+
exceptions.ValidationException,
|
590
|
+
validate.check_hsts_options_put,
|
591
|
+
listener, db_listener)
|
592
|
+
|
593
|
+
listener.hsts_max_age, db_listener.hsts_max_age = wtypes.Unset, 0
|
594
|
+
self.assertIsNone(validate.check_hsts_options_put(
|
595
|
+
listener, db_listener))
|
596
|
+
|
597
|
+
listener.hsts_max_age, db_listener.hsts_max_age = 3, None
|
598
|
+
self.assertIsNone(validate.check_hsts_options_put(
|
599
|
+
listener, db_listener))
|
600
|
+
|
601
|
+
db_listener.protocol = constants.PROTOCOL_HTTP
|
602
|
+
self.assertRaises(
|
603
|
+
exceptions.ValidationException,
|
604
|
+
validate.check_hsts_options_put,
|
605
|
+
listener, db_listener)
|
@@ -43,15 +43,13 @@ class TestHealthManager(base.TestCase):
|
|
43
43
|
super().setUp()
|
44
44
|
|
45
45
|
@mock.patch('octavia.db.api.wait_for_connection')
|
46
|
-
@mock.patch('octavia.controller.worker.v1.controller_worker.'
|
47
|
-
'ControllerWorker.failover_amphora')
|
48
46
|
@mock.patch('octavia.controller.worker.v2.controller_worker.'
|
49
47
|
'ControllerWorker.failover_amphora')
|
50
48
|
@mock.patch('octavia.db.repositories.AmphoraHealthRepository.'
|
51
49
|
'get_stale_amphora')
|
52
50
|
@mock.patch('octavia.db.api.get_session')
|
53
51
|
def test_health_check_stale_amphora(self, session_mock, get_stale_amp_mock,
|
54
|
-
|
52
|
+
failover_mock,
|
55
53
|
db_wait_mock):
|
56
54
|
conf = oslo_fixture.Config(cfg.CONF)
|
57
55
|
conf.config(group="health_manager", heartbeat_timeout=5)
|
@@ -87,15 +85,13 @@ class TestHealthManager(base.TestCase):
|
|
87
85
|
self.assertRaises(TestException, hm.health_check)
|
88
86
|
self.assertEqual(4, mock_session.rollback.call_count)
|
89
87
|
|
90
|
-
@mock.patch('octavia.controller.worker.v1.controller_worker.'
|
91
|
-
'ControllerWorker.failover_amphora')
|
92
88
|
@mock.patch('octavia.controller.worker.v2.controller_worker.'
|
93
89
|
'ControllerWorker.failover_amphora')
|
94
90
|
@mock.patch('octavia.db.repositories.AmphoraHealthRepository.'
|
95
91
|
'get_stale_amphora', return_value=None)
|
96
92
|
@mock.patch('octavia.db.api.get_session')
|
97
93
|
def test_health_check_nonstale_amphora(self, session_mock,
|
98
|
-
get_stale_amp_mock,
|
94
|
+
get_stale_amp_mock,
|
99
95
|
failover_mock):
|
100
96
|
get_stale_amp_mock.side_effect = [None, TestException('test')]
|
101
97
|
|
@@ -103,42 +99,32 @@ class TestHealthManager(base.TestCase):
|
|
103
99
|
hm = healthmanager.HealthManager(exit_event)
|
104
100
|
|
105
101
|
hm.health_check()
|
106
|
-
session_mock.assert_called_once_with(
|
107
|
-
|
108
|
-
self.assertFalse(failover_mockv2.called)
|
109
|
-
else:
|
110
|
-
self.assertFalse(failover_mock.called)
|
102
|
+
session_mock.assert_called_once_with()
|
103
|
+
self.assertFalse(failover_mock.called)
|
111
104
|
|
112
|
-
@mock.patch('octavia.controller.worker.v1.controller_worker.'
|
113
|
-
'ControllerWorker.failover_amphora')
|
114
105
|
@mock.patch('octavia.controller.worker.v2.controller_worker.'
|
115
106
|
'ControllerWorker.failover_amphora')
|
116
107
|
@mock.patch('octavia.db.repositories.AmphoraHealthRepository.'
|
117
108
|
'get_stale_amphora', return_value=None)
|
118
109
|
@mock.patch('octavia.db.api.get_session')
|
119
110
|
def test_health_check_exit(self, session_mock, get_stale_amp_mock,
|
120
|
-
|
111
|
+
failover_mock):
|
121
112
|
get_stale_amp_mock.return_value = None
|
122
113
|
|
123
114
|
exit_event = threading.Event()
|
124
115
|
hm = healthmanager.HealthManager(exit_event)
|
125
116
|
hm.health_check()
|
126
117
|
|
127
|
-
session_mock.assert_called_once_with(
|
128
|
-
|
129
|
-
self.assertFalse(failover_mockv2.called)
|
130
|
-
else:
|
131
|
-
self.assertFalse(failover_mock.called)
|
118
|
+
session_mock.assert_called_once_with()
|
119
|
+
self.assertFalse(failover_mock.called)
|
132
120
|
|
133
|
-
@mock.patch('octavia.controller.worker.v1.controller_worker.'
|
134
|
-
'ControllerWorker.failover_amphora')
|
135
121
|
@mock.patch('octavia.controller.worker.v2.controller_worker.'
|
136
122
|
'ControllerWorker.failover_amphora')
|
137
123
|
@mock.patch('octavia.db.repositories.AmphoraHealthRepository.'
|
138
124
|
'get_stale_amphora', return_value=None)
|
139
125
|
@mock.patch('octavia.db.api.get_session')
|
140
126
|
def test_health_check_db_error(self, session_mock, get_stale_amp_mock,
|
141
|
-
|
127
|
+
failover_mock):
|
142
128
|
get_stale_amp_mock.return_value = None
|
143
129
|
|
144
130
|
mock_session = mock.MagicMock()
|
@@ -158,73 +158,12 @@ class TestCertRotation(base.TestCase):
|
|
158
158
|
super().setUp()
|
159
159
|
self.CONF = self.useFixture(oslo_fixture.Config(cfg.CONF))
|
160
160
|
|
161
|
-
@mock.patch('octavia.controller.worker.v1.controller_worker.'
|
162
|
-
'ControllerWorker.amphora_cert_rotation')
|
163
|
-
@mock.patch('octavia.db.repositories.AmphoraRepository.'
|
164
|
-
'get_cert_expiring_amphora')
|
165
|
-
@mock.patch('octavia.db.api.get_session')
|
166
|
-
def test_cert_rotation_expired_amphora_with_exception(self, session,
|
167
|
-
cert_exp_amp_mock,
|
168
|
-
amp_cert_mock
|
169
|
-
):
|
170
|
-
self.CONF.config(group="api_settings",
|
171
|
-
default_provider_driver='amphorav1')
|
172
|
-
amphora = mock.MagicMock()
|
173
|
-
amphora.id = AMPHORA_ID
|
174
|
-
|
175
|
-
session.return_value = session
|
176
|
-
cert_exp_amp_mock.side_effect = [amphora, TestException(
|
177
|
-
'break_while')]
|
178
|
-
|
179
|
-
cr = house_keeping.CertRotation()
|
180
|
-
self.assertRaises(TestException, cr.rotate)
|
181
|
-
amp_cert_mock.assert_called_once_with(AMPHORA_ID)
|
182
|
-
|
183
|
-
@mock.patch('octavia.controller.worker.v1.controller_worker.'
|
184
|
-
'ControllerWorker.amphora_cert_rotation')
|
185
|
-
@mock.patch('octavia.db.repositories.AmphoraRepository.'
|
186
|
-
'get_cert_expiring_amphora')
|
187
|
-
@mock.patch('octavia.db.api.get_session')
|
188
|
-
def test_cert_rotation_expired_amphora_without_exception(self, session,
|
189
|
-
cert_exp_amp_mock,
|
190
|
-
amp_cert_mock
|
191
|
-
):
|
192
|
-
self.CONF.config(group="api_settings",
|
193
|
-
default_provider_driver='amphorav1')
|
194
|
-
amphora = mock.MagicMock()
|
195
|
-
amphora.id = AMPHORA_ID
|
196
|
-
|
197
|
-
session.return_value = session
|
198
|
-
cert_exp_amp_mock.side_effect = [amphora, None]
|
199
|
-
|
200
|
-
cr = house_keeping.CertRotation()
|
201
|
-
|
202
|
-
self.assertIsNone(cr.rotate())
|
203
|
-
amp_cert_mock.assert_called_once_with(AMPHORA_ID)
|
204
|
-
|
205
|
-
@mock.patch('octavia.controller.worker.v1.controller_worker.'
|
206
|
-
'ControllerWorker.amphora_cert_rotation')
|
207
|
-
@mock.patch('octavia.db.repositories.AmphoraRepository.'
|
208
|
-
'get_cert_expiring_amphora')
|
209
|
-
@mock.patch('octavia.db.api.get_session')
|
210
|
-
def test_cert_rotation_non_expired_amphora(self, session,
|
211
|
-
cert_exp_amp_mock,
|
212
|
-
amp_cert_mock):
|
213
|
-
self.CONF.config(group="api_settings",
|
214
|
-
default_provider_driver='amphorav1')
|
215
|
-
|
216
|
-
session.return_value = session
|
217
|
-
cert_exp_amp_mock.return_value = None
|
218
|
-
cr = house_keeping.CertRotation()
|
219
|
-
cr.rotate()
|
220
|
-
self.assertFalse(amp_cert_mock.called)
|
221
|
-
|
222
161
|
@mock.patch('octavia.controller.worker.v2.controller_worker.'
|
223
162
|
'ControllerWorker.amphora_cert_rotation')
|
224
163
|
@mock.patch('octavia.db.repositories.AmphoraRepository.'
|
225
164
|
'get_cert_expiring_amphora')
|
226
165
|
@mock.patch('octavia.db.api.get_session')
|
227
|
-
def
|
166
|
+
def test_cert_rotation_expired_amphora_with_exception(
|
228
167
|
self, session, cert_exp_amp_mock, amp_cert_mock):
|
229
168
|
self.CONF.config(group="api_settings",
|
230
169
|
default_provider_driver='amphora')
|
@@ -245,7 +184,7 @@ class TestCertRotation(base.TestCase):
|
|
245
184
|
@mock.patch('octavia.db.repositories.AmphoraRepository.'
|
246
185
|
'get_cert_expiring_amphora')
|
247
186
|
@mock.patch('octavia.db.api.get_session')
|
248
|
-
def
|
187
|
+
def test_cert_rotation_expired_amphora_without_exception(
|
249
188
|
self, session, cert_exp_amp_mock, amp_cert_mock):
|
250
189
|
self.CONF.config(group="api_settings",
|
251
190
|
default_provider_driver='amphora')
|
@@ -265,7 +204,7 @@ class TestCertRotation(base.TestCase):
|
|
265
204
|
@mock.patch('octavia.db.repositories.AmphoraRepository.'
|
266
205
|
'get_cert_expiring_amphora')
|
267
206
|
@mock.patch('octavia.db.api.get_session')
|
268
|
-
def
|
207
|
+
def test_cert_rotation_non_expired_amphora(
|
269
208
|
self, session, cert_exp_amp_mock, amp_cert_mock):
|
270
209
|
self.CONF.config(group="api_settings",
|
271
210
|
default_provider_driver='amphora')
|
@@ -36,7 +36,7 @@ class TestAmphoraBuildRateLimit(base.TestCase):
|
|
36
36
|
self.amp_build_req_repo = mock.MagicMock()
|
37
37
|
self.conf.config(group='haproxy_amphora', build_rate_limit=1)
|
38
38
|
|
39
|
-
@mock.patch('octavia.db.api.
|
39
|
+
@mock.patch('octavia.db.api.session', mock.MagicMock())
|
40
40
|
@mock.patch('octavia.controller.worker.amphora_rate_limit'
|
41
41
|
'.AmphoraBuildRateLimit.wait_for_build_slot')
|
42
42
|
@mock.patch('octavia.db.repositories.AmphoraBuildReqRepository'
|
@@ -19,8 +19,6 @@ from octavia.common import constants
|
|
19
19
|
from octavia.controller.worker import task_utils as task_utilities
|
20
20
|
import octavia.tests.unit.base as base
|
21
21
|
|
22
|
-
TEST_SESSION = 'TEST_SESSION'
|
23
|
-
|
24
22
|
|
25
23
|
class TestTaskUtils(base.TestCase):
|
26
24
|
|
@@ -39,7 +37,7 @@ class TestTaskUtils(base.TestCase):
|
|
39
37
|
|
40
38
|
super().setUp()
|
41
39
|
|
42
|
-
@mock.patch('octavia.db.api.
|
40
|
+
@mock.patch('octavia.db.api.session')
|
43
41
|
@mock.patch('octavia.db.repositories.AmphoraRepository.update')
|
44
42
|
def test_mark_amphora_status_error(self,
|
45
43
|
mock_amphora_repo_update,
|
@@ -48,8 +46,10 @@ class TestTaskUtils(base.TestCase):
|
|
48
46
|
# Happy path
|
49
47
|
self.task_utils.mark_amphora_status_error(self.AMPHORA_ID)
|
50
48
|
|
49
|
+
mock_session = mock_get_session().begin().__enter__()
|
50
|
+
|
51
51
|
mock_amphora_repo_update.assert_called_once_with(
|
52
|
-
|
52
|
+
mock_session,
|
53
53
|
id=self.AMPHORA_ID,
|
54
54
|
status=constants.ERROR)
|
55
55
|
|
@@ -61,7 +61,7 @@ class TestTaskUtils(base.TestCase):
|
|
61
61
|
|
62
62
|
self.assertFalse(mock_amphora_repo_update.called)
|
63
63
|
|
64
|
-
@mock.patch('octavia.db.api.
|
64
|
+
@mock.patch('octavia.db.api.session')
|
65
65
|
@mock.patch('octavia.db.repositories.HealthMonitorRepository.update')
|
66
66
|
def test_mark_health_mon_prov_status_error(self,
|
67
67
|
mock_health_mon_repo_update,
|
@@ -70,8 +70,10 @@ class TestTaskUtils(base.TestCase):
|
|
70
70
|
# Happy path
|
71
71
|
self.task_utils.mark_health_mon_prov_status_error(self.HEALTH_MON_ID)
|
72
72
|
|
73
|
+
mock_session = mock_get_session().begin().__enter__()
|
74
|
+
|
73
75
|
mock_health_mon_repo_update.assert_called_once_with(
|
74
|
-
|
76
|
+
mock_session,
|
75
77
|
id=self.HEALTH_MON_ID,
|
76
78
|
provisioning_status=constants.ERROR)
|
77
79
|
|
@@ -83,7 +85,7 @@ class TestTaskUtils(base.TestCase):
|
|
83
85
|
|
84
86
|
self.assertFalse(mock_health_mon_repo_update.called)
|
85
87
|
|
86
|
-
@mock.patch('octavia.db.api.
|
88
|
+
@mock.patch('octavia.db.api.session')
|
87
89
|
@mock.patch('octavia.db.repositories.L7PolicyRepository.update')
|
88
90
|
def test_mark_l7policy_prov_status_error(self,
|
89
91
|
mock_l7policy_repo_update,
|
@@ -92,8 +94,10 @@ class TestTaskUtils(base.TestCase):
|
|
92
94
|
# Happy path
|
93
95
|
self.task_utils.mark_l7policy_prov_status_error(self.L7POLICY_ID)
|
94
96
|
|
97
|
+
mock_session = mock_get_session().begin().__enter__()
|
98
|
+
|
95
99
|
mock_l7policy_repo_update.assert_called_once_with(
|
96
|
-
|
100
|
+
mock_session,
|
97
101
|
id=self.L7POLICY_ID,
|
98
102
|
provisioning_status=constants.ERROR)
|
99
103
|
|
@@ -105,7 +109,7 @@ class TestTaskUtils(base.TestCase):
|
|
105
109
|
|
106
110
|
self.assertFalse(mock_l7policy_repo_update.called)
|
107
111
|
|
108
|
-
@mock.patch('octavia.db.api.
|
112
|
+
@mock.patch('octavia.db.api.session')
|
109
113
|
@mock.patch('octavia.db.repositories.L7RuleRepository.update')
|
110
114
|
def test_mark_l7rule_prov_status_error(self,
|
111
115
|
mock_l7rule_repo_update,
|
@@ -114,8 +118,10 @@ class TestTaskUtils(base.TestCase):
|
|
114
118
|
# Happy path
|
115
119
|
self.task_utils.mark_l7rule_prov_status_error(self.L7RULE_ID)
|
116
120
|
|
121
|
+
mock_session = mock_get_session().begin().__enter__()
|
122
|
+
|
117
123
|
mock_l7rule_repo_update.assert_called_once_with(
|
118
|
-
|
124
|
+
mock_session,
|
119
125
|
id=self.L7RULE_ID,
|
120
126
|
provisioning_status=constants.ERROR)
|
121
127
|
|
@@ -127,7 +133,7 @@ class TestTaskUtils(base.TestCase):
|
|
127
133
|
|
128
134
|
self.assertFalse(mock_l7rule_repo_update.called)
|
129
135
|
|
130
|
-
@mock.patch('octavia.db.api.
|
136
|
+
@mock.patch('octavia.db.api.session')
|
131
137
|
@mock.patch('octavia.db.repositories.ListenerRepository.update')
|
132
138
|
def test_mark_listener_prov_status_active(self,
|
133
139
|
mock_listener_repo_update,
|
@@ -136,8 +142,10 @@ class TestTaskUtils(base.TestCase):
|
|
136
142
|
# Happy path
|
137
143
|
self.task_utils.mark_listener_prov_status_active(self.LISTENER_ID)
|
138
144
|
|
145
|
+
mock_session = mock_get_session().begin().__enter__()
|
146
|
+
|
139
147
|
mock_listener_repo_update.assert_called_once_with(
|
140
|
-
|
148
|
+
mock_session,
|
141
149
|
id=self.LISTENER_ID,
|
142
150
|
provisioning_status=constants.ACTIVE)
|
143
151
|
|
@@ -149,7 +157,7 @@ class TestTaskUtils(base.TestCase):
|
|
149
157
|
|
150
158
|
self.assertFalse(mock_listener_repo_update.called)
|
151
159
|
|
152
|
-
@mock.patch('octavia.db.api.
|
160
|
+
@mock.patch('octavia.db.api.session')
|
153
161
|
@mock.patch('octavia.db.repositories.ListenerRepository.update')
|
154
162
|
def test_mark_listener_prov_status_error(self,
|
155
163
|
mock_listener_repo_update,
|
@@ -158,8 +166,10 @@ class TestTaskUtils(base.TestCase):
|
|
158
166
|
# Happy path
|
159
167
|
self.task_utils.mark_listener_prov_status_error(self.LISTENER_ID)
|
160
168
|
|
169
|
+
mock_session = mock_get_session().begin().__enter__()
|
170
|
+
|
161
171
|
mock_listener_repo_update.assert_called_once_with(
|
162
|
-
|
172
|
+
mock_session,
|
163
173
|
id=self.LISTENER_ID,
|
164
174
|
provisioning_status=constants.ERROR)
|
165
175
|
|
@@ -171,7 +181,7 @@ class TestTaskUtils(base.TestCase):
|
|
171
181
|
|
172
182
|
self.assertFalse(mock_listener_repo_update.called)
|
173
183
|
|
174
|
-
@mock.patch('octavia.db.api.
|
184
|
+
@mock.patch('octavia.db.api.session')
|
175
185
|
@mock.patch('octavia.db.repositories.LoadBalancerRepository.update')
|
176
186
|
def test_mark_loadbalancer_prov_status_active(self,
|
177
187
|
mock_lb_repo_update,
|
@@ -181,8 +191,10 @@ class TestTaskUtils(base.TestCase):
|
|
181
191
|
self.task_utils.mark_loadbalancer_prov_status_active(
|
182
192
|
self.LOADBALANCER_ID)
|
183
193
|
|
194
|
+
mock_session = mock_get_session().begin().__enter__()
|
195
|
+
|
184
196
|
mock_lb_repo_update.assert_called_once_with(
|
185
|
-
|
197
|
+
mock_session,
|
186
198
|
id=self.LOADBALANCER_ID,
|
187
199
|
provisioning_status=constants.ACTIVE)
|
188
200
|
|
@@ -195,7 +207,7 @@ class TestTaskUtils(base.TestCase):
|
|
195
207
|
|
196
208
|
self.assertFalse(mock_lb_repo_update.called)
|
197
209
|
|
198
|
-
@mock.patch('octavia.db.api.
|
210
|
+
@mock.patch('octavia.db.api.session')
|
199
211
|
@mock.patch('octavia.db.repositories.LoadBalancerRepository.update')
|
200
212
|
def test_mark_loadbalancer_prov_status_error(self,
|
201
213
|
mock_lb_repo_update,
|
@@ -205,8 +217,10 @@ class TestTaskUtils(base.TestCase):
|
|
205
217
|
self.task_utils.mark_loadbalancer_prov_status_error(
|
206
218
|
self.LOADBALANCER_ID)
|
207
219
|
|
220
|
+
mock_session = mock_get_session().begin().__enter__()
|
221
|
+
|
208
222
|
mock_lb_repo_update.assert_called_once_with(
|
209
|
-
|
223
|
+
mock_session,
|
210
224
|
id=self.LOADBALANCER_ID,
|
211
225
|
provisioning_status=constants.ERROR)
|
212
226
|
|
@@ -219,7 +233,7 @@ class TestTaskUtils(base.TestCase):
|
|
219
233
|
|
220
234
|
self.assertFalse(mock_lb_repo_update.called)
|
221
235
|
|
222
|
-
@mock.patch('octavia.db.api.
|
236
|
+
@mock.patch('octavia.db.api.session')
|
223
237
|
@mock.patch('octavia.db.repositories.MemberRepository.update')
|
224
238
|
def test_mark_member_prov_status_error(self,
|
225
239
|
mock_member_repo_update,
|
@@ -228,8 +242,10 @@ class TestTaskUtils(base.TestCase):
|
|
228
242
|
# Happy path
|
229
243
|
self.task_utils.mark_member_prov_status_error(self.MEMBER_ID)
|
230
244
|
|
245
|
+
mock_session = mock_get_session().begin().__enter__()
|
246
|
+
|
231
247
|
mock_member_repo_update.assert_called_once_with(
|
232
|
-
|
248
|
+
mock_session,
|
233
249
|
id=self.MEMBER_ID,
|
234
250
|
provisioning_status=constants.ERROR)
|
235
251
|
|
@@ -241,7 +257,7 @@ class TestTaskUtils(base.TestCase):
|
|
241
257
|
|
242
258
|
self.assertFalse(mock_member_repo_update.called)
|
243
259
|
|
244
|
-
@mock.patch('octavia.db.api.
|
260
|
+
@mock.patch('octavia.db.api.session')
|
245
261
|
@mock.patch('octavia.db.repositories.PoolRepository.update')
|
246
262
|
def test_mark_pool_prov_status_error(self,
|
247
263
|
mock_pool_repo_update,
|
@@ -250,8 +266,10 @@ class TestTaskUtils(base.TestCase):
|
|
250
266
|
# Happy path
|
251
267
|
self.task_utils.mark_pool_prov_status_error(self.POOL_ID)
|
252
268
|
|
269
|
+
mock_session = mock_get_session().begin().__enter__()
|
270
|
+
|
253
271
|
mock_pool_repo_update.assert_called_once_with(
|
254
|
-
|
272
|
+
mock_session,
|
255
273
|
id=self.POOL_ID,
|
256
274
|
provisioning_status=constants.ERROR)
|
257
275
|
|
@@ -263,15 +281,17 @@ class TestTaskUtils(base.TestCase):
|
|
263
281
|
|
264
282
|
self.assertFalse(mock_pool_repo_update.called)
|
265
283
|
|
266
|
-
@mock.patch('octavia.db.api.
|
284
|
+
@mock.patch('octavia.db.api.session')
|
267
285
|
@mock.patch('octavia.db.repositories.LoadBalancerRepository.get')
|
268
286
|
def test_get_current_loadbalancer_from_db(self, mock_lb_repo_get,
|
269
287
|
mock_get_session):
|
270
288
|
# Happy path
|
271
289
|
self.task_utils.get_current_loadbalancer_from_db(self.LOADBALANCER_ID)
|
272
290
|
|
291
|
+
mock_session = mock_get_session().begin().__enter__()
|
292
|
+
|
273
293
|
mock_lb_repo_get.assert_called_once_with(
|
274
|
-
|
294
|
+
mock_session,
|
275
295
|
id=self.LOADBALANCER_ID)
|
276
296
|
|
277
297
|
# Exception path
|
@@ -208,7 +208,6 @@ class TestLoadBalancerFlows(base.TestCase):
|
|
208
208
|
self.assertEqual(2, len(amp_flow.requires), amp_flow.requires)
|
209
209
|
self.assertEqual(4, len(amp_flow.provides), amp_flow.provides)
|
210
210
|
|
211
|
-
# Test mark_active=False
|
212
211
|
amp_flow = self.LBFlow.get_post_lb_amp_association_flow(
|
213
212
|
'123', constants.TOPOLOGY_ACTIVE_STANDBY)
|
214
213
|
|