Add state transition for destroy scenario.

This commit is contained in:
Min Chen 2013-05-07 16:46:26 -07:00
parent 70f866156f
commit 8984e430ce
2 changed files with 33 additions and 3 deletions

View File

@ -154,9 +154,21 @@ public class TemplateServiceImpl implements TemplateService {
public void createTemplateAsync(
TemplateInfo template, DataStore store, AsyncCompletionCallback<TemplateApiResult> callback) {
// persist template_store_ref entry
DataObject templateOnStore = store.create(template);
// update template_store_ref state
templateOnStore.processEvent(ObjectInDataStoreStateMachine.Event.CreateOnlyRequested);
TemplateObject templateOnStore = (TemplateObject)store.create(template);
// update template_store_ref and template state
try {
templateOnStore.processEvent(ObjectInDataStoreStateMachine.Event.CreateOnlyRequested);
templateOnStore.stateTransit(TemplateEvent.CreateRequested);
} catch (NoTransitionException e) {
s_logger.debug("Failed to transit state", e);
TemplateApiResult result = new TemplateApiResult(templateOnStore);
result.setResult(e.toString());
result.setSucess(false);
if ( callback != null ){
callback.complete(result);
}
return;
}
TemplateOpContext<TemplateApiResult> context = new TemplateOpContext<TemplateApiResult>(callback,
(TemplateObject)templateOnStore, null);
@ -482,6 +494,14 @@ public class TemplateServiceImpl implements TemplateService {
TemplateObject to = (TemplateObject) template;
// update template_store_ref status
to.processEvent(ObjectInDataStoreStateMachine.Event.DestroyRequested);
try {
to.stateTransit(TemplateEvent.DestroyRequested);
} catch (NoTransitionException e) {
s_logger.debug("Failed to transit state", e);
//TODO: not fatal right now, still continue
}
AsyncCallFuture<TemplateApiResult> future = new AsyncCallFuture<TemplateApiResult>();
TemplateOpContext<TemplateApiResult> context = new TemplateOpContext<TemplateApiResult>(null, to, future);

View File

@ -24,6 +24,8 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateEvent;
import org.apache.cloudstack.engine.subsystem.api.storage.TemplateState;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event;
import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State;
import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory;
@ -98,6 +100,14 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
State.Ready);
stateMachines.addTransition(State.Copying, Event.OperationFailed,
State.Ready);
stateMachines.addTransition(State.Ready, Event.DestroyRequested,
State.Destroying);
stateMachines.addTransition(State.Destroying, Event.DestroyRequested,
State.Destroying);
stateMachines.addTransition(State.Destroying, Event.OperationSuccessed,
State.Destroyed);
stateMachines.addTransition(State.Destroying, Event.OperationFailed,
State.Destroying);
}
@Override