You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2016/04/25 11:11:40 UTC

lucene-solr:apiv2: SOLR-8029: missing mappings for /v2/cluster path

Repository: lucene-solr
Updated Branches:
  refs/heads/apiv2 4a1f9c86d -> 52aa4478d


SOLR-8029: missing mappings for /v2/cluster path


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/52aa4478
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/52aa4478
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/52aa4478

Branch: refs/heads/apiv2
Commit: 52aa4478de9d1ef352c28b4beccf5c442170d46b
Parents: 4a1f9c8
Author: Noble Paul <no...@apache.org>
Authored: Mon Apr 25 14:41:25 2016 +0530
Committer: Noble Paul <no...@apache.org>
Committed: Mon Apr 25 14:41:25 2016 +0530

----------------------------------------------------------------------
 .../src/java/org/apache/solr/api/ApiBag.java    | 49 +++++++++++---------
 .../java/org/apache/solr/api/V2HttpCall.java    | 31 ++++++++-----
 .../handler/admin/BaseHandlerApiSupport.java    |  8 ++++
 .../handler/admin/CollectionHandlerApi.java     |  4 ++
 .../apispec/cluster.commandstatus.json          | 11 +++++
 solr/core/src/resources/apispec/cluster.json    |  5 +-
 6 files changed, 71 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/52aa4478/solr/core/src/java/org/apache/solr/api/ApiBag.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/api/ApiBag.java b/solr/core/src/java/org/apache/solr/api/ApiBag.java
