mirror of https://github.com/apache/cloudstack.git
Fix attach volume error for VM - different scope for VM volume and volume disk offering (#5982)
* Fix attach volume error for VM on different storage pool * Fix typo * Refactor
This commit is contained in:
parent
9f23fbe7b6
commit
fe03e306ac
|
|
@ -1053,7 +1053,8 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
|
|||
public VolumeInfo createVolumeOnPrimaryStorage(VirtualMachine vm, VolumeInfo volume, HypervisorType rootDiskHyperType, StoragePool storagePool) throws NoTransitionException {
|
||||
VirtualMachineTemplate rootDiskTmplt = _entityMgr.findById(VirtualMachineTemplate.class, vm.getTemplateId());
|
||||
DataCenter dcVO = _entityMgr.findById(DataCenter.class, vm.getDataCenterId());
|
||||
Pod pod = _entityMgr.findById(Pod.class, storagePool.getPodId());
|
||||
Long podId = storagePool.getPodId() != null ? storagePool.getPodId() : vm.getPodIdToDeployIn();
|
||||
Pod pod = _entityMgr.findById(Pod.class, podId);
|
||||
|
||||
ServiceOffering svo = _entityMgr.findById(ServiceOffering.class, vm.getServiceOfferingId());
|
||||
DiskOffering diskVO = _entityMgr.findById(DiskOffering.class, volume.getDiskOfferingId());
|
||||
|
|
|
|||
|
|
@ -2024,20 +2024,20 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||
}
|
||||
|
||||
UserVmVO vm = _userVmDao.findById(vmId);
|
||||
VolumeVO exstingVolumeOfVm = null;
|
||||
VolumeVO existingVolumeOfVm = null;
|
||||
VMTemplateVO template = _templateDao.findById(vm.getTemplateId());
|
||||
List<VolumeVO> rootVolumesOfVm = _volsDao.findByInstanceAndType(vmId, Volume.Type.ROOT);
|
||||
if (rootVolumesOfVm.size() > 1 && template != null && !template.isDeployAsIs()) {
|
||||
throw new CloudRuntimeException("The VM " + vm.getHostName() + " has more than one ROOT volume and is in an invalid state.");
|
||||
} else {
|
||||
if (!rootVolumesOfVm.isEmpty()) {
|
||||
exstingVolumeOfVm = rootVolumesOfVm.get(0);
|
||||
existingVolumeOfVm = rootVolumesOfVm.get(0);
|
||||
} else {
|
||||
// locate data volume of the vm
|
||||
List<VolumeVO> diskVolumesOfVm = _volsDao.findByInstanceAndType(vmId, Volume.Type.DATADISK);
|
||||
for (VolumeVO diskVolume : diskVolumesOfVm) {
|
||||
if (diskVolume.getState() != Volume.State.Allocated) {
|
||||
exstingVolumeOfVm = diskVolume;
|
||||
existingVolumeOfVm = diskVolume;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -2051,8 +2051,8 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||
|
||||
//don't create volume on primary storage if its being attached to the vm which Root's volume hasn't been created yet
|
||||
StoragePoolVO destPrimaryStorage = null;
|
||||
if (exstingVolumeOfVm != null && !exstingVolumeOfVm.getState().equals(Volume.State.Allocated)) {
|
||||
destPrimaryStorage = _storagePoolDao.findById(exstingVolumeOfVm.getPoolId());
|
||||
if (existingVolumeOfVm != null && !existingVolumeOfVm.getState().equals(Volume.State.Allocated)) {
|
||||
destPrimaryStorage = _storagePoolDao.findById(existingVolumeOfVm.getPoolId());
|
||||
}
|
||||
|
||||
boolean volumeOnSecondary = volumeToAttach.getState() == Volume.State.Uploaded;
|
||||
|
|
@ -2071,7 +2071,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||
|
||||
// reload the volume from db
|
||||
newVolumeOnPrimaryStorage = volFactory.getVolume(newVolumeOnPrimaryStorage.getId());
|
||||
boolean moveVolumeNeeded = needMoveVolume(exstingVolumeOfVm, newVolumeOnPrimaryStorage);
|
||||
boolean moveVolumeNeeded = needMoveVolume(existingVolumeOfVm, newVolumeOnPrimaryStorage);
|
||||
|
||||
if (moveVolumeNeeded) {
|
||||
PrimaryDataStoreInfo primaryStore = (PrimaryDataStoreInfo)newVolumeOnPrimaryStorage.getDataStore();
|
||||
|
|
@ -2079,7 +2079,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
|||
throw new CloudRuntimeException(
|
||||
"Failed to attach local data volume " + volumeToAttach.getName() + " to VM " + vm.getDisplayName() + " as migration of local data volume is not allowed");
|
||||
}
|
||||
StoragePoolVO vmRootVolumePool = _storagePoolDao.findById(exstingVolumeOfVm.getPoolId());
|
||||
StoragePoolVO vmRootVolumePool = _storagePoolDao.findById(existingVolumeOfVm.getPoolId());
|
||||
|
||||
try {
|
||||
newVolumeOnPrimaryStorage = _volumeMgr.moveVolume(newVolumeOnPrimaryStorage, vmRootVolumePool.getDataCenterId(), vmRootVolumePool.getPodId(), vmRootVolumePool.getClusterId(),
|
||||
|
|
|
|||
Loading…
Reference in New Issue