diff --git a/check_diff b/check_diff new file mode 100644 index 00000000000..78b27ecd755 --- /dev/null +++ b/check_diff @@ -0,0 +1,103 @@ +diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +index 47d3013f22..2dbf257fb2 100644 +--- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java ++++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +@@ -5551,11 +5551,11 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir + throw new InvalidParameterValueException("Unable to find the VM by id=" + vmId); + } + +- if (vm.getState() != State.Stopped) { +- InvalidParameterValueException ex = new InvalidParameterValueException("VM is not Stopped, unable to migrate the vm having the specified id"); +- ex.addProxyObject(vm.getUuid(), "vmId"); +- throw ex; +- } ++// if (vm.getState() != State.Stopped) { ++// InvalidParameterValueException ex = new InvalidParameterValueException("VM is not Stopped, unable to migrate the vm having the specified id"); ++// ex.addProxyObject(vm.getUuid(), "vmId"); ++// throw ex; ++// } + + if (vm.getType() != VirtualMachine.Type.User) { + // OffLineVmwareMigration: *WHY* ? +@@ -5634,14 +5634,14 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir + throw new InvalidParameterValueException("Unable to find the VM by id=" + vmId); + } + // business logic +- if (vm.getState() != State.Running) { +- if (s_logger.isDebugEnabled()) { +- s_logger.debug("VM is not Running, unable to migrate the vm " + vm); +- } +- InvalidParameterValueException ex = new InvalidParameterValueException("VM is not Running, unable to migrate the vm with specified id"); +- ex.addProxyObject(vm.getUuid(), "vmId"); +- throw ex; +- } ++// if (vm.getState() != State.Running) { ++// if (s_logger.isDebugEnabled()) { ++// s_logger.debug("VM is not Running, unable to migrate the vm " + vm); ++// } ++// InvalidParameterValueException ex = new InvalidParameterValueException("VM is not Running, unable to migrate the vm with specified id"); ++// ex.addProxyObject(vm.getUuid(), "vmId"); ++// throw ex; ++// } + + checkIfHostOfVMIsInPrepareForMaintenanceState(vm.getHostId(), vmId, "Migrate"); + +@@ -5987,15 +5987,15 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir + } + + // OfflineVmwareMigration: this would be it ;) if multiple paths exist: unify +- if (vm.getState() != State.Running) { +- // OfflineVmwareMigration: and not vmware +- if (s_logger.isDebugEnabled()) { +- s_logger.debug("VM is not Running, unable to migrate the vm " + vm); +- } +- CloudRuntimeException ex = new CloudRuntimeException("VM is not Running, unable to migrate the vm with" + " specified id"); +- ex.addProxyObject(vm.getUuid(), "vmId"); +- throw ex; +- } ++// if (vm.getState() != State.Running) { ++// // OfflineVmwareMigration: and not vmware ++// if (s_logger.isDebugEnabled()) { ++// s_logger.debug("VM is not Running, unable to migrate the vm " + vm); ++// } ++// CloudRuntimeException ex = new CloudRuntimeException("VM is not Running, unable to migrate the vm with" + " specified id"); ++// ex.addProxyObject(vm.getUuid(), "vmId"); ++// throw ex; ++// } + + if(serviceOfferingDetailsDao.findDetail(vm.getServiceOfferingId(), GPU.Keys.pciDevice.toString()) != null) { + throw new InvalidParameterValueException("Live Migration of GPU enabled VM is not supported"); +diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java +index 62ecc9a5d5..36e102cb20 100644 +--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java ++++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java +@@ -34,8 +34,6 @@ import java.util.concurrent.ExecutorService; + import java.util.concurrent.Executors; + import java.util.concurrent.Future; + +-import com.vmware.vim25.VStorageObject; +-import com.vmware.vim25.VStorageObjectConfigInfo; + import org.apache.commons.collections.CollectionUtils; + import org.apache.log4j.Logger; + import org.apache.commons.lang.StringUtils; +@@ -2430,13 +2428,13 @@ public class VirtualMachineMO extends BaseMO { + String deviceNumbering = getDeviceBusName(devices, device); + + s_logger.info("Disk backing : " + diskBackingInfo.getFileName() + " matches ==> " + deviceNumbering); +- if (((VirtualDisk) device).getVDiskId() == null) { +- s_logger.debug("vDiskid does not exist for volume " + vmdkDatastorePath + " registering the disk now"); +- VirtualStorageObjectManagerMO vStorageObjectManagerMO = new VirtualStorageObjectManagerMO(getOwnerDatacenter().first().getContext()); +- VStorageObject vStorageObject = vStorageObjectManagerMO.registerVirtualDisk(dsBackingFile, null, getOwnerDatacenter().first().getName()); +- VStorageObjectConfigInfo diskConfigInfo = vStorageObject.getConfig(); +- ((VirtualDisk) device).setVDiskId(diskConfigInfo.getId()); +- } ++// if (((VirtualDisk) device).getVDiskId() == null) { ++// s_logger.debug("vDiskid does not exist for volume " + vmdkDatastorePath + " registering the disk now"); ++// VirtualStorageObjectManagerMO vStorageObjectManagerMO = new VirtualStorageObjectManagerMO(getOwnerDatacenter().first().getContext()); ++// VStorageObject vStorageObject = vStorageObjectManagerMO.registerVirtualDisk(dsBackingFile, null, getOwnerDatacenter().first().getName()); ++// VStorageObjectConfigInfo diskConfigInfo = vStorageObject.getConfig(); ++// ((VirtualDisk) device).setVDiskId(diskConfigInfo.getId()); ++// } + return new Pair<>((VirtualDisk)device, deviceNumbering); + } + diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java index 14b3078cb4c..380a06e6152 100755 --- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java @@ -2468,7 +2468,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac throw new CloudRuntimeException("Unable to find the host to migrate from: " + srcHostId); } - if (fromHost.getClusterId().longValue() != dest.getCluster().getId()) { + if (fromHost.getClusterId().longValue() != dest.getCluster().getId() && vm.getHypervisorType() != HypervisorType.VMware) { final List volumes = _volsDao.findCreatedByInstance(vm.getId()); for (final VolumeVO volume : volumes) { if (!_storagePoolDao.findById(volume.getPoolId()).getScope().equals(ScopeType.ZONE)) { diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 577e1a6e0af..e3a42b8e23a 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -4403,7 +4403,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa s_logger.debug("Preparing spec for volume : " + volume.getName()); morDsAtTarget = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(tgtHyperHost, filerTo.getUuid()); - morDsAtSource = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(srcHyperHost, filerTo.getUuid()); + morDsAtSource = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(srcHyperHost, volume.getPoolUuid()); + if (morDsAtTarget == null) { String msg = "Unable to find the target datastore: " + filerTo.getUuid() + " on target host: " + tgtHyperHost.getHyperHostName() + " to execute MigrateWithStorageCommand"; @@ -4431,7 +4432,6 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa s_logger.debug("Mounted datastore " + tgtDsHost + ":/" + tgtDsPath + " on " + _hostName); } } - // If datastore is VMFS and target datastore is not mounted or accessible to source host then fail migration. if (filerTo.getType().equals(StoragePoolType.VMFS) || filerTo.getType().equals(StoragePoolType.PreSetup)) { if (morDsAtSource == null) { @@ -4452,6 +4452,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa if (volume.getType() == Volume.Type.ROOT) { relocateSpec.setDatastore(morTgtDatastore); } + diskLocator = new VirtualMachineRelocateSpecDiskLocator(); diskLocator.setDatastore(morDsAtSource); Pair diskInfo = getVirtualDiskInfo(vmMo, appendFileType(volume.getPath(), VMDK_EXTENSION)); @@ -4476,8 +4477,9 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa diskLocators.add(diskLocator); } } - - relocateSpec.getDisk().addAll(diskLocators); + if (srcHyperHost.getHyperHostCluster().equals(tgtHyperHost.getHyperHostCluster())) { + relocateSpec.getDisk().addAll(diskLocators); + } // Prepare network at target before migration NicTO[] nics = vmTo.getNics(); diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java index 3db74f317a1..fc0b5ea8d1b 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java @@ -34,8 +34,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import com.vmware.vim25.VStorageObject; -import com.vmware.vim25.VStorageObjectConfigInfo; import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; import org.apache.commons.lang.StringUtils; @@ -63,6 +61,8 @@ import com.vmware.vim25.ParaVirtualSCSIController; import com.vmware.vim25.PropertyFilterSpec; import com.vmware.vim25.PropertySpec; import com.vmware.vim25.TraversalSpec; +import com.vmware.vim25.VStorageObject; +import com.vmware.vim25.VStorageObjectConfigInfo; import com.vmware.vim25.VirtualBusLogicController; import com.vmware.vim25.VirtualCdrom; import com.vmware.vim25.VirtualCdromIsoBackingInfo;