Skip to content

Commit 6f0dede

Browse files
authored
Fix and unmute package upgrade tests (#83043) (#83206)
Fixes PackageUpgradeTests (cherry picked from commit 514bec1)
1 parent 655669b commit 6f0dede

File tree

3 files changed

+53
-43
lines changed

3 files changed

+53
-43
lines changed

qa/os/src/test/java/org/elasticsearch/packaging/test/PackageUpgradeTests.java

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,16 @@
1212
import org.apache.http.entity.ContentType;
1313
import org.elasticsearch.Version;
1414
import org.elasticsearch.packaging.util.Distribution;
15+
import org.elasticsearch.packaging.util.FileUtils;
16+
import org.elasticsearch.packaging.util.Installation;
1517
import org.elasticsearch.packaging.util.Packages;
1618
import org.elasticsearch.packaging.util.ServerUtils;
1719
import org.junit.BeforeClass;
1820

21+
import java.io.IOException;
22+
import java.nio.file.Files;
1923
import java.nio.file.Paths;
24+
import java.util.List;
2025

2126
import static org.elasticsearch.packaging.util.Packages.assertInstalled;
2227
import static org.elasticsearch.packaging.util.Packages.installPackage;
@@ -41,9 +46,10 @@ public static void filterVersions() {
4146
public void test10InstallBwcVersion() throws Exception {
4247
installation = installPackage(sh, bwcDistribution);
4348
assertInstalled(bwcDistribution);
44-
// TODO: Add more tests here to assert behavior when updating from < v8 to > v8 with implicit/explicit behavior,
45-
// maybe as part of https://github.com/elastic/elasticsearch/pull/76879
46-
ServerUtils.disableSecurityFeatures(installation);
49+
// TODO Modify tests below to work with security when BWC version is after 8.0.0
50+
if (Version.fromString(bwcDistribution.baseVersion).onOrAfter(Version.V_8_0_0)) {
51+
possiblyRemoveSecurityConfiguration(installation);
52+
}
4753
}
4854

4955
public void test11ModifyKeystore() throws Exception {
@@ -90,15 +96,18 @@ public void test20InstallUpgradedVersion() throws Exception {
9096
installation = Packages.forceUpgradePackage(sh, distribution);
9197
} else {
9298
installation = Packages.upgradePackage(sh, distribution);
93-
verifySecurityNotAutoConfigured(installation);
9499
}
100+
// We add this so that we don't trigger the SecurityImplicitBehaviorBootstrapCheck in 8
101+
if (Version.fromString(bwcDistribution.baseVersion).before(Version.V_8_0_0)
102+
&& Version.fromString(distribution.baseVersion).onOrAfter(Version.V_8_0_0)) {
103+
ServerUtils.addSettingToExistingConfiguration(installation, "xpack.security.enabled", "false");
104+
}
105+
95106
assertInstalled(distribution);
96107
verifyPackageInstallation(installation, distribution, sh);
97-
// Upgrade overwrites the configuration file because we run with --force-confnew so we need to disable security again
98-
ServerUtils.disableSecurityFeatures(installation);
108+
verifySecurityNotAutoConfigured(installation);
99109
}
100110

101-
@AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/76283")
102111
public void test21CheckUpgradedVersion() throws Exception {
103112
assertWhileRunning(() -> { assertDocsExist(); });
104113
}
@@ -111,4 +120,22 @@ private void assertDocsExist() throws Exception {
111120
String response3 = ServerUtils.makeRequest(Request.Get("http://localhost:9200/library2/_doc/1?pretty"));
112121
assertThat(response3, containsString("Darkness"));
113122
}
123+
124+
private void possiblyRemoveSecurityConfiguration(Installation es) throws IOException {
125+
ServerUtils.disableSecurityFeatures(es);
126+
if (Files.exists(es.config("certs"))) {
127+
FileUtils.rm(es.config("certs"));
128+
}
129+
// remove security auto-configuration entries, in case bwc was > 8, since we disable security
130+
for (String entry : List.of(
131+
"xpack.security.transport.ssl.keystore.secure_password",
132+
"xpack.security.transport.ssl.truststore.secure_password",
133+
"xpack.security.http.ssl.keystore.secure_password",
134+
"autoconfiguration.password_hash"
135+
)) {
136+
if (es.executables().keystoreTool.run("list").stdout().contains(entry)) {
137+
es.executables().keystoreTool.run("remove " + entry);
138+
}
139+
}
140+
}
114141
}

qa/os/src/test/java/org/elasticsearch/packaging/test/PackagesSecurityAutoConfigurationTests.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import java.nio.file.StandardCopyOption;
3030
import java.security.SecureRandom;
3131
import java.util.List;
32-
import java.util.Optional;
3332
import java.util.function.Predicate;
3433
import java.util.stream.Collectors;
3534
import java.util.stream.Stream;
@@ -52,12 +51,13 @@
5251
import static org.hamcrest.Matchers.containsString;
5352
import static org.hamcrest.Matchers.equalTo;
5453
import static org.hamcrest.Matchers.hasItem;
55-
import static org.hamcrest.Matchers.is;
5654
import static org.hamcrest.Matchers.not;
5755
import static org.junit.Assume.assumeTrue;
5856

5957
public class PackagesSecurityAutoConfigurationTests extends PackagingTestCase {
6058

59+
private static final String AUTOCONFIG_DIRNAME = "certs";
60+
6161
@BeforeClass
6262
public static void filterDistros() {
6363
assumeTrue("rpm or deb", distribution.isPackage());
@@ -75,15 +75,13 @@ public void test10SecurityAutoConfiguredOnPackageInstall() throws Exception {
7575
public void test20SecurityNotAutoConfiguredOnReInstallation() throws Exception {
7676
// we are testing force upgrading in the current version
7777
// In such a case, security remains configured from the initial installation, we don't run it again.
78-
Optional<String> autoConfigDirName = getAutoConfigDirName(installation);
78+
byte[] transportKeystore = Files.readAllBytes(installation.config(AUTOCONFIG_DIRNAME).resolve("transport.p12"));
7979
installation = Packages.forceUpgradePackage(sh, distribution);
8080
assertInstalled(distribution);
8181
verifyPackageInstallation(installation, distribution, sh);
8282
verifySecurityAutoConfigured(installation);
83-
// Since we did not auto-configure the second time, the directory name should be the same
84-
assertThat(autoConfigDirName.isPresent(), is(true));
85-
assertThat(getAutoConfigDirName(installation).isPresent(), is(true));
86-
assertThat(getAutoConfigDirName(installation).get(), equalTo(autoConfigDirName.get()));
83+
// Since we did not auto-configure the second time, the keystore should be the one we generated the first time, above
84+
assertThat(transportKeystore, equalTo(Files.readAllBytes(installation.config(AUTOCONFIG_DIRNAME).resolve("transport.p12"))));
8785
}
8886

8987
public void test30SecurityNotAutoConfiguredWhenExistingDataDir() throws Exception {
@@ -161,9 +159,8 @@ public void test70ReconfigureFailsWhenTlsAutoConfDirMissing() throws Exception {
161159
verifySecurityAutoConfigured(installation);
162160
assertNotNull(installation.getElasticPassword());
163161

164-
Optional<String> autoConfigDirName = getAutoConfigDirName(installation);
165162
// Move instead of delete because Files.deleteIfExists bails on non empty dirs
166-
Files.move(installation.config(autoConfigDirName.get()), installation.config("temp-autoconf-dir"));
163+
Files.move(installation.config(AUTOCONFIG_DIRNAME), installation.config("temp-autoconf-dir"));
167164
Shell.Result result = installation.executables().nodeReconfigureTool.run("--enrollment-token a-token", "y", true);
168165
assertThat(result.exitCode(), equalTo(ExitCodes.USAGE)); //
169166
}
@@ -312,10 +309,13 @@ public void test73ReconfigureCreatesFilesWithCorrectPermissions() throws Excepti
312309
true
313310
);
314311
assertThat(result.exitCode(), CoreMatchers.equalTo(0));
315-
assertThat(installation.config("certs"), FileMatcher.file(Directory, "root", "elasticsearch", p750));
312+
assertThat(installation.config(AUTOCONFIG_DIRNAME), FileMatcher.file(Directory, "root", "elasticsearch", p750));
316313
Stream.of("http.p12", "http_ca.crt", "transport.p12")
317314
.forEach(
318-
file -> assertThat(installation.config("certs").resolve(file), FileMatcher.file(File, "root", "elasticsearch", p660))
315+
file -> assertThat(
316+
installation.config(AUTOCONFIG_DIRNAME).resolve(file),
317+
FileMatcher.file(File, "root", "elasticsearch", p660)
318+
)
319319
);
320320
}
321321
}

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

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,9 @@
6363
import java.nio.file.attribute.FileAttribute;
6464
import java.nio.file.attribute.PosixFilePermissions;
6565
import java.util.ArrayList;
66-
import java.util.Arrays;
6766
import java.util.Collections;
6867
import java.util.List;
6968
import java.util.Locale;
70-
import java.util.Optional;
7169
import java.util.concurrent.TimeUnit;
7270
import java.util.function.Predicate;
7371
import java.util.stream.Collectors;
@@ -629,22 +627,21 @@ public static void assertBusy(CheckedRunnable<Exception> codeBlock, long maxWait
629627
* @param es the {@link Installation} to check
630628
*/
631629
public void verifySecurityAutoConfigured(Installation es) throws Exception {
632-
Optional<String> autoConfigDirName = getAutoConfigDirName(es);
633-
assertThat(autoConfigDirName.isPresent(), Matchers.is(true));
630+
final String autoConfigDirName = "certs";
634631
final Settings settings;
635632
if (es.distribution.isArchive()) {
636633
// We chown the installation on Windows to Administrators so that we can auto-configure it.
637634
String owner = Platforms.WINDOWS ? "BUILTIN\\Administrators" : "elasticsearch";
638-
assertThat(es.config(autoConfigDirName.get()), FileMatcher.file(Directory, owner, owner, p750));
635+
assertThat(es.config(autoConfigDirName), FileMatcher.file(Directory, owner, owner, p750));
639636
Stream.of("http.p12", "http_ca.crt", "transport.p12")
640-
.forEach(file -> assertThat(es.config(autoConfigDirName.get()).resolve(file), FileMatcher.file(File, owner, owner, p660)));
637+
.forEach(file -> assertThat(es.config(autoConfigDirName).resolve(file), FileMatcher.file(File, owner, owner, p660)));
641638
settings = Settings.builder().loadFromPath(es.config("elasticsearch.yml")).build();
642639
} else if (es.distribution.isDocker()) {
643-
assertThat(es.config(autoConfigDirName.get()), DockerFileMatcher.file(Directory, "elasticsearch", "root", p750));
640+
assertThat(es.config(autoConfigDirName), DockerFileMatcher.file(Directory, "elasticsearch", "root", p750));
644641
Stream.of("http.p12", "http_ca.crt", "transport.p12")
645642
.forEach(
646643
file -> assertThat(
647-
es.config(autoConfigDirName.get()).resolve(file),
644+
es.config(autoConfigDirName).resolve(file),
648645
DockerFileMatcher.file(File, "elasticsearch", "root", p660)
649646
)
650647
);
@@ -655,13 +652,10 @@ public void verifySecurityAutoConfigured(Installation es) throws Exception {
655652
rm(localTempDir);
656653
} else {
657654
assert es.distribution.isPackage();
658-
assertThat(es.config(autoConfigDirName.get()), FileMatcher.file(Directory, "root", "elasticsearch", p750));
655+
assertThat(es.config(autoConfigDirName), FileMatcher.file(Directory, "root", "elasticsearch", p750));
659656
Stream.of("http.p12", "http_ca.crt", "transport.p12")
660657
.forEach(
661-
file -> assertThat(
662-
es.config(autoConfigDirName.get()).resolve(file),
663-
FileMatcher.file(File, "root", "elasticsearch", p660)
664-
)
658+
file -> assertThat(es.config(autoConfigDirName).resolve(file), FileMatcher.file(File, "root", "elasticsearch", p660))
665659
);
666660
assertThat(
667661
sh.run(es.executables().keystoreTool + " list").stdout(),
@@ -687,7 +681,7 @@ public void verifySecurityAutoConfigured(Installation es) throws Exception {
687681
* @param es the {@link Installation} to check
688682
*/
689683
public static void verifySecurityNotAutoConfigured(Installation es) throws Exception {
690-
assertThat(getAutoConfigDirName(es).isPresent(), Matchers.is(false));
684+
assertThat(Files.exists(es.config("certs")), Matchers.is(false));
691685
if (es.distribution.isPackage()) {
692686
if (Files.exists(es.config("elasticsearch.keystore"))) {
693687
assertThat(
@@ -707,15 +701,4 @@ public static void verifySecurityNotAutoConfigured(Installation es) throws Excep
707701
}
708702
}
709703

710-
public static Optional<String> getAutoConfigDirName(Installation es) {
711-
final Shell.Result lsResult;
712-
if (es.distribution.platform.equals(Distribution.Platform.WINDOWS)) {
713-
lsResult = sh.run("Get-ChildItem -Path " + es.config + " -Name");
714-
} else {
715-
lsResult = sh.run("find \"" + es.config + "\" -type d -maxdepth 1");
716-
}
717-
assertNotNull(lsResult.stdout());
718-
return Arrays.stream(lsResult.stdout().split("\n")).filter(f -> f.contains("certs")).findFirst();
719-
}
720-
721704
}

0 commit comments

Comments
 (0)