Skip to content

Commit fd12dcf

Browse files
authored
[8.19] Add more transport version validation cases (#134597) (#134946)
* Add more transport version validation cases (#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 (#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. * fix compile
1 parent 421b6f4 commit fd12dcf

9 files changed

+198
-91
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
@@ -125,9 +125,13 @@ class AbstractTransportVersionFuncTest extends AbstractGradleFuncTest {
125125
tasks.named('generateTransportVersion') {
126126
currentUpperBoundName = '9.2'
127127
}
128+
tasks.named('validateTransportVersionResources') {
129+
currentUpperBoundName = '9.2'
130+
}
128131
"""
129-
referableTransportVersion("existing_91", "8012000")
130-
referableTransportVersion("existing_92", "8123000,8012001")
132+
referableAndReferencedTransportVersion("existing_91", "8012000")
133+
referableAndReferencedTransportVersion("older_92", "8122000")
134+
referableAndReferencedTransportVersion("existing_92", "8123000,8012001")
131135
unreferableTransportVersion("initial_9.0.0", "8000000")
132136
unreferableTransportVersion("initial_8.19.7", "7123001")
133137
transportVersionUpperBound("9.2", "existing_92", "8123000")
@@ -140,10 +144,6 @@ class AbstractTransportVersionFuncTest extends AbstractGradleFuncTest {
140144
return null;
141145
}
142146
""")
143-
javaSource("myserver", "org.elasticsearch", "Dummy", "", """
144-
static final TransportVersion existing91 = TransportVersion.fromName("existing_91");
145-
static final TransportVersion existing92 = TransportVersion.fromName("existing_92");
146-
""")
147147

148148
file("myplugin/build.gradle") << """
149149
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: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
import org.elasticsearch.gradle.Version;
1313
import org.elasticsearch.gradle.internal.ProjectSubscribeServicePlugin;
1414
import org.elasticsearch.gradle.internal.conventions.VersionPropertiesPlugin;
15+
import org.elasticsearch.gradle.internal.conventions.precommit.PrecommitPlugin;
16+
import org.elasticsearch.gradle.internal.conventions.precommit.PrecommitTaskPlugin;
17+
import org.gradle.api.Action;
1518
import org.gradle.api.Plugin;
1619
import org.gradle.api.Project;
1720
import org.gradle.api.file.Directory;
@@ -30,6 +33,7 @@ public class TransportVersionResourcesPlugin implements Plugin<Project> {
3033
public void apply(Project project) {
3134
project.getPluginManager().apply(LifecycleBasePlugin.class);
3235
project.getPluginManager().apply(VersionPropertiesPlugin.class);
36+
project.getPluginManager().apply(PrecommitTaskPlugin.class);
3337
var psService = project.getPlugins().apply(ProjectSubscribeServicePlugin.class).getService();
3438

3539
Properties versions = (Properties) project.getExtensions().getByName(VersionPropertiesPlugin.VERSIONS_EXT);
@@ -66,8 +70,9 @@ public void apply(Project project) {
6670
t.getReferencesFiles().setFrom(tvReferencesConfig);
6771
t.getShouldValidateDensity().convention(true);
6872
t.getShouldValidatePrimaryIdNotPatch().convention(true);
73+
t.getCurrentUpperBoundName().convention(currentVersion.getMajor() + "." + currentVersion.getMinor());
6974
});
70-
project.getTasks().named(LifecycleBasePlugin.CHECK_TASK_NAME).configure(t -> t.dependsOn(validateTask));
75+
project.getTasks().named(PrecommitPlugin.PRECOMMIT_TASK_NAME).configure(t -> t.dependsOn(validateTask));
7176

7277
var generateManifestTask = project.getTasks()
7378
.register("generateTransportVersionManifest", GenerateTransportVersionManifestTask.class, t -> {
@@ -76,19 +81,31 @@ public void apply(Project project) {
7681
t.getManifestFile().set(project.getLayout().getBuildDirectory().file("generated-resources/manifest.txt"));
7782
});
7883
project.getTasks().named(JavaPlugin.PROCESS_RESOURCES_TASK_NAME, Copy.class).configure(t -> {
79-
t.into("transport/definitions", c -> c.from(generateManifestTask));
84+
t.into(resourceRoot + "/definitions", c -> c.from(generateManifestTask));
8085
});
8186

87+
Action<GenerateTransportVersionDefinitionTask> generationConfiguration = t -> {
88+
t.setGroup(taskGroup);
89+
t.getReferencesFiles().setFrom(tvReferencesConfig);
90+
t.getIncrement().convention(1000);
91+
t.getCurrentUpperBoundName().convention(currentVersion.getMajor() + "." + currentVersion.getMinor());
92+
};
93+
8294
var generateDefinitionsTask = project.getTasks()
8395
.register("generateTransportVersion", GenerateTransportVersionDefinitionTask.class, t -> {
84-
t.setGroup(taskGroup);
8596
t.setDescription("(Re)generates a transport version definition file");
86-
t.getReferencesFiles().setFrom(tvReferencesConfig);
87-
t.getIncrement().convention(1000);
88-
t.getCurrentUpperBoundName().convention(currentVersion.getMajor() + "." + currentVersion.getMinor());
8997
});
98+
generateDefinitionsTask.configure(generationConfiguration);
9099
validateTask.configure(t -> t.mustRunAfter(generateDefinitionsTask));
91100

101+
var resolveConflictTask = project.getTasks()
102+
.register("resolveTransportVersionConflict", GenerateTransportVersionDefinitionTask.class, t -> {
103+
t.setDescription("Resolve merge conflicts in transport version internal state files");
104+
t.getResolveConflict().set(true);
105+
});
106+
resolveConflictTask.configure(generationConfiguration);
107+
validateTask.configure(t -> t.mustRunAfter(resolveConflictTask));
108+
92109
var generateInitialTask = project.getTasks()
93110
.register("generateInitialTransportVersion", GenerateInitialTransportVersionTask.class, t -> {
94111
t.setGroup(taskGroup);

0 commit comments

Comments
 (0)