Skip to content

Commit 0d0c0ad

Browse files
authored
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.
1 parent 6b20d65 commit 0d0c0ad

File tree

8 files changed

+136
-85
lines changed

8 files changed

+136
-85
lines changed

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,9 @@ class AbstractTransportVersionFuncTest extends AbstractGradleFuncTest {
126126
currentUpperBoundName = '9.2'
127127
}
128128
"""
129-
referableTransportVersion("existing_91", "8012000")
130-
referableTransportVersion("existing_92", "8123000,8012001")
129+
referableAndReferencedTransportVersion("existing_91", "8012000")
130+
referableAndReferencedTransportVersion("older_92", "8122000")
131+
referableAndReferencedTransportVersion("existing_92", "8123000,8012001")
131132
unreferableTransportVersion("initial_9.0.0", "8000000")
132133
unreferableTransportVersion("initial_8.19.7", "7123001")
133134
transportVersionUpperBound("9.2", "existing_92", "8123000")
@@ -140,10 +141,6 @@ class AbstractTransportVersionFuncTest extends AbstractGradleFuncTest {
140141
return null;
141142
}
142143
""")
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-
""")
147144

148145
file("myplugin/build.gradle") << """
149146
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
@@ -357,7 +357,7 @@ class TransportVersionGenerationFuncTest extends AbstractTransportVersionFuncTes
357357
assertUpperBound("9.2", "new_tv,8123100")
358358
}
359359

360-
def "an invalid increment should fail"() {
360+
def "a non-positive increment should fail"() {
361361
given:
362362
referencedTransportVersion("new_tv")
363363

@@ -368,6 +368,17 @@ class TransportVersionGenerationFuncTest extends AbstractTransportVersionFuncTes
368368
assertOutputContains(result.output, "Invalid increment 0, must be a positive integer")
369369
}
370370

371+
def "an increment larger than 1000 should fail"() {
372+
given:
373+
referencedTransportVersion("new_tv")
374+
375+
when:
376+
def result = runGenerateTask("--increment=1001").buildAndFail()
377+
378+
then:
379+
assertOutputContains(result.output, "Invalid increment 1001, must be no larger than 1000")
380+
}
381+
371382
def "a new definition exists and is in the latest file, but the version id is wrong and needs to be updated"(){
372383
given:
373384
referableAndReferencedTransportVersion("new_tv", "1000000")

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

Lines changed: 34 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,39 @@ 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+
)
254279
}
255280
}

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
@@ -107,7 +107,7 @@ public void run() throws IOException {
107107
} else {
108108
List<TransportVersionId> ids = updateUpperBounds(resources, upstreamUpperBounds, targetUpperBoundNames, targetDefinitionName);
109109
// (Re)write the definition file.
110-
resources.writeReferableDefinition(new TransportVersionDefinition(targetDefinitionName, ids));
110+
resources.writeDefinition(new TransportVersionDefinition(targetDefinitionName, ids, true));
111111
}
112112

