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/23 07:29:59 UTC
[lucene-solr] 01/02: SOLR-14890: Refactor code to use annotations
for cluster API
This is an automated email from the ASF dual-hosted git repository.
noble pushed a commit to branch jira/solr14890
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git
commit 2d8b86840a1e756f09d946ca3472904ed3e52892
Author: noble <no...@apache.org>
AuthorDate: Wed Sep 23 17:10:22 2020 +1000
SOLR-14890: Refactor code to use annotations for cluster API
---
.../cloud/OverseerConfigSetMessageHandler.java | 24 +++---
.../java/org/apache/solr/cloud/ZkController.java | 28 +------
.../cloud/api/collections/CreateCollectionCmd.java | 19 ++---
.../cloud/api/collections/DeleteCollectionCmd.java | 4 +-
.../java/org/apache/solr/core/CoreContainer.java | 1 +
.../java/org/apache/solr/handler/ClusterAPI.java | 50 +++++++++++-
.../solr/handler/admin/ConfigSetsHandler.java | 35 ++++----
.../solr/handler/admin/ConfigSetsHandlerApi.java | 93 ----------------------
.../client/solrj/request/CollectionApiMapping.java | 75 -----------------
.../solrj/request/beans/CreateConfigInfo.java} | 23 +++---
.../org/apache/solr/common/MapSerializable.java | 3 +-
.../src/java/org/apache/solr/common/MapWriter.java | 2 +-
.../apispec/cluster.configs.Commands.json | 34 --------
.../resources/apispec/cluster.configs.delete.json | 12 ---
.../src/resources/apispec/cluster.configs.json | 12 ---
15 files changed, 104 insertions(+), 311 deletions(-)
diff --git a/solr/core/src/java/org/apache/solr/cloud/OverseerConfigSetMessageHandler.java b/solr/core/src/java/org/apache/solr/cloud/OverseerConfigSetMessageHandler.java
index 4f5b28f..9af5a6f 100644
--- a/solr/core/src/java/org/apache/solr/cloud/OverseerConfigSetMessageHandler.java
+++ b/solr/core/src/java/org/apache/solr/cloud/OverseerConfigSetMessageHandler.java
@@ -16,6 +16,17 @@
*/
package org.apache.solr.cloud;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.lang.invoke.MethodHandles;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.cloud.DocCollection;
@@ -32,21 +43,10 @@ import org.apache.zookeeper.KeeperException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.lang.invoke.MethodHandles;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
import static org.apache.solr.common.params.CommonParams.NAME;
import static org.apache.solr.common.params.ConfigSetParams.ConfigSetAction.CREATE;
import static org.apache.solr.common.util.Utils.toJSONString;
-import static org.apache.solr.handler.admin.ConfigSetsHandlerApi.DEFAULT_CONFIGSET_NAME;
+import static org.apache.solr.handler.admin.ConfigSetsHandler.DEFAULT_CONFIGSET_NAME;
/**
* A {@link OverseerMessageHandler} that handles ConfigSets API related
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
index dc4c210..c29623d 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -65,30 +65,8 @@ import org.apache.solr.cloud.overseer.SliceMutator;
import org.apache.solr.common.AlreadyClosedException;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
-import org.apache.solr.common.cloud.BeforeReconnect;
-import org.apache.solr.common.cloud.ClusterState;
-import org.apache.solr.common.cloud.ConnectionManager;
-import org.apache.solr.common.cloud.DefaultConnectionStrategy;
-import org.apache.solr.common.cloud.DefaultZkACLProvider;
-import org.apache.solr.common.cloud.DefaultZkCredentialsProvider;
-import org.apache.solr.common.cloud.DocCollection;
-import org.apache.solr.common.cloud.DocCollectionWatcher;
-import org.apache.solr.common.cloud.LiveNodesListener;
-import org.apache.solr.common.cloud.NodesSysPropsCacher;
-import org.apache.solr.common.cloud.OnReconnect;
-import org.apache.solr.common.cloud.Replica;
+import org.apache.solr.common.cloud.*;
import org.apache.solr.common.cloud.Replica.Type;
-import org.apache.solr.common.cloud.Slice;
-import org.apache.solr.common.cloud.SolrZkClient;
-import org.apache.solr.common.cloud.ZkACLProvider;
-import org.apache.solr.common.cloud.ZkCmdExecutor;
-import org.apache.solr.common.cloud.ZkConfigManager;
-import org.apache.solr.common.cloud.ZkCoreNodeProps;
-import org.apache.solr.common.cloud.ZkCredentialsProvider;
-import org.apache.solr.common.cloud.ZkMaintenanceUtils;
-import org.apache.solr.common.cloud.ZkNodeProps;
-import org.apache.solr.common.cloud.ZkStateReader;
-import org.apache.solr.common.cloud.ZooKeeperException;
import org.apache.solr.common.params.CollectionParams;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.CoreAdminParams;
@@ -106,7 +84,7 @@ import org.apache.solr.core.CoreContainer;
import org.apache.solr.core.CoreDescriptor;
import org.apache.solr.core.SolrCore;
import org.apache.solr.core.SolrCoreInitializationException;
-import org.apache.solr.handler.admin.ConfigSetsHandlerApi;
+import org.apache.solr.handler.admin.ConfigSetsHandler;
import org.apache.solr.handler.component.HttpShardHandler;
import org.apache.solr.logging.MDCLoggingContext;
import org.apache.solr.search.SolrIndexSearcher;
@@ -908,7 +886,7 @@ public class ZkController implements Closeable {
, "intended to be the default. Current 'solr.default.confdir' value:"
, System.getProperty(SolrDispatchFilter.SOLR_DEFAULT_CONFDIR_ATTRIBUTE));
} else {
- ZkMaintenanceUtils.upConfig(zkClient, Paths.get(configDirPath), ConfigSetsHandlerApi.DEFAULT_CONFIGSET_NAME);
+ ZkMaintenanceUtils.upConfig(zkClient, Paths.get(configDirPath), ConfigSetsHandler.DEFAULT_CONFIGSET_NAME);
}
}
}
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java
index 854ee9a..d356788 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java
@@ -32,11 +32,11 @@ import java.util.Properties;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
-import org.apache.solr.client.solrj.cloud.DistribStateManager;
-import org.apache.solr.client.solrj.cloud.SolrCloudManager;
import org.apache.solr.client.solrj.cloud.AlreadyExistsException;
import org.apache.solr.client.solrj.cloud.BadVersionException;
+import org.apache.solr.client.solrj.cloud.DistribStateManager;
import org.apache.solr.client.solrj.cloud.NotEmptyException;
+import org.apache.solr.client.solrj.cloud.SolrCloudManager;
import org.apache.solr.client.solrj.cloud.VersionedData;
import org.apache.solr.cloud.Overseer;
import org.apache.solr.cloud.ZkController;
@@ -63,7 +63,6 @@ import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.SimpleOrderedMap;
import org.apache.solr.common.util.TimeSource;
import org.apache.solr.common.util.Utils;
-import org.apache.solr.handler.admin.ConfigSetsHandlerApi;
import org.apache.solr.handler.component.ShardHandler;
import org.apache.solr.handler.component.ShardRequest;
import org.apache.solr.util.TimeOut;
@@ -86,6 +85,8 @@ import static org.apache.solr.common.params.CommonAdminParams.ASYNC;
import static org.apache.solr.common.params.CommonAdminParams.WAIT_FOR_FINAL_STATE;
import static org.apache.solr.common.params.CommonParams.NAME;
import static org.apache.solr.common.util.StrUtils.formatString;
+import static org.apache.solr.handler.admin.ConfigSetsHandler.DEFAULT_CONFIGSET_NAME;
+import static org.apache.solr.handler.admin.ConfigSetsHandler.getSuffixedNameForAutoGeneratedConfigSet;
public class CreateCollectionCmd implements OverseerCollectionMessageHandler.Cmd {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -300,7 +301,7 @@ public class CreateCollectionCmd implements OverseerCollectionMessageHandler.Cmd
// Emit a warning about production use of data driven functionality
boolean defaultConfigSetUsed = message.getStr(COLL_CONF) == null ||
- message.getStr(COLL_CONF).equals(ConfigSetsHandlerApi.DEFAULT_CONFIGSET_NAME);
+ message.getStr(COLL_CONF).equals(DEFAULT_CONFIGSET_NAME);
if (defaultConfigSetUsed) {
results.add("warning", "Using _default configset. Data driven schema functionality"
+ " is enabled by default, which is NOT RECOMMENDED for production use. To turn it off:"
@@ -419,11 +420,11 @@ public class CreateCollectionCmd implements OverseerCollectionMessageHandler.Cmd
List<String> configNames = null;
try {
configNames = ocmh.zkStateReader.getZkClient().getChildren(ZkConfigManager.CONFIGS_ZKNODE, null, true);
- if (configNames.contains(ConfigSetsHandlerApi.DEFAULT_CONFIGSET_NAME)) {
+ if (configNames.contains(DEFAULT_CONFIGSET_NAME)) {
if (CollectionAdminParams.SYSTEM_COLL.equals(coll)) {
return coll;
} else {
- String intendedConfigSetName = ConfigSetsHandlerApi.getSuffixedNameForAutoGeneratedConfigSet(coll);
+ String intendedConfigSetName = getSuffixedNameForAutoGeneratedConfigSet(coll);
copyDefaultConfigSetTo(configNames, intendedConfigSetName);
return intendedConfigSetName;
}
@@ -452,7 +453,7 @@ public class CreateCollectionCmd implements OverseerCollectionMessageHandler.Cmd
}
// Copy _default into targetConfig
try {
- configManager.copyConfigDir(ConfigSetsHandlerApi.DEFAULT_CONFIGSET_NAME, targetConfig, new HashSet<>());
+ configManager.copyConfigDir(DEFAULT_CONFIGSET_NAME, targetConfig, new HashSet<>());
} catch (Exception e) {
throw new SolrException(ErrorCode.INVALID_STATE, "Error while copying _default to " + targetConfig, e);
}
@@ -580,9 +581,9 @@ public class CreateCollectionCmd implements OverseerCollectionMessageHandler.Cmd
break;
}
// if _default exists, use that
- if (configNames != null && configNames.contains(ConfigSetsHandlerApi.DEFAULT_CONFIGSET_NAME)) {
+ if (configNames != null && configNames.contains(DEFAULT_CONFIGSET_NAME)) {
log.info("Could not find explicit collection configName, but found _default config set - using that set.");
- collectionProps.put(ZkController.CONFIGNAME_PROP, ConfigSetsHandlerApi.DEFAULT_CONFIGSET_NAME);
+ collectionProps.put(ZkController.CONFIGNAME_PROP, DEFAULT_CONFIGSET_NAME);
break;
}
// if there is only one conf, use that
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteCollectionCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteCollectionCmd.java
index 352d9e9..5c08057 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteCollectionCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteCollectionCmd.java
@@ -45,7 +45,7 @@ import org.apache.solr.common.util.TimeSource;
import org.apache.solr.common.util.Utils;
import org.apache.solr.core.SolrInfoBean;
import org.apache.solr.core.snapshots.SolrSnapshotManager;
-import org.apache.solr.handler.admin.ConfigSetsHandlerApi;
+import org.apache.solr.handler.admin.ConfigSetsHandler;
import org.apache.solr.handler.admin.MetricsHistoryHandler;
import org.apache.solr.metrics.SolrMetricManager;
import org.apache.zookeeper.KeeperException;
@@ -164,7 +164,7 @@ public class DeleteCollectionCmd implements OverseerCollectionMessageHandler.Cmd
// delete related config set iff: it is auto generated AND not related to any other collection
String configSetName = zkStateReader.readConfigName(collection);
- if (ConfigSetsHandlerApi.isAutoGeneratedConfigSet(configSetName)) {
+ if (ConfigSetsHandler.isAutoGeneratedConfigSet(configSetName)) {
boolean configSetIsUsedByOtherCollection = false;
// make sure the configSet is not shared with other collections
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 9e0a890..8052833 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -723,6 +723,7 @@ public class CoreContainer {
ClusterAPI clusterAPI = new ClusterAPI(collectionsHandler);
containerHandlers.getApiBag().registerObject(clusterAPI);
containerHandlers.getApiBag().registerObject(clusterAPI.commands);
+ containerHandlers.getApiBag().registerObject(clusterAPI.configSetCommands);
/*
* HealthCheckHandler needs to be initialized before InfoHandler, since the later one will call CoreContainer.getHealthCheckHandler().
* We don't register the handler here because it'll be registered inside InfoHandler
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 5ce564e..d32db93 100644
--- a/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
@@ -25,16 +25,21 @@ import org.apache.solr.api.Command;
import org.apache.solr.api.EndPoint;
import org.apache.solr.api.PayloadObj;
import org.apache.solr.client.solrj.request.beans.ClusterPropInfo;
+import org.apache.solr.client.solrj.request.beans.CreateConfigInfo;
+import org.apache.solr.cloud.OverseerConfigSetMessageHandler;
import org.apache.solr.cluster.placement.impl.PlacementPluginConfigImpl;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.annotation.JsonProperty;
import org.apache.solr.common.cloud.ClusterProperties;
+import org.apache.solr.common.params.CommonParams;
+import org.apache.solr.common.params.ConfigSetParams;
import org.apache.solr.common.params.DefaultSolrParams;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.util.ReflectMapWriter;
import org.apache.solr.common.util.Utils;
import org.apache.solr.core.CoreContainer;
import org.apache.solr.handler.admin.CollectionsHandler;
+import org.apache.solr.handler.admin.ConfigSetsHandler;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.SolrQueryResponse;
@@ -48,19 +53,21 @@ import static org.apache.solr.common.params.CollectionParams.CollectionAction.OV
import static org.apache.solr.common.params.CollectionParams.CollectionAction.REMOVEROLE;
import static org.apache.solr.security.PermissionNameProvider.Name.COLL_EDIT_PERM;
import static org.apache.solr.security.PermissionNameProvider.Name.COLL_READ_PERM;
+import static org.apache.solr.security.PermissionNameProvider.Name.CONFIG_EDIT_PERM;
+import static org.apache.solr.security.PermissionNameProvider.Name.CONFIG_READ_PERM;
public class ClusterAPI {
private final CoreContainer coreContainer;
private final CollectionsHandler collectionsHandler;
public final Commands commands = new Commands();
+ public final ConfigSetCommands configSetCommands = new ConfigSetCommands();
public ClusterAPI(CollectionsHandler ch) {
this.collectionsHandler = ch;
this.coreContainer = ch.getCoreContainer();
}
-
@EndPoint(method = GET,
path = "/cluster/overseer",
permission = COLL_READ_PERM)
@@ -83,6 +90,44 @@ public class ClusterAPI {
CollectionsHandler.CollectionOperation.DELETESTATUS_OP.execute(req, rsp, coreContainer.getCollectionsHandler());
}
+ @EndPoint(method = DELETE,
+ path = "/cluster/configs/{name}",
+ permission = CONFIG_EDIT_PERM
+ )
+ public void deleteConfigSet(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
+ req = wrapParams(req,
+ "action", ConfigSetParams.ConfigSetAction.DELETE.toString(),
+ CommonParams.NAME, req.getPathTemplateValues().get("name"));
+ coreContainer.getConfigSetsHandler().handleRequestBody(req, rsp);
+ }
+
+ @EndPoint(method = GET,
+ path = "/cluster/configs",
+ permission = CONFIG_READ_PERM)
+ public void listConfigSet(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
+ ConfigSetsHandler.ConfigSetOperation.LIST_OP.call(req, rsp, coreContainer.getConfigSetsHandler());
+ }
+
+ @EndPoint(method = POST,
+ path = "/cluster/configs",
+ permission = CONFIG_EDIT_PERM
+ )
+ public class ConfigSetCommands {
+
+ @Command(name = "create")
+ @SuppressWarnings("unchecked")
+ public void create(PayloadObj<CreateConfigInfo> obj) throws Exception {
+ Map<String, Object> mapVals = obj.get().toMap(new HashMap<>());
+ Map<String,Object> customProps = (Map<String, Object>) mapVals.remove("properties");
+ if(customProps!= null) {
+ customProps.forEach((k, o) -> mapVals.put(OverseerConfigSetMessageHandler.PROPERTY_PREFIX+"."+ k, o));
+ }
+ mapVals.put("action", ConfigSetParams.ConfigSetAction.CREATE.toString());
+ coreContainer.getConfigSetsHandler().handleRequestBody(wrapParams(obj.getRequest(), mapVals), obj.getResponse());
+ }
+
+ }
+
public static SolrQueryRequest wrapParams(SolrQueryRequest req, Object... def) {
Map<String, Object> m = Utils.makeMap(def);
return wrapParams(req, m);
@@ -150,9 +195,8 @@ public class ClusterAPI {
}
@Command(name = "set-property")
- @SuppressWarnings({"rawtypes", "unchecked"})
public void setProperty(PayloadObj<Map<String,String>> obj) throws Exception {
- Map m = obj.get();
+ Map<String,Object> m = obj.getDataMap();
m.put("action", CLUSTERPROP.toString());
collectionsHandler.handleRequestBody(wrapParams(obj.getRequest(),m ), obj.getResponse());
}
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ConfigSetsHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/ConfigSetsHandler.java
index 728bf9f..2f499b7 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ConfigSetsHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ConfigSetsHandler.java
@@ -19,7 +19,6 @@ package org.apache.solr.handler.admin;
import java.io.InputStream;
import java.lang.invoke.MethodHandles;
import java.nio.charset.StandardCharsets;
-import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -29,7 +28,6 @@ import java.util.zip.ZipInputStream;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
-import org.apache.solr.api.Api;
import org.apache.solr.client.solrj.SolrResponse;
import org.apache.solr.cloud.OverseerSolrResponse;
import org.apache.solr.cloud.OverseerSolrResponseSerializer;
@@ -66,17 +64,16 @@ import static org.apache.solr.common.params.CommonParams.NAME;
import static org.apache.solr.common.params.ConfigSetParams.ConfigSetAction.CREATE;
import static org.apache.solr.common.params.ConfigSetParams.ConfigSetAction.DELETE;
import static org.apache.solr.common.params.ConfigSetParams.ConfigSetAction.LIST;
-import static org.apache.solr.handler.admin.ConfigSetsHandlerApi.DEFAULT_CONFIGSET_NAME;
/**
* A {@link org.apache.solr.request.SolrRequestHandler} for ConfigSets API requests.
*/
public class ConfigSetsHandler extends RequestHandlerBase implements PermissionNameProvider {
+ final public static String DEFAULT_CONFIGSET_NAME = "_default";
+ final public static String AUTOCREATED_CONFIGSET_SUFFIX = ".AUTOCREATED";
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
protected final CoreContainer coreContainer;
public static long DEFAULT_ZK_TIMEOUT = 300 * 1000;
- private final ConfigSetsHandlerApi configSetsHandlerApi = new ConfigSetsHandlerApi(this);
-
/**
* Overloaded ctor to inject CoreContainer into the handler.
*
@@ -86,6 +83,14 @@ public class ConfigSetsHandler extends RequestHandlerBase implements PermissionN
this.coreContainer = coreContainer;
}
+ public static String getSuffixedNameForAutoGeneratedConfigSet(String configName) {
+ return configName + AUTOCREATED_CONFIGSET_SUFFIX;
+ }
+
+ public static boolean isAutoGeneratedConfigSet(String configName) {
+ return configName != null && configName.endsWith(AUTOCREATED_CONFIGSET_SUFFIX);
+ }
+
@Override
public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
@@ -267,10 +272,10 @@ public class ConfigSetsHandler extends RequestHandlerBase implements PermissionN
return Category.ADMIN;
}
- enum ConfigSetOperation {
+ public enum ConfigSetOperation {
CREATE_OP(CREATE) {
@Override
- Map<String, Object> call(SolrQueryRequest req, SolrQueryResponse rsp, ConfigSetsHandler h) throws Exception {
+ public Map<String, Object> call(SolrQueryRequest req, SolrQueryResponse rsp, ConfigSetsHandler h) throws Exception {
String baseConfigSetName = req.getParams().get(BASE_CONFIGSET, DEFAULT_CONFIGSET_NAME);
Map<String, Object> props = CollectionsHandler.copy(req.getParams().required(), null, NAME);
props.put(BASE_CONFIGSET, baseConfigSetName);
@@ -279,14 +284,14 @@ public class ConfigSetsHandler extends RequestHandlerBase implements PermissionN
},
DELETE_OP(DELETE) {
@Override
- Map<String, Object> call(SolrQueryRequest req, SolrQueryResponse rsp, ConfigSetsHandler h) throws Exception {
+ public Map<String, Object> call(SolrQueryRequest req, SolrQueryResponse rsp, ConfigSetsHandler h) throws Exception {
return CollectionsHandler.copy(req.getParams().required(), null, NAME);
}
},
@SuppressWarnings({"unchecked"})
LIST_OP(LIST) {
@Override
- Map<String, Object> call(SolrQueryRequest req, SolrQueryResponse rsp, ConfigSetsHandler h) throws Exception {
+ public Map<String, Object> call(SolrQueryRequest req, SolrQueryResponse rsp, ConfigSetsHandler h) throws Exception {
NamedList<Object> results = new NamedList<>();
SolrZkClient zk = h.coreContainer.getZkController().getZkStateReader().getZkClient();
ZkConfigManager zkConfigManager = new ZkConfigManager(zk);
@@ -304,7 +309,7 @@ public class ConfigSetsHandler extends RequestHandlerBase implements PermissionN
this.action = action;
}
- abstract Map<String, Object> call(SolrQueryRequest req, SolrQueryResponse rsp, ConfigSetsHandler h) throws Exception;
+ public abstract Map<String, Object> call(SolrQueryRequest req, SolrQueryResponse rsp, ConfigSetsHandler h) throws Exception;
public static ConfigSetOperation get(ConfigSetAction action) {
for (ConfigSetOperation op : values()) {
@@ -315,16 +320,6 @@ public class ConfigSetsHandler extends RequestHandlerBase implements PermissionN
}
@Override
- public Collection<Api> getApis() {
- return configSetsHandlerApi.getApis();
- }
-
- @Override
- public Boolean registerV2() {
- return Boolean.TRUE;
- }
-
- @Override
public Name getPermissionName(AuthorizationContext ctx) {
String a = ctx.getParams().get(ConfigSetParams.ACTION);
if (a != null) {
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ConfigSetsHandlerApi.java b/solr/core/src/java/org/apache/solr/handler/admin/ConfigSetsHandlerApi.java
deleted file mode 100644
index 30450a8..0000000
--- a/solr/core/src/java/org/apache/solr/handler/admin/ConfigSetsHandlerApi.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.solr.handler.admin;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.solr.client.solrj.request.CollectionApiMapping;
-import org.apache.solr.client.solrj.request.CollectionApiMapping.ConfigSetMeta;
-import org.apache.solr.handler.admin.ConfigSetsHandler.ConfigSetOperation;
-import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.response.SolrQueryResponse;
-
-public class ConfigSetsHandlerApi extends BaseHandlerApiSupport {
-
- final public static String DEFAULT_CONFIGSET_NAME = "_default";
- final public static String AUTOCREATED_CONFIGSET_SUFFIX = ".AUTOCREATED";
-
-
- final ConfigSetsHandler configSetHandler;
- static Collection<ApiCommand> apiCommands = createMapping();
-
- public static String getSuffixedNameForAutoGeneratedConfigSet(String configName) {
- return configName + AUTOCREATED_CONFIGSET_SUFFIX;
- }
-
- public static boolean isAutoGeneratedConfigSet(String configName) {
- return configName != null && configName.endsWith(AUTOCREATED_CONFIGSET_SUFFIX);
- }
-
- private static Collection<ApiCommand> createMapping() {
- Map<ConfigSetMeta, ApiCommand> result = new EnumMap<>(ConfigSetMeta.class);
-
- for (ConfigSetMeta meta : ConfigSetMeta.values())
- for (ConfigSetOperation op : ConfigSetOperation.values()) {
- if (op.action == meta.action) {
- result.put(meta, new ApiCommand() {
- @Override
- public CollectionApiMapping.CommandMeta meta() {
- return meta;
- }
-
- @Override
- public void invoke(SolrQueryRequest req, SolrQueryResponse rsp, BaseHandlerApiSupport apiHandler) throws Exception {
- ((ConfigSetsHandlerApi) apiHandler).configSetHandler.invokeAction(req, rsp, op.action);
- }
- });
- }
- }
-
- for (ConfigSetMeta meta : ConfigSetMeta.values()) {
- if(result.get(meta) == null){
- throw new RuntimeException("No implementation for "+ meta.name());
- }
- }
-
- return result.values();
- }
-
- public ConfigSetsHandlerApi(ConfigSetsHandler configSetHandler) {
- this.configSetHandler = configSetHandler;
- }
-
-
- @Override
- protected Collection<ApiCommand> getCommands() {
- return apiCommands;
- }
-
- @Override
- protected List<CollectionApiMapping.V2EndPoint> getEndPoints() {
- return Arrays.asList(CollectionApiMapping.ConfigSetEndPoint.values());
- }
-
-}
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 9d35e40..91227e0 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
@@ -30,7 +30,6 @@ import java.util.stream.Stream;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.common.params.CollectionParams.CollectionAction;
-import org.apache.solr.common.params.ConfigSetParams.ConfigSetAction;
import org.apache.solr.common.util.CommandOperation;
import org.apache.solr.common.util.Pair;
import org.apache.solr.common.util.Utils;
@@ -38,9 +37,6 @@ import org.apache.solr.common.util.Utils;
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.ConfigSetEndPoint.CONFIG_COMMANDS;
-import static org.apache.solr.client.solrj.request.CollectionApiMapping.ConfigSetEndPoint.CONFIG_DEL;
-import static org.apache.solr.client.solrj.request.CollectionApiMapping.ConfigSetEndPoint.LIST_CONFIG;
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;
@@ -181,23 +177,6 @@ public class CollectionApiMapping {
NAME, "collection",
"propertyName", "name",
"propertyValue", "value")),
-/* ADD_ROLE(CLUSTER_CMD,
- POST,
- ADDROLE,
- "add-role",null),*/
-/* REMOVE_ROLE(CLUSTER_CMD,
- POST,
- REMOVEROLE,
- "remove-role",null),*/
-
- /* SET_CLUSTER_PROPERTY(CLUSTER_CMD,
- POST,
- CLUSTERPROP,
- "set-property",null),*/
- /* SET_CLUSTER_PROPERTY_OBJ(CLUSTER_CMD,
- POST,
- null,
- "set-obj-property", null),*/
BACKUP_COLLECTION(COLLECTIONS_COMMANDS,
POST,
BACKUP,
@@ -360,60 +339,6 @@ public class CollectionApiMapping {
String getSpecName();
}
- public enum ConfigSetMeta implements CommandMeta {
- LIST(LIST_CONFIG, GET,null, ConfigSetAction.LIST),
- CREATE(CONFIG_COMMANDS, POST, "create", ConfigSetAction.CREATE),
- DEL(CONFIG_DEL, DELETE, null, ConfigSetAction.DELETE)
- ;
- public final ConfigSetEndPoint endPoint;
- public final SolrRequest.METHOD method;
- public final String cmdName;
- public final ConfigSetAction action;
-
-
- ConfigSetMeta(ConfigSetEndPoint endPoint, SolrRequest.METHOD method, String cmdName, ConfigSetAction action) {
- this.cmdName = cmdName;
- this.endPoint = endPoint;
- this.method = method;
- this.action = action;
- }
-
- @Override
- public String getName() {
- return cmdName;
- }
-
- @Override
- public SolrRequest.METHOD getHttpMethod() {
- return method;
- }
-
- @Override
- public V2EndPoint getEndPoint() {
- return endPoint;
- }
-
-
- }
- public enum ConfigSetEndPoint implements V2EndPoint {
- LIST_CONFIG("cluster.configs"),
- CONFIG_COMMANDS("cluster.configs.Commands"),
- CONFIG_DEL("cluster.configs.delete");
-
- public final String spec;
-
- ConfigSetEndPoint(String spec) {
- this.spec = spec;
- }
-
- @Override
- public String getSpecName() {
- return spec;
- }
- }
-
-
-
@SuppressWarnings({"unchecked", "rawtypes"})
private static Collection<String> getParamNames_(CommandOperation op, CommandMeta command) {
Object o = op.getCommandData();
diff --git a/solr/solrj/src/java/org/apache/solr/common/MapSerializable.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/CreateConfigInfo.java
similarity index 67%
copy from solr/solrj/src/java/org/apache/solr/common/MapSerializable.java
copy to solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/CreateConfigInfo.java
index f56f1b2..5cd10b6 100644
--- a/solr/solrj/src/java/org/apache/solr/common/MapSerializable.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/beans/CreateConfigInfo.java
@@ -14,18 +14,19 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.solr.common;
+package org.apache.solr.client.solrj.request.beans;
import java.util.Map;
-/**This is to facilitate just in time creation of objects before writing
- * it to the response.
- */
-public interface MapSerializable {
- /**Use the passed map to minimize object creation.
- * Do not keep a reference to the passed map and reuse it.
- * it may be reused by the framework
- */
- @SuppressWarnings({"rawtypes"})
- Map toMap(Map<String, Object> map);
+import org.apache.solr.common.annotation.JsonProperty;
+import org.apache.solr.common.util.ReflectMapWriter;
+
+public class CreateConfigInfo implements ReflectMapWriter {
+ @JsonProperty(required = true)
+ public String name;
+ @JsonProperty
+ public String baseConfigSet;
+ @JsonProperty
+ public Map<String,Object> properties;
+
}
diff --git a/solr/solrj/src/java/org/apache/solr/common/MapSerializable.java b/solr/solrj/src/java/org/apache/solr/common/MapSerializable.java
index f56f1b2..14f06d7 100644
--- a/solr/solrj/src/java/org/apache/solr/common/MapSerializable.java
+++ b/solr/solrj/src/java/org/apache/solr/common/MapSerializable.java
@@ -26,6 +26,5 @@ public interface MapSerializable {
* Do not keep a reference to the passed map and reuse it.
* it may be reused by the framework
*/
- @SuppressWarnings({"rawtypes"})
- Map toMap(Map<String, Object> map);
+ Map<String,Object> toMap(Map<String, Object> map);
}
diff --git a/solr/solrj/src/java/org/apache/solr/common/MapWriter.java b/solr/solrj/src/java/org/apache/solr/common/MapWriter.java
index 7266410..f98f269 100644
--- a/solr/solrj/src/java/org/apache/solr/common/MapWriter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/MapWriter.java
@@ -41,7 +41,7 @@ public interface MapWriter extends MapSerializable , NavigableObject {
@Override
@SuppressWarnings({"unchecked", "rawtypes"})
- default Map toMap(Map<String, Object> map) {
+ default Map<String, Object> toMap(Map<String, Object> map) {
try {
writeMap(new EntryWriter() {
@Override
diff --git a/solr/solrj/src/resources/apispec/cluster.configs.Commands.json b/solr/solrj/src/resources/apispec/cluster.configs.Commands.json
deleted file mode 100644
index f8b3b3a..0000000
--- a/solr/solrj/src/resources/apispec/cluster.configs.Commands.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "documentation": "https://lucene.apache.org/solr/guide/configsets-api.html#configsets-create",
- "description": "Create configsets.",
- "methods": [
- "POST"
- ],
- "url": {
- "paths": [
- "/cluster/configs"]
- },
- "commands": {
- "create": {
- "type" :"object",
- "description": "Create a configset, based on another configset already in ZooKeeper.",
- "documentation": "https://lucene.apache.org/solr/guide/configsets-api.html#configsets-create",
- "properties": {
- "name" :{
- "type" :"string",
- "description" : "The name of the configset to be created."
- },
- "baseConfigSet":{
- "type" : "string",
- "description" :"The existing configset to copy as the basis for the new one."
- },
- "properties" : {
- "type":"object",
- "description": "Additional key-value pairs, in the form of 'ConfigSetProp.<key>=<value>', as needed. These properties will override the same properties in the base configset.",
- "additionalProperties" : true
- }
- },
- "required" : ["name"]
- }
- }
-}
diff --git a/solr/solrj/src/resources/apispec/cluster.configs.delete.json b/solr/solrj/src/resources/apispec/cluster.configs.delete.json
deleted file mode 100644
index 20985b8..0000000
--- a/solr/solrj/src/resources/apispec/cluster.configs.delete.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "documentation": "https://lucene.apache.org/solr/guide/configsets-api.html#configsets-delete",
- "description": "Delete configsets. The name of the configset to delete must be provided as a path parameter.",
- "methods": [
- "DELETE"
- ],
- "url": {
- "paths": [
- "/cluster/configs/{name}"
- ]
- }
-}
diff --git a/solr/solrj/src/resources/apispec/cluster.configs.json b/solr/solrj/src/resources/apispec/cluster.configs.json
deleted file mode 100644
index 45d91d9..0000000
--- a/solr/solrj/src/resources/apispec/cluster.configs.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "documentation": "https://lucene.apache.org/solr/guide/configsets-api.html#configsets-list",
- "description": "List all configsets in the cluster.",
- "methods": [
- "GET"
- ],
- "url": {
- "paths": [
- "/cluster/configs"
- ]
- }
-}