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