Skip to content

Commit 32b90cf

Browse files
authored
[9.1] Add more transport version validation cases (elastic#134597) (elastic#134947)
* Add more transport version validation cases (elastic#134597) This commit adds a few more validations: * we cannot jump the primary id more than the normal increment * we cannot remove an existing id Also fixed definition path output in some validation error messages. * Only validate primary ids on release branches (elastic#135044) Primary ids are only incremented on the main branch. For release branches only patch ids will be created. The primary id validation won't always work on release branches because only some of the primary ids will be backported. This commit skips primary id validation if we are sure we are on a release branch. We can tell this by looking at the current upper bound compared to other upper bounds. If there is a newer one, we know we are on a release branch. If there isn't a newer one, we _might_ be on a release branch, or on main, but in this case doing primary id validation is ok because there's effectively no difference, we are looking at the latest upper bound.
1 parent 5041157 commit 32b90cf

9 files changed

+194
-90
lines changed

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,13 @@ class AbstractTransportVersionFuncTest extends AbstractGradleFuncTest {
128128
tasks.named('generateTransportVersion') {
129129
currentUpperBoundName = '9.2'
130130
}
131+
tasks.named('validateTransportVersionResources') {
132+
currentUpperBoundName = '9.2'
133+
}
131134
"""
132-
referableTransportVersion("existing_91", "8012000")
133-
referableTransportVersion("existing_92", "8123000,8012001")
135+
referableAndReferencedTransportVersion("existing_91", "8012000")
136+
referableAndReferencedTransportVersion("older_92", "8122000")
137+
referableAndReferencedTransportVersion("existing_92", "8123000,8012001")
134138
unreferableTransportVersion("initial_9.0.0", "8000000")
135139
unreferableTransportVersion("initial_8.19.7", "7123001")
136140
transportVersionUpperBound("9.2", "existing_92", "8123000")
@@ -143,10 +147,6 @@ class AbstractTransportVersionFuncTest extends AbstractGradleFuncTest {
143147
return null;
144148
}
145149
""")
146-
javaSource("myserver", "org.elasticsearch", "Dummy", "", """
147-
static final TransportVersion existing91 = TransportVersion.fromName("existing_91");
148-
static final TransportVersion existing92 = TransportVersion.fromName("existing_92");
149-
""")
150150

151151
file("myplugin/build.gradle") << """
152152
apply plugin: 'java-library'

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ class TransportVersionGenerationFuncTest extends AbstractTransportVersionFuncTes
428428
assertUpperBound("9.2", "new_tv,8123100")
429429
}
430430

431-
def "an invalid increment should fail"() {
431+
def "a non-positive increment should fail"() {
432432
given:
433433
referencedTransportVersion("new_tv")
434434

@@ -439,6 +439,17 @@ class TransportVersionGenerationFuncTest extends AbstractTransportVersionFuncTes
439439
assertOutputContains(result.output, "Invalid increment 0, must be a positive integer")
440440
}
441441

442+
def "an increment larger than 1000 should fail"() {
443+
given:
444+
referencedTransportVersion("new_tv")
445+
446+
when:
447+
def result = runGenerateTask("--increment=1001").buildAndFail()
448+
449+
then:
450+
assertOutputContains(result.output, "Invalid increment 1001, must be no larger than 1000")
451+
}
452+
442453
def "a new definition exists and is in the latest file, but the version id is wrong and needs to be updated"(){
443454
given:
444455
referableAndReferencedTransportVersion("new_tv", "1000000")

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

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,17 @@ class TransportVersionValidationFuncTest extends AbstractTransportVersionFuncTes
118118
def result = validateResourcesFails()
119119
then:
120120
assertValidateResourcesFailure(result, "Transport version definition file " +
121-
"[myserver/src/main/resources/transport/definitions/referable/existing_92.csv] modifies existing patch id from 8012001 to 8012002")
121+
"[myserver/src/main/resources/transport/definitions/referable/existing_92.csv] has modified patch id from 8012001 to 8012002")
122+
}
123+
124+
def "cannot change committed ids"() {
125+
given:
126+
referableTransportVersion("existing_92", "8123000")
127+
when:
128+
def result = validateResourcesFails()
129+
then:
130+
assertValidateResourcesFailure(result, "Transport version definition file " +
131+
"[myserver/src/main/resources/transport/definitions/referable/existing_92.csv] has removed id 8012001")
122132
}
123133

124134
def "upper bounds files must reference defined name"() {
@@ -201,8 +211,8 @@ class TransportVersionValidationFuncTest extends AbstractTransportVersionFuncTes
201211

202212
def "upper bound can refer to an unreferable definition"() {
203213
given:
204-
unreferableTransportVersion("initial_10.0.0", "10000000")
205-
transportVersionUpperBound("10.0", "initial_10.0.0", "10000000")
214+
unreferableTransportVersion("initial_9.3.0", "8124000")
215+
transportVersionUpperBound("9.3", "initial_9.3.0", "8124000")
206216
when:
207217
def result = gradleRunner(":myserver:validateTransportVersionResources").build()
208218
then:
@@ -232,24 +242,56 @@ class TransportVersionValidationFuncTest extends AbstractTransportVersionFuncTes
232242

233243
def "highest id in an referable definition should exist in an upper bounds file"() {
234244
given:
235-
referableAndReferencedTransportVersion("some_tv", "10000000")
245+
referableAndReferencedTransportVersion("some_tv", "8124000")
236246
when:
237247
def result = validateResourcesFails()
238248
then:
239249
assertValidateResourcesFailure(result, "Transport version definition file " +
240250
"[myserver/src/main/resources/transport/definitions/referable/some_tv.csv] " +
241-
"has the highest transport version id [10000000] but is not present in any upper bounds files")
251+
"has the highest transport version id [8124000] but is not present in any upper bounds files")
242252
}
243253

244254
def "highest id in an unreferable definition should exist in an upper bounds file"() {
245255
given:
246-
unreferableTransportVersion("initial_10.0.0", "10000000")
256+
unreferableTransportVersion("initial_9.3.0", "8124000")
247257
when:
248258
def result = validateResourcesFails()
249259
then:
250-
// TODO: this should be _unreferable_ in the error message, but will require some rework
251260
assertValidateResourcesFailure(result, "Transport version definition file " +
252-
"[myserver/src/main/resources/transport/definitions/referable/initial_10.0.0.csv] " +
253-
"has the highest transport version id [10000000] but is not present in any upper bounds files")
261+
"[myserver/src/main/resources/transport/definitions/unreferable/initial_9.3.0.csv] " +
262+
"has the highest transport version id [8124000] but is not present in any upper bounds files")
263+
}
264+
265+
def "primary ids cannot jump ahead too fast"() {
266+
given:
267+
referableAndReferencedTransportVersion("some_tv", "8125000")
268+
transportVersionUpperBound("9.2", "some_tv", "8125000")
269+
270+
when:
271+
def result = validateResourcesFails()
272+
273+
then:
274+
assertValidateResourcesFailure(result, "Transport version definition file " +
275+
"[myserver/src/main/resources/transport/definitions/referable/some_tv.csv] " +
276+
"has primary id 8125000 which is more than maximum increment 1000 from id 8123000 in definition " +
277+
"[myserver/src/main/resources/transport/definitions/referable/existing_92.csv]"
278+
)
279+
}
280+
281+
def "primary id checks skipped on release branch"() {
282+
given:
283+
file("myserver/build.gradle") << """
284+
tasks.named('validateTransportVersionResources') {
285+
currentUpperBoundName = '9.1'
286+
}
287+
"""
288+
referableAndReferencedTransportVersion("some_tv", "8125000")
289+
transportVersionUpperBound("9.2", "some_tv", "8125000")
290+
291+
when:
292+
def result = gradleRunner("validateTransportVersionResources").build()
293+
294+
then:
295+
result.task(":myserver:validateTransportVersionResources").outcome == TaskOutcome.SUCCESS
254296
}
255297
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ public void run() throws IOException {
5252
// minors increment by 1000 to create a unique base, patches increment by 1 as other patches do
5353
int increment = releaseVersion.getRevision() == 0 ? 1000 : 1;
5454
var id = TransportVersionId.fromInt(upstreamUpperBound.definitionId().complete() + increment);
55-
var definition = new TransportVersionDefinition(initialDefinitionName, List.of(id));
56-
resources.writeUnreferableDefinition(definition);
55+
var definition = new TransportVersionDefinition(initialDefinitionName, List.of(id), false);
56+
resources.writeDefinition(definition);
5757
var newUpperBound = new TransportVersionUpperBound(upperBoundName, initialDefinitionName, id);
5858
resources.writeUpperBound(newUpperBound, false);
5959

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public void run() throws IOException {
111111
} else {
112112
List<TransportVersionId> ids = updateUpperBounds(resources, upstreamUpperBounds, targetUpperBoundNames, targetDefinitionName);
113113
// (Re)write the definition file.
114-
resources.writeReferableDefinition(new TransportVersionDefinition(targetDefinitionName, ids));
114+
resources.writeDefinition(new TransportVersionDefinition(targetDefinitionName, ids, true));
115115
}
116116

117117
removeUnusedNamedDefinitions(resources, referencedNames, changedDefinitionNames);
@@ -128,6 +128,9 @@ private List<TransportVersionId> updateUpperBounds(
128128
if (increment <= 0) {
129129
throw new IllegalArgumentException("Invalid increment " + increment + ", must be a positive integer");
130130
}
131+
if (increment > 1000) {
132+
throw new IllegalArgumentException("Invalid increment " + increment + ", must be no larger than 1000");
133+
}
131134
List<TransportVersionId> ids = new ArrayList<>();
132135
boolean stageInGit = getResolveConflict().getOrElse(false);
133136

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
import java.util.ArrayList;
1414
import java.util.List;
1515

16-
record TransportVersionDefinition(String name, List<TransportVersionId> ids) {
17-
public static TransportVersionDefinition fromString(Path file, String contents) {
16+
record TransportVersionDefinition(String name, List<TransportVersionId> ids, boolean isReferable) {
17+
public static TransportVersionDefinition fromString(Path file, String contents, boolean isReferable) {
1818
String filename = file.getFileName().toString();
1919
assert filename.endsWith(".csv");
2020
String name = filename.substring(0, filename.length() - 4);
@@ -41,6 +41,6 @@ public static TransportVersionDefinition fromString(Path file, String contents)
4141
}
4242
}
4343

44-
return new TransportVersionDefinition(name, ids);
44+
return new TransportVersionDefinition(name, ids, isReferable);
4545
}
4646
}

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

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.elasticsearch.gradle.internal.conventions.VersionPropertiesPlugin;
1515
import org.elasticsearch.gradle.internal.conventions.precommit.PrecommitPlugin;
1616
import org.elasticsearch.gradle.internal.conventions.precommit.PrecommitTaskPlugin;
17+
import org.gradle.api.Action;
1718
import org.gradle.api.Plugin;
1819
import org.gradle.api.Project;
1920
import org.gradle.api.file.Directory;
@@ -73,6 +74,7 @@ public void apply(Project project) {
7374
t.getReferencesFiles().setFrom(tvReferencesConfig);
7475
t.getShouldValidateDensity().convention(true);
7576
t.getShouldValidatePrimaryIdNotPatch().convention(true);
77+
t.getCurrentUpperBoundName().convention(currentVersion.getMajor() + "." + currentVersion.getMinor());
7678
});
7779
project.getTasks().named(PrecommitPlugin.PRECOMMIT_TASK_NAME).configure(t -> t.dependsOn(validateTask));
7880

@@ -83,19 +85,31 @@ public void apply(Project project) {
8385
t.getManifestFile().set(project.getLayout().getBuildDirectory().file("generated-resources/manifest.txt"));
8486
});
8587
project.getTasks().named(JavaPlugin.PROCESS_RESOURCES_TASK_NAME, Copy.class).configure(t -> {
86-
t.into("transport/definitions", c -> c.from(generateManifestTask));
88+
t.into(resourceRoot + "/definitions", c -> c.from(generateManifestTask));
8789
});
8890

91+
Action<GenerateTransportVersionDefinitionTask> generationConfiguration = t -> {
92+
t.setGroup(taskGroup);
93+
t.getReferencesFiles().setFrom(tvReferencesConfig);
94+
t.getIncrement().convention(1000);
95+
t.getCurrentUpperBoundName().convention(currentVersion.getMajor() + "." + currentVersion.getMinor());
96+
};
97+
8998
var generateDefinitionsTask = project.getTasks()
9099
.register("generateTransportVersion", GenerateTransportVersionDefinitionTask.class, t -> {
91-
t.setGroup(taskGroup);
92100
t.setDescription("(Re)generates a transport version definition file");
93-
t.getReferencesFiles().setFrom(tvReferencesConfig);
94-
t.getIncrement().convention(1000);
95-
t.getCurrentUpperBoundName().convention(currentVersion.getMajor() + "." + currentVersion.getMinor());
96101
});
102+
generateDefinitionsTask.configure(generationConfiguration);
97103
validateTask.configure(t -> t.mustRunAfter(generateDefinitionsTask));
98104

105+
var resolveConflictTask = project.getTasks()
106+
.register("resolveTransportVersionConflict", GenerateTransportVersionDefinitionTask.class, t -> {
107+
t.setDescription("Resolve merge conflicts in transport version internal state files");
108+
t.getResolveConflict().set(true);
109+
});
110+
resolveConflictTask.configure(generationConfiguration);
111+
validateTask.configure(t -> t.mustRunAfter(resolveConflictTask));
112+
99113
var generateInitialTask = project.getTasks()
100114
.register("generateInitialTransportVersion", GenerateInitialTransportVersionTask.class, t -> {
101115
t.setGroup(taskGroup);

0 commit comments

Comments
 (0)