Skip to content

Commit 0926bf5

Browse files
author
Likitha Shetty
committed
CLOUDSTACK-6146. [VMware] [ESXi 5.5] Live storage migration of an already migrated volume fails
In vCenter 5.5, once a volume is migrated the VMDKs are renamed to match the name of the VM. If a volume has been renamed upon migration update its volumePath to that of the new disk filename. Conflicts: plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
1 parent b484b48 commit 0926bf5

2 files changed

Lines changed: 25 additions & 8 deletions

File tree

plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3163,10 +3163,12 @@ private Answer execute(MigrateVolumeCommand cmd) {
31633163
throw new Exception(msg);
31643164
}
31653165

3166-
VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(new DatastoreMO(srcHyperHost.getContext(), morDs), vmName, volumePath + ".vmdk");
3166+
DatastoreMO targetDsMo = new DatastoreMO(srcHyperHost.getContext(), morDs);
3167+
String fullVolumePath = VmwareStorageLayoutHelper.getVmwareDatastorePathFromVmdkFileName(targetDsMo, vmName, volumePath + ".vmdk");
3168+
int diskId = getVirtualDiskInfo(vmMo, volumePath + ".vmdk");
31673169
diskLocator = new VirtualMachineRelocateSpecDiskLocator();
31683170
diskLocator.setDatastore(morDs);
3169-
diskLocator.setDiskId(getVirtualDiskInfo(vmMo, volumePath + ".vmdk"));
3171+
diskLocator.setDiskId(diskId);
31703172

31713173
diskLocators.add(diskLocator);
31723174
relocateSpec.getDisk().add(diskLocator);
@@ -3178,6 +3180,15 @@ private Answer execute(MigrateVolumeCommand cmd) {
31783180
s_logger.debug("Successfully migrated volume " + volumePath + " to target datastore " + tgtDsName);
31793181
}
31803182

3183+
// Update and return volume path because that could have changed after migration
3184+
if (!targetDsMo.fileExists(fullVolumePath)) {
3185+
VirtualDisk[] disks = vmMo.getAllDiskDevice();
3186+
for (VirtualDisk disk : disks)
3187+
if (disk.getKey() == diskId) {
3188+
volumePath = vmMo.getVmdkFileBaseName(disk);
3189+
}
3190+
}
3191+
31813192
return new MigrateVolumeAnswer(cmd, true, null, volumePath);
31823193
} catch (Exception e) {
31833194
String msg = "Catch Exception " + e.getClass().getName() + " due to " + e.toString();

vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1800,17 +1800,23 @@ public List<String> getVmdkFileBaseNames() throws Exception {
18001800
VirtualDevice[] devices = getAllDiskDevice();
18011801
for(VirtualDevice device : devices) {
18021802
if(device instanceof VirtualDisk) {
1803-
VirtualDeviceBackingInfo backingInfo = ((VirtualDisk)device).getBacking();
1804-
if(backingInfo instanceof VirtualDiskFlatVer2BackingInfo) {
1805-
VirtualDiskFlatVer2BackingInfo diskBackingInfo = (VirtualDiskFlatVer2BackingInfo)backingInfo;
1806-
DatastoreFile dsBackingFile = new DatastoreFile(diskBackingInfo.getFileName());
1807-
vmdkFileBaseNames.add(dsBackingFile.getFileBaseName());
1808-
}
1803+
vmdkFileBaseNames.add(getVmdkFileBaseName((VirtualDisk)device));
18091804
}
18101805
}
18111806
return vmdkFileBaseNames;
18121807
}
18131808

1809+
public String getVmdkFileBaseName(VirtualDisk disk) throws Exception {
1810+
String vmdkFileBaseName = null;
1811+
VirtualDeviceBackingInfo backingInfo = disk.getBacking();
1812+
if(backingInfo instanceof VirtualDiskFlatVer2BackingInfo) {
1813+
VirtualDiskFlatVer2BackingInfo diskBackingInfo = (VirtualDiskFlatVer2BackingInfo)backingInfo;
1814+
DatastoreFile dsBackingFile = new DatastoreFile(diskBackingInfo.getFileName());
1815+
vmdkFileBaseName = dsBackingFile.getFileBaseName();
1816+
}
1817+
return vmdkFileBaseName;
1818+
}
1819+
18141820
// this method relies on un-offical VMware API
18151821
@Deprecated
18161822
public void moveAllVmDiskFiles(DatastoreMO destDsMo, String destDsDir, boolean followDiskChain) throws Exception {

0 commit comments

Comments
 (0)