From f8edb554971268e25a5f752c4c1bef050c39b5ab Mon Sep 17 00:00:00 2001 From: Min Chen Date: Wed, 8 May 2013 10:29:09 -0700 Subject: [PATCH] Register template, delete template and create instance from registered template are working on NFS. --- .../storage/image/TemplateServiceImpl.java | 25 +++---------------- .../image/manager/ImageDataManagerImpl.java | 8 +++--- .../storage/image/store/TemplateObject.java | 14 +++++++---- .../ObjectInDataStoreManagerImpl.java | 3 +++ 4 files changed, 21 insertions(+), 29 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 95c6b399ff6..b8e81848a5e 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 @@ -156,11 +156,9 @@ public class TemplateServiceImpl implements TemplateService { // persist template_store_ref entry TemplateObject templateOnStore = (TemplateObject)store.create(template); // update template_store_ref and template state - try { + try{ templateOnStore.processEvent(ObjectInDataStoreStateMachine.Event.CreateOnlyRequested); - templateOnStore.stateTransit(TemplateEvent.CreateRequested); - } catch (NoTransitionException e) { - s_logger.debug("Failed to transit state", e); + } catch (Exception e) { TemplateApiResult result = new TemplateApiResult(templateOnStore); result.setResult(e.toString()); result.setSucess(false); @@ -463,12 +461,7 @@ public class TemplateServiceImpl implements TemplateService { TemplateApiResult result = new TemplateApiResult(template); CreateCmdResult callbackResult = callback.getResult(); if (callbackResult.isFailed()) { - try { - template.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed); - template.stateTransit(TemplateEvent.OperationFailed); - } catch (NoTransitionException e) { - s_logger.debug("Failed to update template state", e); - } + template.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed); result.setResult(callbackResult.getResult()); parentCallback.complete(result); return null; @@ -476,9 +469,7 @@ public class TemplateServiceImpl implements TemplateService { try { template.processEvent(ObjectInDataStoreStateMachine.Event.OperationSuccessed); - template.stateTransit(TemplateEvent.OperationSucceeded); - } catch (NoTransitionException e) { - s_logger.debug("Failed to transit state", e); + } catch (Exception e) { result.setResult(e.toString()); parentCallback.complete(result); return null; @@ -494,13 +485,6 @@ 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(); @@ -514,7 +498,6 @@ public class TemplateServiceImpl implements TemplateService { public Void deleteTemplateCallback(AsyncCallbackDispatcher callback, TemplateOpContext context) { CommandResult result = callback.getResult(); TemplateObject vo = context.getTemplate(); - // we can only update state in template_store_ref table if (result.isSuccess()) { vo.processEvent(Event.OperationSuccessed); } else { diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataManagerImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataManagerImpl.java index 83e98878158..d8708308cef 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataManagerImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataManagerImpl.java @@ -27,9 +27,9 @@ import com.cloud.utils.fsm.StateMachine2; @Component public class ImageDataManagerImpl implements ImageDataManager { - private final StateMachine2 + private final StateMachine2 stateMachine = new StateMachine2(); - + public ImageDataManagerImpl() { stateMachine.addTransition(TemplateState.Allocated, TemplateEvent.CreateRequested, TemplateState.Creating); stateMachine.addTransition(TemplateState.Creating, TemplateEvent.CreateRequested, TemplateState.Creating); @@ -41,8 +41,10 @@ public class ImageDataManagerImpl implements ImageDataManager { stateMachine.addTransition(TemplateState.Destroying, TemplateEvent.DestroyRequested, TemplateState.Destroying); stateMachine.addTransition(TemplateState.Destroying, TemplateEvent.OperationFailed, TemplateState.Destroying); stateMachine.addTransition(TemplateState.Destroying, TemplateEvent.OperationSucceeded, TemplateState.Destroyed); + //TODO: this should not be needed, but it happened during testing where multiple success event is sent to callback + stateMachine.addTransition(TemplateState.Ready, TemplateEvent.OperationSucceeded, TemplateState.Ready); } - + @Override public StateMachine2 getStateMachine() { return stateMachine; diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java index 37317b0ac4b..61a81255a3d 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java @@ -178,17 +178,19 @@ public class TemplateObject implements TemplateInfo { TemplateEvent templEvent = null; if (event == ObjectInDataStoreStateMachine.Event.CreateOnlyRequested) { templEvent = TemplateEvent.CreateRequested; + } else if (event == ObjectInDataStoreStateMachine.Event.DestroyRequested){ + templEvent = TemplateEvent.DestroyRequested; } else if (event == ObjectInDataStoreStateMachine.Event.OperationSuccessed) { templEvent = TemplateEvent.OperationSucceeded; } else if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) { templEvent = TemplateEvent.OperationFailed; } - + if (templEvent != null) { this.stateTransit(templEvent); } } - + ojbectInStoreMgr.update(this, event); } catch (NoTransitionException e) { s_logger.debug("failed to update state", e); @@ -225,16 +227,18 @@ public class TemplateObject implements TemplateInfo { templateVO.setFormat(newTemplate.getFormat()); this.imageDao.update(templateVO.getId(), templateVO); } - + TemplateEvent templEvent = null; if (event == ObjectInDataStoreStateMachine.Event.CreateOnlyRequested) { templEvent = TemplateEvent.CreateRequested; - } else if (event == ObjectInDataStoreStateMachine.Event.OperationSuccessed) { + } else if (event == ObjectInDataStoreStateMachine.Event.DestroyRequested){ + templEvent = TemplateEvent.DestroyRequested; + } else if (event == ObjectInDataStoreStateMachine.Event.OperationSuccessed) { templEvent = TemplateEvent.OperationSucceeded; } else if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) { templEvent = TemplateEvent.OperationFailed; } - + if (templEvent != null) { this.stateTransit(templEvent); } 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 82d29f1a04d..462537f3ff8 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java @@ -108,6 +108,9 @@ public class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager { State.Destroyed); stateMachines.addTransition(State.Destroying, Event.OperationFailed, State.Destroying); + //TODO: further investigate why an extra event is sent when it is alreay Ready + stateMachines.addTransition(State.Ready, Event.OperationSuccessed, + State.Ready); } @Override