Repository: cloudstack Updated Branches: refs/heads/master 2e9cc58af -> 667c8e790
CLOUDSTACK-6699: listResouceDetails - enhance it to list by (key,value) pair - allowed to Admin only. Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/667c8e79 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/667c8e79 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/667c8e79 Branch: refs/heads/master Commit: 667c8e7905a9c7b5c261969c55b71066125740eb Parents: 2e9cc58 Author: Nitin Mehta <nitin.me...@citrix.com> Authored: Sun May 18 23:20:12 2014 -0700 Committer: Nitin Mehta <nitin.me...@citrix.com> Committed: Sun May 18 23:21:37 2014 -0700 ---------------------------------------------------------------------- .../cloud/server/ResourceMetaDataService.java | 10 ++++++++ .../user/volume/ListResourceDetailsCmd.java | 8 +++++++ .../resourcedetail/ResourceDetailsDao.java | 9 +++++++ .../resourcedetail/ResourceDetailsDaoBase.java | 20 ++++++++++++++++ .../com/cloud/api/query/QueryManagerImpl.java | 25 ++++++++++++++++---- .../metadata/ResourceMetaDataManagerImpl.java | 10 ++++++++ 6 files changed, 78 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/667c8e79/api/src/com/cloud/server/ResourceMetaDataService.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/server/ResourceMetaDataService.java b/api/src/com/cloud/server/ResourceMetaDataService.java index 56fe104..113dc07 100644 --- a/api/src/com/cloud/server/ResourceMetaDataService.java +++ b/api/src/com/cloud/server/ResourceMetaDataService.java @@ -46,6 +46,16 @@ public interface ResourceMetaDataService { ResourceDetail getDetail(long resourceId, ResourceObjectType resourceType, String key); + /** + * List by key, value pair + * @param resourceType + * @param key + * @param value + * @param forDisplay + * @return + */ + List<? extends ResourceDetail> getDetails(ResourceObjectType resourceType, String key, String value, Boolean forDisplay); + Map<String, String> getDetailsMap(long resourceId, ResourceObjectType resourceType, Boolean forDisplay); List<? extends ResourceDetail> getDetailsList(long resourceId, ResourceObjectType resourceType, Boolean forDisplay); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/667c8e79/api/src/org/apache/cloudstack/api/command/user/volume/ListResourceDetailsCmd.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/ListResourceDetailsCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/ListResourceDetailsCmd.java index afbfb99..83cb1ff 100644 --- a/api/src/org/apache/cloudstack/api/command/user/volume/ListResourceDetailsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/volume/ListResourceDetailsCmd.java @@ -44,6 +44,10 @@ public class ListResourceDetailsCmd extends BaseListProjectAndAccountResourcesCm @Parameter(name = ApiConstants.KEY, type = CommandType.STRING, description = "list by key") private String key; + @Parameter(name = ApiConstants.VALUE, type = CommandType.STRING, description = "list by key, value. Needs to be passed only along with key" , + since = "4.4", authorized = { RoleType.Admin }) + private String value; + @Parameter(name = ApiConstants.FOR_DISPLAY, type = CommandType.BOOLEAN, description = "if set to true, only details marked with display=true, are returned." + " False by default", since = "4.3", authorized = { RoleType.Admin }) private Boolean forDisplay; @@ -56,6 +60,10 @@ public class ListResourceDetailsCmd extends BaseListProjectAndAccountResourcesCm return key; } + public String getValue() { + return value; + } + @Override public String getCommandName() { return s_name; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/667c8e79/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDao.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDao.java b/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDao.java index 5002683..5d2d919 100644 --- a/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDao.java +++ b/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDao.java @@ -33,6 +33,15 @@ public interface ResourceDetailsDao<R extends ResourceDetail> extends GenericDao public R findDetail(long resourceId, String name); /** + * Find details by key,value pair + * @param key + * @param value + * @param display + * @return + */ + public List<R> findDetails(String key, String value, Boolean display); + + /** * Removes all details for the resource specified * @param resourceId */ http://git-wip-us.apache.org/repos/asf/cloudstack/blob/667c8e79/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDaoBase.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDaoBase.java b/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDaoBase.java index 60d7f16..b3e7ea2 100644 --- a/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDaoBase.java +++ b/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDaoBase.java @@ -34,6 +34,7 @@ public abstract class ResourceDetailsDaoBase<R extends ResourceDetail> extends G AllFieldsSearch = createSearchBuilder(); AllFieldsSearch.and("resourceId", AllFieldsSearch.entity().getResourceId(), SearchCriteria.Op.EQ); AllFieldsSearch.and("name", AllFieldsSearch.entity().getName(), SearchCriteria.Op.EQ); + AllFieldsSearch.and("value", AllFieldsSearch.entity().getValue(), SearchCriteria.Op.EQ); // FIXME SnapshotDetailsVO doesn't have a display field if (_allAttributes.containsKey("display")) { AllFieldsSearch.and("display", AllFieldsSearch.entity().isDisplay(), SearchCriteria.Op.EQ); @@ -49,6 +50,25 @@ public abstract class ResourceDetailsDaoBase<R extends ResourceDetail> extends G return findOneBy(sc); } + public List<R> findDetails(String name, String value, Boolean display) { + SearchCriteria<R> sc = AllFieldsSearch.create(); + + if(display != null){ + sc.setParameters("display", display); + } + + if(name != null){ + sc.setParameters("name", name); + } + + if(value != null){ + sc.setParameters("value", value); + } + + List<R> results = search(sc, null); + return results; + } + public Map<String, String> listDetailsKeyPairs(long resourceId) { SearchCriteria<R> sc = AllFieldsSearch.create(); sc.setParameters("resourceId", resourceId); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/667c8e79/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 6848ba0..a2437b8 100644 --- a/server/src/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/com/cloud/api/query/QueryManagerImpl.java @@ -3895,23 +3895,40 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { Boolean forDisplay = cmd.getDisplay(); ResourceTag.ResourceObjectType resourceType = cmd.getResourceType(); String resourceIdStr = cmd.getResourceId(); + String value = cmd.getValue(); Long resourceId = null; + + //Validation - 1.1 - resourceId and value cant be null. + if(resourceIdStr == null && value == null){ + throw new InvalidParameterValueException("Insufficient parameters passed for listing by resourceId OR key,value pair. Please check your params and try again."); + } + + //Validation - 1.2 - Value has to be passed along with key. + if(value != null && key == null){ + throw new InvalidParameterValueException("Listing by (key, value) but key is null. Please check the params and try again"); + } + + //Validation - 1.3 if (resourceIdStr != null) { resourceId = _taggedResourceMgr.getResourceId(resourceIdStr, resourceType); + if (resourceId == null) { + throw new InvalidParameterValueException("Cannot find resource with resourceId " + resourceIdStr + " and of resource type " + resourceType); + } } - if (resourceId == null) { - throw new InvalidParameterValueException("Cannot find resource with resourceId " + resourceIdStr + " and of resource type " + resourceType); - } + + List<? extends ResourceDetail> detailList = new ArrayList<ResourceDetail>(); ResourceDetail requestedDetail = null; if (key == null) { detailList = _resourceMetaDataMgr.getDetailsList(resourceId, resourceType, forDisplay); - } else { + } else if (value == null){ requestedDetail = _resourceMetaDataMgr.getDetail(resourceId, resourceType, key); if (requestedDetail != null && forDisplay != null && requestedDetail.isDisplay() != forDisplay) { requestedDetail = null; } + }else { + detailList = _resourceMetaDataMgr.getDetails(resourceType, key, value, forDisplay); } List<ResourceDetailResponse> responseList = new ArrayList<ResourceDetailResponse>(); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/667c8e79/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java index f7b092c..6f1f40d 100644 --- a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java +++ b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java @@ -224,6 +224,10 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource return dao.findDetail(resourceId, key); } + private List<? extends ResourceDetail> getDetails(String key, String value, Boolean forDisplay) { + return dao.findDetails(key, value, forDisplay); + } + private void addDetail(long resourceId, String key, String value, boolean forDisplay) { dao.addDetail(resourceId, key, value, forDisplay); } @@ -258,6 +262,12 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource } @Override + public List<? extends ResourceDetail> getDetails(ResourceObjectType resourceType, String key, String value, Boolean forDisplay){ + DetailDaoHelper newDetailDaoHelper = new DetailDaoHelper(resourceType); + return newDetailDaoHelper.getDetails(key, value, forDisplay); + } + + @Override public Map<String, String> getDetailsMap(long resourceId, ResourceObjectType resourceType, Boolean forDisplay) { DetailDaoHelper newDetailDaoHelper = new DetailDaoHelper(resourceType); return newDetailDaoHelper.getDetailsMap(resourceId, forDisplay);