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 2012/12/08 12:16:23 UTC

git commit: finish configurator, the default primary storage provider can cover all the hypervisors and protocols

Updated Branches:
  refs/heads/javelin 7652a44be -> cdf551166


finish configurator, the default primary storage provider can cover all the hypervisors and protocols


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

Branch: refs/heads/javelin
Commit: cdf5511664a1ee4a0751f20ce19aae1f30c85ab2
Parents: 7652a44
Author: Edison Su <ed...@citrix.com>
Authored: Sat Dec 8 03:16:03 2012 -0800
Committer: Edison Su <ed...@citrix.com>
Committed: Sat Dec 8 03:16:03 2012 -0800

----------------------------------------------------------------------
 .../storage/datastore/DefaultPrimaryDataStore.java |   27 ++++--
 .../AbstractPrimaryDataStoreConfigurator.java      |   43 ++++++++
 .../configurator/PrimaryDataStoreConfigurator.java |    2 +-
 .../configurator/kvm/AbstractKvmConfigurator.java  |   22 +----
 .../configurator/kvm/KvmCLVMConfigurator.java      |    9 +--
 .../configurator/kvm/KvmNfsConfigurator.java       |    6 +-
 .../configurator/kvm/KvmRBDConfigurator.java       |    4 +-
 .../configurator/validator/NfsValidator.java       |   36 ++++++-
 .../vmware/AbstractVmwareConfigurator.java         |   27 +----
 .../vmware/VmwareIsciConfigurator.java             |    7 +-
 .../configurator/vmware/VmwareNfsConfigurator.java |    8 +-
 .../vmware/VmwareVMFSConfigurator.java             |    8 +-
 .../configurator/xen/AbstractXenConfigurator.java  |   48 ++++++++
 .../configurator/xen/XenIscsiConfigurator.java     |   36 +++----
 .../configurator/xen/XenNfsConfigurator.java       |   37 +++----
 .../storage/datastore/db/PrimaryDataStoreVO.java   |   11 ++
 .../DefaultPrimaryDataStoreLifeCycleImpl.java      |   43 --------
 .../DefaultVmwarePrimaryDataStoreLifeCycle.java    |    8 +-
 .../DefaultXenPrimaryDataStoreLifeCycle.java       |    5 +-
 .../DefaultPrimaryDatastoreProviderImpl.java       |   84 ++++++++++++---
 .../PrimaryDataStoreProviderManagerImpl.java       |    3 +
 .../storage/volume/test/ConfiguratorTest.java      |   56 ++++++++++
 .../storage/volume/test/TestConfiguration.java     |    8 ++
 .../storage/volume/test/resource/testContext.xml   |   20 +++-
 setup/db/4.1-new-db-schema.sql                     |    1 +
 25 files changed, 372 insertions(+), 187 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
index c063c5d..5029a48 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/DefaultPrimaryDataStore.java
@@ -37,6 +37,9 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
     protected PrimaryDataStoreVO pdsv;
     protected PrimaryDataStoreInfo pdsInfo;
     protected PrimaryDataStoreLifeCycle lifeCycle;
+    protected PrimaryDataStoreProvider provider;
+    private HypervisorType supportedHypervisor;
+    private boolean isLocalStorageSupported = false;
     @Inject
     private VolumeDao volumeDao;
     @Inject
@@ -58,6 +61,10 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
         this.lifeCycle = lifeCycle;
     }
     
+    public void setProvider(PrimaryDataStoreProvider provider) {
+        this.provider = provider;
+    }
+    
     public static DefaultPrimaryDataStore createDataStore(PrimaryDataStoreVO pdsv) {
         DefaultPrimaryDataStore dataStore = new DefaultPrimaryDataStore(pdsv);
         return ComponentInject.inject(dataStore);
@@ -102,16 +109,22 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
         return endpoints;
     }
 
+    public void setSupportedHypervisor(HypervisorType type) {
+        this.supportedHypervisor = type;
+    }
+    
     @Override
     public boolean isHypervisorSupported(HypervisorType hypervisor) {
-        // TODO Auto-generated method stub
-        return false;
+        return (this.supportedHypervisor == hypervisor) ? true : false;
+    }
+    
+    public void setLocalStorageFlag(boolean supported) {
+        this.isLocalStorageSupported = supported;
     }
 
     @Override
     public boolean isLocalStorageSupported() {
-        // TODO Auto-generated method stub
-        return false;
+        return this.isLocalStorageSupported;
     }
 
     @Override
