Refactor Zone Import Internals

In preparation for async zone exports, move imports to be their own objects,
away from zone tasks. This is essentially a giant renaming.

Change-Id: If6eefbf5553d0fc09e638e879b88c73c133c56fe
This commit is contained in:
TimSimmons 2015-08-20 14:30:24 -05:00
parent 7ac4cb4759
commit 523395dec0
11 changed files with 126 additions and 122 deletions

View File

@ -34,7 +34,7 @@ class ZoneImportController(rest.RestController):
@pecan.expose(template='json:', content_type='application/json')
@utils.validate_uuid('import_id')
def get_one(self, import_id):
"""Get imports"""
"""Get Zone Imports"""
request = pecan.request
context = request.environ['context']
@ -47,7 +47,7 @@ class ZoneImportController(rest.RestController):
@pecan.expose(template='json:', content_type='application/json')
def get_all(self, **params):
"""List ZoneImports"""
"""List Zone Imports"""
request = pecan.request
context = request.environ['context']
marker, limit, sort_key, sort_dir = utils.get_paging_params(
@ -67,7 +67,7 @@ class ZoneImportController(rest.RestController):
@pecan.expose(template='json:', content_type='application/json')
def post_all(self):
"""Create ZoneImport"""
"""Create Zone Import"""
request = pecan.request
response = pecan.response
context = request.environ['context']
@ -95,7 +95,7 @@ class ZoneImportController(rest.RestController):
@pecan.expose(template='json:', content_type='application/json')
@utils.validate_uuid('zone_import_id')
def delete_one(self, zone_import_id):
"""Delete Zone"""
"""Delete Zone Import"""
request = pecan.request
response = pecan.response
context = request.environ['context']

View File

@ -2501,9 +2501,9 @@ class Service(service.RPCService, service.Service):
'tenant_id': context.tenant,
'task_type': 'IMPORT'
}
zone_import = objects.ZoneTask(**values)
zone_import = objects.ZoneImport(**values)
created_zone_import = self.storage.create_zone_task(context,
created_zone_import = self.storage.create_zone_import(context,
zone_import)
self.tg.add_thread(self._import_zone, context, created_zone_import,
@ -2582,13 +2582,13 @@ class Service(service.RPCService, service.Service):
criterion = {
'task_type': 'IMPORT'
}
return self.storage.find_zone_tasks(context, criterion, marker,
return self.storage.find_zone_imports(context, criterion, marker,
limit, sort_key, sort_dir)
def get_zone_import(self, context, zone_import_id):
target = {'tenant_id': context.tenant}
policy.check('get_zone_import', context, target)
return self.storage.get_zone_task(context, zone_import_id)
return self.storage.get_zone_import(context, zone_import_id)
@notification('dns.zone_import.update')
def update_zone_import(self, context, zone_import):
@ -2597,7 +2597,7 @@ class Service(service.RPCService, service.Service):
}
policy.check('update_zone_import', context, target)
return self.storage.update_zone_task(context, zone_import)
return self.storage.update_zone_import(context, zone_import)
@notification('dns.zone_import.delete')
@transaction
@ -2608,6 +2608,6 @@ class Service(service.RPCService, service.Service):
}
policy.check('delete_zone_import', context, target)
zone_import = self.storage.delete_zone_task(context, zone_import_id)
zone_import = self.storage.delete_zone_import(context, zone_import_id)
return zone_import

View File

@ -286,8 +286,8 @@ class DuplicatePoolNsRecord(Duplicate):
error_type = 'duplicate_pool_ns_record'
class DuplicateZoneTask(Duplicate):
error_type = 'duplicate_zone_task'
class DuplicateZoneImport(Duplicate):
error_type = 'duplicate_zone_import'
class MethodNotAllowed(Base):
@ -378,8 +378,8 @@ class ZoneTransferAcceptNotFound(NotFound):
error_type = 'zone_transfer_accept_not_found'
class ZoneTaskNotFound(NotFound):
error_type = 'zone_task_not_found'
class ZoneImportNotFound(NotFound):
error_type = 'zone_import_not_found'
class LastServerDeleteNotAllowed(BadRequest):

View File

@ -43,7 +43,7 @@ from designate.objects.validation_error import ValidationError # noqa
from designate.objects.validation_error import ValidationErrorList # noqa
from designate.objects.zone_transfer_request import ZoneTransferRequest, ZoneTransferRequestList # noqa
from designate.objects.zone_transfer_accept import ZoneTransferAccept, ZoneTransferAcceptList # noqa
from designate.objects.zone_task import ZoneTask, ZoneTaskList # noqa
from designate.objects.zone_import import ZoneImport, ZoneImportList # noqa
# Record Types

View File

@ -22,7 +22,7 @@ LOG = logging.getLogger(__name__)
class ZoneImportAPIv2Adapter(base.APIv2Adapter):
ADAPTER_OBJECT = objects.ZoneTask
ADAPTER_OBJECT = objects.ZoneImport
MODIFICATIONS = {
'fields': {
@ -60,7 +60,7 @@ class ZoneImportAPIv2Adapter(base.APIv2Adapter):
class ZoneImportListAPIv2Adapter(base.APIv2Adapter):
ADAPTER_OBJECT = objects.ZoneTaskList
ADAPTER_OBJECT = objects.ZoneImportList
MODIFICATIONS = {
'options': {

View File

@ -16,7 +16,7 @@
from designate.objects import base
class ZoneTask(base.DictObjectMixin, base.PersistentObjectMixin,
class ZoneImport(base.DictObjectMixin, base.PersistentObjectMixin,
base.DesignateObject):
FIELDS = {
'status': {
@ -56,6 +56,6 @@ class ZoneTask(base.DictObjectMixin, base.PersistentObjectMixin,
}
class ZoneTaskList(base.ListObjectMixin, base.DesignateObject,
class ZoneImportList(base.ListObjectMixin, base.DesignateObject,
base.PagedListObjectMixin):
LIST_ITEM_TYPE = ZoneTask
LIST_ITEM_TYPE = ZoneImport

View File

@ -631,28 +631,28 @@ class Storage(DriverPlugin):
"""
@abc.abstractmethod
def create_zone_task(self, context, zone_task):
def create_zone_import(self, context, zone_import):
"""
Create a Zone Task.
Create a Zone Import.
:param context: RPC Context.
:param zone_task: Tld object with the values to be created.
:param zone_import: Zone Import object with the values to be created.
"""
@abc.abstractmethod
def get_zone_task(self, context, zone_task_id):
def get_zone_import(self, context, zone_import_id):
"""
Get a Zone Task via ID.
Get a Zone Import via ID.
:param context: RPC Context.
:param zone_task_id: Zone Task ID to get.
:param zone_import_id: Zone Import ID to get.
"""
@abc.abstractmethod
def find_zone_tasks(self, context, criterion=None, marker=None,
def find_zone_imports(self, context, criterion=None, marker=None,
limit=None, sort_key=None, sort_dir=None):
"""
Find Zone Tasks
Find Zone Imports
:param context: RPC Context.
:param criterion: Criteria to filter by.
@ -665,30 +665,30 @@ class Storage(DriverPlugin):
"""
@abc.abstractmethod
def find_zone_task(self, context, criterion):
def find_zone_import(self, context, criterion):
"""
Find a single Zone Task.
Find a single Zone Import.
:param context: RPC Context.
:param criterion: Criteria to filter by.
"""
@abc.abstractmethod
def update_zone_task(self, context, zone_task):
def update_zone_import(self, context, zone_import):
"""
Update a Zone Task
Update a Zone Import
:param context: RPC Context.
:param zone_task: Zone Task to update.
:param zone_import: Zone Import to update.
"""
@abc.abstractmethod
def delete_zone_task(self, context, zone_task_id):
def delete_zone_import(self, context, zone_import_id):
"""
Delete a Zone Task via ID.
Delete a Zone Import via ID.
:param context: RPC Context.
:param zone_task_id: Delete a Zone Task via ID
:param zone_import_id: Delete a Zone Import via ID
"""
def ping(self, context):

View File

@ -1259,42 +1259,45 @@ class SQLAlchemyStorage(sqlalchemy_base.SQLAlchemy, storage_base.Storage):
zone_transfer_accept,
exceptions.ZoneTransferAcceptNotFound)
# Zone Task Methods
def _find_zone_tasks(self, context, criterion, one=False, marker=None,
# Zone Import Methods
def _find_zone_imports(self, context, criterion, one=False, marker=None,
limit=None, sort_key=None, sort_dir=None):
if not criterion:
criterion = {}
criterion['task_type'] = 'IMPORT'
return self._find(
context, tables.zone_tasks, objects.ZoneTask,
objects.ZoneTaskList, exceptions.ZoneTaskNotFound, criterion,
context, tables.zone_tasks, objects.ZoneImport,
objects.ZoneImportList, exceptions.ZoneImportNotFound, criterion,
one, marker, limit, sort_key, sort_dir)
def create_zone_task(self, context, zone_task):
def create_zone_import(self, context, zone_import):
return self._create(
tables.zone_tasks, zone_task, exceptions.DuplicateZoneTask)
tables.zone_tasks, zone_import, exceptions.DuplicateZoneImport)
def get_zone_task(self, context, zone_task_id):
return self._find_zone_tasks(context, {'id': zone_task_id},
def get_zone_import(self, context, zone_import_id):
return self._find_zone_imports(context, {'id': zone_import_id},
one=True)
def find_zone_tasks(self, context, criterion=None, marker=None,
def find_zone_imports(self, context, criterion=None, marker=None,
limit=None, sort_key=None, sort_dir=None):
return self._find_zone_tasks(context, criterion, marker=marker,
return self._find_zone_imports(context, criterion, marker=marker,
limit=limit, sort_key=sort_key,
sort_dir=sort_dir)
def find_zone_task(self, context, criterion):
return self._find_zone_tasks(context, criterion, one=True)
def find_zone_import(self, context, criterion):
return self._find_zone_imports(context, criterion, one=True)
def update_zone_task(self, context, zone_task):
def update_zone_import(self, context, zone_import):
return self._update(
context, tables.zone_tasks, zone_task,
exceptions.DuplicateZoneTask, exceptions.ZoneTaskNotFound)
context, tables.zone_tasks, zone_import,
exceptions.DuplicateZoneImport, exceptions.ZoneImportNotFound)
def delete_zone_task(self, context, zone_task_id):
# Fetch the existing zone_task, we'll need to return it.
zone_task = self._find_zone_tasks(context, {'id': zone_task_id},
def delete_zone_import(self, context, zone_import_id):
# Fetch the existing zone_import, we'll need to return it.
zone_import = self._find_zone_imports(context, {'id': zone_import_id},
one=True)
return self._delete(context, tables.zone_tasks, zone_task,
exceptions.ZoneTaskNotFound)
return self._delete(context, tables.zone_tasks, zone_import,
exceptions.ZoneImportNotFound)
# diagnostics
def ping(self, context):

View File

@ -245,7 +245,7 @@ class TestCase(base.BaseTestCase):
"target_tenant_id": "target_tenant_id"
}]
zone_task_fixtures = [{
zone_import_fixtures = [{
'status': 'PENDING',
'domain_id': None,
'message': None,
@ -528,10 +528,10 @@ class TestCase(base.BaseTestCase):
_values.update(values)
return _values
def get_zone_task_fixture(self, fixture=0, values=None):
def get_zone_import_fixture(self, fixture=0, values=None):
values = values or {}
_values = copy.copy(self.zone_task_fixtures[fixture])
_values = copy.copy(self.zone_import_fixtures[fixture])
_values.update(values)
return _values
@ -678,15 +678,15 @@ class TestCase(base.BaseTestCase):
return self.central_service.create_zone_transfer_accept(
context, objects.ZoneTransferAccept.from_dict(values))
def create_zone_task(self, **kwargs):
def create_zone_import(self, **kwargs):
context = kwargs.pop('context', self.admin_context)
fixture = kwargs.pop('fixture', 0)
zone_task = self.get_zone_task_fixture(fixture=fixture,
zone_import = self.get_zone_import_fixture(fixture=fixture,
values=kwargs)
return self.storage.create_zone_task(
context, objects.ZoneTask.from_dict(zone_task))
return self.storage.create_zone_import(
context, objects.ZoneImport.from_dict(zone_import))
def wait_for_import(self, zone_import_id, errorok=False):
"""

View File

@ -3036,6 +3036,6 @@ class CentralServiceTest(CentralTestCase):
# Fetch the zone_import again, ensuring an exception is raised
self.assertRaises(
exceptions.ZoneTaskNotFound,
exceptions.ZoneImportNotFound,
self.central_service.get_zone_import,
context, zone_import['id'])

View File

@ -2348,14 +2348,14 @@ class StorageTestCase(object):
self.create_pool_attribute(fixture=0)
# Zone Import Tests
def test_create_zone_task(self):
def test_create_zone_import(self):
values = {
'status': 'PENDING',
'task_type': 'IMPORT'
}
result = self.storage.create_zone_task(
self.admin_context, objects.ZoneTask.from_dict(values))
result = self.storage.create_zone_import(
self.admin_context, objects.ZoneImport.from_dict(values))
self.assertIsNotNone(result['id'])
self.assertIsNotNone(result['created_at'])
@ -2365,104 +2365,105 @@ class StorageTestCase(object):
self.assertEqual(result['domain_id'], None)
self.assertEqual(result['message'], None)
def test_find_zone_tasks(self):
def test_find_zone_imports(self):
actual = self.storage.find_zone_tasks(self.admin_context)
actual = self.storage.find_zone_imports(self.admin_context)
self.assertEqual(0, len(actual))
# Create a single ZoneTask
zone_task = self.create_zone_task(fixture=0)
# Create a single ZoneImport
zone_import = self.create_zone_import(fixture=0)
actual = self.storage.find_zone_tasks(self.admin_context)
actual = self.storage.find_zone_imports(self.admin_context)
self.assertEqual(1, len(actual))
self.assertEqual(zone_task['status'], actual[0]['status'])
self.assertEqual(zone_task['message'], actual[0]['message'])
self.assertEqual(zone_task['domain_id'], actual[0]['domain_id'])
self.assertEqual(zone_import['status'], actual[0]['status'])
self.assertEqual(zone_import['message'], actual[0]['message'])
self.assertEqual(zone_import['domain_id'], actual[0]['domain_id'])
def test_find_zone_tasks_paging(self):
# Create 10 ZoneTasks
created = [self.create_zone_task() for i in range(10)]
def test_find_zone_imports_paging(self):
# Create 10 ZoneImports
created = [self.create_zone_import() for i in range(10)]
# Ensure we can page through the results.
self._ensure_paging(created, self.storage.find_zone_tasks)
self._ensure_paging(created, self.storage.find_zone_imports)
def test_find_zone_tasks_with_criterion(self):
zone_task_one = self.create_zone_task(fixture=0)
zone_task_two = self.create_zone_task(fixture=1)
def test_find_zone_imports_with_criterion(self):
zone_import_one = self.create_zone_import(fixture=0)
zone_import_two = self.create_zone_import(fixture=1)
criterion_one = dict(status=zone_task_one['status'])
criterion_one = dict(status=zone_import_one['status'])
results = self.storage.find_zone_tasks(self.admin_context,
results = self.storage.find_zone_imports(self.admin_context,
criterion_one)
self.assertEqual(len(results), 1)
self.assertEqual(results[0]['status'], zone_task_one['status'])
self.assertEqual(results[0]['status'], zone_import_one['status'])
criterion_two = dict(status=zone_task_two['status'])
criterion_two = dict(status=zone_import_two['status'])
results = self.storage.find_zone_tasks(self.admin_context,
results = self.storage.find_zone_imports(self.admin_context,
criterion_two)
self.assertEqual(len(results), 1)
self.assertEqual(results[0]['status'], zone_task_two['status'])
self.assertEqual(results[0]['status'], zone_import_two['status'])
def test_get_zone_task(self):
# Create a zone_task
expected = self.create_zone_task()
actual = self.storage.get_zone_task(self.admin_context,
def test_get_zone_import(self):
# Create a zone_import
expected = self.create_zone_import()
actual = self.storage.get_zone_import(self.admin_context,
expected['id'])
self.assertEqual(actual['status'], expected['status'])
def test_get_zone_task_missing(self):
with testtools.ExpectedException(exceptions.ZoneTaskNotFound):
def test_get_zone_import_missing(self):
with testtools.ExpectedException(exceptions.ZoneImportNotFound):
uuid = '4c8e7f82-3519-4bf7-8940-a66a4480f223'
self.storage.get_zone_task(self.admin_context, uuid)
self.storage.get_zone_import(self.admin_context, uuid)
def test_find_zone_task_criterion_missing(self):
expected = self.create_zone_task()
def test_find_zone_import_criterion_missing(self):
expected = self.create_zone_import()
criterion = dict(status=expected['status'] + "NOT FOUND")
with testtools.ExpectedException(exceptions.ZoneTaskNotFound):
self.storage.find_zone_task(self.admin_context, criterion)
with testtools.ExpectedException(exceptions.ZoneImportNotFound):
self.storage.find_zone_import(self.admin_context, criterion)
def test_update_zone_task(self):
# Create a zone_task
zone_task = self.create_zone_task(status='PENDING', task_type='IMPORT')
def test_update_zone_import(self):
# Create a zone_import
zone_import = self.create_zone_import(status='PENDING',
task_type='IMPORT')
# Update the zone_task
zone_task.status = 'COMPLETE'
# Update the zone_import
zone_import.status = 'COMPLETE'
# Update storage
zone_task = self.storage.update_zone_task(self.admin_context,
zone_task)
zone_import = self.storage.update_zone_import(self.admin_context,
zone_import)
# Verify the new value
self.assertEqual('COMPLETE', zone_task.status)
self.assertEqual('COMPLETE', zone_import.status)
# Ensure the version column was incremented
self.assertEqual(2, zone_task.version)
self.assertEqual(2, zone_import.version)
def test_update_zone_task_missing(self):
zone_task = objects.ZoneTask(
def test_update_zone_import_missing(self):
zone_import = objects.ZoneImport(
id='486f9cbe-b8b6-4d8c-8275-1a6e47b13e00')
with testtools.ExpectedException(exceptions.ZoneTaskNotFound):
self.storage.update_zone_task(self.admin_context, zone_task)
with testtools.ExpectedException(exceptions.ZoneImportNotFound):
self.storage.update_zone_import(self.admin_context, zone_import)
def test_delete_zone_task(self):
# Create a zone_task
zone_task = self.create_zone_task()
def test_delete_zone_import(self):
# Create a zone_import
zone_import = self.create_zone_import()
# Delete the zone_task
self.storage.delete_zone_task(self.admin_context, zone_task['id'])
# Delete the zone_import
self.storage.delete_zone_import(self.admin_context, zone_import['id'])
# Verify that it's deleted
with testtools.ExpectedException(exceptions.ZoneTaskNotFound):
self.storage.get_zone_task(self.admin_context, zone_task['id'])
with testtools.ExpectedException(exceptions.ZoneImportNotFound):
self.storage.get_zone_import(self.admin_context, zone_import['id'])
def test_delete_zone_task_missing(self):
with testtools.ExpectedException(exceptions.ZoneTaskNotFound):
def test_delete_zone_import_missing(self):
with testtools.ExpectedException(exceptions.ZoneImportNotFound):
uuid = 'cac1fc02-79b2-4e62-a1a4-427b6790bbe6'
self.storage.delete_zone_task(self.admin_context, uuid)
self.storage.delete_zone_import(self.admin_context, uuid)