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

[1/7] git commit: add backedn code

add backedn code


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

Branch: refs/heads/javelin
Commit: b4988e86ab0da40c8f6e0236fc38a31e91182302
Parents: f7e75d3
Author: Edison Su <su...@gmail.com>
Authored: Fri Jan 18 19:21:10 2013 -0800
Committer: Edison Su <ed...@citrix.com>
Committed: Mon Jan 21 16:59:50 2013 -0800

----------------------------------------------------------------------
 .../engine/subsystem/api/storage/EndPoint.java     |    1 +
 ...ockHostEndpointRpcServerDirectCallResource.java |    4 +-
 .../cloudstack/storage/test/volumeServiceTest.java |   13 ++-
 .../cloudstack/storage/HypervisorHostEndPoint.java |    2 +-
 .../storage/command/CreatePrimaryDataStoreCmd.java |   11 +--
 .../storage/endpoint/DefaultEndPointSelector.java  |   29 ++++++
 .../storage/endpoint/EndPointSelector.java         |    8 ++
 .../storage/datastore/DefaultPrimaryDataStore.java |    4 +-
 .../driver/DefaultPrimaryDataStoreDriverImpl.java  |   18 ++--
 .../DefaultKvmPrimaryDataStoreLifeCycle.java       |   34 -------
 .../DefaultPrimaryDataStoreLifeCycleImpl.java      |   45 +++++++--
 .../DefaultVmwarePrimaryDataStoreLifeCycle.java    |   35 -------
 .../DefaultXenPrimaryDataStoreLifeCycle.java       |   59 -----------
 .../cloudstack/storage/volume/VolumeObject.java    |    2 +-
 .../xen/resource/XenServerStorageResource.java     |   78 +++++++++++----
 15 files changed, 165 insertions(+), 178 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPoint.java
----------------------------------------------------------------------
diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPoint.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPoint.java
index ed691f7..2ff45b1 100644
--- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPoint.java
+++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/EndPoint.java
@@ -22,6 +22,7 @@ import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.Command;
 
 public interface EndPoint {
+    public long getId();
 	public Answer sendMessage(Command cmd);
 	public void sendMessageAsync(Command cmd, AsyncCompletionCallback<Answer> callback);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockHostEndpointRpcServerDirectCallResource.java
----------------------------------------------------------------------
diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockHostEndpointRpcServerDirectCallResource.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockHostEndpointRpcServerDirectCallResource.java
index 2d3fd7a..4ec2436 100644
--- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockHostEndpointRpcServerDirectCallResource.java
+++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/MockHostEndpointRpcServerDirectCallResource.java
@@ -51,7 +51,7 @@ public class MockHostEndpointRpcServerDirectCallResource implements HostEndpoint
         MockRpcCallBack run = ComponentContext.inject(MockRpcCallBack.class);
         run.setCallback(callback);
         run.setCmd(command);
-        run.setHostId(host.getHostId());
+        run.setHostId(host.getId());
         executor.schedule(run, 10, TimeUnit.SECONDS);
     }
 
