Skip to content

Commit 142d483

Browse files
authored
Support downloading pre-built SNAPSHOT artifacts for BWC tests (opensearch-project#21008)
Add a -Dbwc.buildUnreleasedFromSource=false flag that downloads pre-built SNAPSHOT artifacts from artifacts.opensearch.org for unreleased versions instead of checking out git branches and compiling from source. The default behavior (building from source) is unchanged. Signed-off-by: Andrew Ross <andrross@amazon.com>
1 parent 8ffa576 commit 142d483

6 files changed

Lines changed: 147 additions & 31 deletions

File tree

buildSrc/src/main/java/org/opensearch/gradle/DistributionDownloadPlugin.java

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232

3333
package org.opensearch.gradle;
3434

35-
import org.opensearch.gradle.OpenSearchDistribution.Platform;
3635
import org.opensearch.gradle.OpenSearchDistribution.Type;
3736
import org.opensearch.gradle.docker.DockerSupportPlugin;
3837
import org.opensearch.gradle.docker.DockerSupportService;
@@ -221,40 +220,11 @@ private static void setupDownloadServiceRepo(Project project) {
221220
* coordinates that resolve to the OpenSearch download service through an ivy repository.
222221
*/
223222
private String dependencyNotation(OpenSearchDistribution distribution) {
224-
Version distroVersion = Version.fromString(distribution.getVersion());
225223
if (distribution.getType() == Type.INTEG_TEST_ZIP) {
226224
return "org.opensearch.distribution.integ-test-zip:opensearch:" + distribution.getVersion() + "@zip";
227225
}
228226

229-
String extension = distribution.getType().toString();
230-
String classifier = distroVersion.onOrAfter("1.0.0") ? ":x64" : ":x86_64";
231-
if (distribution.getType() == Type.ARCHIVE) {
232-
extension = distribution.getPlatform() == Platform.WINDOWS ? "zip" : "tar.gz";
233-
234-
switch (distribution.getArchitecture()) {
235-
case ARM64:
236-
classifier = ":" + distribution.getPlatform() + "-arm64";
237-
break;
238-
case X64:
239-
classifier = ":" + distribution.getPlatform() + "-x64";
240-
break;
241-
case S390X:
242-
classifier = ":" + distribution.getPlatform() + "-s390x";
243-
break;
244-
case PPC64LE:
245-
classifier = ":" + distribution.getPlatform() + "-ppc64le";
246-
break;
247-
case RISCV64:
248-
classifier = ":" + distribution.getPlatform() + "-riscv64";
249-
break;
250-
default:
251-
throw new IllegalArgumentException("Unsupported architecture: " + distribution.getArchitecture());
252-
}
253-
} else if (distribution.getType() == Type.DEB) {
254-
classifier = ":amd64";
255-
}
256-
257227
String group = distribution.getVersion().endsWith("-SNAPSHOT") ? FAKE_SNAPSHOT_IVY_GROUP : FAKE_IVY_GROUP;
258-
return group + ":opensearch" + ":" + distribution.getVersion() + classifier + "@" + extension;
228+
return group + ":opensearch:" + distribution.getVersion() + distribution.classifierAndExtension();
259229
}
260230
}

buildSrc/src/main/java/org/opensearch/gradle/OpenSearchDistribution.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,39 @@ public TaskDependency getBuildDependencies() {
216216
return configuration.getBuildDependencies();
217217
}
218218

219+
/**
220+
* Returns the classifier and extension portion of a dependency notation, e.g. {@code ":linux-x64@tar.gz"}.
221+
*/
222+
public String classifierAndExtension() {
223+
String extension = getType().toString();
224+
String classifier = ":x64";
225+
if (getType() == Type.ARCHIVE) {
226+
extension = getPlatform() == Platform.WINDOWS ? "zip" : "tar.gz";
227+
switch (getArchitecture()) {
228+
case ARM64:
229+
classifier = ":" + getPlatform() + "-arm64";
230+
break;
231+
case X64:
232+
classifier = ":" + getPlatform() + "-x64";
233+
break;
234+
case S390X:
235+
classifier = ":" + getPlatform() + "-s390x";
236+
break;
237+
case PPC64LE:
238+
classifier = ":" + getPlatform() + "-ppc64le";
239+
break;
240+
case RISCV64:
241+
classifier = ":" + getPlatform() + "-riscv64";
242+
break;
243+
default:
244+
throw new IllegalArgumentException("Unsupported architecture: " + getArchitecture());
245+
}
246+
} else if (getType() == Type.DEB) {
247+
classifier = ":amd64";
248+
}
249+
return classifier + "@" + extension;
250+
}
251+
219252
@Override
220253
public Iterator<File> iterator() {
221254
return configuration.iterator();

buildSrc/src/main/java/org/opensearch/gradle/info/BuildParams.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public class BuildParams {
6161
private static Boolean isInternal;
6262
private static Integer defaultParallel;
6363
private static Boolean isSnapshotBuild;
64+
private static Boolean buildUnreleasedFromSource;
6465
private static BwcVersions bwcVersions;
6566

6667
/**
@@ -147,6 +148,10 @@ public static boolean isSnapshotBuild() {
147148
return value(BuildParams.isSnapshotBuild);
148149
}
149150

151+
public static boolean buildUnreleasedFromSource() {
152+
return value(BuildParams.buildUnreleasedFromSource);
153+
}
154+
150155
private static <T> T value(T object) {
151156
if (object == null) {
152157
String callingMethod = Thread.currentThread().getStackTrace()[2].getMethodName();
@@ -256,6 +261,10 @@ public void setIsSnapshotBuild(final boolean isSnapshotBuild) {
256261
BuildParams.isSnapshotBuild = isSnapshotBuild;
257262
}
258263

264+
public void setBuildUnreleasedFromSource(final boolean buildUnreleasedFromSource) {
265+
BuildParams.buildUnreleasedFromSource = buildUnreleasedFromSource;
266+
}
267+
259268
public void setBwcVersions(BwcVersions bwcVersions) {
260269
BuildParams.bwcVersions = requireNonNull(bwcVersions);
261270
}

buildSrc/src/main/java/org/opensearch/gradle/info/GlobalBuildInfoPlugin.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ public void apply(Project project) {
133133
params.setDefaultParallel(findDefaultParallel(project));
134134
params.setInFipsJvm(FipsBuildParams.isInFipsMode());
135135
params.setIsSnapshotBuild(Util.getBooleanProperty("build.snapshot", true));
136+
params.setBuildUnreleasedFromSource(Util.getBooleanProperty("bwc.buildUnreleasedFromSource", true));
136137
if (isInternal) {
137138
params.setBwcVersions(resolveBwcVersions(rootDir));
138139
}

buildSrc/src/main/java/org/opensearch/gradle/internal/InternalDistributionDownloadPlugin.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ private void registerInternalDistributionResolutions(NamedDomainObjectContainer<
100100
resolutions.register("bwc", distributionResolution -> distributionResolution.setResolver((project, distribution) -> {
101101
BwcVersions.UnreleasedVersionInfo unreleasedInfo = bwcVersions.unreleasedInfo(Version.fromString(distribution.getVersion()));
102102
if (unreleasedInfo != null) {
103+
if (BuildParams.buildUnreleasedFromSource() == false) {
104+
// Download pre-built SNAPSHOT artifacts instead of building from source
105+
return DistributionDependency.of(snapshotDependencyNotation(distribution));
106+
}
103107
if (distribution.getBundledJdk() == JavaPackageType.NONE) {
104108
throw new GradleException(
105109
"Configuring a snapshot bwc distribution ('"
@@ -195,6 +199,16 @@ private static String distributionProjectName(OpenSearchDistribution distributio
195199
return projectName;
196200
}
197201

202+
/**
203+
* Constructs a dependency notation that resolves an unreleased version from the snapshot artifact repository.
204+
*/
205+
private static String snapshotDependencyNotation(OpenSearchDistribution distribution) {
206+
return "opensearch-distribution-snapshot:opensearch:"
207+
+ distribution.getVersion()
208+
+ "-SNAPSHOT"
209+
+ distribution.classifierAndExtension();
210+
}
211+
198212
private static class ProjectBasedDistributionDependency implements DistributionDependency {
199213

200214
private Function<String, Dependency> function;
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*/
8+
9+
package org.opensearch.gradle;
10+
11+
import org.opensearch.gradle.OpenSearchDistribution.Platform;
12+
import org.opensearch.gradle.OpenSearchDistribution.Type;
13+
import org.opensearch.gradle.test.GradleUnitTestCase;
14+
import org.gradle.api.NamedDomainObjectContainer;
15+
import org.gradle.api.Project;
16+
import org.gradle.testfixtures.ProjectBuilder;
17+
18+
public class OpenSearchDistributionTests extends GradleUnitTestCase {
19+
20+
private Project project;
21+
22+
private void initProject() {
23+
project = ProjectBuilder.builder().build();
24+
project.getPlugins().apply("opensearch.distribution-download");
25+
}
26+
27+
private OpenSearchDistribution createDistro(String name, Type type, Platform platform, Architecture arch) {
28+
if (project == null) {
29+
initProject();
30+
}
31+
NamedDomainObjectContainer<OpenSearchDistribution> distros = DistributionDownloadPlugin.getContainer(project);
32+
return distros.create(name, distro -> {
33+
distro.setVersion("3.5.1");
34+
distro.setType(type);
35+
if (platform != null) {
36+
distro.setPlatform(platform);
37+
}
38+
distro.setArchitecture(arch);
39+
});
40+
}
41+
42+
public void testClassifierAndExtensionLinuxX64() {
43+
OpenSearchDistribution distro = createDistro("linux-x64", Type.ARCHIVE, Platform.LINUX, Architecture.X64);
44+
distro.finalizeValues();
45+
assertEquals(":linux-x64@tar.gz", distro.classifierAndExtension());
46+
}
47+
48+
public void testClassifierAndExtensionLinuxArm64() {
49+
OpenSearchDistribution distro = createDistro("linux-arm64", Type.ARCHIVE, Platform.LINUX, Architecture.ARM64);
50+
distro.finalizeValues();
51+
assertEquals(":linux-arm64@tar.gz", distro.classifierAndExtension());
52+
}
53+
54+
public void testClassifierAndExtensionWindowsX64() {
55+
OpenSearchDistribution distro = createDistro("windows-x64", Type.ARCHIVE, Platform.WINDOWS, Architecture.X64);
56+
distro.finalizeValues();
57+
assertEquals(":windows-x64@zip", distro.classifierAndExtension());
58+
}
59+
60+
public void testClassifierAndExtensionRpm() {
61+
OpenSearchDistribution distro = createDistro("rpm", Type.RPM, null, Architecture.X64);
62+
distro.finalizeValues();
63+
assertEquals(":x64@rpm", distro.classifierAndExtension());
64+
}
65+
66+
public void testClassifierAndExtensionDeb() {
67+
OpenSearchDistribution distro = createDistro("deb", Type.DEB, null, Architecture.X64);
68+
distro.finalizeValues();
69+
assertEquals(":amd64@deb", distro.classifierAndExtension());
70+
}
71+
72+
public void testClassifierAndExtensionLinuxS390x() {
73+
OpenSearchDistribution distro = createDistro("linux-s390x", Type.ARCHIVE, Platform.LINUX, Architecture.S390X);
74+
distro.finalizeValues();
75+
assertEquals(":linux-s390x@tar.gz", distro.classifierAndExtension());
76+
}
77+
78+
public void testClassifierAndExtensionLinuxPpc64le() {
79+
OpenSearchDistribution distro = createDistro("linux-ppc64le", Type.ARCHIVE, Platform.LINUX, Architecture.PPC64LE);
80+
distro.finalizeValues();
81+
assertEquals(":linux-ppc64le@tar.gz", distro.classifierAndExtension());
82+
}
83+
84+
public void testClassifierAndExtensionLinuxRiscv64() {
85+
OpenSearchDistribution distro = createDistro("linux-riscv64", Type.ARCHIVE, Platform.LINUX, Architecture.RISCV64);
86+
distro.finalizeValues();
87+
assertEquals(":linux-riscv64@tar.gz", distro.classifierAndExtension());
88+
}
89+
}

0 commit comments

Comments
 (0)