From 7116268f33a5576f2eb80dffc921918021fd510f Mon Sep 17 00:00:00 2001 From: Likitha Shetty Date: Fri, 25 Oct 2013 15:39:33 +0530 Subject: [PATCH] CLOUDSTACK-4946. VM Restore with template id/Volatile VM feature doesnt work on VMware When a ROOT volume is created from base template, if a folder already exists for the ROOT volume's VM then replace the old ROOT disk files with the new one. --- .../resource/VmwareStorageProcessor.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 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 53bd14407d0..71ba4e9ff87 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -345,11 +345,6 @@ public class VmwareStorageProcessor implements StorageProcessor { vmMo.createDisk(volumeDatastorePath, (int) (volume.getSize() / (1024L * 1024L)), morDatastore, -1); vmMo.detachDisk(volumeDatastorePath, false); } - - VolumeObjectTO newVol = new VolumeObjectTO(); - newVol.setPath(vmdkName); - newVol.setSize(volume.getSize()); - return new CopyCmdAnswer(newVol); } finally { vmMo.detachAllDisks(); @@ -383,11 +378,19 @@ public class VmwareStorageProcessor implements StorageProcessor { String srcFile = dsMo.getDatastorePath(vmdkName, true); dsMo.deleteFile(srcFile, dcMo.getMor(), true); - VolumeObjectTO newVol = new VolumeObjectTO(); - newVol.setPath(vmdkName); - newVol.setSize(volume.getSize()); - return new CopyCmdAnswer(newVol); } + // restoreVM - move the new ROOT disk into corresponding VM folder + String vmInternalCSName = volume.getVmName(); + if (dsMo.folderExists(String.format("[%s]", dsMo.getName()), vmInternalCSName)) { + String oldRootDisk = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(dsMo, vmInternalCSName, vmdkName); + if (oldRootDisk != null) + VmwareStorageLayoutHelper.syncVolumeToVmDefaultFolder(dcMo, vmInternalCSName, dsMo, vmdkName); + } + + VolumeObjectTO newVol = new VolumeObjectTO(); + newVol.setPath(vmdkName); + newVol.setSize(volume.getSize()); + return new CopyCmdAnswer(newVol); } catch (Throwable e) { if (e instanceof RemoteException) { s_logger.warn("Encounter remote exception to vCenter, invalidate VMware session context");