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 03:04:54 UTC

[24/44] Revert "Merge remote-tracking branch 'origin/javelin' into javelin"

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java
index c3372b7..658d4db 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java
@@ -21,10 +21,9 @@ package org.apache.cloudstack.storage.datastore.lifecycle;
 import java.util.Map;
 
 import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
-import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
+import org.apache.cloudstack.storage.EndPoint;
 import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
 import org.apache.cloudstack.storage.datastore.DataStoreStatus;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
@@ -39,21 +38,29 @@ public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLif
     }
     
     @Override
-    public boolean initialize(DataStore store, Map<String, String> dsInfos) {
+    public void setDataStore(PrimaryDataStoreInfo dataStore) {
+        this.dataStore = (PrimaryDataStore)dataStore;
+    }
+    
+    @Override
+    public boolean initialize(Map<String, String> dsInfos) {
+        PrimaryDataStoreVO dataStore = dataStoreDao.findById(this.dataStore.getId());
+        dataStore.setStatus(DataStoreStatus.Initialized);
+        dataStoreDao.update(this.dataStore.getId(), dataStore);
         //TODO: add extension point for each data store
         return true;
     }
 
     protected void attachCluster() {
         //send down AttachPrimaryDataStoreCmd command to all the hosts in the cluster
-        AttachPrimaryDataStoreCmd cmd = new AttachPrimaryDataStoreCmd(this.dataStore.getUri());
-        /*for (EndPoint ep : dataStore.getEndPoints()) {
+        AttachPrimaryDataStoreCmd cmd = new AttachPrimaryDataStoreCmd(this.dataStore.getDataStoreTO());
+        for (EndPoint ep : dataStore.getEndPoints()) {
             ep.sendMessage(cmd);
-        } */
+        } 
     }
     
     @Override
