You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ni...@apache.org on 2014/05/19 08:20:21 UTC

git commit: updated refs/heads/4.4-forward to d5425e1

Repository: cloudstack
Updated Branches:
  refs/heads/4.4-forward 8bcd2546a -> d5425e1a4


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/d5425e1a
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/d5425e1a
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/d5425e1a

Branch: refs/heads/4.4-forward
Commit: d5425e1a4a8ed4cadc2f9b97f82f6f608e9a51de
Parents: 8bcd254
Author: Nitin Mehta <ni...@citrix.com>
Authored: Sun May 18 23:20:12 2014 -0700
Committer: Nitin Mehta <ni...@citrix.com>
Committed: Sun May 18 23:20:12 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/d5425e1a/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/d5425e1a/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 93dc29d..47f80a0 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/d5425e1a/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/d5425e1a/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/d5425e1a/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/d5425e1a/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);