From 2be51f41d92b8f37cb871903383ef4e1dafbe2f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20H=C3=B8ydahl?= Date: Thu, 30 Jul 2026 16:12:24 +0200 Subject: [PATCH] Extract CLIUtils.solrUrlFromConnection() from normalizeSolrUrl(CommandLine) Makes the connection-string-to-Solr-URL resolution reusable outside of commons-cli contexts. No behavior change. --- .../java/org/apache/solr/cli/CLIUtils.java | 50 +++++++++++-------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/cli/CLIUtils.java b/solr/core/src/java/org/apache/solr/cli/CLIUtils.java index 1a8f76c0db8b..06ed95eae075 100644 --- a/solr/core/src/java/org/apache/solr/cli/CLIUtils.java +++ b/solr/core/src/java/org/apache/solr/cli/CLIUtils.java @@ -233,34 +233,42 @@ public static String normalizeSolrUrl(CommandLine cli) throws Exception { "Neither --solr-connection, --zk-host or --solr-url parameters, nor SOLR_CONNECTION, ZK_HOST env var provided, so assuming solr url is " + solrUrl + "."); - } else if (!solrConnection.isZookeeper()) { - // HTTP form (e.g. `-s http://host:port`): the connection string already names a Solr URL, - // so use it directly without spinning up a CloudSolrClient. - solrUrl = normalizeSolrUrl(solrConnection.quorumItems().get(0), false); } else { - var builder = - new HttpJettySolrClient.Builder() - .withOptionalBasicAuthCredentials( - cli.getOptionValue(CommonCLIOptions.CREDENTIALS_OPTION)); - try (CloudSolrClient cloudSolrClient = getCloudSolrClient(solrConnection, builder)) { - Set liveNodes = cloudSolrClient.getClusterState().getLiveNodes(); - if (liveNodes.isEmpty()) - throw new IllegalStateException( - "No live nodes found! Cannot determine 'solrUrl' from SolrCloud: " - + solrConnection); - - String firstLiveNode = liveNodes.iterator().next(); - String urlScheme = - cloudSolrClient.getClusterStateProvider().getClusterProperty("urlScheme", "http"); - solrUrl = URLUtil.getBaseUrlForNodeName(firstLiveNode, urlScheme, false); - solrUrl = normalizeSolrUrl(solrUrl, false); - } + solrUrl = + solrUrlFromConnection( + solrConnection, cli.getOptionValue(CommonCLIOptions.CREDENTIALS_OPTION)); } } solrUrl = normalizeSolrUrl(solrUrl); return solrUrl; } + /** + * Resolves a base Solr URL from a parsed connection. The HTTP form (e.g. {@code -s + * http://host:port}) already names a Solr URL, so it is used directly without spinning up a + * CloudSolrClient; the ZooKeeper form queries the cluster for a live node's base URL. + */ + public static String solrUrlFromConnection( + CloudSolrClient.CloudSolrClientConnection solrConnection, String credentials) + throws Exception { + if (!solrConnection.isZookeeper()) { + return normalizeSolrUrl(solrConnection.quorumItems().get(0), false); + } + var builder = new HttpJettySolrClient.Builder().withOptionalBasicAuthCredentials(credentials); + try (CloudSolrClient cloudSolrClient = getCloudSolrClient(solrConnection, builder)) { + Set liveNodes = cloudSolrClient.getClusterState().getLiveNodes(); + if (liveNodes.isEmpty()) + throw new IllegalStateException( + "No live nodes found! Cannot determine 'solrUrl' from SolrCloud: " + solrConnection); + + String firstLiveNode = liveNodes.iterator().next(); + String urlScheme = + cloudSolrClient.getClusterStateProvider().getClusterProperty("urlScheme", "http"); + return normalizeSolrUrl( + URLUtil.getBaseUrlForNodeName(firstLiveNode, urlScheme, false), false); + } + } + /** * Returns true if the user supplied any of the connection-related CLI options ({@code * --solr-url}, {@code --solr-connection}, or {@code --zk-host}). Use this to gate logic that