113113
removeUnusedNamedDefinitions(resources, referencedNames, changedDefinitionNames);
@@ -124,6 +124,9 @@ private List<TransportVersionId> updateUpperBounds(
124124
if (increment <= 0) {
125125
throw new IllegalArgumentException("Invalid increment " + increment + ", must be a positive integer");
126126
}
127+
if (increment > 1000) {
128+
throw new IllegalArgumentException("Invalid increment " + increment + ", must be no larger than 1000");
129+
}
127130
List<TransportVersionId> ids = new ArrayList<>();
128131
boolean stageInGit = getResolveConflict().getOrElse(false);
129132

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/TransportVersionResourcesService.java

Lines changed: 28 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -97,26 +97,27 @@ Path getDefinitionsDir() {
9797
return transportResourcesDir.resolve(DEFINITIONS_DIR);
9898
}
9999

100-
// return the path, relative to the resources dir, of a referable definition
101-
private Path getReferableDefinitionRelativePath(String name) {
102-
return REFERABLE_DIR.resolve(name + ".csv");
100+
// return the path, relative to the resources dir, of a definition
101+
private Path getDefinitionRelativePath(String name, boolean isReferable) {
102+
Path dir = isReferable ? REFERABLE_DIR : UNREFERABLE_DIR;
103+
return dir.resolve(name + ".csv");
103104
}
104105

105106
/** Return all referable definitions, mapped by their name. */
106107
Map<String, TransportVersionDefinition> getReferableDefinitions() throws IOException {
107-
return readDefinitions(transportResourcesDir.resolve(REFERABLE_DIR));
108+
return readDefinitions(transportResourcesDir.resolve(REFERABLE_DIR), true);
108109
}
109110

110111
/** Return a single referable definition by name */
111112
TransportVersionDefinition getReferableDefinition(String name) throws IOException {
112-
Path resourcePath = transportResourcesDir.resolve(getReferableDefinitionRelativePath(name));
113-
return TransportVersionDefinition.fromString(resourcePath, Files.readString(resourcePath, StandardCharsets.UTF_8));
113+
Path resourcePath = transportResourcesDir.resolve(getDefinitionRelativePath(name, true));
114+
return TransportVersionDefinition.fromString(resourcePath, Files.readString(resourcePath, StandardCharsets.UTF_8), true);
114115
}
115116

116117
/** Get a referable definition from upstream if it exists there, or null otherwise */
117118
TransportVersionDefinition getReferableDefinitionFromUpstream(String name) {
118-
Path resourcePath = getReferableDefinitionRelativePath(name);
119-
return getUpstreamFile(resourcePath, TransportVersionDefinition::fromString);
119+
Path resourcePath = getDefinitionRelativePath(name, true);
120+
return getUpstreamFile(resourcePath, (path, contents) -> TransportVersionDefinition.fromString(path, contents, true));
120121
}
121122

122123
/** Get the definition names which have local changes relative to upstream */
@@ -137,17 +138,24 @@ List<String> getChangedReferableDefinitionNames() {
137138

138139
/** Test whether the given referable definition exists */
139140
boolean referableDefinitionExists(String name) {
140-
return Files.exists(transportResourcesDir.resolve(getReferableDefinitionRelativePath(name)));
141+
return Files.exists(transportResourcesDir.resolve(getDefinitionRelativePath(name, true)));
141142
}
142143

143144
/** Return the path within the repository of the given named definition */
144-
Path getReferableDefinitionRepositoryPath(TransportVersionDefinition definition) {
145-
return rootDir.relativize(transportResourcesDir.resolve(getReferableDefinitionRelativePath(definition.name())));
145+
Path getDefinitionPath(TransportVersionDefinition definition) {
146+
Path relativePath;
147+
if (definition.isReferable()) {
148+
relativePath = getDefinitionRelativePath(definition.name(), true);
149+
} else {
150+
relativePath = getDefinitionRelativePath(definition.name(), false);
151+
}
152+
return rootDir.relativize(transportResourcesDir.resolve(relativePath));
146153
}
147154

148-
void writeReferableDefinition(TransportVersionDefinition definition) throws IOException {
149-
Path path = transportResourcesDir.resolve(getReferableDefinitionRelativePath(definition.name()));
150-
logger.debug("Writing referable definition [" + definition + "] to [" + path + "]");
155+
void writeDefinition(TransportVersionDefinition definition) throws IOException {
156+
Path path = transportResourcesDir.resolve(getDefinitionRelativePath(definition.name(), definition.isReferable()));
157+
String type = definition.isReferable() ? "referable" : "unreferable";
158+
logger.info("Writing " + type + " definition [" + definition + "] to [" + path + "]");
151159
Files.writeString(
152160
path,
153161
definition.ids().stream().map(Object::toString).collect(Collectors.joining(",")) + "\n",
@@ -156,39 +164,19 @@ void writeReferableDefinition(TransportVersionDefinition definition) throws IOEx
156164
}
157165

158166
void deleteReferableDefinition(String name) throws IOException {
159-
Path path = transportResourcesDir.resolve(getReferableDefinitionRelativePath(name));
167+
Path path = transportResourcesDir.resolve(getDefinitionRelativePath(name, true));
160168
Files.deleteIfExists(path);
161169
}
162170

163-
// return the path, relative to the resources dir, of an unreferable definition
164-
private Path getUnreferableDefinitionRelativePath(String name) {
165-
return UNREFERABLE_DIR.resolve(name + ".csv");
166-
}
167-
168171
/** Return all unreferable definitions, mapped by their name. */
169172
Map<String, TransportVersionDefinition> getUnreferableDefinitions() throws IOException {
170-
return readDefinitions(transportResourcesDir.resolve(UNREFERABLE_DIR));
173+
return readDefinitions(transportResourcesDir.resolve(UNREFERABLE_DIR), false);
171174
}
172175

173176
/** Get a referable definition from upstream if it exists there, or null otherwise */
174177
TransportVersionDefinition getUnreferableDefinitionFromUpstream(String name) {
175-
Path resourcePath = getUnreferableDefinitionRelativePath(name);
176-
return getUpstreamFile(resourcePath, TransportVersionDefinition::fromString);
177-
}
178-
179-
/** Return the path within the repository of the given referable definition */
180-
Path getUnreferableDefinitionRepositoryPath(TransportVersionDefinition definition) {
181-
return rootDir.relativize(transportResourcesDir.resolve(getUnreferableDefinitionRelativePath(definition.name())));
182-
}
183-
184-
void writeUnreferableDefinition(TransportVersionDefinition definition) throws IOException {
185-
Path path = transportResourcesDir.resolve(getUnreferableDefinitionRelativePath(definition.name()));
186-
logger.debug("Writing unreferable definition [" + definition + "] to [" + path + "]");
187-
Files.writeString(
188-
path,
189-
definition.ids().stream().map(Object::toString).collect(Collectors.joining(",")) + "\n",
190-
StandardCharsets.UTF_8
191-
);
178+
Path resourcePath = getDefinitionRelativePath(name, false);
179+
return getUpstreamFile(resourcePath, (path, contents) -> TransportVersionDefinition.fromString(path, contents, false));
192180
}
193181

194182
/** Read all upper bound files and return them mapped by their release name */
@@ -332,15 +320,15 @@ private <T> T getUpstreamFile(Path resourcePath, BiFunction<Path, String, T> par
332320
return parser.apply(resourcePath, content);
333321
}
334322

335-
private static Map<String, TransportVersionDefinition> readDefinitions(Path dir) throws IOException {
323+
private static Map<String, TransportVersionDefinition> readDefinitions(Path dir, boolean isReferable) throws IOException {
336324
if (Files.isDirectory(dir) == false) {
337325
return Map.of();
338326
}
339327
Map<String, TransportVersionDefinition> definitions = new HashMap<>();
340328
try (var definitionsStream = Files.list(dir)) {
341329
for (var definitionFile : definitionsStream.toList()) {
342330
String contents = Files.readString(definitionFile, StandardCharsets.UTF_8).strip();
343-
var definition = TransportVersionDefinition.fromString(definitionFile, contents);
331+
var definition = TransportVersionDefinition.fromString(definitionFile, contents, isReferable);
344332
definitions.put(definition.name(), definition);
345333
}
346334
}

0 commit comments

Comments
 (0)