Skip to content

Commit c8ac037

Browse files
authored
[FEATURE] Add OPENSEARCH_JAVA_HOME env to override JAVA_HOME (opensearch-project#2001)
Signed-off-by: Andriy Redko <andriy.redko@aiven.io>
1 parent 6da253b commit c8ac037

File tree

9 files changed

+125
-13
lines changed

9 files changed

+125
-13
lines changed

Vagrantfile

+1
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,7 @@ def sh_install_deps(config,
484484
cat \<\<SUDOERS_VARS > /etc/sudoers.d/opensearch_vars
485485
Defaults env_keep += "JAVA_HOME"
486486
Defaults env_keep += "SYSTEM_JAVA_HOME"
487+
Defaults env_keep += "OPENSEARCH_JAVA_HOME"
487488
SUDOERS_VARS
488489
chmod 0440 /etc/sudoers.d/opensearch_vars
489490
SHELL

distribution/packages/src/common/env/opensearch

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#OPENSEARCH_HOME=/usr/share/opensearch
77

88
# OpenSearch Java path
9-
#JAVA_HOME=
9+
#OPENSEARCH_JAVA_HOME=
1010

1111
# OpenSearch configuration directory
1212
# Note: this setting will be shared with command-line tools

distribution/packages/src/deb/init.d/opensearch

+2-1
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ DAEMON=$OPENSEARCH_HOME/bin/opensearch
6666
DAEMON_OPTS="-d -p $PID_FILE"
6767

6868
export OPENSEARCH_JAVA_OPTS
69-
export JAVA_HOME
7069
export OPENSEARCH_PATH_CONF
70+
export JAVA_HOME
71+
export OPENSEARCH_JAVA_HOME
7172

7273
if [ ! -x "$DAEMON" ]; then
7374
echo "The opensearch startup script does not exists or it is not executable, tried: $DAEMON"

distribution/packages/src/rpm/init.d/opensearch

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ export OPENSEARCH_JAVA_OPTS
5353
export JAVA_HOME
5454
export OPENSEARCH_PATH_CONF
5555
export OPENSEARCH_STARTUP_SLEEP_TIME
56+
export OPENSEARCH_JAVA_HOME
5657

5758
lockfile=/var/lock/subsys/$prog
5859

distribution/src/bin/opensearch-env

+5-2
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,11 @@ OPENSEARCH_HOME=`dirname "$OPENSEARCH_HOME"`
4444
# now set the classpath
4545
OPENSEARCH_CLASSPATH="$OPENSEARCH_HOME/lib/*"
4646

47-
# now set the path to java
48-
if [ ! -z "$JAVA_HOME" ]; then
47+
# now set the path to java: OPENSEARCH_JAVA_HOME -> JAVA_HOME -> bundled JDK
48+
if [ ! -z "$OPENSEARCH_JAVA_HOME" ]; then
49+
JAVA="$OPENSEARCH_JAVA_HOME/bin/java"
50+
JAVA_TYPE="OPENSEARCH_JAVA_HOME"
51+
elif [ ! -z "$JAVA_HOME" ]; then
4952
JAVA="$JAVA_HOME/bin/java"
5053
JAVA_TYPE="JAVA_HOME"
5154
else

distribution/src/bin/opensearch-env.bat

+9-6
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,19 @@ if "%1" == "nojava" (
3939
exit /b
4040
)
4141

42-
rem compariing to empty string makes this equivalent to bash -v check on env var
42+
rem comparing to empty string makes this equivalent to bash -v check on env var
4343
rem and allows to effectively force use of the bundled jdk when launching OpenSearch
44-
rem by setting JAVA_HOME=
45-
if "%JAVA_HOME%" == "" (
44+
rem by setting OPENSEARCH_JAVA_HOME= and JAVA_HOME=
45+
if not "%OPENSEARCH_JAVA_HOME%" == "" (
46+
set JAVA="%OPENSEARCH_JAVA_HOME%\bin\java.exe"
47+
set JAVA_TYPE=OPENSEARCH_JAVA_HOME
48+
) else if not "%JAVA_HOME%" == "" (
49+
set JAVA="%JAVA_HOME%\bin\java.exe"
50+
set JAVA_TYPE=JAVA_HOME
51+
) else (
4652
set JAVA="%OPENSEARCH_HOME%\jdk\bin\java.exe"
4753
set JAVA_HOME="%OPENSEARCH_HOME%\jdk"
4854
set JAVA_TYPE=bundled jdk
49-
) else (
50-
set JAVA="%JAVA_HOME%\bin\java.exe"
51-
set JAVA_TYPE=JAVA_HOME
5255
)
5356

5457
if not exist !JAVA! (

qa/os/src/test/java/org/opensearch/packaging/test/ArchiveTests.java

+69-1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ public void test20PluginsListWithNoPlugins() throws Exception {
8585
public void test30MissingBundledJdk() throws Exception {
8686
final Installation.Executables bin = installation.executables();
8787
sh.getEnv().remove("JAVA_HOME");
88+
sh.getEnv().remove("OPENSEARCH_JAVA_HOME");
8889

8990
final Path relocatedJdk = installation.bundledJdk.getParent().resolve("jdk.relocated");
9091

@@ -105,6 +106,7 @@ public void test30MissingBundledJdk() throws Exception {
105106

106107
public void test31BadJavaHome() throws Exception {
107108
final Installation.Executables bin = installation.executables();
109+
sh.getEnv().remove("OPENSEARCH_JAVA_HOME");
108110
sh.getEnv().put("JAVA_HOME", "doesnotexist");
109111

110112
// ask for opensearch version to quickly exit if java is actually found (ie test failure)
@@ -114,11 +116,23 @@ public void test31BadJavaHome() throws Exception {
114116

115117
}
116118

119+
public void test31BadOpensearchJavaHome() throws Exception {
120+
final Installation.Executables bin = installation.executables();
121+
sh.getEnv().put("OPENSEARCH_JAVA_HOME", "doesnotexist");
122+
123+
// ask for opensearch version to quickly exit if java is actually found (ie test failure)
124+
final Result runResult = sh.runIgnoreExitCode(bin.opensearch.toString() + " -V");
125+
assertThat(runResult.exitCode, is(1));
126+
assertThat(runResult.stderr, containsString("could not find java in OPENSEARCH_JAVA_HOME"));
127+
128+
}
129+
117130
public void test32SpecialCharactersInJdkPath() throws Exception {
118131
final Installation.Executables bin = installation.executables();
119132
assumeTrue("Only run this test when we know where the JDK is.", distribution().hasJdk);
120133

121134
final Path relocatedJdk = installation.bundledJdk.getParent().resolve("a (special) path");
135+
sh.getEnv().remove("OPENSEARCH_JAVA_HOME");
122136
sh.getEnv().put("JAVA_HOME", relocatedJdk.toString());
123137

124138
try {
@@ -154,6 +168,8 @@ public void test50StartAndStop() throws Exception {
154168
}
155169

156170
public void test51JavaHomeOverride() throws Exception {
171+
sh.getEnv().remove("OPENSEARCH_JAVA_HOME");
172+
157173
Platforms.onLinux(() -> {
158174
String systemJavaHome1 = sh.run("echo $SYSTEM_JAVA_HOME").stdout.trim();
159175
sh.getEnv().put("JAVA_HOME", systemJavaHome1);
@@ -171,8 +187,29 @@ public void test51JavaHomeOverride() throws Exception {
171187
assertThat(FileUtils.slurpAllLogs(installation.logs, "opensearch.log", "*.log.gz"), containsString(systemJavaHome1));
172188
}
173189

174-
public void test52BundledJdkRemoved() throws Exception {
190+
public void test51OpensearchJavaHomeOverride() throws Exception {
191+
Platforms.onLinux(() -> {
192+
String systemJavaHome1 = sh.run("echo $SYSTEM_JAVA_HOME").stdout.trim();
193+
sh.getEnv().put("OPENSEARCH_JAVA_HOME", systemJavaHome1);
194+
sh.getEnv().put("JAVA_HOME", "doesnotexist");
195+
});
196+
Platforms.onWindows(() -> {
197+
final String systemJavaHome1 = sh.run("$Env:SYSTEM_JAVA_HOME").stdout.trim();
198+
sh.getEnv().put("OPENSEARCH_JAVA_HOME", systemJavaHome1);
199+
sh.getEnv().put("JAVA_HOME", "doesnotexist");
200+
});
201+
202+
startOpenSearch();
203+
ServerUtils.runOpenSearchTests();
204+
stopOpenSearch();
205+
206+
String systemJavaHome1 = sh.getEnv().get("OPENSEARCH_JAVA_HOME");
207+
assertThat(FileUtils.slurpAllLogs(installation.logs, "opensearch.log", "*.log.gz"), containsString(systemJavaHome1));
208+
}
209+
210+
public void test52JavaHomeBundledJdkRemoved() throws Exception {
175211
assumeThat(distribution().hasJdk, is(true));
212+
sh.getEnv().remove("OPENSEARCH_JAVA_HOME");
176213

177214
Path relocatedJdk = installation.bundledJdk.getParent().resolve("jdk.relocated");
178215
try {
@@ -197,7 +234,37 @@ public void test52BundledJdkRemoved() throws Exception {
197234
}
198235
}
199236

237+
public void test52OpensearchJavaHomeBundledJdkRemoved() throws Exception {
238+
assumeThat(distribution().hasJdk, is(true));
239+
240+
Path relocatedJdk = installation.bundledJdk.getParent().resolve("jdk.relocated");
241+
try {
242+
mv(installation.bundledJdk, relocatedJdk);
243+
Platforms.onLinux(() -> {
244+
String systemJavaHome1 = sh.run("echo $SYSTEM_JAVA_HOME").stdout.trim();
245+
sh.getEnv().put("OPENSEARCH_JAVA_HOME", systemJavaHome1);
246+
sh.getEnv().put("JAVA_HOME", "doesnotexist");
247+
});
248+
Platforms.onWindows(() -> {
249+
final String systemJavaHome1 = sh.run("$Env:SYSTEM_JAVA_HOME").stdout.trim();
250+
sh.getEnv().put("OPENSEARCH_JAVA_HOME", systemJavaHome1);
251+
sh.getEnv().put("JAVA_HOME", "doesnotexist");
252+
});
253+
254+
startOpenSearch();
255+
ServerUtils.runOpenSearchTests();
256+
stopOpenSearch();
257+
258+
String systemJavaHome1 = sh.getEnv().get("OPENSEARCH_JAVA_HOME");
259+
assertThat(FileUtils.slurpAllLogs(installation.logs, "opensearch.log", "*.log.gz"), containsString(systemJavaHome1));
260+
} finally {
261+
mv(relocatedJdk, installation.bundledJdk);
262+
}
263+
}
264+
200265
public void test53JavaHomeWithSpecialCharacters() throws Exception {
266+
sh.getEnv().remove("OPENSEARCH_JAVA_HOME");
267+
201268
Platforms.onWindows(() -> {
202269
String javaPath = "C:\\Program Files (x86)\\java";
203270
try {
@@ -250,6 +317,7 @@ public void test54ForceBundledJdkEmptyJavaHome() throws Exception {
250317
// cleanup from previous test
251318
rm(installation.config("opensearch.keystore"));
252319

320+
sh.getEnv().put("OPENSEARCH_JAVA_HOME", "");
253321
sh.getEnv().put("JAVA_HOME", "");
254322

255323
startOpenSearch();

qa/os/src/test/java/org/opensearch/packaging/test/PackagingTestCase.java

+11-2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
package org.opensearch.packaging.test;
3434

3535
import com.carrotsearch.randomizedtesting.JUnit3MethodProvider;
36+
import com.carrotsearch.randomizedtesting.RandomizedContext;
3637
import com.carrotsearch.randomizedtesting.RandomizedRunner;
3738
import com.carrotsearch.randomizedtesting.annotations.TestCaseOrdering;
3839
import com.carrotsearch.randomizedtesting.annotations.TestGroup;
@@ -182,11 +183,19 @@ public void setup() throws Exception {
182183

183184
sh.reset();
184185
if (distribution().hasJdk == false) {
185-
Platforms.onLinux(() -> sh.getEnv().put("JAVA_HOME", systemJavaHome));
186-
Platforms.onWindows(() -> sh.getEnv().put("JAVA_HOME", systemJavaHome));
186+
// Randomly switch between JAVA_HOME and OPENSEARCH_JAVA_HOME
187+
final String javaHomeEnv = randomBoolean() ? "JAVA_HOME" : "OPENSEARCH_JAVA_HOME";
188+
logger.info("Using " + javaHomeEnv);
189+
190+
Platforms.onLinux(() -> sh.getEnv().put(javaHomeEnv, systemJavaHome));
191+
Platforms.onWindows(() -> sh.getEnv().put(javaHomeEnv, systemJavaHome));
187192
}
188193
}
189194

195+
private boolean randomBoolean() {
196+
return RandomizedContext.current().getRandom().nextBoolean();
197+
}
198+
190199
@After
191200
public void teardown() throws Exception {
192201
if (installation != null && failed == false) {

qa/os/src/test/java/org/opensearch/packaging/test/WindowsServiceTests.java

+26
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,20 @@ public void test13InstallMissingBundledJdk() throws IOException {
149149
}
150150

151151
public void test14InstallBadJavaHome() throws IOException {
152+
sh.getEnv().put("OPENSEARCH_JAVA_HOME", "");
152153
sh.getEnv().put("JAVA_HOME", "doesnotexist");
153154
Result result = sh.runIgnoreExitCode(serviceScript + " install");
154155
assertThat(result.exitCode, equalTo(1));
155156
assertThat(result.stderr, containsString("could not find java in JAVA_HOME"));
156157
}
157158

159+
public void test14InstallBadOpensearchJavaHome() throws IOException {
160+
sh.getEnv().put("OPENSEARCH_JAVA_HOME", "doesnotexist");
161+
Result result = sh.runIgnoreExitCode(serviceScript + " install");
162+
assertThat(result.exitCode, equalTo(1));
163+
assertThat(result.stderr, containsString("could not find java in OPENSEARCH_JAVA_HOME"));
164+
}
165+
158166
public void test15RemoveNotInstalled() {
159167
Result result = assertFailure(serviceScript + " remove", 1);
160168
assertThat(result.stdout, containsString("Failed removing '" + DEFAULT_ID + "' service"));
@@ -163,6 +171,7 @@ public void test15RemoveNotInstalled() {
163171
public void test16InstallSpecialCharactersInJdkPath() throws IOException {
164172
assumeTrue("Only run this test when we know where the JDK is.", distribution().hasJdk);
165173
final Path relocatedJdk = installation.bundledJdk.getParent().resolve("a (special) jdk");
174+
sh.getEnv().put("OPENSEARCH_JAVA_HOME", "");
166175
sh.getEnv().put("JAVA_HOME", relocatedJdk.toString());
167176

168177
try {
@@ -248,6 +257,7 @@ public void test32StopNotStarted() throws IOException {
248257

249258
public void test33JavaChanged() throws Exception {
250259
final Path relocatedJdk = installation.bundledJdk.getParent().resolve("jdk.relocated");
260+
sh.getEnv().put("OPENSEARCH_JAVA_HOME", "");
251261

252262
try {
253263
mv(installation.bundledJdk, relocatedJdk);
@@ -261,6 +271,22 @@ public void test33JavaChanged() throws Exception {
261271
}
262272
}
263273

274+
public void test33OpensearchJavaChanged() throws Exception {
275+
final Path relocatedJdk = installation.bundledJdk.getParent().resolve("jdk.relocated");
276+
sh.getEnv().put("JAVA_HOME", "");
277+
278+
try {
279+
mv(installation.bundledJdk, relocatedJdk);
280+
sh.getEnv().put("OPENSEARCH_JAVA_HOME", relocatedJdk.toString());
281+
assertCommand(serviceScript + " install");
282+
sh.getEnv().remove("OPENSEARCH_JAVA_HOME");
283+
assertCommand(serviceScript + " start");
284+
assertStartedAndStop();
285+
} finally {
286+
mv(relocatedJdk, installation.bundledJdk);
287+
}
288+
}
289+
264290
public void test60Manager() throws IOException {
265291
Path serviceMgr = installation.bin("opensearch-service-mgr.exe");
266292
Path tmpServiceMgr = serviceMgr.getParent().resolve(serviceMgr.getFileName() + ".tmp");

0 commit comments

Comments
 (0)