Skip to content

Commit

Permalink
Resolve JAVA_HOME for source builds lazily (#1027)
Browse files Browse the repository at this point in the history
With this commit we resolve JAVA_HOME lazily when attempting to build
Elasticsearch. When a source build is externally provided to Rally's
source artifact cache, there is no need to actually build it. However,
if the target system does not have any JDK installed and we attempt to
install Elasticsearch, the build subsystem is eagerly initialized
(despite the artifact being already cached) and is complaining that it
cannot find a JDK to build the artifact. By lazily resolving JAVA_HOME
we avoid that error.
  • Loading branch information
danielmitterdorfer authored Jul 20, 2020
1 parent b59bc09 commit ec2f8a2
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 21 deletions.
29 changes: 16 additions & 13 deletions esrally/mechanic/supplier.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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 "
Expand Down Expand Up @@ -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)
Expand Down
16 changes: 8 additions & 8 deletions tests/mechanic/supplier_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = [
Expand All @@ -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 = [
Expand Down

0 comments on commit ec2f8a2

Please sign in to comment.