You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ed...@apache.org on 2013/01/10 19:27:25 UTC

git commit: refactor the motion service api

Updated Branches:
  refs/heads/javelin 0bcebd33b -> a03d83bba


refactor the motion service api


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/a03d83bb
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/a03d83bb
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/a03d83bb

Branch: refs/heads/javelin
Commit: a03d83bba965a9d060c3a3ee8ad05dd08647e40d
Parents: 0bcebd3
Author: Edison Su <ed...@citrix.com>
Authored: Thu Jan 10 10:27:05 2013 -0800
Committer: Edison Su <ed...@citrix.com>
Committed: Thu Jan 10 10:27:05 2013 -0800

----------------------------------------------------------------------
 .../cloudstack/storage/image/TemplateObject.java   |    2 +-
 .../storage/image/driver/ImageDataStoreDriver.java |    4 +-
 .../image/driver/ImageDataStoreDriverImpl.java     |    7 +-
 .../storage/image/store/ImageDataStore.java        |    6 +-
 .../storage/image/store/ImageDataStoreImpl.java    |   61 +++++++--
 .../image/motion/DefaultImageMotionStrategy.java   |   31 ++---
 .../image/motion/ImageMotionServiceImpl.java       |   36 +----
 .../storage/image/motion/ImageMotionStrategy.java  |   12 +-
 .../apache/cloudstack/storage/command/CopyCmd.java |   30 ++++
 .../command/CopyTemplateToPrimaryStorageCmd.java   |   30 ----
 .../command/CreateVolumeFromBaseImageCommand.java  |    4 +-
 .../cloudstack/storage/datastore/DataStore.java    |   17 +++
 .../datastore/ObjectInDataStoreManager.java        |   17 +++
 .../datastore/ObjectInDataStoreManagerImpl.java    |   65 +++++++++
 .../storage/datastore/PrimaryDataStore.java        |    4 +-
 .../storage/datastore/TemplateInDataStore.java     |   42 ++++++
 .../storage/db/ObjectInDataStoreDao.java           |    9 ++
 .../storage/db/ObjectInDataStoreDaoImpl.java       |   20 +++
 .../cloudstack/storage/db/ObjectInDataStoreVO.java |  108 +++++++++++++++
 .../storage/image/TemplateEntityImpl.java          |    2 +-
 .../cloudstack/storage/image/TemplateInfo.java     |    4 +-
 .../storage/image/motion/ImageMotionService.java   |    6 +-
 .../storage/image/store/ImageDataStoreInfo.java    |    4 +-
 .../apache/cloudstack/storage/to/TemplateTO.java   |    3 +-
 .../volume/ObjectInDataStoreStateMachine.java      |   48 +++++++
 .../TemplateOnPrimaryDataStoreStateMachine.java    |   48 -------
 .../volume/db/TemplatePrimaryDataStoreDao.java     |    4 +-
 .../volume/db/TemplatePrimaryDataStoreDaoImpl.java |    8 +-
 .../volume/db/TemplatePrimaryDataStoreVO.java      |   10 +-
 .../storage/datastore/DefaultPrimaryDataStore.java |   50 ++++++-
 .../driver/DefaultPrimaryDataStoreDriverImpl.java  |    7 +-
 .../datastore/driver/PrimaryDataStoreDriver.java   |    2 +-
 .../volume/TemplateOnPrimaryDataStoreObject.java   |    6 +-
 .../volume/TemplatePrimaryDataStoreManager.java    |    4 +-
 .../TemplatePrimaryDataStoreManagerImpl.java       |   22 ++--
 .../storage/volume/VolumeServiceImpl.java          |   33 +++--
 .../xen/resource/XenServerStorageResource.java     |   10 +-
 37 files changed, 555 insertions(+), 221 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateObject.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateObject.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateObject.java
index 5d65a3a..367302d 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateObject.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateObject.java
@@ -33,7 +33,7 @@ public class TemplateObject implements TemplateInfo {
     }
 
     @Override