@@ -208,13 +221,11 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
 
     @Override
     public PrimaryDataStoreLifeCycle getLifeCycle() {
-        // TODO Auto-generated method stub
-        return null;
+        return lifeCycle;
     }
 
     @Override
     public PrimaryDataStoreProvider getProvider() {
-        // TODO Auto-generated method stub
-        return null;
+        return this.provider;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/AbstractPrimaryDataStoreConfigurator.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/AbstractPrimaryDataStoreConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/AbstractPrimaryDataStoreConfigurator.java
new file mode 100644
index 0000000..1ffe9e6
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/AbstractPrimaryDataStoreConfigurator.java
@@ -0,0 +1,43 @@
+package org.apache.cloudstack.storage.datastore.configurator;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
+import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore;
+import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
+import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public abstract class AbstractPrimaryDataStoreConfigurator implements PrimaryDataStoreConfigurator {
+    @Inject
+    PrimaryDataStoreDao dataStoreDao;
+    
+    protected PrimaryDataStoreLifeCycle getLifeCycle() {
+        return null;
+    }
+    
+    protected PrimaryDataStoreDriver getDriver() {
+        return null;
+    }
+    
+    protected boolean isLocalStorageSupported() {
+        return false;
+    }
+
+    @Override
+    public PrimaryDataStore getDataStore(long dataStoreId) {
+        PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId);
+        if (dataStoreVO == null) {
+            throw new CloudRuntimeException("Can't find primary data store: " + dataStoreId);
+        }
+        
+        DefaultPrimaryDataStore dataStore = DefaultPrimaryDataStore.createDataStore(dataStoreVO);
+        dataStore.setDriver(this.getDriver());
+        dataStore.setLifeCycle(getLifeCycle());
+        dataStore.setSupportedHypervisor(getSupportedHypervisor());
+        dataStore.setLocalStorageFlag(isLocalStorageSupported());
+        return dataStore;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/PrimaryDataStoreConfigurator.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/PrimaryDataStoreConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/PrimaryDataStoreConfigurator.java
index e857165..fa0b76a 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/PrimaryDataStoreConfigurator.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/PrimaryDataStoreConfigurator.java
@@ -26,7 +26,7 @@ import com.cloud.storage.Storage.StoragePoolType;
 
 public interface PrimaryDataStoreConfigurator {
     public HypervisorType getSupportedHypervisor();
-    public StoragePoolType getSupportedDataStoreType();
+    public String getSupportedDataStoreType();
     public PrimaryDataStore getDataStore(long dataStoreId);
     public ProtocolValidator getValidator();
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/AbstractKvmConfigurator.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/AbstractKvmConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/AbstractKvmConfigurator.java
index 8fc2832..008af85 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/AbstractKvmConfigurator.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/AbstractKvmConfigurator.java
@@ -21,21 +21,18 @@ package org.apache.cloudstack.storage.datastore.configurator.kvm;
 import javax.inject.Inject;
 
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
-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.AbstractPrimaryDataStoreConfigurator;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
 import org.apache.cloudstack.storage.datastore.driver.DefaultPrimaryDataStoreDriverImpl;
 import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver;
 import org.apache.cloudstack.storage.datastore.lifecycle.DefaultKvmPrimaryDataStoreLifeCycle;
 
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.utils.exception.CloudRuntimeException;
 
-public abstract class AbstractKvmConfigurator implements PrimaryDataStoreConfigurator {
+public abstract class AbstractKvmConfigurator extends AbstractPrimaryDataStoreConfigurator {
     @Inject
     PrimaryDataStoreDao dataStoreDao;
+    
     @Override
     public HypervisorType getSupportedHypervisor() {
         return HypervisorType.KVM;
@@ -48,17 +45,4 @@ public abstract class AbstractKvmConfigurator implements PrimaryDataStoreConfigu
     protected PrimaryDataStoreDriver getDriver() {
         return new DefaultPrimaryDataStoreDriverImpl();
     }
-
-    @Override
-    public PrimaryDataStore getDataStore(long dataStoreId) {
-        PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId);
-        if (dataStoreVO == null) {
-            throw new CloudRuntimeException("Can't find primary data store: " + dataStoreId);
-        }
-        
-        DefaultPrimaryDataStore dataStore = DefaultPrimaryDataStore.createDataStore(dataStoreVO);
-        dataStore.setDriver(this.getDriver());
-        dataStore.setLifeCycle(getLifeCycle());
-        return dataStore;
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmCLVMConfigurator.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmCLVMConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmCLVMConfigurator.java
index ca8f10a..8ca4df0 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmCLVMConfigurator.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmCLVMConfigurator.java
@@ -18,23 +18,18 @@
  */
 package org.apache.cloudstack.storage.datastore.configurator.kvm;
 
-import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator;
 import org.apache.cloudstack.storage.datastore.configurator.validator.CLVMValidator;
 import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 
-import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.storage.Storage.StoragePoolType;
-
 @Component
 @Qualifier("defaultProvider")
 public class KvmCLVMConfigurator extends AbstractKvmConfigurator {
 
     @Override
-    public StoragePoolType getSupportedDataStoreType() {
-        return StoragePoolType.CLVM;
+    public String getSupportedDataStoreType() {
+        return "clvm";
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmNfsConfigurator.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmNfsConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmNfsConfigurator.java
index 25abe80..faed6cc 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmNfsConfigurator.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmNfsConfigurator.java
@@ -23,15 +23,13 @@ import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolVa
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 
-import com.cloud.storage.Storage.StoragePoolType;
-
 @Component
 @Qualifier("defaultProvider")
 public class KvmNfsConfigurator extends AbstractKvmConfigurator {
 
     @Override
-    public StoragePoolType getSupportedDataStoreType() {
-        return StoragePoolType.NetworkFilesystem;
+    public String getSupportedDataStoreType() {
+        return "nfs";
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmRBDConfigurator.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmRBDConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmRBDConfigurator.java
index 3482162..cdbbb25 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmRBDConfigurator.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/kvm/KvmRBDConfigurator.java
@@ -30,8 +30,8 @@ import com.cloud.storage.Storage.StoragePoolType;
 public class KvmRBDConfigurator extends AbstractKvmConfigurator {
 
     @Override
-    public StoragePoolType getSupportedDataStoreType() {
-        return StoragePoolType.RBD;
+    public String getSupportedDataStoreType() {
+        return "rbd";
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsValidator.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsValidator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsValidator.java
index 97d4761..5ee9316 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsValidator.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/validator/NfsValidator.java
@@ -18,21 +18,49 @@
  */
 package org.apache.cloudstack.storage.datastore.configurator.validator;
 
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import com.cloud.utils.exception.CloudRuntimeException;
+
 public class NfsValidator implements ProtocolValidator {
 
     @Override
     public boolean validate(Map<String, String> params) {
-        // TODO Auto-generated method stub
-        return false;
+    	String url = params.get("url");
+    	
+    	try {
+			URI uri = new URI(url);
+			if (!"nfs".equalsIgnoreCase(uri.getScheme())) {
+				throw new CloudRuntimeException("invalid protocol, must starting with nfs");
+			}
+	        String storageHost = uri.getHost();
+	        String hostPath = uri.getPath();
+	        String userInfo = uri.getUserInfo();
+	        int port = uri.getPort();
+	        if (port == -1) {
+                port = 2049;
+            }
+			params.put("server", storageHost);
+			params.put("path", hostPath);
+			params.put("user", userInfo);
+			params.put("port", String.valueOf(port));
+			
+		} catch (URISyntaxException e) {
+			throw new CloudRuntimeException("invalid url: " + e.toString());
+		}
+        return true;
     }
 
     @Override
     public List<String> getInputParamNames() {
-        // TODO Auto-generated method stub
-        return null;
+        List<String> paramNames = new ArrayList<String>();
+        paramNames.add("server");
+        paramNames.add("path");
+        return paramNames;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/AbstractVmwareConfigurator.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/AbstractVmwareConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/AbstractVmwareConfigurator.java
index ece2e81..c688bd6 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/AbstractVmwareConfigurator.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/AbstractVmwareConfigurator.java
@@ -21,19 +21,14 @@ package org.apache.cloudstack.storage.datastore.configurator.vmware;
 import javax.inject.Inject;
 
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
-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.AbstractPrimaryDataStoreConfigurator;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
 import org.apache.cloudstack.storage.datastore.driver.DefaultPrimaryDataStoreDriverImpl;
 import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver;
 import org.apache.cloudstack.storage.datastore.lifecycle.DefaultVmwarePrimaryDataStoreLifeCycle;
-
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.utils.exception.CloudRuntimeException;
 
-public abstract class AbstractVmwareConfigurator implements PrimaryDataStoreConfigurator {
+public abstract class AbstractVmwareConfigurator extends AbstractPrimaryDataStoreConfigurator {
 
     @Inject
     PrimaryDataStoreDao dataStoreDao;
@@ -42,25 +37,13 @@ public abstract class AbstractVmwareConfigurator implements PrimaryDataStoreConf
         return HypervisorType.VMware;
     }
     
+    @Override
     protected PrimaryDataStoreLifeCycle getLifeCycle() {
-        return new DefaultVmwarePrimaryDataStoreLifeCycle();
+        return new DefaultVmwarePrimaryDataStoreLifeCycle(dataStoreDao);
     }
     
+    @Override
     protected PrimaryDataStoreDriver getDriver() {
         return new DefaultPrimaryDataStoreDriverImpl();
     }
-
-    @Override
-    public PrimaryDataStore getDataStore(long dataStoreId) {
-        PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId);
-        if (dataStoreVO == null) {
-            throw new CloudRuntimeException("Can't find primary data store: " + dataStoreId);
-        }
-        
-        DefaultPrimaryDataStore dataStore = DefaultPrimaryDataStore.createDataStore(dataStoreVO);
-        dataStore.setDriver(this.getDriver());
-        dataStore.setLifeCycle(getLifeCycle());
-        return dataStore;
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareIsciConfigurator.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareIsciConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareIsciConfigurator.java
index f42ac93..55c82ca 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareIsciConfigurator.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareIsciConfigurator.java
@@ -23,19 +23,18 @@ import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolVa
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 
-import com.cloud.storage.Storage.StoragePoolType;
-
 @Component
 @Qualifier("defaultProvider")
 public class VmwareIsciConfigurator extends AbstractVmwareConfigurator {
 
     @Override
-    public StoragePoolType getSupportedDataStoreType() {
-        return StoragePoolType.Iscsi;
+    public String getSupportedDataStoreType() {
+        return "iscsi";
     }
 
     @Override
     public ProtocolValidator getValidator() {
         return new ISCSIValiator();
     }
+    
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareNfsConfigurator.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareNfsConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareNfsConfigurator.java
index 8517c8e..23cabb1 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareNfsConfigurator.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareNfsConfigurator.java
@@ -20,14 +20,18 @@ package org.apache.cloudstack.storage.datastore.configurator.vmware;
 
 import org.apache.cloudstack.storage.datastore.configurator.validator.NfsValidator;
 import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
 
 import com.cloud.storage.Storage.StoragePoolType;
 
+@Component
+@Qualifier("defaultProvider")
 public class VmwareNfsConfigurator extends AbstractVmwareConfigurator {
 
     @Override
-    public StoragePoolType getSupportedDataStoreType() {
-        return StoragePoolType.NetworkFilesystem;
+    public String getSupportedDataStoreType() {
+        return "nfs";
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareVMFSConfigurator.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareVMFSConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareVMFSConfigurator.java
index de3c256..ef0444c 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareVMFSConfigurator.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/vmware/VmwareVMFSConfigurator.java
@@ -20,14 +20,18 @@ package org.apache.cloudstack.storage.datastore.configurator.vmware;
 
 import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator;
 import org.apache.cloudstack.storage.datastore.configurator.validator.VMFSValidator;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
 
 import com.cloud.storage.Storage.StoragePoolType;
 
+@Component
+@Qualifier("defaultProvider")
 public class VmwareVMFSConfigurator extends AbstractVmwareConfigurator {
 
     @Override
-    public StoragePoolType getSupportedDataStoreType() {
-        return StoragePoolType.VMFS;
+    public String getSupportedDataStoreType() {
+        return "vmfs";
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/AbstractXenConfigurator.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/AbstractXenConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/AbstractXenConfigurator.java
new file mode 100644
index 0000000..9b0d153
--- /dev/null
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/AbstractXenConfigurator.java
@@ -0,0 +1,48 @@
+package org.apache.cloudstack.storage.datastore.configurator.xen;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
+import org.apache.cloudstack.storage.datastore.DefaultPrimaryDataStore;
+import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
+import org.apache.cloudstack.storage.datastore.configurator.AbstractPrimaryDataStoreConfigurator;
+import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
+import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
+import org.apache.cloudstack.storage.datastore.driver.DefaultPrimaryDataStoreDriverImpl;
+import org.apache.cloudstack.storage.datastore.driver.PrimaryDataStoreDriver;
+import org.apache.cloudstack.storage.datastore.lifecycle.DefaultXenPrimaryDataStoreLifeCycle;
+
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public abstract class AbstractXenConfigurator extends AbstractPrimaryDataStoreConfigurator {
+    @Inject
+    PrimaryDataStoreDao dataStoreDao;
+    
+    @Override
+    public HypervisorType getSupportedHypervisor() {
+    	return HypervisorType.XenServer;
+    }
+
+	protected PrimaryDataStoreLifeCycle getLifeCycle() {
+		return new DefaultXenPrimaryDataStoreLifeCycle(dataStoreDao);
+	}
+    
+	protected PrimaryDataStoreDriver getDriver() {
+		return new DefaultPrimaryDataStoreDriverImpl();
+	}
+    
+	@Override
+    public PrimaryDataStore getDataStore(long dataStoreId) {
+        PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStoreId);
+        if (dataStoreVO == null) {
+            throw new CloudRuntimeException("Can't find primary data store: " + dataStoreId);
+        }
+        
+        DefaultPrimaryDataStore dataStore = DefaultPrimaryDataStore.createDataStore(dataStoreVO);
+        dataStore.setDriver(this.getDriver());
+        dataStore.setLifeCycle(getLifeCycle());
+        return dataStore;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenIscsiConfigurator.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenIscsiConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenIscsiConfigurator.java
index c817a5e..c9546a8 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenIscsiConfigurator.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenIscsiConfigurator.java
@@ -18,29 +18,23 @@
  */
 package org.apache.cloudstack.storage.datastore.configurator.xen;
 
-import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator;
+import org.apache.cloudstack.storage.datastore.configurator.validator.ISCSIValiator;
+import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
 
-import com.cloud.hypervisor.Hypervisor.HypervisorType;
+@Component
+@Qualifier("defaultProvider")
+public class XenIscsiConfigurator extends AbstractXenConfigurator {
 
-public class XenIscsiConfigurator implements PrimaryDataStoreConfigurator {
+	@Override
+	public String getSupportedDataStoreType() {
+		return "iscsi";
+	}
 
-    @Override
-    public HypervisorType getSupportedHypervisor() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getSupportedDataStoreType() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public PrimaryDataStore getDataStore() {
-        // TODO Auto-generated method stub
-        return null;
-    }
+	@Override
+	public ProtocolValidator getValidator() {
+		return new ISCSIValiator();
+	}
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenNfsConfigurator.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenNfsConfigurator.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenNfsConfigurator.java
index 5ee1b91..8fb7e88 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenNfsConfigurator.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/configurator/xen/XenNfsConfigurator.java
@@ -18,29 +18,24 @@
  */
 package org.apache.cloudstack.storage.datastore.configurator.xen;
 
-import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.datastore.configurator.PrimaryDataStoreConfigurator;
+import org.apache.cloudstack.storage.datastore.configurator.validator.NfsValidator;
+import org.apache.cloudstack.storage.datastore.configurator.validator.ProtocolValidator;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
 
-import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.storage.Storage.StoragePoolType;
 
-public class XenNfsConfigurator implements PrimaryDataStoreConfigurator {
+@Component
+@Qualifier("defaultProvider")
+public class XenNfsConfigurator extends AbstractXenConfigurator {
 
-    @Override
-    public HypervisorType getSupportedHypervisor() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public String getSupportedDataStoreType() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public PrimaryDataStore getDataStore() {
-        // TODO Auto-generated method stub
-        return null;
-    }
+	@Override
+	public String getSupportedDataStoreType() {
+		return "nfs";
+	}
 
+	@Override
+	public ProtocolValidator getValidator() {
+		return new NfsValidator();
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java
index 5a6b409..251c817 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreVO.java
@@ -98,6 +98,9 @@ public class PrimaryDataStoreVO implements Identity {
 
     @Column(name = "cluster_id")
     private Long clusterId;
+    
+    @Column(name = "configurator_key")
+    private String key;
 
     public long getId() {
         return id;
@@ -234,6 +237,14 @@ public class PrimaryDataStoreVO implements Identity {
     public void setName(String name) {
         this.name = name;
     }
+    
+    public void setKey(String key) {
+    	this.key = key;
+    }
+    
+    public String getKey() {
+    	return this.key;
+    }
 
     @Override
     public boolean equals(Object obj) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/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 897c65e..062c625 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
@@ -48,55 +48,12 @@ public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLif
         this.dataStore = dataStore;
     }
     
-    protected class DataStoreUrlParser {
-        private String schema;
-        private String host;
-        private String path;
-        private int port;
-        
-        public DataStoreUrlParser(String url) {
-            try {
-                URI uri = new URI(url);
-                schema = uri.getScheme();
-                host = uri.getHost();
-                path = uri.getPath();
-                port = (uri.getPort() == -1) ? 0 : uri.getPort();
-            } catch (URISyntaxException e) {
-               
-            }
-        }
-        
-        public String getSchema() {
-            return this.schema;
-        }
-        
-        public String getHost() {
-            return this.host;
-        }
-        
-        public String getPath() {
-            return this.path;
-        }
-        
-        public int getPort() {
-            return this.port;
-        }
-    }
-    
     @Override
     public boolean initialize(Map<String, String> dsInfos) {
-        DataStoreUrlParser parser = new DataStoreUrlParser(dsInfos.get("url"));
         PrimaryDataStoreVO dataStore = dataStoreDao.findById(this.dataStore.getId());
-        dataStore.setName(dsInfos.get("name"));
-        dataStore.setPoolType(parser.getSchema());
-        dataStore.setPort(parser.port);
-        dataStore.setHostAddress(parser.getHost());
-        dataStore.setPath(parser.getPath());
         dataStore.setStatus(DataStoreStatus.Initialized);
         dataStoreDao.update(this.dataStore.getId(), dataStore);
         //TODO: add extension point for each data store
-        
-        this.dataStore = this.dataStore.getProvider().getDataStore(dataStore.getId());
         return true;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultVmwarePrimaryDataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultVmwarePrimaryDataStoreLifeCycle.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultVmwarePrimaryDataStoreLifeCycle.java
index dcb0c77..ea19891 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultVmwarePrimaryDataStoreLifeCycle.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultVmwarePrimaryDataStoreLifeCycle.java
@@ -27,13 +27,9 @@ public class DefaultVmwarePrimaryDataStoreLifeCycle extends DefaultPrimaryDataSt
      * @param dataStoreDao
      * @param dataStore
      */
-    public DefaultVmwarePrimaryDataStoreLifeCycle(PrimaryDataStoreDao dataStoreDao, PrimaryDataStore dataStore) {
-        super(dataStoreDao, dataStore);
+    public DefaultVmwarePrimaryDataStoreLifeCycle(PrimaryDataStoreDao dataStoreDao) {
+        super(dataStoreDao);
         // TODO Auto-generated constructor stub
     }
-    
-    public DefaultVmwarePrimaryDataStoreLifeCycle() {
-        super(null, null);
-    }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/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 27bb347..824ac01 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,6 @@
  */
 package org.apache.cloudstack.storage.datastore.lifecycle;
 
-import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 
 public class DefaultXenPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStoreLifeCycleImpl {
@@ -27,8 +26,8 @@ public class DefaultXenPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStore
      * @param dataStoreDao
      * @param dataStore
      */
-    public DefaultXenPrimaryDataStoreLifeCycle(PrimaryDataStoreDao dataStoreDao, PrimaryDataStore dataStore) {
-        super(dataStoreDao, dataStore);
+    public DefaultXenPrimaryDataStoreLifeCycle(PrimaryDataStoreDao dataStoreDao) {
+        super(dataStoreDao);
         // TODO Auto-generated constructor stub
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/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 f1fca31..698762a 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,5 +1,9 @@
 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.inject.Inject;
@@ -8,6 +12,8 @@ import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCy
 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.ProtocolValidator;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderDao;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreProviderVO;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
@@ -15,8 +21,15 @@ 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.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 
+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";
@@ -26,9 +39,20 @@ public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProv
     protected PrimaryDataStoreDao dataStoreDao;
     @Inject
     protected PrimaryDataStoreProviderDao providerDao;
+    @Inject
+    protected ClusterDao clusterDao;
+    protected Map<String, PrimaryDataStoreConfigurator> configuratorMaps = new HashMap<String, PrimaryDataStoreConfigurator>();
 
-    public DefaultPrimaryDatastoreProviderImpl() {
-        
+    @Inject
+    public DefaultPrimaryDatastoreProviderImpl(@Qualifier("defaultProvider") List<PrimaryDataStoreConfigurator> configurators) {
+        for (PrimaryDataStoreConfigurator configurator : configurators) {
+            String key = generateKey(configurator.getSupportedHypervisor(), configurator.getSupportedDataStoreType().toString());
+            configuratorMaps.put(key, configurator);
+        }
+    }
+
+    protected String generateKey(HypervisorType hypervisor, String poolType) {
+        return hypervisor.toString().toLowerCase() + "_" + poolType.toString().toLowerCase();
     }
 
     @Override
@@ -38,24 +62,58 @@ public class DefaultPrimaryDatastoreProviderImpl implements PrimaryDataStoreProv
             return null;
         }
 
-        DefaultPrimaryDataStore pds = DefaultPrimaryDataStore.createDataStore(dsv);
-        
-        PrimaryDataStoreDriver driver = new DefaultPrimaryDataStoreDriverImpl(pds);
-        pds.setDriver(driver);
-        
-        DefaultPrimaryDataStoreLifeCycleImpl lifeCycle = new DefaultPrimaryDataStoreLifeCycleImpl(dataStoreDao, pds);
-        pds.setLifeCycle(lifeCycle);
-        
-        return pds;
+        String key = dsv.getKey();
+
+        PrimaryDataStoreConfigurator configurator = configuratorMaps.get(key);
+
+        DefaultPrimaryDataStore dataStore = (DefaultPrimaryDataStore)configurator.getDataStore(dataStoreId);
+        dataStore.setProvider(this);
+        return dataStore;
     }
-    
+
     @Override
     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);
+        }
+
+        ProtocolValidator validator = configurator.getValidator();
+        validator.validate(dsInfos);
+
         PrimaryDataStoreVO 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 = dataStoreDao.persist(dataStoreVO);
+
+        DefaultPrimaryDataStore dataStore = (DefaultPrimaryDataStore)configurator.getDataStore(dataStoreVO.getId());
+        dataStore.setProvider(this);
         
-        PrimaryDataStore dataStore = this.getDataStore(dataStoreVO.getId());
         PrimaryDataStoreLifeCycle lifeCycle = dataStore.getLifeCycle();
         lifeCycle.initialize(dsInfos);
         return getDataStore(dataStore.getId());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/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
index d064cce..7d19449 100644
--- 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
@@ -29,6 +29,8 @@ 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
@@ -47,6 +49,7 @@ public class PrimaryDataStoreProviderManagerImpl implements PrimaryDataStoreProv
     }
 
     @Override
+    @DB
     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
         List<PrimaryDataStoreProviderVO> providerVos = providerDao.listAll();
         for (PrimaryDataStoreProvider provider : providers) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/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 c70de8c..48bf880 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,17 +18,30 @@
  */
 package org.apache.cloudstack.storage.volume.test;
 
+import static org.junit.Assert.*;
+
+import java.util.HashMap;
 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.configurator.PrimaryDataStoreConfigurator;
+import org.apache.cloudstack.storage.datastore.provider.PrimaryDataStoreProviderManager;
+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;
 
+import com.cloud.dc.ClusterVO;
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+
 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration(locations="classpath:/resource/testContext.xml")
 public class ConfiguratorTest {
@@ -36,10 +49,53 @@ public class ConfiguratorTest {
     @Qualifier("defaultProvider")
     List<PrimaryDataStoreConfigurator> configurators;
     
+    @Inject 
+    List<PrimaryDataStoreProvider> providers;
+    
+    @Inject
+    PrimaryDataStoreProviderManager providerMgr;
+    @Inject
+    ClusterDao clusterDao;
+    @Before
+    public void setup() {
+        ClusterVO cluster = new ClusterVO();
+        cluster.setHypervisorType(HypervisorType.XenServer.toString());
+        Mockito.when(clusterDao.findById(Mockito.anyLong())).thenReturn(cluster);
+        try {
+            providerMgr.configure("manager", null);
+        } catch (ConfigurationException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
     @Test
     public void testLoadConfigurator() {
         for (PrimaryDataStoreConfigurator configurator : configurators) {
             System.out.println(configurator.getClass().getName());
         }
     }
+    
+    @Test
+    public void testProvider() {
+        for (PrimaryDataStoreProvider provider : providers) {
+            if (provider.getName().startsWith("default")) {
+                assertTrue(true);
+            }
+        }
+    }
+    
+    @Test
+    public void getProvider() {
+        assertNotNull(providerMgr.getDataStoreProvider("default primary data store provider"));
+    }
+    
+    @Test
+    public void createDataStore() {
+        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));
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/TestConfiguration.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/TestConfiguration.java b/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/TestConfiguration.java
index 960d1f6..c755334 100644
--- a/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/TestConfiguration.java
+++ b/engine/storage/volume/test/org/apache/cloudstack/storage/volume/test/TestConfiguration.java
@@ -23,6 +23,9 @@ import org.mockito.Mockito;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
+import com.cloud.dc.dao.ClusterDao;
+import com.cloud.dc.dao.ClusterDaoImpl;
+
 
 @Configuration
 public class TestConfiguration {
@@ -30,4 +33,9 @@ public class TestConfiguration {
     public ImageMotionService imageMotion() {
         return Mockito.mock(ImageMotionService.class);
     }
+    
+    @Bean
+    public ClusterDao clusterDao() {
+        return Mockito.mock(ClusterDaoImpl.class);
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/engine/storage/volume/test/resource/testContext.xml
----------------------------------------------------------------------
diff --git a/engine/storage/volume/test/resource/testContext.xml b/engine/storage/volume/test/resource/testContext.xml
index c8290eb..562bef8 100644
--- a/engine/storage/volume/test/resource/testContext.xml
+++ b/engine/storage/volume/test/resource/testContext.xml
@@ -12,13 +12,23 @@
                                           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
   <context:annotation-config />
   <context:component-scan base-package="org.apache.cloudstack.storage" />
-  <context:component-scan base-package="org.apache.cloudstack.engine.subsystem.api.storage" />
+  <context:component-scan
+    base-package="org.apache.cloudstack.engine.subsystem.api.storage" />
   <context:component-scan base-package="com.cloud.utils.db" />
   <context:component-scan base-package="com.cloud.utils.component" />
   <context:component-scan base-package="com.cloud.host.dao" />
   <context:component-scan base-package="com.cloud.dc.dao" />
- 
-   <context:component-scan base-package=" com.cloud.upgrade.dao" />
-   <tx:annotation-driven transaction-manager="transactionManager" />
-  <bean class="org.cloudstack.storage.volume.test.TestConfiguration" />
+
+  <context:component-scan base-package=" com.cloud.upgrade.dao" />
+  <tx:annotation-driven transaction-manager="transactionManager" />
+  <bean class="org.apache.cloudstack.storage.volume.test.TestConfiguration" />
+  <aop:config proxy-target-class="true">
+    <aop:aspect id="dbContextBuilder" ref="transactionContextBuilder">
+      <aop:pointcut id="captureAnyMethod" expression="@annotation(com.cloud.utils.db.DB)" />
+      <aop:around pointcut-ref="captureAnyMethod" method="AroundAnyMethod" />
+    </aop:aspect>
+  </aop:config>
+
+  <bean id="transactionContextBuilder" class="com.cloud.utils.db.TransactionContextBuilder" />
+  
 </beans>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/cdf55116/setup/db/4.1-new-db-schema.sql
----------------------------------------------------------------------
diff --git a/setup/db/4.1-new-db-schema.sql b/setup/db/4.1-new-db-schema.sql
index 7be4b09..a39cedc 100644
--- a/setup/db/4.1-new-db-schema.sql
+++ b/setup/db/4.1-new-db-schema.sql
@@ -17,6 +17,7 @@
 
 alter table vm_template add image_data_store_id bigint unsigned;
 alter table storage_pool add storage_provider_id bigint unsigned; 
+alter table storage_pool add configurator_key varchar(255); 
 alter table storage_pool modify id bigint unsigned AUTO_INCREMENT UNIQUE NOT NULL;
 alter table volumes add disk_type varchar(255);
 alter table volumes drop foreign key `fk_volumes__account_id`;