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) {
