diff --git a/api/src/com/cloud/vm/State.java b/api/src/com/cloud/vm/State.java index 00bcb8e2863..44789257836 100644 --- a/api/src/com/cloud/vm/State.java +++ b/api/src/com/cloud/vm/State.java @@ -79,9 +79,10 @@ public enum State implements FiniteState { static { s_fsm.addTransition(null, VirtualMachine.Event.CreateRequested, State.Creating); s_fsm.addTransition(State.Creating, VirtualMachine.Event.OperationSucceeded, State.Stopped); - s_fsm.addTransition(State.Creating, VirtualMachine.Event.OperationFailed, State.Destroyed); + s_fsm.addTransition(State.Creating, VirtualMachine.Event.OperationFailed, State.Error); s_fsm.addTransition(State.Stopped, VirtualMachine.Event.StartRequested, State.Starting); s_fsm.addTransition(State.Stopped, VirtualMachine.Event.DestroyRequested, State.Destroyed); + s_fsm.addTransition(State.Error, VirtualMachine.Event.DestroyRequested, State.Destroyed); s_fsm.addTransition(State.Stopped, VirtualMachine.Event.StopRequested, State.Stopped); s_fsm.addTransition(State.Stopped, VirtualMachine.Event.AgentReportStopped, State.Stopped); s_fsm.addTransition(State.Starting, VirtualMachine.Event.OperationRetry, State.Starting); diff --git a/server/src/com/cloud/vm/MauriceMoss.java b/server/src/com/cloud/vm/MauriceMoss.java index 9db342e3471..15dcd54658f 100644 --- a/server/src/com/cloud/vm/MauriceMoss.java +++ b/server/src/com/cloud/vm/MauriceMoss.java @@ -527,8 +527,9 @@ public class MauriceMoss implements VmManager, ClusterManagerListener { _stateMachine.addTransition(null, VirtualMachine.Event.CreateRequested, State.Creating); _stateMachine.addTransition(State.Creating, VirtualMachine.Event.OperationSucceeded, State.Stopped); - _stateMachine.addTransition(State.Creating, VirtualMachine.Event.OperationFailed, State.Destroyed); + _stateMachine.addTransition(State.Creating, VirtualMachine.Event.OperationFailed, State.Error); _stateMachine.addTransition(State.Stopped, VirtualMachine.Event.StartRequested, State.Starting); + _stateMachine.addTransition(State.Error, VirtualMachine.Event.DestroyRequested, State.Destroyed); _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); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 34baf347aa6..043fa555293 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1748,6 +1748,8 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM throw (ResourceAllocationException)th; } throw new CloudRuntimeException("Unable to create vm", th); + }finally{ + updateVmStateForFailedVmCreation(vmId); } } @@ -2953,8 +2955,19 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM s_logger.error("Unable to create vm", th); throw new CloudRuntimeException("Unable to create vm: "+th.getMessage(), th); + } finally{ + updateVmStateForFailedVmCreation(vmId); } } + + private void updateVmStateForFailedVmCreation(Long vmId) { + UserVmVO vm = _vmDao.findById(vmId); + if(vm != null){ + if(vm.getState().equals(State.Creating)){ + _vmDao.updateIf(vm, VirtualMachine.Event.OperationFailed, null); + } + } + } @DB @Override @@ -3116,6 +3129,8 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM _accountMgr.decrementResourceCount(account.getId(), ResourceType.volume, numVolumes); s_logger.error("Unable to create vm", th); throw new CloudRuntimeException("Unable to create vm", th); + }finally{ + updateVmStateForFailedVmCreation(vmId); } } @@ -3741,8 +3756,13 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM UserVmVO vm = new UserVmVO(id, VirtualMachineName.getVmName(id, owner.getId(), _instance), cmd.getDisplayName(), template.getId(), template.getGuestOSId(), offering.getOfferHA(), domain.getId(), owner.getId(), offering.getId(), userData); - if (_itMgr.allocate(vm, template, offering, rootDiskOffering, dataDiskOfferings, networks, null, plan, owner) == null) { - return null; + + try{ + if (_itMgr.allocate(vm, template, offering, rootDiskOffering, dataDiskOfferings, networks, null, plan, owner) == null) { + return null; + } + }finally{ + updateVmStateForFailedVmCreation(id); } if (s_logger.isDebugEnabled()) {