diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index d27d81f61f3..9f5cf045866 100755 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -4338,6 +4338,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa VolumeTO volume; StorageFilerTO filerTo; Set mountedDatastoresAtSource = new HashSet(); + List volumeToList = new ArrayList(); + Map volumeDeviceKey = new HashMap(); Map volToFiler = cmd.getVolumeToFiler(); String tgtHost = cmd.getTargetHost(); @@ -4402,9 +4404,11 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa volume.getPath() + ".vmdk"); diskLocator = new VirtualMachineRelocateSpecDiskLocator(); diskLocator.setDatastore(morDsAtSource); - diskLocator.setDiskId(getVirtualDiskInfo(vmMo, volume.getPath() + ".vmdk")); + int diskId = getVirtualDiskInfo(vmMo, volume.getPath() + ".vmdk"); + diskLocator.setDiskId(diskId); diskLocators.add(diskLocator); + volumeDeviceKey.put(volume.getId(), diskId); } relocateSpec.getDisk().addAll(diskLocators); @@ -4436,6 +4440,22 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa s_logger.debug("Successfully migrated storage of VM " + vmName + " to target datastore(s)"); } + // Update and return volume path for every disk because that could have changed after migration + for (Entry entry : volToFiler.entrySet()) { + volume = entry.getKey(); + long volumeId = volume.getId(); + VirtualDisk[] disks = vmMo.getAllDiskDevice(); + for (VirtualDisk disk : disks) { + if (volumeDeviceKey.get(volumeId) == disk.getKey()) { + VolumeObjectTO newVol = new VolumeObjectTO(); + newVol.setId(volumeId); + newVol.setPath(vmMo.getVmdkFileBaseName(disk)); + volumeToList.add(newVol); + break; + } + } + } + // Change host ManagedObjectReference morPool = tgtHyperHost.getHyperHostOwnerResourcePool(); if (!vmMo.migrate(morPool, tgtHyperHost.getMor())) { @@ -4445,7 +4465,6 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } state = State.Stopping; - List volumeToList = null; return new MigrateWithStorageAnswer(cmd, volumeToList); } catch (Throwable e) { if (e instanceof RemoteException) { @@ -4552,7 +4571,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } private int getVirtualDiskInfo(VirtualMachineMO vmMo, String srcDiskName) throws Exception { - Pair deviceInfo = vmMo.getDiskDevice(srcDiskName, false); + Pair deviceInfo = vmMo.getDiskDevice(srcDiskName, true); if(deviceInfo == null) { throw new Exception("No such disk device: " + srcDiskName); } diff --git a/plugins/hypervisors/vmware/src/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java b/plugins/hypervisors/vmware/src/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java index 446093f99a4..3c4d704138b 100644 --- a/plugins/hypervisors/vmware/src/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java +++ b/plugins/hypervisors/vmware/src/org/apache/cloudstack/storage/motion/VmwareStorageMotionStrategy.java @@ -20,6 +20,7 @@ package org.apache.cloudstack.storage.motion; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.inject.Inject; @@ -33,6 +34,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.to.VolumeObjectTO; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -143,7 +145,7 @@ public class VmwareStorageMotionStrategy implements DataMotionStrategy { ". " + migrateWithStorageAnswer.getDetails()); } else { // Update the volume details after migration. - updateVolumesAfterMigration(volumeToPool); + updateVolumesAfterMigration(volumeToPool, migrateWithStorageAnswer.getVolumeTos()); } s_logger.debug("Storage migration of VM " + vm.getInstanceName() + " completed successfully. Migrated to host " + destHost.getName()); @@ -178,7 +180,7 @@ public class VmwareStorageMotionStrategy implements DataMotionStrategy { ". " + answer.getDetails()); } else { // Update the volume details after migration. - updateVolumesAfterMigration(volumeToPool); + updateVolumesAfterMigration(volumeToPool, answer.getVolumeTos()); } return answer; @@ -188,20 +190,28 @@ public class VmwareStorageMotionStrategy implements DataMotionStrategy { } } - private void updateVolumesAfterMigration(Map volumeToPool) { + private void updateVolumesAfterMigration(Map volumeToPool, List volumeTos) { for (Map.Entry entry : volumeToPool.entrySet()) { + boolean updated = false; VolumeInfo volume = entry.getKey(); StoragePool pool = (StoragePool)entry.getValue(); - - VolumeVO volumeVO = volDao.findById(volume.getId()); - Long oldPoolId = volumeVO.getPoolId(); - volumeVO.setLastPoolId(oldPoolId); - volumeVO.setFolder(pool.getPath()); - volumeVO.setPodId(pool.getPodId()); - volumeVO.setPoolId(pool.getId()); - - volDao.update(volume.getId(), volumeVO); - s_logger.debug("Volume path was successfully updated for volume " + volume.getName() + " after it was migrated."); + for (VolumeObjectTO volumeTo : volumeTos) { + if (volume.getId() == volumeTo.getId()) { + VolumeVO volumeVO = volDao.findById(volume.getId()); + Long oldPoolId = volumeVO.getPoolId(); + volumeVO.setPath(volumeTo.getPath()); + volumeVO.setLastPoolId(oldPoolId); + volumeVO.setFolder(pool.getPath()); + volumeVO.setPodId(pool.getPodId()); + volumeVO.setPoolId(pool.getId()); + volDao.update(volume.getId(), volumeVO); + updated = true; + break; + } + } + if (!updated) { + s_logger.error("Volume path wasn't updated for volume " + volume + " after it was migrated."); + } } } }