You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ep...@apache.org on 2023/08/03 17:06:34 UTC

[solr] branch main updated: SOLR-16893: Remove deprecated create_core and create_collection CLI commands. (#1818)

This is an automated email from the ASF dual-hosted git repository.

epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new 5193a3bcd8f SOLR-16893: Remove deprecated create_core and create_collection CLI commands. (#1818)
5193a3bcd8f is described below

commit 5193a3bcd8f213281869941034cd6f49bbecfded
Author: Eric Pugh <ep...@opensourceconnections.com>
AuthorDate: Thu Aug 3 13:06:27 2023 -0400

    SOLR-16893: Remove deprecated create_core and create_collection CLI commands. (#1818)
    
    Use the "create" command regardless of standalone or SolrCloud mode.
---
 solr/CHANGES.txt                                   |   2 +
 solr/bin/solr                                      |   2 +-
 solr/bin/solr.cmd                                  |   8 -
 .../org/apache/solr/cli/CreateCollectionTool.java  | 280 ---------------------
 .../java/org/apache/solr/cli/CreateCoreTool.java   | 206 ---------------
 .../core/src/java/org/apache/solr/cli/SolrCLI.java |   4 +-
 .../apache/solr/cloud/SolrCloudExampleTest.java    |   4 +-
 solr/docker/tests/cases/create_core_exec/test.sh   |   2 +-
 solr/packaging/test/test_config.bats               |   4 +-
 solr/packaging/test/test_export.bats               |   2 +-
 solr/packaging/test/test_extraction.bats           |   6 +-
 solr/packaging/test/test_help.bats                 |  12 -
 solr/packaging/test/test_modules.bats              |   4 +-
 solr/packaging/test/test_packages.bats             |   2 +-
 solr/packaging/test/test_placement_plugin.bats     |   4 +-
 solr/packaging/test/test_post.bats                 |  18 +-
 solr/packaging/test/test_postlogs.bats             |   4 +-
 solr/packaging/test/test_security_manager.bats     |   2 +-
 .../modules/deployment-guide/pages/docker-faq.adoc |   6 +-
 .../deployment-guide/pages/docker-networking.adoc  |   2 +-
 .../pages/solr-control-script-reference.adoc       | 173 +------------
 .../deployment-guide/pages/solr-in-docker.adoc     |   6 +-
 22 files changed, 39 insertions(+), 714 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 01998993311..d2fd1e5556e 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -36,6 +36,8 @@ Deprecation Removals
 
 * SOLR-16823: Remove backcompatiblity of -upconfig and -downconfig for bin/solr zk upconfig and downconfig commands.  (Eric Pugh)
 
+* SOLR-16893: Remove bin/solr create_core and create_collection commands in favour of bin/solr create command.  (Eric Pugh)
+
 Dependency Upgrades
 ---------------------
 (No changes)
diff --git a/solr/bin/solr b/solr/bin/solr
index 396de287593..e78693bba29 100644
--- a/solr/bin/solr
+++ b/solr/bin/solr
@@ -836,7 +836,7 @@ if [ "$SCRIPT_CMD" == "config" ]; then
 fi
 
 # create a core or collection
-if [[ "$SCRIPT_CMD" == "create" || "$SCRIPT_CMD" == "create_core" || "$SCRIPT_CMD" == "create_collection" ]]; then
+if [[ "$SCRIPT_CMD" == "create" ]]; then
   run_tool $SCRIPT_CMD $@
   exit $?
 fi
diff --git a/solr/bin/solr.cmd b/solr/bin/solr.cmd
index 7936998ef20..f133a45d471 100755
--- a/solr/bin/solr.cmd
+++ b/solr/bin/solr.cmd
@@ -244,8 +244,6 @@ IF "%1"=="stop" goto set_script_cmd
 IF "%1"=="restart" goto set_script_cmd
 IF "%1"=="healthcheck" goto run_solrcli
 IF "%1"=="create" goto run_solrcli
-IF "%1"=="create_core" goto run_solrcli
-IF "%1"=="create_collection" goto run_solrcli
 IF "%1"=="delete" goto run_solrcli
 IF "%1"=="postlogs" goto run_solrcli
 IF "%1"=="zk" (
@@ -276,8 +274,6 @@ IF "%SCRIPT_CMD%"=="restart" goto start_usage
 IF "%SCRIPT_CMD%"=="stop" goto stop_usage
 IF "%SCRIPT_CMD%"=="healthcheck" goto run_solrcli
 IF "%SCRIPT_CMD%"=="create" goto run_solrcli
-IF "%SCRIPT_CMD%"=="create_core" goto run_solrcli
-IF "%SCRIPT_CMD%"=="create_collection" goto run_solrcli
 IF "%SCRIPT_CMD%"=="delete" goto run_solrcli
 IF  "%SCRIPT_CMD%"=="zk" goto zk_usage
 IF "%SCRIPT_CMD%"=="auth" goto auth_usage
@@ -1637,10 +1633,6 @@ IF "%FIRST_ARG%"=="start" (
   goto run_solrcli
 ) ELSE IF "%FIRST_ARG%"=="create" (
   goto run_solrcli
-) ELSE IF "%FIRST_ARG%"=="create_core" (
-  goto run_solrcli
-) ELSE IF "%FIRST_ARG%"=="create_collection" (
-  goto run_solrcli
 ) ELSE IF "%FIRST_ARG%"=="zk" (
   goto zk_short_usage
 ) ELSE IF "%FIRST_ARG%"=="auth" (
diff --git a/solr/core/src/java/org/apache/solr/cli/CreateCollectionTool.java b/solr/core/src/java/org/apache/solr/cli/CreateCollectionTool.java
deleted file mode 100644
index 48c4162dea8..00000000000
--- a/solr/core/src/java/org/apache/solr/cli/CreateCollectionTool.java
+++ /dev/null
@@ -1,280 +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.cli;
-
-import java.io.File;
-import java.io.PrintStream;
-import java.nio.file.Path;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-import java.util.Optional;
-import java.util.Set;
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.Option;
-import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.CloudHttp2SolrClient;
-import org.apache.solr.client.solrj.impl.CloudSolrClient;
-import org.apache.solr.client.solrj.request.CollectionAdminRequest;
-import org.apache.solr.common.cloud.ZkMaintenanceUtils;
-import org.apache.solr.common.cloud.ZkStateReader;
-import org.apache.solr.common.params.CollectionAdminParams;
-import org.apache.solr.common.util.NamedList;
-import org.apache.solr.core.ConfigSetService;
-import org.noggit.CharArr;
-import org.noggit.JSONWriter;
-
-/**
- * Supports create_collection command in the bin/solr script.
- *
- * @deprecated Please use {@link CreateTool}
- */
-@Deprecated(since = "9.4")
-public class CreateCollectionTool extends ToolBase {
-
-  public static final List<Option> CREATE_COLLECTION_OPTIONS =
-      List.of(
-          SolrCLI.OPTION_ZKHOST,
-          SolrCLI.OPTION_SOLRURL,
-          Option.builder("c")
-              .longOpt("name")
-              .argName("NAME")
-              .hasArg()
-              .required(true)
-              .desc("Name of collection to create.")
-              .build(),
-          Option.builder("s")
-              .longOpt("shards")
-              .argName("#")
-              .hasArg()
-              .required(false)
-              .desc("Number of shards; default is 1.")
-              .build(),
-          Option.builder("rf")
-              .longOpt("replicationFactor")
-              .argName("#")
-              .hasArg()
-              .required(false)
-              .desc(
-                  "Number of copies of each document across the collection (replicas per shard); default is 1.")
-              .build(),
-          Option.builder("d")
-              .longOpt("confdir")
-              .argName("NAME")
-              .hasArg()
-              .required(false)
-              .desc(
-                  "Configuration directory to copy when creating the new collection; default is "
-                      + SolrCLI.DEFAULT_CONFIG_SET
-                      + '.')
-              .build(),
-          Option.builder("n")
-              .longOpt("confname")
-              .argName("NAME")
-              .hasArg()
-              .required(false)
-              .desc("Configuration name; default is the collection name.")
-              .build(),
-          SolrCLI.OPTION_VERBOSE);
-
-  public CreateCollectionTool() {
-    this(CLIO.getOutStream());
-  }
-
-  public CreateCollectionTool(PrintStream stdout) {
-    super(stdout);
-  }
-
-  @Override
-  public String getName() {
-    return "create_collection";
-  }
-
-  @Override
-  public List<Option> getOptions() {
-    return CREATE_COLLECTION_OPTIONS;
-  }
-
-  @Override
-  public void runImpl(CommandLine cli) throws Exception {
-    SolrCLI.raiseLogLevelUnlessVerbose(cli);
-    echo("This command has been deprecated in favour of using 'bin/solr create'.");
-    String zkHost = SolrCLI.getZkHost(cli);
-    if (zkHost == null) {
-      throw new IllegalStateException(
-          "Solr at is running in standalone server mode, please use the create_core command instead;\n"
-              + "create_collection can only be used when running in SolrCloud mode.\n");
-    }
-
-    try (CloudHttp2SolrClient cloudSolrClient =
-        new CloudHttp2SolrClient.Builder(Collections.singletonList(zkHost), Optional.empty())
-            .build()) {
-      echoIfVerbose("\nConnecting to ZooKeeper at " + zkHost + " ...", cli);
-      cloudSolrClient.connect();
-      runCloudTool(cloudSolrClient, cli);
-    }
-  }
-
-  protected void runCloudTool(CloudSolrClient cloudSolrClient, CommandLine cli) throws Exception {
-
-    String collectionName = cli.getOptionValue("name");
-    final String solrInstallDir = System.getProperty("solr.install.dir");
-    String confName = cli.getOptionValue("confname");
-    String confDir = cli.getOptionValue("confdir", "_default");
-    ensureConfDirExists(confDir, solrInstallDir);
-    printDefaultConfigsetWarningIfNecessary(cli);
-
-    Set<String> liveNodes = cloudSolrClient.getClusterState().getLiveNodes();
-    if (liveNodes.isEmpty())
-      throw new IllegalStateException(
-          "No live nodes found! Cannot create a collection until "
-              + "there is at least 1 live node in the cluster.");
-
-    String solrUrl = cli.getOptionValue("solrUrl");
-    if (solrUrl == null) {
-      String firstLiveNode = liveNodes.iterator().next();
-      solrUrl = ZkStateReader.from(cloudSolrClient).getBaseUrlForNodeName(firstLiveNode);
-    }
-
-    // build a URL to create the collection
-    int numShards = Integer.parseInt(cli.getOptionValue("shards", String.valueOf(1)));
-    int replicationFactor =
-        Integer.parseInt(cli.getOptionValue("replicationFactor", String.valueOf(1)));
-
-    final String configsetsDir = solrInstallDir + "/server/solr/configsets";
-
-    boolean configExistsInZk =
-        confName != null
-            && !confName.trim().isEmpty()
-            && ZkStateReader.from(cloudSolrClient)
-                .getZkClient()
-                .exists("/configs/" + confName, true);
-
-    if (CollectionAdminParams.SYSTEM_COLL.equals(collectionName)) {
-      // do nothing
-    } else if (configExistsInZk) {
-      echo("Re-using existing configuration directory " + confName);
-    } else { // if (confdir != null && !confdir.trim().isEmpty()) {
-      if (confName == null || confName.trim().isEmpty()) {
-        confName = collectionName;
-      }
-      Path confPath = ConfigSetService.getConfigsetPath(confDir, configsetsDir);
-
-      echoIfVerbose(
-          "Uploading "
-              + confPath.toAbsolutePath()
-              + " for config "
-              + confName
-              + " to ZooKeeper at "
-              + cloudSolrClient.getClusterStateProvider().getQuorumHosts(),
-          cli);
-      ZkMaintenanceUtils.uploadToZK(
-          ZkStateReader.from(cloudSolrClient).getZkClient(),
-          confPath,
-          ZkMaintenanceUtils.CONFIGS_ZKNODE + "/" + confName,
-          ZkMaintenanceUtils.UPLOAD_FILENAME_EXCLUDE_PATTERN);
-    }
-
-    // since creating a collection is a heavy-weight operation, check for existence first
-    if (SolrCLI.safeCheckCollectionExists(solrUrl, collectionName)) {
-      throw new IllegalStateException(
-          "\nCollection '"
-              + collectionName
-              + "' already exists!\nChecked collection existence using CollectionAdminRequest");
-    }
-
-    // doesn't seem to exist ... try to create
-    echoIfVerbose(
-        "\nCreating new collection '" + collectionName + "' using CollectionAdminRequest", cli);
-
-    NamedList<Object> response;
-    try {
-      response =
-          cloudSolrClient.request(
-              CollectionAdminRequest.createCollection(
-                  collectionName, confName, numShards, replicationFactor));
-    } catch (SolrServerException sse) {
-      throw new Exception(
-          "Failed to create collection '" + collectionName + "' due to: " + sse.getMessage());
-    }
-
-    if (cli.hasOption(SolrCLI.OPTION_VERBOSE.getOpt())) {
-      CharArr arr = new CharArr();
-      new JSONWriter(arr, 2).write(response.asMap());
-      echo(arr.toString());
-    } else {
-      String endMessage =
-          String.format(
-              Locale.ROOT,
-              "Created collection '%s' with %d shard(s), %d replica(s)",
-              collectionName,
-              numShards,
-              replicationFactor);
-      if (confName != null && !confName.trim().isEmpty()) {
-        endMessage += String.format(Locale.ROOT, " with config-set '%s'", confName);
-      }
-
-      echo(endMessage);
-    }
-  }
-
-  /**
-   * Ensure the confDirName is a path to a directory by itself or when it is combined with the
-   * solrInstallDir.
-   */
-  private void ensureConfDirExists(String confDirName, String solrInstallDir) {
-    if (!new File(confDirName).isDirectory()) {
-      final String fullConfDir = solrInstallDir + "/server/solr/configsets/" + confDirName;
-      if (!new File(fullConfDir).isDirectory()) {
-        echo("Specified configuration directory " + confDirName + " not found!");
-        System.exit(1);
-      }
-    }
-  }
-
-  private void printDefaultConfigsetWarningIfNecessary(CommandLine cli) {
-    final String confDirectoryName = cli.getOptionValue("confdir", "_default"); // CREATE_CONFDIR
-    final String confName = cli.getOptionValue("confname", "");
-
-    if (confDirectoryName.equals("_default")
-        && (confName.equals("") || confName.equals("_default"))) {
-      final String collectionName = cli.getOptionValue("name");
-      final String solrUrl = cli.getOptionValue("solrUrl");
-      final String curlCommand =
-          String.format(
-              Locale.ROOT,
-              "curl %s/%s/config -d "
-                  + "'{\"set-user-property\": {\"update.autoCreateFields\":\"false\"}}'",
-              solrUrl,
-              collectionName);
-      final String configCommand =
-          String.format(
-              Locale.ROOT,
-              "bin/solr config -c %s -p 8983 -action set-user-property -property update.autoCreateFields -value false",
-              collectionName);
-      echo(
-          "WARNING: Using _default configset. Data driven schema functionality is enabled by default, which is");
-      echo("         NOT RECOMMENDED for production use.");
-      echo("");
-      echo("         To turn it off:");
-      echo("            " + curlCommand);
-      echo("         Or:");
-      echo("            " + configCommand);
-    }
-  }
-}
diff --git a/solr/core/src/java/org/apache/solr/cli/CreateCoreTool.java b/solr/core/src/java/org/apache/solr/cli/CreateCoreTool.java
deleted file mode 100644
index 0d1eeaa4364..00000000000
--- a/solr/core/src/java/org/apache/solr/cli/CreateCoreTool.java
+++ /dev/null
@@ -1,206 +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.cli;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.Option;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.file.PathUtils;
-import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.client.solrj.request.CoreAdminRequest;
-import org.apache.solr.client.solrj.request.GenericSolrRequest;
-import org.apache.solr.client.solrj.response.CoreAdminResponse;
-import org.apache.solr.common.params.CommonParams;
-
-/**
- * Supports create command in the bin/solr script.
- *
- * @deprecated Please use {@link CreateTool}
- */
-@Deprecated(since = "9.4")
-public class CreateCoreTool extends ToolBase {
-
-  public CreateCoreTool() {
-    this(CLIO.getOutStream());
-  }
-
-  public CreateCoreTool(PrintStream stdout) {
-    super(stdout);
-  }
-
-  @Override
-  public String getName() {
-    return "create_core";
-  }
-
-  @Override
-  public List<Option> getOptions() {
-    return List.of(
-        SolrCLI.OPTION_SOLRURL,
-        Option.builder("c")
-            .longOpt("name")
-            .argName("NAME")
-            .hasArg()
-            .required(true)
-            .desc("Name of the core to create.")
-            .build(),
-        Option.builder("d")
-            .longOpt("confdir")
-            .argName("NAME")
-            .hasArg()
-            .required(false)
-            .desc(
-                "Configuration directory to copy when creating the new core; default is "
-                    + SolrCLI.DEFAULT_CONFIG_SET
-                    + '.')
-            .build(),
-        // Option.builder("configsetsDir")
-        //    .argName("DIR")
-        //     .hasArg()
-        //    .required(true)
-        //    .desc("Path to configsets directory on the local system.")
-        //    .build(),
-        SolrCLI.OPTION_VERBOSE);
-  }
-
-  @Override
-  public void runImpl(CommandLine cli) throws Exception {
-    echo("This command has been deprecated in favour of using 'bin/solr create'.");
-    String coreName = cli.getOptionValue("name");
-    String solrUrl = cli.getOptionValue("solrUrl", SolrCLI.DEFAULT_SOLR_URL);
-
-    final String solrInstallDir = System.getProperty("solr.install.dir");
-    final String confDirName =
-        cli.getOptionValue("confdir", SolrCLI.DEFAULT_CONFIG_SET); // CREATE_CONFDIR
-
-    // we allow them to pass a directory instead of a configset name
-    File configsetDir = new File(confDirName);
-    if (!configsetDir.isDirectory()) {
-      ensureConfDirExists(confDirName, solrInstallDir);
-    }
-    printDefaultConfigsetWarningIfNecessary(cli);
-
-    String coreRootDirectory; // usually same as solr home, but not always
-    try (var solrClient = SolrCLI.getSolrClient(solrUrl)) {
-      Map<String, Object> systemInfo =
-          solrClient
-              .request(
-                  new GenericSolrRequest(SolrRequest.METHOD.GET, CommonParams.SYSTEM_INFO_PATH))
-              .asMap();
-      if ("solrcloud".equals(systemInfo.get("mode"))) {
-        throw new IllegalStateException(
-            "Solr at "
-                + solrUrl
-                + " is running in SolrCloud mode, please use create_collection command instead.");
-      }
-
-      // convert raw JSON into user-friendly output
-      coreRootDirectory = (String) systemInfo.get("core_root");
-    }
-
-    if (SolrCLI.safeCheckCoreExists(solrUrl, coreName)) {
-      throw new IllegalArgumentException(
-          "\nCore '"
-              + coreName
-              + "' already exists!\nChecked core existence using Core API command");
-    }
-
-    File coreInstanceDir = new File(coreRootDirectory, coreName);
-    File confDir = new File(getFullConfDir(confDirName, solrInstallDir), "conf");
-    if (!coreInstanceDir.isDirectory()) {
-      coreInstanceDir.mkdirs();
-      if (!coreInstanceDir.isDirectory()) {
-        throw new IOException(
-            "Failed to create new core instance directory: " + coreInstanceDir.getAbsolutePath());
-      }
-
-      FileUtils.copyDirectoryToDirectory(confDir, coreInstanceDir);
-
-      echoIfVerbose(
-          "\nCopying configuration to new core instance directory:\n"
-              + coreInstanceDir.getAbsolutePath(),
-          cli);
-    }
-
-    echoIfVerbose("\nCreating new core '" + coreName + "' using CoreAdminRequest", cli);
-
-    try (var solrClient = SolrCLI.getSolrClient(solrUrl)) {
-      CoreAdminResponse res = CoreAdminRequest.createCore(coreName, coreName, solrClient);
-      if (cli.hasOption(SolrCLI.OPTION_VERBOSE.getOpt())) {
-        echo(res.jsonStr());
-        echo("\n");
-      } else {
-        echo(String.format(Locale.ROOT, "\nCreated new core '%s'", coreName));
-      }
-    } catch (Exception e) {
-      /* create-core failed, cleanup the copied configset before propagating the error. */
-      PathUtils.deleteDirectory(coreInstanceDir.toPath());
-      throw e;
-    }
-  }
-
-  private String getFullConfDir(String confDirName, String solrInstallDir) {
-    return solrInstallDir + "/server/solr/configsets/" + confDirName;
-  }
-
-  private String ensureConfDirExists(String confDirName, String solrInstallDir) {
-    String fullConfDir = getFullConfDir(confDirName, solrInstallDir);
-    if (!new File(fullConfDir).isDirectory()) {
-      echo("Specified configuration directory " + confDirName + " not found!");
-      System.exit(1);
-    }
-
-    return fullConfDir;
-  }
-
-  private void printDefaultConfigsetWarningIfNecessary(CommandLine cli) {
-    final String confDirectoryName = cli.getOptionValue("confdir", "_default"); // CREATE_CONFDIR
-    final String confName = cli.getOptionValue("confname", "");
-
-    if (confDirectoryName.equals("_default")
-        && (confName.equals("") || confName.equals("_default"))) {
-      final String collectionName = cli.getOptionValue("collection");
-      final String solrUrl = cli.getOptionValue("solrUrl", SolrCLI.DEFAULT_SOLR_URL);
-      final String curlCommand =
-          String.format(
-              Locale.ROOT,
-              "curl %s/%s/config -d "
-                  + "'{\"set-user-property\": {\"update.autoCreateFields\":\"false\"}}'",
-              solrUrl,
-              collectionName);
-      final String configCommand =
-          String.format(
-              Locale.ROOT,
-              "bin/solr config -c %s -p 8983 -action set-user-property -property update.autoCreateFields -value false",
-              collectionName);
-      echo(
-          "WARNING: Using _default configset. Data driven schema functionality is enabled by default, which is");
-      echo("         NOT RECOMMENDED for production use.");
-      echo("");
-      echo("         To turn it off:");
-      echo("            " + curlCommand);
-      echo("         Or:");
-      echo("            " + configCommand);
-    }
-  }
-}
diff --git a/solr/core/src/java/org/apache/solr/cli/SolrCLI.java b/solr/core/src/java/org/apache/solr/cli/SolrCLI.java
index 8a92e6801e9..c0a385a0198 100755
--- a/solr/core/src/java/org/apache/solr/cli/SolrCLI.java
+++ b/solr/core/src/java/org/apache/solr/cli/SolrCLI.java
@@ -219,8 +219,6 @@ public class SolrCLI implements CLIO {
     if ("healthcheck".equals(toolType)) return new HealthcheckTool();
     else if ("status".equals(toolType)) return new StatusTool();
     else if ("api".equals(toolType)) return new ApiTool();
-    else if ("create_collection".equals(toolType)) return new CreateCollectionTool();
-    else if ("create_core".equals(toolType)) return new CreateCoreTool();
     else if ("create".equals(toolType)) return new CreateTool();
     else if ("delete".equals(toolType)) return new DeleteTool();
     else if ("config".equals(toolType)) return new ConfigTool();
@@ -428,7 +426,7 @@ public class SolrCLI implements CLIO {
 
     print("Usage: solr COMMAND OPTIONS");
     print(
-        "       where COMMAND is one of: start, stop, restart, status, healthcheck, create, create_core, create_collection, delete, version, zk, auth, assert, config, export, api, package, post");
+        "       where COMMAND is one of: start, stop, restart, status, healthcheck, create, delete, version, zk, auth, assert, config, export, api, package, post");
     print("");
     print("  Standalone server example (start Solr running in the background on port 8984):");
     print("");
diff --git a/solr/core/src/test/org/apache/solr/cloud/SolrCloudExampleTest.java b/solr/core/src/test/org/apache/solr/cloud/SolrCloudExampleTest.java
index 29080392e98..03ccf37751b 100644
--- a/solr/core/src/test/org/apache/solr/cloud/SolrCloudExampleTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/SolrCloudExampleTest.java
@@ -30,7 +30,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import org.apache.commons.cli.CommandLine;
-import org.apache.solr.cli.CreateCollectionTool;
+import org.apache.solr.cli.CreateTool;
 import org.apache.solr.cli.DeleteTool;
 import org.apache.solr.cli.HealthcheckTool;
 import org.apache.solr.cli.SolrCLI;
@@ -96,7 +96,7 @@ public class SolrCloudExampleTest extends AbstractFullDistribZkTestBase {
     // NOTE: not calling SolrCLI.main as the script does because it calls System.exit which is a
     // no-no in a JUnit test
 
-    CreateCollectionTool tool = new CreateCollectionTool();
+    CreateTool tool = new CreateTool();
     CommandLine cli = SolrCLI.processCommandLineArgs(tool.getName(), tool.getOptions(), args);
     log.info("Creating the '{}' collection using SolrCLI with: {}", testCollectionName, solrUrl);
     tool.runTool(cli);
diff --git a/solr/docker/tests/cases/create_core_exec/test.sh b/solr/docker/tests/cases/create_core_exec/test.sh
index 8f50832248a..6f423b85ab6 100755
--- a/solr/docker/tests/cases/create_core_exec/test.sh
+++ b/solr/docker/tests/cases/create_core_exec/test.sh
@@ -25,7 +25,7 @@ docker run --name "$container_name" -d "$tag"
 wait_for_container_and_solr "$container_name"
 
 echo "Creating core"
-docker exec --user=solr "$container_name" bin/solr create_core -c gettingstarted
+docker exec --user=solr "$container_name" bin/solr create -c gettingstarted
 echo "Loading data"
 docker exec --user=solr "$container_name" bin/post -c gettingstarted example/exampledocs/manufacturers.xml
 sleep 1
diff --git a/solr/packaging/test/test_config.bats b/solr/packaging/test/test_config.bats
index b30ff762f0a..b588e0c10db 100644
--- a/solr/packaging/test/test_config.bats
+++ b/solr/packaging/test/test_config.bats
@@ -39,14 +39,14 @@ teardown() {
 }
 
 @test "setting property" {
-  solr create_collection -c COLL_NAME
+  solr create -c COLL_NAME
 
   run solr config -c COLL_NAME -action set-property -property updateHandler.autoCommit.maxDocs -value 100 -solrUrl http://localhost:8983/solr
   assert_output --partial "Successfully set-property updateHandler.autoCommit.maxDocs to 100"
 }
 
 @test "short form of setting property" {
-  solr create_collection -c COLL_NAME
+  solr create -c COLL_NAME
 
   run solr config -c COLL_NAME -property updateHandler.autoCommit.maxDocs -value 100
   assert_output --partial "Successfully set-property updateHandler.autoCommit.maxDocs to 100"
diff --git a/solr/packaging/test/test_export.bats b/solr/packaging/test/test_export.bats
index 699eba33911..6ddbe4d1880 100644
--- a/solr/packaging/test/test_export.bats
+++ b/solr/packaging/test/test_export.bats
@@ -63,7 +63,7 @@ teardown() {
 
 @test "export fails on non cloud mode" {
   run solr start
-  run solr create_core -c COLL_NAME
+  run solr create -c COLL_NAME
   run solr export -url "http://localhost:8983/solr/COLL_NAME"
   refute_output --partial 'Export complete'
   assert_output --partial "ERROR: Couldn't initialize a HttpClusterStateProvider"
diff --git a/solr/packaging/test/test_extraction.bats b/solr/packaging/test/test_extraction.bats
index 875f4ca2e59..def674b15d5 100644
--- a/solr/packaging/test/test_extraction.bats
+++ b/solr/packaging/test/test_extraction.bats
@@ -38,7 +38,7 @@ teardown() {
   solr start -c -Dsolr.modules=extraction
   
   
-  solr create_collection -c gettingstarted -d _default
+  solr create -c gettingstarted -d _default
 
   
   curl -X POST -H 'Content-type:application/json' -d '{
@@ -62,7 +62,7 @@ teardown() {
   export SOLR_SECURITY_MANAGER_ENABLED=false
   solr start -c -Dsolr.modules=extraction
   
-  solr create_collection -c content_extraction -d _default
+  solr create -c content_extraction -d _default
   
   curl -X POST -H 'Content-type:application/json' -d '{
     "add-requesthandler": {
@@ -89,7 +89,7 @@ teardown() {
   export SOLR_SECURITY_MANAGER_ENABLED=false
   solr start -c -Dsolr.modules=extraction
   
-  solr create_collection -c website_extraction -d _default
+  solr create -c website_extraction -d _default
   
   curl -X POST -H 'Content-type:application/json' -d '{
     "add-requesthandler": {
diff --git a/solr/packaging/test/test_help.bats b/solr/packaging/test/test_help.bats
index 304dff63a5e..c2fb863cd46 100644
--- a/solr/packaging/test/test_help.bats
+++ b/solr/packaging/test/test_help.bats
@@ -68,18 +68,6 @@ setup() {
   refute_output --partial 'ERROR'
 }
 
-@test "createcore help flag prints help" {
-  run solr create_core -help
-  assert_output --partial 'usage: create_core'
-  refute_output --partial 'ERROR'
-}
-
-@test "createcollection help flag prints help" {
-  run solr create_collection -help
-  assert_output --partial 'usage: create_collection'
-  refute_output --partial 'ERROR'
-}
-
 @test "delete help flag prints help" {
   run solr delete -help
   assert_output --partial 'usage: delete'
diff --git a/solr/packaging/test/test_modules.bats b/solr/packaging/test/test_modules.bats
index ff6d88c8041..ca9cf32acba 100644
--- a/solr/packaging/test/test_modules.bats
+++ b/solr/packaging/test/test_modules.bats
@@ -31,7 +31,7 @@ teardown() {
 
 @test "SQL Module" {
   run solr start -c -Dsolr.modules=sql
-  run solr create_collection -c COLL_NAME
+  run solr create -c COLL_NAME
   run solr api -get http://localhost:8983/solr/COLL_NAME/sql?stmt=select+id+from+COLL_NAME+limit+10
   assert_output --partial '"docs":'
   assert_output --partial '"EOF":true'
@@ -62,6 +62,6 @@ teardown() {
 
 @test "icu collation in analysis-extras module" {
   run solr start -c -Dsolr.modules=analysis-extras
-  run solr create_collection -c COLL_NAME -d test/analysis_extras_config/conf
+  run solr create -c COLL_NAME -d test/analysis_extras_config/conf
   assert_output --partial "Created collection 'COLL_NAME'"
 }
diff --git a/solr/packaging/test/test_packages.bats b/solr/packaging/test/test_packages.bats
index 6d7359bb7fd..fd7410b5dd8 100644
--- a/solr/packaging/test/test_packages.bats
+++ b/solr/packaging/test/test_packages.bats
@@ -50,7 +50,7 @@ teardown() {
 @test "deploying and undeploying of packages" {
   run solr start -c -Denable.packages=true
 
-  solr create_collection -c foo-1.2
+  solr create -c foo-1.2
 
   # Deploy package - the package doesn't need to exist before the collection validation kicks in
   run solr package deploy PACKAGE_NAME -collections foo-1.2
diff --git a/solr/packaging/test/test_placement_plugin.bats b/solr/packaging/test/test_placement_plugin.bats
index 656c38e032d..375d8b4afc0 100644
--- a/solr/packaging/test/test_placement_plugin.bats
+++ b/solr/packaging/test/test_placement_plugin.bats
@@ -32,7 +32,7 @@ teardown() {
 @test "Affinity placement plugin using sysprop" {
   run solr start -c -Dsolr.placementplugin.default=affinity
   solr assert -c http://localhost:8983/solr -t 3000
-  run solr create_collection -c COLL_NAME
+  run solr create -c COLL_NAME
   collection_exists COLL_NAME
   assert_file_contains "${SOLR_LOGS_DIR}/solr.log" 'Default replica placement plugin set in solr\.placementplugin\.default to affinity'
 }
@@ -41,7 +41,7 @@ teardown() {
   export SOLR_PLACEMENTPLUGIN_DEFAULT=random
   run solr start -c
   solr assert -c http://localhost:8983/solr -t 3000
-  run solr create_collection -c COLL_NAME
+  run solr create -c COLL_NAME
   collection_exists COLL_NAME
   assert_file_contains "${SOLR_LOGS_DIR}/solr.log" 'Default replica placement plugin set in solr\.placementplugin\.default to random'
 }
diff --git a/solr/packaging/test/test_post.bats b/solr/packaging/test/test_post.bats
index 2b8c18bfe46..4a59d8c7aa8 100644
--- a/solr/packaging/test/test_post.bats
+++ b/solr/packaging/test/test_post.bats
@@ -54,7 +54,7 @@ teardown() {
 
 @test "basic post with a type specified" {
   
-  run solr create_collection -c monitors -d _default
+  run solr create -c monitors -d _default
   assert_output --partial "Created collection 'monitors'"
   
   run solr post -type application/xml -url http://localhost:8983/solr/monitors/update ${SOLR_TIP}/example/exampledocs/monitor.xml
@@ -65,7 +65,7 @@ teardown() {
 
 @test "basic post WITHOUT a type specified" {
   
-  solr create_collection -c monitors_no_type -d _default
+  solr create -c monitors_no_type -d _default
   
   run solr post -url http://localhost:8983/solr/monitors_no_type/update -commit ${SOLR_TIP}/example/exampledocs/monitor.xml
 
@@ -74,7 +74,7 @@ teardown() {
   run curl 'http://localhost:8983/solr/monitors_no_type/select?q=*:*'
   assert_output --partial '"numFound":1'
   
-  solr create_collection -c books_no_type -d _default
+  solr create -c books_no_type -d _default
   
   run solr post -url http://localhost:8983/solr/books_no_type/update -commit ${SOLR_TIP}/example/exampledocs/books.json
 
@@ -83,7 +83,7 @@ teardown() {
   run curl 'http://localhost:8983/solr/books_no_type/select?q=*:*'
   assert_output --partial '"numFound":4'
   
-  solr create_collection -c books_csv_no_type -d _default
+  solr create -c books_csv_no_type -d _default
   
   run solr post -url http://localhost:8983/solr/books_csv_no_type/update -commit ${SOLR_TIP}/example/exampledocs/books.csv
 
@@ -95,7 +95,7 @@ teardown() {
 
 @test "crawling a directory" {
   
-  solr create_collection -c mixed_content -d _default
+  solr create -c mixed_content -d _default
   
   # We filter to xml,json,and csv as we don't want to invoke the Extract handler.
   run solr post -filetypes xml,json,csv -url http://localhost:8983/solr/mixed_content/update -commit ${SOLR_TIP}/example/exampledocs
@@ -108,7 +108,7 @@ teardown() {
 
 # this test doesn't complete due to issues in posting to the /extract handler
 @test "crawling a web site" {
-  solr create_collection -c webcrawl -d _default
+  solr create -c webcrawl -d _default
   
   curl -X POST -H 'Content-type:application/json' -d '{
     "add-requesthandler": {
@@ -124,7 +124,7 @@ teardown() {
 
 @test "commit and optimize and delete" {
   
-  run solr create_collection -c monitors2 -d _default
+  run solr create -c monitors2 -d _default
   assert_output --partial "Created collection 'monitors2'"
   
   run solr post -url http://localhost:8983/solr/monitors2/update -type application/xml -commit -optimize ${SOLR_TIP}/example/exampledocs/monitor.xml
@@ -138,7 +138,7 @@ teardown() {
 
 @test "args mode" {
   
-  run solr create_collection -c test_args -d _default
+  run solr create -c test_args -d _default
   assert_output --partial "Created collection 'test_args'"
   
   run solr post -url http://localhost:8983/solr/test_args/update -mode args -type application/xml -out -commit "<delete><query>*:*</query></delete>"
@@ -165,7 +165,7 @@ capture_echo_to_solr() {
 
 @test "stdin mode" {
   
-  run solr create_collection -c test_stdin -d _default
+  run solr create -c test_stdin -d _default
   assert_output --partial "Created collection 'test_stdin'"
   
   run capture_echo_to_solr
diff --git a/solr/packaging/test/test_postlogs.bats b/solr/packaging/test/test_postlogs.bats
index 64c8230fefd..36c5941c80e 100644
--- a/solr/packaging/test/test_postlogs.bats
+++ b/solr/packaging/test/test_postlogs.bats
@@ -39,7 +39,7 @@ teardown() {
 }
 
 @test "post solr log into solr via script" {
-  run solr create_collection -c COLL_NAME
+  run solr create -c COLL_NAME
   assert_output --partial "Created collection 'COLL_NAME'"
 
   run postlogs http://localhost:8983/solr/COLL_NAME ${SOLR_LOGS_DIR}/solr.log
@@ -51,7 +51,7 @@ teardown() {
 }
 
 @test "post solr log into solr via cli" {
-  run solr create_collection -c COLL_NAME
+  run solr create -c COLL_NAME
   assert_output --partial "Created collection 'COLL_NAME'"
 
   run solr postlogs -url http://localhost:8983/solr/COLL_NAME -rootdir ${SOLR_LOGS_DIR}/solr.log
diff --git a/solr/packaging/test/test_security_manager.bats b/solr/packaging/test/test_security_manager.bats
index 0d7fa163a1a..606d2d33d25 100644
--- a/solr/packaging/test/test_security_manager.bats
+++ b/solr/packaging/test/test_security_manager.bats
@@ -42,7 +42,7 @@ teardown() {
   export SOLR_SECURITY_MANAGER_ENABLED=true
   export SOLR_OPTS="-Dsolr.allowPaths=${backup_dir} -Djava.io.tmpdir=${test_tmp_dir}"
   run solr start -c
-  run solr create_collection -c COLL_NAME
+  run solr create -c COLL_NAME
   run solr api -get "http://localhost:8983/solr/admin/collections?action=BACKUP&name=test&collection=COLL_NAME&location=file://${backup_dir}"
   assert_output --partial '"status":0'
 
diff --git a/solr/solr-ref-guide/modules/deployment-guide/pages/docker-faq.adoc b/solr/solr-ref-guide/modules/deployment-guide/pages/docker-faq.adoc
index 694500a0151..2bb81b49465 100644
--- a/solr/solr-ref-guide/modules/deployment-guide/pages/docker-faq.adoc
+++ b/solr/solr-ref-guide/modules/deployment-guide/pages/docker-faq.adoc
@@ -69,7 +69,7 @@ docker run -it --rm -v /home/docker-volumes/mysolr1:/target solr cp -r server/so
 SOLR_CONTAINER=$(docker run -d -P -v /home/docker-volumes/mysolr1/solr:/opt/solr/server/solr solr)
 
 # create a new core
-docker exec -it --user=solr $SOLR_CONTAINER solr create_core -c gettingstarted
+docker exec -it --user=solr $SOLR_CONTAINER solr create -c gettingstarted
 
 # check the volume on the host:
 ls /home/docker-volumes/mysolr1/solr/
@@ -105,7 +105,7 @@ docker create -v /opt/solr/server/solr --name mysolr1data solr /bin/true
 SOLR_CONTAINER=$(docker run -d -P --volumes-from=mysolr1data solr)
 
 # create a new core
-docker exec -it --user=solr $SOLR_CONTAINER solr create_core -c gettingstarted
+docker exec -it --user=solr $SOLR_CONTAINER solr create -c gettingstarted
 
 # make a change to the config, using the config API
 docker exec -it --user=solr $SOLR_CONTAINER curl http://localhost:8983/solr/gettingstarted/config -H 'Content-type:application/json' -d '{
@@ -215,7 +215,7 @@ Create a collection:
 
 [source,bash]
 ----
-docker exec -i -t solr1 solr create_collection \
+docker exec -i -t solr1 solr create \
         -c gettingstarted -shards 2 -p 8983
 ----
 
diff --git a/solr/solr-ref-guide/modules/deployment-guide/pages/docker-networking.adoc b/solr/solr-ref-guide/modules/deployment-guide/pages/docker-networking.adoc
index 66b1b75446e..463fde67a92 100644
--- a/solr/solr-ref-guide/modules/deployment-guide/pages/docker-networking.adoc
+++ b/solr/solr-ref-guide/modules/deployment-guide/pages/docker-networking.adoc
@@ -197,7 +197,7 @@ Next let's create a collection:
 
 [source,bash]
 ----
-ssh -n $ZKSOLR1_HOST docker exec -i zksolr1 /opt/solr/bin/solr create_collection -c my_collection1 -shards 2 -p 8983
+ssh -n $ZKSOLR1_HOST docker exec -i zksolr1 /opt/solr/bin/solr create -c my_collection1 -shards 2 -p 8983
 ----
 
 To load data, and see it was split over shards:
diff --git a/solr/solr-ref-guide/modules/deployment-guide/pages/solr-control-script-reference.adoc b/solr/solr-ref-guide/modules/deployment-guide/pages/solr-control-script-reference.adoc
index b82e642e754..80eaebf4cef 100644
--- a/solr/solr-ref-guide/modules/deployment-guide/pages/solr-control-script-reference.adoc
+++ b/solr/solr-ref-guide/modules/deployment-guide/pages/solr-control-script-reference.adoc
@@ -631,7 +631,6 @@ The `bin/solr` script can also help you create new collections or cores, or dele
 === Create a Core or Collection
 
 The `create` command creates a core or collection depending on whether Solr is running in standalone (core) or SolrCloud mode (collection).
-In other words, this action detects which mode Solr is running in, and then takes the appropriate action (either `create_core` or `create_collection`).
 
 `bin/solr create [options]`
 
@@ -711,178 +710,10 @@ It is possible to override this warning with the -force parameter.
 +
 *Example*: `bin/solr create -c foo -force`
 
-=== Create a Collection
-
-The `create_collection` command creates a collection, and is only available when running in SolrCloud mode.
-
-`bin/solr create_collection [options]`
-
-`bin/solr create_collection -help`
-
-==== Create Collection Parameters
-
-`-c <name>`::
-+
-[%autowidth,frame=none]
-|===
-s|Required |Default: none
-|===
-+
-Name of the collection to create.
-+
-*Example*: `bin/solr create_collection -c mycollection`
-
-`-d <confdir>`::
-+
-[%autowidth,frame=none]
-|===
-|Optional |Default: `_default`
-|===
-+
-Configuration directory to copy when creating the new collection.
-+
-See the section <<Configuration Directories and SolrCloud>> below for more details about this option when running in SolrCloud mode. including some built in example configurations.
-+
-`_default` is also known as xref:indexing-guide:schemaless-mode.adoc[].
-+
-*Example*: `bin/solr create_collection -d _default`
-+
-Alternatively, you can pass the path to your own configuration directory instead of using one of the built-in configurations.
-+
-*Example*: `bin/solr create_collection -c mycoll -d /tmp/myconfig`
-+
-By default the script will upload the specified confdir directory into Zookeeper using the same name as the collection (-c) option.
-Alternatively, if you want to reuse an existing directory or create a confdir in Zookeeper that can be shared by multiple collections, use the -n option
-+
-
-`-n <configName>`::
-+
-[%autowidth,frame=none]
-|===
-|Optional |Default: _see description_
-|===
-+
-Name the configuration directory in Zookeeper.
-By default, the configuration will be uploaded to Zookeeper using the collection name (-c), but if you want to use an existing directory or override the name of the configuration in Zookeeper, then use the -c option.
-UMMMM...   I COPIED THE ABOVE LINE FROM bin/solr create_collection -h output, but I don't get it.  And bin/solr create_collection -n basic -c mycoll works, it create a copy of _default as "basic" configset... UMMM?
-+
-*Example*: `bin/solr create_collection -n basic -c mycoll`
-
-`-p <port>` or `-port <port>`::
-+
-[%autowidth,frame=none]
-|===
-|Optional |Default: _see description_
-|===
-+
-Port of a local Solr instance where you want to create the new collection.
-If not specified, the script will search the local system for a running Solr instance and will use the port of the first server it finds.
-+
-This option is useful if you are running multiple Solr instances on the same host, thus requiring you to be specific about which instance to create the core in.
-+
-*Example*: `bin/solr create -p 8983`
-
-`-s <shards>` or `-shards <shards>`::
-+
-[%autowidth,frame=none]
-|===
-|Optional |Default: `1`
-|===
-+
-Number of shards to split a collection into.
-+
-*Example*: `bin/solr create_collection -s 2`
-
-`-rf <replicas>` or `-replicationFactor <replicas>`::
-+
-[%autowidth,frame=none]
-|===
-|Optional |Default: `1`
-|===
-+
-Number of copies of each document in the collection.
-The default is `1` (no replication).
-+
-*Example*: `bin/solr create_collection -rf 2`
-
-`-force`::
-+
-[%autowidth,frame=none]
-|===
-|Optional |Default: none
-|===
-+
-If attempting to run create as "root" user, the script will exit with a warning that running Solr or actions against Solr as "root" can cause problems.
-It is possible to override this warning with the -force parameter.
-+
-*Example*: `bin/solr create_collection -c foo -force`
-
-=== Create a Core
-
-The `create_core` command creates a core and is only available when running in user-managed (single-node) mode.
-
-`bin/solr create_core [options]`
-
-`bin/solr create_core -help`
-
-==== Create Core Parameters
-
-`-c <name>`::
-+
-[%autowidth,frame=none]
-|===
-s|Required |Default: none
-|===
-+
-Name of the core to create.
-+
-*Example*: `bin/solr create -c mycore`
-
-`-d <confdir>`::
-+
-[%autowidth,frame=none]
-|===
-|Optional |Default: `_default`
-|===
-+
-The configuration directory to use when creating a new core.
-+
-*Example*: `bin/solr create -d _default`
-+
-Alternatively, you can pass the path to your own configuration directory instead of using one of the built-in configurations.
-+
-*Example*: `bin/solr create_collection -c mycore -d /tmp/myconfig`
-
-`-p <port>` or `-port <port>`::
-+
-[%autowidth,frame=none]
-|===
-|Optional |Default: _see description_
-|===
-+
-The port of a local Solr instance to create the new core.
-By default the script tries to detect the port by looking for running Solr instances.
-+
-This option is useful if you are running multiple Solr instances on the same host, thus requiring you to be specific about which instance to create the core in.
-+
-*Example*: `bin/solr create -p 8983`
-
-`-force`::
-+
-[%autowidth,frame=none]
-|===
-|Optional |Default: none
-|===
-+
-If attempting to run create as "root" user, the script will exit with a warning that running Solr or actions against Solr as "root" can cause problems.
-It is possible to override this warning with the -force parameter.
-+
-*Example*: `bin/solr create -c foo -force`
-
 ==== Configuration Directories and SolrCloud
 
 Before creating a collection in SolrCloud, the configuration directory used by the collection must be uploaded to ZooKeeper.
-The `create` and `create_collection` commands supports several use cases for how collections and configuration directories work.
+The `create` command supports several use cases for how collections and configuration directories work.
 The main decision you need to make is whether a configuration directory in ZooKeeper should be shared across multiple collections.
 
 Let's work through a few examples to illustrate how configuration directories work in SolrCloud.
@@ -1788,7 +1619,7 @@ Create a new collection to import the exported documents into:
 
 [,console]
 ----
-$ bin/solr create_collection -c test_collection -n techproducts
+$ bin/solr create -c test_collection -n techproducts
 ----
 
 Now import the data with either of these methods:
diff --git a/solr/solr-ref-guide/modules/deployment-guide/pages/solr-in-docker.adoc b/solr/solr-ref-guide/modules/deployment-guide/pages/solr-in-docker.adoc
index 491b2ba248c..b43562951bf 100644
--- a/solr/solr-ref-guide/modules/deployment-guide/pages/solr-in-docker.adoc
+++ b/solr/solr-ref-guide/modules/deployment-guide/pages/solr-in-docker.adoc
@@ -125,7 +125,7 @@ The first is exactly the same: start Solr running in a container, then execute t
 [source,bash]
 ----
 docker run -d -p 8983:8983 --name my_solr solr
-docker exec -it my_solr solr create_core -c gettingstarted
+docker exec -it my_solr solr create -c gettingstarted
 ----
 
 This is not very convenient for users, and makes it harder to turn it into configuration for Docker Compose and orchestration tools like Kubernetes.
@@ -189,7 +189,7 @@ The third way is to use a separate container:
 
 [source,bash]
 ----
-docker run -e SOLR_HOST=solr1 --network docs_solr solr solr create_collection -c gettingstarted3 -p 8983
+docker run -e SOLR_HOST=solr1 --network docs_solr solr solr create -c gettingstarted3 -p 8983
 ----
 
 The fourth way is to use the remote API, from the host or from one of the containers, or some new container on the same network (adjust the hostname accordingly):
@@ -224,7 +224,7 @@ The same works if you use the <<docker-compose,example docker compose cluster>>,
 
 [source,bash]
 ----
-docker run -e SOLR_HOST=solr1 --network=mycluster_solr solr solr create_collection -c books -p 8983
+docker run -e SOLR_HOST=solr1 --network=mycluster_solr solr solr create -c books -p 8983
 docker run --rm -v "$PWD/mydata:/mydata" --network=mycluster_solr solr post  -c books /mydata/books.csv -host solr1
 ----