SOLR-8378: Add upconfig and downconfig commands to the bin/solr script

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1719099 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Erick Erickson 2015-12-10 15:32:33 +00:00
parent ddb3a97678
commit 99550b5c8a
4 changed files with 444 additions and 73 deletions

View File

@ -208,6 +208,9 @@ New Features
* SOLR-7928: Improve CheckIndex to work against HdfsDirectory
(Mike Drob, Gregory Chanan)
* SOLR-8378: Add upconfig and downconfig commands to the bin/solr script
(Erick Erickson)
Bug Fixes
----------------------

View File

@ -188,13 +188,13 @@ function print_usage() {
if [ -z "$CMD" ]; then
echo ""
echo "Usage: solr COMMAND OPTIONS"
echo " where COMMAND is one of: start, stop, restart, status, healthcheck, create, create_core, create_collection, delete, version"
echo " where COMMAND is one of: start, stop, restart, status, healthcheck, create, create_core, create_collection, delete, version, zk"
echo ""
echo " Standalone server example (start Solr running in the background on port 8984):"
echo ""
echo " ./solr start -p 8984"
echo ""
echo " SolrCloud example (start Solr running in SolrCloud mode using localhost:2181 to connect to ZooKeeper, with 1g max heap size and remote Java debug options enabled):"
echo " SolrCloud example (start Solr running in SolrCloud mode using localhost:2181 to connect to Zookeeper, with 1g max heap size and remote Java debug options enabled):"
echo ""
echo " ./solr start -c -m 1g -z localhost:2181 -a \"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044\""
echo ""
@ -208,7 +208,7 @@ function print_usage() {
echo " -f Start Solr in foreground; default starts Solr in the background"
echo " and sends stdout / stderr to solr-PORT-console.log"
echo ""
echo " -c or -cloud Start Solr in SolrCloud mode; if -z not supplied, an embedded ZooKeeper"
echo " -c or -cloud Start Solr in SolrCloud mode; if -z not supplied, an embedded Zookeeper"
echo " instance is started on Solr port+1000, such as 9983 if Solr is bound to 8983"
echo ""
echo " -h <host> Specify the hostname for this Solr instance"
@ -220,8 +220,8 @@ function print_usage() {
echo ""
echo " -d <dir> Specify the Solr server directory; defaults to server"
echo ""
echo " -z <zkHost> ZooKeeper connection string; only used when running in SolrCloud mode using -c"
echo " To launch an embedded ZooKeeper instance, don't pass this parameter."
echo " -z <zkHost> Zookeeper connection string; only used when running in SolrCloud mode using -c"
echo " To launch an embedded Zookeeper instance, don't pass this parameter."
echo ""
echo " -m <memory> Sets the min (-Xms) and max (-Xmx) heap size for the JVM, such as: -m 4g"
echo " results in: -Xms4g -Xmx4g; by default, this script sets the heap size to 512m"
@ -229,7 +229,7 @@ function print_usage() {
echo " -s <dir> Sets the solr.solr.home system property; Solr will create core directories under"
echo " this directory. This allows you to run multiple Solr instances on the same host"
echo " while reusing the same server directory set using the -d parameter. If set, the"
echo " specified directory should contain a solr.xml file, unless solr.xml exists in ZooKeeper."
echo " specified directory should contain a solr.xml file, unless solr.xml exists in Zookeeper."
echo " This parameter is ignored when running examples (-e), as the solr.solr.home depends"
echo " on which example is run. The default value is server/solr."
echo ""
@ -266,7 +266,7 @@ function print_usage() {
echo ""
echo " -c <collection> Collection to run healthcheck against."
echo ""
echo " -z <zkHost> ZooKeeper connection string; default is localhost:9983"
echo " -z <zkHost> Zookeeper connection string; default is localhost:9983"
echo ""
elif [ "$CMD" == "status" ]; then
echo ""
@ -294,12 +294,12 @@ function print_usage() {
echo ""
echo " Deletes a core or collection depending on whether Solr is running in standalone (core) or SolrCloud"
echo " mode (collection). If you're deleting a collection in SolrCloud mode, the default behavior is to also"
echo " delete the configuration directory from ZooKeeper so long as it is not being used by another collection."
echo " delete the configuration directory from Zookeeper so long as it is not being used by another collection."
echo " You can override this behavior by passing -deleteConfig false when running this command."
echo ""
echo " -c <name> Name of the core / collection to delete"
echo ""
echo " -deleteConfig <boolean> Delete the configuration directory from ZooKeeper; default is true"
echo " -deleteConfig <boolean> Delete the configuration directory from Zookeeper; default is true"
echo ""
echo " -p <port> Port of a local Solr instance where you want to delete the core/collection"
echo " If not specified, the script will search the local system for a running"
@ -345,14 +345,14 @@ function print_usage() {
echo " Alternatively, you can pass the path to your own configuration directory instead of using"
echo " one of the built-in configurations, such as: bin/solr create_collection -c mycoll -d /tmp/myconfig"
echo ""
echo " By default the script will upload the specified confdir directory into ZooKeeper using the same"
echo " By default the script will upload the specified confdir directory into Zookeeper using the same"
echo " name as the collection (-c) option. Alternatively, if you want to reuse an existing directory"
echo " or create a confdir in ZooKeeper that can be shared by multiple collections, use the -n option"
echo " or create a confdir in Zookeeper that can be shared by multiple collections, use the -n option"
echo ""
echo " -n <configName> Name the configuration directory in ZooKeeper; by default, the configuration"
echo " will be uploaded to ZooKeeper using the collection name (-c), but if you want"
echo " -n <configName> Name the configuration directory in Zookeeper; by default, the configuration"
echo " will be uploaded to Zookeeper using the collection name (-c), but if you want"
echo " to use an existing directory or override the name of the configuration in"
echo " ZooKeeper, then use the -c option."
echo " Zookeeper, then use the -c option."
echo ""
echo " -shards <#> Number of shards to split the collection into; default is 1"
echo ""
@ -362,6 +362,26 @@ function print_usage() {
echo " If not specified, the script will search the local system for a running"
echo " Solr instance and will use the port of the first server it finds."
echo ""
elif [ "$CMD" == "zk" ]; then
echo "Usage: solr zk [-upconfig|-downconfig] [-d confdir] [-n configName] [-z zkHost]"
echo ""
echo " -upconfig to move a configset from the local machine to Zookeeper."
echo ""
echo " -downconfig to move a configset from Zookeeper to the local machine."
echo ""
echo " -n configName Name of the configset in Zookeeper that will be the destinatino of"
echo " 'upconfig' and the source for 'downconfig'."
echo ""
echo " -d confdir The local directory the configuration will be uploaded from for"
echo " 'upconfig' or downloaded to for 'downconfig'. For 'upconfig', this"
echo " can be one of the example configsets, basic_configs, data_driven_schema_configs or"
echo " sample_techproducts_configs or an arbitrary directory."
echo ""
echo " -z zkHost Zookeeper connection string."
echo ""
echo " NOTE: Solr must have been started least once (or have it running) before using this command."
echo " This initialized Zookeeper for Solr"
echo ""
fi
} # end print_usage
@ -694,7 +714,7 @@ if [[ "$SCRIPT_CMD" == "create" || "$SCRIPT_CMD" == "create_core" || "$SCRIPT_CM
exit 1
fi
# If not defined, use the collection name for the name of the configuration in ZooKeeper
# If not defined, use the collection name for the name of the configuration in Zookeeper
if [ -z "$CREATE_CONFNAME" ]; then
CREATE_CONFNAME="$CREATE_NAME"
fi
@ -784,7 +804,7 @@ if [[ "$SCRIPT_CMD" == "delete" ]]; then
exit 1
fi
# If not defined, use the collection name for the name of the configuration in ZooKeeper
# If not defined, use the collection name for the name of the configuration in Zookeeper
if [ -z "$DELETE_CONFIG" ]; then
DELETE_CONFIG=true
fi
@ -810,6 +830,97 @@ if [[ "$SCRIPT_CMD" == "delete" ]]; then
exit $?
fi
# Upload or download a configset to Zookeeper
if [[ "$SCRIPT_CMD" == "zk" ]]; then
if [ $# -gt 0 ]; then
while true; do
case "$1" in
-z|-zkhost)
if [[ -z "$2" || "${2:0:1}" == "-" ]]; then
print_usage "$SCRIPT_CMD" "ZooKeepeer connection string is required when using the $1 option!"
exit 1
fi
ZK_HOST="$2"
shift 2
;;
-n|-confname)
if [[ -z "$2" || "${2:0:1}" == "-" ]]; then
print_usage "$SCRIPT_CMD" "Configuration name is required when using the $1 option!"
exit 1
fi
CONFIGSET_CONFNAME="$2"
shift 2
;;
-d|-confdir)
if [[ -z "$2" || "${2:0:1}" == "-" ]]; then
print_usage "$SCRIPT_CMD" "Configuration directory is required when using the $1 option!"
exit 1
fi
CONFIGSET_CONFDIR="$2"
shift 2
;;
-upconfig)
ZK_OP="upconfig"
shift 1
;;
-downconfig)
ZK_OP="downconfig"
shift 1
;;
-help|-usage|-h)
print_usage "$SCRIPT_CMD"
exit 0
;;
--)
shift
break
;;
*)
if [ "$1" != "" ]; then
print_usage "$SCRIPT_CMD" "Unrecognized or misplaced argument: $1!"
exit 1
else
break # out-of-args, stop looping
fi
;;
esac
done
fi
if [ -z "$ZK_OP" ]; then
echo "Zookeeper operation (one of '-upconfig' or '-downconfig') is required!"
print_usage "$SCRIPT_CMD"
exit 1
fi
if [ -z "$ZK_HOST" ]; then
echo "Zookeeper address (-z) argument is required!"
print_usage "$SCRIPT_CMD"
exit 1
fi
if [ -z "$CONFIGSET_CONFDIR" ]; then
echo "Local directory of the configset (-d) argument is required!"
print_usage "$SCRIPT_CMD"
exit 1
fi
if [ -z "$CONFIGSET_CONFNAME" ]; then
echo "Configset name on Zookeeper (-n) argument is required!"
print_usage "$SCRIPT_CMD"
exit 1
fi
if [ "$ZK_OP" == "upconfig" ]; then
run_tool "$ZK_OP" -confname "$CONFIGSET_CONFNAME" -confdir "$CONFIGSET_CONFDIR" -zkHost "$ZK_HOST" -configsetsDir "$SOLR_TIP/server/solr/configsets"
else
run_tool "$ZK_OP" -confname "$CONFIGSET_CONFNAME" -confdir "$CONFIGSET_CONFDIR" -zkHost "$ZK_HOST"
fi
exit $?
fi
# verify the command given is supported
if [ "$SCRIPT_CMD" != "stop" ] && [ "$SCRIPT_CMD" != "start" ] && [ "$SCRIPT_CMD" != "restart" ] && [ "$SCRIPT_CMD" != "status" ]; then
print_usage "" "$SCRIPT_CMD is not a valid command!"
@ -900,7 +1011,7 @@ if [ $# -gt 0 ]; then
;;
-z|-zkhost)
if [[ -z "$2" || "${2:0:1}" == "-" ]]; then
print_usage "$SCRIPT_CMD" "ZooKeeper connection string is required when using the $1 option!"
print_usage "$SCRIPT_CMD" "Zookeeper connection string is required when using the $1 option!"
exit 1
fi
ZK_HOST="$2"
@ -1174,7 +1285,7 @@ if [ "$SOLR_MODE" == 'solrcloud' ]; then
CLOUD_MODE_OPTS+=("-DzkHost=$ZK_HOST")
else
if $verbose ; then
echo "Configuring SolrCloud to launch an embedded ZooKeeper using -DzkRun"
echo "Configuring SolrCloud to launch an embedded Zookeeper using -DzkRun"
fi
CLOUD_MODE_OPTS+=('-DzkRun')

View File

@ -134,6 +134,12 @@ IF "%1"=="delete" (
SHIFT
goto parse_delete_args
)
IF "%1"=="zk" (
set SCRIPT_CMD=zk
SHIFT
goto parse_zk_args
)
goto parse_args
:usage
@ -152,18 +158,19 @@ IF "%SCRIPT_CMD%"=="create" goto create_usage
IF "%SCRIPT_CMD%"=="create_core" goto create_core_usage
IF "%SCRIPT_CMD%"=="create_collection" goto create_collection_usage
IF "%SCRIPT_CMD%"=="delete" goto delete_usage
IF "%SCRIPT_CMD%"=="zk" goto zk_usage
goto done
:script_usage
@echo.
@echo Usage: solr COMMAND OPTIONS
@echo where COMMAND is one of: start, stop, restart, healthcheck, create, create_core, create_collection, delete, version
@echo where COMMAND is one of: start, stop, restart, healthcheck, create, create_core, create_collection, delete, version, upconfig, downconfig
@echo.
@echo Standalone server example (start Solr running in the background on port 8984):
@echo.
@echo solr start -p 8984
@echo.
@echo SolrCloud example (start Solr running in SolrCloud mode using localhost:2181 to connect to ZooKeeper, with 1g max heap size and remote Java debug options enabled):
@echo SolrCloud example (start Solr running in SolrCloud mode using localhost:2181 to connect to Zookeeper, with 1g max heap size and remote Java debug options enabled):
@echo.
@echo solr start -c -m 1g -z localhost:2181 -a "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044"
@echo.
@ -179,7 +186,7 @@ goto done
@echo -f Start Solr in foreground; default starts Solr in the background
@echo and sends stdout / stderr to solr-PORT-console.log
@echo.
@echo -c or -cloud Start Solr in SolrCloud mode; if -z not supplied, an embedded ZooKeeper
@echo -c or -cloud Start Solr in SolrCloud mode; if -z not supplied, an embedded Zookeeper
@echo instance is started on Solr port+1000, such as 9983 if Solr is bound to 8983
@echo.
@echo -h host Specify the hostname for this Solr instance
@ -188,8 +195,8 @@ goto done
@echo.
@echo -d dir Specify the Solr server directory; defaults to example
@echo.
@echo -z zkHost ZooKeeper connection string; only used when running in SolrCloud mode using -c
@echo To launch an embedded ZooKeeper instance, don't pass this parameter.
@echo -z zkHost Zookeeper connection string; only used when running in SolrCloud mode using -c
@echo To launch an embedded Zookeeper instance, don't pass this parameter.
@echo.
@echo -m memory Sets the min (-Xms) and max (-Xmx) heap size for the JVM, such as: -m 4g
@echo results in: -Xms4g -Xmx4g; by default, this script sets the heap size to 512m
@ -197,7 +204,7 @@ goto done
@echo -s dir Sets the solr.solr.home system property; Solr will create core directories under
@echo this directory. This allows you to run multiple Solr instances on the same host
@echo while reusing the same server directory set using the -d parameter. If set, the
@echo specified directory should contain a solr.xml file, unless solr.xml exists in ZooKeeper.
@echo specified directory should contain a solr.xml file, unless solr.xml exists in Zookeeper.
@echo This parameter is ignored when running examples (-e), as the solr.solr.home depends
@echo on which example is run. The default value is server/solr.
@echo.
@ -236,7 +243,7 @@ goto done
@echo.
@echo -c collection Collection to run healthcheck against.
@echo.
@echo -z zkHost ZooKeeper connection string; default is localhost:9983
@echo -z zkHost Zookeeper connection string; default is localhost:9983
@echo.
goto done
@ -262,12 +269,12 @@ echo Usage: solr delete [-c name] [-deleteConfig boolean] [-p port]
echo.
echo Deletes a core or collection depending on whether Solr is running in standalone (core) or SolrCloud
echo mode (collection). If you're deleting a collection in SolrCloud mode, the default behavior is to also
echo delete the configuration directory from ZooKeeper so long as it is not being used by another collection.
echo delete the configuration directory from Zookeeper so long as it is not being used by another collection.
echo You can override this behavior by passing -deleteConfig false when running this command.
echo.
echo -c name Name of core to create
echo.
echo -deleteConfig boolean Delete the configuration directory from ZooKeeper; default is true
echo -deleteConfig boolean Delete the configuration directory from Zookeeper; default is true
echo.
echo -p port Port of a local Solr instance where you want to create the new core
echo If not specified, the script will search the local system for a running
@ -317,14 +324,14 @@ echo.
echo Alternatively, you can pass the path to your own configuration directory instead of using
echo one of the built-in configurations, such as: bin\solr create_collection -c mycoll -d c:/tmp/myconfig
echo.
echo By default the script will upload the specified confdir directory into ZooKeeper using the same
echo By default the script will upload the specified confdir directory into Zookeeper using the same
echo name as the collection (-c) option. Alternatively, if you want to reuse an existing directory
echo or create a confdir in ZooKeeper that can be shared by multiple collections, use the -n option
echo or create a confdir in Zookeeper that can be shared by multiple collections, use the -n option
echo.
echo -n configName Name the configuration directory in ZooKeeper; by default, the configuration
echo will be uploaded to ZooKeeper using the collection name (-c), but if you want
echo -n configName Name the configuration directory in Zookeeper; by default, the configuration
echo will be uploaded to Zookeeper using the collection name (-c), but if you want
echo to use an existing directory or override the name of the configuration in
echo ZooKeeper, then use the -c option.
echo Zookeeper, then use the -c option.
echo.
echo -shards # Number of shards to split the collection into
echo.
@ -336,6 +343,30 @@ echo Solr instance and will use the port of the first
echo.
goto done
:zk_usage
echo.
echo Usage: solr zk [-downconfig or -upconfig] [-d confdir] [-n configName] [-z zkHost]
echo.
echo -upconfig to move a configset from the local machine to Zookeeper
echo.
echo -downconfig to move a configset from Zookeeper to the local machine
echo.
echo -n configName Name of the configset in Zookeeper that will be the destination of
echo 'upconfig' and the source for 'downconfig'.
echo.
echo -d confdir The local directory the configuration will be uploaded from for
echo 'upconfig' or downloaded to for 'downconfig'. For 'upconfig', this
echo can be one of the example configsets, basic_configs, data_driven_schema_configs or
echo sample_techproducts_configs or an arbitrary directory.
echo.
echo -z zkHost Zookeeper connection string.
echo.
echo NOTE: Solr must have been started least once (or have it running) before using this command.
echo This initialized Zookeeper for Solr
echo.
goto done
REM Really basic command-line arg parsing
:parse_args
@ -540,13 +571,13 @@ goto parse_args
set "arg=%~2"
IF "%arg%"=="" (
set SCRIPT_ERROR=ZooKeeper connection string is required!
set SCRIPT_ERROR=Zookeeper connection string is required!
goto invalid_cmd_line
)
set firstChar=%arg:~0,1%
IF "%firstChar%"=="-" (
set SCRIPT_ERROR=Expected ZooKeeper connection string but found %2 instead!
set SCRIPT_ERROR=Expected Zookeeper connection string but found %2 instead!
goto invalid_cmd_line
)
@ -783,7 +814,7 @@ IF "%SOLR_MODE%"=="solrcloud" (
IF NOT "%ZK_HOST%"=="" (
set "CLOUD_MODE_OPTS=!CLOUD_MODE_OPTS! -DzkHost=%ZK_HOST%"
) ELSE (
IF "%verbose%"=="1" echo Configuring SolrCloud to launch an embedded ZooKeeper using -DzkRun
IF "%verbose%"=="1" echo Configuring SolrCloud to launch an embedded Zookeeper using -DzkRun
set "CLOUD_MODE_OPTS=!CLOUD_MODE_OPTS! -DzkRun"
)
IF EXIST "%SOLR_HOME%\collection1\core.properties" set "CLOUD_MODE_OPTS=!CLOUD_MODE_OPTS! -Dbootstrap_confdir=./solr/collection1/conf -Dcollection.configName=myconf -DnumShards=1"
@ -1143,6 +1174,81 @@ org.apache.solr.util.SolrCLI delete -name !DELETE_NAME! -deleteConfig !DELETE_CO
goto done
:parse_zk_args
IF [%1]==[] goto run_zk
IF "%1"=="-upconfig" goto set_zk_op_up
IF "%1"=="-downconfig" goto set_zk_op_down
IF "%1"=="-n" goto set_config_name
IF "%1"=="-configname" goto set_config_name
IF "%1"=="-d" goto set_configdir
IF "%1"=="-confdir" goto set_configdir
IF "%1"=="-z" goto set_config_zk
IF "%1"=="/?" goto usage
IF "%1"=="-h" goto zk_usage
IF "%1"=="-help" goto zk_usage
goto run_zk
:set_zk_op_up
set ZK_OP=upconfig
SHIFT
goto parse_zk_args
:set_zk_op_down
set ZK_OP=downconfig
SHIFT
goto parse_zk_args
:set_config_name
set CONFIGSET_NAME=%~2
SHIFT
SHIFT
goto parse_zk_args
:set_configdir
set CONFIGSET_DIR=%~2
SHIFT
SHIFT
goto parse_zk_args
:set_config_zk
set CONFIGSET_ZK=%~2
SHIFT
SHIFT
goto parse_zk_args
:run_zk
IF "!ZK_OP!"=="" (
set "SCRIPT_ERROR=One of '-upconfig' or '-downconfig' is required for %SCRIPT_CMD%"
goto invalid_cmd_line
)
IF "!CONFIGSET_NAME!"=="" (
set "SCRIPT_ERROR=Name (-n) is a required parameter for %SCRIPT_CMD%"
goto invalid_cmd_line
)
if "!CONFIGSET_DIR!"=="" (
set "SCRIPT_ERROR=Name (-d) is a required parameter for %SCRIPT_CMD%"
goto err
)
if "!CONFIGSET_ZK!"=="" (
set "SCRIPT_ERROR=Name (-z) is a required parameter for %SCRIPT_CMD%"
goto err
)
IF "!ZK_OP!"=="upconfig" (
"%JAVA%" %SOLR_SSL_OPTS% -Dsolr.install.dir="%SOLR_TIP%" -Dlog4j.configuration="file:%DEFAULT_SERVER_DIR%\scripts\cloud-scripts\log4j.properties" ^
-classpath "%DEFAULT_SERVER_DIR%\solr-webapp\webapp\WEB-INF\lib\*;%DEFAULT_SERVER_DIR%\lib\ext\*" ^
org.apache.solr.util.SolrCLI !ZK_OP! -confname !CONFIGSET_NAME! -confdir !CONFIGSET_DIR! -zkHost !CONFIGSET_ZK! -configsetsDir "%SOLR_TIP%/server/solr/configsets"
) ELSE (
"%JAVA%" %SOLR_SSL_OPTS% -Dsolr.install.dir="%SOLR_TIP%" -Dlog4j.configuration="file:%DEFAULT_SERVER_DIR%\scripts\cloud-scripts\log4j.properties" ^
-classpath "%DEFAULT_SERVER_DIR%\solr-webapp\webapp\WEB-INF\lib\*;%DEFAULT_SERVER_DIR%\lib\ext\*" ^
org.apache.solr.util.SolrCLI !ZK_OP! -confname !CONFIGSET_NAME! -confdir !CONFIGSET_DIR! -zkHost !CONFIGSET_ZK!
)
goto done
:invalid_cmd_line
@echo.
@ -1168,6 +1274,8 @@ IF "%FIRST_ARG%"=="start" (
goto create_core_usage
) ELSE IF "%FIRST_ARG%"=="create_collection" (
goto create_collection_usage
) ELSE IF "%FIRST_ARG%"=="zk" (
goto zk_usage
) ELSE (
goto script_usage
)

View File

@ -28,11 +28,15 @@ import java.net.Socket;
import java.net.SocketException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
@ -150,6 +154,45 @@ public class SolrCLI {
}
protected abstract void runImpl(CommandLine cli) throws Exception;
// It's a little awkward putting this in ToolBase, but to re-use it in upconfig and create, _and_ have access
// to the (possibly) redirected "stdout", it needs to go here unless we reorganize things a bit.
protected void upconfig(CloudSolrClient cloudSolrClient, CommandLine cli, String confname, String configSet) throws IOException {
File configSetDir = null;
// we try to be flexible and allow the user to specify a configuration directory instead of a configset name
File possibleConfigDir = new File(configSet);
if (possibleConfigDir.isDirectory()) {
configSetDir = possibleConfigDir;
} else {
File configsetsDir = new File(cli.getOptionValue("configsetsDir"));
if (!configsetsDir.isDirectory())
throw new FileNotFoundException(configsetsDir.getAbsolutePath() + " not found!");
// upload the configset if it exists
configSetDir = new File(configsetsDir, configSet);
if (!configSetDir.isDirectory()) {
throw new FileNotFoundException("Specified config " + configSet +
" not found in " + configsetsDir.getAbsolutePath());
}
}
File confDir = new File(configSetDir, "conf");
if (!confDir.isDirectory()) {
// config dir should contain a conf sub-directory but if not and there's a solrconfig.xml, then use it
if ((new File(configSetDir, "solrconfig.xml")).isFile()) {
confDir = configSetDir;
} else {
throw new IllegalArgumentException("Specified configuration directory " + configSetDir.getAbsolutePath() +
" is invalid;\nit should contain either conf sub-directory or solrconfig.xml");
}
}
//
echo("Uploading " + confDir.getAbsolutePath() +
" for config " + confname + " to ZooKeeper at " + cloudSolrClient.getZkHost());
cloudSolrClient.uploadConfig(confDir.toPath(), confname);
}
}
/**
@ -223,7 +266,7 @@ public class SolrCLI {
if (args == null || args.length == 0 || args[0] == null || args[0].trim().length() == 0) {
System.err.println("Invalid command-line args! Must pass the name of a tool to run.\n"
+ "Supported tools:\n");
displayToolOptions(System.err);
displayToolOptions();
exit(1);
}
@ -327,6 +370,10 @@ public class SolrCLI {
return new ConfigTool();
else if ("run_example".equals(toolType))
return new RunExampleTool();
else if ("upconfig".equals(toolType))
return new ConfigSetUploadTool();
else if ("downconfig".equals(toolType))
return new ConfigSetDownloadTool();
// If you add a built-in tool to this class, add it here to avoid
// classpath scanning
@ -340,7 +387,7 @@ public class SolrCLI {
throw new IllegalArgumentException(toolType + " not supported!");
}
private static void displayToolOptions(PrintStream out) throws Exception {
private static void displayToolOptions() throws Exception {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("healthcheck", getToolOptions(new HealthcheckTool()));
formatter.printHelp("status", getToolOptions(new StatusTool()));
@ -351,6 +398,8 @@ public class SolrCLI {
formatter.printHelp("delete", getToolOptions(new DeleteTool()));
formatter.printHelp("config", getToolOptions(new ConfigTool()));
formatter.printHelp("run_example", getToolOptions(new RunExampleTool()));
formatter.printHelp("upconfig", getToolOptions(new ConfigSetUploadTool()));
formatter.printHelp("downconfig", getToolOptions(new ConfigSetDownloadTool()));
List<Class<Tool>> toolClasses = findToolClassesInPackage("org.apache.solr.util");
for (Class<Tool> next : toolClasses) {
@ -1393,40 +1442,7 @@ public class SolrCLI {
} else if (configExistsInZk) {
echo("Re-using existing configuration directory "+confname);
} else {
String configSet = cli.getOptionValue("confdir", DEFAULT_CONFIG_SET);
File configSetDir = null;
// we try to be flexible and allow the user to specify a configuration directory instead of a configset name
File possibleConfigDir = new File(configSet);
if (possibleConfigDir.isDirectory()) {
configSetDir = possibleConfigDir;
} else {
File configsetsDir = new File(cli.getOptionValue("configsetsDir"));
if (!configsetsDir.isDirectory())
throw new FileNotFoundException(configsetsDir.getAbsolutePath()+" not found!");
// upload the configset if it exists
configSetDir = new File(configsetsDir, configSet);
if (!configSetDir.isDirectory()) {
throw new FileNotFoundException("Specified config " + configSet +
" not found in " + configsetsDir.getAbsolutePath());
}
}
File confDir = new File(configSetDir, "conf");
if (!confDir.isDirectory()) {
// config dir should contain a conf sub-directory but if not and there's a solrconfig.xml, then use it
if ((new File(configSetDir, "solrconfig.xml")).isFile()) {
confDir = configSetDir;
} else {
throw new IllegalArgumentException("Specified configuration directory "+configSetDir.getAbsolutePath()+
" is invalid;\nit should contain either conf sub-directory or solrconfig.xml");
}
}
// test to see if that config exists in ZK
echo("Uploading "+confDir.getAbsolutePath()+
" for config "+confname+" to ZooKeeper at "+cloudSolrClient.getZkHost());
cloudSolrClient.uploadConfig(confDir.toPath(), confname);
upconfig(cloudSolrClient, cli, confname, cli.getOptionValue("confdir", DEFAULT_CONFIG_SET));
}
// since creating a collection is a heavy-weight operation, check for existence first
@ -1639,6 +1655,139 @@ public class SolrCLI {
} // end CreateTool class
public static class ConfigSetUploadTool extends ToolBase {
public ConfigSetUploadTool() {
this(System.out);
}
public ConfigSetUploadTool(PrintStream stdout) {
super(stdout);
}
@SuppressWarnings("static-access")
public Option[] getOptions() {
return new Option[]{
OptionBuilder
.withArgName("confname") // Comes out in help message
.hasArg() // Has one sub-argument
.isRequired(true) // confname argument must be present
.withDescription("Configset name on Zookeeper")
.create("confname"), // passed as -confname value
OptionBuilder
.withArgName("confdir")
.hasArg()
.isRequired(true)
.withDescription("Local directory with configs")
.create("confdir"),
OptionBuilder
.withArgName("configsetsDir")
.hasArg()
.isRequired()
.withDescription("Parent directory of example configsets")
.create("configsetsDir"),
OptionBuilder
.withArgName("HOST")
.hasArg()
.isRequired(true)
.withDescription("Address of the Zookeeper ensemble; defaults to: " + ZK_HOST)
.create("zkHost")
};
}
public String getName() {
return "upconfig";
}
protected void runImpl(CommandLine cli) throws Exception {
String zkHost = getZkHost(cli);
if (zkHost == null) {
throw new IllegalStateException("Solr at " + cli.getOptionValue("solrUrl") +
" is running in standalone server mode, upconfig can only be used when running in SolrCloud mode.\n");
}
try (CloudSolrClient cloudSolrClient = new CloudSolrClient(zkHost)) {
echo("\nConnecting to ZooKeeper at " + zkHost + " ...");
cloudSolrClient.connect();
upconfig(cloudSolrClient, cli, cli.getOptionValue("confname"), cli.getOptionValue("confdir"));
}
}
}
public static class ConfigSetDownloadTool extends ToolBase {
public ConfigSetDownloadTool() {
this(System.out);
}
public ConfigSetDownloadTool(PrintStream stdout) {
super(stdout);
}
@SuppressWarnings("static-access")
public Option[] getOptions() {
return new Option[]{
OptionBuilder
.withArgName("confname")
.hasArg()
.isRequired(true)
.withDescription("Configset name on Zookeeper")
.create("confname"),
OptionBuilder
.withArgName("confdir")
.hasArg()
.isRequired(true)
.withDescription("Local directory with configs")
.create("confdir"),
OptionBuilder
.withArgName("HOST")
.hasArg()
.isRequired(true)
.withDescription("Address of the Zookeeper ensemble; defaults to: " + ZK_HOST)
.create("zkHost")
};
}
public String getName() {
return "downconfig";
}
protected void runImpl(CommandLine cli) throws Exception {
String zkHost = getZkHost(cli);
if (zkHost == null) {
throw new IllegalStateException("Solr at " + cli.getOptionValue("solrUrl") +
" is running in standalone server mode, downconfig can only be used when running in SolrCloud mode.\n");
}
try (CloudSolrClient cloudSolrClient = new CloudSolrClient(zkHost)) {
echo("\nConnecting to ZooKeeper at " + zkHost + " ...");
cloudSolrClient.connect();
downconfig(cloudSolrClient, cli.getOptionValue("confname"), cli.getOptionValue("confdir"));
}
}
protected void downconfig(CloudSolrClient cloudSolrClient, String confname, String confdir) throws IOException {
Path configSetPath = Paths.get(confdir);
// we try to be nice about having the "conf" in the directory, and we create it if it's not there.
if (configSetPath.endsWith("/conf") == false) {
configSetPath = Paths.get(configSetPath.toString(), "conf");
}
if (Files.exists(configSetPath) == false) {
Files.createDirectories(configSetPath);
}
// Try to download the configset
echo("Downloading configset " + confname + " from ZooKeeper at " + cloudSolrClient.getZkHost() +
" to directory " + configSetPath.toAbsolutePath());
cloudSolrClient.downloadConfig(confname, configSetPath);
}
} // End ConfigSetDownloadTool class
public static class DeleteTool extends ToolBase {
public DeleteTool() { this(System.out); }
@ -2486,13 +2635,13 @@ public class SolrCLI {
echo("Please choose a configuration for the "+collectionName+" collection, available options are:");
cloudConfig =
prompt(readInput, "basic_configs, data_driven_schema_configs, or sample_techproducts_configs ["+cloudConfig+"] ", cloudConfig);
prompt(readInput, "basic_configs, data_driven_schema_configs, sample_techproducts_configs, or managed_schema_configs ["+cloudConfig+"] ", cloudConfig);
// validate the cloudConfig name
while (!isValidConfig(configsetsDir, cloudConfig)) {
echo(cloudConfig+" is not a valid configuration directory! Please choose a configuration for the "+collectionName+" collection, available options are:");
cloudConfig =
prompt(readInput, "basic_configs, data_driven_schema_configs, or sample_techproducts_configs ["+cloudConfig+"] ", cloudConfig);
prompt(readInput, "basic_configs, data_driven_schema_configs, sample_techproducts_configs, or managed_schema_configs ["+cloudConfig+"] ", cloudConfig);
}
} else {
// must verify if default collection exists