Repository: cloudstack Updated Branches: refs/heads/master 7144e9b35 -> e2fe8e649
CLOUDSTACK-8350: Volume attachment failed when user stops the VM during attaching DISK. Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/5f590914 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5f590914 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5f590914 Branch: refs/heads/master Commit: 5f5909141848649574c471ec2d2e8e295ef80a6c Parents: 7144e9b Author: Sanjay Tripathi <sanjay.tripa...@citrix.com> Authored: Fri Mar 27 14:27:48 2015 +0530 Committer: Sanjay Tripathi <sanjay.tripa...@citrix.com> Committed: Fri Mar 27 15:26:32 2015 +0530 ---------------------------------------------------------------------- server/src/com/cloud/storage/VolumeApiServiceImpl.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5f590914/server/src/com/cloud/storage/VolumeApiServiceImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java index f04656a..cae1e1d 100644 --- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java @@ -1210,7 +1210,9 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic destPrimaryStorage = _storagePoolDao.findById(exstingVolumeOfVm.getPoolId()); } - if (destPrimaryStorage != null && (volumeToAttach.getState() == Volume.State.Allocated || volumeToAttach.getState() == Volume.State.Uploaded)) { + boolean volumeOnSecondary = volumeToAttach.getState() == Volume.State.Uploaded; + + if (destPrimaryStorage != null && (volumeToAttach.getState() == Volume.State.Allocated || volumeOnSecondary)) { try { newVolumeOnPrimaryStorage = _volumeMgr.createVolumeOnPrimaryStorage(vm, volumeToAttach, rootDiskHyperType, destPrimaryStorage); } catch (NoTransitionException e) { @@ -1243,6 +1245,13 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic } } VolumeVO newVol = _volsDao.findById(newVolumeOnPrimaryStorage.getId()); + // Getting the fresh vm object in case of volume migration to check the current state of VM + if (moveVolumeNeeded || volumeOnSecondary) { + vm = _userVmDao.findById(vmId); + if (vm == null) { + throw new InvalidParameterValueException("VM not found."); + } + } newVol = sendAttachVolumeCommand(vm, newVol, deviceId); return newVol; }