diff --git a/esrally/mechanic/supplier.py b/esrally/mechanic/supplier.py index dd8e1ac82..d3cfa5db2 100644 --- a/esrally/mechanic/supplier.py +++ b/esrally/mechanic/supplier.py @@ -49,9 +49,14 @@ def create(cfg, sources, distribution, build, car, plugins=None): template_renderer = TemplateRenderer(version=es_version, os_name=target_os, arch=target_arch) if build_needed: - java_home = _java_home(car) + raw_build_jdk = car.mandatory_var("build.jdk") + try: + build_jdk = int(raw_build_jdk) + except ValueError: + raise exceptions.SystemSetupError(f"Car config key [build.jdk] is invalid: [{raw_build_jdk}] (must be int)") + es_src_dir = os.path.join(_src_dir(cfg), _config_value(src_config, "elasticsearch.src.subdir")) - builder = Builder(es_src_dir, java_home, paths.logs()) + builder = Builder(es_src_dir, build_jdk, paths.logs()) else: builder = None @@ -131,15 +136,6 @@ def create(cfg, sources, distribution, build, car, plugins=None): return CompositeSupplier(suppliers) -def _java_home(car): - build_jdk = car.mandatory_var("build.jdk") - try: - _, path = jvm.resolve_path(int(build_jdk)) - return path - except ValueError: - raise exceptions.SystemSetupError("Car config key \"build.jdk\" is invalid: \"{}\" (must be int)".format(build_jdk)) - - def _required_version(version): if not version or version.strip() == "": raise exceptions.SystemSetupError("Could not determine version. Please specify the Elasticsearch distribution " @@ -654,12 +650,19 @@ class Builder: It is not intended to be used directly but should be triggered by its mechanic. """ - def __init__(self, src_dir, java_home=None, log_dir=None): + def __init__(self, src_dir, build_jdk=None, log_dir=None): self.src_dir = src_dir - self.java_home = java_home + self.build_jdk = build_jdk + self._java_home = None self.log_dir = log_dir self.logger = logging.getLogger(__name__) + @property + def java_home(self): + if not self._java_home: + _, self._java_home = jvm.resolve_path(self.build_jdk) + return self._java_home + def build(self, commands, override_src_dir=None): for command in commands: self.run(command, override_src_dir) diff --git a/tests/mechanic/supplier_test.py b/tests/mechanic/supplier_test.py index cdc0787eb..9f0afacae 100644 --- a/tests/mechanic/supplier_test.py +++ b/tests/mechanic/supplier_test.py @@ -134,12 +134,12 @@ def test_is_not_commit_hash(self): class BuilderTests(TestCase): @mock.patch("esrally.utils.process.run_subprocess") - @mock.patch("esrally.utils.jvm.major_version") - def test_build_on_jdk_8(self, jvm_major_version, mock_run_subprocess): - jvm_major_version.return_value = 8 + @mock.patch("esrally.utils.jvm.resolve_path") + def test_build_on_jdk_8(self, jvm_resolve_path, mock_run_subprocess): + jvm_resolve_path.return_value = (8, "/opt/jdk8") mock_run_subprocess.return_value = False - b = supplier.Builder(src_dir="/src", java_home="/opt/jdk8", log_dir="logs") + b = supplier.Builder(src_dir="/src", build_jdk=8, log_dir="logs") b.build(["./gradlew clean", "./gradlew assemble"]) calls = [ @@ -152,12 +152,12 @@ def test_build_on_jdk_8(self, jvm_major_version, mock_run_subprocess): mock_run_subprocess.assert_has_calls(calls) @mock.patch("esrally.utils.process.run_subprocess") - @mock.patch("esrally.utils.jvm.major_version") - def test_build_on_jdk_10(self, jvm_major_version, mock_run_subprocess): - jvm_major_version.return_value = 10 + @mock.patch("esrally.utils.jvm.resolve_path") + def test_build_on_jdk_10(self, jvm_resolve_path, mock_run_subprocess): + jvm_resolve_path.return_value = (10, "/opt/jdk10") mock_run_subprocess.return_value = False - b = supplier.Builder(src_dir="/src", java_home="/opt/jdk10", log_dir="logs") + b = supplier.Builder(src_dir="/src", build_jdk=8, log_dir="logs") b.build(["./gradlew clean", "./gradlew assemble"]) calls = [