-
Notifications
You must be signed in to change notification settings - Fork 25.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[test] port archive distribution packaging tests #31314
Changes from all commits
1e1bc67
67c73e2
17291fa
2686d60
45dff8a
8012b78
25ce2ef
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -19,6 +19,12 @@ | |
|
||
package org.elasticsearch.packaging.test; | ||
|
||
import org.apache.http.client.fluent.Request; | ||
import org.elasticsearch.packaging.util.Archives; | ||
import org.elasticsearch.packaging.util.Platforms; | ||
import org.elasticsearch.packaging.util.ServerUtils; | ||
import org.elasticsearch.packaging.util.Shell; | ||
import org.elasticsearch.packaging.util.Shell.Result; | ||
import org.junit.Before; | ||
import org.junit.BeforeClass; | ||
import org.junit.FixMethodOrder; | ||
|
@@ -28,9 +34,33 @@ | |
import org.elasticsearch.packaging.util.Distribution; | ||
import org.elasticsearch.packaging.util.Installation; | ||
|
||
import java.io.IOException; | ||
import java.nio.file.Files; | ||
import java.nio.file.Path; | ||
import java.util.Arrays; | ||
import java.util.stream.Stream; | ||
|
||
import static java.util.stream.Collectors.joining; | ||
import static org.elasticsearch.packaging.util.Archives.ARCHIVE_OWNER; | ||
import static org.elasticsearch.packaging.util.Cleanup.cleanEverything; | ||
import static org.elasticsearch.packaging.util.Archives.installArchive; | ||
import static org.elasticsearch.packaging.util.Archives.verifyArchiveInstallation; | ||
import static org.elasticsearch.packaging.util.FileMatcher.Fileness.File; | ||
import static org.elasticsearch.packaging.util.FileMatcher.file; | ||
import static org.elasticsearch.packaging.util.FileMatcher.p660; | ||
import static org.elasticsearch.packaging.util.FileUtils.append; | ||
import static org.elasticsearch.packaging.util.FileUtils.cp; | ||
import static org.elasticsearch.packaging.util.FileUtils.getTempDir; | ||
import static org.elasticsearch.packaging.util.FileUtils.mkdir; | ||
import static org.elasticsearch.packaging.util.FileUtils.rm; | ||
import static org.elasticsearch.packaging.util.ServerUtils.makeRequest; | ||
import static org.hamcrest.CoreMatchers.containsString; | ||
import static org.hamcrest.CoreMatchers.is; | ||
import static org.hamcrest.CoreMatchers.notNullValue; | ||
import static org.hamcrest.MatcherAssert.assertThat; | ||
import static org.hamcrest.Matchers.isEmptyString; | ||
import static org.junit.Assert.assertTrue; | ||
import static org.junit.Assume.assumeThat; | ||
import static org.junit.Assume.assumeTrue; | ||
|
||
/** | ||
|
@@ -61,4 +91,226 @@ public void test10Install() { | |
installation = installArchive(distribution()); | ||
verifyArchiveInstallation(installation, distribution()); | ||
} | ||
|
||
@Test | ||
public void test20PluginsListWithNoPlugins() { | ||
assumeThat(installation, is(notNullValue())); | ||
|
||
final Installation.Executables bin = installation.executables(); | ||
final Shell sh = new Shell(); | ||
final Result r = sh.run(bin.elasticsearchPlugin + " list"); | ||
|
||
assertThat(r.stdout, isEmptyString()); | ||
} | ||
|
||
@Test | ||
public void test30AbortWhenJavaMissing() { | ||
assumeThat(installation, is(notNullValue())); | ||
|
||
final Installation.Executables bin = installation.executables(); | ||
final Shell sh = new Shell(); | ||
|
||
Platforms.onWindows(() -> { | ||
// on windows, removing java from PATH and removing JAVA_HOME is less involved than changing the permissions of the java | ||
// executable. we also don't check permissions in the windows scripts anyway | ||
final String originalPath = sh.run("$Env:PATH").stdout.trim(); | ||
final String newPath = Arrays.stream(originalPath.split(";")) | ||
.filter(path -> path.contains("Java") == false) | ||
.collect(joining(";")); | ||
|
||
// note the lack of a $ when clearing the JAVA_HOME env variable - with a $ it deletes the java home directory | ||
// https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/providers/environment-provider?view=powershell-6 | ||
// | ||
// this won't persist to another session so we don't have to reset anything | ||
final Result runResult = sh.runIgnoreExitCode( | ||
"$Env:PATH = '" + newPath + "'; " + | ||
"Remove-Item Env:JAVA_HOME; " + | ||
bin.elasticsearch | ||
); | ||
|
||
assertThat(runResult.exitCode, is(1)); | ||
assertThat(runResult.stderr, containsString("could not find java; set JAVA_HOME or ensure java is in PATH")); | ||
}); | ||
|
||
Platforms.onLinux(() -> { | ||
final String javaPath = sh.run("which java").stdout.trim(); | ||
|
||
try { | ||
sh.run("chmod -x '" + javaPath + "'"); | ||
final Result runResult = sh.runIgnoreExitCode(bin.elasticsearch.toString()); | ||
assertThat(runResult.exitCode, is(1)); | ||
assertThat(runResult.stdout, containsString("could not find java; set JAVA_HOME or ensure java is in PATH")); | ||
} finally { | ||
sh.run("chmod +x '" + javaPath + "'"); | ||
} | ||
}); | ||
} | ||
|
||
@Test | ||
public void test40CreateKeystoreManually() { | ||
assumeThat(installation, is(notNullValue())); | ||
|
||
final Installation.Executables bin = installation.executables(); | ||
final Shell sh = new Shell(); | ||
|
||
Platforms.onLinux(() -> sh.run("sudo -u " + ARCHIVE_OWNER + " " + bin.elasticsearchKeystore + " create")); | ||
|
||
// this is a hack around the fact that we can't run a command in the same session as the same user but not as administrator. | ||
// the keystore ends up being owned by the Administrators group, so we manually set it to be owned by the vagrant user here. | ||
// from the server's perspective the permissions aren't really different, this is just to reflect what we'd expect in the tests. | ||
// when we run these commands as a role user we won't have to do this | ||
Platforms.onWindows(() -> sh.run( | ||
bin.elasticsearchKeystore + " create; " + | ||
"$account = New-Object System.Security.Principal.NTAccount 'vagrant'; " + | ||
"$acl = Get-Acl '" + installation.config("elasticsearch.keystore") + "'; " + | ||
"$acl.SetOwner($account); " + | ||
"Set-Acl '" + installation.config("elasticsearch.keystore") + "' $acl" | ||
)); | ||
|
||
assertThat(installation.config("elasticsearch.keystore"), file(File, ARCHIVE_OWNER, ARCHIVE_OWNER, p660)); | ||
|
||
Platforms.onLinux(() -> { | ||
final Result r = sh.run("sudo -u " + ARCHIVE_OWNER + " " + bin.elasticsearchKeystore + " list"); | ||
assertThat(r.stdout, containsString("keystore.seed")); | ||
}); | ||
|
||
Platforms.onWindows(() -> { | ||
final Result r = sh.run(bin.elasticsearchKeystore + " list"); | ||
assertThat(r.stdout, containsString("keystore.seed")); | ||
}); | ||
} | ||
|
||
@Test | ||
public void test50StartAndStop() throws IOException { | ||
assumeThat(installation, is(notNullValue())); | ||
|
||
// cleanup from previous test | ||
rm(installation.config("elasticsearch.keystore")); | ||
|
||
Archives.runElasticsearch(installation); | ||
|
||
final String gcLogName = Platforms.LINUX | ||
? "gc.log.0.current" | ||
: "gc.log"; | ||
assertTrue("gc logs exist", Files.exists(installation.logs.resolve(gcLogName))); | ||
ServerUtils.runElasticsearchTests(); | ||
|
||
Archives.stopElasticsearch(installation); | ||
} | ||
|
||
@Test | ||
public void test60AutoCreateKeystore() { | ||
assumeThat(installation, is(notNullValue())); | ||
|
||
assertThat(installation.config("elasticsearch.keystore"), file(File, ARCHIVE_OWNER, ARCHIVE_OWNER, p660)); | ||
|
||
final Installation.Executables bin = installation.executables(); | ||
final Shell sh = new Shell(); | ||
|
||
Platforms.onLinux(() -> { | ||
final Result result = sh.run("sudo -u " + ARCHIVE_OWNER + " " + bin.elasticsearchKeystore + " list"); | ||
assertThat(result.stdout, containsString("keystore.seed")); | ||
}); | ||
|
||
Platforms.onWindows(() -> { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We could have methods such as
But we really don't need to go that far. This is fine as it is for now. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah I like the way that reads and did that before, but took it out because it didn't seem necessary |
||
final Result result = sh.run(bin.elasticsearchKeystore + " list"); | ||
assertThat(result.stdout, containsString("keystore.seed")); | ||
}); | ||
} | ||
|
||
@Test | ||
public void test70CustomPathConfAndJvmOptions() throws IOException { | ||
assumeThat(installation, is(notNullValue())); | ||
|
||
final Path tempConf = getTempDir().resolve("esconf-alternate"); | ||
|
||
try { | ||
mkdir(tempConf); | ||
cp(installation.config("elasticsearch.yml"), tempConf.resolve("elasticsearch.yml")); | ||
cp(installation.config("log4j2.properties"), tempConf.resolve("log4j2.properties")); | ||
|
||
// we have to disable Log4j from using JMX lest it will hit a security | ||
// manager exception before we have configured logging; this will fail | ||
// startup since we detect usages of logging before it is configured | ||
final String jvmOptions = | ||
"-Xms512m\n" + | ||
"-Xmx512m\n" + | ||
"-Dlog4j2.disable.jmx=true\n"; | ||
append(tempConf.resolve("jvm.options"), jvmOptions); | ||
|
||
final Shell sh = new Shell(); | ||
Platforms.onLinux(() -> sh.run("chown -R elasticsearch:elasticsearch " + tempConf)); | ||
Platforms.onWindows(() -> sh.run( | ||
"$account = New-Object System.Security.Principal.NTAccount 'vagrant'; " + | ||
"$tempConf = Get-ChildItem '" + tempConf + "' -Recurse; " + | ||
"$tempConf += Get-Item '" + tempConf + "'; " + | ||
"$tempConf | ForEach-Object { " + | ||
"$acl = Get-Acl $_.FullName; " + | ||
"$acl.SetOwner($account); " + | ||
"Set-Acl $_.FullName $acl " + | ||
"}" | ||
)); | ||
|
||
final Shell serverShell = new Shell(); | ||
serverShell.getEnv().put("ES_PATH_CONF", tempConf.toString()); | ||
serverShell.getEnv().put("ES_JAVA_OPTS", "-XX:-UseCompressedOops"); | ||
|
||
Archives.runElasticsearch(installation, serverShell); | ||
|
||
final String nodesResponse = makeRequest(Request.Get("http://localhost:9200/_nodes")); | ||
assertThat(nodesResponse, containsString("\"heap_init_in_bytes\":536870912")); | ||
assertThat(nodesResponse, containsString("\"using_compressed_ordinary_object_pointers\":\"false\"")); | ||
|
||
Archives.stopElasticsearch(installation); | ||
|
||
} finally { | ||
rm(tempConf); | ||
} | ||
} | ||
|
||
@Test | ||
public void test80RelativePathConf() throws IOException { | ||
assumeThat(installation, is(notNullValue())); | ||
|
||
final Path temp = getTempDir().resolve("esconf-alternate"); | ||
final Path tempConf = temp.resolve("config"); | ||
|
||
try { | ||
mkdir(tempConf); | ||
Stream.of( | ||
"elasticsearch.yml", | ||
"log4j2.properties", | ||
"jvm.options" | ||
).forEach(file -> cp(installation.config(file), tempConf.resolve(file))); | ||
|
||
append(tempConf.resolve("elasticsearch.yml"), "node.name: relative"); | ||
|
||
final Shell sh = new Shell(); | ||
Platforms.onLinux(() -> sh.run("chown -R elasticsearch:elasticsearch " + temp)); | ||
Platforms.onWindows(() -> sh.run( | ||
"$account = New-Object System.Security.Principal.NTAccount 'vagrant'; " + | ||
"$tempConf = Get-ChildItem '" + temp + "' -Recurse; " + | ||
"$tempConf += Get-Item '" + temp + "'; " + | ||
"$tempConf | ForEach-Object { " + | ||
"$acl = Get-Acl $_.FullName; " + | ||
"$acl.SetOwner($account); " + | ||
"Set-Acl $_.FullName $acl " + | ||
"}" | ||
)); | ||
|
||
final Shell serverShell = new Shell(temp); | ||
serverShell.getEnv().put("ES_PATH_CONF", "config"); | ||
Archives.runElasticsearch(installation, serverShell); | ||
|
||
final String nodesResponse = makeRequest(Request.Get("http://localhost:9200/_nodes")); | ||
assertThat(nodesResponse, containsString("\"name\":\"relative\"")); | ||
|
||
Archives.stopElasticsearch(installation); | ||
|
||
} finally { | ||
rm(tempConf); | ||
} | ||
} | ||
|
||
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Note to self to check on this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Usage of httpcomponents' client in general, or the fluent api? I just added the latter to reduce the verbosity a little but don't mind removing it
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The fluent API.