summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Olof Gunnar Andersson <eandersson@blizzard.com>2021-06-01 22:44:50 -0700
committerErik Olof Gunnar Andersson <eandersson@blizzard.com>2021-06-17 10:57:23 -0700
commitc0bd7c7ff0fd56a12b41b545daa78e04c2355175 (patch)
tree1e8f4a3ca1564ef98082740e623e9ee420cf4288
parent057dd2b3c6689be84dac58d6e5a19726d54735a0 (diff)
downloaddesignate-c0bd7c7ff0fd56a12b41b545daa78e04c2355175.tar.gz
Add simple scheduler permutation tests
Change-Id: Ib55d16b2f05269ae58bbcf38e816fb776dbe4f3c
-rw-r--r--designate/tests/unit/scheduler/test_permutations.py251
1 files changed, 251 insertions, 0 deletions
diff --git a/designate/tests/unit/scheduler/test_permutations.py b/designate/tests/unit/scheduler/test_permutations.py
new file mode 100644
index 00000000..c6ca516a
--- /dev/null
+++ b/designate/tests/unit/scheduler/test_permutations.py
@@ -0,0 +1,251 @@
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+from unittest import mock
+
+from oslo_config import cfg
+from oslo_config import fixture as cfg_fixture
+
+from designate import exceptions
+from designate import objects
+from designate import scheduler
+from designate import tests
+
+DEFAULT_POOL_ID = BRONZE_POOL_ID = '67d71c2a-645c-4dde-a6b8-60a172c9ede8'
+SILVER_POOL_ID = '5fabcd37-262c-4cf3-8625-7f419434b6df'
+GOLD_POOL_ID = '24702e43-8a52-440f-ab74-19fc16048860'
+
+
+def build_test_pools():
+ pools = objects.PoolList.from_list(
+ [
+ {'id': DEFAULT_POOL_ID},
+ {'id': SILVER_POOL_ID},
+ {'id': GOLD_POOL_ID},
+ ]
+
+ )
+
+ # Pool 0 is also the default pool.
+ pool_0_attributes = objects.PoolAttributeList.from_list([
+ {
+ 'key': 'service_tier',
+ 'value': 'bronze'
+ },
+ ])
+ pool_1_attributes = objects.PoolAttributeList.from_list([
+ {
+ 'key': 'service_tier',
+ 'value': 'silver'
+ },
+ ])
+ pool_2_attributes = objects.PoolAttributeList.from_list([
+ {
+ 'key': 'service_tier',
+ 'value': 'gold'
+ },
+ ])
+
+ pools[0].attributes = pool_0_attributes
+ pools[1].attributes = pool_1_attributes
+ pools[2].attributes = pool_2_attributes
+
+ return pools
+
+
+class AttributeSchedulerPermutationsTest(tests.TestCase):
+ def setUp(self):
+ super(AttributeSchedulerPermutationsTest, self).setUp()
+ self.CONF = self.useFixture(cfg_fixture.Config(cfg.CONF)).conf
+ self.context = self.get_context()
+
+ self.CONF.set_override(
+ 'scheduler_filters', ['attribute'], 'service:central'
+ )
+ self.CONF.set_override(
+ 'default_pool_id', DEFAULT_POOL_ID, 'service:central'
+ )
+
+ attrs = {
+ 'find_pools.return_value': build_test_pools()
+ }
+ mock_storage = mock.Mock(**attrs)
+
+ self.scheduler = scheduler.get_scheduler(storage=mock_storage)
+
+ def test_get_gold_tier(self):
+ zone = objects.Zone(
+ name='example.com.',
+ type='PRIMARY',
+ email='hostmaster@example.com',
+ attributes=objects.ZoneAttributeList.from_list(
+ [
+ {
+ 'key': 'service_tier',
+ 'value': 'gold'
+ },
+ ]
+ )
+ )
+
+ result = self.scheduler.schedule_zone(self.context, zone)
+
+ self.assertEqual(GOLD_POOL_ID, result)
+
+ def test_get_silver_tier(self):
+ zone = objects.Zone(
+ name='example.com.',
+ type='PRIMARY',
+ email='hostmaster@example.com',
+ attributes=objects.ZoneAttributeList.from_list(
+ [
+ {
+ 'key': 'service_tier',
+ 'value': 'silver'
+ },
+ ]
+ )
+ )
+
+ result = self.scheduler.schedule_zone(self.context, zone)
+
+ self.assertEqual(SILVER_POOL_ID, result)
+
+ def test_get_bronze_tier(self):
+ zone = objects.Zone(
+ name='example.com.',
+ type='PRIMARY',
+ email='hostmaster@example.com',
+ attributes=objects.ZoneAttributeList.from_list(
+ [
+ {
+ 'key': 'service_tier',
+ 'value': 'bronze'
+ },
+ ]
+ )
+ )
+
+ result = self.scheduler.schedule_zone(self.context, zone)
+
+ self.assertEqual(BRONZE_POOL_ID, result)
+
+ def test_tier_not_found_raises_exception(self):
+ zone = objects.Zone(
+ name='example.com.',
+ type='PRIMARY',
+ email='hostmaster@example.com',
+ attributes=objects.ZoneAttributeList.from_list(
+ [
+ {
+ 'key': 'service_tier',
+ 'value': 'blue'
+ },
+ ]
+ )
+ )
+
+ self.assertRaises(
+ exceptions.NoValidPoolFound,
+ self.scheduler.schedule_zone, self.context, zone
+ )
+
+ def test_no_tier_raises_exception(self):
+ zone = objects.Zone(
+ name='example.com.',
+ type='PRIMARY',
+ email='hostmaster@example.com',
+ attributes=objects.ZoneAttributeList.from_list(
+ []
+ )
+ )
+
+ # When no attribute is requested it will return all available pools.
+ # NOTE(eandersson): This is probably not intended behavior.
+ # We probably want this to return NoValidPoolFound,
+ # so that we can use a fallback filter with the
+ # attribute filter.
+ self.assertRaises(
+ exceptions.MultiplePoolsFound,
+ self.scheduler.schedule_zone, self.context, zone
+ )
+
+
+class DefaultSchedulerPermutationsTest(tests.TestCase):
+ def setUp(self):
+ super(DefaultSchedulerPermutationsTest, self).setUp()
+ self.CONF = self.useFixture(cfg_fixture.Config(cfg.CONF)).conf
+ self.context = self.get_context()
+
+ self.CONF.set_override(
+ 'scheduler_filters', ['default_pool'], 'service:central'
+ )
+ self.CONF.set_override(
+ 'default_pool_id', DEFAULT_POOL_ID, 'service:central'
+ )
+
+ attrs = {
+ 'find_pools.return_value': build_test_pools()
+ }
+ mock_storage = mock.Mock(**attrs)
+
+ self.scheduler = scheduler.get_scheduler(storage=mock_storage)
+
+ def test_get_default_pool(self):
+ zone = objects.Zone(
+ name='example.com.',
+ type='PRIMARY',
+ email='hostmaster@example.com',
+ )
+
+ result = self.scheduler.schedule_zone(self.context, zone)
+
+ self.assertEqual(DEFAULT_POOL_ID, result)
+
+
+class FallbackSchedulerPermutationsTest(tests.TestCase):
+ def setUp(self):
+ super(FallbackSchedulerPermutationsTest, self).setUp()
+ self.CONF = self.useFixture(cfg_fixture.Config(cfg.CONF)).conf
+ self.context = self.get_context()
+
+ self.CONF.set_override(
+ 'scheduler_filters', ['attribute', 'fallback'], 'service:central'
+ )
+ self.CONF.set_override(
+ 'default_pool_id', DEFAULT_POOL_ID, 'service:central'
+ )
+
+ attrs = {
+ 'find_pools.return_value': build_test_pools()
+ }
+ mock_storage = mock.Mock(**attrs)
+
+ self.scheduler = scheduler.get_scheduler(storage=mock_storage)
+
+ def test_tier_not_found_return_default(self):
+ zone = objects.Zone(
+ name='example.com.',
+ type='PRIMARY',
+ email='hostmaster@example.com',
+ attributes=objects.ZoneAttributeList.from_list(
+ [
+ {
+ 'key': 'service_tier',
+ 'value': 'that does not exist'
+ },
+ ]
+ )
+ )
+
+ result = self.scheduler.schedule_zone(self.context, zone)
+
+ self.assertEqual(DEFAULT_POOL_ID, result)