From 2473ceb111804a2c9d5394919dac73e73669eb0c Mon Sep 17 00:00:00 2001 From: Min Chen Date: Thu, 30 May 2013 17:39:44 -0700 Subject: [PATCH] Have different callback for create template and create volume since they will update different tables. --- .../CloudStackImageStoreDriverImpl.java | 50 +++++++++++++++++-- .../driver/S3ImageStoreDriverImpl.java | 47 +++++++++++++++-- .../driver/SwiftImageStoreDriverImpl.java | 49 ++++++++++++++++-- 3 files changed, 134 insertions(+), 12 deletions(-) diff --git a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java index 52595a1bc94..862af194df4 100644 --- a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java +++ b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java @@ -154,17 +154,16 @@ public class CloudStackImageStoreDriverImpl implements ImageStoreDriver { AsyncCallbackDispatcher caller = AsyncCallbackDispatcher .create(this); caller.setContext(context); - caller.setCallback(caller.getTarget().createAsyncCallback(null, null)); - if (data.getType() == DataObjectType.TEMPLATE) { + caller.setCallback(caller.getTarget().createTemplateAsyncCallback(null, null)); _downloadMonitor.downloadTemplateToStorage(data, caller); } else if (data.getType() == DataObjectType.VOLUME) { + caller.setCallback(caller.getTarget().createVolumeAsyncCallback(null, null)); _downloadMonitor.downloadVolumeToStorage(data, caller); } } - protected Void createAsyncCallback( - AsyncCallbackDispatcher callback, + protected Void createTemplateAsyncCallback(AsyncCallbackDispatcher callback, CreateContext context) { DownloadAnswer answer = callback.getResult(); DataObject obj = context.data; @@ -205,7 +204,48 @@ public class CloudStackImageStoreDriverImpl implements ImageStoreDriver { templateDao.update(obj.getId(), templateDaoBuilder); } - CreateCmdResult result = new CreateCmdResult(null, answer); + CreateCmdResult result = new CreateCmdResult(null, null); + caller.complete(result); + } + return null; + } + + protected Void createVolumeAsyncCallback(AsyncCallbackDispatcher callback, + CreateContext context) { + DownloadAnswer answer = callback.getResult(); + DataObject obj = context.data; + DataStore store = obj.getDataStore(); + + VolumeDataStoreVO volStoreVO = _volumeStoreDao.findByStoreVolume(store.getId(), obj.getId()); + if (volStoreVO != null) { + VolumeDataStoreVO updateBuilder = _volumeStoreDao.createForUpdate(); + updateBuilder.setDownloadPercent(answer.getDownloadPct()); + updateBuilder.setDownloadState(answer.getDownloadStatus()); + updateBuilder.setLastUpdated(new Date()); + updateBuilder.setErrorString(answer.getErrorString()); + updateBuilder.setJobId(answer.getJobId()); + updateBuilder.setLocalDownloadPath(answer.getDownloadPath()); + updateBuilder.setInstallPath(answer.getInstallPath()); + updateBuilder.setSize(answer.getTemplateSize()); + updateBuilder.setPhysicalSize(answer.getTemplatePhySicalSize()); + _volumeStoreDao.update(volStoreVO.getId(), updateBuilder); + // update size in volume table + VolumeVO volUpdater = volumeDao.createForUpdate(); + volUpdater.setSize(answer.getTemplateSize()); + volumeDao.update(obj.getId(), volUpdater); + } + + AsyncCompletionCallback caller = context.getParentCallback(); + + if (answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.DOWNLOAD_ERROR + || answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.ABANDONED + || answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.UNKNOWN) { + CreateCmdResult result = new CreateCmdResult(null, null); + result.setSuccess(false); + result.setResult(answer.getErrorString()); + caller.complete(result); + } else if (answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) { + CreateCmdResult result = new CreateCmdResult(null, null); caller.complete(result); } return null; diff --git a/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/driver/S3ImageStoreDriverImpl.java b/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/driver/S3ImageStoreDriverImpl.java index 0a2a84064e7..6f500674c8a 100644 --- a/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/driver/S3ImageStoreDriverImpl.java +++ b/plugins/storage/image/s3/src/org/apache/cloudstack/storage/datastore/driver/S3ImageStoreDriverImpl.java @@ -173,11 +173,11 @@ public class S3ImageStoreDriverImpl implements ImageStoreDriver { CreateContext context = new CreateContext(callback, data); AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); caller.setContext(context); - caller.setCallback(caller.getTarget().createAsyncCallback(null, null)); - if (data.getType() == DataObjectType.TEMPLATE) { + caller.setCallback(caller.getTarget().createTemplateAsyncCallback(null, null)); _downloadMonitor.downloadTemplateToStorage(data, caller); } else if (data.getType() == DataObjectType.VOLUME) { + caller.setCallback(caller.getTarget().createVolumeAsyncCallback(null, null)); _downloadMonitor.downloadVolumeToStorage(data, caller); } } @@ -214,7 +214,7 @@ public class S3ImageStoreDriverImpl implements ImageStoreDriver { } } - protected Void createAsyncCallback(AsyncCallbackDispatcher callback, + protected Void createTemplateAsyncCallback(AsyncCallbackDispatcher callback, CreateContext context) { DownloadAnswer answer = callback.getResult(); DataObject obj = context.data; @@ -261,6 +261,47 @@ public class S3ImageStoreDriverImpl implements ImageStoreDriver { return null; } + protected Void createVolumeAsyncCallback(AsyncCallbackDispatcher callback, + CreateContext context) { + DownloadAnswer answer = callback.getResult(); + DataObject obj = context.data; + DataStore store = obj.getDataStore(); + + VolumeDataStoreVO volStoreVO = _volumeStoreDao.findByStoreVolume(store.getId(), obj.getId()); + if (volStoreVO != null) { + VolumeDataStoreVO updateBuilder = _volumeStoreDao.createForUpdate(); + updateBuilder.setDownloadPercent(answer.getDownloadPct()); + updateBuilder.setDownloadState(answer.getDownloadStatus()); + updateBuilder.setLastUpdated(new Date()); + updateBuilder.setErrorString(answer.getErrorString()); + updateBuilder.setJobId(answer.getJobId()); + updateBuilder.setLocalDownloadPath(answer.getDownloadPath()); + updateBuilder.setInstallPath(answer.getInstallPath()); + updateBuilder.setSize(answer.getTemplateSize()); + updateBuilder.setPhysicalSize(answer.getTemplatePhySicalSize()); + _volumeStoreDao.update(volStoreVO.getId(), updateBuilder); + // update size in volume table + VolumeVO volUpdater = volumeDao.createForUpdate(); + volUpdater.setSize(answer.getTemplateSize()); + volumeDao.update(obj.getId(), volUpdater); + } + + AsyncCompletionCallback caller = context.getParentCallback(); + + if (answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.DOWNLOAD_ERROR + || answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.ABANDONED + || answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.UNKNOWN) { + CreateCmdResult result = new CreateCmdResult(null, null); + result.setSuccess(false); + result.setResult(answer.getErrorString()); + caller.complete(result); + } else if (answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) { + CreateCmdResult result = new CreateCmdResult(null, null); + caller.complete(result); + } + return null; + } + private void deleteTemplate(DataObject data, AsyncCompletionCallback callback) { TemplateObject templateObj = (TemplateObject) data; VMTemplateVO template = templateObj.getImage(); diff --git a/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/driver/SwiftImageStoreDriverImpl.java b/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/driver/SwiftImageStoreDriverImpl.java index 71b18d557cc..e5d40d12982 100644 --- a/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/driver/SwiftImageStoreDriverImpl.java +++ b/plugins/storage/image/swift/src/org/apache/cloudstack/storage/datastore/driver/SwiftImageStoreDriverImpl.java @@ -172,16 +172,16 @@ public class SwiftImageStoreDriverImpl implements ImageStoreDriver { AsyncCallbackDispatcher caller = AsyncCallbackDispatcher .create(this); caller.setContext(context); - caller.setCallback(caller.getTarget().createAsyncCallback(null, null)); - if (data.getType() == DataObjectType.TEMPLATE) { + caller.setCallback(caller.getTarget().createTemplateAsyncCallback(null, null)); _downloadMonitor.downloadTemplateToStorage(data, caller); } else if (data.getType() == DataObjectType.VOLUME) { + caller.setCallback(caller.getTarget().createVolumeAsyncCallback(null, null)); _downloadMonitor.downloadVolumeToStorage(data, caller); } } - protected Void createAsyncCallback(AsyncCallbackDispatcher callback, + protected Void createTemplateAsyncCallback(AsyncCallbackDispatcher callback, CreateContext context) { DownloadAnswer answer = callback.getResult(); DataObject obj = context.data; @@ -212,7 +212,7 @@ public class SwiftImageStoreDriverImpl implements ImageStoreDriver { || answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.ABANDONED || answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.UNKNOWN) { CreateCmdResult result = new CreateCmdResult(null, null); - // result.setSucess(false); + result.setSuccess(false); result.setResult(answer.getErrorString()); caller.complete(result); } else if (answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) { @@ -228,6 +228,47 @@ public class SwiftImageStoreDriverImpl implements ImageStoreDriver { return null; } + protected Void createVolumeAsyncCallback(AsyncCallbackDispatcher callback, + CreateContext context) { + DownloadAnswer answer = callback.getResult(); + DataObject obj = context.data; + DataStore store = obj.getDataStore(); + + VolumeDataStoreVO volStoreVO = _volumeStoreDao.findByStoreVolume(store.getId(), obj.getId()); + if (volStoreVO != null) { + VolumeDataStoreVO updateBuilder = _volumeStoreDao.createForUpdate(); + updateBuilder.setDownloadPercent(answer.getDownloadPct()); + updateBuilder.setDownloadState(answer.getDownloadStatus()); + updateBuilder.setLastUpdated(new Date()); + updateBuilder.setErrorString(answer.getErrorString()); + updateBuilder.setJobId(answer.getJobId()); + updateBuilder.setLocalDownloadPath(answer.getDownloadPath()); + updateBuilder.setInstallPath(answer.getInstallPath()); + updateBuilder.setSize(answer.getTemplateSize()); + updateBuilder.setPhysicalSize(answer.getTemplatePhySicalSize()); + _volumeStoreDao.update(volStoreVO.getId(), updateBuilder); + // update size in volume table + VolumeVO volUpdater = volumeDao.createForUpdate(); + volUpdater.setSize(answer.getTemplateSize()); + volumeDao.update(obj.getId(), volUpdater); + } + + AsyncCompletionCallback caller = context.getParentCallback(); + + if (answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.DOWNLOAD_ERROR + || answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.ABANDONED + || answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.UNKNOWN) { + CreateCmdResult result = new CreateCmdResult(null, null); + result.setSuccess(false); + result.setResult(answer.getErrorString()); + caller.complete(result); + } else if (answer.getDownloadStatus() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) { + CreateCmdResult result = new CreateCmdResult(null, null); + caller.complete(result); + } + return null; + } + private void deleteVolume(DataObject data, AsyncCompletionCallback callback) { // TODO Auto-generated method stub VolumeVO vol = volumeDao.findById(data.getId());