From c2e9be8d311c2ec6534c311df037b8be7e7756d1 Mon Sep 17 00:00:00 2001 From: Min Chen Date: Fri, 26 Apr 2013 16:45:11 -0700 Subject: [PATCH] Handle DeleteVolumeCommand for S3. --- .../api/storage/DeleteVolumeCommand.java | 13 ++- .../resource/NfsSecondaryStorageResource.java | 100 +++++++++++------- .../CloudStackImageStoreDriverImpl.java | 2 +- .../driver/S3ImageStoreDriverImpl.java | 2 +- .../driver/SwiftImageStoreDriverImpl.java | 2 +- .../com/cloud/storage/StorageManagerImpl.java | 2 +- 6 files changed, 76 insertions(+), 45 deletions(-) diff --git a/api/src/com/cloud/agent/api/storage/DeleteVolumeCommand.java b/api/src/com/cloud/agent/api/storage/DeleteVolumeCommand.java index 949af010423..eb17529e261 100755 --- a/api/src/com/cloud/agent/api/storage/DeleteVolumeCommand.java +++ b/api/src/com/cloud/agent/api/storage/DeleteVolumeCommand.java @@ -16,14 +16,17 @@ // under the License. package com.cloud.agent.api.storage; +import com.cloud.agent.api.to.DataStoreTO; + public class DeleteVolumeCommand extends ssCommand { + private DataStoreTO store; private String volumePath; public DeleteVolumeCommand() { } - public DeleteVolumeCommand(String secUrl, String volumePath) { - this.setSecUrl(secUrl); + public DeleteVolumeCommand(DataStoreTO store, String volumePath) { + this.store = store; this.volumePath = volumePath; } @@ -35,4 +38,10 @@ public class DeleteVolumeCommand extends ssCommand { public String getVolumePath() { return volumePath; } + + public DataStoreTO getDataStore() { + return store; + } + + } diff --git a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java index 5218933f32a..0806dcfa685 100755 --- a/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java +++ b/core/src/com/cloud/storage/resource/NfsSecondaryStorageResource.java @@ -1376,7 +1376,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S S3Utils.deleteDirectory(s3, bucket, path); return new Answer(cmd, true, String.format("Deleted template %1%s from bucket %2$s.", path, bucket)); } catch (Exception e) { - final String errorMessage = String.format("Failed to delete templaet %1$s from bucket %2$s due to the following error: %3$s", + final String errorMessage = String.format("Failed to delete template %1$s from bucket %2$s due to the following error: %3$s", path, bucket, e.getMessage()); s_logger.error(errorMessage, e); return new Answer(cmd, false, errorMessage); @@ -1405,49 +1405,71 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S } protected Answer execute(final DeleteVolumeCommand cmd) { - String relativeVolumePath = cmd.getVolumePath(); - String parent = getRootDir(cmd); + DataStoreTO dstore = cmd.getDataStore(); + if (dstore instanceof NfsTO) { + NfsTO nfs = (NfsTO) dstore; + String relativeVolumePath = cmd.getVolumePath(); + String parent = getRootDir(nfs.getUrl()); - if (relativeVolumePath.startsWith(File.separator)) { - relativeVolumePath = relativeVolumePath.substring(1); - } - - if (!parent.endsWith(File.separator)) { - parent += File.separator; - } - String absoluteVolumePath = parent + relativeVolumePath; - File tmpltParent = new File(absoluteVolumePath).getParentFile(); - String details = null; - if (!tmpltParent.exists()) { - details = "volume parent directory " + tmpltParent.getName() + " doesn't exist"; - s_logger.debug(details); - return new Answer(cmd, true, details); - } - File[] tmpltFiles = tmpltParent.listFiles(); - if (tmpltFiles == null || tmpltFiles.length == 0) { - details = "No files under volume parent directory " + tmpltParent.getName(); - s_logger.debug(details); - } else { - boolean found = false; - for (File f : tmpltFiles) { - if (!found && f.getName().equals("volume.properties")) { - found = true; - } - if (!f.delete()) { - return new Answer(cmd, false, "Unable to delete file " + f.getName() + " under Volume path " + relativeVolumePath); - } + if (relativeVolumePath.startsWith(File.separator)) { + relativeVolumePath = relativeVolumePath.substring(1); } - if (!found) { - details = "Can not find volume.properties under " + tmpltParent.getName(); + + if (!parent.endsWith(File.separator)) { + parent += File.separator; + } + String absoluteVolumePath = parent + relativeVolumePath; + File tmpltParent = new File(absoluteVolumePath).getParentFile(); + String details = null; + if (!tmpltParent.exists()) { + details = "volume parent directory " + tmpltParent.getName() + " doesn't exist"; s_logger.debug(details); + return new Answer(cmd, true, details); } + File[] tmpltFiles = tmpltParent.listFiles(); + if (tmpltFiles == null || tmpltFiles.length == 0) { + details = "No files under volume parent directory " + tmpltParent.getName(); + s_logger.debug(details); + } else { + boolean found = false; + for (File f : tmpltFiles) { + if (!found && f.getName().equals("volume.properties")) { + found = true; + } + if (!f.delete()) { + return new Answer(cmd, false, "Unable to delete file " + f.getName() + " under Volume path " + relativeVolumePath); + } + } + if (!found) { + details = "Can not find volume.properties under " + tmpltParent.getName(); + s_logger.debug(details); + } + } + if (!tmpltParent.delete()) { + details = "Unable to delete directory " + tmpltParent.getName() + " under Volume path " + relativeVolumePath; + s_logger.debug(details); + return new Answer(cmd, false, details); + } + return new Answer(cmd, true, null); + } else if (dstore instanceof S3TO) { + final S3TO s3 = (S3TO) dstore; + final String path = cmd.getVolumePath(); + final String bucket = s3.getBucketName(); + try { + S3Utils.deleteDirectory(s3, bucket, path); + return new Answer(cmd, true, String.format("Deleted volume %1%s from bucket %2$s.", path, bucket)); + } catch (Exception e) { + final String errorMessage = String.format("Failed to delete volume %1$s from bucket %2$s due to the following error: %3$s", path, + bucket, e.getMessage()); + s_logger.error(errorMessage, e); + return new Answer(cmd, false, errorMessage); + } + } else if (dstore instanceof SwiftTO) { + return new Answer(cmd, false, "Swift is not currently support DeleteVolumeCommand"); + } else { + return new Answer(cmd, false, "Unsupported image data store: " + dstore); } - if (!tmpltParent.delete()) { - details = "Unable to delete directory " + tmpltParent.getName() + " under Volume path " + relativeVolumePath; - s_logger.debug(details); - return new Answer(cmd, false, details); - } - return new Answer(cmd, true, null); + } Answer execute(CleanupSnapshotBackupCommand cmd) { 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 d3f6916c6a2..1f29dadd74d 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 @@ -237,7 +237,7 @@ public class CloudStackImageStoreDriverImpl implements ImageStoreDriver { DataStore store = this._dataStoreMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image); EndPoint ep = _epSelector.select(store); DeleteVolumeCommand dtCommand = new DeleteVolumeCommand( - store.getUri(), volumeStore.getInstallPath()); + store.getTO(), volumeStore.getInstallPath()); Answer answer = ep.sendMessage(dtCommand); if (answer == null || !answer.getResult()) { s_logger.debug("Failed to delete " 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 4844167753c..ecd89c74e60 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 @@ -195,7 +195,7 @@ public class S3ImageStoreDriverImpl implements ImageStoreDriver { DataStore store = this._dataStoreMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image); EndPoint ep = _epSelector.select(store); DeleteVolumeCommand dtCommand = new DeleteVolumeCommand( - store.getUri(), volumeStore.getInstallPath()); + store.getTO(), volumeStore.getInstallPath()); Answer answer = ep.sendMessage(dtCommand); if (answer == null || !answer.getResult()) { s_logger.debug("Failed to delete " 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 4fc69484f0f..ddc97866e54 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 @@ -189,7 +189,7 @@ public class SwiftImageStoreDriverImpl implements ImageStoreDriver { DataStore store = this._dataStoreMgr.getDataStore(volumeStore.getDataStoreId(), DataStoreRole.Image); EndPoint ep = _epSelector.select(store); DeleteVolumeCommand dtCommand = new DeleteVolumeCommand( - store.getUri(), volumeStore.getInstallPath()); + store.getTO(), volumeStore.getInstallPath()); Answer answer = ep.sendMessage(dtCommand); if (answer == null || !answer.getResult()) { s_logger.debug("Failed to delete " diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 60ccc2be6fc..ea737b86f5a 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -1325,7 +1325,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C if (installPath != null) { EndPoint ep = _epSelector.select(store); - DeleteVolumeCommand cmd = new DeleteVolumeCommand(store.getUri(), destroyedStoreVO.getInstallPath()); + DeleteVolumeCommand cmd = new DeleteVolumeCommand(store.getTO(), destroyedStoreVO.getInstallPath()); Answer answer = ep.sendMessage(cmd); if (answer == null || !answer.getResult()) { s_logger.debug("Failed to delete " + destroyedStoreVO + " due to "