Updated Branches:
  refs/heads/object_store a872d6d30 -> 848fea606

Add ListImageStoresCmd api.

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

Branch: refs/heads/object_store
Commit: 848fea6069823d6dab43d2eb70ba636031404a0f
Parents: a872d6d
Author: Min Chen <[email protected]>
Authored: Mon Apr 8 11:36:53 2013 -0700
Committer: Min Chen <[email protected]>
Committed: Mon Apr 8 11:36:53 2013 -0700

----------------------------------------------------------------------
 .../command/admin/storage/ListImageStoresCmd.java  |  111 +++++++++++++++
 .../org/apache/cloudstack/query/QueryService.java  |    4 +
 client/tomcatconf/commands.properties.in           |    4 +
 server/src/com/cloud/api/ApiResponseHelper.java    |    2 +-
 .../src/com/cloud/api/query/QueryManagerImpl.java  |  108 ++++++++++++++-
 .../com/cloud/api/query/ViewResponseHelper.java    |    2 +-
 6 files changed, 227 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/848fea60/api/src/org/apache/cloudstack/api/command/admin/storage/ListImageStoresCmd.java
----------------------------------------------------------------------
diff --git 
a/api/src/org/apache/cloudstack/api/command/admin/storage/ListImageStoresCmd.java
 
