Skip to content

Commit 47e65ac

Browse files
committed
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.
1 parent 4b7d8b2 commit 47e65ac

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
@@ -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: 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
@@ -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/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 */
@@ -136,17 +137,24 @@ List<String> getChangedReferableDefinitionNames() {
136137

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

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

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

157165
void deleteReferableDefinition(String name) throws IOException {
158-
Path path = transportResourcesDir.resolve(getReferableDefinitionRelativePath(name));
166+
Path path = transportResourcesDir.resolve(getDefinitionRelativePath(name, true));
159167
Files.deleteIfExists(path);
160168
}
161169

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

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

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

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

0 commit comments

Comments
 (0)