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/15 02:03:17 UTC

[7/9] git commit: refactor api

refactor 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/a2f86003
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/a2f86003
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/a2f86003

Branch: refs/heads/javelin
Commit: a2f86003f092f7b1a10e0a6331233d9e40bdd6b4
Parents: a03d83b
Author: Edison Su <ed...@citrix.com>
Authored: Mon Jan 14 16:07:03 2013 -0800
Committer: Edison Su <ed...@citrix.com>
Committed: Mon Jan 14 16:07:03 2013 -0800

----------------------------------------------------------------------
 engine/api/pom.xml                                 |    5 +
 .../engine/cloud/entity/api/VolumeEntity.java      |    7 +-
 .../subsystem/api/storage/CommandResult.java       |   52 ++
 .../subsystem/api/storage/CopyCommandResult.java   |   31 ++
 .../subsystem/api/storage/CreateCmdResult.java     |   31 ++
 .../engine/subsystem/api/storage/DataObject.java   |   30 ++
 .../subsystem/api/storage/DataObjectType.java      |   25 +
 .../engine/subsystem/api/storage/DataStore.java    |    9 +
 .../subsystem/api/storage/DataStoreDriver.java     |   33 ++
 .../subsystem/api/storage/DataStoreLifeCycle.java  |   42 ++
 .../subsystem/api/storage/DataStoreRole.java       |   54 +++
 .../engine/subsystem/api/storage/EndPoint.java     |   11 +
 .../api/storage/PrimaryDataStoreInfo.java          |   10 +-
 .../api/storage/PrimaryDataStoreLifeCycle.java     |   21 +-
 .../api/storage/PrimaryDataStoreProvider.java      |   18 -
 .../subsystem/api/storage/StorageOrchestrator.java |    6 +-
 .../engine/subsystem/api/storage/VolumeInfo.java   |   24 +-
 .../subsystem/api/storage/disktype/DiskFormat.java |   22 +
 .../subsystem/api/storage/disktype/QCOW2.java      |   10 -
 .../subsystem/api/storage/disktype/Unknown.java    |    7 -
 .../engine/subsystem/api/storage/disktype/VHD.java |   10 -
 .../subsystem/api/storage/disktype/VMDK.java       |   10 -
 .../api/storage/disktype/VolumeDiskType.java       |    4 -
 .../api/storage/disktype/VolumeDiskTypeBase.java   |   34 --
 .../api/storage/disktype/VolumeDiskTypeHelper.java |   29 --
 engine/pom.xml                                     |    1 +
 .../storage/image/ImageDataFactoryImpl.java        |   51 ++
 .../cloudstack/storage/image/ImageServiceImpl.java |  178 +++++---
 .../cloudstack/storage/image/TemplateObject.java   |   61 ---
 .../driver/DefaultImageDataStoreDriverImpl.java    |   81 ++++
 .../storage/image/driver/ImageDataStoreDriver.java |   33 --
 .../image/driver/ImageDataStoreDriverImpl.java     |   53 --
 .../storage/image/manager/ImageDataManager.java    |   30 ++
 .../image/manager/ImageDataManagerImpl.java        |   48 ++
 .../image/manager/ImageDataStoreManager.java       |   25 -
 .../image/manager/ImageDataStoreManagerImpl.java   |   34 ++-
 .../provider/DefaultImageDataStoreProvider.java    |   77 ---
 .../image/provider/ImageDataStoreProvider.java     |   34 --
 .../provider/ImageDataStoreProviderManager.java    |   39 --
 .../ImageDataStoreProviderManagerImpl.java         |  135 ------
 .../image/store/DefaultImageDataStoreProvider.java |   75 +++
 .../storage/image/store/ImageDataStore.java        |   31 --
 .../storage/image/store/ImageDataStoreImpl.java    |  101 ++---
 .../storage/image/store/TemplateObject.java        |  110 +++++
 .../lifecycle/DefaultImageDataStoreLifeCycle.java  |   85 +++-
 .../store/lifecycle/ImageDataStoreLifeCycle.java   |    7 +-
 .../image/motion/DefaultImageMotionStrategy.java   |   80 +++-
 .../image/motion/ImageMotionServiceImpl.java       |    8 +-
 .../storage/image/motion/ImageMotionStrategy.java  |   12 +-
 .../cloudstack/storage/test/DirectAgentTest.java   |   17 +-
 .../test/MockHypervsiorHostEndPointRpcServer.java  |    9 +-
 .../cloudstack/storage/test/volumeServiceTest.java |   72 +--
 .../storage/snapshot/SnapshotDataFactoryImpl.java  |   47 ++
 .../storage/snapshot/SnapshotObject.java           |   98 ++++
 .../storage/snapshot/db/SnapshotDao2.java          |   25 +
 .../storage/snapshot/db/SnapshotDao2Impl.java      |   25 +
 .../cloudstack/storage/snapshot/db/SnapshotVO.java |  296 ++++++++++++
 .../org/apache/cloudstack/storage/EndPoint.java    |   11 -
 .../cloudstack/storage/HypervisorHostEndPoint.java |    1 +
 .../storage/command/AttachPrimaryDataStoreCmd.java |   10 +-
 .../cloudstack/storage/command/CommandResult.java  |   49 --
 .../cloudstack/storage/command/CopyCmdAnswer.java  |   17 +
 .../CopyTemplateToPrimaryStorageAnswer.java        |   17 -
 .../storage/command/CreateVolumeCommand.java       |   12 +-
 .../cloudstack/storage/command/DeleteCommand.java  |   44 ++
 .../storage/command/DeleteVolumeCommand.java       |   44 --
 .../cloudstack/storage/datastore/DataStore.java    |   17 -
 .../storage/datastore/DataStoreManager.java        |   29 ++
 .../storage/datastore/DataStoreManagerImpl.java    |   54 +++
 .../storage/datastore/DataStoreStatus.java         |   23 +
 .../datastore/DefaultDatastoreLifeCyle.java        |  109 +++++
 .../datastore/ObjectInDataStoreManager.java        |   18 +-
 .../datastore/ObjectInDataStoreManagerImpl.java    |   94 +++-
 .../storage/datastore/PrimaryDataStore.java        |   37 +-
 .../datastore/PrimaryDataStoreProviderManager.java |   28 ++
 .../storage/datastore/TemplateInDataStore.java     |   42 --
 .../storage/datastore/VolumeDataFactory.java       |   26 +
 .../storage/datastore/db/DataStoreProviderDao.java |   25 +
 .../datastore/db/DataStoreProviderDaoImpl.java     |   38 ++
 .../storage/datastore/db/DataStoreProviderVO.java  |   60 +++
 .../storage/datastore/db/PrimaryDataStoreDao.java  |  116 +++++
 .../datastore/db/PrimaryDataStoreDaoImpl.java      |  366 +++++++++++++++
 .../datastore/db/PrimaryDataStoreDetailVO.java     |   79 +++
 .../datastore/db/PrimaryDataStoreDetailsDao.java   |   28 ++
 .../db/PrimaryDataStoreDetailsDaoImpl.java         |   71 +++
 .../storage/datastore/db/PrimaryDataStoreVO.java   |  266 +++++++++++
 .../datastore/provider/DataStoreProvider.java      |   32 ++
 .../provider/DataStoreProviderManager.java         |   30 ++
 .../provider/DataStoreProviderManagerImpl.java     |  108 +++++
 .../datastore/provider/ImageDataStoreProvider.java |   23 +
 .../provider/PrimaryDataStoreProvider.java         |    5 +
 .../storage/db/ObjectInDataStoreDaoImpl.java       |    3 +-
 .../cloudstack/storage/db/ObjectInDataStoreVO.java |   47 ++-
 .../storage/endpoint/DefaultEndPointSelector.java  |  149 ++++++
 .../storage/endpoint/EndPointSelector.java         |   26 +
 .../cloudstack/storage/image/ImageDataFactory.java |   25 +
 .../storage/image/ImageDataStoreDriver.java        |   24 +
 .../cloudstack/storage/image/ImageService.java     |   24 +-
 .../storage/image/TemplateEntityImpl.java          |    2 +-
 .../cloudstack/storage/image/TemplateEvent.java    |   26 +
 .../cloudstack/storage/image/TemplateInfo.java     |   14 +-
 .../cloudstack/storage/image/TemplateState.java    |   27 +
 .../storage/image/datastore/ImageDataStore.java    |   35 ++
 .../image/datastore/ImageDataStoreHelper.java      |   53 ++
 .../image/datastore/ImageDataStoreInfo.java        |   26 +
 .../image/datastore/ImageDataStoreManager.java     |   26 +
 .../cloudstack/storage/image/db/ImageDataDao.java  |    6 +-
 .../storage/image/db/ImageDataDaoImpl.java         |    9 +
 .../storage/image/db/ImageDataStoreVO.java         |   24 +-
 .../cloudstack/storage/image/db/ImageDataVO.java   |   23 +-
 .../storage/image/motion/ImageMotionService.java   |    2 +-
 .../storage/image/store/ImageDataStoreInfo.java    |   27 -
 .../storage/motion/DataMotionDriver.java           |   25 +
 .../storage/motion/DataMotionService.java          |   28 ++
 .../storage/motion/DataMotionServiceImpl.java      |   61 +++
 .../storage/motion/DataMotionStrategy.java         |   30 ++
 .../storage/snapshot/SnapshotDataFactory.java      |   25 +
 .../cloudstack/storage/snapshot/SnapshotInfo.java  |    3 +-
 .../cloudstack/storage/to/ImageDataStoreTO.java    |    2 +-
 .../storage/to/ImageOnPrimayDataStoreTO.java       |    4 +-
 .../apache/cloudstack/storage/to/TemplateTO.java   |   10 +-
 .../org/apache/cloudstack/storage/to/VolumeTO.java |   21 +-
 .../volume/ObjectInDataStoreStateMachine.java      |    8 +-
 .../storage/volume/PrimaryDataStoreDriver.java     |   29 ++
 .../storage/volume/VolumeEntityImpl.java           |  246 ----------
 .../cloudstack/storage/volume/VolumeService.java   |   10 +-
 .../volume/datastore/PrimaryDataStoreHelper.java   |   77 +++
 .../cloudstack/storage/volume/db/VolumeVO.java     |    8 +-
 .../storage/datastore/DataStoreStatus.java         |   23 -
 .../storage/datastore/DefaultPrimaryDataStore.java |  243 ++++------
 .../AbstractPrimaryDataStoreConfigurator.java      |   38 --
 .../configurator/PrimaryDataStoreConfigurator.java |   32 --
 .../configurator/kvm/AbstractKvmConfigurator.java  |   48 --
 .../configurator/kvm/KvmCLVMConfigurator.java      |   47 --
 .../configurator/kvm/KvmNfsConfigurator.java       |   49 --
 .../configurator/kvm/KvmRBDConfigurator.java       |   46 --
 .../validator/CLVMProtocolTransformer.java         |   56 ---
 .../validator/FileSystemValidator.java             |   56 ---
 .../validator/ISCSIProtocolTransformer.java        |   55 ---
 .../validator/NfsProtocolTransformer.java          |   96 ----
 .../configurator/validator/RBDValidator.java       |   55 ---
 .../validator/StorageProtocolTransformer.java      |   34 --
 .../configurator/validator/VMFSValidator.java      |   55 ---
 .../vmware/AbstractVmwareConfigurator.java         |   49 --
 .../vmware/VmwareIsciConfigurator.java             |   45 --
 .../configurator/vmware/VmwareNfsConfigurator.java |   50 --
 .../vmware/VmwareVMFSConfigurator.java             |   47 --
 .../configurator/xen/AbstractXenConfigurator.java  |   24 -
 .../configurator/xen/XenIscsiConfigurator.java     |   45 --
 .../configurator/xen/XenNfsConfigurator.java       |   49 --
 .../storage/datastore/db/PrimaryDataStoreDao.java  |  116 -----
 .../datastore/db/PrimaryDataStoreDaoImpl.java      |  366 ---------------
 .../datastore/db/PrimaryDataStoreDetailVO.java     |   79 ---
 .../datastore/db/PrimaryDataStoreDetailsDao.java   |   28 --
 .../db/PrimaryDataStoreDetailsDaoImpl.java         |   71 ---
 .../datastore/db/PrimaryDataStoreProviderDao.java  |   25 -
 .../db/PrimaryDataStoreProviderDaoImpl.java        |   38 --
 .../datastore/db/PrimaryDataStoreProviderVO.java   |   49 --
 .../storage/datastore/db/PrimaryDataStoreVO.java   |  265 -----------
 .../driver/DefaultPrimaryDataStoreDriverImpl.java  |  142 +++---
 .../datastore/driver/PrimaryDataStoreDriver.java   |   33 --
 .../DefaultPrimaryDataStoreLifeCycleImpl.java      |   31 +-
 .../DefaultXenPrimaryDataStoreLifeCycle.java       |    7 +-
 .../DefaultPrimaryDataStoreManagerImpl.java        |   50 --
 ...DefaultPrimaryDataStoreProviderManagerImpl.java |   67 +++
 .../datastore/manager/PrimaryDataStoreManager.java |   27 -
 .../storage/datastore/manager/data model.ucls      |   57 +++
 .../DefaultPrimaryDatastoreProviderImpl.java       |  141 +-----
 .../provider/PrimaryDataStoreProviderManager.java  |   13 -
 .../PrimaryDataStoreProviderManagerImpl.java       |  106 -----
 .../storage/volume/TemplateInstallStrategy.java    |   28 ++
 .../volume/TemplateInstallStrategyImpl.java        |  293 ++++++++++++
 .../volume/TemplateOnPrimaryDataStoreObject.java   |   87 ----
 .../volume/TemplatePrimaryDataStoreManager.java    |   35 --
 .../TemplatePrimaryDataStoreManagerImpl.java       |  129 -----
 .../storage/volume/VolumeDataFactoryImpl.java      |   53 ++
 .../storage/volume/VolumeEntityImpl.java           |  207 ++++++++
 .../cloudstack/storage/volume/VolumeObject.java    |   79 +---
 .../storage/volume/VolumeServiceImpl.java          |  121 +++---
 .../storage/volume/test/ConfiguratorTest.java      |   29 +-
 .../xen/resource/XenServerStorageResource.java     |   26 +-
 plugins/pom.xml                                    |    2 +
 .../driver/SolidfirePrimaryDataStoreDriver.java    |   69 ++--
 .../SolidfirePrimaryDataStoreProvider.java         |   31 +--
 .../apache/cloudstack/storage/test/VolumeTest.java |   22 +-
 185 files changed, 5197 insertions(+), 4594 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/pom.xml