-    public ImageDataStoreInfo getImageDataStore() {
+    public ImageDataStoreInfo getDataStore() {
         return this.dataStore;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriver.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriver.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriver.java
index 42e52e5..a968c9c 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriver.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriver.java
@@ -18,12 +18,14 @@
  */
 package org.apache.cloudstack.storage.image.driver;
 
+import org.apache.cloudstack.storage.EndPoint;
 import org.apache.cloudstack.storage.image.TemplateInfo;
+import org.apache.cloudstack.storage.image.TemplateObject;
 
 public interface ImageDataStoreDriver {
     boolean registerTemplate(TemplateInfo template);
 
-    String grantAccess(long templateId, long endPointId);
+    String grantAccess(TemplateObject template, EndPoint endPointId);
 
     boolean revokeAccess(long templateId, long endPointId);
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriverImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriverImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriverImpl.java
index e395cf1..cae57c0 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriverImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriverImpl.java
@@ -18,7 +18,9 @@
  */
 package org.apache.cloudstack.storage.image.driver;
 
+import org.apache.cloudstack.storage.EndPoint;
 import org.apache.cloudstack.storage.image.TemplateInfo;
+import org.apache.cloudstack.storage.image.TemplateObject;
 
 public class ImageDataStoreDriverImpl implements ImageDataStoreDriver {
 
@@ -32,9 +34,8 @@ public class ImageDataStoreDriverImpl implements ImageDataStoreDriver {
     }
 
     @Override
-    public String grantAccess(long templateId, long endPointId) {
-        // TODO Auto-generated method stub
-        return null;
+    public String grantAccess(TemplateObject template, EndPoint endPointId) {
+        return template.getPath();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStore.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStore.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStore.java
index 4a9240e..b1fabc7 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStore.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStore.java
@@ -18,15 +18,11 @@
  */
 package org.apache.cloudstack.storage.image.store;
 
+import org.apache.cloudstack.storage.datastore.DataStore;
 import org.apache.cloudstack.storage.image.TemplateObject;
 
 public interface ImageDataStore extends ImageDataStoreInfo {
     TemplateObject registerTemplate(long templateId);
-
-    String grantAccess(long templateId, long endPointId);
-
-    boolean revokeAccess(long templateId, long endPointId);
-
     boolean deleteTemplate(long templateId);
 
     boolean needDownloadToCacheStorage();

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
index 68ad317..355f793 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageDataStoreImpl.java
@@ -20,11 +20,15 @@ package org.apache.cloudstack.storage.image.store;
 
 import javax.inject.Inject;
 
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.storage.EndPoint;
+import org.apache.cloudstack.storage.image.TemplateInfo;
 import org.apache.cloudstack.storage.image.TemplateObject;
 import org.apache.cloudstack.storage.image.db.ImageDataDao;
 import org.apache.cloudstack.storage.image.db.ImageDataStoreVO;
 import org.apache.cloudstack.storage.image.db.ImageDataVO;
 import org.apache.cloudstack.storage.image.driver.ImageDataStoreDriver;
+import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
 
 public class ImageDataStoreImpl implements ImageDataStore {
     @Inject
@@ -48,18 +52,6 @@ public class ImageDataStoreImpl implements ImageDataStore {
      */
 
     @Override
-    public String grantAccess(long templateId, long endPointId) {
-        ImageDataVO idv = imageDao.findById(templateId);
-        return idv.getUrl();
-    }
-
-    @Override
-    public boolean revokeAccess(long templateId, long endPointId) {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
     public boolean deleteTemplate(long templateId) {
         // TODO Auto-generated method stub
         return false;
@@ -103,4 +95,49 @@ public class ImageDataStoreImpl implements ImageDataStore {
         return null;
     }
 
+    @Override
+    public String grantAccess(VolumeInfo volume, EndPoint ep) {
+        return null;
+    }
+
+    @Override
+    public boolean revokeAccess(VolumeInfo volume, EndPoint ep) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public String grantAccess(TemplateInfo template, EndPoint ep) {
+        return this.driver.grantAccess((TemplateObject)template, ep);
+    }
+
+    @Override
+    public boolean revokeAccess(TemplateInfo template, EndPoint ep) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public String grantAccess(SnapshotInfo snapshot, EndPoint ep) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public boolean revokeAccess(SnapshotInfo snapshot, EndPoint ep) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public String getRole() {
+        return "imageStore";
+    }
+
+    @Override
+    public long getId() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java b/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java
index 91cacdb..fd6f193 100644
--- a/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java
+++ b/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/DefaultImageMotionStrategy.java
@@ -23,9 +23,10 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
 import org.apache.cloudstack.framework.async.AsyncRpcConext;
 import org.apache.cloudstack.storage.EndPoint;
 import org.apache.cloudstack.storage.command.CommandResult;
-import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageCmd;
+import org.apache.cloudstack.storage.command.CopyCmd;
 import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageAnswer;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
+import org.apache.cloudstack.storage.image.TemplateInfo;
 import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO;
 import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo;
 import org.springframework.stereotype.Component;
@@ -36,24 +37,12 @@ import com.cloud.agent.api.Answer;
 public class DefaultImageMotionStrategy implements ImageMotionStrategy {
 
     @Override
-    public boolean canHandle(TemplateOnPrimaryDataStoreInfo templateStore) {
+    public boolean canHandle(TemplateInfo templateStore) {
         // TODO Auto-generated method stub
         return true;
     }
 
-    @Override
-    public EndPoint getEndPoint(TemplateOnPrimaryDataStoreInfo templateStore) {
-        PrimaryDataStore pdi = templateStore.getPrimaryDataStore();
-        return pdi.getEndPoints().get(0);
-    }
 
-    @Override
-    public boolean copyTemplate(TemplateOnPrimaryDataStoreInfo templateStore, EndPoint ep) {
-        ImageOnPrimayDataStoreTO imageTo = new ImageOnPrimayDataStoreTO(templateStore);
-        CopyTemplateToPrimaryStorageCmd copyCommand = new CopyTemplateToPrimaryStorageCmd(imageTo);
-        ep.sendMessage(copyCommand);
-        return true;
-    }
     
     private class CreateTemplateContext<T> extends AsyncRpcConext<T> {
         private final TemplateOnPrimaryDataStoreInfo template;
@@ -69,10 +58,10 @@ public class DefaultImageMotionStrategy implements ImageMotionStrategy {
     }
 
     @Override
-    public void copyTemplateAsync(TemplateOnPrimaryDataStoreInfo templateStore, EndPoint ep, AsyncCompletionCallback<CommandResult> callback) {
-        ImageOnPrimayDataStoreTO imageTo = new ImageOnPrimayDataStoreTO(templateStore);
-        CopyTemplateToPrimaryStorageCmd copyCommand = new CopyTemplateToPrimaryStorageCmd(imageTo);
-        CreateTemplateContext<CommandResult> context = new CreateTemplateContext<CommandResult>(callback, templateStore);
+    public void copyTemplateAsync(String destUri, String srcUri, EndPoint ep, AsyncCompletionCallback<CommandResult> callback) {
+
+        CopyCmd copyCommand = new CopyCmd(destUri, srcUri);
+        CreateTemplateContext<CommandResult> context = new CreateTemplateContext<CommandResult>(callback, null);
         AsyncCallbackDispatcher<DefaultImageMotionStrategy, Answer> caller = AsyncCallbackDispatcher.create(this);
         caller.setCallback(caller.getTarget().copyTemplateCallBack(null, null))
             .setContext(context);
@@ -98,4 +87,10 @@ public class DefaultImageMotionStrategy implements ImageMotionStrategy {
         return null;
     }
 
+    @Override
+    public EndPoint getEndPoint(TemplateInfo destTemplate,
+            TemplateInfo srcTemplate) {
+        return null;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionServiceImpl.java b/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionServiceImpl.java
index feb9880..0d007ed 100644
--- a/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionServiceImpl.java
+++ b/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionServiceImpl.java
@@ -25,6 +25,7 @@ import javax.inject.Inject;
 import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
 import org.apache.cloudstack.storage.EndPoint;
 import org.apache.cloudstack.storage.command.CommandResult;
+import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
 import org.apache.cloudstack.storage.image.ImageService;
 import org.apache.cloudstack.storage.image.TemplateInfo;
 import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo;
@@ -48,33 +49,13 @@ public class ImageMotionServiceImpl implements ImageMotionService {
         return false;
     }
 
-    @Override
-    public boolean copyTemplate(TemplateOnPrimaryDataStoreInfo templateStore) {
-        ImageMotionStrategy ims = null;
-        for (ImageMotionStrategy strategy : motionStrategies) {
-            if (strategy.canHandle(templateStore)) {
-                ims = strategy;
-                break;
-            }
-        }
-
-        if (ims == null) {
-            throw new CloudRuntimeException("Can't find proper image motion strategy");
-        }
-
-        EndPoint ep = ims.getEndPoint(templateStore);
-
-        volumeService.grantAccess(templateStore, ep);
-        TemplateInfo template = templateStore.getTemplate();
-        imageService.grantTemplateAccess(template, ep);
-        return ims.copyTemplate(templateStore, ep);
-    }
+  
 
     @Override
-    public void copyTemplateAsync(TemplateOnPrimaryDataStoreInfo templateStore, AsyncCompletionCallback<CommandResult> callback) {
+    public void copyTemplateAsync(TemplateInfo destTemplate, TemplateInfo srcTemplate, AsyncCompletionCallback<CommandResult> callback) {
         ImageMotionStrategy ims = null;
         for (ImageMotionStrategy strategy : motionStrategies) {
-            if (strategy.canHandle(templateStore)) {
+            if (strategy.canHandle(srcTemplate)) {
                 ims = strategy;
                 break;
             }
@@ -84,12 +65,11 @@ public class ImageMotionServiceImpl implements ImageMotionService {
             throw new CloudRuntimeException("Can't find proper image motion strategy");
         }
 
-        EndPoint ep = ims.getEndPoint(templateStore);
-        volumeService.grantAccess(templateStore, ep);
-        TemplateInfo template = templateStore.getTemplate();
-        imageService.grantTemplateAccess(template, ep);
+        EndPoint ep = ims.getEndPoint(destTemplate, srcTemplate);
+        String srcUri = srcTemplate.getDataStore().grantAccess(srcTemplate, ep);
+        String destUri = destTemplate.getDataStore().grantAccess(destTemplate, ep);
         
-        ims.copyTemplateAsync(templateStore, ep, callback);
+        ims.copyTemplateAsync(destUri, srcUri, ep, callback);
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionStrategy.java b/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionStrategy.java
index f1f4c7b..037005d 100644
--- a/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionStrategy.java
+++ b/engine/storage/imagemotion/src/org/apache/cloudstack/storage/image/motion/ImageMotionStrategy.java
@@ -22,13 +22,11 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
 import org.apache.cloudstack.storage.EndPoint;
 import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo;
 import org.apache.cloudstack.storage.command.CommandResult;
+import org.apache.cloudstack.storage.datastore.DataStore;
+import org.apache.cloudstack.storage.image.TemplateInfo;
 
 public interface ImageMotionStrategy {
-    public boolean canHandle(TemplateOnPrimaryDataStoreInfo templateStore);
-
-    public EndPoint getEndPoint(TemplateOnPrimaryDataStoreInfo templateStore);
-
-    public boolean copyTemplate(TemplateOnPrimaryDataStoreInfo templateStore, EndPoint ep);
-    
-    public void copyTemplateAsync(TemplateOnPrimaryDataStoreInfo templateStore, EndPoint ep, AsyncCompletionCallback<CommandResult> callback);
+    public boolean canHandle(TemplateInfo templateStore);
+    public EndPoint getEndPoint(TemplateInfo destTemplate, TemplateInfo srcTemplate);
+    public void copyTemplateAsync(String destUri, String sourceUri, EndPoint ep, AsyncCompletionCallback<CommandResult> callback);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/command/CopyCmd.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/CopyCmd.java b/engine/storage/src/org/apache/cloudstack/storage/command/CopyCmd.java
new file mode 100644
index 0000000..42eaa2f
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/command/CopyCmd.java
@@ -0,0 +1,30 @@
+package org.apache.cloudstack.storage.command;
+
+import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO;
+
+import com.cloud.agent.api.Command;
+
+public class CopyCmd extends Command implements StorageSubSystemCommand {
+
+    private ImageOnPrimayDataStoreTO imageTO;
+
+    protected CopyCmd() {
+        super();
+    }
+
+    public CopyCmd(String destUri, String srcUri) {
+        super();
+       // this.imageTO = image;
+    }
+    
+    public ImageOnPrimayDataStoreTO getImage() {
+        return this.imageTO;
+    }
+
+    @Override
+    public boolean executeInSequence() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageCmd.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageCmd.java b/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageCmd.java
deleted file mode 100644
index dd2030d..0000000
--- a/engine/storage/src/org/apache/cloudstack/storage/command/CopyTemplateToPrimaryStorageCmd.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.apache.cloudstack.storage.command;
-
-import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO;
-
-import com.cloud.agent.api.Command;
-
-public class CopyTemplateToPrimaryStorageCmd extends Command implements StorageSubSystemCommand {
-
-    private ImageOnPrimayDataStoreTO imageTO;
-
-    protected CopyTemplateToPrimaryStorageCmd() {
-        super();
-    }
-
-    public CopyTemplateToPrimaryStorageCmd(ImageOnPrimayDataStoreTO image) {
-        super();
-        this.imageTO = image;
-    }
-    
-    public ImageOnPrimayDataStoreTO getImage() {
-        return this.imageTO;
-    }
-
-    @Override
-    public boolean executeInSequence() {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeFromBaseImageCommand.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeFromBaseImageCommand.java b/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeFromBaseImageCommand.java
index 4780e00..f4be067 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeFromBaseImageCommand.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/command/CreateVolumeFromBaseImageCommand.java
@@ -27,9 +27,9 @@ public class CreateVolumeFromBaseImageCommand extends Command implements Storage
     private final VolumeTO volume;
     private final ImageOnPrimayDataStoreTO image;
 
-    public CreateVolumeFromBaseImageCommand(VolumeTO volume, ImageOnPrimayDataStoreTO image) {
+    public CreateVolumeFromBaseImageCommand(VolumeTO volume, String image) {
         this.volume = volume;
-        this.image = image;
+        this.image = null;
     }
     
     public VolumeTO getVolume() {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStore.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStore.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStore.java
new file mode 100644
index 0000000..df21b6e
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStore.java
@@ -0,0 +1,17 @@
+package org.apache.cloudstack.storage.datastore;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.storage.EndPoint;
+import org.apache.cloudstack.storage.image.TemplateInfo;
+import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
+
+public interface DataStore {
+    String grantAccess(VolumeInfo volume, EndPoint ep);
+    boolean revokeAccess(VolumeInfo volume, EndPoint ep);
+    String grantAccess(TemplateInfo template, EndPoint ep);
+    boolean revokeAccess(TemplateInfo template, EndPoint ep);
+    String grantAccess(SnapshotInfo snapshot, EndPoint ep);
+    boolean revokeAccess(SnapshotInfo snapshot, EndPoint ep);
+    String getRole();
+    long getId();
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java
new file mode 100644
index 0000000..7bca13b
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManager.java
@@ -0,0 +1,17 @@
+package org.apache.cloudstack.storage.datastore;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
+import org.apache.cloudstack.storage.image.TemplateInfo;
+import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine;
+
+public interface ObjectInDataStoreManager {
+    public TemplateInfo create(TemplateInfo template, DataStore dataStore);
+    public ObjectInDataStoreVO create(VolumeInfo volume, DataStore dataStore);
+    public ObjectInDataStoreVO create(SnapshotInfo snapshot, DataStore dataStore);
+    public TemplateInfo findTemplate(TemplateInfo template, DataStore dataStore);
+    public VolumeInfo findVolume(VolumeInfo volume, DataStore dataStore);
+    public SnapshotInfo findSnapshot(SnapshotInfo snapshot, DataStore dataStore);
+    public boolean update(TemplateInfo vo, ObjectInDataStoreStateMachine.Event event);
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
new file mode 100644
index 0000000..2cc72dd
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/ObjectInDataStoreManagerImpl.java
@@ -0,0 +1,65 @@
+package org.apache.cloudstack.storage.datastore;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
+import org.apache.cloudstack.storage.db.ObjectInDataStoreDao;
+import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
+import org.apache.cloudstack.storage.image.TemplateInfo;
+import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event;
+import org.springframework.stereotype.Component;
+
+import com.cloud.utils.component.Inject;
+
+@Component
+public  class ObjectInDataStoreManagerImpl implements ObjectInDataStoreManager {
+    @Inject
+    ObjectInDataStoreDao objectDataStoreDao;
+    @Override
+    public TemplateInfo create(TemplateInfo template, DataStore dataStore) {
+        ObjectInDataStoreVO vo = new ObjectInDataStoreVO();
+        vo.setDataStoreId(dataStore.getId());
+        vo.setDataStoreType(dataStore.getRole());
+        vo.setObjectId(template.getId());
+        vo.setObjectType("template");
+        vo = objectDataStoreDao.persist(vo);
+        TemplateInDataStore tmpl = new TemplateInDataStore(template, dataStore, vo);
+        return tmpl;
+    }
+
+    @Override
+    public ObjectInDataStoreVO create(VolumeInfo volume, DataStore dataStore) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public ObjectInDataStoreVO create(SnapshotInfo snapshot, DataStore dataStore) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public TemplateInfo findTemplate(TemplateInfo template, DataStore dataStore) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public VolumeInfo findVolume(VolumeInfo volume, DataStore dataStore) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public SnapshotInfo findSnapshot(SnapshotInfo snapshot, DataStore dataStore) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public boolean update(TemplateInfo vo, Event event) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java
index 51c8696..cf4f879 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/PrimaryDataStore.java
@@ -31,7 +31,7 @@ import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
 import org.apache.cloudstack.storage.to.VolumeTO;
 import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo;
 
-public interface PrimaryDataStore extends PrimaryDataStoreInfo {
+public interface PrimaryDataStore extends DataStore, PrimaryDataStoreInfo {
     VolumeInfo getVolume(long id);
 
     List<VolumeInfo> getVolumes();
@@ -42,7 +42,7 @@ public interface PrimaryDataStore extends PrimaryDataStoreInfo {
 
     VolumeInfo createVoluemFromBaseImage(VolumeInfo volume, TemplateOnPrimaryDataStoreInfo templateStore);
     
-    void createVoluemFromBaseImageAsync(VolumeInfo volume, TemplateOnPrimaryDataStoreInfo templateStore, AsyncCompletionCallback<CommandResult> callback);
+    void createVoluemFromBaseImageAsync(VolumeInfo volume, TemplateInfo templateStore, AsyncCompletionCallback<CommandResult> callback);
     
     List<EndPoint> getEndPoints();
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/datastore/TemplateInDataStore.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/TemplateInDataStore.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/TemplateInDataStore.java
new file mode 100644
index 0000000..f3697cf
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/TemplateInDataStore.java
@@ -0,0 +1,42 @@
+package org.apache.cloudstack.storage.datastore;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
+import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
+import org.apache.cloudstack.storage.image.TemplateInfo;
+import org.apache.cloudstack.storage.image.store.ImageDataStoreInfo;
+
+public class TemplateInDataStore implements TemplateInfo {
+    public TemplateInDataStore(TemplateInfo template, DataStore dataStore, ObjectInDataStoreVO obj) {
+        
+    }
+    @Override
+    public ImageDataStoreInfo getDataStore() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public long getId() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    @Override
+    public VolumeDiskType getDiskType() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public String getPath() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public String getUuid() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDao.java b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDao.java
new file mode 100644
index 0000000..13d8132
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDao.java
@@ -0,0 +1,9 @@
+package org.apache.cloudstack.storage.db;
+
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine;
+import com.cloud.utils.db.GenericDao;
+import com.cloud.utils.fsm.StateDao;
+
+public interface ObjectInDataStoreDao extends GenericDao<ObjectInDataStoreVO, Long>, StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Event, ObjectInDataStoreVO>  {
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDaoImpl.java
new file mode 100644
index 0000000..9932b48
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreDaoImpl.java
@@ -0,0 +1,20 @@
+package org.apache.cloudstack.storage.db;
+
+
+
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State;
+
+import com.cloud.utils.db.GenericDaoBase;
+
+
+public class ObjectInDataStoreDaoImpl extends GenericDaoBase<ObjectInDataStoreVO, Long> implements ObjectInDataStoreDao {
+
+    @Override
+    public boolean updateState(State currentState, Event event,
+            State nextState, ObjectInDataStoreVO vo, Object data) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreVO.java b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreVO.java
new file mode 100644
index 0000000..2b92f6d
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/db/ObjectInDataStoreVO.java
@@ -0,0 +1,108 @@
+package org.apache.cloudstack.storage.db;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
+import com.cloud.utils.db.GenericDaoBase;
+
+@Entity
+@Table(name = "object_datastore_ref")
+public class ObjectInDataStoreVO {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    long id;
+
+    @Column(name = "datastore_id")
+    private long dataStoreId;
+    
+    @Column(name = "datastore_type")
+    private String dataStoreType;
+
+    @Column(name = "ojbect_id")
+    long objectId;
+    
+    @Column(name = "object_type")
+    String objectType;
+
+    @Column(name = GenericDaoBase.CREATED_COLUMN)
+    Date created = null;
+
+    @Column(name = "last_updated")
+    @Temporal(value = TemporalType.TIMESTAMP)
+    Date lastUpdated = null;
+
+    @Column(name = "download_pct")
+    int downloadPercent;
+
+    @Column(name = "download_state")
+    @Enumerated(EnumType.STRING)
+    Status downloadState;
+
+    @Column(name = "local_path")
+    String localDownloadPath;
+
+    @Column(name = "error_str")
+    String errorString;
+
+    @Column(name = "job_id")
+    String jobId;
+
+    @Column(name = "install_path")
+    String installPath;
+
+    @Column(name = "size")
+    long size;
+    
+    @Column(name = "state")
+    String state;
+
+    @Column(name="update_count", updatable = true, nullable=false)
+    protected long updatedCount;
+    
+    public long getId() {
+        return this.id;
+    }
+    
+    public long getDataStoreId() {
+        return this.dataStoreId;
+    }
+    
+    public void setDataStoreId(long id) {
+        this.dataStoreId = id;
+    }
+    
+    public String getDataStoreType() {
+        return this.dataStoreType;
+    }
+    
+    public void setDataStoreType(String type) {
+        this.dataStoreType = type;
+    }
+    
+    public long getObjectId() {
+        return this.objectId;
+    }
+    
+    public void setObjectId(long id) {
+        this.objectId = id;
+    }
+    
+    public String getObjectType() {
+        return this.objectType;
+    }
+    
+    public void setObjectType(String type) {
+        this.objectType = type;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
index d9eceb3..a9998ae 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java
@@ -38,7 +38,7 @@ public class TemplateEntityImpl implements TemplateEntity {
     }
 
     public ImageDataStoreInfo getImageDataStore() {
-        return templateInfo.getImageDataStore();
+        return (ImageDataStoreInfo)templateInfo.getDataStore();
     }
 
     public long getImageDataStoreId() {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java
index 0e11f3e..45fb515 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java
@@ -22,8 +22,8 @@ import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskTyp
 import org.apache.cloudstack.storage.image.store.ImageDataStoreInfo;
 
 public interface TemplateInfo {
-    ImageDataStoreInfo getImageDataStore();
-
+    ImageDataStoreInfo getDataStore();
+    
     long getId();
 
     VolumeDiskType getDiskType();

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionService.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionService.java b/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionService.java
index 1f60e4a..89de552 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionService.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/motion/ImageMotionService.java
@@ -20,11 +20,11 @@ package org.apache.cloudstack.storage.image.motion;
 
 import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
 import org.apache.cloudstack.storage.command.CommandResult;
+import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
+import org.apache.cloudstack.storage.image.TemplateInfo;
 import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo;
 
 public interface ImageMotionService {
-    boolean copyTemplate(TemplateOnPrimaryDataStoreInfo templateStore);
-
-    void copyTemplateAsync(TemplateOnPrimaryDataStoreInfo templateStore, AsyncCompletionCallback<CommandResult> callback);
+    void copyTemplateAsync(TemplateInfo destTemplate, TemplateInfo srcTemplate, AsyncCompletionCallback<CommandResult> callback);
     boolean copyIso(String isoUri, String destIsoUri);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java b/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java
index 1756477..4c55c08 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/store/ImageDataStoreInfo.java
@@ -18,7 +18,9 @@
  */
 package org.apache.cloudstack.storage.image.store;
 
-public interface ImageDataStoreInfo {
+import org.apache.cloudstack.storage.datastore.DataStore;
+
+public interface ImageDataStoreInfo extends DataStore {
     public long getImageDataStoreId();
     public String getType();
     public String getUri();

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java b/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java
index f565712..e0d18db 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/to/TemplateTO.java
@@ -2,6 +2,7 @@ package org.apache.cloudstack.storage.to;
 
 import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
 import org.apache.cloudstack.storage.image.TemplateInfo;
+import org.apache.cloudstack.storage.image.store.ImageDataStoreInfo;
 
 public class TemplateTO {
     private final String path;
@@ -13,7 +14,7 @@ public class TemplateTO {
         this.path = template.getPath();
         this.uuid = template.getUuid();
         this.diskType = template.getDiskType();
-        this.imageDataStore = new ImageDataStoreTO(template.getImageDataStore());
+        this.imageDataStore = new ImageDataStoreTO((ImageDataStoreInfo)template.getDataStore());
     }
     
     public String getPath() {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/volume/ObjectInDataStoreStateMachine.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/ObjectInDataStoreStateMachine.java b/engine/storage/src/org/apache/cloudstack/storage/volume/ObjectInDataStoreStateMachine.java
new file mode 100644
index 0000000..11cf2ef
--- /dev/null
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/ObjectInDataStoreStateMachine.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cloudstack.storage.volume;
+
+import com.cloud.utils.fsm.StateObject;
+
+public interface ObjectInDataStoreStateMachine extends StateObject<ObjectInDataStoreStateMachine.State> {
+    enum State {
+        Allocated("The initial state"),
+        Creating("The template is being downloading to data store"),
+        Ready("Template downloading is complished"),
+        Destroying("Template is destroying"),
+        Destroyed("Template is destroyed"),
+        Failed("Failed to download template");
+        String _description;
+
+        private State(String description) {
+            _description = description;
+        }
+
+        public String getDescription() {
+            return _description;
+        }
+    }
+    
+    enum Event {
+        CreateRequested,
+        DestroyRequested,
+        OperationSuccessed,
+        OperationFailed,
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreStateMachine.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreStateMachine.java b/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreStateMachine.java
deleted file mode 100644
index 7f0cd9b..0000000
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreStateMachine.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cloudstack.storage.volume;
-
-import com.cloud.utils.fsm.StateObject;
-
-public interface TemplateOnPrimaryDataStoreStateMachine extends StateObject<TemplateOnPrimaryDataStoreStateMachine.State> {
-    enum State {
-        Allocated("The initial state"),
-        Creating("The template is being downloading to data store"),
-        Ready("Template downloading is complished"),
-        Destroying("Template is destroying"),
-        Destroyed("Template is destroyed"),
-        Failed("Failed to download template");
-        String _description;
-
-        private State(String description) {
-            _description = description;
-        }
-
-        public String getDescription() {
-            return _description;
-        }
-    }
-    
-    enum Event {
-        CreateRequested,
-        DestroyRequested,
-        OperationSuccessed,
-        OperationFailed,
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java
index 3f8f71d..45ff1ec 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java
@@ -18,12 +18,12 @@
  */
 package org.apache.cloudstack.storage.volume.db;
 
-import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine;
 
 import com.cloud.utils.db.GenericDao;
 import com.cloud.utils.fsm.StateDao;
 
-public interface TemplatePrimaryDataStoreDao extends GenericDao<TemplatePrimaryDataStoreVO, Long>, StateDao<TemplateOnPrimaryDataStoreStateMachine.State, TemplateOnPrimaryDataStoreStateMachine.Event, TemplatePrimaryDataStoreVO> {
+public interface TemplatePrimaryDataStoreDao extends GenericDao<TemplatePrimaryDataStoreVO, Long>, StateDao<ObjectInDataStoreStateMachine.State, ObjectInDataStoreStateMachine.Event, TemplatePrimaryDataStoreVO> {
     public TemplatePrimaryDataStoreVO findByTemplateIdAndPoolId(long templateId, long poolId);
     public TemplatePrimaryDataStoreVO findByTemplateIdAndPoolIdAndReady(long templateId, long poolId);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java
index 00732e1..b47f088 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java
@@ -20,9 +20,9 @@ package org.apache.cloudstack.storage.volume.db;
 
 import java.util.Date;
 
-import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine;
-import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.Event;
-import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.State;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State;
 import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
@@ -58,7 +58,7 @@ public class TemplatePrimaryDataStoreDaoImpl extends GenericDaoBase<TemplatePrim
         SearchCriteriaService<TemplatePrimaryDataStoreVO, TemplatePrimaryDataStoreVO> sc = SearchCriteria2.create(TemplatePrimaryDataStoreVO.class);
         sc.addAnd(sc.getEntity().getTemplateId(), Op.EQ, templateId);
         sc.addAnd(sc.getEntity().getPoolId(), Op.EQ, poolId);
-        sc.addAnd(sc.getEntity().getState(), Op.EQ, TemplateOnPrimaryDataStoreStateMachine.State.Ready);
+        sc.addAnd(sc.getEntity().getState(), Op.EQ, ObjectInDataStoreStateMachine.State.Ready);
         return sc.find();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java
index ffaa6f7..2d355df 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java
@@ -32,13 +32,13 @@ import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
 import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
-import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine;
 import com.cloud.utils.db.GenericDaoBase;
 import com.cloud.utils.fsm.StateObject;
 
 @Entity
 @Table(name = "template_spool_ref")
-public class TemplatePrimaryDataStoreVO implements StateObject<TemplateOnPrimaryDataStoreStateMachine.State> {
+public class TemplatePrimaryDataStoreVO implements StateObject<ObjectInDataStoreStateMachine.State> {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     long id;
@@ -83,7 +83,7 @@ public class TemplatePrimaryDataStoreVO implements StateObject<TemplateOnPrimary
     
     @Column(name = "state")
     @Enumerated(EnumType.STRING)
-    TemplateOnPrimaryDataStoreStateMachine.State state;
+    ObjectInDataStoreStateMachine.State state;
 
     @Column(name="update_count", updatable = true, nullable=false)
     protected long updatedCount;
@@ -165,7 +165,7 @@ public class TemplatePrimaryDataStoreVO implements StateObject<TemplateOnPrimary
         this.poolId = poolId;
         this.templateId = templateId;
         this.downloadState = Status.NOT_DOWNLOADED;
-        this.state = TemplateOnPrimaryDataStoreStateMachine.State.Allocated;
+        this.state = ObjectInDataStoreStateMachine.State.Allocated;
         this.markedForGC = false;
     }
 
@@ -246,7 +246,7 @@ public class TemplatePrimaryDataStoreVO implements StateObject<TemplateOnPrimary
     }
 
     @Override
-    public TemplateOnPrimaryDataStoreStateMachine.State getState() {
+    public ObjectInDataStoreStateMachine.State getState() {
         return this.state;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
index 571f227..7cca8bc 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
@@ -20,6 +20,7 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
 import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver;
 import org.apache.cloudstack.storage.image.TemplateInfo;
+import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
 import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
 import org.apache.cloudstack.storage.to.VolumeTO;
 import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo;
@@ -221,11 +222,11 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
     }
     
     @Override
-    public void createVoluemFromBaseImageAsync(VolumeInfo volume, TemplateOnPrimaryDataStoreInfo templateStore, AsyncCompletionCallback<CommandResult> callback) {
+    public void createVoluemFromBaseImageAsync(VolumeInfo volume, TemplateInfo templateStore, AsyncCompletionCallback<CommandResult> callback) {
         VolumeObject vo = (VolumeObject) volume;
-        vo.setVolumeDiskType(templateStore.getTemplate().getDiskType());
-
-        this.driver.createVolumeFromBaseImageAsync(vo, templateStore, callback);
+        vo.setVolumeDiskType(templateStore.getDiskType());
+        String templateUri = templateStore.getDataStore().grantAccess(templateStore, this.getEndPoints().get(0));
+        this.driver.createVolumeFromBaseImageAsync(vo, templateUri, callback);
     }
     
     @Override
@@ -264,5 +265,46 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
         return this.provider;
     }
 
+    @Override
+    public String grantAccess(VolumeInfo volume, EndPoint ep) {
+        return this.driver.grantAccess((VolumeObject)volume, ep);
+    }
+
+    @Override
+    public boolean revokeAccess(VolumeInfo volume, EndPoint ep) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public String grantAccess(TemplateInfo template, EndPoint ep) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public boolean revokeAccess(TemplateInfo template, EndPoint ep) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public String grantAccess(SnapshotInfo snapshot, EndPoint ep) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public boolean revokeAccess(SnapshotInfo snapshot, EndPoint ep) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public String getRole() {
+        // TODO Auto-generated method stub
+        return "volumeStore";
+    }
+
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
index 5567037..ee0bcc3 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
@@ -134,11 +134,10 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
         
     }
     @Override
-    public void createVolumeFromBaseImageAsync(VolumeObject volume, TemplateOnPrimaryDataStoreInfo template, AsyncCompletionCallback<CommandResult> callback) {
+    public void createVolumeFromBaseImageAsync(VolumeObject volume, String template, AsyncCompletionCallback<CommandResult> callback) {
         VolumeTO vol = this.dataStore.getVolumeTO(volume);
-        ImageOnPrimayDataStoreTO image = new ImageOnPrimayDataStoreTO(template);
-        CreateVolumeFromBaseImageCommand cmd = new CreateVolumeFromBaseImageCommand(vol, image);
-        List<EndPoint> endPoints = template.getPrimaryDataStore().getEndPoints();
+        CreateVolumeFromBaseImageCommand cmd = new CreateVolumeFromBaseImageCommand(vol, template);
+        List<EndPoint> endPoints = this.dataStore.getEndPoints();
         EndPoint ep = endPoints.get(0);
         
         CreateVolumeFromBaseImageContext<CommandResult> context = new CreateVolumeFromBaseImageContext<CommandResult>(callback, volume);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java
index eca7d79..57b3a30 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/PrimaryDataStoreDriver.java
@@ -12,7 +12,7 @@ import org.apache.cloudstack.storage.volume.VolumeObject;
 public interface PrimaryDataStoreDriver {
     void createVolumeAsync(VolumeObject vol, AsyncCompletionCallback<CommandResult> callback);
 
-    void createVolumeFromBaseImageAsync(VolumeObject volume, TemplateOnPrimaryDataStoreInfo template, AsyncCompletionCallback<CommandResult> callback);
+    void createVolumeFromBaseImageAsync(VolumeObject volume, String template, AsyncCompletionCallback<CommandResult> callback);
 
     void deleteVolumeAsync(VolumeObject vo, AsyncCompletionCallback<CommandResult> callback);
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java
index 0ae45e3..9221fb4 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java
@@ -20,8 +20,8 @@ package org.apache.cloudstack.storage.volume;
 
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
 import org.apache.cloudstack.storage.image.TemplateInfo;
-import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.Event;
-import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.State;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State;
 import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreDao;
 import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreVO;
 
@@ -74,7 +74,7 @@ public class TemplateOnPrimaryDataStoreObject implements TemplateOnPrimaryDataSt
         vo = templateStoreDao.findById(vo.getId());
     }
     
-    public void stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event event) {
+    public void stateTransit(ObjectInDataStoreStateMachine.Event event) {
         try {
             this.stateMachine.transitTo(vo, event, null, templateStoreDao);
             vo = templateStoreDao.findById(vo.getId());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManager.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManager.java
index 4c08fee..5978424 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManager.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManager.java
@@ -20,8 +20,8 @@ package org.apache.cloudstack.storage.volume;
 
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
 import org.apache.cloudstack.storage.image.TemplateInfo;
-import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.Event;
-import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.State;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State;
 import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreVO;
 
 import com.cloud.utils.fsm.StateMachine2;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java
index d1cac97..fc4e4fd 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java
@@ -23,8 +23,8 @@ import javax.inject.Inject;
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
 import org.apache.cloudstack.storage.image.TemplateInfo;
-import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.Event;
-import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreStateMachine.State;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.State;
 import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreDao;
 import org.apache.cloudstack.storage.volume.db.TemplatePrimaryDataStoreVO;
 import org.springframework.stereotype.Component;
@@ -45,14 +45,14 @@ public class TemplatePrimaryDataStoreManagerImpl implements TemplatePrimaryDataS
     protected StateMachine2<State, Event, TemplatePrimaryDataStoreVO> stateMachines;
     public TemplatePrimaryDataStoreManagerImpl() {
         stateMachines = new StateMachine2<State, Event, TemplatePrimaryDataStoreVO>();
-        stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Allocated, Event.CreateRequested, TemplateOnPrimaryDataStoreStateMachine.State.Creating);
-        stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Creating, Event.OperationSuccessed, TemplateOnPrimaryDataStoreStateMachine.State.Ready);
-        stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Creating, Event.OperationFailed, TemplateOnPrimaryDataStoreStateMachine.State.Failed);
-        stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Failed, Event.CreateRequested, TemplateOnPrimaryDataStoreStateMachine.State.Creating);
-        stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Ready, Event.DestroyRequested, TemplateOnPrimaryDataStoreStateMachine.State.Destroying);
-        stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Destroying, Event.OperationSuccessed, TemplateOnPrimaryDataStoreStateMachine.State.Destroyed);
-        stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Destroying, Event.OperationFailed, TemplateOnPrimaryDataStoreStateMachine.State.Destroying);
-        stateMachines.addTransition(TemplateOnPrimaryDataStoreStateMachine.State.Destroying, Event.DestroyRequested, TemplateOnPrimaryDataStoreStateMachine.State.Destroying);
+        stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Allocated, Event.CreateRequested, ObjectInDataStoreStateMachine.State.Creating);
+        stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Creating, Event.OperationSuccessed, ObjectInDataStoreStateMachine.State.Ready);
+        stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Creating, Event.OperationFailed, ObjectInDataStoreStateMachine.State.Failed);
+        stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Failed, Event.CreateRequested, ObjectInDataStoreStateMachine.State.Creating);
+        stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Ready, Event.DestroyRequested, ObjectInDataStoreStateMachine.State.Destroying);
+        stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Destroying, Event.OperationSuccessed, ObjectInDataStoreStateMachine.State.Destroyed);
+        stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Destroying, Event.OperationFailed, ObjectInDataStoreStateMachine.State.Destroying);
+        stateMachines.addTransition(ObjectInDataStoreStateMachine.State.Destroying, Event.DestroyRequested, ObjectInDataStoreStateMachine.State.Destroying);
     }
     
     private TemplatePrimaryDataStoreVO waitingForTemplateDownload(TemplateInfo template, PrimaryDataStoreInfo dataStore) {
@@ -98,7 +98,7 @@ public class TemplatePrimaryDataStoreManagerImpl implements TemplatePrimaryDataS
         }
         
         //If it's not a fresh template downloading, waiting for other people downloading finished.
-        if (!freshNewTemplate && templateStoreVO.getState() != TemplateOnPrimaryDataStoreStateMachine.State.Ready) {
+        if (!freshNewTemplate && templateStoreVO.getState() != ObjectInDataStoreStateMachine.State.Ready) {
             templateStoreVO = waitingForTemplateDownload(template, dataStore);
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index fa047e8..afe985b 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@ -30,8 +30,10 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
 import org.apache.cloudstack.framework.async.AsyncRpcConext;
 import org.apache.cloudstack.storage.EndPoint;
 import org.apache.cloudstack.storage.command.CommandResult;
+import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
 import org.apache.cloudstack.storage.datastore.manager.PrimaryDataStoreManager;
+import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
 import org.apache.cloudstack.storage.image.TemplateInfo;
 import org.apache.cloudstack.storage.image.motion.ImageMotionService;
 import org.apache.cloudstack.storage.volume.VolumeService.VolumeApiResult;
@@ -54,7 +56,7 @@ public class VolumeServiceImpl implements VolumeService {
     @Inject
     PrimaryDataStoreManager dataStoreMgr;
     @Inject
-    TemplatePrimaryDataStoreManager templatePrimaryStoreMgr;
+    ObjectInDataStoreManager objectInDataStoreMgr;
     @Inject
     ImageMotionService imageMotion;
 
@@ -238,9 +240,9 @@ public class VolumeServiceImpl implements VolumeService {
     private class CreateBaseImageContext<T> extends AsyncRpcConext<T> {
         private final VolumeInfo volume;
         private final PrimaryDataStore dataStore;
-        private final TemplateOnPrimaryDataStoreObject template;
+        private final TemplateInfo template;
         private final AsyncCallFuture<VolumeApiResult> future;
-        public CreateBaseImageContext(AsyncCompletionCallback<T> callback, VolumeInfo volume, PrimaryDataStore datastore, TemplateOnPrimaryDataStoreObject template, 
+        public CreateBaseImageContext(AsyncCompletionCallback<T> callback, VolumeInfo volume, PrimaryDataStore datastore, TemplateInfo template, 
                 AsyncCallFuture<VolumeApiResult> future) {
             super(callback);
             this.volume = volume;
@@ -257,7 +259,7 @@ public class VolumeServiceImpl implements VolumeService {
             return this.dataStore;
         }
         
-        public TemplateOnPrimaryDataStoreObject getTemplate() {
+        public TemplateInfo getTemplate() {
             return this.template;
         }
         
@@ -268,15 +270,15 @@ public class VolumeServiceImpl implements VolumeService {
     }
     @DB
     protected void createBaseImageAsync(VolumeInfo volume, PrimaryDataStore dataStore, TemplateInfo template, AsyncCallFuture<VolumeApiResult> future) {
-        TemplateOnPrimaryDataStoreObject templateOnPrimaryStoreObj = (TemplateOnPrimaryDataStoreObject) templatePrimaryStoreMgr.createTemplateOnPrimaryDataStore(template, dataStore);
-        templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.CreateRequested);
+        TemplateInfo templateOnPrimaryStoreObj = objectInDataStoreMgr.create(template, dataStore);
+        /*templateOnPrimaryStoreObj.stateTransit(ObjectInDataStoreStateMachine.Event.CreateRequested);
         templateOnPrimaryStoreObj.updateStatus(Status.CREATING);
         try {
             dataStore.installTemplate(templateOnPrimaryStoreObj);
             templateOnPrimaryStoreObj.updateStatus(Status.CREATED);
         } catch (Exception e) {
             templateOnPrimaryStoreObj.updateStatus(Status.ABANDONED);
-            templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.OperationFailed);
+            templateOnPrimaryStoreObj.stateTransit(ObjectInDataStoreStateMachine.Event.OperationFailed);
             VolumeApiResult result = new VolumeApiResult(volume);
             result.setResult(e.toString());
             future.complete(result);
@@ -284,29 +286,30 @@ public class VolumeServiceImpl implements VolumeService {
         }
 
         templateOnPrimaryStoreObj.updateStatus(Status.DOWNLOAD_IN_PROGRESS);
-
+   */
         CreateBaseImageContext<VolumeApiResult> context = new CreateBaseImageContext<VolumeApiResult>(null, volume, dataStore, templateOnPrimaryStoreObj, future);
         AsyncCallbackDispatcher<VolumeServiceImpl, CommandResult> caller = AsyncCallbackDispatcher.create(this);
             caller.setCallback(caller.getTarget().createBaseImageCallback(null, null))
             .setContext(context);
+ 
+        objectInDataStoreMgr.update(templateOnPrimaryStoreObj, ObjectInDataStoreStateMachine.Event.CreateRequested);
 
-        imageMotion.copyTemplateAsync(templateOnPrimaryStoreObj, caller);
+        imageMotion.copyTemplateAsync(templateOnPrimaryStoreObj, template, caller);
     }
 
     @DB
     protected Void createBaseImageCallback(AsyncCallbackDispatcher<VolumeServiceImpl, CommandResult> callback, CreateBaseImageContext<VolumeApiResult> context) {
         CommandResult result = callback.getResult();
-        TemplateOnPrimaryDataStoreObject templateOnPrimaryStoreObj = context.getTemplate();
+        TemplateInfo templateOnPrimaryStoreObj = context.getTemplate();
         if (result.isSuccess()) {
-            templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.OperationSuccessed);
+            objectInDataStoreMgr.update(templateOnPrimaryStoreObj, ObjectInDataStoreStateMachine.Event.OperationSuccessed);
         } else {
-            templateOnPrimaryStoreObj.stateTransit(TemplateOnPrimaryDataStoreStateMachine.Event.OperationFailed);
+            objectInDataStoreMgr.update(templateOnPrimaryStoreObj, ObjectInDataStoreStateMachine.Event.OperationFailed);
         }
         
         AsyncCallFuture<VolumeApiResult> future = context.getFuture();
         VolumeInfo volume = context.getVolume();
         PrimaryDataStore pd = context.getDataStore();
-
         createVolumeFromBaseImageAsync(volume, templateOnPrimaryStoreObj, pd, future);
         return null;
     }
@@ -330,7 +333,7 @@ public class VolumeServiceImpl implements VolumeService {
     }
     
     @DB
-    protected void createVolumeFromBaseImageAsync(VolumeInfo volume, TemplateOnPrimaryDataStoreInfo templateOnPrimaryStore, PrimaryDataStore pd, AsyncCallFuture<VolumeApiResult> future) {
+    protected void createVolumeFromBaseImageAsync(VolumeInfo volume, TemplateInfo templateOnPrimaryStore, PrimaryDataStore pd, AsyncCallFuture<VolumeApiResult> future) {
         VolumeObject vo = (VolumeObject) volume;
         try {
             vo.stateTransit(Volume.Event.CreateRequested);
@@ -379,7 +382,7 @@ public class VolumeServiceImpl implements VolumeService {
             return future;
         }
             
-        createVolumeFromBaseImageAsync(volume, templateOnPrimaryStore, pd, future);
+        createVolumeFromBaseImageAsync(volume, template, pd, future);
         return future;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a03d83bb/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
index 7322e02..009ed7b 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
@@ -30,7 +30,7 @@ import java.util.UUID;
 
 import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreAnswer;
 import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
-import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageCmd;
+import org.apache.cloudstack.storage.command.CopyCmd;
 import org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageAnswer;
 import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd;
 import org.apache.cloudstack.storage.command.CreateVolumeAnswer;
@@ -88,8 +88,8 @@ public class XenServerStorageResource {
     }
     
     public Answer handleStorageCommands(StorageSubSystemCommand command) {
-        if (command instanceof CopyTemplateToPrimaryStorageCmd) {
-            return this.execute((CopyTemplateToPrimaryStorageCmd)command);
+        if (command instanceof CopyCmd) {
+            return this.execute((CopyCmd)command);
         } else if (command instanceof AttachPrimaryDataStoreCmd) {
             return this.execute((AttachPrimaryDataStoreCmd)command);
         } else if (command instanceof CreatePrimaryDataStoreCmd) {
@@ -472,7 +472,7 @@ public class XenServerStorageResource {
        
     }
     
-    protected Answer directDownloadHttpTemplate(CopyTemplateToPrimaryStorageCmd cmd, TemplateTO template, PrimaryDataStoreTO primarDataStore) {
+    protected Answer directDownloadHttpTemplate(CopyCmd cmd, TemplateTO template, PrimaryDataStoreTO primarDataStore) {
         String primaryStoreUuid = primarDataStore.getUuid();
         Connection conn = hypervisorResource.getConnection();
         SR poolsr = null;
@@ -570,7 +570,7 @@ public class XenServerStorageResource {
         }
     }
     
-    protected Answer execute(CopyTemplateToPrimaryStorageCmd cmd) {
+    protected Answer execute(CopyCmd cmd) {
         ImageOnPrimayDataStoreTO imageTO = cmd.getImage();
         TemplateTO template = imageTO.getTemplate();
         if (template.getPath().startsWith("http")) {