summaryrefslogtreecommitdiff
path: root/designate/tests/test_central/test_decorator.py
diff options
context:
space:
mode:
Diffstat (limited to 'designate/tests/test_central/test_decorator.py')
-rw-r--r--designate/tests/test_central/test_decorator.py74
1 files changed, 74 insertions, 0 deletions
diff --git a/designate/tests/test_central/test_decorator.py b/designate/tests/test_central/test_decorator.py
new file mode 100644
index 00000000..ff189caf
--- /dev/null
+++ b/designate/tests/test_central/test_decorator.py
@@ -0,0 +1,74 @@
+# 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.
+import mock
+from oslo_concurrency import lockutils
+from oslo_log import log as logging
+
+from designate import exceptions
+from designate import utils
+from designate.central import service
+from designate.objects import record
+from designate.objects import zone
+from designate.tests.test_central import CentralTestCase
+
+LOG = logging.getLogger(__name__)
+
+
+class FakeCoordination(object):
+ def get_lock(self, name):
+ return lockutils.lock(name)
+
+
+class CentralDecoratorTests(CentralTestCase):
+ def test_synchronized_zone_exception_raised(self):
+ @service.synchronized_zone()
+ def mock_get_zone(cls, index, zone):
+ self.assertEqual(service.ZONE_LOCKS.held, {zone.id})
+ if index % 3 == 0:
+ raise exceptions.ZoneNotFound()
+
+ for index in range(9):
+ try:
+ mock_get_zone(mock.Mock(coordination=FakeCoordination()),
+ index,
+ zone.Zone(id=utils.generate_uuid()))
+ except exceptions.ZoneNotFound:
+ pass
+
+ def test_synchronized_zone_recursive_decorator_call(self):
+ @service.synchronized_zone()
+ def mock_create_record(cls, context, record):
+ self.assertEqual(service.ZONE_LOCKS.held, {record.zone_id})
+ mock_get_zone(cls, context, zone.Zone(id=record.zone_id))
+
+ @service.synchronized_zone()
+ def mock_get_zone(cls, context, zone):
+ self.assertEqual(service.ZONE_LOCKS.held, {zone.id})
+
+ mock_create_record(mock.Mock(coordination=FakeCoordination()),
+ self.get_context(),
+ record=record.Record(zone_id=utils.generate_uuid()))
+ mock_get_zone(mock.Mock(coordination=FakeCoordination()),
+ self.get_context(),
+ zone=zone.Zone(id=utils.generate_uuid()))
+
+ def test_synchronized_zone_raises_exception_when_no_zone_provided(self):
+ @service.synchronized_zone(new_zone=False)
+ def mock_not_creating_new_zone(cls, context, record):
+ pass
+
+ self.assertRaisesRegexp(
+ Exception,
+ 'Failed to determine zone id for '
+ 'synchronized operation',
+ mock_not_creating_new_zone, self.get_context(), None
+ )