index 886c1d5..649606b 100644
--- a/solr/core/src/java/org/apache/solr/api/ApiBag.java
+++ b/solr/core/src/java/org/apache/solr/api/ApiBag.java
@@ -94,7 +94,7 @@ public class ApiBag {
 
   private void validateAndRegister(Api api, Map<String, String> nameSubstitutes) {
     Map2 spec = api.getSpec();
-    Api introspect = getIntrospect(api);
+    Api introspect = new IntrospectApi(api);
     List<String> methods = spec.getList("methods", ENUM_OF, SUPPORTED_METHODS);
     for (String method : methods) {
       PathTrie<Api> registry = apis.get(method);
@@ -128,30 +128,35 @@ public class ApiBag {
     }
   }
 
-  private Api getIntrospect(final Api baseApi) {
-    return new Api(EMPTY_SPEC) {
-      @Override
-      public void call(SolrQueryRequest req, SolrQueryResponse rsp) {
-
-        String cmd = req.getParams().get("command");
-        Map2 result = null;
-        if (cmd == null) {
-          result = baseApi.getSpec();
-        } else {
-          Map2 specCopy = Map2.getDeepCopy(baseApi.getSpec(), 5, true);
-          Map2 commands = specCopy.getMap("commands", null);
-          if (commands != null) {
-            Map2 m = commands.getMap(cmd, null);
-            specCopy.put("commands", Collections.singletonMap(cmd, m));
-          }
-          result = specCopy;
+  public static class IntrospectApi extends  Api {
+    Api baseApi;
+
+    protected IntrospectApi( Api base) {
+      super(EMPTY_SPEC);
+      this.baseApi = base;
+    }
+
+    public void call(SolrQueryRequest req, SolrQueryResponse rsp) {
+
+      String cmd = req.getParams().get("command");
+      Map2 result = null;
+      if (cmd == null) {
+        result = baseApi.getSpec();
+      } else {
+        Map2 specCopy = Map2.getDeepCopy(baseApi.getSpec(), 5, true);
+        Map2 commands = specCopy.getMap("commands", null);
+        if (commands != null) {
+          Map2 m = commands.getMap(cmd, null);
+          specCopy.put("commands", Collections.singletonMap(cmd, m));
         }
-        List l = (List) rsp.getValues().get("spec");
-        if (l == null) rsp.getValues().add("spec", l = new ArrayList());
-        l.add(result);
+        result = specCopy;
       }
-    };
+      List l = (List) rsp.getValues().get("spec");
+      if (l == null) rsp.getValues().add("spec", l = new ArrayList());
+      l.add(result);
+    }
   }
+
   public static Map<String, JsonSchemaValidator> getParsedSchema(Map2 commands) {
     Map<String,JsonSchemaValidator> validators =  new HashMap<>();
     for (Object o : commands.entrySet()) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/52aa4478/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
index f513b69..515f572 100644
--- a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
+++ b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
@@ -179,22 +179,29 @@ public class V2HttpCall extends HttpSolrCall {
       if (containerHandlerLookup && commonPaths4ContainerLevelAndCoreLevel.contains(prefix)) return null;
 
 
-      Map<String, Set<String>> subpaths = new LinkedHashMap<>();
-
-      getSubPaths(path, requestHandlers.getApiBag(), subpaths);
-      if (!containerHandlerLookup) getSubPaths(fullPath, cores.getRequestHandlers().getApiBag(), subpaths);
+      Map<String, Set<String>> subpaths = getSubPaths(requestHandlers, path, cores, fullPath, containerHandlerLookup);
 
       if (subpaths.isEmpty()) {
         throw new SolrException(SolrException.ErrorCode.NOT_FOUND, "No valid handler for path :" + path);
       } else {
-        return getSubPathImpl(subpaths, fullPath);
+        return getSubPathImpl(subpaths, fullPath, true);
       }
     }
-    if (api.getSpec() == Map2.EMPTY)
-      api = mergeIntrospect(requestHandlers, path, method, parts);
+    if (api instanceof ApiBag.IntrospectApi) {
+      api = mergeIntrospect(requestHandlers, path, parts,
+          getSubPathImpl(getSubPaths(requestHandlers, path,cores,fullPath, containerHandlerLookup), path, true ));
+    }
     return api;
   }
 
+  private static Map<String, Set<String>> getSubPaths(PluginBag<SolrRequestHandler> requestHandlers, String path, CoreContainer cores, String fullPath, boolean containerHandlerLookup) {
+    Map<String, Set<String>> subpaths = new LinkedHashMap<>();
+
+    getSubPaths(path, requestHandlers.getApiBag(), subpaths);
+    if (!containerHandlerLookup) getSubPaths(fullPath, cores.getRequestHandlers().getApiBag(), subpaths);
+    return subpaths;
+  }
+
   private static void getSubPaths(String path, ApiBag bag, Map<String, Set<String>> pathsVsMethod) {
     for (SolrRequest.METHOD m : SolrRequest.METHOD.values()) {
       PathTrie<Api> registry = bag.getRegistry(m.toString());
@@ -211,7 +218,8 @@ public class V2HttpCall extends HttpSolrCall {
   }
 
   private static Api mergeIntrospect(PluginBag<SolrRequestHandler> requestHandlers,
-                                     String path, String method, Map<String, String> parts) {
+                                     String path,Map<String, String> parts,
+                                     Api subPath) {
     Api api;
     final Map<String, Api> apis = new LinkedHashMap<>();
     for (String m : SolrRequest.SUPPORTED_METHODS) {
@@ -224,23 +232,24 @@ public class V2HttpCall extends HttpSolrCall {
         String method = req.getParams().get("method");
         Set<Api> added = new HashSet<>();
         for (Map.Entry<String, Api> e : apis.entrySet()) {
-          if (method == null || e.getKey().equals(req.getHttpMethod())) {
+          if (method == null || e.getKey().equals(method)) {
             if (!added.contains(e.getValue())) {
               e.getValue().call(req, rsp);
               added.add(e.getValue());
             }
           }
         }
+        subPath.call(req, rsp);
       }
     };
     return api;
   }
 
-  private static Api getSubPathImpl(final Map<String, Set<String>> subpaths, String path) {
+  private static Api getSubPathImpl(final Map<String, Set<String>> subpaths, String path,  boolean addMsg) {
     return new Api(() -> Map2.EMPTY) {
       @Override
       public void call(SolrQueryRequest req, SolrQueryResponse rsp) {
-        rsp.add("msg", "Invalid path, try the following");
+        if(addMsg) rsp.add("msg", "Invalid path, try the following");
         LinkedHashMap<String, Set<String>> result = new LinkedHashMap<>(subpaths.size());
         for (Map.Entry<String, Set<String>> e : subpaths.entrySet()) {
           if (e.getKey().endsWith(ApiBag.INTROSPECT)) continue;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/52aa4478/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java b/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
index aabcc10..aaf229b 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
@@ -100,6 +100,14 @@ public abstract class BaseHandlerApiSupport implements ApiSupport {
               rsp.add("error", "No support for : " + method + " at :" + req.getPath());
               return;
             }
+            if (commands.size() > 1) {
+              for (ApiCommand command : commands) {
+                if (command.getName().equals(req.getPath())) {
+                  commands = Collections.singletonList(command);
+                  break;
+                }
+              }
+            }
             wrapParams(req, new CommandOperation("", Collections.EMPTY_MAP), commands.get(0), true);
             invokeUrl(commands.get(0), req, rsp);
           }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/52aa4478/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java b/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java
index 0790366..a3c7168 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java
@@ -69,6 +69,9 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
 
   enum Cmd implements ApiCommand<CollectionHandlerApi> {
     GET_COLLECTIONS(EndPoint.COLLECTIONS, GET, LIST_OP),
+    GET_CLUSTER(EndPoint.CLUSTER, GET, LIST_OP, "/cluster", null),
+    GET_CLUSTER_OVERSEER(EndPoint.CLUSTER, GET, OVERSEERSTATUS_OP, "/cluster/overseer", null),
+    GET_CLUSTER_CMD(EndPoint.CLUSTER_CMD, GET, REQUESTSTATUS_OP),
     GET_A_COLLECTION(EndPoint.COLLECTION_STATE, GET, CLUSTERSTATUS_OP),
     CREATE_COLLECTION(EndPoint.COLLECTIONS_COMMANDS,
         POST,
@@ -255,6 +258,7 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
 
   enum EndPoint implements V2EndPoint {
     CLUSTER("cluster"),
+    CLUSTER_CMD("cluster.commandstatus"),
     COLLECTIONS_COMMANDS("collections.Commands"),
     COLLECTIONS("collections"),
     COLLECTION_STATE("collection"),

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/52aa4478/solr/core/src/resources/apispec/cluster.commandstatus.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/cluster.commandstatus.json b/solr/core/src/resources/apispec/cluster.commandstatus.json
new file mode 100644
index 0000000..f608299
--- /dev/null
+++ b/solr/core/src/resources/apispec/cluster.commandstatus.json
@@ -0,0 +1,11 @@
+{
+  "documentation": "https://cwiki.apache.org/confluence/display/solr/Config+API",
+  "methods": [
+    "GET"
+  ],
+  "url": {
+    "paths": [
+      "/cluster/command-status/{id}"
+    ]
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/52aa4478/solr/core/src/resources/apispec/cluster.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/cluster.json b/solr/core/src/resources/apispec/cluster.json
index afff2b3..434e9d5 100644
--- a/solr/core/src/resources/apispec/cluster.json
+++ b/solr/core/src/resources/apispec/cluster.json
@@ -7,10 +7,7 @@
     "paths": [
       "/cluster",
       "/cluster/overseer",
-      "/cluster/nodes",
-      "/cluster/command-status",
-      "/cluster/command-status/{id}",
-      "/cluster/command-status/{id}"
+      "/cluster/nodes"
     ]
   }
 }