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

[22/50] [abbrv] git commit: Create DB view for ListStoragePools API performance optimization.

Create DB view for ListStoragePools API performance optimization.

Signed-off-by: Min Chen <mi...@citrix.com>


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

Branch: refs/heads/resizevolume
Commit: 74c15a22a05023d639dc24329f1ea4c4a6c8932f
Parents: 0a25884
Author: Min Chen <mi...@citrix.com>
Authored: Tue Jan 8 12:33:18 2013 -0800
Committer: Min Chen <mi...@citrix.com>
Committed: Tue Jan 8 12:33:18 2013 -0800

----------------------------------------------------------------------
 api/src/com/cloud/server/ManagementService.java    |    8 -
 .../command/admin/storage/ListStoragePoolsCmd.java |   12 +-
 .../org/apache/cloudstack/query/QueryService.java  |    4 +
 server/src/com/cloud/api/ApiDBUtils.java           |   19 +
 server/src/com/cloud/api/ApiResponseHelper.java    |   46 +--
 server/src/com/cloud/api/ApiServer.java            |    2 +
 .../src/com/cloud/api/query/QueryManagerImpl.java  |  100 +++++
 .../com/cloud/api/query/ViewResponseHelper.java    |   21 +
 .../cloud/api/query/dao/StoragePoolJoinDao.java    |   37 ++
 .../api/query/dao/StoragePoolJoinDaoImpl.java      |  185 ++++++++
 server/src/com/cloud/api/query/vo/BaseViewVO.java  |    2 -
 .../com/cloud/api/query/vo/StoragePoolJoinVO.java  |  341 +++++++++++++++
 .../configuration/DefaultComponentLibrary.java     |    2 +
 .../src/com/cloud/server/ManagementServerImpl.java |   17 -
 server/test/com/cloud/api/ListPerfTest.java        |   17 +
 setup/db/create-schema-view.sql                    |   37 ++
 setup/db/db/schema-40to410.sql                     |   40 ++
 17 files changed, 812 insertions(+), 78 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/api/src/com/cloud/server/ManagementService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/server/ManagementService.java b/api/src/com/cloud/server/ManagementService.java
