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

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


The following commit(s) were added to refs/heads/main by this push:
     new f0883807 Read the cluster's distribution version instead of returning 
a constant (#72)
f0883807 is described below

commit f088380700320b43a70c331cf4d56dfa78d3c032
Author: Serhiy Bzhezytskyy <[email protected]>
AuthorDate: Thu Sep 3 20:35:00 2026 +0300

    Read the cluster's distribution version instead of returning a constant 
(#72)
---
 solrorbit/builder/builder.py   | 14 +++++++++---
 tests/builder/mechanic_test.py | 50 +++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 60 insertions(+), 4 deletions(-)

diff --git a/solrorbit/builder/builder.py b/solrorbit/builder/builder.py
index 160caa5f..2e9e111a 100644
--- a/solrorbit/builder/builder.py
+++ b/solrorbit/builder/builder.py
@@ -281,9 +281,17 @@ def cluster_distribution_version(cfg, 
client_factory=client.ClientFactory):
     hosts = cfg.opts("client", "hosts").default
     client_options = cfg.opts("client", "options").default
     client_instance = client_factory(hosts, client_options).create()
-    if isinstance(client_instance, client.SolrClient):
-        return "9.10.1"
-    return None
+    if not isinstance(client_instance, client.SolrClient):
+        return None
+    try:
+        return client_instance.get_version()
+    except Exception as e:
+        # This version selects the workload branch (WorkloadRepository.update 
-> versions.best_match),
+        # so falling back to a default would silently benchmark the cluster 
with another major's workloads.
+        raise exceptions.SystemSetupError(
+            f"Could not determine the distribution version of the cluster at 
{hosts}. Specify it with "
+            f"--distribution-version. Cause: {e}"
+        ) from e
 
 
 def to_ip_port(hosts):
diff --git a/tests/builder/mechanic_test.py b/tests/builder/mechanic_test.py
index 069122b3..33dfc6f8 100644
--- a/tests/builder/mechanic_test.py
+++ b/tests/builder/mechanic_test.py
@@ -28,8 +28,9 @@
 import unittest.mock as mock
 from unittest import TestCase
 
-from solrorbit import config, exceptions
+from solrorbit import client, config, exceptions
 from solrorbit.builder import builder
+from solrorbit.utils import opts, versions
 
 
 class HostHandlingTests(TestCase):
@@ -140,3 +141,50 @@ class BuilderTests(TestCase):
         m.stop_engine()
         self.assertFalse(launcher.started)
         self.assertEqual(cleanup.call_count, 2)
+
+
+class ClusterDistributionVersionTests(TestCase):
+    @staticmethod
+    def cfg_for(hosts="localhost:8983"):
+        cfg = config.Config()
+        cfg.add(config.Scope.application, "client", "hosts", 
opts.TargetHosts(hosts))
+        cfg.add(config.Scope.application, "client", "options", 
opts.ClientOptions("timeout:60"))
+        return cfg
+
+    @staticmethod
+    def factory_returning(client_instance):
+        return lambda hosts, client_options: mock.Mock(create=lambda: 
client_instance)
+
+    def test_reads_the_version_from_the_cluster(self):
+        solr_client = mock.create_autospec(client.SolrClient, instance=True)
+        solr_client.get_version.return_value = "10.0.0"
+
+        version = builder.cluster_distribution_version(self.cfg_for(), 
client_factory=self.factory_returning(solr_client))
+
+        self.assertEqual("10.0.0", version)
+        solr_client.get_version.assert_called_once_with()
+
+    def test_selects_the_workload_branch_of_the_actual_major(self):
+        # The version is not informational: WorkloadRepository.update feeds it 
to versions.best_match,
+        # so a wrong value benchmarks the cluster with another major's 
workloads.
+        solr_client = mock.create_autospec(client.SolrClient, instance=True)
+        solr_client.get_version.return_value = "10.0.0"
+
+        version = builder.cluster_distribution_version(self.cfg_for(), 
client_factory=self.factory_returning(solr_client))
+
+        self.assertEqual("10", versions.best_match(["main", "9", "10"], 
version))
+
+    def 
test_fails_instead_of_guessing_when_the_cluster_cannot_be_reached(self):
+        solr_client = mock.create_autospec(client.SolrClient, instance=True)
+        solr_client.get_version.side_effect = 
client.SolrClientError("connection refused")
+
+        with self.assertRaises(exceptions.SystemSetupError) as ctx:
+            builder.cluster_distribution_version(self.cfg_for(), 
client_factory=self.factory_returning(solr_client))
+
+        self.assertIn("--distribution-version", str(ctx.exception))
+        self.assertIn("connection refused", str(ctx.exception))
+
+    def test_returns_none_for_a_non_solr_client(self):
+        self.assertIsNone(
+            builder.cluster_distribution_version(self.cfg_for(), 
client_factory=self.factory_returning(mock.Mock()))
+        )

Reply via email to