-    public boolean attachCluster(DataStore dataStore, ClusterScope scope) {
+    public boolean attachCluster(ClusterScope scope) {
         PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(this.dataStore.getId());
         dataStoreVO.setDataCenterId(scope.getZoneId());
         dataStoreVO.setPodId(scope.getPodId());
@@ -100,12 +107,4 @@ public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLif
         return false;
     }
 
-
-
-    @Override
-    public boolean attachZone(DataStore dataStore, ZoneScope scope) {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java
index da61825..bb255b0 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java
@@ -18,7 +18,7 @@
  */
 package org.apache.cloudstack.storage.datastore.lifecycle;
 
-import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
+import org.apache.cloudstack.storage.EndPoint;
 import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
 import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
@@ -39,9 +39,8 @@ public class DefaultXenPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStore
     
     @Override
     public void attachCluster() {
-        String result = null;
         //send one time is enough, as xenserver is clustered
-        /*CreatePrimaryDataStoreCmd cmd = new CreatePrimaryDataStoreCmd(this.dataStore.getDataStoreTO());
+        CreatePrimaryDataStoreCmd cmd = new CreatePrimaryDataStoreCmd(this.dataStore.getDataStoreTO());
         String result = null;
         for (EndPoint ep : dataStore.getEndPoints()) {
             Answer answer = ep.sendMessage(cmd);
@@ -49,7 +48,7 @@ public class DefaultXenPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStore
                 return;
             }
             result = answer.getDetails();
-        }*/
+        }
         
         if (result != null)
             throw new CloudRuntimeException("AttachPrimaryDataStoreCmd failed: " + result);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java
new file mode 100644
index 0000000..139da4d
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreManagerImpl.java
@@ -0,0 +1,50 @@
+/*
+ * 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.datastore.manager;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
+import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao;
+import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProviderManager;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DefaultPrimaryDataStoreManagerImpl implements PrimaryDataStoreManager {
+    @Inject
+    PrimaryDataStoreProviderDao dataStoreProviderDao;
+    @Inject
+    PrimaryDataStoreProviderManager providerManager;
+    @Inject
+    PrimaryDataStoreDao dataStoreDao;
+
+    @Override
+    public PrimaryDataStore getPrimaryDataStore(long dataStoreId) {
+        PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId);
+        Long providerId = dataStoreVO.getStorageProviderId();
+        PrimaryDataStoreProvider provider = providerManager.getDataStoreProvider(providerId);
+        PrimaryDataStore dataStore = (PrimaryDataStore)provider.getDataStore(dataStoreId);
+        return dataStore;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreProviderManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreProviderManagerImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreProviderManagerImpl.java
deleted file mode 100644
index fd66ffb..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/DefaultPrimaryDataStoreProviderManagerImpl.java
+++ /dev/null
@@ -1,67 +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.datastore.manager;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore;
-import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
-import org.apache.cloudstack.storage.datastore.db.DataStoreProviderDao;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
-import org.apache.cloudstack.storage.datastore.provider.DataStoreProvider;
-import org.apache.cloudstack.storage.datastore.provider.DataStoreProviderManager;
-import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
-import org.springframework.stereotype.Component;
-
-@Component
-public class DefaultPrimaryDataStoreProviderManagerImpl implements PrimaryDataStoreProviderManager {
-    @Inject
-    DataStoreProviderDao dataStoreProviderDao;
-    @Inject
-    DataStoreProviderManager providerManager;
-    @Inject
-    PrimaryDataStoreDao dataStoreDao;
-    Map<String, PrimaryDataStoreDriver> driverMaps = new HashMap<String, PrimaryDataStoreDriver>();
-
-    @Override
-    public PrimaryDataStore getPrimaryDataStore(long dataStoreId) {
-        PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId);
-        long providerId = dataStoreVO.getStorageProviderId();
-        DataStoreProvider provider = providerManager.getDataStoreProviderById(providerId);
-        DefaultPrimaryDataStore dataStore = DefaultPrimaryDataStore.createDataStore(dataStoreVO, 
-                driverMaps.get(provider.getUuid()),
-                provider);
-
-        return dataStore;
-    }
-    
-    @Override
-    public boolean registerDriver(String uuid, PrimaryDataStoreDriver driver) {
-        if (driverMaps.get(uuid) != null) {
-            return false;
-        }
-        driverMaps.put(uuid, driver);
-        return true;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/PrimaryDataStoreManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/PrimaryDataStoreManager.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/PrimaryDataStoreManager.java
new file mode 100644
index 0000000..f6b3625
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/PrimaryDataStoreManager.java
@@ -0,0 +1,27 @@
+/*
+ * 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.datastore.manager;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
+import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
+
+public interface PrimaryDataStoreManager {
+    public PrimaryDataStore getPrimaryDataStore(long dataStoreId);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/data model.ucls
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/data model.ucls b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/data model.ucls
deleted file mode 100644
index 2e09bd5..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/manager/data model.ucls	
+++ /dev/null
@@ -1,57 +0,0 @@
-<class-diagram version="1.0.11" icons="true" always-add-relationships="false" generalizations="true" realizations="true" 
-  associations="true" dependencies="false" nesting-relationships="true">  
-  <interface id="1" corner="BOTTOM_RIGHT" language="java" 
-    name="org.apache.cloudstack.engine.subsystem.api.storage.DataObject" project="cloud-engine-api" 
-    file="/cloud-engine-api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataObject.java" binary="false">    
-    <position height="-1" width="-1" x="311" y="101"/>    
-    <display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" visibility="true">      
-      <attributes public="true" package="true" protected="true" private="true"/>      
-      <operations public="true" package="true" protected="true" private="true"/>    
-    </display>  
-  </interface>  
-  <interface id="2" corner="BOTTOM_RIGHT" language="java" 
-    name="org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo" project="cloud-engine-api" 
-    file="/cloud-engine-api/src/org/apache/cloudstack/engine/subsystem/api/storage/VolumeInfo.java" binary="false">    
-    <position height="-1" width="-1" x="146" y="279"/>    
-    <display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" visibility="true">      
-      <attributes public="true" package="true" protected="true" private="true"/>      
-      <operations public="true" package="true" protected="true" private="true"/>    
-    </display>  
-  </interface>  
-  <interface id="3" corner="BOTTOM_RIGHT" language="java" name="org.apache.cloudstack.storage.snapshot.SnapshotInfo" 
-    project="cloud-engine-storage" 
-    file="/cloud-engine-storage/src/org/apache/cloudstack/storage/snapshot/SnapshotInfo.java" binary="false">    
-    <position height="-1" width="-1" x="361" y="282"/>    
-    <display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" visibility="true">      
-      <attributes public="true" package="true" protected="true" private="true"/>      
-      <operations public="true" package="true" protected="true" private="true"/>    
-    </display>  
-  </interface>  
-  <interface id="4" corner="BOTTOM_RIGHT" language="java" name="org.apache.cloudstack.storage.image.TemplateInfo" 
-    project="cloud-engine-storage" 
-    file="/cloud-engine-storage/src/org/apache/cloudstack/storage/image/TemplateInfo.java" binary="false">    
-    <position height="-1" width="-1" x="573" y="292"/>    
-    <display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" visibility="true">      
-      <attributes public="true" package="true" protected="true" private="true"/>      
-      <operations public="true" package="true" protected="true" private="true"/>    
-    </display>  
-  </interface>  
-  <generalization id="5">    
-    <end type="SOURCE" refId="3"/>    
-    <end type="TARGET" refId="1"/>  
-  </generalization>  
-  <generalization id="6">    
-    <end type="SOURCE" refId="4"/>    
-    <end type="TARGET" refId="1"/>  
-  </generalization>  
-  <generalization id="7">    
-    <end type="SOURCE" refId="2"/>    
-    <end type="TARGET" refId="1"/>  
-  </generalization>  
-  <classifier-display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" 
-    visibility="true">    
-    <attributes public="true" package="true" protected="true" private="true"/>    
-    <operations public="true" package="true" protected="true" private="true"/>  
-  </classifier-display>  
-  <association-display labels="true" multiplicity="true"/>
-</class-diagram>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
index fe44ed8..55966be 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/DefaultPrimaryDatastoreProviderImpl.java
@@ -1,55 +1,166 @@
+// 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.datastore.provider;
 
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
+import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreLifeCycle;
-import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
+import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore;
+import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
+import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator;
+import org.apache.cloudstack.storage.datastore.configurator.validator.StorageProtocolTransformer;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderVO;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.driver.DefaultPrimaryDataStoreDriverImpl;
+import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver;
 import org.apache.cloudstack.storage.datastore.lifecycle.DefaultPrimaryDataStoreLifeCycleImpl;
-import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 
-import com.cloud.utils.component.ComponentContext;
+import com.cloud.dc.ClusterVO;
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
 public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProvider {
     private final String providerName = "default primary data store provider";
     protected PrimaryDataStoreDriver driver;
+    private PrimaryDataStoreProviderVO providerVO;
     @Inject
-    PrimaryDataStoreProviderManager storeMgr;
-    protected DataStoreLifeCycle lifecyle;
-    protected String uuid;
-    protected long id;
+    protected PrimaryDataStoreDao dataStoreDao;
+    @Inject
+    protected PrimaryDataStoreProviderDao providerDao;
+    @Inject
+    protected ClusterDao clusterDao;
+    protected Map<String, PrimaryDataStoreConfigurator> configuratorMaps = new HashMap<String, PrimaryDataStoreConfigurator>();
+
+    @Inject
+    public DefaultPrimaryDatastoreProviderImpl(@Qualifier("defaultProvider") List<PrimaryDataStoreConfigurator> configurators) {
+        for (PrimaryDataStoreConfigurator configurator : configurators) {
+            String key = generateKey(configurator.getSupportedHypervisor(), configurator.getSupportedDataStoreType().toString());
+            configuratorMaps.put(key, configurator);
+        }
+    }
+    
+    // TODO: Remove this.  I put this in to get over the compilation problem.  Edison needs to look at Solidfire's implementation which requires this.
+    public DefaultPrimaryDatastoreProviderImpl() {
+        
+    }
+
+    protected String generateKey(HypervisorType hypervisor, String poolType) {
+        return hypervisor.toString().toLowerCase() + "_" + poolType.toString().toLowerCase();
+    }
+
     @Override
-    public String getName() {
-        return providerName;
+    public PrimaryDataStore getDataStore(long dataStoreId) {
+        PrimaryDataStoreVO dsv = dataStoreDao.findById(dataStoreId);
+        if (dsv == null) {
+            return null;
+        }
+
+        String key = dsv.getKey();
+
+        PrimaryDataStoreConfigurator configurator = configuratorMaps.get(key);
+
+        DefaultPrimaryDataStore dataStore = (DefaultPrimaryDataStore)configurator.getDataStore(dataStoreId);
+        dataStore.setProvider(this);
+        return dataStore;
     }
 
     @Override
-    public DataStoreLifeCycle getLifeCycle() {
-        return this.lifecyle;
+    public PrimaryDataStore registerDataStore(Map<String, String> dsInfos) {
+        String url = dsInfos.get("url");
+        URI uri = null;
+        try {
+            uri = new URI(url);
+        } catch (URISyntaxException e) {
+            throw new CloudRuntimeException("invalid url: " + e.toString());
+        }
+        String protocol = uri.getScheme();
+        Long cluster = null;
+        try {
+            cluster = Long.parseLong(dsInfos.get("clusterId"));
+        } catch (NumberFormatException e) {
+            throw new CloudRuntimeException("Failed to get clusterId");
+        }
+        ClusterVO clusterVO = clusterDao.findById(cluster);
+        if (clusterVO == null) {
+            throw new CloudRuntimeException("Can't find cluster: " + cluster); 
+        }
+        HypervisorType hypervisor = clusterVO.getHypervisorType();
+        String key = generateKey(hypervisor, protocol);
+        PrimaryDataStoreConfigurator configurator = configuratorMaps.get(key);
+        if (configurator == null) {
+            throw new CloudRuntimeException("can't find configurator from key: " + key);
+        }
+
+        StorageProtocolTransformer validator = configurator.getProtocolTransformer();
+        validator.normalizeUserInput(dsInfos);
+
+        PrimaryDataStoreVO dataStoreVO = dataStoreDao.findPoolByUUID(dsInfos.get("uuid"));
+        if (dataStoreVO != null) {
+            throw new CloudRuntimeException("duplicate uuid: " + dsInfos.get("uuid"));
+        }
+        
+        dataStoreVO = new PrimaryDataStoreVO();
+        dataStoreVO.setStorageProviderId(this.getId());
+        dataStoreVO.setHostAddress(dsInfos.get("server"));
+        dataStoreVO.setPath(dsInfos.get("path"));
+        dataStoreVO.setPoolType(protocol);
+        dataStoreVO.setPort(Integer.parseInt(dsInfos.get("port")));
+        dataStoreVO.setKey(key);
+        dataStoreVO.setName(dsInfos.get("name"));
+        dataStoreVO.setUuid(dsInfos.get("uuid"));
+        dataStoreVO = dataStoreDao.persist(dataStoreVO);
+
+        DefaultPrimaryDataStore dataStore = (DefaultPrimaryDataStore)configurator.getDataStore(dataStoreVO.getId());
+        dataStore.setProvider(this);
+        
+        PrimaryDataStoreLifeCycle lifeCycle = dataStore.getLifeCycle();
+        lifeCycle.initialize(dsInfos);
+        return getDataStore(dataStore.getId());
     }
 
     @Override
-    public boolean configure(Map<String, Object> params) {
-        lifecyle = ComponentContext.inject(DefaultPrimaryDataStoreLifeCycleImpl.class);
-        driver = ComponentContext.inject(DefaultPrimaryDataStoreDriverImpl.class);
-        uuid = (String)params.get("uuid");
-        id = (Long)params.get("id");
-        storeMgr.registerDriver(uuid, this.driver);
-        return true;
+    public long getId() {
+        return this.providerVO.getId();
     }
 
     @Override
-    public String getUuid() {
-        return this.uuid;
+    public boolean configure() {
+        this.providerVO = providerDao.findByName(this.providerName);
+        return true;
     }
 
     @Override
-    public long getId() {
-        return this.id;
+    public String getName() {
+        return providerName;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java
new file mode 100644
index 0000000..c77f7a3
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManager.java
@@ -0,0 +1,29 @@
+// 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.datastore.provider;
+
+import java.util.List;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
+
+import com.cloud.utils.component.Manager;
+
+public interface PrimaryDataStoreProviderManager extends Manager {
+    public PrimaryDataStoreProvider getDataStoreProvider(Long providerId);
+    public PrimaryDataStoreProvider getDataStoreProvider(String name);
+    public List<PrimaryDataStoreProvider> getDataStoreProviders();
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java
new file mode 100644
index 0000000..33d98db
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/provider/PrimaryDataStoreProviderManagerImpl.java
@@ -0,0 +1,106 @@
+/*
+ * 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.datastore.provider;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.naming.ConfigurationException;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreProvider;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderVO;
+import org.springframework.stereotype.Component;
+
+import com.cloud.utils.db.DB;
+
+@Component
+public class PrimaryDataStoreProviderManagerImpl implements PrimaryDataStoreProviderManager {
+    @Inject
+    List<PrimaryDataStoreProvider> providers;
+    @Inject
+    PrimaryDataStoreProviderDao providerDao;
+    
+    @Override
+    public PrimaryDataStoreProvider getDataStoreProvider(Long providerId) {
+        for (PrimaryDataStoreProvider provider : providers) {
+            if (provider.getId() == providerId) {
+                return provider;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    @DB
+    public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
+        List<PrimaryDataStoreProviderVO> providerVos = providerDao.listAll();
+        for (PrimaryDataStoreProvider provider : providers) {
+            boolean existingProvider = false;
+            for (PrimaryDataStoreProviderVO providerVo : providerVos) {
+                if (providerVo.getName().equalsIgnoreCase(provider.getName())) {
+                    existingProvider = true;
+                    break;
+                }
+            }
+            if (!existingProvider) {
+                PrimaryDataStoreProviderVO dataStoreProvider = new PrimaryDataStoreProviderVO();
+                dataStoreProvider.setName(provider.getName());
+                dataStoreProvider = providerDao.persist(dataStoreProvider);
+            }
+            
+            provider.configure();
+        }
+        return true;
+    }
+
+    @Override
+    public boolean start() {
+        // TODO Auto-generated method stub
+        return true;
+    }
+
+    @Override
+    public boolean stop() {
+        // TODO Auto-generated method stub
+        return true;
+    }
+
+    @Override
+    public String getName() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public PrimaryDataStoreProvider getDataStoreProvider(String name) {
+        for (PrimaryDataStoreProvider provider : providers) {
+            if (provider.getName().equalsIgnoreCase(name)) {
+                return provider;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public List<PrimaryDataStoreProvider> getDataStoreProviders() {
+        return providers;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategy.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategy.java
deleted file mode 100644
index 7679bb3..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategy.java
+++ /dev/null
@@ -1,28 +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 org.apache.cloudstack.framework.async.AsyncCompletionCallback;
-import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.image.TemplateInfo;
-import org.apache.cloudstack.storage.volume.VolumeServiceImpl.CreateBaseImageResult;
-
-public interface TemplateInstallStrategy {
-    public Void installAsync(TemplateInfo template, PrimaryDataStore store, AsyncCompletionCallback<CreateBaseImageResult> callback);
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategyImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategyImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategyImpl.java
deleted file mode 100644
index ec6b032..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateInstallStrategyImpl.java
+++ /dev/null
@@ -1,293 +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 javax.inject.Inject;
-
-import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
-import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
-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.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
-import org.apache.cloudstack.storage.image.ImageDataFactory;
-import org.apache.cloudstack.storage.image.TemplateInfo;
-import org.apache.cloudstack.storage.motion.DataMotionService;
-import org.apache.cloudstack.storage.volume.VolumeServiceImpl.CreateBaseImageResult;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.fsm.NoTransitionException;
-
-@Component
-public class TemplateInstallStrategyImpl implements TemplateInstallStrategy {
-    private static final Logger s_logger = Logger
-            .getLogger(TemplateInstallStrategyImpl.class);
-    @Inject
-    ObjectInDataStoreManager objectInDataStoreMgr;
-    @Inject
-    DataMotionService motionSrv;
-    @Inject
-    ImageDataFactory imageFactory;
-    protected long waitingTime = 1800; // half an hour
-    protected long waitingRetries = 10;
-
-    protected TemplateInfo waitingForTemplateDownload(TemplateInfo template,
-            PrimaryDataStore dataStore) {
-        long retries = this.waitingRetries;
-        ObjectInDataStoreVO obj = null;
-        do {
-            try {
-                Thread.sleep(waitingTime);
-            } catch (InterruptedException e) {
-                s_logger.debug("sleep interrupted", e);
-                throw new CloudRuntimeException("sleep interrupted", e);
-            }
-
-            obj = objectInDataStoreMgr.findObject(template.getId(),
-                    template.getType(), dataStore.getId(), dataStore.getRole());
-            if (obj == null) {
-                s_logger.debug("can't find object in db, maybe it's cleaned up already, exit waiting");
-                break;
-            }
-            if (obj.getState() == ObjectInDataStoreStateMachine.State.Ready) {
-                break;
-            }
-            retries--;
-        } while (retries > 0);
-
-        if (obj == null || retries <= 0) {
-            s_logger.debug("waiting too long for template downloading, marked it as failed");
-            throw new CloudRuntimeException(
-                    "waiting too long for template downloading, marked it as failed");
-        }
-        return imageFactory.getTemplate(template.getId(), dataStore);
-    }
-
-    class InstallContext<T> extends AsyncRpcConext<T> {
-        final TemplateInfo destTemplate;
-        final TemplateInfo srcTemplate;
-
-        public InstallContext(AsyncCompletionCallback<T> callback,
-                TemplateInfo destTemplate, TemplateInfo srcTemplate) {
-            super(callback);
-            this.destTemplate = destTemplate;
-            this.srcTemplate = srcTemplate;
-        }
-
-    }
-
-    @Override
-    public Void installAsync(TemplateInfo template, PrimaryDataStore store,
-            AsyncCompletionCallback<CreateBaseImageResult> callback) {
-        ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(
-                template.getId(), template.getType(), store.getId(),
-                store.getRole());
-        TemplateInfo templateOnPrimaryStoreObj = null;
-        boolean freshNewTemplate = false;
-        if (obj == null) {
-            try {
-                templateOnPrimaryStoreObj = objectInDataStoreMgr.create(
-                        template, store);
-                freshNewTemplate = true;
-            } catch (Throwable e) {
-                obj = objectInDataStoreMgr.findObject(template.getId(),
-                        template.getType(), store.getId(), store.getRole());
-                if (obj == null) {
-                    CreateBaseImageResult result = new CreateBaseImageResult(
-                            null);
-                    result.setSucess(false);
-                    result.setResult(e.toString());
-                    callback.complete(result);
-                    return null;
-                }
-            }
-        }
-
-        if (!freshNewTemplate
-                && obj.getState() != ObjectInDataStoreStateMachine.State.Ready) {
-            try {
-                templateOnPrimaryStoreObj = waitingForTemplateDownload(
-                        template, store);
-            } catch (Exception e) {
-                CreateBaseImageResult result = new CreateBaseImageResult(null);
-                result.setSucess(false);
-                result.setResult(e.toString());
-                callback.complete(result);
-                return null;
-            }
-
-            CreateBaseImageResult result = new CreateBaseImageResult(
-                    templateOnPrimaryStoreObj);
-            callback.complete(result);
-            return null;
-        }
-
-        try {
-            objectInDataStoreMgr.update(templateOnPrimaryStoreObj,
-                    ObjectInDataStoreStateMachine.Event.CreateRequested);
-        } catch (NoTransitionException e) {
-            try {
-                objectInDataStoreMgr.update(templateOnPrimaryStoreObj,
-                        ObjectInDataStoreStateMachine.Event.OperationFailed);
-            } catch (NoTransitionException e1) {
-                s_logger.debug("state transation failed", e1);
-            }
-            CreateBaseImageResult result = new CreateBaseImageResult(null);
-            result.setSucess(false);
-            result.setResult(e.toString());
-            callback.complete(result);
-            return null;
-        }
-
-        InstallContext<CreateBaseImageResult> context = new InstallContext<CreateBaseImageResult>(
-                callback, templateOnPrimaryStoreObj, template);
-        AsyncCallbackDispatcher<TemplateInstallStrategyImpl, CreateCmdResult> caller = AsyncCallbackDispatcher
-                .create(this);
-        caller.setCallback(
-                caller.getTarget().installTemplateCallback(null, null))
-                .setContext(context);
-
-        store.getDriver().createAsync(templateOnPrimaryStoreObj, caller);
-        return null;
-    }
-
-    class CopyTemplateContext<T> extends AsyncRpcConext<T> {
-        TemplateInfo template;
-
-        public CopyTemplateContext(AsyncCompletionCallback<T> callback,
-                TemplateInfo template) {
-            super(callback);
-            this.template = template;
-        }
-    }
-
-    protected Void installTemplateCallback(
-            AsyncCallbackDispatcher<TemplateInstallStrategyImpl, CreateCmdResult> callback,
-            InstallContext<CreateBaseImageResult> context) {
-        CreateCmdResult result = callback.getResult();
-        TemplateInfo templateOnPrimaryStoreObj = context.destTemplate;
-        CreateBaseImageResult upResult = new CreateBaseImageResult(
-                templateOnPrimaryStoreObj);
-        if (result.isFailed()) {
-            upResult.setResult(result.getResult());
-            context.getParentCallback().complete(upResult);
-            return null;
-        }
-
-        ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(
-                templateOnPrimaryStoreObj.getId(), templateOnPrimaryStoreObj
-                        .getType(), templateOnPrimaryStoreObj.getDataStore()
-                        .getId(), templateOnPrimaryStoreObj.getDataStore()
-                        .getRole());
-
-        obj.setInstallPath(result.getPath());
-        try {
-            objectInDataStoreMgr.update(templateOnPrimaryStoreObj,
-                    ObjectInDataStoreStateMachine.Event.OperationSuccessed);
-        } catch (NoTransitionException e) {
-            try {
-                objectInDataStoreMgr.update(templateOnPrimaryStoreObj,
-                        ObjectInDataStoreStateMachine.Event.OperationFailed);
-            } catch (NoTransitionException e1) {
-                s_logger.debug("failed to change state", e1);
-            }
-
-            upResult.setResult(e.toString());
-            context.getParentCallback().complete(upResult);
-            return null;
-        }
-
-        moveTemplate(context.srcTemplate, templateOnPrimaryStoreObj, obj,
-                context.getParentCallback());
-        return null;
-    }
-
-    protected void moveTemplate(TemplateInfo srcTemplate,
-            TemplateInfo destTemplate, ObjectInDataStoreVO obj,
-            AsyncCompletionCallback<CreateBaseImageResult> callback) {
-        // move template into primary storage
-        try {
-            objectInDataStoreMgr.update(destTemplate,
-                    ObjectInDataStoreStateMachine.Event.CopyingRequested);
-        } catch (NoTransitionException e) {
-            s_logger.debug("failed to change state", e);
-            try {
-                objectInDataStoreMgr.update(destTemplate,
-                        ObjectInDataStoreStateMachine.Event.OperationFailed);
-            } catch (NoTransitionException e1) {
-
-            }
-            CreateBaseImageResult res = new CreateBaseImageResult(destTemplate);
-            res.setResult("Failed to change state: " + e.toString());
-            callback.complete(res);
-        }
-
-        CopyTemplateContext<CreateBaseImageResult> anotherCall = new CopyTemplateContext<CreateBaseImageResult>(
-                callback, destTemplate);
-        AsyncCallbackDispatcher<TemplateInstallStrategyImpl, CopyCommandResult> caller = AsyncCallbackDispatcher
-                .create(this);
-        caller.setCallback(caller.getTarget().copyTemplateCallback(null, null))
-                .setContext(anotherCall);
-
-        motionSrv.copyAsync(srcTemplate, destTemplate, caller);
-    }
-
-    protected Void copyTemplateCallback(
-            AsyncCallbackDispatcher<TemplateInstallStrategyImpl, CopyCommandResult> callback,
-            CopyTemplateContext<CreateBaseImageResult> context) {
-        CopyCommandResult result = callback.getResult();
-        TemplateInfo templateOnPrimaryStoreObj = context.template;
-        if (result.isFailed()) {
-            CreateBaseImageResult res = new CreateBaseImageResult(
-                    templateOnPrimaryStoreObj);
-            res.setResult(result.getResult());
-            context.getParentCallback().complete(res);
-        }
-        ObjectInDataStoreVO obj = objectInDataStoreMgr.findObject(
-                templateOnPrimaryStoreObj.getId(), templateOnPrimaryStoreObj
-                        .getType(), templateOnPrimaryStoreObj.getDataStore()
-                        .getId(), templateOnPrimaryStoreObj.getDataStore()
-                        .getRole());
-
-        obj.setInstallPath(result.getPath());
-        CreateBaseImageResult res = new CreateBaseImageResult(
-                templateOnPrimaryStoreObj);
-        try {
-            objectInDataStoreMgr.update(templateOnPrimaryStoreObj,
-                    ObjectInDataStoreStateMachine.Event.OperationSuccessed);
-        } catch (NoTransitionException e) {
-            s_logger.debug("Failed to update copying state: ", e);
-            try {
-                objectInDataStoreMgr.update(templateOnPrimaryStoreObj,
-                        ObjectInDataStoreStateMachine.Event.OperationFailed);
-            } catch (NoTransitionException e1) {
-            }
-
-            res.setResult("Failed to update copying state: " + e.toString());
-            context.getParentCallback().complete(res);
-        }
-        context.getParentCallback().complete(res);
-        return null;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/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
new file mode 100644
index 0000000..9221fb4
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplateOnPrimaryDataStoreObject.java
@@ -0,0 +1,87 @@
+/*
+ * 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 org.apache.cloudstack.storage.datastore.PrimaryDataStore;
+import org.apache.cloudstack.storage.image.TemplateInfo;
+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 com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.fsm.NoTransitionException;
+import com.cloud.utils.fsm.StateMachine2;
+
+public class TemplateOnPrimaryDataStoreObject implements TemplateOnPrimaryDataStoreInfo {
+    protected PrimaryDataStore dataStore;
+    protected TemplateInfo template;
+    protected TemplatePrimaryDataStoreVO vo;
+    protected TemplatePrimaryDataStoreDao templateStoreDao;
+    protected TemplatePrimaryDataStoreManager mgr;
+    protected StateMachine2<State, Event, TemplatePrimaryDataStoreVO> stateMachine;
+
+    public TemplateOnPrimaryDataStoreObject(PrimaryDataStore primaryDataStore, TemplateInfo template, TemplatePrimaryDataStoreVO vo,
+    		TemplatePrimaryDataStoreDao templateStoreDao, TemplatePrimaryDataStoreManager mgr) {
+        this.dataStore = primaryDataStore;
+        this.template = template;
+        this.vo = vo;
+        this.templateStoreDao = templateStoreDao;
+        this.mgr = mgr;
+        this.stateMachine = mgr.getStateMachine();
+    }
+
+    @Override
+    public String getPath() {
+        return vo.getInstallPath();
+    }
+
+    @Override
+    public void setPath(String path) {
+        this.vo.setInstallPath(path);
+    }
+
+    @Override
+    public PrimaryDataStore getPrimaryDataStore() {
+        return this.dataStore;
+    }
+
+    @Override
+    public TemplateInfo getTemplate() {
+        return this.template;
+    }
+
+    public void updateStatus(Status status) {
+        vo.setDownloadState(status);
+        templateStoreDao.update(vo.getId(), vo);
+        vo = templateStoreDao.findById(vo.getId());
+    }
+    
+    public void stateTransit(ObjectInDataStoreStateMachine.Event event) {
+        try {
+            this.stateMachine.transitTo(vo, event, null, templateStoreDao);
+            vo = templateStoreDao.findById(vo.getId());
+        } catch (NoTransitionException e) {
+           throw new CloudRuntimeException("Failed change state", e);
+        } catch (Exception e) {
+            throw new CloudRuntimeException("Failed change state", e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/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
new file mode 100644
index 0000000..5978424
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManager.java
@@ -0,0 +1,35 @@
+/*
+ * 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 org.apache.cloudstack.storage.datastore.PrimaryDataStore;
+import org.apache.cloudstack.storage.image.TemplateInfo;
+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;
+
+public interface TemplatePrimaryDataStoreManager {
+    public TemplateOnPrimaryDataStoreInfo createTemplateOnPrimaryDataStore(TemplateInfo template, PrimaryDataStore dataStore);
+
+    public TemplateOnPrimaryDataStoreInfo findTemplateOnPrimaryDataStore(TemplateInfo template, PrimaryDataStore dataStore);
+    
+    public StateMachine2<State, Event, TemplatePrimaryDataStoreVO> getStateMachine();
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/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
new file mode 100644
index 0000000..fc4e4fd
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/TemplatePrimaryDataStoreManagerImpl.java
@@ -0,0 +1,129 @@
+/*
+ * 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 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.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;
+
+import com.cloud.storage.VMTemplateStorageResourceAssoc;
+import com.cloud.utils.db.SearchCriteria2;
+import com.cloud.utils.db.SearchCriteriaService;
+import com.cloud.utils.db.SearchCriteria.Op;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.fsm.StateMachine2;
+
+@Component
+public class TemplatePrimaryDataStoreManagerImpl implements TemplatePrimaryDataStoreManager {
+    @Inject
+    TemplatePrimaryDataStoreDao templateStoreDao;
+    protected long waitingTime = 1800; //half an hour
+    protected long waitingReties = 10;
+    protected StateMachine2<State, Event, TemplatePrimaryDataStoreVO> stateMachines;
+    public TemplatePrimaryDataStoreManagerImpl() {
+        stateMachines = new StateMachine2<State, Event, TemplatePrimaryDataStoreVO>();
+        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) {
+        //the naive version, polling.
+        long retries = waitingReties;
+        TemplatePrimaryDataStoreVO templateStoreVO = null;
+        do {
+            try {
+                Thread.sleep(waitingTime);
+            } catch (InterruptedException e) {
+                
+            }
+            
+            templateStoreVO = templateStoreDao.findByTemplateIdAndPoolIdAndReady(template.getId(), dataStore.getId());
+            if (templateStoreVO != null) {
+                break;
+            }
+            retries--;
+        } while (retries > 0);
+        
+        if (templateStoreVO == null) {
+            throw new CloudRuntimeException("waiting too long for template downloading, marked it as failed");
+        }
+        
+        return templateStoreVO;
+    }
+    @Override
+    public TemplateOnPrimaryDataStoreObject createTemplateOnPrimaryDataStore(TemplateInfo template, PrimaryDataStore dataStore) {
+        TemplatePrimaryDataStoreVO templateStoreVO = null;
+        boolean freshNewTemplate = false;
+        templateStoreVO = templateStoreDao.findByTemplateIdAndPoolId(template.getId(), dataStore.getId());
+        if (templateStoreVO == null) {
+            try {
+                templateStoreVO = new TemplatePrimaryDataStoreVO(dataStore.getId(), template.getId());
+                templateStoreVO = templateStoreDao.persist(templateStoreVO);
+                freshNewTemplate = true;
+            } catch (Throwable th) {
+                templateStoreVO = templateStoreDao.findByTemplateIdAndPoolId(template.getId(), dataStore.getId());
+                if (templateStoreVO == null) {
+                    throw new CloudRuntimeException("Failed create db entry: " + th.toString());
+                }
+            }
+        }
+        
+        //If it's not a fresh template downloading, waiting for other people downloading finished.
+        if (!freshNewTemplate && templateStoreVO.getState() != ObjectInDataStoreStateMachine.State.Ready) {
+            templateStoreVO = waitingForTemplateDownload(template, dataStore);
+        }
+
+        TemplateOnPrimaryDataStoreObject templateStoreObject = new TemplateOnPrimaryDataStoreObject(dataStore, template, templateStoreVO, templateStoreDao, this);
+        return templateStoreObject;
+    }
+
+    @Override
+    public TemplateOnPrimaryDataStoreObject findTemplateOnPrimaryDataStore(TemplateInfo template, PrimaryDataStore dataStore) {
+        SearchCriteriaService<TemplatePrimaryDataStoreVO, TemplatePrimaryDataStoreVO> sc = SearchCriteria2.create(TemplatePrimaryDataStoreVO.class);
+        sc.addAnd(sc.getEntity().getTemplateId(), Op.EQ, template.getId());
+        sc.addAnd(sc.getEntity().getPoolId(), Op.EQ, dataStore.getId());
+        sc.addAnd(sc.getEntity().getDownloadState(), Op.EQ, VMTemplateStorageResourceAssoc.Status.DOWNLOADED);
+        TemplatePrimaryDataStoreVO templateStoreVO = sc.find();
+        if (templateStoreVO == null) {
+        	return null;
+        }
+        
+        TemplateOnPrimaryDataStoreObject templateStoreObject = new TemplateOnPrimaryDataStoreObject(dataStore, template, templateStoreVO, templateStoreDao, this);
+        return templateStoreObject;
+    }
+    
+    @Override
+    public StateMachine2<State, Event, TemplatePrimaryDataStoreVO> getStateMachine() {
+        return stateMachines;
+    }
+     
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java
deleted file mode 100644
index 38c35f8..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.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.volume;
-
-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.engine.subsystem.api.storage.VolumeInfo;
-import org.apache.cloudstack.storage.datastore.DataStoreManager;
-import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
-import org.apache.cloudstack.storage.datastore.VolumeDataFactory;
-import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
-import org.apache.cloudstack.storage.volume.db.VolumeDao2;
-import org.apache.cloudstack.storage.volume.db.VolumeVO;
-import org.springframework.stereotype.Component;
-
-@Component
-public class VolumeDataFactoryImpl implements VolumeDataFactory {
-    @Inject
-    VolumeDao2 volumeDao;
-    @Inject
-    ObjectInDataStoreManager objMap;
-    @Inject
-    DataStoreManager storeMgr;
-    @Override
-    public VolumeInfo getVolume(long volumeId, DataStore store) {
-        VolumeVO volumeVO = volumeDao.findById(volumeId);
-        ObjectInDataStoreVO obj = objMap.findObject(volumeId, DataObjectType.VOLUME, store.getId(), store.getRole());
-        if (obj == null) {
-            return null;
-        }
-        VolumeObject vol = VolumeObject.getVolumeObject(store, volumeVO);
-        return vol;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java
deleted file mode 100644
index 14d7417..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeEntityImpl.java
+++ /dev/null
@@ -1,207 +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 java.lang.reflect.Method;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-
-import org.apache.cloudstack.engine.cloud.entity.api.SnapshotEntity;
-import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
-import org.apache.cloudstack.engine.datacenter.entity.api.StorageEntity;
-import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
-import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
-import org.apache.cloudstack.engine.subsystem.api.storage.disktype.DiskFormat;
-import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
-import org.apache.cloudstack.framework.async.AsyncCallFuture;
-import org.apache.cloudstack.storage.datastore.PrimaryDataStoreEntityImpl;
-import org.apache.cloudstack.storage.volume.VolumeService.VolumeApiResult;
-
-import com.cloud.utils.exception.CloudRuntimeException;
-
-public class VolumeEntityImpl implements VolumeEntity {
-    private VolumeInfo volumeInfo;
-    private final VolumeService vs;
-    private VolumeApiResult result;
-    
-    protected VolumeEntityImpl() {
-        this.vs = null;
-    }
-    
-    public VolumeEntityImpl(VolumeInfo volumeObject, VolumeService vs) {
-        this.volumeInfo = volumeObject;
-        this.vs = vs;
-    }
-
-    public VolumeInfo getVolumeInfo() {
-        return volumeInfo;
-    }
-
-    @Override 
-    public String getUuid() {
-        return volumeInfo.getUuid();
-    }
-
-    @Override
-    public long getId() {
-        return volumeInfo.getId();
-    }
-
-    public String getExternalId() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getCurrentState() {
-        return null;
-    }
-
-    @Override
-    public String getDesiredState() {
-        return null;
-    }
-
-    @Override
-    public Date getCreatedTime() {
-        return null;
-    }
-
-    @Override
-    public Date getLastUpdatedTime() {
-        return null;
-    }
-
-    @Override
-    public String getOwner() {
-        return null;
-    }
-
-  
-    @Override
-    public List<Method> getApplicableActions() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public SnapshotEntity takeSnapshotOf(boolean full) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String reserveForMigration(long expirationTime) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void migrate(String reservationToken) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public VolumeEntity setupForCopy() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void copy(VolumeEntity dest) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void attachTo(String vm, long deviceId) {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void detachFrom() {
-        // TODO Auto-generated method stub
-
-    }
-
-
-    @Override
-    public long getSize() {
-        return volumeInfo.getSize();
-    }
-
-    @Override
-    public DiskFormat getDiskType() {
-         return null;
-    }
-
-    @Override
-    public VolumeType getType() {
-        return null;
-    }
-
-    @Override
-    public StorageEntity getDataStore() {
-        return new PrimaryDataStoreEntityImpl((PrimaryDataStoreInfo) volumeInfo.getDataStore());
-    }
-
-    @Override
-    public void destroy() {
-        AsyncCallFuture<VolumeApiResult> future = vs.deleteVolumeAsync(volumeInfo);
-        try {
-            result = future.get();
-            if (!result.isSuccess()) {
-                throw new CloudRuntimeException("Failed to create volume:" + result.getResult());
-            }
-        } catch (InterruptedException e) {
-           throw new CloudRuntimeException("wait to delete volume info failed", e);
-        } catch (ExecutionException e) {
-            throw new CloudRuntimeException("wait to delete volume failed", e);
-        }
-    }
-
-	@Override
-	public Map<String, String> getDetails() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public void addDetail(String name, String value) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void delDetail(String name, String value) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public void updateDetail(String name, String value) {
-		// TODO Auto-generated method stub
-		
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java
index 98c6b69..77a5949 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeManagerImpl.java
@@ -18,6 +18,8 @@
  */
 package org.apache.cloudstack.storage.volume;
 
+import javax.inject.Inject;
+
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeProfile;
 import org.apache.cloudstack.storage.volume.db.VolumeDao2;
 import org.apache.cloudstack.storage.volume.db.VolumeVO;
@@ -26,7 +28,6 @@ import org.springframework.stereotype.Component;
 import com.cloud.storage.Volume;
 import com.cloud.storage.Volume.Event;
 import com.cloud.storage.Volume.State;
-import com.cloud.utils.component.Inject;
 import com.cloud.utils.fsm.NoTransitionException;
 import com.cloud.utils.fsm.StateMachine2;
 
@@ -39,6 +40,7 @@ public class VolumeManagerImpl implements VolumeManager {
         initStateMachine();
     }
 
+    @Override
     public VolumeVO allocateDuplicateVolume(VolumeVO oldVol) {
         /*
         VolumeVO newVol = new VolumeVO(oldVol.getVolumeType(), oldVol.getName(), oldVol.getDataCenterId(), oldVol.getDomainId(), oldVol.getAccountId(), oldVol.getDiskOfferingId(), oldVol.getSize());
@@ -47,58 +49,62 @@ public class VolumeManagerImpl implements VolumeManager {
         newVol.setInstanceId(oldVol.getInstanceId());
         newVol.setRecreatable(oldVol.isRecreatable());
         newVol.setReservationId(oldVol.getReservationId());
-        */
+         */
         return null;
         // return _volumeDao.persist(newVol);
     }
-    
+
     private void initStateMachine() {
-            s_fsm.addTransition(Volume.State.Allocated, Event.CreateRequested, Volume.State.Creating);
-            s_fsm.addTransition(Volume.State.Allocated, Event.DestroyRequested, Volume.State.Destroying);
-            s_fsm.addTransition(Volume.State.Creating, Event.OperationRetry, Volume.State.Creating);
-            s_fsm.addTransition(Volume.State.Creating, Event.OperationFailed, Volume.State.Allocated);
-            s_fsm.addTransition(Volume.State.Creating, Event.OperationSucceeded, Volume.State.Ready);
-            s_fsm.addTransition(Volume.State.Creating, Event.DestroyRequested, Volume.State.Destroying);
-            s_fsm.addTransition(Volume.State.Creating, Event.CreateRequested, Volume.State.Creating);            
-            s_fsm.addTransition(Volume.State.Allocated, Event.UploadRequested, Volume.State.UploadOp);
-            s_fsm.addTransition(Volume.State.UploadOp, Event.CopyRequested, Volume.State.Creating);// CopyRequested for volume from sec to primary storage            
-            s_fsm.addTransition(Volume.State.Creating, Event.CopySucceeded, Volume.State.Ready);
-            s_fsm.addTransition(Volume.State.Creating, Event.CopyFailed, Volume.State.UploadOp);// Copying volume from sec to primary failed.  
-            s_fsm.addTransition(Volume.State.UploadOp, Event.DestroyRequested, Volume.State.Destroying);
-            s_fsm.addTransition(Volume.State.Ready, Event.DestroyRequested, Volume.State.Destroying);
-            s_fsm.addTransition(Volume.State.Destroy, Event.ExpungingRequested, Volume.State.Expunging);
-            s_fsm.addTransition(Volume.State.Ready, Event.SnapshotRequested, Volume.State.Snapshotting);
-            s_fsm.addTransition(Volume.State.Snapshotting, Event.OperationSucceeded, Volume.State.Ready);
-            s_fsm.addTransition(Volume.State.Snapshotting, Event.OperationFailed, Volume.State.Ready);
-            s_fsm.addTransition(Volume.State.Ready, Event.MigrationRequested, Volume.State.Migrating);
-            s_fsm.addTransition(Volume.State.Migrating, Event.OperationSucceeded, Volume.State.Ready);
-            s_fsm.addTransition(Volume.State.Migrating, Event.OperationFailed, Volume.State.Ready);
-            s_fsm.addTransition(Volume.State.Destroy, Event.OperationSucceeded, Volume.State.Destroy);
-            s_fsm.addTransition(Volume.State.Destroying, Event.OperationSucceeded, Volume.State.Destroy);
-            s_fsm.addTransition(Volume.State.Destroying, Event.OperationFailed, Volume.State.Destroying);
-            s_fsm.addTransition(Volume.State.Destroying, Event.DestroyRequested, Volume.State.Destroying);
+        s_fsm.addTransition(Volume.State.Allocated, Event.CreateRequested, Volume.State.Creating);
+        s_fsm.addTransition(Volume.State.Allocated, Event.DestroyRequested, Volume.State.Destroying);
+        s_fsm.addTransition(Volume.State.Creating, Event.OperationRetry, Volume.State.Creating);
+        s_fsm.addTransition(Volume.State.Creating, Event.OperationFailed, Volume.State.Allocated);
+        s_fsm.addTransition(Volume.State.Creating, Event.OperationSucceeded, Volume.State.Ready);
+        s_fsm.addTransition(Volume.State.Creating, Event.DestroyRequested, Volume.State.Destroying);
+        s_fsm.addTransition(Volume.State.Creating, Event.CreateRequested, Volume.State.Creating);            
+        s_fsm.addTransition(Volume.State.Allocated, Event.UploadRequested, Volume.State.UploadOp);
+        s_fsm.addTransition(Volume.State.UploadOp, Event.CopyRequested, Volume.State.Creating);// CopyRequested for volume from sec to primary storage            
+        s_fsm.addTransition(Volume.State.Creating, Event.CopySucceeded, Volume.State.Ready);
+        s_fsm.addTransition(Volume.State.Creating, Event.CopyFailed, Volume.State.UploadOp);// Copying volume from sec to primary failed.  
+        s_fsm.addTransition(Volume.State.UploadOp, Event.DestroyRequested, Volume.State.Destroying);
+        s_fsm.addTransition(Volume.State.Ready, Event.DestroyRequested, Volume.State.Destroying);
+        s_fsm.addTransition(Volume.State.Destroy, Event.ExpungingRequested, Volume.State.Expunging);
+        s_fsm.addTransition(Volume.State.Ready, Event.SnapshotRequested, Volume.State.Snapshotting);
+        s_fsm.addTransition(Volume.State.Snapshotting, Event.OperationSucceeded, Volume.State.Ready);
+        s_fsm.addTransition(Volume.State.Snapshotting, Event.OperationFailed, Volume.State.Ready);
+        s_fsm.addTransition(Volume.State.Ready, Event.MigrationRequested, Volume.State.Migrating);
+        s_fsm.addTransition(Volume.State.Migrating, Event.OperationSucceeded, Volume.State.Ready);
+        s_fsm.addTransition(Volume.State.Migrating, Event.OperationFailed, Volume.State.Ready);
+        s_fsm.addTransition(Volume.State.Destroy, Event.OperationSucceeded, Volume.State.Destroy);
+        s_fsm.addTransition(Volume.State.Destroying, Event.OperationSucceeded, Volume.State.Destroy);
+        s_fsm.addTransition(Volume.State.Destroying, Event.OperationFailed, Volume.State.Destroying);
+        s_fsm.addTransition(Volume.State.Destroying, Event.DestroyRequested, Volume.State.Destroying);
     }
-    
+
     @Override
     public StateMachine2<State, Event, VolumeVO> getStateMachine() {
         return s_fsm;
     }
 
+    @Override
     public VolumeVO processEvent(Volume vol, Volume.Event event) throws NoTransitionException {
         // _volStateMachine.transitTo(vol, event, null, _volumeDao);
         return _volumeDao.findById(vol.getId());
     }
 
+    @Override
     public VolumeProfile getProfile(long volumeId) {
         // TODO Auto-generated method stub
         return null;
     }
 
+    @Override
     public VolumeVO getVolume(long volumeId) {
         // TODO Auto-generated method stub
         return null;
     }
 
+    @Override
     public VolumeVO updateVolume(VolumeVO volume) {
         // TODO Auto-generated method stub
         return null;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/110465b5/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
index 1faacbb..13ae35c 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java
@@ -1,20 +1,39 @@
+// 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 java.io.File;
+import java.util.Date;
 
 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.engine.subsystem.api.storage.PrimaryDataStoreInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
-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.disktype.VolumeDiskTypeHelper;
+import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
 import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeTypeHelper;
+import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
 import org.apache.cloudstack.storage.volume.db.VolumeDao2;
 import org.apache.cloudstack.storage.volume.db.VolumeVO;
 import org.apache.log4j.Logger;
 
 import com.cloud.storage.Volume;
-import com.cloud.utils.component.ComponentInject;
+import com.cloud.storage.Volume.State;
+import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.NoTransitionException;
 import com.cloud.utils.fsm.StateMachine2;
@@ -23,71 +42,84 @@ public class VolumeObject implements VolumeInfo {
     private static final Logger s_logger = Logger.getLogger(VolumeObject.class);
     protected VolumeVO volumeVO;
     private StateMachine2<Volume.State, Volume.Event, VolumeVO> _volStateMachine;
-    protected DataStore dataStore;
-
+    protected PrimaryDataStore dataStore;
+    @Inject
+    VolumeDiskTypeHelper diskTypeHelper;
     @Inject
     VolumeTypeHelper volumeTypeHelper;
     @Inject
     VolumeDao2 volumeDao;
     @Inject
     VolumeManager volumeMgr;
-    private VolumeObject(DataStore dataStore, VolumeVO volumeVO) {
+    private VolumeObject(PrimaryDataStore dataStore, VolumeVO volumeVO) {
         this.volumeVO = volumeVO;
         this.dataStore = dataStore;
     }
-    
-    public static VolumeObject getVolumeObject(DataStore dataStore, VolumeVO volumeVO) {
+
+    public static VolumeObject getVolumeObject(PrimaryDataStore dataStore, VolumeVO volumeVO) {
         VolumeObject vo = new VolumeObject(dataStore, volumeVO);
-        vo = ComponentInject.inject(vo);
+        vo = ComponentContext.inject(vo);
         return vo;
     }
 
+    @Override
     public String getUuid() {
         return volumeVO.getUuid();
     }
 
     public void setPath(String uuid) {
-        volumeVO.setPath(uuid);
+        volumeVO.setUuid(uuid);
     }
 
+    @Override
     public String getPath() {
         return volumeVO.getPath();
     }
 
+    @Override
     public String getTemplateUuid() {
         return null;
     }
 
+    @Override
     public String getTemplatePath() {
         return null;
     }
 
+    public PrimaryDataStoreInfo getDataStoreInfo() {
+        return dataStore;
+    }
+
     public Volume.State getState() {
         return volumeVO.getState();
     }
 
-    public DataStore getDataStore() {
+    @Override
+    public PrimaryDataStore getDataStore() {
         return dataStore;
     }
 
+    @Override
     public long getSize() {
         return volumeVO.getSize();
     }
 
-    public DiskFormat getDiskType() {
-        return null;
+    @Override
+    public VolumeDiskType getDiskType() {
+        return diskTypeHelper.getDiskType(volumeVO.getDiskType());
     }
 
-    public DataObjectType getType() {
-        return DataObjectType.VOLUME;
+    @Override
+    public VolumeType getType() {
+        return volumeTypeHelper.getType(volumeVO.getVolumeType());
     }
 
     public long getVolumeId() {
         return volumeVO.getId();
     }
 
-    public void setVolumeDiskType(DiskFormat type) {
-        //volumeVO.setDiskType(type.toString());
+    public void setVolumeDiskType(VolumeDiskType type) {
+        volumeVO.setDiskType(type.toString());
     }
 
     public boolean stateTransit(Volume.Event event) {
@@ -110,22 +142,47 @@ public class VolumeObject implements VolumeInfo {
 
     @Override
     public long getId() {
-        return this.volumeVO.getId();
+        // TODO Auto-generated method stub
+        return 0;
     }
 
     @Override
-    public boolean isAttachedVM() {
-        return (this.volumeVO.getInstanceId() == null) ? false : true;
+    public State getCurrentState() {
+        // TODO Auto-generated method stub
+        return null;
     }
 
     @Override
-    public String getUri() {
-        return this.dataStore.getUri() + File.separator + "?type=volume&path=" + this.volumeVO.getPath();
+    public State getDesiredState() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Date getCreatedDate() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Date getUpdatedDate() {
+        // TODO Auto-generated method stub
+        return null;
     }
 
     @Override
-    public DiskFormat getFormat() {
+    public String getOwner() {
         // TODO Auto-generated method stub
         return null;
     }
+
+    @Override
+    public String getName() {
+        return this.volumeVO.getName();
+    }
+
+    @Override
+    public boolean isAttachedVM() {
+        return (this.volumeVO.getInstanceId() == null) ? false : true;
+    }
 }