b/api/src/org/apache/cloudstack/api/command/admin/storage/ListImageStoresCmd.java
new file mode 100644
index 0000000..4dbe900
--- /dev/null
+++ 
b/api/src/org/apache/cloudstack/api/command/admin/storage/ListImageStoresCmd.java
@@ -0,0 +1,111 @@
+// 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.api.command.admin.storage;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseListCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.response.ClusterResponse;
+import org.apache.cloudstack.api.response.ImageStoreResponse;
+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.ZoneResponse;
+import org.apache.log4j.Logger;
+
+import com.cloud.async.AsyncJob;
+
+@APICommand(name = "listImageStores", description="Lists image stores.", 
responseObject=ImageStoreResponse.class)
+public class ListImageStoresCmd extends BaseListCmd {
+    public static final Logger s_logger = 
Logger.getLogger(ListImageStoresCmd.class.getName());
+
+    private static final String s_name = "listimagestoreresponse";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name=ApiConstants.NAME, type=CommandType.STRING, 
description="the name of the image store")
+    private String storeName;
+
+    @Parameter(name=ApiConstants.STATE, type=CommandType.STRING, 
description="the image store state")
+    private String state;
+
+    @Parameter(name=ApiConstants.PROTOCOL, type=CommandType.STRING, 
description="the image store protocol")
+    private String protocol;
+
+    @Parameter(name=ApiConstants.PROVIDER, type=CommandType.STRING, 
description="the image store provider")
+    private String provider;
+
+    @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType = 
ZoneResponse.class,
+            description="the Zone ID for the image store")
+    private Long zoneId;
+
+    @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = 
StoragePoolResponse.class,
+            description="the ID of the storage pool")
+    private Long id;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+
+
+    public Long getZoneId() {
+        return zoneId;
+    }
+
+    public String getStoreName() {
+        return storeName;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public String getProtocol() {
+        return protocol;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public String getProvider() {
+        return provider;
+    }
+
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+
+    @Override
+    public void execute(){
+        ListResponse<ImageStoreResponse> response = 
_queryService.searchForImageStores(this);
+        response.setResponseName(getCommandName());
+        this.setResponseObject(response);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/848fea60/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 c3f86aa..66f6399 100644
--- a/api/src/org/apache/cloudstack/query/QueryService.java
+++ b/api/src/org/apache/cloudstack/query/QueryService.java
@@ -18,6 +18,7 @@ package org.apache.cloudstack.query;
 
 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.ListImageStoresCmd;
 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;
@@ -40,6 +41,7 @@ import 
org.apache.cloudstack.api.response.DiskOfferingResponse;
 import org.apache.cloudstack.api.response.DomainRouterResponse;
 import org.apache.cloudstack.api.response.EventResponse;
 import org.apache.cloudstack.api.response.HostResponse;
+import org.apache.cloudstack.api.response.ImageStoreResponse;
 import org.apache.cloudstack.api.response.InstanceGroupResponse;
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.api.response.ProjectAccountResponse;
@@ -88,6 +90,8 @@ public interface QueryService {
 
     public ListResponse<StoragePoolResponse> 
searchForStoragePools(ListStoragePoolsCmd cmd);
 
+    public ListResponse<ImageStoreResponse> 
searchForImageStores(ListImageStoresCmd cmd);
+
     public ListResponse<AccountResponse> searchForAccounts(ListAccountsCmd 
cmd);
 
     public ListResponse<AsyncJobResponse>  searchForAsyncJobs(ListAsyncJobsCmd 
cmd);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/848fea60/client/tomcatconf/commands.properties.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/commands.properties.in 
b/client/tomcatconf/commands.properties.in
index ad17c15..d282849 100644
--- a/client/tomcatconf/commands.properties.in
+++ b/client/tomcatconf/commands.properties.in
@@ -243,6 +243,10 @@ listS3s=1
 
 #### image store commands
 addImageStore=1
+listImageStores=1
+deleteImageStore=1
+enableImageStore=1
+
 
 #### host commands
 addHost=3

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/848fea60/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 5272045..e9255c4 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -894,7 +894,7 @@ public class ApiResponseHelper implements ResponseGenerator 
{
     @Override
     public ImageStoreResponse createImageStoreResponse(ImageStore os) {
         List<ImageStoreJoinVO> viewStores = ApiDBUtils.newImageStoreView(os);
-        List<ImageStoreResponse> listStores = 
ViewResponseHelper.createObjectStoreResponse(viewStores.toArray(new 
ImageStoreJoinVO[viewStores.size()]));
+        List<ImageStoreResponse> listStores = 
ViewResponseHelper.createImageStoreResponse(viewStores.toArray(new 
ImageStoreJoinVO[viewStores.size()]));
         assert listStores != null && listStores.size() == 1 : "There should be 
one image data store returned";
         return listStores.get(0);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/848fea60/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 951d09e..daf49cb 100644
--- a/server/src/com/cloud/api/query/QueryManagerImpl.java
+++ b/server/src/com/cloud/api/query/QueryManagerImpl.java
@@ -29,6 +29,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.ListImageStoresCmd;
 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;
@@ -51,6 +52,7 @@ import 
org.apache.cloudstack.api.response.DiskOfferingResponse;
 import org.apache.cloudstack.api.response.DomainRouterResponse;
 import org.apache.cloudstack.api.response.EventResponse;
 import org.apache.cloudstack.api.response.HostResponse;
+import org.apache.cloudstack.api.response.ImageStoreResponse;
 import org.apache.cloudstack.api.response.InstanceGroupResponse;
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.api.response.ProjectAccountResponse;
@@ -74,6 +76,7 @@ import com.cloud.api.query.dao.DataCenterJoinDao;
 import com.cloud.api.query.dao.DiskOfferingJoinDao;
 import com.cloud.api.query.dao.DomainRouterJoinDao;
 import com.cloud.api.query.dao.HostJoinDao;
+import com.cloud.api.query.dao.ImageStoreJoinDao;
 import com.cloud.api.query.dao.InstanceGroupJoinDao;
 import com.cloud.api.query.dao.ProjectAccountJoinDao;
 import com.cloud.api.query.dao.ProjectInvitationJoinDao;
@@ -92,6 +95,7 @@ import com.cloud.api.query.vo.DiskOfferingJoinVO;
 import com.cloud.api.query.vo.DomainRouterJoinVO;
 import com.cloud.api.query.vo.EventJoinVO;
 import com.cloud.api.query.vo.HostJoinVO;
+import com.cloud.api.query.vo.ImageStoreJoinVO;
 import com.cloud.api.query.vo.InstanceGroupJoinVO;
 import com.cloud.api.query.vo.ProjectAccountJoinVO;
 import com.cloud.api.query.vo.ProjectInvitationJoinVO;
@@ -126,6 +130,8 @@ import com.cloud.projects.dao.ProjectDao;
 import com.cloud.server.Criteria;
 import com.cloud.service.ServiceOfferingVO;
 import com.cloud.service.dao.ServiceOfferingDao;
+import com.cloud.storage.ImageStore;
+import com.cloud.storage.ScopeType;
 import com.cloud.storage.Volume;
 import com.cloud.user.Account;
 import com.cloud.user.AccountManager;
@@ -229,6 +235,9 @@ public class QueryManagerImpl extends ManagerBase 
implements QueryService {
     private StoragePoolJoinDao _poolJoinDao;
 
     @Inject
+    private ImageStoreJoinDao _imageStoreJoinDao;
+
+    @Inject
     private DiskOfferingJoinDao _diskOfferingJoinDao;
 
     @Inject
@@ -1843,7 +1852,7 @@ public class QueryManagerImpl extends ManagerBase 
implements QueryService {
         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("name", sb.entity().getName(), SearchCriteria.Op.EQ);
         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);
@@ -1867,7 +1876,7 @@ public class QueryManagerImpl extends ManagerBase 
implements QueryService {
         }
 
         if (name != null) {
-            sc.setParameters("name", "%" + name + "%");
+            sc.setParameters("name", name);
         }
 
         if (path != null) {
@@ -1904,6 +1913,101 @@ public class QueryManagerImpl extends ManagerBase 
implements QueryService {
 
     }
 
+
+    @Override
+    public ListResponse<ImageStoreResponse> 
searchForImageStores(ListImageStoresCmd cmd) {
+        Pair<List<ImageStoreJoinVO>, Integer> result = 
searchForImageStoresInternal(cmd);
+        ListResponse<ImageStoreResponse> response = new 
ListResponse<ImageStoreResponse>();
+
+        List<ImageStoreResponse> poolResponses = 
ViewResponseHelper.createImageStoreResponse(result.first().toArray(new 
ImageStoreJoinVO[result.first().size()]));
+        response.setResponses(poolResponses, result.second());
+        return response;
+    }
+
+    private Pair<List<ImageStoreJoinVO>, Integer> 
searchForImageStoresInternal(ListImageStoresCmd cmd) {
+
+        Long zoneId = 
_accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), 
cmd.getZoneId());
+        Object id = cmd.getId();
+        Object name = cmd.getStoreName();
+        String provider = cmd.getProvider();
+        String protocol = cmd.getProtocol();
+        ImageStore.State state = null;
+        String stateStr = cmd.getState();
+        if (stateStr != null) {
+            try {
+                state = Enum.valueOf(ImageStore.State.class, 
stateStr.toUpperCase());
+            } catch (Exception e) {
+                throw new InvalidParameterValueException("invalid state" + 
stateStr);
+            }
+        }
+        Object keyword = cmd.getKeyword();
+        Long startIndex = cmd.getStartIndex();
+        Long pageSize = cmd.getPageSizeVal();
+
+
+        Filter searchFilter = new Filter(ImageStoreJoinVO.class, "id", 
Boolean.TRUE, startIndex, pageSize);
+
+        SearchBuilder<ImageStoreJoinVO> sb = 
_imageStoreJoinDao.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.EQ);
+        sb.and("dataCenterId", sb.entity().getZoneId(), SearchCriteria.Op.EQ);
+        sb.and("protocol", sb.entity().getProtocol(), SearchCriteria.Op.EQ);
+        sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ);
+        sb.and("provider", sb.entity().getProviderName(), 
SearchCriteria.Op.EQ);
+
+
+        SearchCriteria<ImageStoreJoinVO> sc = sb.create();
+
+
+        if (keyword != null) {
+            SearchCriteria<ImageStoreJoinVO> ssc = 
_imageStoreJoinDao.createSearchCriteria();
+            ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
+            ssc.addOr("provider", SearchCriteria.Op.LIKE, "%" + keyword + "%" 
);
+            sc.addAnd("name", SearchCriteria.Op.SC, ssc);
+        }
+
+        if (id != null) {
+            sc.setParameters("id", id);
+        }
+
+        if (name != null) {
+            sc.setParameters("name", name);
+        }
+
+
+        if (zoneId != null) {
+            sc.setParameters("dataCenterId", zoneId);
+        }
+        if (provider != null) {
+            sc.setParameters("provider", provider);
+        }
+        if (state != null) {
+            sc.setParameters("state", state);
+        }
+        if (protocol != null) {
+            sc.setParameters("protocol", protocol);
+        }
+
+        // search Store details by ids
+        Pair<List<ImageStoreJoinVO>, Integer> uniqueStorePair = 
_imageStoreJoinDao.searchAndCount(sc, searchFilter);
+        Integer count = uniqueStorePair.second();
+        if (count.intValue() == 0) {
+            // empty result
+            return uniqueStorePair;
+        }
+        List<ImageStoreJoinVO> uniqueStores = uniqueStorePair.first();
+        Long[] vrIds = new Long[uniqueStores.size()];
+        int i = 0;
+        for (ImageStoreJoinVO v : uniqueStores) {
+            vrIds[i++] = v.getId();
+        }
+        List<ImageStoreJoinVO> vrs = _imageStoreJoinDao.searchByIds(vrIds);
+        return new Pair<List<ImageStoreJoinVO>, Integer>(vrs, count);
+
+    }
+
+
     @Override
     public ListResponse<DiskOfferingResponse> 
searchForDiskOfferings(ListDiskOfferingsCmd cmd) {
         Pair<List<DiskOfferingJoinVO>, Integer> result = 
searchForDiskOfferingsInternal(cmd);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/848fea60/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 90b900c..5b3c934 100644
--- a/server/src/com/cloud/api/query/ViewResponseHelper.java
+++ b/server/src/com/cloud/api/query/ViewResponseHelper.java
@@ -265,7 +265,7 @@ public class ViewResponseHelper {
         return new ArrayList<StoragePoolResponse>(vrDataList.values());
     }
 
-    public static List<ImageStoreResponse> 
createObjectStoreResponse(ImageStoreJoinVO... stores) {
+    public static List<ImageStoreResponse> 
createImageStoreResponse(ImageStoreJoinVO... stores) {
         Hashtable<Long, ImageStoreResponse> vrDataList = new Hashtable<Long, 
ImageStoreResponse>();
         // Initialise the vrdatalist with the input data
         for (ImageStoreJoinVO vr : stores) {

Reply via email to