http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8af85b04/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 13ae35c..96a1b29 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
@@ -16,23 +16,19 @@
 // under the License.
 package org.apache.cloudstack.storage.volume;
 
-import java.util.Date;
+import java.io.File;
 
 import javax.inject.Inject;
 
-import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
+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.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.engine.subsystem.api.storage.disktype.DiskFormat;
 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.storage.Volume.State;
 import com.cloud.utils.component.ComponentContext;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.NoTransitionException;
@@ -42,21 +38,17 @@ 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 PrimaryDataStore dataStore;
-    @Inject
-    VolumeDiskTypeHelper diskTypeHelper;
-    @Inject
-    VolumeTypeHelper volumeTypeHelper;
+    protected DataStore dataStore;
     @Inject
     VolumeDao2 volumeDao;
     @Inject
     VolumeManager volumeMgr;
-    private VolumeObject(PrimaryDataStore dataStore, VolumeVO volumeVO) {
+    private VolumeObject(DataStore dataStore, VolumeVO volumeVO) {
         this.volumeVO = volumeVO;
         this.dataStore = dataStore;
     }
 
-    public static VolumeObject getVolumeObject(PrimaryDataStore dataStore, 
VolumeVO volumeVO) {
+    public static VolumeObject getVolumeObject(DataStore dataStore, VolumeVO 
volumeVO) {
         VolumeObject vo = new VolumeObject(dataStore, volumeVO);
         vo = ComponentContext.inject(vo);
         return vo;
@@ -68,7 +60,7 @@ public class VolumeObject implements VolumeInfo {
     }
 
     public void setPath(String uuid) {
-        volumeVO.setUuid(uuid);
+        volumeVO.setPath(uuid);
     }
 
     @Override
@@ -76,26 +68,15 @@ public class VolumeObject implements VolumeInfo {
         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();
     }
 
     @Override
-    public PrimaryDataStore getDataStore() {
+    public DataStore getDataStore() {
         return dataStore;
     }
 
@@ -104,23 +85,13 @@ public class VolumeObject implements VolumeInfo {
         return volumeVO.getSize();
     }
 
-    @Override
-    public VolumeDiskType getDiskType() {
-        return diskTypeHelper.getDiskType(volumeVO.getDiskType());
-    }
 
-    @Override
-    public VolumeType getType() {
-        return volumeTypeHelper.getType(volumeVO.getVolumeType());
-    }
+
 
     public long getVolumeId() {
         return volumeVO.getId();
     }
 
-    public void setVolumeDiskType(VolumeDiskType type) {
-        volumeVO.setDiskType(type.toString());
-    }
 
     public boolean stateTransit(Volume.Event event) {
         boolean result = false;
@@ -146,43 +117,25 @@ public class VolumeObject implements VolumeInfo {
         return 0;
     }
 
+  
     @Override
-    public State getCurrentState() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public State getDesiredState() {
-        // TODO Auto-generated method stub
-        return null;
+    public boolean isAttachedVM() {
+        return (this.volumeVO.getInstanceId() == null) ? false : true;
     }
 
     @Override
-    public Date getCreatedDate() {
-        // TODO Auto-generated method stub
-        return null;
+    public String getUri() {
+        return this.dataStore.getUri() + File.separator + "?type=volume&path=" 
+ this.volumeVO.getPath();
     }
 
     @Override
-    public Date getUpdatedDate() {
-        // TODO Auto-generated method stub
-        return null;
+    public DataObjectType getType() {
+       return DataObjectType.VOLUME;
     }
 
     @Override
-    public String getOwner() {
+    public DiskFormat getFormat() {
         // 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;
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8af85b04/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
 
b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
index afe985b..f3da368 100644
--- 
a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
+++ 
b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java
@@ -21,30 +21,27 @@ package org.apache.cloudstack.storage.volume;
 import javax.inject.Inject;
 
 import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
+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.DataStore;
+import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
 import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
-import 
org.apache.cloudstack.engine.subsystem.api.storage.disktype.VolumeDiskType;
 import org.apache.cloudstack.engine.subsystem.api.storage.type.VolumeType;
 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.EndPoint;
-import org.apache.cloudstack.storage.command.CommandResult;
 import org.apache.cloudstack.storage.datastore.ObjectInDataStoreManager;
 import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.datastore.manager.PrimaryDataStoreManager;
-import org.apache.cloudstack.storage.db.ObjectInDataStoreVO;
+import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
 import org.apache.cloudstack.storage.image.TemplateInfo;
 import org.apache.cloudstack.storage.image.motion.ImageMotionService;
-import org.apache.cloudstack.storage.volume.VolumeService.VolumeApiResult;
 import org.apache.cloudstack.storage.volume.db.VolumeDao2;
 import org.apache.cloudstack.storage.volume.db.VolumeVO;
-
 import org.springframework.stereotype.Component;
-import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
+
 import com.cloud.storage.Volume;
 import com.cloud.utils.db.DB;
-import com.cloud.utils.exception.CloudRuntimeException;
 
 //1. change volume state
 //2. orchestrator of volume, control most of the information of volume, 
storage pool id, voluem state, scope etc.
@@ -54,11 +51,13 @@ public class VolumeServiceImpl implements VolumeService {
     @Inject
     VolumeDao2 volDao;
     @Inject
-    PrimaryDataStoreManager dataStoreMgr;
+    PrimaryDataStoreProviderManager dataStoreMgr;
     @Inject
     ObjectInDataStoreManager objectInDataStoreMgr;
     @Inject
     ImageMotionService imageMotion;
+    @Inject
+    TemplateInstallStrategy templateInstallStrategy;
 
     public VolumeServiceImpl() {
     }
@@ -87,7 +86,7 @@ public class VolumeServiceImpl implements VolumeService {
     }
     
     @Override
-    public AsyncCallFuture<VolumeApiResult> createVolumeAsync(VolumeInfo 
volume, long dataStoreId, VolumeDiskType diskType) {
+    public AsyncCallFuture<VolumeApiResult> createVolumeAsync(VolumeInfo 
volume, long dataStoreId) {
         PrimaryDataStore dataStore = 
dataStoreMgr.getPrimaryDataStore(dataStoreId);
         AsyncCallFuture<VolumeApiResult> future = new 
AsyncCallFuture<VolumeApiResult>();
         VolumeApiResult result = new VolumeApiResult(volume);
@@ -112,7 +111,7 @@ public class VolumeServiceImpl implements VolumeService {
         caller.setCallback(caller.getTarget().createVolumeCallback(null, null))
         .setContext(context);
         
-        dataStore.createVolumeAsync(vo, diskType, caller);
+        //dataStore.createVolumeAsync(vo, null, caller);
         return future;
     }
     
@@ -159,7 +158,7 @@ public class VolumeServiceImpl implements VolumeService {
         AsyncCallFuture<VolumeApiResult> future = new 
AsyncCallFuture<VolumeApiResult>();
         VolumeApiResult result = new VolumeApiResult(volume);
         
-        PrimaryDataStore dataStore = vo.getDataStore();
+        DataStore dataStore = vo.getDataStore();
         vo.stateTransit(Volume.Event.DestroyRequested);
         if (dataStore == null) {
             vo.stateTransit(Volume.Event.OperationSucceeded);
@@ -173,7 +172,7 @@ public class VolumeServiceImpl implements VolumeService {
         caller.setCallback(caller.getTarget().deleteVolumeCallback(null, null))
             .setContext(context);
         
-        dataStore.deleteVolumeAsync(volume, caller);
+        dataStore.getDriver().deleteAsync(volume, caller);
         return future;
     }
     
@@ -237,18 +236,19 @@ public class VolumeServiceImpl implements VolumeService {
         return null;
     }
 
-    private class CreateBaseImageContext<T> extends AsyncRpcConext<T> {
+    class CreateBaseImageContext<T> extends AsyncRpcConext<T> {
         private final VolumeInfo volume;
         private final PrimaryDataStore dataStore;
-        private final TemplateInfo template;
+        private final TemplateInfo srcTemplate;
         private final AsyncCallFuture<VolumeApiResult> future;
-        public CreateBaseImageContext(AsyncCompletionCallback<T> callback, 
VolumeInfo volume, PrimaryDataStore datastore, TemplateInfo template, 
+        public CreateBaseImageContext(AsyncCompletionCallback<T> callback, 
VolumeInfo volume, PrimaryDataStore datastore, 
+                TemplateInfo srcTemplate,
                 AsyncCallFuture<VolumeApiResult> future) {
             super(callback);
             this.volume = volume;
             this.dataStore = datastore;
-            this.template = template;
             this.future = future;
+            this.srcTemplate = srcTemplate;
         }
         
         public VolumeInfo getVolume() {
@@ -258,9 +258,9 @@ public class VolumeServiceImpl implements VolumeService {
         public PrimaryDataStore getDataStore() {
             return this.dataStore;
         }
-        
-        public TemplateInfo getTemplate() {
-            return this.template;
+
+        public TemplateInfo getSrcTemplate() {
+            return this.srcTemplate;
         }
         
         public AsyncCallFuture<VolumeApiResult> getFuture() {
@@ -268,48 +268,46 @@ public class VolumeServiceImpl implements VolumeService {
         }
         
     }
+    
+    static class CreateBaseImageResult extends CommandResult {
+        final TemplateInfo template;
+        public CreateBaseImageResult(TemplateInfo template) {
+            super();
+            this.template = template;
+        }
+    }
+    
     @DB
     protected void createBaseImageAsync(VolumeInfo volume, PrimaryDataStore 
dataStore, TemplateInfo template, AsyncCallFuture<VolumeApiResult> future) {
-        TemplateInfo templateOnPrimaryStoreObj = 
objectInDataStoreMgr.create(template, dataStore);
-        
/*templateOnPrimaryStoreObj.stateTransit(ObjectInDataStoreStateMachine.Event.CreateRequested);
-        templateOnPrimaryStoreObj.updateStatus(Status.CREATING);
-        try {
-            dataStore.installTemplate(templateOnPrimaryStoreObj);
-            templateOnPrimaryStoreObj.updateStatus(Status.CREATED);
-        } catch (Exception e) {
-            templateOnPrimaryStoreObj.updateStatus(Status.ABANDONED);
-            
templateOnPrimaryStoreObj.stateTransit(ObjectInDataStoreStateMachine.Event.OperationFailed);
-            VolumeApiResult result = new VolumeApiResult(volume);
-            result.setResult(e.toString());
-            future.complete(result);
-            return;
-        }
-
-        templateOnPrimaryStoreObj.updateStatus(Status.DOWNLOAD_IN_PROGRESS);
-   */
-        CreateBaseImageContext<VolumeApiResult> context = new 
CreateBaseImageContext<VolumeApiResult>(null, volume, dataStore, 
templateOnPrimaryStoreObj, future);
-        AsyncCallbackDispatcher<VolumeServiceImpl, CommandResult> caller = 
AsyncCallbackDispatcher.create(this);
-            
caller.setCallback(caller.getTarget().createBaseImageCallback(null, null))
-            .setContext(context);
- 
-        objectInDataStoreMgr.update(templateOnPrimaryStoreObj, 
ObjectInDataStoreStateMachine.Event.CreateRequested);
-
-        imageMotion.copyTemplateAsync(templateOnPrimaryStoreObj, template, 
caller);
+        CreateBaseImageContext<VolumeApiResult> context = new 
CreateBaseImageContext<VolumeApiResult>(null, volume, 
+                dataStore,
+                template,
+                future);
+        
+        AsyncCallbackDispatcher<VolumeServiceImpl, CreateBaseImageResult> 
caller = AsyncCallbackDispatcher.create(this);
+        caller.setCallback(caller.getTarget().createBaseImageCallback(null, 
null))
+        .setContext(context);
+        
+        templateInstallStrategy.installAsync(template, dataStore, caller);
     }
 
     @DB
-    protected Void 
createBaseImageCallback(AsyncCallbackDispatcher<VolumeServiceImpl, 
CommandResult> callback, CreateBaseImageContext<VolumeApiResult> context) {
-        CommandResult result = callback.getResult();
-        TemplateInfo templateOnPrimaryStoreObj = context.getTemplate();
-        if (result.isSuccess()) {
-            objectInDataStoreMgr.update(templateOnPrimaryStoreObj, 
ObjectInDataStoreStateMachine.Event.OperationSuccessed);
-        } else {
-            objectInDataStoreMgr.update(templateOnPrimaryStoreObj, 
ObjectInDataStoreStateMachine.Event.OperationFailed);
-        }
+    protected Void 
createBaseImageCallback(AsyncCallbackDispatcher<VolumeServiceImpl, 
CreateBaseImageResult> callback, CreateBaseImageContext<VolumeApiResult> 
context) {
+        CreateBaseImageResult result = callback.getResult();
+        VolumeApiResult res = new VolumeApiResult(context.getVolume());
         
         AsyncCallFuture<VolumeApiResult> future = context.getFuture();
+        if (!result.isSuccess()) {
+            res.setResult(result.getResult());
+            future.complete(res);
+            return null;
+        }
+        
+        //now create volume on base image
+        TemplateInfo templateOnPrimaryStoreObj = result.template;
         VolumeInfo volume = context.getVolume();
         PrimaryDataStore pd = context.getDataStore();
+
         createVolumeFromBaseImageAsync(volume, templateOnPrimaryStoreObj, pd, 
future);
         return null;
     }
@@ -345,19 +343,22 @@ public class VolumeServiceImpl implements VolumeService {
         }
 
         CreateVolumeFromBaseImageContext<VolumeApiResult> context = new 
CreateVolumeFromBaseImageContext<VolumeApiResult>(null, vo, future);
-        AsyncCallbackDispatcher<VolumeServiceImpl, CommandResult> caller =  
AsyncCallbackDispatcher.create(this);
+        AsyncCallbackDispatcher<VolumeServiceImpl, CopyCommandResult> caller = 
 AsyncCallbackDispatcher.create(this);
         
caller.setCallback(caller.getTarget().createVolumeFromBaseImageCallback(null, 
null))
         .setContext(context);
 
-        pd.createVoluemFromBaseImageAsync(volume, templateOnPrimaryStore, 
caller);
+       pd.getDriver().copyAsync(volume, templateOnPrimaryStore, caller);
     }
     
     @DB
-    public Object 
createVolumeFromBaseImageCallback(AsyncCallbackDispatcher<VolumeServiceImpl, 
CommandResult> callback, CreateVolumeFromBaseImageContext<VolumeApiResult> 
context) {
+    public Object 
createVolumeFromBaseImageCallback(AsyncCallbackDispatcher<VolumeServiceImpl, 
CopyCommandResult> callback, CreateVolumeFromBaseImageContext<VolumeApiResult> 
context) {
         VolumeObject vo = context.getVolumeObject();
-        CommandResult result = callback.getResult();
+        CopyCommandResult result = callback.getResult();
         VolumeApiResult volResult = new VolumeApiResult(vo);
         if (result.isSuccess()) {
+            if (result.getPath() != null) {
+                vo.setPath(result.getPath());
+            }
             vo.stateTransit(Volume.Event.OperationSucceeded); 
         } else {
             vo.stateTransit(Volume.Event.OperationFailed);
@@ -371,9 +372,9 @@ public class VolumeServiceImpl implements VolumeService {
 
     @DB
     @Override
-    public AsyncCallFuture<VolumeApiResult> 
createVolumeFromTemplateAsync(VolumeInfo volume, long dataStoreId, 
VolumeDiskType diskType, TemplateInfo template) {
+    public AsyncCallFuture<VolumeApiResult> 
createVolumeFromTemplateAsync(VolumeInfo volume, long dataStoreId, TemplateInfo 
template) {
         PrimaryDataStore pd = dataStoreMgr.getPrimaryDataStore(dataStoreId);
-        TemplateOnPrimaryDataStoreInfo templateOnPrimaryStore = 
pd.getTemplate(template);
+        TemplateInfo templateOnPrimaryStore = pd.getTemplate(template.getId());
         AsyncCallFuture<VolumeApiResult> future = new 
AsyncCallFuture<VolumeApiResult>();
         VolumeApiResult result = new VolumeApiResult(volume);
         

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8af85b04/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/ConfiguratorTest.java
----------------------------------------------------------------------
diff --git 
a/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/ConfiguratorTest.java
 
b/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/ConfiguratorTest.java
index 4ad20d5..829694b 100644
--- 
a/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/ConfiguratorTest.java
+++ 
b/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/ConfiguratorTest.java
@@ -18,7 +18,8 @@
  */
 package org.apache.cloudstack.storage.volume.test;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 import java.util.HashMap;
 import java.util.List;
@@ -27,14 +28,11 @@ 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.configurator.PrimaryDataStoreConfigurator;
-import 
org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProviderManager;
+import 
org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProvider;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mockito;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
@@ -45,20 +43,15 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration(locations="classpath:/testContext.xml")
 public class ConfiguratorTest {
-    @Inject
-    @Qualifier("defaultProvider")
-    List<PrimaryDataStoreConfigurator> configurators;
-    
+
     @Inject 
     List<PrimaryDataStoreProvider> providers;
     
     @Inject
-    PrimaryDataStoreProviderManager providerMgr;
-    @Inject
     ClusterDao clusterDao;
     @Before
     public void setup() {
-        ClusterVO cluster = new ClusterVO();
+      /*  ClusterVO cluster = new ClusterVO();
         cluster.setHypervisorType(HypervisorType.XenServer.toString());
         
Mockito.when(clusterDao.findById(Mockito.anyLong())).thenReturn(cluster);
         try {
@@ -66,13 +59,13 @@ public class ConfiguratorTest {
         } catch (ConfigurationException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
-        }
+        }*/
     }
     @Test
     public void testLoadConfigurator() {
-        for (PrimaryDataStoreConfigurator configurator : configurators) {
+        /*for (PrimaryDataStoreConfigurator configurator : configurators) {
             System.out.println(configurator.getClass().getName());
-        }
+        }*/
     }
     
     @Test
@@ -86,16 +79,16 @@ public class ConfiguratorTest {
     
     @Test
     public void getProvider() {
-        assertNotNull(providerMgr.getDataStoreProvider("default primary data 
store provider"));
+       // assertNotNull(providerMgr.getDataStoreProvider("default primary data 
store provider"));
     }
     
     @Test
     public void createDataStore() {
-        PrimaryDataStoreProvider provider = 
providerMgr.getDataStoreProvider("default primary data store provider");
+        /*PrimaryDataStoreProvider provider = 
providerMgr.getDataStoreProvider("default primary data store provider");
         Map<String, String> params = new HashMap<String, String>();
         params.put("url", "nfs://localhost/mnt");
         params.put("clusterId", "1");
         params.put("name", "nfsprimary");
-        assertNotNull(provider.registerDataStore(params));
+        assertNotNull(provider.registerDataStore(params));*/
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8af85b04/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
index 009ed7b..d47da9b 100644
--- 
a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
+++ 
b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerStorageResource.java
@@ -22,7 +22,6 @@ import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.net.URI;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -31,50 +30,37 @@ import java.util.UUID;
 import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreAnswer;
 import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
 import org.apache.cloudstack.storage.command.CopyCmd;
-import 
org.apache.cloudstack.storage.command.CopyTemplateToPrimaryStorageAnswer;
+import org.apache.cloudstack.storage.command.CopyCmdAnswer;
 import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd;
 import org.apache.cloudstack.storage.command.CreateVolumeAnswer;
 import org.apache.cloudstack.storage.command.CreateVolumeCommand;
 import org.apache.cloudstack.storage.command.CreateVolumeFromBaseImageCommand;
-import org.apache.cloudstack.storage.command.DeleteVolumeCommand;
 import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
 import org.apache.cloudstack.storage.datastore.protocol.DataStoreProtocol;
-import org.apache.cloudstack.storage.to.ImageDataStoreTO;
 import org.apache.cloudstack.storage.to.ImageOnPrimayDataStoreTO;
 import org.apache.cloudstack.storage.to.NfsPrimaryDataStoreTO;
 import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
 import org.apache.cloudstack.storage.to.TemplateTO;
 import org.apache.cloudstack.storage.to.VolumeTO;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.http.Header;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.ClientProtocolException;
 import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpHead;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.log4j.Logger;
 import org.apache.xmlrpc.XmlRpcException;
 
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
-import com.cloud.agent.api.ModifyStoragePoolAnswer;
-import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer;
-import com.cloud.agent.api.to.StorageFilerTO;
+import com.cloud.agent.api.storage.DeleteVolumeCommand;
 import com.cloud.hypervisor.xen.resource.CitrixResourceBase.SRType;
 import com.cloud.storage.Storage.StoragePoolType;
-import com.cloud.storage.template.TemplateInfo;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.xensource.xenapi.Connection;
 import com.xensource.xenapi.Host;
 import com.xensource.xenapi.PBD;
-import com.xensource.xenapi.Pool;
 import com.xensource.xenapi.SR;
 import com.xensource.xenapi.Types;
-import com.xensource.xenapi.VBD;
 import com.xensource.xenapi.Types.BadServerResponse;
 import com.xensource.xenapi.Types.XenAPIException;
 import com.xensource.xenapi.VDI;
@@ -129,7 +115,7 @@ public class XenServerStorageResource {
     }
     
     protected CreateVolumeAnswer execute(CreateVolumeCommand cmd) {
-        VolumeTO volume = cmd.getVolume();
+        VolumeTO volume = null;
         PrimaryDataStoreTO primaryDataStore = volume.getDataStore();
         Connection conn = hypervisorResource.getConnection();
         VDI vdi = null;
@@ -164,7 +150,7 @@ public class XenServerStorageResource {
     }
     
     protected Answer execute(DeleteVolumeCommand cmd) {
-        VolumeTO volume = cmd.getVolume();
+        VolumeTO volume = null;
         Connection conn = hypervisorResource.getConnection();
         String errorMsg = null;
         try {
@@ -516,7 +502,7 @@ public class XenServerStorageResource {
             //downloadHttpToLocalFile(vdiPath, template.getPath());
             hypervisorResource.callHostPlugin(conn, "storagePlugin", 
"downloadTemplateFromUrl", "destPath", vdiPath, "srcUrl", template.getPath());
             result = true;
-            return new CopyTemplateToPrimaryStorageAnswer(cmd, 
vdi.getUuid(conn));
+            return new CopyCmdAnswer(cmd, vdi.getUuid(conn));
         } catch (BadServerResponse e) {
             s_logger.debug("Failed to download template", e);
         } catch (XenAPIException e) {
@@ -542,7 +528,7 @@ public class XenServerStorageResource {
     }
     
     protected Answer execute(AttachPrimaryDataStoreCmd cmd) {
-        PrimaryDataStoreTO dataStore = cmd.getDataStore();
+        PrimaryDataStoreTO dataStore = null;
         Connection conn = hypervisorResource.getConnection();
         try {
             SR sr = hypervisorResource.getStorageRepository(conn, 
dataStore.getUuid());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8af85b04/plugins/pom.xml
----------------------------------------------------------------------
diff --git a/plugins/pom.xml b/plugins/pom.xml
index 8c68c28..61c43bd 100644
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -49,6 +49,8 @@
     <module>user-authenticators/plain-text</module>
     <module>user-authenticators/sha256salted</module>
     <module>network-elements/dns-notifier</module>
+    <module>storage/image/s3</module>
+    <module>storage/volume/solidfire</module>
   </modules>
 
   <dependencies>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8af85b04/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java
----------------------------------------------------------------------
diff --git 
a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java
 
b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java
index e55cce0..70c741a 100644
--- 
a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java
+++ 
b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidfirePrimaryDataStoreDriver.java
@@ -16,82 +16,83 @@
 // under the License.
 package org.apache.cloudstack.storage.datastore.driver;
 
-import java.util.Map;
+import java.util.Set;
 
+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.framework.async.AsyncCompletionCallback;
-import org.apache.cloudstack.storage.EndPoint;
-import org.apache.cloudstack.storage.command.CommandResult;
-import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.volume.TemplateOnPrimaryDataStoreInfo;
-import org.apache.cloudstack.storage.volume.VolumeObject;
+import org.apache.cloudstack.storage.snapshot.SnapshotInfo;
+import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
 
 public class SolidfirePrimaryDataStoreDriver implements PrimaryDataStoreDriver 
{
 
-
-       @Override
-       public String grantAccess(VolumeObject vol, EndPoint ep) {
-               // TODO Auto-generated method stub
-               return null;
-       }
-
-       @Override
-       public boolean revokeAccess(VolumeObject vol, EndPoint ep) {
-               // TODO Auto-generated method stub
-               return false;
-       }
-
     @Override
-    public long getCapacity() {
+    public String grantAccess(DataObject data,
+            org.apache.cloudstack.engine.subsystem.api.storage.EndPoint ep) {
         // TODO Auto-generated method stub
-        return 0;
+        return null;
     }
 
     @Override
-    public long getAvailableCapacity() {
+    public boolean revokeAccess(DataObject data,
+            org.apache.cloudstack.engine.subsystem.api.storage.EndPoint ep) {
         // TODO Auto-generated method stub
-        return 0;
+        return false;
     }
 
     @Override
-    public boolean initialize(Map<String, String> params) {
+    public Set<DataObject> listObjects(DataStore store) {
         // TODO Auto-generated method stub
-        return false;
+        return null;
     }
 
     @Override
-    public boolean grantAccess(EndPoint ep) {
+    public void createAsync(DataObject data,
+            AsyncCompletionCallback<CreateCmdResult> callback) {
         // TODO Auto-generated method stub
-        return false;
+        
     }
 
     @Override
-    public boolean revokeAccess(EndPoint ep) {
+    public void deleteAsync(
+            DataObject data,
+            
AsyncCompletionCallback<org.apache.cloudstack.engine.subsystem.api.storage.CommandResult>
 callback) {
         // TODO Auto-generated method stub
-        return false;
+        
     }
 
     @Override
-    public void setDataStore(PrimaryDataStore dataStore) {
+    public void copyAsync(DataObject srcdata, DataObject destData,
+            AsyncCompletionCallback<CopyCommandResult> callback) {
         // TODO Auto-generated method stub
         
     }
 
     @Override
-    public void createVolumeFromBaseImageAsync(VolumeObject volume, 
TemplateOnPrimaryDataStoreInfo template, AsyncCompletionCallback<CommandResult> 
callback) {
+    public boolean canCopy(DataObject srcData, DataObject destData) {
         // TODO Auto-generated method stub
-        
+        return false;
     }
 
     @Override
-    public void createVolumeAsync(VolumeObject vol, 
AsyncCompletionCallback<CommandResult> callback) {
+    public void takeSnapshot(
+            SnapshotInfo snapshot,
+            
AsyncCompletionCallback<org.apache.cloudstack.engine.subsystem.api.storage.CommandResult>
 callback) {
         // TODO Auto-generated method stub
         
     }
 
     @Override
-    public void deleteVolumeAsync(VolumeObject vo, 
AsyncCompletionCallback<CommandResult> callback) {
+    public void revertSnapshot(
+            SnapshotInfo snapshot,
+            
AsyncCompletionCallback<org.apache.cloudstack.engine.subsystem.api.storage.CommandResult>
 callback) {
         // TODO Auto-generated method stub
         
     }
 
+
+       
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8af85b04/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java
----------------------------------------------------------------------
diff --git 
a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java
 
b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java
index bcffbd3..650cac8 100644
--- 
a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java
+++ 
b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/provider/SolidfirePrimaryDataStoreProvider.java
@@ -16,15 +16,6 @@
 // under the License.
 package org.apache.cloudstack.storage.datastore.provider;
 
-import java.util.List;
-
-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.db.PrimaryDataStoreVO;
-import 
org.apache.cloudstack.storage.datastore.driver.SolidfirePrimaryDataStoreDriver;
-import 
org.apache.cloudstack.storage.datastore.lifecycle.DefaultPrimaryDataStoreLifeCycleImpl;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 
 @Component
@@ -33,8 +24,8 @@ public class SolidfirePrimaryDataStoreProvider extends
        private final String name = "Solidfre Primary Data Store Provider";
 
 
-       public SolidfirePrimaryDataStoreProvider(@Qualifier("solidfire") 
List<PrimaryDataStoreConfigurator> configurators) {
-           super(configurators);
+       public SolidfirePrimaryDataStoreProvider() {
+           
                
                // TODO Auto-generated constructor stub
        }
@@ -44,21 +35,5 @@ public class SolidfirePrimaryDataStoreProvider extends
                return name;
        }
        
-       @Override
-       public PrimaryDataStore getDataStore(long dataStoreId) {
-               PrimaryDataStoreVO dsv = dataStoreDao.findById(dataStoreId);
-        if (dsv == null) {
-            return null;
-        }
-
-        DefaultPrimaryDataStore pds = 
DefaultPrimaryDataStore.createDataStore(dsv);
-        SolidfirePrimaryDataStoreDriver driver = new 
SolidfirePrimaryDataStoreDriver();
-        pds.setDriver(driver);
-
-        
-        DefaultPrimaryDataStoreLifeCycleImpl lifeCycle = new 
DefaultPrimaryDataStoreLifeCycleImpl(dataStoreDao);
-
-        pds.setLifeCycle(lifeCycle);
-        return pds;
-    }
+       
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8af85b04/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java
----------------------------------------------------------------------
diff --git 
a/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java
 
b/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java
index f5035bf..1bd51b2 100644
--- 
a/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java
+++ 
b/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/VolumeTest.java
@@ -16,8 +16,6 @@
 // under the License.
 package org.apache.cloudstack.storage.test;
 
-import static org.junit.Assert.*;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -28,12 +26,10 @@ import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 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.command.CreateVolumeAnswer;
 import org.apache.cloudstack.storage.command.CreateVolumeFromBaseImageCommand;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import 
org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProviderManager;
+import 
org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProvider;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -43,9 +39,9 @@ import 
org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
 import com.cloud.agent.AgentManager;
 import com.cloud.dc.ClusterVO;
+import com.cloud.dc.DataCenter.NetworkType;
 import com.cloud.dc.DataCenterVO;
 import com.cloud.dc.HostPodVO;
-import com.cloud.dc.DataCenter.NetworkType;
 import com.cloud.dc.dao.ClusterDao;
 import com.cloud.dc.dao.DataCenterDao;
 import com.cloud.dc.dao.HostPodDao;
@@ -73,8 +69,8 @@ public class VolumeTest {
        DataCenterDao dcDao;
        @Inject
        PrimaryDataStoreDao primaryStoreDao;
-       @Inject
-       PrimaryDataStoreProviderManager primaryDataStoreProviderMgr;
+       //@Inject
+       //PrimaryDataStoreProviderManager primaryDataStoreProviderMgr;
        @Inject
        AgentManager agentMgr;
        Long dcId;
@@ -134,16 +130,16 @@ public class VolumeTest {
 
        private PrimaryDataStoreInfo createPrimaryDataStore() {
                try {
-                       primaryDataStoreProviderMgr.configure("primary data 
store mgr", new HashMap<String, Object>());
-                       PrimaryDataStoreProvider provider = 
primaryDataStoreProviderMgr.getDataStoreProvider("Solidfre Primary Data Store 
Provider");
+                       //primaryDataStoreProviderMgr.configure("primary data 
store mgr", new HashMap<String, Object>());
+                       //PrimaryDataStoreProvider provider = 
primaryDataStoreProviderMgr.getDataStoreProvider("Solidfre Primary Data Store 
Provider");
                        Map<String, String> params = new HashMap<String, 
String>();
                        params.put("url", "nfs://test/test");
                        params.put("dcId", dcId.toString());
                        params.put("clusterId", clusterId.toString());
                        params.put("name", "my primary data store");
-                       PrimaryDataStoreInfo primaryDataStoreInfo = 
provider.registerDataStore(params);
-                       return primaryDataStoreInfo;
-               } catch (ConfigurationException e) {
+                       //PrimaryDataStoreInfo primaryDataStoreInfo = 
provider.registerDataStore(params);
+                       return null;
+               } catch (Exception e) {
                        return null;
                }
        }

Reply via email to