----------------------------------------------------------------------
diff --git a/engine/api/pom.xml b/engine/api/pom.xml
index 99c0151..cbb83e4 100644
--- a/engine/api/pom.xml
+++ b/engine/api/pom.xml
@@ -31,6 +31,11 @@
       <version>${project.version}</version>
     </dependency>
     <dependency>
+      <groupId>org.apache.cloudstack</groupId>
+      <artifactId>cloud-framework-ipc</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
       <groupId>org.apache.cxf</groupId>
       <artifactId>cxf-bundle-jaxrs</artifactId>
       <version>2.7.0</version>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VolumeEntity.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VolumeEntity.java b/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VolumeEntity.java
index 47fb638..a63c2b47 100755
--- a/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VolumeEntity.java
+++ b/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VolumeEntity.java
@@ -20,7 +20,7 @@ package org.apache.cloudstack.engine.cloud.entity.api;
 
 import org.apache.cloudstack.engine.datacenter.entity.api.StorageEntity;
 import org.apache.cloudstack.engine.entity.api.CloudStackEntity;
-import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
+import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
 import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
 
 
@@ -76,12 +76,9 @@ public interface VolumeEntity extends CloudStackEntity {
     
     long getSize();
     
-    VolumeDiskType getDiskType();
+    DiskFormat getDiskType();
     
     VolumeType getType();
     
     StorageEntity getDataStore();
-    
-    boolean createVolumeFromTemplate(long dataStoreId, VolumeDiskType diskType, TemplateEntity template);
-    boolean createVolume(long dataStoreId, VolumeDiskType diskType);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/CommandResult.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/CommandResult.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/CommandResult.java
new file mode 100644
index 0000000..6b6139b
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/CommandResult.java
@@ -0,0 +1,52 @@
+/*
+ * 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.engine.subsystem.api.storage;
+
+public class CommandResult {
+    private boolean success;
+    private String result;
+    public CommandResult() {
+        this.success = true;
+        this.result = "";
+    }
+   
+    public boolean isSuccess() {
+        return this.success;
+    }
+    
+    public boolean isFailed() {
+        return !this.success;
+    }
+    
+    public void setSucess(boolean success) {
+        this.success = success;
+    }
+    
+    public String getResult() {
+        return this.result;
+    }
+    
+    public void setResult(String result) {
+        this.result = result;
+        if (result != null) {
+            this.success = false;
+        }
+    }
+}
+ 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/CopyCommandResult.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/CopyCommandResult.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/CopyCommandResult.java
new file mode 100644
index 0000000..100fd4e
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/CopyCommandResult.java
@@ -0,0 +1,31 @@
+/*
+ * 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.engine.subsystem.api.storage;
+
+public class CopyCommandResult extends CommandResult {
+    private final String path;
+    public CopyCommandResult(String path) {
+        super();
+        this.path = path;
+    }
+    
+    public String getPath() {
+        return this.path;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/CreateCmdResult.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/CreateCmdResult.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/CreateCmdResult.java
new file mode 100644
index 0000000..8934416
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/CreateCmdResult.java
@@ -0,0 +1,31 @@
+/*
+ * 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.engine.subsystem.api.storage;
+
+public class CreateCmdResult extends CommandResult {
+    private String path;
+    public CreateCmdResult(String path) {
+        super();
+        this.path = path;
+    }
+    
+    public String getPath() {
+        return this.path;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java
new file mode 100644
index 0000000..4487330
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java
@@ -0,0 +1,30 @@
+/*
+ * 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.engine.subsystem.api.storage;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
+
+public interface DataObject {
+    public long getId();
+    public String getUri();
+    public DataStore getDataStore();
+    public long getSize();
+    public DataObjectType getType();
+    public DiskFormat getFormat();
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObjectType.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObjectType.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObjectType.java
new file mode 100644
index 0000000..b4d1a57
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObjectType.java
@@ -0,0 +1,25 @@
+/*
+ * 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.engine.subsystem.api.storage;
+
+public enum DataObjectType {
+    VOLUME,
+    SNAPSHOT,
+    TEMPLATE
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStore.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStore.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStore.java
new file mode 100644
index 0000000..ae1fade
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStore.java
@@ -0,0 +1,9 @@
+package org.apache.cloudstack.engine.subsystem.api.storage;
+
+public interface DataStore {
+    DataStoreDriver getDriver();
+    DataStoreRole getRole();
+    long getId();
+    String getUri();
+    Scope getScope();
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreDriver.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreDriver.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreDriver.java
new file mode 100644
index 0000000..4aba9bf
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreDriver.java
@@ -0,0 +1,33 @@
+/*
+ * 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.engine.subsystem.api.storage;
+
+import java.util.Set;
+
+import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
+
+public interface DataStoreDriver {
+    public String grantAccess(DataObject data, EndPoint ep);
+    public boolean revokeAccess(DataObject data, EndPoint ep);
+    public Set<DataObject> listObjects(DataStore store);
+    public void createAsync(DataObject data, AsyncCompletionCallback<CreateCmdResult> callback);
+    public void deleteAsync(DataObject data, AsyncCompletionCallback<CommandResult> callback);
+    public void copyAsync(DataObject srcdata, DataObject destData, AsyncCompletionCallback<CopyCommandResult> callback);
+    public boolean canCopy(DataObject srcData, DataObject destData);
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java
new file mode 100644
index 0000000..cc13c3a
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreLifeCycle.java
@@ -0,0 +1,42 @@
+/*
+ * 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.engine.subsystem.api.storage;
+
+import java.util.Map;
+
+
+public interface DataStoreLifeCycle {
+    public boolean initialize(DataStore store, Map<String, String> dsInfos);
+
+    public boolean attachCluster(DataStore store, ClusterScope scope);
+    
+    boolean attachZone(DataStore dataStore, ZoneScope scope);
+    
+    public boolean dettach();
+
+    public boolean unmanaged();
+
+    public boolean maintain();
+
+    public boolean cancelMaintain();
+
+    public boolean deleteDataStore();
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreRole.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreRole.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreRole.java
new file mode 100644
index 0000000..a45ca7a
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreRole.java
@@ -0,0 +1,54 @@
+/*
+ * 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.engine.subsystem.api.storage;
+
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public enum DataStoreRole {
+    Primary("primary"),
+    Image("image"),
+    ImageCache("imagecache"),
+    Backup("backup");
+    
+    public boolean isImageStore() {
+        return (this.role.equalsIgnoreCase("image") || this.role.equalsIgnoreCase("imagecache")) ? true : false;
+    }
+    
+    private final String role;
+    DataStoreRole(String type) {
+        this.role = type;
+    }
+    
+    public static DataStoreRole getRole(String role) {
+        if (role == null) {
+            throw new CloudRuntimeException("role can't be empty");
+        }
+        if (role.equalsIgnoreCase("primary")) {
+            return Primary;
+        } else if (role.equalsIgnoreCase("image")) {
+            return Image;
+        } else if (role.equalsIgnoreCase("imagecache")) {
+            return ImageCache;
+        } else if (role.equalsIgnoreCase("backup")) {
+            return Backup;
+        } else {
+            throw new CloudRuntimeException("can't identify the role");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPoint.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPoint.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPoint.java
new file mode 100644
index 0000000..414207d
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPoint.java
@@ -0,0 +1,11 @@
+package org.apache.cloudstack.engine.subsystem.api.storage;
+
+import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
+
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.Command;
+
+public interface EndPoint {
+	public Answer sendMessage(Command cmd);
+	public void sendMessageAsync(Command cmd, AsyncCompletionCallback<Answer> callback);
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java
index 11bc26b..ec87cb5 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreInfo.java
@@ -20,17 +20,13 @@ package org.apache.cloudstack.engine.subsystem.api.storage;
 
 
 import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity;
-import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
-
-
-
+import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.storage.Volume;
 
 public interface PrimaryDataStoreInfo {
 	public boolean isHypervisorSupported(HypervisorType hypervisor);
 	public boolean isLocalStorageSupported();
-	public boolean isVolumeDiskTypeSupported(VolumeDiskType diskType);
+	public boolean isVolumeDiskTypeSupported(DiskFormat diskType);
 	public long getCapacity();
 	public long getAvailableCapacity();
 
@@ -40,6 +36,4 @@ public interface PrimaryDataStoreInfo {
 	public String getName();
 	public String getType();
 	public PrimaryDataStoreLifeCycle getLifeCycle();
-	PrimaryDataStoreProvider getProvider();
-	
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreLifeCycle.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreLifeCycle.java
index afdf085..cf29d9f 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreLifeCycle.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreLifeCycle.java
@@ -18,25 +18,6 @@
  */
 package org.apache.cloudstack.engine.subsystem.api.storage;
 
-import java.util.Map;
 
-public interface PrimaryDataStoreLifeCycle {
-    public boolean initialize(Map<String, String> dsInfos);
-
-    public boolean attachCluster(ClusterScope scope);
-
-    public boolean dettach();
-
-    public boolean unmanaged();
-
-    public boolean maintain();
-
-    public boolean cancelMaintain();
-
-    public boolean deleteDataStore();
-
-    /**
-     * @param dataStore
-     */
-    void setDataStore(PrimaryDataStoreInfo dataStore);
+public interface PrimaryDataStoreLifeCycle extends DataStoreLifeCycle {
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreProvider.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreProvider.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreProvider.java
deleted file mode 100644
index c83594e..0000000
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/PrimaryDataStoreProvider.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.apache.cloudstack.engine.subsystem.api.storage;
-
-import java.util.Map;
-
-public interface PrimaryDataStoreProvider {
-    public PrimaryDataStoreInfo getDataStore(long dataStoreId);
-    public long getId();
-    public String getName();
-
-    /**
-     * @param dsInfos
-     * @return
-     */
-    PrimaryDataStoreInfo registerDataStore(Map<String, String> dsInfos);
-    
-    //LifeCycle of provider
-    public boolean configure();
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageOrchestrator.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageOrchestrator.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageOrchestrator.java
index c1c1e90..fdb15c7 100755
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageOrchestrator.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/StorageOrchestrator.java
@@ -22,7 +22,7 @@ import java.util.List;
 
 import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity;
 import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
-import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
+import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
 import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
 
 import com.cloud.deploy.DeploymentPlan;
@@ -62,7 +62,7 @@ public interface StorageOrchestrator {
      */
     void prepareAttachDiskToVM(long diskId, long vmId, String reservationId);
     
-    boolean createVolume(VolumeEntity volume, long dataStoreId, VolumeDiskType diskType);
-    boolean createVolumeFromTemplate(VolumeEntity volume, long dataStoreId, VolumeDiskType dis, TemplateEntity template);
+    boolean createVolume(VolumeEntity volume, long dataStoreId, DiskFormat diskType);
+    boolean createVolumeFromTemplate(VolumeEntity volume, long dataStoreId, DiskFormat dis, TemplateEntity template);
     VolumeEntity allocateVolumeInDb(long size, VolumeType type,String volName, Long templateId);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
index 4adc1a8..7c714ef 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java
@@ -19,28 +19,12 @@
 package org.apache.cloudstack.engine.subsystem.api.storage;
 
 
-import java.util.Date;
+import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
 
-import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
-import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
-
-import com.cloud.storage.Volume;
-
-public interface VolumeInfo {
-	public long getSize();
+public interface VolumeInfo extends DataObject {
 	public String getUuid();
-	public String getPath();
-	public PrimaryDataStoreInfo getDataStore() ;
-	public String getTemplateUuid();
-	public String getTemplatePath();
-	public VolumeType getType();
-	public VolumeDiskType getDiskType();
 	public long getId();
-	public Volume.State getCurrentState();
-	public Volume.State getDesiredState();
-	public Date getCreatedDate();
-	public Date getUpdatedDate();
-	public String getOwner();
-	public String getName();
+
 	public boolean isAttachedVM();
+	public String getPath();
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/DiskFormat.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/DiskFormat.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/DiskFormat.java
new file mode 100644
index 0000000..c8371ab
--- /dev/null
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/DiskFormat.java
@@ -0,0 +1,22 @@
+package org.apache.cloudstack.engine.subsystem.api.storage.disktype;
+
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public enum DiskFormat {
+    VMDK,
+    VHD,
+    ISO,
+    QCOW2;
+    public static DiskFormat getFormat(String format) {
+        if (VMDK.toString().equalsIgnoreCase(format)) {
+            return VMDK;
+        } else if (VHD.toString().equalsIgnoreCase(format)) {
+            return VHD;
+        } else if (QCOW2.toString().equalsIgnoreCase(format)) {
+            return QCOW2;
+        } else if (ISO.toString().equalsIgnoreCase(format)) {
+            return ISO;
+        }
+        throw new CloudRuntimeException("can't find format match: " + format);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/QCOW2.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/QCOW2.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/QCOW2.java
deleted file mode 100644
index 4daa4a7..0000000
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/QCOW2.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.apache.cloudstack.engine.subsystem.api.storage.disktype;
-
-import org.springframework.stereotype.Component;
-
-@Component
-public class QCOW2 extends VolumeDiskTypeBase {
-	public QCOW2() {
-		this.type = "QCOW2";
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/Unknown.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/Unknown.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/Unknown.java
deleted file mode 100644
index 5b52d5d..0000000
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/Unknown.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.apache.cloudstack.engine.subsystem.api.storage.disktype;
-
-public class Unknown extends VolumeDiskTypeBase {
-	public Unknown() {
-		this.type = "Unknown";
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VHD.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VHD.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VHD.java
deleted file mode 100644
index a19dcaf..0000000
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VHD.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.apache.cloudstack.engine.subsystem.api.storage.disktype;
-
-import org.springframework.stereotype.Component;
-
-@Component
-public class VHD extends VolumeDiskTypeBase {
-	public VHD() {
-		this.type = "VHD";
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VMDK.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VMDK.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VMDK.java
deleted file mode 100644
index bb06318..0000000
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VMDK.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.apache.cloudstack.engine.subsystem.api.storage.disktype;
-
-import org.springframework.stereotype.Component;
-
-@Component
-public class VMDK extends VolumeDiskTypeBase {
-	public VMDK() {
-		this.type = "VMDK";
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VolumeDiskType.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VolumeDiskType.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VolumeDiskType.java
deleted file mode 100644
index 3e14621..0000000
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VolumeDiskType.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package org.apache.cloudstack.engine.subsystem.api.storage.disktype;
-
-public interface VolumeDiskType {
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VolumeDiskTypeBase.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VolumeDiskTypeBase.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VolumeDiskTypeBase.java
deleted file mode 100644
index 66c33a8..0000000
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VolumeDiskTypeBase.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.apache.cloudstack.engine.subsystem.api.storage.disktype;
-
-public class VolumeDiskTypeBase implements VolumeDiskType {
-	protected String type = "Unknown";
-
-	@Override
-	public boolean equals(Object that) {
-		if (this == that) {
-			return true;
-		}
-		if (that instanceof String) {
-			if (getType().equalsIgnoreCase((String)that)) {
-				return true;
-			}
-		} else if (that instanceof VolumeDiskTypeBase) {
-			VolumeDiskTypeBase th = (VolumeDiskTypeBase)that;
-			if (this.getType().equalsIgnoreCase(th.getType())) {
-				return true;
-			}
-		} else {
-			return false;
-		}
-		return false;
-	}
-	
-	@Override
-	public String toString() {
-		return getType();
-	}
-	
-	protected String getType() {
-		return this.type;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VolumeDiskTypeHelper.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VolumeDiskTypeHelper.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VolumeDiskTypeHelper.java
deleted file mode 100644
index ca65cd6..0000000
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/disktype/VolumeDiskTypeHelper.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.apache.cloudstack.engine.subsystem.api.storage.disktype;
-
-import java.util.List;
-
-import javax.inject.Inject;
-
-import org.springframework.stereotype.Component;
-
-@Component
-public class VolumeDiskTypeHelper {
-	
-	static private List<VolumeDiskType> diskTypes;
-	static final private VolumeDiskType defaultType = new Unknown();
-	
-	@Inject
-	public void setDiskTypes(List<VolumeDiskType> diskTypes) {
-		VolumeDiskTypeHelper.diskTypes = diskTypes;
-	}
-	
-	public static VolumeDiskType getDiskType(String type) {
-		for (VolumeDiskType diskType : diskTypes) {
-			if (diskType.equals(type)) {
-				return diskType;
-			}
-		}
-		
-		return VolumeDiskTypeHelper.defaultType;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/pom.xml
----------------------------------------------------------------------
diff --git a/engine/pom.xml b/engine/pom.xml
index e1681f1..1a8a0b8 100644
--- a/engine/pom.xml
+++ b/engine/pom.xml
@@ -42,6 +42,7 @@
     <module>storage/imagemotion</module>
     <module>storage/backup</module>
     <module>storage/snapshot</module>
+    <module>storage/integration-test</module>
     <module>components-api</module>
     <module>schema</module>
     <module>network</module>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/storage/image/src/org/apache/cloudstack/storage/image/ImageDataFactoryImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/ImageDataFactoryImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/ImageDataFactoryImpl.java
new file mode 100644
index 0000000..2fbe616
--- /dev/null
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/ImageDataFactoryImpl.java
@@ -0,0 +1,51 @@
+/*
+ * 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.image;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectType;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.storage.datastore.DataStoreManager;
+import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
+import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
+import org.apache.cloudstack.storage.image.db.ImageDataDao;
+import org.apache.cloudstack.storage.image.db.ImageDataVO;
+import org.apache.cloudstack.storage.image.store.TemplateObject;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ImageDataFactoryImpl implements ImageDataFactory {
+    @Inject
+    ImageDataDao imageDataDao;
+    @Inject
+    ObjectInDataStoreManager objMap;
+    @Inject
+    DataStoreManager storeMgr;
+    @Override
+    public TemplateInfo getTemplate(long templateId, DataStore store) {
+        ObjectInDataStoreVO obj = objMap.findObject(templateId, DataObjectType.TEMPLATE, store.getId(), store.getRole());
+        if (obj == null) {
+            return null;
+        }
+        ImageDataVO templ = imageDataDao.findById(templateId);
+        TemplateObject tmpl = new TemplateObject(templ, store);
+        return tmpl;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/storage/image/src/org/apache/cloudstack/storage/image/ImageServiceImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/ImageServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/ImageServiceImpl.java
index 4b65831..99b57e8 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/ImageServiceImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/ImageServiceImpl.java
@@ -20,75 +20,141 @@ package org.apache.cloudstack.storage.image;
 
 import javax.inject.Inject;
 
-import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity;
-import org.apache.cloudstack.storage.EndPoint;
-import org.apache.cloudstack.storage.image.downloader.ImageDownloader;
-import org.apache.cloudstack.storage.image.manager.ImageDataStoreManager;
-import org.apache.cloudstack.storage.image.provider.ImageDataStoreProviderManager;
-import org.apache.cloudstack.storage.image.store.ImageDataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.framework.async.AsyncCallFuture;
+import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher;
+import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
+import org.apache.cloudstack.framework.async.AsyncRpcConext;
+import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
+import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
+import org.apache.cloudstack.storage.image.store.TemplateObject;
+import org.apache.cloudstack.storage.volume.ObjectInDataStoreStateMachine.Event;
+import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
+import com.cloud.utils.fsm.NoTransitionException;
+
 @Component
 public class ImageServiceImpl implements ImageService {
+    private static final Logger s_logger = Logger.getLogger(ImageServiceImpl.class);
     @Inject
-    ImageDataStoreProviderManager imageStoreProviderMgr;
-
-    public ImageServiceImpl() {
-    }
+    ObjectInDataStoreManager objectInDataStoreMgr;
     
-    @Override
-    public TemplateEntity registerTemplate(long templateId, long imageStoreId) {
-        ImageDataStore ids = imageStoreProviderMgr.getDataStore(imageStoreId);
-        TemplateObject to = ids.registerTemplate(templateId);
-        return new TemplateEntityImpl(to);
-    }
-
-    @Override
-    public boolean deleteTemplate(long templateId) {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public long registerIso(String isoUrl, long accountId) {
-        // TODO Auto-generated method stub
-        return 0;
-    }
-
-    @Override
-    public boolean deleteIso(long isoId) {
-        // TODO Auto-generated method stub
-        return false;
+    class CreateTemplateContext<T> extends AsyncRpcConext<T> {
+        final TemplateInfo srcTemplate;
+        final TemplateInfo templateOnStore;
+        final AsyncCallFuture<CommandResult> future;
+        final ObjectInDataStoreVO obj;
+        public CreateTemplateContext(AsyncCompletionCallback<T> callback, TemplateInfo srcTemplate,
+                TemplateInfo templateOnStore,
+                AsyncCallFuture<CommandResult> future,
+                ObjectInDataStoreVO obj) {
+            super(callback);
+            this.srcTemplate = srcTemplate;
+            this.templateOnStore = templateOnStore;
+            this.future = future;
+            this.obj = obj;
+        }
     }
-
+    
     @Override
-    public boolean revokeTemplateAccess(long templateId, long endpointId) {
-        // TODO Auto-generated method stub
-        return false;
+    public AsyncCallFuture<CommandResult> createTemplateAsync(
+            TemplateInfo template, DataStore store) {
+        TemplateObject to = (TemplateObject) template;
+        AsyncCallFuture<CommandResult> future = new AsyncCallFuture<CommandResult>();
+        try {
+            to.stateTransit(TemplateEvent.CreateRequested);
+        } catch (NoTransitionException e) {
+            s_logger.debug("Failed to transit state:", e);
+            CommandResult result = new CommandResult();
+            result.setResult(e.toString());
+            future.complete(result);
+            return future;
+        }
+        
+        ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(template.getId(), template.getType(), store.getId(), store.getRole());
+        TemplateInfo templateOnStore = null;
+        if (obj == null) {
+            templateOnStore = objectInDataStoreMgr.create(template, store);
+        } else {
+            CommandResult result = new CommandResult();
+            result.setResult("duplicate template on the storage");
+            future.complete(result);
+            return future;
+        }
+        
+        try {
+            objectInDataStoreMgr.update(templateOnStore, Event.CreateOnlyRequested);
+        } catch (NoTransitionException e) {
+            s_logger.debug("failed to transit", e);
+            CommandResult result = new CommandResult();
+            result.setResult(e.toString());
+            future.complete(result);
+            return future;
+        }
+        CreateTemplateContext<CommandResult> context = new CreateTemplateContext<CommandResult>(null, 
+                template, templateOnStore,
+                future,
+                obj);
+        AsyncCallbackDispatcher<ImageServiceImpl, CreateCmdResult> caller =  AsyncCallbackDispatcher.create(this);
+        caller.setCallback(caller.getTarget().createTemplateCallback(null, null))
+        .setContext(context);
+        store.getDriver().createAsync(templateOnStore, caller);
+        return future;
     }
-
-    @Override
-    public String grantIsoAccess(long isoId, long endpointId) {
-        // TODO Auto-generated method stub
+    
+    protected Void createTemplateCallback(AsyncCallbackDispatcher<ImageServiceImpl, CreateCmdResult> callback, 
+            CreateTemplateContext<CreateCmdResult> context) {
+        
+        TemplateInfo templateOnStore = context.templateOnStore;
+        TemplateObject template = (TemplateObject)context.srcTemplate;
+        AsyncCallFuture<CommandResult> future = context.future;
+        CommandResult result = new CommandResult();
+        
+        CreateCmdResult callbackResult = callback.getResult();
+        if (callbackResult.isFailed()) {
+            try {
+                objectInDataStoreMgr.update(templateOnStore, Event.OperationFailed);
+            } catch (NoTransitionException e) {
+                s_logger.debug("failed to transit state", e);
+            }
+            result.setResult(callbackResult.getResult());
+            future.complete(result);
+            return null;
+        }
+        
+        ObjectInDataStoreVO obj = context.obj;
+        obj.setInstallPath(callbackResult.getPath());
+        
+        try {
+            objectInDataStoreMgr.update(templateOnStore, Event.OperationSuccessed);
+        } catch (NoTransitionException e) {
+            s_logger.debug("Failed to transit state", e);
+            result.setResult(e.toString());
+            future.complete(result);
+            return null;
+        }
+       
+        template.setImageStoreId(templateOnStore.getDataStore().getId());
+        try {
+            template.stateTransit(TemplateEvent.OperationSucceeded);
+        } catch (NoTransitionException e) {
+            s_logger.debug("Failed to transit state", e);
+            result.setResult(e.toString());
+            future.complete(result);
+            return null;
+        }
+        
+        future.complete(result);
         return null;
     }
 
     @Override
-    public boolean revokeIsoAccess(long isoId, long endpointId) {
+    public AsyncCallFuture<CommandResult> deleteTemplateAsync(
+            TemplateInfo template) {
         // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public TemplateEntity getTemplateEntity(long templateId) {
-        ImageDataStore dataStore = imageStoreProviderMgr.getDataStoreFromTemplateId(templateId);
-        TemplateObject to = dataStore.getTemplate(templateId);
-        return new TemplateEntityImpl(to);
-    }
-
-    @Override
-    public boolean grantTemplateAccess(TemplateInfo template, EndPoint endpointId) {
-        // TODO Auto-generated method stub
-        return true;
+        return null;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/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
deleted file mode 100644
index 367302d..0000000
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateObject.java
+++ /dev/null
@@ -1,61 +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.image;
-
-import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
-import org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskTypeHelper;
-import org.apache.cloudstack.storage.image.db.ImageDataVO;
-import org.apache.cloudstack.storage.image.store.ImageDataStoreInfo;
-
-public class TemplateObject implements TemplateInfo {
-    private ImageDataVO imageVO;
-    private ImageDataStoreInfo dataStore;
-
-    public TemplateObject(ImageDataVO template, ImageDataStoreInfo dataStore) {
-        this.imageVO = template;
-        this.dataStore = dataStore;
-    }
-
-    @Override
-    public ImageDataStoreInfo getDataStore() {
-        return this.dataStore;
-    }
-
-    @Override
-    public long getId() {
-        return this.imageVO.getId();
-    }
-
-    @Override
-    public VolumeDiskType getDiskType() {
-        return VolumeDiskTypeHelper.getDiskType(imageVO.getFormat());
-    }
-
-    @Override
-    public String getPath() {
-        //TODO: add installation path if it's downloaded to cache storage already
-        return this.imageVO.getUrl();
-    }
-
-    @Override
-    public String getUuid() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/DefaultImageDataStoreDriverImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/DefaultImageDataStoreDriverImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/DefaultImageDataStoreDriverImpl.java
new file mode 100644
index 0000000..ae349ff
--- /dev/null
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/DefaultImageDataStoreDriverImpl.java
@@ -0,0 +1,81 @@
+/*
+ * 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.image.driver;
+
+import java.util.Set;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
+import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
+import org.apache.cloudstack.storage.image.ImageDataStoreDriver;
+
+public class DefaultImageDataStoreDriverImpl implements ImageDataStoreDriver {
+
+    public DefaultImageDataStoreDriverImpl() {
+    }
+
+    @Override
+    public String grantAccess(DataObject data, EndPoint ep) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public boolean revokeAccess(DataObject data, EndPoint ep) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public Set<DataObject> listObjects(DataStore store) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public void createAsync(DataObject data,
+            AsyncCompletionCallback<CreateCmdResult> callback) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public void deleteAsync(DataObject data,
+            AsyncCompletionCallback<CommandResult> callback) {
+        // TODO Auto-generated method stub
+        
+    }
+
+    @Override
+    public boolean canCopy(DataObject srcData, DataObject destData) {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    @Override
+    public void copyAsync(DataObject srcdata, DataObject destData,
+            AsyncCompletionCallback<CopyCommandResult> callback) {
+        // TODO Auto-generated method stub
+        
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/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
deleted file mode 100644
index a968c9c..0000000
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriver.java
+++ /dev/null
@@ -1,33 +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.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(TemplateObject template, EndPoint endPointId);
-
-    boolean revokeAccess(long templateId, long endPointId);
-
-    boolean deleteTemplate(TemplateInfo template);
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/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
deleted file mode 100644
index cae57c0..0000000
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/driver/ImageDataStoreDriverImpl.java
+++ /dev/null
@@ -1,53 +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.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 {
-
-    public ImageDataStoreDriverImpl() {
-    }
-
-    @Override
-    public boolean registerTemplate(TemplateInfo template) {
-        // TODO: check the availability of template
-        return true;
-    }
-
-    @Override
-    public String grantAccess(TemplateObject template, EndPoint endPointId) {
-        return template.getPath();
-    }
-
-    @Override
-    public boolean revokeAccess(long templateId, long endPointId) {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public boolean deleteTemplate(TemplateInfo template) {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataManager.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataManager.java
new file mode 100644
index 0000000..e5a6863
--- /dev/null
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataManager.java
@@ -0,0 +1,30 @@
+/*
+ * 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.image.manager;
+
+import org.apache.cloudstack.storage.image.TemplateEvent;
+import org.apache.cloudstack.storage.image.TemplateState;
+import org.apache.cloudstack.storage.image.db.ImageDataVO;
+
+import com.cloud.utils.fsm.StateMachine2;
+
+public interface ImageDataManager {
+    StateMachine2<TemplateState, TemplateEvent, ImageDataVO> getStateMachine();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataManagerImpl.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..09303aa
--- /dev/null
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataManagerImpl.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.image.manager;
+
+import org.apache.cloudstack.storage.image.TemplateEvent;
+import org.apache.cloudstack.storage.image.TemplateState;
+import org.apache.cloudstack.storage.image.db.ImageDataVO;
+
+import com.cloud.utils.fsm.StateMachine2;
+
+public class ImageDataManagerImpl implements ImageDataManager {
+    private final static StateMachine2<TemplateState, TemplateEvent, ImageDataVO> 
+        stateMachine = new StateMachine2<TemplateState, TemplateEvent, ImageDataVO>();
+    
+    public ImageDataManagerImpl() {
+        stateMachine.addTransition(TemplateState.Allocated, TemplateEvent.CreateRequested, TemplateState.Creating);
+        stateMachine.addTransition(TemplateState.Creating, TemplateEvent.CreateRequested, TemplateState.Creating);
+        stateMachine.addTransition(TemplateState.Creating, TemplateEvent.OperationSucceeded, TemplateState.Ready);
+        stateMachine.addTransition(TemplateState.Creating, TemplateEvent.OperationFailed, TemplateState.Allocated);
+        stateMachine.addTransition(TemplateState.Creating, TemplateEvent.DestroyRequested, TemplateState.Destroying);
+        stateMachine.addTransition(TemplateState.Ready, TemplateEvent.DestroyRequested, TemplateState.Destroying);
+        stateMachine.addTransition(TemplateState.Allocated, TemplateEvent.DestroyRequested, TemplateState.Destroying);
+        stateMachine.addTransition(TemplateState.Destroying, TemplateEvent.DestroyRequested, TemplateState.Destroying);
+        stateMachine.addTransition(TemplateState.Destroying, TemplateEvent.OperationFailed, TemplateState.Destroying);
+        stateMachine.addTransition(TemplateState.Destroying, TemplateEvent.OperationSucceeded, TemplateState.Destroyed);
+    }
+    
+    @Override
+    public StateMachine2<TemplateState, TemplateEvent, ImageDataVO> getStateMachine() {
+        return stateMachine;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManager.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManager.java
deleted file mode 100644
index e1dce50..0000000
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManager.java
+++ /dev/null
@@ -1,25 +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.image.manager;
-
-import org.apache.cloudstack.storage.image.store.ImageDataStore;
-
-public interface ImageDataStoreManager {
-    ImageDataStore getImageDataStore(long dataStoreId);
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManagerImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManagerImpl.java
index 8183958..2a24f9b 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManagerImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/manager/ImageDataStoreManagerImpl.java
@@ -18,24 +18,52 @@
  */
 package org.apache.cloudstack.storage.image.manager;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import javax.inject.Inject;
 
-import org.apache.cloudstack.storage.image.db.ImageDataStoreDao;
+import org.apache.cloudstack.storage.datastore.provider.DataStoreProvider;
+import org.apache.cloudstack.storage.datastore.provider.DataStoreProviderManager;
+import org.apache.cloudstack.storage.image.ImageDataStoreDriver;
+import org.apache.cloudstack.storage.image.datastore.ImageDataStore;
+import org.apache.cloudstack.storage.image.datastore.ImageDataStoreManager;
 import org.apache.cloudstack.storage.image.db.ImageDataDao;
+import org.apache.cloudstack.storage.image.db.ImageDataStoreDao;
 import org.apache.cloudstack.storage.image.db.ImageDataStoreVO;
-import org.apache.cloudstack.storage.image.store.ImageDataStore;
+import org.apache.cloudstack.storage.image.store.ImageDataStoreImpl;
+import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
+import org.springframework.stereotype.Component;
 
+@Component
 public class ImageDataStoreManagerImpl implements ImageDataStoreManager {
     @Inject
     ImageDataStoreDao dataStoreDao;
     @Inject
     ImageDataDao imageDataDao;
+    @Inject
+    DataStoreProviderManager providerManager;
+    Map<String, ImageDataStoreDriver> driverMaps = new HashMap<String, ImageDataStoreDriver>();
 
     @Override
     public ImageDataStore getImageDataStore(long dataStoreId) {
         ImageDataStoreVO dataStore = dataStoreDao.findById(dataStoreId);
+        long providerId = dataStore.getProvider();
+        DataStoreProvider provider = providerManager.getDataStoreProviderById(providerId);
+        ImageDataStore imgStore = new ImageDataStoreImpl(dataStore, 
+                driverMaps.get(provider.getUuid())
+                );
         // TODO Auto-generated method stub
-        return null;
+        return imgStore;
+    }
+
+    @Override
+    public boolean registerDriver(String uuid, ImageDataStoreDriver driver) {
+        if (driverMaps.containsKey(uuid)) {
+            return false;
+        }
+        driverMaps.put(uuid, driver);
+        return true;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/DefaultImageDataStoreProvider.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/DefaultImageDataStoreProvider.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/DefaultImageDataStoreProvider.java
deleted file mode 100644
index f87299d..0000000
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/DefaultImageDataStoreProvider.java
+++ /dev/null
@@ -1,77 +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.image.provider;
-
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import org.apache.cloudstack.storage.image.db.ImageDataStoreDao;
-import org.apache.cloudstack.storage.image.db.ImageDataStoreProviderDao;
-import org.apache.cloudstack.storage.image.db.ImageDataStoreProviderVO;
-import org.apache.cloudstack.storage.image.db.ImageDataStoreVO;
-import org.apache.cloudstack.storage.image.driver.ImageDataStoreDriver;
-import org.apache.cloudstack.storage.image.driver.ImageDataStoreDriverImpl;
-import org.apache.cloudstack.storage.image.store.ImageDataStore;
-import org.apache.cloudstack.storage.image.store.ImageDataStoreImpl;
-import org.apache.cloudstack.storage.image.store.lifecycle.DefaultImageDataStoreLifeCycle;
-import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCycle;
-import org.springframework.stereotype.Component;
-
-import com.cloud.utils.component.ComponentInject;
-
-@Component
-public class DefaultImageDataStoreProvider implements ImageDataStoreProvider {
-    private final String providerName = "DefaultProvider";
-    @Inject
-    ImageDataStoreProviderDao providerDao;
-    @Inject
-    ImageDataStoreDao imageStoreDao;
-    ImageDataStoreProviderVO provider;
-
-    @Override
-    public ImageDataStore getImageDataStore(long imageStoreId) {
-        ImageDataStoreVO idsv = imageStoreDao.findById(imageStoreId);
-        ImageDataStoreDriver driver = new ImageDataStoreDriverImpl();
-        ImageDataStore ids = new ImageDataStoreImpl(idsv, driver, false);
-        ids = ComponentInject.inject(ids);
-        return ids;
-    }
-
-    @Override
-    public String getName() {
-        return providerName;
-    }
-
-    @Override
-    public boolean register(long providerId) {
-        return true;
-    }
-
-    @Override
-    public boolean init() {
-        provider = providerDao.findByName(providerName);
-        return true;
-    }
-
-    @Override
-    public ImageDataStoreLifeCycle getLifeCycle() {
-    	return new DefaultImageDataStoreLifeCycle(this, provider, imageStoreDao);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProvider.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProvider.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProvider.java
deleted file mode 100644
index 710153a..0000000
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProvider.java
+++ /dev/null
@@ -1,34 +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.image.provider;
-
-import org.apache.cloudstack.storage.image.store.ImageDataStore;
-import org.apache.cloudstack.storage.image.store.lifecycle.ImageDataStoreLifeCycle;
-
-public interface ImageDataStoreProvider {
-    ImageDataStore getImageDataStore(long imageStoreId);
-    boolean register(long providerId);
-    public String getName();
-    ImageDataStoreLifeCycle getLifeCycle();
-    /**
-     * @param providerId
-     * @return
-     */
-    boolean init();
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a2f86003/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManager.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManager.java
deleted file mode 100644
index f03a0e1..0000000
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/provider/ImageDataStoreProviderManager.java
+++ /dev/null
@@ -1,39 +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.image.provider;
-
-import java.util.List;
-
-import org.apache.cloudstack.storage.image.TemplateObject;
-import org.apache.cloudstack.storage.image.store.ImageDataStore;
-
-import com.cloud.utils.component.Manager;
-
-public interface ImageDataStoreProviderManager extends Manager {
-    public ImageDataStoreProvider getProvider(long providerId);
-    public List<ImageDataStoreProvider> listProvider();
-    public ImageDataStore getDataStore(Long dataStoreId);
-
-    public ImageDataStore getDataStoreFromTemplateId(long templateId);
-    /**
-     * @param name
-     * @return
-     */
-    ImageDataStoreProvider getProvider(String name);
-}