From 8984e430cebb36a93494e7ebc5a51420b48ddc6b Mon Sep 17 00:00:00 2001 From: Min Chen Date: Tue, 7 May 2013 16:46:26 -0700 Subject: [PATCH] Add state transition for destroy scenario. --- .../storage/image/TemplateServiceImpl.java | 26 ++++++++++++++++--- .../ObjectInDataStoreManagerImpl.java | 10 +++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java index c7eb069f575..3fee59c06e8 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java @@ -154,9 +154,21 @@ public class TemplateServiceImpl implements TemplateService { public void createTemplateAsync( TemplateInfo template, DataStore store, AsyncCompletionCallback 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 context = new TemplateOpContext(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 future = new AsyncCallFuture(); TemplateOpContext context = new TemplateOpContext(null, to, future); diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java index 763d2cabf7c..82d29f1a04d 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java @@ -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