Skip to content

Commit 45c6d47

Browse files
authored
Create task for capturing transport versions in TransportVersions.csv (elastic#142183)
When a release is finalized, generateInitialTransportVersion creates a new transport version definition for the next release. In the old transport version system the setCompatibleVersions task would have been called to update TransportVersions.csv with the previous id to save it for lookups from id to release version. This commit creates a new task to first save the current id into TransportVersions.csv. Additionally, the setCompatibleVersions task no longer does anything, so it is removed, and the generateInitialTransportVersion task is updated to use the "stack version" terminology for clarity.
1 parent a6e4f0f commit 45c6d47

File tree

10 files changed

+243
-84
lines changed

10 files changed

+243
-84
lines changed

build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/AbstractTransportVersionFuncTest.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,16 @@ class AbstractTransportVersionFuncTest extends AbstractGradleFuncTest {
133133
referableAndReferencedTransportVersion("older_92", "8122000")
134134
referableAndReferencedTransportVersion("existing_92", "8123000,8012001")
135135
unreferableTransportVersion("initial_9.0.0", "8000000")
136+
unreferableTransportVersion("initial_9.1.0", "8011000")
136137
unreferableTransportVersion("initial_8.19.7", "7123001")
137138
transportVersionUpperBound("9.2", "existing_92", "8123000")
138139
transportVersionUpperBound("9.1", "existing_92", "8012001")
139140
transportVersionUpperBound("9.0", "initial_9.0.0", "8000000")
140141
transportVersionUpperBound("8.19", "initial_8.19.7", "7123001")
142+
javaResource("myserver", "org/elasticsearch/TransportVersions.csv", """
143+
9.0.0,8000000
144+
9.1.0,8012001
145+
""")
141146
// a mock version of TransportVersion, just here so we can compile Dummy.java et al
142147
javaSource("myserver", "org.elasticsearch", "TransportVersion", "", """
143148
public static TransportVersion fromName(String name) {

build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionFuncTest.groovy

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class GenerateInitialTransportVersionFuncTest extends AbstractTransportVersionFu
4848

4949
def "setup is valid"() {
5050
when:
51-
def result = runGenerateAndValidateTask("--release-version", "9.0.0").build()
51+
def result = runGenerateAndValidateTask("--stack-version", "9.1.0").build()
5252

5353
then:
5454
assertGenerateAndValidateSuccess(result)
@@ -62,9 +62,7 @@ class GenerateInitialTransportVersionFuncTest extends AbstractTransportVersionFu
6262
versionPropertiesFile.text = versionPropertiesFile.text.replace("9.2.0", "9.3.0")
6363

6464
when:
65-
System.out.println("Running generation initial task")
66-
def result = runGenerateAndValidateTask("--release-version", "9.2.0").build()
67-
System.out.println("Done running generation task")
65+
def result = runGenerateAndValidateTask("--stack-version", "9.2.0").build()
6866

6967
then:
7068
assertGenerateAndValidateSuccess(result)
@@ -75,7 +73,7 @@ class GenerateInitialTransportVersionFuncTest extends AbstractTransportVersionFu
7573

7674
def "patch updates existing upper bound"() {
7775
when:
78-
def result = runGenerateAndValidateTask("--release-version", "9.1.2").build()
76+
def result = runGenerateAndValidateTask("--stack-version", "9.1.2").build()
7977

8078
then:
8179
assertGenerateAndValidateSuccess(result)
@@ -85,7 +83,7 @@ class GenerateInitialTransportVersionFuncTest extends AbstractTransportVersionFu
8583

8684
def "cannot create upper bound file for patch"() {
8785
when:
88-
def result = runGenerateTask("--release-version", "9.3.7").buildAndFail()
86+
def result = runGenerateTask("--stack-version", "9.3.7").buildAndFail()
8987

9088
then:
9189
assertGenerateFailure(result, "Missing upper bound 9.3 for release version 9.3.7")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the "Elastic License
4+
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
package org.elasticsearch.gradle.internal.transport
11+
12+
import org.gradle.testkit.runner.BuildResult
13+
import org.gradle.testkit.runner.TaskOutcome
14+
15+
class UpdateTransportVersionsCSVFuncTest extends AbstractTransportVersionFuncTest {
16+
def runUpdateTask(String... additionalArgs) {
17+
List<String> args = new ArrayList<>()
18+
args.add(":myserver:updateTransportVersionsCSV")
19+
args.addAll(additionalArgs);
20+
return gradleRunner(args.toArray())
21+
}
22+
23+
void assertUpdateSuccess(BuildResult result) {
24+
assert result.task(":myserver:updateTransportVersionsCSV").outcome == TaskOutcome.SUCCESS
25+
}
26+
27+
void assertUpdateFailure(BuildResult result, String expectedOutput) {
28+
assert result.task(":myserver:updateTransportVersionsCSV").outcome == TaskOutcome.FAILED
29+
assertOutputContains(result.output, expectedOutput)
30+
}
31+
32+
void assertTransportVersionsCsv(String expectedContent) {
33+
File csvFile = file("myserver/src/main/resources/org/elasticsearch/TransportVersions.csv")
34+
assert csvFile.exists()
35+
// Normalize both sides: strip leading/trailing whitespace from each line and the whole string
36+
def actualLines = csvFile.text.readLines().collect { it.strip() }.findAll { it != "" }
37+
def expectedLines = expectedContent.readLines().collect { it.strip() }.findAll { it != "" }
38+
assert actualLines == expectedLines
39+
}
40+
41+
def "updates csv with minor version"() {
42+
when:
43+
def result = runUpdateTask("--stack-version", "9.2.0").build()
44+
45+
then:
46+
assertUpdateSuccess(result)
47+
assertTransportVersionsCsv("""
48+
9.0.0,8000000
49+
9.1.0,8012001
50+
9.2.0,8123000
51+
""")
52+
}
53+
54+
def "updates csv with patch version"() {
55+
given:
56+
execute("git checkout main")
57+
unreferableTransportVersion("initial_9.1.1", "8012002")
58+
transportVersionUpperBound("9.1", "initial_9.1.1", "8012002")
59+
execute('git commit -a -m "update"')
60+
61+
when:
62+
def result = runUpdateTask("--stack-version", "9.1.1").build()
63+
64+
then:
65+
assertUpdateSuccess(result)
66+
assertTransportVersionsCsv("""
67+
9.0.0,8000000
68+
9.1.0,8012001
69+
9.1.1,8012002
70+
""")
71+
}
72+
73+
def "fails when upper bound does not exist"() {
74+
when:
75+
def result = runUpdateTask("--stack-version", "9.3.0").buildAndFail()
76+
77+
then:
78+
assertUpdateFailure(result, "Missing upper bound 9.3 for stack version 9.3.0")
79+
}
80+
81+
def "is idempotent when version already exists"() {
82+
when:
83+
// Run the task twice with the same version
84+
def result1 = runUpdateTask("--stack-version", "9.2.0").build()
85+
def result2 = runUpdateTask("--stack-version", "9.2.0").build()
86+
87+
then:
88+
assertUpdateSuccess(result1)
89+
assertUpdateSuccess(result2)
90+
assertOutputContains(result2.output, "Version 9.2.0 already exists in TransportVersions.csv with correct transport version ID, skipping")
91+
// Should only have one entry for 9.2.0
92+
assertTransportVersionsCsv("""
93+
9.0.0,8000000
94+
9.1.0,8012001
95+
9.2.0,8123000
96+
""")
97+
}
98+
99+
def "fails when existing version has wrong transport version ID"() {
100+
given:
101+
// Manually add an entry with wrong transport version ID
102+
javaResource("myserver", "org/elasticsearch/TransportVersions.csv", """
103+
9.0.0,8000000
104+
9.1.0,8012001
105+
9.2.0,9999999
106+
""")
107+
108+
when:
109+
def result = runUpdateTask("--stack-version", "9.2.0").buildAndFail()
110+
111+
then:
112+
assertUpdateFailure(result, "Version 9.2.0 already exists in TransportVersions.csv with transport version ID 9999999, but expected 8123000")
113+
}
114+
}

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/release/AbstractVersionsTask.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ private static void replaceDefaultJavaParserClassCsm() {
114114

115115
private static final Logger LOGGER = Logging.getLogger(AbstractVersionsTask.class);
116116

117-
static final String TRANSPORT_VERSION_TYPE = "TransportVersion";
118117
static final String INDEX_VERSION_TYPE = "IndexVersion";
119118

120119
static final String SERVER_MODULE_PATH = "server/src/main/java/";
@@ -123,7 +122,6 @@ private static void replaceDefaultJavaParserClassCsm() {
123122
static final String INDEX_VERSIONS_FILE_PATH = SERVER_MODULE_PATH + "org/elasticsearch/index/IndexVersions.java";
124123

125124
static final String SERVER_RESOURCES_PATH = "server/src/main/resources/";
126-
static final String TRANSPORT_VERSIONS_RECORD = SERVER_RESOURCES_PATH + "org/elasticsearch/TransportVersions.csv";
127125
static final String INDEX_VERSIONS_RECORD = SERVER_RESOURCES_PATH + "org/elasticsearch/index/IndexVersions.csv";
128126

129127
final Path rootDir;

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/release/ReleaseToolsPlugin.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ public void apply(Project project) {
5252

5353
project.getTasks().register("extractCurrentVersions", ExtractCurrentVersionsTask.class);
5454
project.getTasks().register("tagVersions", TagVersionsTask.class);
55-
project.getTasks().register("setCompatibleVersions", SetCompatibleVersionsTask.class, t -> t.setThisVersion(version));
5655
project.getTasks().register("updateBranchesJson", UpdateBranchesJsonTask.class);
5756

5857
final Directory changeLogDirectory = projectDirectory.dir("docs/changelog");

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/release/SetCompatibleVersionsTask.java

Lines changed: 0 additions & 64 deletions
This file was deleted.

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/release/TagVersionsTask.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ public void executeTask() throws IOException {
6666

6767
for (var v : versions.entrySet()) {
6868
Path recordFile = switch (v.getKey()) {
69-
case TRANSPORT_VERSION_TYPE -> rootDir.resolve(TRANSPORT_VERSIONS_RECORD);
7069
case INDEX_VERSION_TYPE -> rootDir.resolve(INDEX_VERSIONS_RECORD);
7170
default -> throw new IllegalArgumentException("Unknown version type " + v.getKey());
7271
};
@@ -95,7 +94,7 @@ private static Map<String, Integer> expandV7Version(Map<String, Integer> tagVers
9594
Integer v7Version = tagVersions.get("Version");
9695
if (v7Version == null) return tagVersions;
9796

98-
return Map.of(TRANSPORT_VERSION_TYPE, v7Version, INDEX_VERSION_TYPE, v7Version);
97+
return Map.of(INDEX_VERSION_TYPE, v7Version);
9998
}
10099

101100
private static final Pattern VERSION_LINE = Pattern.compile("(\\d+\\.\\d+\\.\\d+),(\\d+)");

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionTask.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,37 +26,37 @@ public abstract class GenerateInitialTransportVersionTask extends DefaultTask {
2626
abstract Property<TransportVersionResourcesService> getResourceService();
2727

2828
@Input
29-
@Option(option = "release-version", description = "The Elasticsearch release version this transport version will be associated with")
30-
public abstract Property<String> getReleaseVersion();
29+
@Option(option = "stack-version", description = "The Elasticsearch version to generate an initial transport version for")
30+
public abstract Property<String> getStackVersion();
3131

3232
@Input
3333
abstract Property<Version> getCurrentVersion();
3434

3535
@TaskAction
3636
public void run() throws IOException {
37-
Version releaseVersion = Version.fromString(getReleaseVersion().get());
38-
String upperBoundName = getUpperBoundName(releaseVersion);
37+
Version stackVersion = Version.fromString(getStackVersion().get());
38+
String upperBoundName = getUpperBoundName(stackVersion);
3939
TransportVersionResourcesService resources = getResourceService().get();
4040
TransportVersionUpperBound baseUpperBound = resources.getUpperBoundFromGitBase(upperBoundName);
41-
String initialDefinitionName = "initial_" + releaseVersion;
41+
String initialDefinitionName = "initial_" + stackVersion;
4242
TransportVersionDefinition existingDefinition = resources.getUnreferableDefinitionFromGitBase(initialDefinitionName);
4343

4444
// This task runs on main and release branches. In release branches we will generate the exact same
4545
// upper bound result because we always look at the base branch (ie upstream/main).
4646
if (existingDefinition == null) {
4747
if (baseUpperBound == null) {
48-
throw new RuntimeException("Missing upper bound " + upperBoundName + " for release version " + releaseVersion);
48+
throw new RuntimeException("Missing upper bound " + upperBoundName + " for release version " + stackVersion);
4949
}
5050

5151
// minors increment by 1000 to create a unique base, patches increment by 1 as other patches do
52-
int increment = releaseVersion.getRevision() == 0 ? 1000 : 1;
52+
int increment = stackVersion.getRevision() == 0 ? 1000 : 1;
5353
var id = TransportVersionId.fromInt(baseUpperBound.definitionId().complete() + increment);
5454
var definition = new TransportVersionDefinition(initialDefinitionName, List.of(id), false);
5555
resources.writeDefinition(definition);
5656
var newUpperBound = new TransportVersionUpperBound(upperBoundName, initialDefinitionName, id);
5757
resources.writeUpperBound(newUpperBound);
5858

59-
if (releaseVersion.getRevision() == 0) {
59+
if (stackVersion.getRevision() == 0) {
6060
Version currentVersion = getCurrentVersion().get();
6161
String currentUpperBoundName = getUpperBoundName(currentVersion);
6262
var currentUpperBound = new TransportVersionUpperBound(currentUpperBoundName, initialDefinitionName, id);

build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,19 @@ public void apply(Project project) {
120120
var generateInitialTask = project.getTasks()
121121
.register("generateInitialTransportVersion", GenerateInitialTransportVersionTask.class, t -> {
122122
t.setGroup(taskGroup);
123-
t.setDescription("(Re)generates an initial transport version for an Elasticsearch release version");
123+
t.setDescription("Generates an initial transport version for an Elasticsearch release version");
124124
t.getCurrentVersion().set(currentVersion);
125125
});
126126
validateTask.configure(t -> t.mustRunAfter(generateInitialTask));
127+
128+
var updateTransportVersionsTask = project.getTasks()
129+
.register("updateTransportVersionsCSV", UpdateTransportVersionsCSVTask.class, t -> {
130+
t.setGroup(taskGroup);
131+
t.setDescription("Updates TransportVersions.csv with a new stack version entry");
132+
t.getTransportVersionsFile()
133+
.set(project.getLayout().getProjectDirectory().file("src/main/resources/org/elasticsearch/TransportVersions.csv"));
134+
});
135+
validateTask.configure(t -> t.mustRunAfter(updateTransportVersionsTask));
127136
}
128137

129138
private static String getResourceRoot(Project project) {

0 commit comments

Comments
 (0)