index e547954..fb8af1a 100755
--- a/api/src/com/cloud/server/ManagementService.java
+++ b/api/src/com/cloud/server/ManagementService.java
@@ -243,14 +243,6 @@ public interface ManagementService {
      */
     List<? extends DiskOffering> searchForDiskOfferings(ListDiskOfferingsCmd cmd);
 
-    /**
-     * List storage pools that match the given criteria
-     *
-     * @param cmd
-     *            the command that wraps the search criteria (zone, pod, name, IP address, path, and cluster id)
-     * @return a list of storage pools that match the given criteria
-     */
-    Pair<List<? extends StoragePool>, Integer> searchForStoragePools(ListStoragePoolsCmd cmd);
 
     /**
      * List system VMs by the given search criteria

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/api/src/org/apache/cloudstack/api/command/admin/storage/ListStoragePoolsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/storage/ListStoragePoolsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/storage/ListStoragePoolsCmd.java
index 3723f8b..9c5c584 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/storage/ListStoragePoolsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/storage/ListStoragePoolsCmd.java
@@ -29,6 +29,7 @@ import org.apache.cloudstack.api.response.ClusterResponse;
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.api.response.PodResponse;
 import org.apache.cloudstack.api.response.StoragePoolResponse;
+import org.apache.cloudstack.api.response.VolumeResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
 import com.cloud.async.AsyncJob;
 import com.cloud.storage.StoragePool;
@@ -116,16 +117,7 @@ public class ListStoragePoolsCmd extends BaseListCmd {
 
     @Override
     public void execute(){
-        Pair<List<? extends StoragePool>, Integer> pools = _mgr.searchForStoragePools(this);
-        ListResponse<StoragePoolResponse> response = new ListResponse<StoragePoolResponse>();
-        List<StoragePoolResponse> poolResponses = new ArrayList<StoragePoolResponse>();
-        for (StoragePool pool : pools.first()) {
-            StoragePoolResponse poolResponse = _responseGenerator.createStoragePoolResponse(pool);
-            poolResponse.setObjectName("storagepool");
-            poolResponses.add(poolResponse);
-        }
-
-        response.setResponses(poolResponses, pools.second());
+        ListResponse<StoragePoolResponse> response = _queryService.searchForStoragePools(this);
         response.setResponseName(getCommandName());
         this.setResponseObject(response);
     }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/api/src/org/apache/cloudstack/query/QueryService.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/query/QueryService.java b/api/src/org/apache/cloudstack/query/QueryService.java
index 480eb31..b03a7fc 100644
--- a/api/src/org/apache/cloudstack/query/QueryService.java
+++ b/api/src/org/apache/cloudstack/query/QueryService.java
@@ -20,6 +20,7 @@ import java.util.List;
 
 import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
 import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
+import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
 import org.apache.cloudstack.api.command.admin.user.ListUsersCmd;
 import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
 import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd;
@@ -44,6 +45,7 @@ import org.apache.cloudstack.api.response.ProjectInvitationResponse;
 import org.apache.cloudstack.api.response.ProjectResponse;
 import org.apache.cloudstack.api.response.ResourceTagResponse;
 import org.apache.cloudstack.api.response.SecurityGroupResponse;
+import org.apache.cloudstack.api.response.StoragePoolResponse;
 import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.api.response.VolumeResponse;
@@ -85,6 +87,8 @@ public interface QueryService {
 
     public ListResponse<VolumeResponse> searchForVolumes(ListVolumesCmd cmd);
 
+    public ListResponse<StoragePoolResponse> searchForStoragePools(ListStoragePoolsCmd cmd);
+
     public ListResponse<AccountResponse> searchForAccounts(ListAccountsCmd cmd);
 
     public ListResponse<AsyncJobResponse>  searchForAsyncJobs(ListAsyncJobsCmd cmd);

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/server/src/com/cloud/api/ApiDBUtils.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java
index 343dad9..5e8a044 100755
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@ -35,6 +35,7 @@ import org.apache.cloudstack.api.response.ProjectInvitationResponse;
 import org.apache.cloudstack.api.response.ProjectResponse;
 import org.apache.cloudstack.api.response.ResourceTagResponse;
 import org.apache.cloudstack.api.response.SecurityGroupResponse;
+import org.apache.cloudstack.api.response.StoragePoolResponse;
 import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.api.response.VolumeResponse;
@@ -49,6 +50,7 @@ import com.cloud.api.query.dao.ProjectInvitationJoinDao;
 import com.cloud.api.query.dao.ProjectJoinDao;
 import com.cloud.api.query.dao.ResourceTagJoinDao;
 import com.cloud.api.query.dao.SecurityGroupJoinDao;
+import com.cloud.api.query.dao.StoragePoolJoinDao;
 import com.cloud.api.query.dao.UserAccountJoinDao;
 import com.cloud.api.query.dao.UserVmJoinDao;
 import com.cloud.api.query.dao.VolumeJoinDao;
@@ -63,6 +65,7 @@ import com.cloud.api.query.vo.ProjectInvitationJoinVO;
 import com.cloud.api.query.vo.ProjectJoinVO;
 import com.cloud.api.query.vo.ResourceTagJoinVO;
 import com.cloud.api.query.vo.SecurityGroupJoinVO;
+import com.cloud.api.query.vo.StoragePoolJoinVO;
 import com.cloud.api.query.vo.UserAccountJoinVO;
 import com.cloud.api.query.vo.UserVmJoinVO;
 import com.cloud.api.query.vo.VolumeJoinVO;
@@ -183,6 +186,7 @@ import com.cloud.storage.Snapshot;
 import com.cloud.storage.SnapshotVO;
 import com.cloud.storage.Storage.ImageFormat;
 import com.cloud.storage.StorageManager;
+import com.cloud.storage.StoragePool;
 import com.cloud.storage.StoragePoolVO;
 import com.cloud.storage.StorageStats;
 import com.cloud.storage.UploadVO;
@@ -324,6 +328,7 @@ public class ApiDBUtils {
     private static ProjectInvitationJoinDao _projectInvitationJoinDao;
     private static HostJoinDao _hostJoinDao;
     private static VolumeJoinDao _volJoinDao;
+    private static StoragePoolJoinDao _poolJoinDao;
     private static AccountJoinDao _accountJoinDao;
     private static AsyncJobJoinDao _jobJoinDao;
 
@@ -414,6 +419,7 @@ public class ApiDBUtils {
         _projectInvitationJoinDao = locator.getDao(ProjectInvitationJoinDao.class);
         _hostJoinDao = locator.getDao(HostJoinDao.class);
         _volJoinDao = locator.getDao(VolumeJoinDao.class);
+        _poolJoinDao = locator.getDao(StoragePoolJoinDao.class);
         _accountJoinDao = locator.getDao(AccountJoinDao.class);
         _jobJoinDao = locator.getDao(AsyncJobJoinDao.class);
 
@@ -1358,6 +1364,19 @@ public class ApiDBUtils {
        return _volJoinDao.newVolumeView(vr);
    }
 
+   public static StoragePoolResponse newStoragePoolResponse(StoragePoolJoinVO vr) {
+       return _poolJoinDao.newStoragePoolResponse(vr);
+   }
+
+   public static StoragePoolResponse fillStoragePoolDetails(StoragePoolResponse vrData, StoragePoolJoinVO vr){
+        return _poolJoinDao.setStoragePoolResponse(vrData, vr);
+   }
+
+   public static List<StoragePoolJoinVO> newStoragePoolView(StoragePool vr){
+       return _poolJoinDao.newStoragePoolView(vr);
+   }
+
+
    public static AccountResponse newAccountResponse(AccountJoinVO ve) {
        return _accountJoinDao.newAccountResponse(ve);
    }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index d5cbb71..37be83e 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -53,6 +53,7 @@ import com.cloud.api.query.vo.ProjectInvitationJoinVO;
 import com.cloud.api.query.vo.ProjectJoinVO;
 import com.cloud.api.query.vo.ResourceTagJoinVO;
 import com.cloud.api.query.vo.SecurityGroupJoinVO;
+import com.cloud.api.query.vo.StoragePoolJoinVO;
 import com.cloud.api.query.vo.UserAccountJoinVO;
 import com.cloud.api.query.vo.UserVmJoinVO;
 import com.cloud.api.query.vo.VolumeJoinVO;
@@ -868,49 +869,12 @@ public class ApiResponseHelper implements ResponseGenerator {
 
     @Override
     public StoragePoolResponse createStoragePoolResponse(StoragePool pool) {
-        StoragePoolResponse poolResponse = new StoragePoolResponse();
-        poolResponse.setId(pool.getUuid());
-        poolResponse.setName(pool.getName());
-        poolResponse.setState(pool.getStatus());
-        poolResponse.setPath(pool.getPath());
-        poolResponse.setIpAddress(pool.getHostAddress());
-        DataCenter zone = ApiDBUtils.findZoneById(pool.getDataCenterId());
-        if ( zone != null ){
-        poolResponse.setZoneId(zone.getUuid());
-        poolResponse.setZoneName(zone.getName());
-        }
-        if (pool.getPoolType() != null) {
-            poolResponse.setType(pool.getPoolType().toString());
-        }
-        if (pool.getPodId() != null) {
-            HostPodVO pod = ApiDBUtils.findPodById(pool.getPodId());
-            if (pod != null) {
-                poolResponse.setPodId(pod.getUuid());
-                poolResponse.setPodName(pod.getName());
-            }
-        }
-        if (pool.getCreated() != null) {
-            poolResponse.setCreated(pool.getCreated());
-        }
+        List<StoragePoolJoinVO> viewPools = ApiDBUtils.newStoragePoolView(pool);
+        List<StoragePoolResponse> listPools = ViewResponseHelper.createStoragePoolResponse(viewPools.toArray(new StoragePoolJoinVO[viewPools.size()]));
+        assert listPools != null && listPools.size() == 1 : "There should be one storage pool returned";
+        return listPools.get(0);
 
-        StorageStats stats = ApiDBUtils.getStoragePoolStatistics(pool.getId());
-        long allocatedSize = ApiDBUtils.getStorageCapacitybyPool(pool.getId(), Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED);
-        poolResponse.setDiskSizeTotal(pool.getCapacityBytes());
-        poolResponse.setDiskSizeAllocated(allocatedSize);
 
-        if (stats != null) {
-            Long used = stats.getByteUsed();
-            poolResponse.setDiskSizeUsed(used);
-        }
-
-        if (pool.getClusterId() != null) {
-            ClusterVO cluster = ApiDBUtils.findClusterById(pool.getClusterId());
-            poolResponse.setClusterId(cluster.getUuid());
-            poolResponse.setClusterName(cluster.getName());
-        }
-        poolResponse.setTags(ApiDBUtils.getStoragePoolTags(pool.getId()));
-        poolResponse.setObjectName("storagepool");
-        return poolResponse;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/server/src/com/cloud/api/ApiServer.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java
index 6209171..e2dc9ce 100755
--- a/server/src/com/cloud/api/ApiServer.java
+++ b/server/src/com/cloud/api/ApiServer.java
@@ -91,6 +91,7 @@ import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
 import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
+import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
 import org.apache.cloudstack.api.command.admin.user.ListUsersCmd;
 import org.apache.cloudstack.api.command.user.project.ListProjectInvitationsCmd;
 import org.apache.cloudstack.api.command.user.project.ListProjectsCmd;
@@ -476,6 +477,7 @@ public class ApiServer implements HttpRequestHandler {
                     && !(cmdObj instanceof ListVolumesCmd)
                     && !(cmdObj instanceof ListUsersCmd)
                     && !(cmdObj instanceof ListAccountsCmd)
+                    && !(cmdObj instanceof ListStoragePoolsCmd)
                     ) {
                 buildAsyncListResponse((BaseListCmd) cmdObj, caller);
             }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/server/src/com/cloud/api/query/QueryManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java
index ceec932..b61f10a 100644
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@ -26,6 +26,7 @@ import javax.naming.ConfigurationException;
 
 import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
 import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
+import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
 import org.apache.cloudstack.api.command.admin.user.ListUsersCmd;
 import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
 import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd;
@@ -50,6 +51,7 @@ import org.apache.cloudstack.api.response.ProjectInvitationResponse;
 import org.apache.cloudstack.api.response.ProjectResponse;
 import org.apache.cloudstack.api.response.ResourceTagResponse;
 import org.apache.cloudstack.api.response.SecurityGroupResponse;
+import org.apache.cloudstack.api.response.StoragePoolResponse;
 import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.api.response.VolumeResponse;
@@ -66,6 +68,7 @@ import com.cloud.api.query.dao.ProjectInvitationJoinDao;
 import com.cloud.api.query.dao.ProjectJoinDao;
 import com.cloud.api.query.dao.ResourceTagJoinDao;
 import com.cloud.api.query.dao.SecurityGroupJoinDao;
+import com.cloud.api.query.dao.StoragePoolJoinDao;
 import com.cloud.api.query.dao.UserAccountJoinDao;
 import com.cloud.api.query.dao.UserVmJoinDao;
 import com.cloud.api.query.dao.VolumeJoinDao;
@@ -80,6 +83,7 @@ import com.cloud.api.query.vo.ProjectInvitationJoinVO;
 import com.cloud.api.query.vo.ProjectJoinVO;
 import com.cloud.api.query.vo.ResourceTagJoinVO;
 import com.cloud.api.query.vo.SecurityGroupJoinVO;
+import com.cloud.api.query.vo.StoragePoolJoinVO;
 import com.cloud.api.query.vo.UserAccountJoinVO;
 import com.cloud.api.query.vo.UserVmJoinVO;
 import com.cloud.api.query.vo.VolumeJoinVO;
@@ -100,6 +104,8 @@ import com.cloud.projects.ProjectManager;
 import com.cloud.projects.dao.ProjectAccountDao;
 import com.cloud.projects.dao.ProjectDao;
 import com.cloud.server.Criteria;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.StoragePoolVO;
 import com.cloud.storage.Volume;
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
@@ -200,6 +206,9 @@ public class QueryManagerImpl implements QueryService, Manager {
     private AsyncJobJoinDao _jobJoinDao;
 
     @Inject
+    private StoragePoolJoinDao _poolJoinDao;
+
+    @Inject
     private HighAvailabilityManager _haMgr;
 
     @Override
@@ -1789,4 +1798,95 @@ public class QueryManagerImpl implements QueryService, Manager {
         return _jobJoinDao.searchAndCount(sc, searchFilter);
     }
 
+    @Override
+    public ListResponse<StoragePoolResponse> searchForStoragePools(ListStoragePoolsCmd cmd) {
+        Pair<List<StoragePoolJoinVO>, Integer> result = searchForStoragePoolsInternal(cmd);
+        ListResponse<StoragePoolResponse> response = new ListResponse<StoragePoolResponse>();
+
+        List<StoragePoolResponse> poolResponses = ViewResponseHelper.createStoragePoolResponse(result.first().toArray(new StoragePoolJoinVO[result.first().size()]));
+        response.setResponses(poolResponses, result.second());
+        return response;
+    }
+
+    public Pair<List<StoragePoolJoinVO>, Integer> searchForStoragePoolsInternal(ListStoragePoolsCmd cmd) {
+
+        Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), cmd.getZoneId());
+        Object id = cmd.getId();
+        Object name = cmd.getStoragePoolName();
+        Object path = cmd.getPath();
+        Object pod = cmd.getPodId();
+        Object cluster = cmd.getClusterId();
+        Object address = cmd.getIpAddress();
+        Object keyword = cmd.getKeyword();
+        Long startIndex = cmd.getStartIndex();
+        Long pageSize = cmd.getPageSizeVal();
+
+
+        Filter searchFilter = new Filter(StoragePoolJoinVO.class, "id", Boolean.TRUE, startIndex, pageSize);
+
+        SearchBuilder<StoragePoolJoinVO> sb = _poolJoinDao.createSearchBuilder();
+        sb.select(null, Func.DISTINCT, sb.entity().getId()); // select distinct ids
+        sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
+        sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
+        sb.and("path", sb.entity().getPath(), SearchCriteria.Op.EQ);
+        sb.and("dataCenterId", sb.entity().getZoneId(), SearchCriteria.Op.EQ);
+        sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ);
+        sb.and("clusterId", sb.entity().getClusterId(), SearchCriteria.Op.EQ);
+        sb.and("hostAddress", sb.entity().getHostAddress(), SearchCriteria.Op.EQ);
+
+
+        SearchCriteria<StoragePoolJoinVO> sc = sb.create();
+
+
+        if (keyword != null) {
+            SearchCriteria<StoragePoolJoinVO> ssc = _poolJoinDao.createSearchCriteria();
+            ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+            ssc.addOr("poolType", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+
+            sc.addAnd("name", SearchCriteria.Op.SC, ssc);
+        }
+
+        if (id != null) {
+            sc.setParameters("id", id);
+        }
+
+        if (name != null) {
+            sc.setParameters("name", SearchCriteria.Op.LIKE, "%" + name + "%");
+        }
+
+        if (path != null) {
+            sc.setParameters("path", SearchCriteria.Op.EQ, path);
+        }
+        if (zoneId != null) {
+            sc.setParameters("dataCenterId", SearchCriteria.Op.EQ, zoneId);
+        }
+        if (pod != null) {
+            sc.setParameters("podId", SearchCriteria.Op.EQ, pod);
+        }
+        if (address != null) {
+            sc.setParameters("hostAddress", SearchCriteria.Op.EQ, address);
+        }
+        if (cluster != null) {
+            sc.setParameters("clusterId", SearchCriteria.Op.EQ, cluster);
+        }
+
+        // search Pool details by ids
+        Pair<List<StoragePoolJoinVO>, Integer> uniquePoolPair = _poolJoinDao.searchAndCount(sc, searchFilter);
+        Integer count = uniquePoolPair.second();
+        if (count.intValue() == 0) {
+            // empty result
+            return uniquePoolPair;
+        }
+        List<StoragePoolJoinVO> uniquePools = uniquePoolPair.first();
+        Long[] vrIds = new Long[uniquePools.size()];
+        int i = 0;
+        for (StoragePoolJoinVO v : uniquePools) {
+            vrIds[i++] = v.getId();
+        }
+        List<StoragePoolJoinVO> vrs = _poolJoinDao.searchByIds(vrIds);
+        return new Pair<List<StoragePoolJoinVO>, Integer>(vrs, count);
+
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/server/src/com/cloud/api/query/ViewResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/ViewResponseHelper.java b/server/src/com/cloud/api/query/ViewResponseHelper.java
index 0849586..39c108e 100644
--- a/server/src/com/cloud/api/query/ViewResponseHelper.java
+++ b/server/src/com/cloud/api/query/ViewResponseHelper.java
@@ -34,6 +34,7 @@ import org.apache.cloudstack.api.response.ProjectInvitationResponse;
 import org.apache.cloudstack.api.response.ProjectResponse;
 import org.apache.cloudstack.api.response.ResourceTagResponse;
 import org.apache.cloudstack.api.response.SecurityGroupResponse;
+import org.apache.cloudstack.api.response.StoragePoolResponse;
 import org.apache.cloudstack.api.response.UserResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.api.response.VolumeResponse;
@@ -51,6 +52,7 @@ import com.cloud.api.query.vo.ProjectInvitationJoinVO;
 import com.cloud.api.query.vo.ProjectJoinVO;
 import com.cloud.api.query.vo.ResourceTagJoinVO;
 import com.cloud.api.query.vo.SecurityGroupJoinVO;
+import com.cloud.api.query.vo.StoragePoolJoinVO;
 import com.cloud.api.query.vo.UserAccountJoinVO;
 import com.cloud.api.query.vo.UserVmJoinVO;
 import com.cloud.api.query.vo.VolumeJoinVO;
@@ -238,6 +240,25 @@ public class ViewResponseHelper {
         return new ArrayList<VolumeResponse>(vrDataList.values());
     }
 
+    public static List<StoragePoolResponse> createStoragePoolResponse(StoragePoolJoinVO... pools) {
+        Hashtable<Long, StoragePoolResponse> vrDataList = new Hashtable<Long, StoragePoolResponse>();
+        // Initialise the vrdatalist with the input data
+        for (StoragePoolJoinVO vr : pools) {
+            StoragePoolResponse vrData = vrDataList.get(vr.getId());
+            if ( vrData == null ){
+                // first time encountering this vm
+                vrData = ApiDBUtils.newStoragePoolResponse(vr);
+            }
+            else{
+                // update tags
+                vrData = ApiDBUtils.fillStoragePoolDetails(vrData, vr);
+            }
+            vrDataList.put(vr.getId(), vrData);
+        }
+        return new ArrayList<StoragePoolResponse>(vrDataList.values());
+    }
+
+
     public static List<AccountResponse> createAccountResponse(AccountJoinVO... accounts) {
         List<AccountResponse> respList = new ArrayList<AccountResponse>();
         for (AccountJoinVO vt : accounts){

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/server/src/com/cloud/api/query/dao/StoragePoolJoinDao.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/dao/StoragePoolJoinDao.java b/server/src/com/cloud/api/query/dao/StoragePoolJoinDao.java
new file mode 100644
index 0000000..bbb0242
--- /dev/null
+++ b/server/src/com/cloud/api/query/dao/StoragePoolJoinDao.java
@@ -0,0 +1,37 @@
+// 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 com.cloud.api.query.dao;
+
+import java.util.List;
+
+import org.apache.cloudstack.api.response.StoragePoolResponse;
+
+import com.cloud.api.query.vo.StoragePoolJoinVO;
+import com.cloud.storage.StoragePool;
+import com.cloud.utils.db.GenericDao;
+
+public interface StoragePoolJoinDao extends GenericDao<StoragePoolJoinVO, Long> {
+
+    StoragePoolResponse newStoragePoolResponse(StoragePoolJoinVO host);
+
+    StoragePoolResponse setStoragePoolResponse(StoragePoolResponse response, StoragePoolJoinVO host);
+
+    List<StoragePoolJoinVO> newStoragePoolView(StoragePool group);
+
+    List<StoragePoolJoinVO> searchByIds(Long... spIds);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java
new file mode 100644
index 0000000..44ed130
--- /dev/null
+++ b/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java
@@ -0,0 +1,185 @@
+// 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 com.cloud.api.query.dao;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.ejb.Local;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.ApiDBUtils;
+import com.cloud.api.query.vo.StoragePoolJoinVO;
+import com.cloud.configuration.dao.ConfigurationDao;
+import org.apache.cloudstack.api.response.StoragePoolResponse;
+
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.StorageStats;
+import com.cloud.utils.component.Inject;
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+
+
+@Local(value={StoragePoolJoinDao.class})
+public class StoragePoolJoinDaoImpl extends GenericDaoBase<StoragePoolJoinVO, Long> implements StoragePoolJoinDao {
+    public static final Logger s_logger = Logger.getLogger(StoragePoolJoinDaoImpl.class);
+
+    @Inject
+    private ConfigurationDao  _configDao;
+
+    private SearchBuilder<StoragePoolJoinVO> spSearch;
+
+    private SearchBuilder<StoragePoolJoinVO> spIdSearch;
+
+
+    protected StoragePoolJoinDaoImpl() {
+
+        spSearch = createSearchBuilder();
+        spSearch.and("idIN", spSearch.entity().getId(), SearchCriteria.Op.IN);
+        spSearch.done();
+
+        spIdSearch = createSearchBuilder();
+        spIdSearch.and("id", spIdSearch.entity().getId(), SearchCriteria.Op.EQ);
+        spIdSearch.done();
+
+        this._count = "select count(distinct id) from storage_pool_view WHERE ";
+    }
+
+
+
+
+
+    @Override
+    public StoragePoolResponse newStoragePoolResponse(StoragePoolJoinVO pool) {
+        StoragePoolResponse poolResponse = new StoragePoolResponse();
+        poolResponse.setId(pool.getUuid());
+        poolResponse.setName(pool.getName());
+        poolResponse.setState(pool.getStatus());
+        poolResponse.setPath(pool.getPath());
+        poolResponse.setIpAddress(pool.getHostAddress());
+        poolResponse.setZoneId(pool.getZoneUuid());
+        poolResponse.setZoneName(pool.getZoneName());
+        if (pool.getPoolType() != null) {
+            poolResponse.setType(pool.getPoolType().toString());
+        }
+        poolResponse.setPodId(pool.getPodUuid());
+        poolResponse.setPodName(pool.getPodName());
+        poolResponse.setCreated(pool.getCreated());
+
+
+        long allocatedSize = pool.getUsedCapacity() +  pool.getReservedCapacity();
+        poolResponse.setDiskSizeTotal(pool.getCapacityBytes());
+        poolResponse.setDiskSizeAllocated(allocatedSize);
+
+        //TODO: StatsCollector does not persist data
+        StorageStats stats = ApiDBUtils.getStoragePoolStatistics(pool.getId());
+        if (stats != null) {
+            Long used = stats.getByteUsed();
+            poolResponse.setDiskSizeUsed(used);
+        }
+
+        poolResponse.setClusterId(pool.getClusterUuid());
+        poolResponse.setClusterName(pool.getClusterName());
+        poolResponse.setTags(pool.getTag());
+
+        // set async job
+        poolResponse.setJobId(pool.getJobUuid());
+        poolResponse.setJobStatus(pool.getJobStatus());
+
+        poolResponse.setObjectName("storagepool");
+        return poolResponse;
+    }
+
+
+
+
+
+    @Override
+    public StoragePoolResponse setStoragePoolResponse(StoragePoolResponse response, StoragePoolJoinVO sp) {
+        String tag = sp.getTag();
+        if (tag != null) {
+            if ( response.getTags() != null && response.getTags().length() > 0){
+                response.setTags(response.getTags() + "," + tag);
+            }
+            else{
+                response.setTags(tag);
+            }
+        }
+        return response;
+    }
+
+
+
+    @Override
+    public List<StoragePoolJoinVO> newStoragePoolView(StoragePool host) {
+        SearchCriteria<StoragePoolJoinVO> sc = spIdSearch.create();
+        sc.setParameters("id", host.getId());
+        return searchIncludingRemoved(sc, null, null, false);
+
+    }
+
+
+
+    @Override
+    public List<StoragePoolJoinVO> searchByIds(Long... spIds) {
+        // set detail batch query size
+        int DETAILS_BATCH_SIZE = 2000;
+        String batchCfg = _configDao.getValue("detail.batch.query.size");
+        if ( batchCfg != null ){
+            DETAILS_BATCH_SIZE = Integer.parseInt(batchCfg);
+        }
+        // query details by batches
+        List<StoragePoolJoinVO> uvList = new ArrayList<StoragePoolJoinVO>();
+        // query details by batches
+        int curr_index = 0;
+        if ( spIds.length > DETAILS_BATCH_SIZE ){
+            while ( (curr_index + DETAILS_BATCH_SIZE ) <= spIds.length ) {
+                Long[] ids = new Long[DETAILS_BATCH_SIZE];
+                for (int k = 0, j = curr_index; j < curr_index + DETAILS_BATCH_SIZE; j++, k++) {
+                    ids[k] = spIds[j];
+                }
+                SearchCriteria<StoragePoolJoinVO> sc = spSearch.create();
+                sc.setParameters("idIN", ids);
+                List<StoragePoolJoinVO> vms = searchIncludingRemoved(sc, null, null, false);
+                if (vms != null) {
+                    uvList.addAll(vms);
+                }
+                curr_index += DETAILS_BATCH_SIZE;
+            }
+        }
+        if (curr_index < spIds.length) {
+            int batch_size = (spIds.length - curr_index);
+            // set the ids value
+            Long[] ids = new Long[batch_size];
+            for (int k = 0, j = curr_index; j < curr_index + batch_size; j++, k++) {
+                ids[k] = spIds[j];
+            }
+            SearchCriteria<StoragePoolJoinVO> sc = spSearch.create();
+            sc.setParameters("idIN", ids);
+            List<StoragePoolJoinVO> vms = searchIncludingRemoved(sc, null, null, false);
+            if (vms != null) {
+                uvList.addAll(vms);
+            }
+        }
+        return uvList;
+    }
+
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/server/src/com/cloud/api/query/vo/BaseViewVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/vo/BaseViewVO.java b/server/src/com/cloud/api/query/vo/BaseViewVO.java
index 604f459..6b1ddd6 100644
--- a/server/src/com/cloud/api/query/vo/BaseViewVO.java
+++ b/server/src/com/cloud/api/query/vo/BaseViewVO.java
@@ -16,8 +16,6 @@
 // under the License.
 package com.cloud.api.query.vo;
 
-import javax.persistence.Column;
-
 public abstract class BaseViewVO {
 
     public abstract long getId();

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/server/src/com/cloud/api/query/vo/StoragePoolJoinVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/query/vo/StoragePoolJoinVO.java b/server/src/com/cloud/api/query/vo/StoragePoolJoinVO.java
new file mode 100644
index 0000000..fd837bd
--- /dev/null
+++ b/server/src/com/cloud/api/query/vo/StoragePoolJoinVO.java
@@ -0,0 +1,341 @@
+// 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 com.cloud.api.query.vo;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import com.cloud.org.Cluster;
+import com.cloud.storage.StoragePoolStatus;
+import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.utils.db.GenericDao;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+/**
+ * Storage Pool DB view.
+ * @author minc
+ *
+ */
+@Entity
+@Table(name="storage_pool_view")
+public class StoragePoolJoinVO extends BaseViewVO implements InternalIdentity, Identity {
+
+    @Id
+    @Column(name="id")
+    private long id;
+
+    @Column(name="uuid")
+    private String uuid;
+
+    @Column(name="name")
+    private String name;
+
+    @Column(name="path")
+    private String path;
+
+    @Column(name="host_address")
+    private String hostAddress;
+
+
+    @Column(name="status")
+    @Enumerated(value=EnumType.STRING)
+    private StoragePoolStatus status;
+
+    @Column(name="pool_type")
+    @Enumerated(value=EnumType.STRING)
+    private StoragePoolType poolType;
+
+    @Column(name=GenericDao.CREATED_COLUMN)
+    private Date created;
+
+    @Column(name=GenericDao.REMOVED_COLUMN)
+    private Date removed;
+
+    @Column(name="capacity_bytes")
+    private long capacityBytes;
+
+    @Column(name="cluster_id")
+    private long clusterId;
+
+    @Column(name="cluster_uuid")
+    private String clusterUuid;
+
+    @Column(name="cluster_name")
+    private String clusterName;
+
+    @Column(name="cluster_type")
+    @Enumerated(value=EnumType.STRING)
+    private Cluster.ClusterType clusterType;
+
+    @Column(name="data_center_id")
+    private long zoneId;
+
+    @Column(name="data_center_uuid")
+    private String zoneUuid;
+
+    @Column(name="data_center_name")
+    private String zoneName;
+
+    @Column(name="pod_id")
+    private long podId;
+
+    @Column(name="pod_uuid")
+    private String podUuid;
+
+    @Column(name="pod_name")
+    private String podName;
+
+
+    @Column(name="tag")
+    private String tag;
+
+    @Column(name="disk_used_capacity")
+    private long usedCapacity;
+
+    @Column(name="disk_reserved_capacity")
+    private long reservedCapacity;
+
+
+    @Column(name="job_id")
+    private long jobId;
+
+    @Column(name="job_uuid")
+    private String jobUuid;
+
+    @Column(name="job_status")
+    private int jobStatus;
+
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    @Override
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    @Override
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public String getHostAddress() {
+        return hostAddress;
+    }
+
+    public void setHostAddress(String hostAddress) {
+        this.hostAddress = hostAddress;
+    }
+
+    public StoragePoolStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(StoragePoolStatus status) {
+        this.status = status;
+    }
+
+    public StoragePoolType getPoolType() {
+        return poolType;
+    }
+
+    public void setPoolType(StoragePoolType poolType) {
+        this.poolType = poolType;
+    }
+
+    public Date getCreated() {
+        return created;
+    }
+
+    public void setCreated(Date created) {
+        this.created = created;
+    }
+
+    public Date getRemoved() {
+        return removed;
+    }
+
+    public void setRemoved(Date removed) {
+        this.removed = removed;
+    }
+
+    public long getCapacityBytes() {
+        return capacityBytes;
+    }
+
+    public void setCapacityBytes(long capacityBytes) {
+        this.capacityBytes = capacityBytes;
+    }
+
+    public long getClusterId() {
+        return clusterId;
+    }
+
+    public void setClusterId(long clusterId) {
+        this.clusterId = clusterId;
+    }
+
+    public String getClusterUuid() {
+        return clusterUuid;
+    }
+
+    public void setClusterUuid(String clusterUuid) {
+        this.clusterUuid = clusterUuid;
+    }
+
+    public String getClusterName() {
+        return clusterName;
+    }
+
+    public void setClusterName(String clusterName) {
+        this.clusterName = clusterName;
+    }
+
+    public Cluster.ClusterType getClusterType() {
+        return clusterType;
+    }
+
+    public void setClusterType(Cluster.ClusterType clusterType) {
+        this.clusterType = clusterType;
+    }
+
+    public long getZoneId() {
+        return zoneId;
+    }
+
+    public void setZoneId(long zoneId) {
+        this.zoneId = zoneId;
+    }
+
+    public String getZoneUuid() {
+        return zoneUuid;
+    }
+
+    public void setZoneUuid(String zoneUuid) {
+        this.zoneUuid = zoneUuid;
+    }
+
+    public String getZoneName() {
+        return zoneName;
+    }
+
+    public void setZoneName(String zoneName) {
+        this.zoneName = zoneName;
+    }
+
+    public long getPodId() {
+        return podId;
+    }
+
+    public void setPodId(long podId) {
+        this.podId = podId;
+    }
+
+    public String getPodUuid() {
+        return podUuid;
+    }
+
+    public void setPodUuid(String podUuid) {
+        this.podUuid = podUuid;
+    }
+
+    public String getPodName() {
+        return podName;
+    }
+
+    public void setPodName(String podName) {
+        this.podName = podName;
+    }
+
+    public String getTag() {
+        return tag;
+    }
+
+    public void setTag(String tag) {
+        this.tag = tag;
+    }
+
+    public long getUsedCapacity() {
+        return usedCapacity;
+    }
+
+    public void setUsedCapacity(long usedCapacity) {
+        this.usedCapacity = usedCapacity;
+    }
+
+    public long getReservedCapacity() {
+        return reservedCapacity;
+    }
+
+    public void setReservedCapacity(long reservedCapacity) {
+        this.reservedCapacity = reservedCapacity;
+    }
+
+    public long getJobId() {
+        return jobId;
+    }
+
+    public void setJobId(long jobId) {
+        this.jobId = jobId;
+    }
+
+    public String getJobUuid() {
+        return jobUuid;
+    }
+
+    public void setJobUuid(String jobUuid) {
+        this.jobUuid = jobUuid;
+    }
+
+    public int getJobStatus() {
+        return jobStatus;
+    }
+
+    public void setJobStatus(int jobStatus) {
+        this.jobStatus = jobStatus;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/server/src/com/cloud/configuration/DefaultComponentLibrary.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java
index 8d8ee9a..8c6d35f 100755
--- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java
+++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java
@@ -34,6 +34,7 @@ import com.cloud.api.query.dao.ProjectInvitationJoinDaoImpl;
 import com.cloud.api.query.dao.ProjectJoinDaoImpl;
 import com.cloud.api.query.dao.ResourceTagJoinDaoImpl;
 import com.cloud.api.query.dao.SecurityGroupJoinDaoImpl;
+import com.cloud.api.query.dao.StoragePoolJoinDaoImpl;
 import com.cloud.api.query.dao.UserAccountJoinDaoImpl;
 import com.cloud.api.query.dao.UserVmJoinDaoImpl;
 import com.cloud.api.query.dao.HostJoinDaoImpl;
@@ -388,6 +389,7 @@ public class DefaultComponentLibrary extends ComponentLibraryBase implements Com
         addDao("VolumeJoinDao", VolumeJoinDaoImpl.class);
         addDao("AccountJoinDao", AccountJoinDaoImpl.class);
         addDao("AsyncJobJoinDao", AsyncJobJoinDaoImpl.class);
+        addDao("StoragePoolJoinDao", StoragePoolJoinDaoImpl.class);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index 22ae179..dcecaf4 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -2335,23 +2335,6 @@ public class ManagementServerImpl implements ManagementServer {
         }
     }
 
-    @Override
-    public Pair<List<? extends StoragePool>, Integer> searchForStoragePools(ListStoragePoolsCmd cmd) {
-
-        Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), cmd.getZoneId());
-        Criteria c = new Criteria("id", Boolean.TRUE, cmd.getStartIndex(), cmd.getPageSizeVal());
-        c.addCriteria(Criteria.ID, cmd.getId());
-        c.addCriteria(Criteria.NAME, cmd.getStoragePoolName());
-        c.addCriteria(Criteria.CLUSTERID, cmd.getClusterId());
-        c.addCriteria(Criteria.ADDRESS, cmd.getIpAddress());
-        c.addCriteria(Criteria.KEYWORD, cmd.getKeyword());
-        c.addCriteria(Criteria.PATH, cmd.getPath());
-        c.addCriteria(Criteria.PODID, cmd.getPodId());
-        c.addCriteria(Criteria.DATACENTERID, zoneId);
-
-        Pair<List<StoragePoolVO>, Integer> result = searchForStoragePools(c);
-        return new Pair<List<? extends StoragePool>, Integer>(result.first(), result.second());
-    }
 
     @Override
     public Pair<List<StoragePoolVO>, Integer> searchForStoragePools(Criteria c) {

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/server/test/com/cloud/api/ListPerfTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/api/ListPerfTest.java b/server/test/com/cloud/api/ListPerfTest.java
index 7402cea..eb98d91 100644
--- a/server/test/com/cloud/api/ListPerfTest.java
+++ b/server/test/com/cloud/api/ListPerfTest.java
@@ -148,4 +148,21 @@ public class ListPerfTest extends APITest {
         System.out.println("Time taken to list Users: " + (after - before) + " ms");
 
     }
+
+    @Test
+    public void testListStoragePools(){
+        // issue list Storage pool calls
+        HashMap<String, String> params = new HashMap<String, String>();
+        params.put("response", "json");
+        params.put("listAll", "true");
+        params.put("sessionkey", sessionKey);
+        long before = System.currentTimeMillis();
+        String result = this.sendRequest("listStoragePools", params);
+        long after = System.currentTimeMillis();
+        System.out.println("Time taken to list StoragePools: " + (after - before) + " ms");
+
+    }
+
+
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/setup/db/create-schema-view.sql
----------------------------------------------------------------------
diff --git a/setup/db/create-schema-view.sql b/setup/db/create-schema-view.sql
index f502c88..bf04c1c 100755
--- a/setup/db/create-schema-view.sql
+++ b/setup/db/create-schema-view.sql
@@ -782,3 +782,40 @@ left join autoscale_policies on async_job.instance_id = autoscale_policies.id
 left join autoscale_vmprofiles on async_job.instance_id = autoscale_vmprofiles.id
 left join autoscale_vmgroups on async_job.instance_id = autoscale_vmgroups.id;
 
+DROP VIEW IF EXISTS `cloud`.`storage_pool_view`;
+CREATE VIEW storage_pool_view AS
+select 
+storage_pool.id,
+storage_pool.uuid,
+storage_pool.name,
+storage_pool.status,
+storage_pool.path,
+storage_pool.pool_type,
+storage_pool.host_address,
+storage_pool.created,
+storage_pool.removed,
+storage_pool.capacity_bytes,
+cluster.id cluster_id,
+cluster.uuid cluster_uuid,
+cluster.name cluster_name,
+cluster.cluster_type,
+data_center.id data_center_id, 
+data_center.uuid data_center_uuid,
+data_center.name data_center_name, 
+host_pod_ref.id pod_id, 
+host_pod_ref.uuid pod_uuid,
+host_pod_ref.name pod_name,
+storage_pool_details.name tag,
+op_host_capacity.used_capacity disk_used_capacity,
+op_host_capacity.reserved_capacity disk_reserved_capacity,
+async_job.id job_id,
+async_job.uuid job_uuid,
+async_job.job_status job_status,
+async_job.account_id job_account_id
+from storage_pool 
+left join cluster on storage_pool.cluster_id = cluster.id
+left join data_center on storage_pool.data_center_id = data_center.id
+left join host_pod_ref on storage_pool.pod_id = host_pod_ref.id
+left join storage_pool_details on storage_pool_details.pool_id = storage_pool.id and storage_pool_details.value = 'true'
+left join op_host_capacity on storage_pool.id = op_host_capacity.host_id and op_host_capacity.capacity_type = 3
+left join async_job on async_job.instance_id = storage_pool.id and async_job.instance_type = "StoragePool" and async_job.job_status = 0;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/74c15a22/setup/db/db/schema-40to410.sql
----------------------------------------------------------------------
diff --git a/setup/db/db/schema-40to410.sql b/setup/db/db/schema-40to410.sql
index 1142320..bf3fb30 100644
--- a/setup/db/db/schema-40to410.sql
+++ b/setup/db/db/schema-40to410.sql
@@ -143,6 +143,8 @@ UPDATE `cloud`.`conditions` set uuid=id WHERE uuid is NULL;
 INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', '"detail.batch.query.size"', '2000', 'Default entity detail batch query size for listing');
 
 --- DB views for list api ---
+use cloud;
+
 DROP VIEW IF EXISTS `cloud`.`user_vm_view`;
 CREATE VIEW `cloud`.`user_vm_view` AS
 select
@@ -905,3 +907,41 @@ left join conditions on async_job.instance_id = conditions.id
 left join autoscale_policies on async_job.instance_id = autoscale_policies.id
 left join autoscale_vmprofiles on async_job.instance_id = autoscale_vmprofiles.id
 left join autoscale_vmgroups on async_job.instance_id = autoscale_vmgroups.id;
+
+DROP VIEW IF EXISTS `cloud`.`storage_pool_view`;
+CREATE VIEW storage_pool_view AS
+select 
+storage_pool.id,
+storage_pool.uuid,
+storage_pool.name,
+storage_pool.status,
+storage_pool.path,
+storage_pool.pool_type,
+storage_pool.host_address,
+storage_pool.created,
+storage_pool.removed,
+storage_pool.capacity_bytes,
+cluster.id cluster_id,
+cluster.uuid cluster_uuid,
+cluster.name cluster_name,
+cluster.cluster_type,
+data_center.id data_center_id, 
+data_center.uuid data_center_uuid,
+data_center.name data_center_name, 
+host_pod_ref.id pod_id, 
+host_pod_ref.uuid pod_uuid,
+host_pod_ref.name pod_name,
+storage_pool_details.name tag,
+op_host_capacity.used_capacity disk_used_capacity,
+op_host_capacity.reserved_capacity disk_reserved_capacity,
+async_job.id job_id,
+async_job.uuid job_uuid,
+async_job.job_status job_status,
+async_job.account_id job_account_id
+from storage_pool 
+left join cluster on storage_pool.cluster_id = cluster.id
+left join data_center on storage_pool.data_center_id = data_center.id
+left join host_pod_ref on storage_pool.pod_id = host_pod_ref.id
+left join storage_pool_details on storage_pool_details.pool_id = storage_pool.id and storage_pool_details.value = 'true'
+left join op_host_capacity on storage_pool.id = op_host_capacity.host_id and op_host_capacity.capacity_type = 3
+left join async_job on async_job.instance_id = storage_pool.id and async_job.instance_type = "StoragePool" and async_job.job_status = 0;