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 2020/09/24 02:53:11 UTC
[lucene-solr] 01/02: SOLR-14894: Use annotations to implement V2
collection APIs
This is an automated email from the ASF dual-hosted git repository.
noble pushed a commit to branch branch_8x
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git
commit 1f26043c1c2465f1e4dfcc61e7026dfe5b8b452c
Author: noblepaul <no...@gmail.com>
AuthorDate: Thu Sep 24 12:37:12 2020 +1000
SOLR-14894: Use annotations to implement V2 collection APIs
---
.../java/org/apache/solr/core/CoreContainer.java | 2 +
.../java/org/apache/solr/handler/ClusterAPI.java | 3 ++
.../org/apache/solr/handler/CollectionsAPI.java | 46 ++++++++++++++++++++++
.../solr/handler/admin/TestApiFramework.java | 41 ++++++++++++++-----
.../solr/handler/admin/TestCollectionAPIs.java | 2 +
.../client/solrj/request/CollectionApiMapping.java | 10 -----
.../solrj/src/resources/apispec/cluster.nodes.json | 12 ------
.../apispec/collections.collection.delete.json | 13 ------
solr/solrj/src/resources/apispec/collections.json | 13 ------
9 files changed, 85 insertions(+), 57 deletions(-)
diff --git a/solr/core/src/java/org/apache/solr/core/CoreContainer.java b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
index 1db1543..c53ed26 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -89,6 +89,7 @@ import org.apache.solr.core.backup.repository.BackupRepository;
import org.apache.solr.core.backup.repository.BackupRepositoryFactory;
import org.apache.solr.filestore.PackageStoreAPI;
import org.apache.solr.handler.ClusterAPI;
+import org.apache.solr.handler.CollectionsAPI;
import org.apache.solr.handler.RequestHandlerBase;
import org.apache.solr.handler.SnapShooter;
import org.apache.solr.handler.admin.AutoscalingHistoryHandler;
@@ -725,6 +726,7 @@ public class CoreContainer {
createHandler(ZK_PATH, ZookeeperInfoHandler.class.getName(), ZookeeperInfoHandler.class);
createHandler(ZK_STATUS_PATH, ZookeeperStatusHandler.class.getName(), ZookeeperStatusHandler.class);
collectionsHandler = createHandler(COLLECTIONS_HANDLER_PATH, cfg.getCollectionsHandlerClass(), CollectionsHandler.class);
+ containerHandlers.getApiBag().registerObject(new CollectionsAPI(collectionsHandler));
configSetsHandler = createHandler(CONFIGSETS_HANDLER_PATH, cfg.getConfigSetsHandlerClass(), ConfigSetsHandler.class);
ClusterAPI clusterAPI = new ClusterAPI(collectionsHandler, configSetsHandler);
containerHandlers.getApiBag().registerObject(clusterAPI);
diff --git a/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java b/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
index 0a90ae2..ca16ede 100644
--- a/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
@@ -54,6 +54,9 @@ import static org.apache.solr.security.PermissionNameProvider.Name.COLL_READ_PER
import static org.apache.solr.security.PermissionNameProvider.Name.CONFIG_EDIT_PERM;
import static org.apache.solr.security.PermissionNameProvider.Name.CONFIG_READ_PERM;
+/** All V2 APIs that have a prefix of /api/cluster/
+ *
+ */
public class ClusterAPI {
private final CollectionsHandler collectionsHandler;
private final ConfigSetsHandler configSetsHandler;
diff --git a/solr/core/src/java/org/apache/solr/handler/CollectionsAPI.java b/solr/core/src/java/org/apache/solr/handler/CollectionsAPI.java
new file mode 100644
index 0000000..61ceffa
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/handler/CollectionsAPI.java
@@ -0,0 +1,46 @@
+package org.apache.solr.handler;
+
+import org.apache.solr.api.EndPoint;
+import org.apache.solr.common.cloud.ZkStateReader;
+import org.apache.solr.common.params.CollectionParams.CollectionAction;
+import org.apache.solr.handler.admin.CollectionsHandler;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.response.SolrQueryResponse;
+
+import static org.apache.solr.client.solrj.SolrRequest.METHOD.DELETE;
+import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET;
+import static org.apache.solr.common.params.CommonParams.NAME;
+import static org.apache.solr.security.PermissionNameProvider.Name.COLL_EDIT_PERM;
+import static org.apache.solr.security.PermissionNameProvider.Name.COLL_READ_PERM;
+
+/**
+ * All V2 APIs for collection management
+ *
+ */
+public class CollectionsAPI {
+
+ private final CollectionsHandler collectionsHandler;
+
+ public CollectionsAPI(CollectionsHandler collectionsHandler) {
+ this.collectionsHandler = collectionsHandler;
+ }
+
+ @EndPoint(
+ path = {"/c", "/collections"},
+ method = GET,
+ permission = COLL_READ_PERM)
+ public void getCollections(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
+ CollectionsHandler.CollectionOperation.LIST_OP.execute(req, rsp, collectionsHandler);
+ }
+
+ @EndPoint(path = {"/c/{collection}", "/collections/{collection}"},
+ method = DELETE,
+ permission = COLL_EDIT_PERM)
+ public void deleteCollection(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
+ req = ClusterAPI.wrapParams(req, "action",
+ CollectionAction.DELETE.toString(),
+ NAME, req.getPathTemplateValues().get(ZkStateReader.COLLECTION_PROP));
+ collectionsHandler.handleRequestBody(req, rsp);
+ }
+
+}
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java b/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
index 55ce63b..bfa9eae 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
@@ -17,17 +17,41 @@
package org.apache.solr.handler.admin;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
import org.apache.solr.SolrTestCaseJ4;
-import org.apache.solr.api.*;
+import org.apache.solr.api.Api;
+import org.apache.solr.api.ApiBag;
+import org.apache.solr.api.Command;
+import org.apache.solr.api.EndPoint;
+import org.apache.solr.api.PayloadObj;
+import org.apache.solr.api.V2HttpCall;
import org.apache.solr.api.V2HttpCall.CompositeApi;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.common.annotation.JsonProperty;
import org.apache.solr.common.params.MapSolrParams;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.SolrParams;
-import org.apache.solr.common.util.*;
+import org.apache.solr.common.util.CommandOperation;
+import org.apache.solr.common.util.ContentStream;
+import org.apache.solr.common.util.ContentStreamBase;
+import org.apache.solr.common.util.JsonSchemaValidator;
+import org.apache.solr.common.util.PathTrie;
+import org.apache.solr.common.util.ReflectMapWriter;
+import org.apache.solr.common.util.StrUtils;
+import org.apache.solr.common.util.Utils;
+import org.apache.solr.common.util.ValidatingJsonMap;
import org.apache.solr.core.CoreContainer;
import org.apache.solr.core.PluginBag;
+import org.apache.solr.handler.CollectionsAPI;
import org.apache.solr.handler.PingRequestHandler;
import org.apache.solr.handler.SchemaHandler;
import org.apache.solr.handler.SolrConfigHandler;
@@ -38,16 +62,13 @@ import org.apache.solr.request.SolrRequestHandler;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.security.PermissionNameProvider;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.*;
-
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.apache.solr.api.ApiBag.EMPTY_SPEC;
import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET;
import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST;
-import static org.apache.solr.common.params.CommonParams.*;
+import static org.apache.solr.common.params.CommonParams.COLLECTIONS_HANDLER_PATH;
+import static org.apache.solr.common.params.CommonParams.CONFIGSETS_HANDLER_PATH;
+import static org.apache.solr.common.params.CommonParams.CORES_HANDLER_PATH;
import static org.apache.solr.common.util.ValidatingJsonMap.NOT_NULL;
public class TestApiFramework extends SolrTestCaseJ4 {
@@ -57,7 +78,9 @@ public class TestApiFramework extends SolrTestCaseJ4 {
Map<String, Object> out = new HashMap<>();
CoreContainer mockCC = TestCoreAdminApis.getCoreContainerMock(calls, out);
PluginBag<SolrRequestHandler> containerHandlers = new PluginBag<>(SolrRequestHandler.class, null, false);
- containerHandlers.put(COLLECTIONS_HANDLER_PATH, new TestCollectionAPIs.MockCollectionsHandler());
+ TestCollectionAPIs.MockCollectionsHandler collectionsHandler = new TestCollectionAPIs.MockCollectionsHandler();
+ containerHandlers.put(COLLECTIONS_HANDLER_PATH, collectionsHandler);
+ containerHandlers.getApiBag().registerObject(new CollectionsAPI(collectionsHandler));
containerHandlers.put(CORES_HANDLER_PATH, new CoreAdminHandler(mockCC));
containerHandlers.put(CONFIGSETS_HANDLER_PATH, new ConfigSetsHandler(mockCC));
out.put("getRequestHandlers", containerHandlers);
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java b/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
index d32097f..0518c77 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
@@ -41,6 +41,7 @@ import org.apache.solr.common.util.Pair;
import org.apache.solr.common.util.Utils;
import org.apache.solr.core.CoreContainer;
import org.apache.solr.handler.ClusterAPI;
+import org.apache.solr.handler.CollectionsAPI;
import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.SolrQueryResponse;
@@ -83,6 +84,7 @@ public class TestCollectionAPIs extends SolrTestCaseJ4 {
ApiBag apiBag;
try (MockCollectionsHandler collectionsHandler = new MockCollectionsHandler()) {
apiBag = new ApiBag(false);
+ apiBag.registerObject(new CollectionsAPI(collectionsHandler));
Collection<Api> apis = collectionsHandler.getApis();
for (Api api : apis) apiBag.register(api, Collections.emptyMap());
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionApiMapping.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionApiMapping.java
index 91227e0..9b106ab 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionApiMapping.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionApiMapping.java
@@ -38,7 +38,6 @@ import static org.apache.solr.client.solrj.SolrRequest.METHOD.DELETE;
import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET;
import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST;
import static org.apache.solr.client.solrj.request.CollectionApiMapping.EndPoint.CLUSTER_ALIASES;
-import static org.apache.solr.client.solrj.request.CollectionApiMapping.EndPoint.COLLECTIONS;
import static org.apache.solr.client.solrj.request.CollectionApiMapping.EndPoint.COLLECTIONS_COMMANDS;
import static org.apache.solr.client.solrj.request.CollectionApiMapping.EndPoint.COLLECTION_STATE;
import static org.apache.solr.client.solrj.request.CollectionApiMapping.EndPoint.PER_COLLECTION;
@@ -56,7 +55,6 @@ import static org.apache.solr.common.params.CommonParams.NAME;
public class CollectionApiMapping {
public enum Meta implements CommandMeta {
- GET_COLLECTIONS(COLLECTIONS, GET, LIST),
GET_A_COLLECTION(COLLECTION_STATE, GET, CLUSTERSTATUS),
LIST_ALIASES(CLUSTER_ALIASES, GET, LISTALIASES),
CREATE_COLLECTION(COLLECTIONS_COMMANDS,
@@ -70,12 +68,6 @@ public class CollectionApiMapping {
),
Utils.makeMap("property.", "properties.")),
- DELETE_COLL(EndPoint.PER_COLLECTION_DELETE,
- DELETE,
- CollectionAction.DELETE,
- CollectionAction.DELETE.toLower(),
- Utils.makeMap(NAME, "collection")),
-
RELOAD_COLL(PER_COLLECTION,
POST,
RELOAD,
@@ -313,10 +305,8 @@ public class CollectionApiMapping {
public enum EndPoint implements V2EndPoint {
CLUSTER_ALIASES("cluster.aliases"),
COLLECTIONS_COMMANDS("collections.Commands"),
- COLLECTIONS("collections"),
COLLECTION_STATE("collections.collection"),
PER_COLLECTION("collections.collection.Commands"),
- PER_COLLECTION_DELETE("collections.collection.delete"),
PER_COLLECTION_SHARDS_COMMANDS("collections.collection.shards.Commands"),
PER_COLLECTION_PER_SHARD_COMMANDS("collections.collection.shards.shard.Commands"),
PER_COLLECTION_PER_SHARD_DELETE("collections.collection.shards.shard.delete"),
diff --git a/solr/solrj/src/resources/apispec/cluster.nodes.json b/solr/solrj/src/resources/apispec/cluster.nodes.json
deleted file mode 100644
index 0dd474d..0000000
--- a/solr/solrj/src/resources/apispec/cluster.nodes.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "documentation": "https://lucene.apache.org/solr/guide/cluster-node-management.html",
- "description": "Provides general information about the available nodes of the cluster.",
- "methods": [
- "GET"
- ],
- "url": {
- "paths": [
- "/cluster/nodes"
- ]
- }
-}
diff --git a/solr/solrj/src/resources/apispec/collections.collection.delete.json b/solr/solrj/src/resources/apispec/collections.collection.delete.json
deleted file mode 100644
index 2e38c0f..0000000
--- a/solr/solrj/src/resources/apispec/collections.collection.delete.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "documentation": "https://lucene.apache.org/solr/guide/collection-management.html#delete",
- "description": "Deletes a collection.",
- "methods": [
- "DELETE"
- ],
- "url": {
- "paths": [
- "/collections/{collection}",
- "/c/{collection}"
- ]
- }
-}
diff --git a/solr/solrj/src/resources/apispec/collections.json b/solr/solrj/src/resources/apispec/collections.json
deleted file mode 100644
index 10b91ab..0000000
--- a/solr/solrj/src/resources/apispec/collections.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "documentation": "https://lucene.apache.org/solr/guide/collection-management.html#list",
- "description": "List all available collections and their properties.",
- "methods": [
- "GET"
- ],
- "url": {
- "paths": [
- "/collections",
- "/c"
- ]
- }
-}