From f6b66b94f0789bc1a8bb0aa64ae3aaa9e2b9ea16 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Wed, 7 Aug 2013 19:11:28 -0700 Subject: [PATCH] CLOUDSTACK-4108: fix create template from snapshot for vmware& s3 --- .../storage/resource/VmwareStorageProcessor.java | 14 +++++++++++--- .../VmwareStorageSubsystemCommandHandler.java | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java index 81783406889..c4d6119aba8 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -780,9 +780,17 @@ public class VmwareStorageProcessor implements StorageProcessor { private Ternary createTemplateFromSnapshot(String installPath, String templateUniqueName, String secStorageUrl, String snapshotPath, Long templateId) throws Exception { //Snapshot path is decoded in this form: /snapshots/account/volumeId/uuid/uuid - String[] tokens = snapshotPath.split(File.separator); - String backupSSUuid = tokens[tokens.length - 1]; - String snapshotFolder = StringUtils.join(tokens, File.separator, 0, tokens.length -1); + String backupSSUuid; + String snapshotFolder; + if (snapshotPath.endsWith(".ova")) { + int index = snapshotPath.lastIndexOf(File.separator); + backupSSUuid = snapshotPath.substring(index + 1).replace(".ova", ""); + snapshotFolder = snapshotPath.substring(0, index); + } else { + String[] tokens = snapshotPath.split(File.separator); + backupSSUuid = tokens[tokens.length - 1]; + snapshotFolder = StringUtils.join(tokens, File.separator, 0, tokens.length -1); + } String secondaryMountPoint = mountService.getMountPoint(secStorageUrl); String installFullPath = secondaryMountPoint + "/" + installPath; diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java index 7d3c888fad6..f4a7db03bd4 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageSubsystemCommandHandler.java @@ -30,6 +30,7 @@ import com.cloud.storage.DataStoreRole; import org.apache.cloudstack.storage.command.CopyCmdAnswer; import org.apache.cloudstack.storage.command.CopyCommand; import org.apache.cloudstack.storage.to.SnapshotObjectTO; +import org.apache.cloudstack.storage.to.TemplateObjectTO; import org.apache.cloudstack.storage.to.VolumeObjectTO; import java.io.File; @@ -87,6 +88,19 @@ public class VmwareStorageSubsystemCommandHandler extends StorageSubsystemComman String name = path.substring(index + 1); storageManager.createOva(parentPath + File.separator + path, name); vol.setPath(path + File.separator + name + ".ova"); + } else if (srcData.getObjectType() == DataObjectType.SNAPSHOT && destData.getObjectType() == DataObjectType.TEMPLATE) { + //create template from snapshot on src at first, then copy it to s3 + TemplateObjectTO cacheTemplate = (TemplateObjectTO)destData; + cacheTemplate.setDataStore(srcDataStore); + CopyCmdAnswer answer = (CopyCmdAnswer)processor.createTemplateFromSnapshot(cmd); + if (!answer.getResult()) { + return answer; + } + cacheTemplate.setDataStore(destDataStore); + TemplateObjectTO template = (TemplateObjectTO)answer.getNewData(); + template.setDataStore(srcDataStore); + CopyCommand newCmd = new CopyCommand(template, destData, cmd.getWait(), cmd.executeInSequence()); + return storageResource.defaultAction(newCmd); } needDelegation = true; }