diff --git a/server/src/com/cloud/storage/StorageManager.java b/server/src/com/cloud/storage/StorageManager.java index 1a18fe7c377..b7475e58b72 100755 --- a/server/src/com/cloud/storage/StorageManager.java +++ b/server/src/com/cloud/storage/StorageManager.java @@ -281,4 +281,6 @@ public interface StorageManager extends Manager { //void release(VirtualMachineProfile vm); void release(VirtualMachineProfile profile); + + void cleanupVolumes(Long vmId); } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 4e70c6ae55d..9f4b9de9bb1 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -2878,10 +2878,13 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag @Override public void release(VirtualMachineProfile profile) { - //Clean up volumes based on the profile's instance id - List volumesForProfile = _volsDao.findByInstance(profile.getId()); - - for(VolumeVO vol : volumesForProfile){ + //add code here + } + + @Override + public void cleanupVolumes(Long vmId){ + List volumesForVm = _volsDao.findByInstance(vmId); + for(VolumeVO vol : volumesForVm){ destroyVolume(vol); } } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 0d9bd056ddd..f00bc38d255 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1979,7 +1979,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager private void updateVmStateForFailedVmCreation(Long vmId) { UserVmVO vm = _vmDao.findById(vmId); if(vm != null){ - if(vm.getState().equals(State.Creating)){ + if(vm.getState().equals(State.Stopped)){ _itMgr.stateTransitTo(vm, VirtualMachine.Event.OperationFailed, null); } } @@ -2519,12 +2519,9 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager UserVmVO vm = new UserVmVO(id, instanceName, cmd.getDisplayName(), template.getId(), template.getGuestOSId(), offering.getOfferHA(), domainId, owner.getId(), offering.getId(), userData, hostName); - try{ - if (_itMgr.allocate(vm, template, offering, rootDiskOffering, dataDiskOfferings, networks, null, plan, cmd.getHypervisor(), owner) == null) { - return null; - } - }finally{ - updateVmStateForFailedVmCreation(id); + + if (_itMgr.allocate(vm, template, offering, rootDiskOffering, dataDiskOfferings, networks, null, plan, cmd.getHypervisor(), owner) == null) { + return null; } if (s_logger.isDebugEnabled()) { @@ -2556,8 +2553,12 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager AccountVO owner = _accountDao.findById(vm.getAccountId()); - vm = _itMgr.start(vm, null, caller, owner, cmd.getHypervisor()); - vm.setPassword(password); + try { + vm = _itMgr.start(vm, null, caller, owner, cmd.getHypervisor()); + } finally { + updateVmStateForFailedVmCreation(vm.getId()); + } + vm.setPassword(password); return vm; } diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 448eab4e0d1..559ad108b10 100644 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -67,6 +67,7 @@ import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageManager; import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.VolumeVO; import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.user.Account; @@ -257,6 +258,9 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Cluster return false; } + //Clean up volumes based on the vm's instance id + _storageMgr.cleanupVolumes(vm.getId()); + VirtualMachineGuru guru = getVmGuru(vm); vm = guru.findById(vm.getId()); @@ -569,6 +573,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Cluster _stateMachine.addTransition(State.Stopped, VirtualMachine.Event.DestroyRequested, State.Destroyed); _stateMachine.addTransition(State.Stopped, VirtualMachine.Event.StopRequested, State.Stopped); _stateMachine.addTransition(State.Stopped, VirtualMachine.Event.AgentReportStopped, State.Stopped); + _stateMachine.addTransition(State.Stopped, VirtualMachine.Event.OperationFailed, State.Error); _stateMachine.addTransition(State.Starting, VirtualMachine.Event.OperationRetry, State.Starting); _stateMachine.addTransition(State.Starting, VirtualMachine.Event.OperationSucceeded, State.Running); _stateMachine.addTransition(State.Starting, VirtualMachine.Event.OperationFailed, State.Stopped);