@@ -59,7 +59,7 @@ public class MockHostEndpointRpcServerDirectCallResource implements HostEndpoint
     public Answer sendCommand(HypervisorHostEndPoint host, Command command) {
         Answer answer;
         try {
-            answer = agentMgr.send(host.getHostId(), command);
+            answer = agentMgr.send(host.getId(), command);
             return answer;
         } catch (AgentUnavailableException e) {
            return null;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java
----------------------------------------------------------------------
diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java
index a81c546..842b805 100644
--- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java
+++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/volumeServiceTest.java
@@ -19,6 +19,7 @@
 package org.apache.cloudstack.storage.test;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.UUID;
 
@@ -31,6 +32,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
 import org.apache.cloudstack.engine.subsystem.api.storage.type.RootDisk;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreVO;
+import org.apache.cloudstack.storage.datastore.provider.DataStoreProviderManager;
 import org.apache.cloudstack.storage.image.ImageService;
 import org.apache.cloudstack.storage.image.db.ImageDataDao;
 import org.apache.cloudstack.storage.image.db.ImageDataVO;
@@ -80,8 +82,8 @@ public class volumeServiceTest extends CloudStackTestNGBase {
 	DataCenterDao dcDao;
 	@Inject
 	PrimaryDataStoreDao primaryStoreDao;
-	//@Inject
-	//PrimaryDataStoreProviderManager primaryDataStoreProviderMgr;
+	@Inject
+	DataStoreProviderManager dataStoreProviderMgr;
 	@Inject
 	AgentManager agentMgr;
 	Long dcId;
@@ -135,6 +137,12 @@ public class volumeServiceTest extends CloudStackTestNGBase {
 		host.setClusterId(cluster.getId());
 
 		host = hostDao.persist(host);
+		try {
+            dataStoreProviderMgr.configure(null, new HashMap<String, Object>());
+        } catch (ConfigurationException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
 		primaryStore = createPrimaryDataStore();
 	
 		//CreateVolumeAnswer createVolumeFromImageAnswer = new CreateVolumeAnswer(UUID.randomUUID().toString());
@@ -209,6 +217,7 @@ public class volumeServiceTest extends CloudStackTestNGBase {
 
 	private PrimaryDataStoreInfo createPrimaryDataStore() {
 		try {
+		    
 		    /*
 		    PrimaryDataStoreProvider provider = primaryDataStoreProviderMgr.getDataStoreProvider("default primary data store provider");
 		    primaryDataStoreProviderMgr.configure("primary data store mgr", new HashMap<String, Object>());

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/engine/storage/src/org/apache/cloudstack/storage/HypervisorHostEndPoint.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/HypervisorHostEndPoint.java b/engine/storage/src/org/apache/cloudstack/storage/HypervisorHostEndPoint.java
index c4ebfb2..c36a7de 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/HypervisorHostEndPoint.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/HypervisorHostEndPoint.java
@@ -48,7 +48,7 @@ public class HypervisorHostEndPoint implements EndPoint {
         return this.hostAddress;
     }
     
-    public long getHostId() {
+    public long getId() {
         return this.hostId;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/engine/storage/src/org/apache/cloudstack/storage/command/CreatePrimaryDataStoreCmd.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/command/CreatePrimaryDataStoreCmd.java b/engine/storage/src/org/apache/cloudstack/storage/command/CreatePrimaryDataStoreCmd.java
index c9808d9..0e50950 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/command/CreatePrimaryDataStoreCmd.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/command/CreatePrimaryDataStoreCmd.java
@@ -16,18 +16,15 @@
 // under the License.
 package org.apache.cloudstack.storage.command;
 
-import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
-import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
-
 import com.cloud.agent.api.Command;
 
 public class CreatePrimaryDataStoreCmd extends Command implements StorageSubSystemCommand {
-    private final PrimaryDataStoreTO dataStore;
-    public CreatePrimaryDataStoreCmd(PrimaryDataStoreTO dataStore) {
-        this.dataStore = dataStore;
+    private final String dataStore;
+    public CreatePrimaryDataStoreCmd(String uri) {
+        this.dataStore = uri;
     }
     
-    public PrimaryDataStoreTO getDataStore() {
+    public String getDataStore() {
         return this.dataStore;
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
index 846697c..b39142c 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
@@ -21,6 +21,8 @@ package org.apache.cloudstack.storage.endpoint;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.inject.Inject;
 
@@ -36,9 +38,13 @@ import org.apache.log4j.Logger;
 import org.springframework.stereotype.Component;
 
 import com.cloud.host.HostVO;
+import com.cloud.host.Status;
 import com.cloud.host.dao.HostDao;
 import com.cloud.utils.db.DB;
+import com.cloud.utils.db.SearchCriteria2;
+import com.cloud.utils.db.SearchCriteriaService;
 import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @Component
@@ -164,4 +170,27 @@ public class DefaultEndPointSelector implements EndPointSelector {
         }
         
     }
+    
+    @Override
+    public List<EndPoint> selectAll(DataStore store) {
+        List<EndPoint> endPoints = new ArrayList<EndPoint>();
+        if (store.getScope().getScopeType() == ScopeType.HOST) {
+            HostVO host = hostDao.findById(store.getScope().getScopeId());
+            endPoints.add(new HypervisorHostEndPoint(host.getId(),
+                    host.getPrivateIpAddress()));
+        } else if (store.getScope().getScopeType() == ScopeType.CLUSTER) {
+            SearchCriteriaService<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
+            sc.addAnd(sc.getEntity().getClusterId(), Op.EQ, store.getScope().getScopeId());
+            sc.addAnd(sc.getEntity().getStatus(), Op.EQ, Status.Up);
+            List<HostVO> hosts = sc.find();
+            for (HostVO host : hosts) {
+                endPoints.add(new HypervisorHostEndPoint(host.getId(),
+                        host.getPrivateIpAddress()));
+            }
+           
+        } else {
+            throw new CloudRuntimeException("shouldn't use it for other scope");
+        }
+        return endPoints;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/engine/storage/src/org/apache/cloudstack/storage/endpoint/EndPointSelector.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/endpoint/EndPointSelector.java b/engine/storage/src/org/apache/cloudstack/storage/endpoint/EndPointSelector.java
index 9f93cda..6910eb6 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/endpoint/EndPointSelector.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/endpoint/EndPointSelector.java
@@ -18,7 +18,10 @@
  */
 package org.apache.cloudstack.storage.endpoint;
 
+import java.util.List;
+
 import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
+import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
 
 public interface EndPointSelector {
@@ -29,4 +32,9 @@ public interface EndPointSelector {
      * @return
      */
     EndPoint select(DataObject object);
+    /**
+     * @param store
+     * @return
+     */
+    List<EndPoint> selectAll(DataStore store);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/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 ba5b1f5..6ab9120 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
@@ -46,6 +46,7 @@ import org.apache.cloudstack.storage.volume.db.VolumeVO;
 import org.apache.log4j.Logger;
 
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.storage.dao.StoragePoolHostDao;
 import com.cloud.utils.component.ComponentContext;
 
 public class DefaultPrimaryDataStore implements PrimaryDataStore {
@@ -120,7 +121,8 @@ public class DefaultPrimaryDataStore implements PrimaryDataStore {
         return this.pdsv.getPoolType() + File.separator
                 + this.pdsv.getHostAddress() + File.separator
                 + this.pdsv.getPath() + File.separator
-                + "?role=" + this.getRole(); 
+                + "?role=" + this.getRole()
+                + "&storeUuid=" + this.pdsv.getUuid();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
index dfc6566..ab57d6e 100644
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
+++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/driver/DefaultPrimaryDataStoreDriverImpl.java
@@ -38,13 +38,16 @@ import org.apache.cloudstack.storage.volume.PrimaryDataStoreDriver;
 import org.apache.log4j.Logger;
 
 import com.cloud.agent.api.Answer;
+import com.cloud.storage.StoragePoolHostVO;
+import com.cloud.storage.dao.StoragePoolHostDao;
 
 
 public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver {
     private static final Logger s_logger = Logger.getLogger(DefaultPrimaryDataStoreDriverImpl.class);
     @Inject
     EndPointSelector selector;
-
+    @Inject
+    StoragePoolHostDao storeHostDao;
     public DefaultPrimaryDataStoreDriverImpl() {
         
     }
@@ -65,13 +68,13 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
         
     }
     
-    public Void createAsyncCallback(AsyncCallbackDispatcher<DefaultPrimaryDataStoreDriverImpl, Answer> callback, CreateVolumeContext<CommandResult> context) {
-        CommandResult result = new CommandResult();
+    public Void createAsyncCallback(AsyncCallbackDispatcher<DefaultPrimaryDataStoreDriverImpl, Answer> callback, CreateVolumeContext<CreateCmdResult> context) {
+        CreateCmdResult result = null;
         CreateVolumeAnswer volAnswer = (CreateVolumeAnswer) callback.getResult();
         if (volAnswer.getResult()) {
-            DataObject volume = context.getVolume();
-            //volume.setPath(volAnswer.getVolumeUuid());
+            result = new CreateCmdResult(volAnswer.getVolumeUuid());
         } else {
+            result = new CreateCmdResult("");
             result.setResult(volAnswer.getDetails());
         }
         
@@ -155,7 +158,7 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
         EndPoint ep = selector.select(vol);
         CreateObjectCommand createCmd = new CreateObjectCommand(vol.getUri());
         
-        CreateVolumeContext<CommandResult> context = null;
+        CreateVolumeContext<CreateCmdResult> context = null;
         AsyncCallbackDispatcher<DefaultPrimaryDataStoreDriverImpl, Answer> caller = AsyncCallbackDispatcher.create(this);
         caller.setContext(context)
             .setCallback(caller.getTarget().createAsyncCallback(null, null));
@@ -165,7 +168,8 @@ public class DefaultPrimaryDataStoreDriverImpl implements PrimaryDataStoreDriver
 
     @Override
     public String grantAccess(DataObject object, EndPoint ep) {
-        return object.getUri();
+        StoragePoolHostVO poolHost = storeHostDao.findByPoolHost(object.getDataStore().getId(), ep.getId());
+        return object.getUri() + "&storagePath=" + poolHost.getLocalPath();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultKvmPrimaryDataStoreLifeCycle.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultKvmPrimaryDataStoreLifeCycle.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultKvmPrimaryDataStoreLifeCycle.java
deleted file mode 100644
index 5407b37..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultKvmPrimaryDataStoreLifeCycle.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cloudstack.storage.datastore.lifecycle;
-
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-
-public class DefaultKvmPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStoreLifeCycleImpl {
-
-    /**
-     * @param dataStoreDao
-     * @param dataStore
-     */
-    public DefaultKvmPrimaryDataStoreLifeCycle(PrimaryDataStoreDao dataStoreDao) {
-        super(dataStoreDao);
-        // TODO Auto-generated constructor stub
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultPrimaryDataStoreLifeCycleImpl.java
index c3372b7..455943a 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
@@ -18,24 +18,37 @@
  */
 package org.apache.cloudstack.storage.datastore.lifecycle;
 
+import java.util.List;
 import java.util.Map;
 
+import javax.inject.Inject;
+
 import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope;
 import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
 import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
 import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreLifeCycle;
 import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
 import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
+import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd;
 import org.apache.cloudstack.storage.datastore.DataStoreStatus;
 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.endpoint.EndPointSelector;
+
+import com.cloud.host.HostVO;
+import com.cloud.host.dao.HostDao;
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
 
 public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLifeCycle {
     protected PrimaryDataStore dataStore;
-    protected PrimaryDataStoreDao dataStoreDao;
-    public DefaultPrimaryDataStoreLifeCycleImpl(PrimaryDataStoreDao dataStoreDao) {
-        this.dataStoreDao = dataStoreDao;
+    @Inject
+    EndPointSelector selecotr;
+    @Inject
+    PrimaryDataStoreDao dataStoreDao;
+    @Inject
+    HostDao hostDao;
+    public DefaultPrimaryDataStoreLifeCycleImpl() {
     }
     
     @Override
@@ -44,26 +57,36 @@ public class DefaultPrimaryDataStoreLifeCycleImpl implements PrimaryDataStoreLif
         return true;
     }
 
-    protected void attachCluster() {
+    protected void attachCluster(DataStore store) {
         //send down AttachPrimaryDataStoreCmd command to all the hosts in the cluster
-        AttachPrimaryDataStoreCmd cmd = new AttachPrimaryDataStoreCmd(this.dataStore.getUri());
-        /*for (EndPoint ep : dataStore.getEndPoints()) {
-            ep.sendMessage(cmd);
-        } */
+        List<EndPoint> endPoints = selecotr.selectAll(dataStore);
+        CreatePrimaryDataStoreCmd createCmd = new CreatePrimaryDataStoreCmd(store.getUri());
+        EndPoint ep = endPoints.get(0);
+        HostVO host = hostDao.findById(ep.getId());
+        if (host.getHypervisorType() == HypervisorType.XenServer) {
+            ep.sendMessage(createCmd);
+        }
+        
+        endPoints.get(0).sendMessage(createCmd);
+        AttachPrimaryDataStoreCmd cmd = new AttachPrimaryDataStoreCmd(dataStore.getUri());
+        for (EndPoint endp : endPoints) {
+            endp.sendMessage(cmd);
+        }
     }
     
     @Override
     public boolean attachCluster(DataStore dataStore, ClusterScope scope) {
-        PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(this.dataStore.getId());
+        PrimaryDataStoreVO dataStoreVO = dataStoreDao.findById(dataStore.getId());
         dataStoreVO.setDataCenterId(scope.getZoneId());
         dataStoreVO.setPodId(scope.getPodId());
         dataStoreVO.setClusterId(scope.getScopeId());
         dataStoreVO.setStatus(DataStoreStatus.Attaching);
+        dataStoreVO.setScope(scope.getScopeType());
         dataStoreDao.update(dataStoreVO.getId(), dataStoreVO);
         
-        attachCluster();
+        attachCluster(dataStore);
         
-        dataStoreVO = dataStoreDao.findById(this.dataStore.getId());
+        dataStoreVO = dataStoreDao.findById(dataStore.getId());
         dataStoreVO.setStatus(DataStoreStatus.Up);
         dataStoreDao.update(dataStoreVO.getId(), dataStoreVO);
         

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/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
deleted file mode 100644
index ea19891..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultVmwarePrimaryDataStoreLifeCycle.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cloudstack.storage.datastore.lifecycle;
-
-import org.apache.cloudstack.storage.datastore.PrimaryDataStore;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-
-public class DefaultVmwarePrimaryDataStoreLifeCycle extends DefaultPrimaryDataStoreLifeCycleImpl {
-
-    /**
-     * @param dataStoreDao
-     * @param dataStore
-     */
-    public DefaultVmwarePrimaryDataStoreLifeCycle(PrimaryDataStoreDao dataStoreDao) {
-        super(dataStoreDao);
-        // TODO Auto-generated constructor stub
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/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
deleted file mode 100644
index da61825..0000000
--- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/lifecycle/DefaultXenPrimaryDataStoreLifeCycle.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cloudstack.storage.datastore.lifecycle;
-
-import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
-import org.apache.cloudstack.storage.command.AttachPrimaryDataStoreCmd;
-import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd;
-import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
-
-import com.cloud.agent.api.Answer;
-import com.cloud.utils.exception.CloudRuntimeException;
-
-public class DefaultXenPrimaryDataStoreLifeCycle extends DefaultPrimaryDataStoreLifeCycleImpl {
-
-    /**
-     * @param dataStoreDao
-     * @param dataStore
-     */
-    public DefaultXenPrimaryDataStoreLifeCycle(PrimaryDataStoreDao dataStoreDao) {
-        super(dataStoreDao);
-        // TODO Auto-generated constructor stub
-    }
-    
-    @Override
-    public void attachCluster() {
-        String result = null;
-        //send one time is enough, as xenserver is clustered
-        /*CreatePrimaryDataStoreCmd cmd = new CreatePrimaryDataStoreCmd(this.dataStore.getDataStoreTO());
-        String result = null;
-        for (EndPoint ep : dataStore.getEndPoints()) {
-            Answer answer = ep.sendMessage(cmd);
-            if (answer.getResult()) {
-                return;
-            }
-            result = answer.getDetails();
-        }*/
-        
-        if (result != null)
-            throw new CloudRuntimeException("AttachPrimaryDataStoreCmd failed: " + result);
-        
-        super.attachCluster();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/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 f656e59..3b7600c 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
@@ -121,7 +121,7 @@ public class VolumeObject implements VolumeInfo {
         }
         ObjectInDataStoreVO obj = ojbectInStoreMgr.findObject(this.volumeVO.getId(), DataObjectType.VOLUME, this.dataStore.getId(), this.dataStore.getRole());
         if (obj.getState() != ObjectInDataStoreStateMachine.State.Ready) {
-            return this.dataStore.getUri() + File.separator + "&objType=" + DataObjectType.VOLUME + "&size=" + this.volumeVO.getSize();
+            return this.dataStore.getUri() + File.separator + "&objType=" + DataObjectType.VOLUME + "&size=" + this.volumeVO.getSize() + "&name=" + this.volumeVO.getName();
         } else {
             return this.dataStore.getUri() + File.separator + "&objType=" + DataObjectType.VOLUME + "&path=" + obj.getInstallPath();
         }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/b4988e86/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 a245fb7..417de0b 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,10 @@ import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
@@ -31,9 +34,9 @@ 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.CopyCmdAnswer;
+import org.apache.cloudstack.storage.command.CreateObjectCommand;
 import org.apache.cloudstack.storage.command.CreatePrimaryDataStoreCmd;
 import org.apache.cloudstack.storage.command.CreateVolumeAnswer;
-import org.apache.cloudstack.storage.command.CreateObjectCommand;
 import org.apache.cloudstack.storage.command.CreateVolumeFromBaseImageCommand;
 import org.apache.cloudstack.storage.command.StorageSubSystemCommand;
 import org.apache.cloudstack.storage.datastore.protocol.DataStoreProtocol;
@@ -65,6 +68,8 @@ import com.xensource.xenapi.Types.BadServerResponse;
 import com.xensource.xenapi.Types.XenAPIException;
 import com.xensource.xenapi.VDI;
 
+import edu.emory.mathcs.backport.java.util.Arrays;
+
 public class XenServerStorageResource {
     private static final Logger s_logger = Logger.getLogger(XenServerStorageResource.class);
     protected CitrixResourceBase hypervisorResource;
@@ -114,16 +119,39 @@ public class XenServerStorageResource {
         vdi.destroy(conn);
     }
     
+    private Map<String, String> getParameters(URI uri) {
+        String parameters = uri.getQuery();
+        Map<String, String> params = new HashMap<String, String>();
+        List<String> paraLists = Arrays.asList(parameters.split("&"));
+        for (String para : paraLists) {
+            String[] pair = para.split("=");
+            params.put(pair[0], pair[1]);
+        }
+        return params;
+    }
+    
     protected CreateVolumeAnswer execute(CreateObjectCommand cmd) {
-        VolumeTO volume = null;
-        PrimaryDataStoreTO primaryDataStore = volume.getDataStore();
+        String uriString = cmd.getObjectUri();
+        Map<String, String> params = null;
+        
+        try {
+            URI uri = new URI(uriString);
+            params = getParameters(uri);
+        } catch (URISyntaxException e1) {
+            s_logger.debug("uri exception", e1);
+            return new CreateVolumeAnswer(cmd, false, e1.toString()); 
+        }
+        
+        long size = Long.parseLong(params.get("size"));
+        String name = params.get("name");
+        String storeUuid = params.get("storagePath");
         Connection conn = hypervisorResource.getConnection();
         VDI vdi = null;
         boolean result = false;
         String errorMsg = null;
         try {
-            SR primaryDataStoreSR = getSRByNameLabel(conn, primaryDataStore.getUuid());
-            vdi = createVdi(conn, volume.getName(), primaryDataStoreSR, volume.getSize());
+            SR primaryDataStoreSR = getSRByNameLabel(conn, storeUuid);
+            vdi = createVdi(conn, name, primaryDataStoreSR, size);
             VDI.Record record = vdi.getRecord(conn);
             result = true;
             return new CreateVolumeAnswer(cmd, record.uuid);
@@ -190,11 +218,14 @@ public class XenServerStorageResource {
         }
     }
     
-    protected SR getNfsSR(Connection conn, NfsPrimaryDataStoreTO pool) {
+    protected SR getNfsSR(Connection conn, URI uri) {
         Map<String, String> deviceConfig = new HashMap<String, String>();
+        Map<String, String> params = getParameters(uri);
+        String uuid = params.get("storeUuid");
         try {
-            String server = pool.getServer();
-            String serverpath = pool.getPath();
+            String server = uri.getHost();
+            String serverpath = uri.getPath();
+            
             serverpath = serverpath.replace("//", "/");
             Set<SR> srs = SR.getAll(conn);
             for (SR sr : srs) {
@@ -225,21 +256,21 @@ public class XenServerStorageResource {
 
                 if (server.equals(dc.get("server")) && serverpath.equals(dc.get("serverpath"))) {
                     throw new CloudRuntimeException("There is a SR using the same configuration server:" + dc.get("server") + ", serverpath:"
-                            + dc.get("serverpath") + " for pool " + pool.getUuid() + "on host:" + hypervisorResource.getHost().uuid);
+                            + dc.get("serverpath") + " for pool " + uuid + "on host:" + hypervisorResource.getHost().uuid);
                 }
 
             }
             deviceConfig.put("server", server);
             deviceConfig.put("serverpath", serverpath);
             Host host = Host.getByUuid(conn, hypervisorResource.getHost().uuid);
-            SR sr = SR.create(conn, host, deviceConfig, new Long(0), pool.getUuid(), Long.toString(pool.getId()), SRType.NFS.toString(), "user", true,
+            SR sr = SR.create(conn, host, deviceConfig, new Long(0), uuid, uuid, SRType.NFS.toString(), "user", true,
                     new HashMap<String, String>());
             sr.scan(conn);
             return sr;
         } catch (XenAPIException e) {
-            throw new CloudRuntimeException("Unable to create NFS SR " + pool.toString(), e);
+            throw new CloudRuntimeException("Unable to create NFS SR " + uuid, e);
         } catch (XmlRpcException e) {
-            throw new CloudRuntimeException("Unable to create NFS SR " + pool.toString(), e);
+            throw new CloudRuntimeException("Unable to create NFS SR " + uuid, e);
         }
     }
     /*
@@ -369,15 +400,26 @@ public class XenServerStorageResource {
     
     protected Answer execute(CreatePrimaryDataStoreCmd cmd) {
         Connection conn = hypervisorResource.getConnection();
-        PrimaryDataStoreTO dataStore = cmd.getDataStore();
+        String storeUrl = cmd.getDataStore();
+        String scheme = null;
+        String type = null;
+        URI storeUri = null;
+        try {
+            storeUri = new URI(storeUrl);
+        } catch(URISyntaxException e) {
+            return new Answer(cmd, false, e.toString());
+        }
+        
+        scheme = storeUri.getScheme();
+        
         try {
-            if (DataStoreProtocol.NFS.toString().equalsIgnoreCase(dataStore.getType())) {
-                getNfsSR(conn, (NfsPrimaryDataStoreTO)dataStore);
-            } else if (DataStoreProtocol.NFS.toString().equalsIgnoreCase(dataStore.getType())) {
+            if (scheme.equalsIgnoreCase("nfs")) {
+                SR sr = getNfsSR(conn, storeUri);
+            } else if (scheme.equalsIgnoreCase("iscsi")) {
                 //getIscsiSR(conn, dataStore);
-            } else if (dataStore.getType() == StoragePoolType.PreSetup.toString()) {
+            } else if (scheme.equalsIgnoreCase("presetup")) {
             } else {
-                //return new Answer(cmd, false, "The pool type: " + pool.getType().name() + " is not supported.");
+                return new Answer(cmd, false, "The pool type: " + scheme + " is not supported.");
             }
             return new Answer(cmd, true, "success");
         } catch (Exception e) {