Skip to content

Commit b55b4dc

Browse files
Backport several transport version fixes (#133276)
This commit backports several changes to the new transport version system relates #133034 relates #133185 relates #133186 relates #133189 Co-authored-by: Elastic Machine <[email protected]>
1 parent 467fe8d commit b55b4dc

11 files changed

+512
-331
lines changed

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

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ class AbstractTransportVersionFuncTest extends AbstractGradleFuncTest {
4141
javaResource("myserver", "transport/definitions/unreferenced/" + name + ".csv", id)
4242
}
4343

44-
def definedAndUsedTransportVersion(String name, String ids) {
45-
return definedAndUsedTransportVersion(name, ids, "Test${name.capitalize()}")
44+
def namedAndReferencedTransportVersion(String name, String ids) {
45+
return namedAndReferencedTransportVersion(name, ids, "Test${name.capitalize()}")
4646
}
4747

48-
def definedAndUsedTransportVersion(String name, String ids, String classname) {
48+
def namedAndReferencedTransportVersion(String name, String ids, String classname) {
4949
javaSource("myserver", "org.elasticsearch", classname, "", """
5050
static final TransportVersion usage = TransportVersion.fromName("${name}");
5151
""")
@@ -60,17 +60,17 @@ class AbstractTransportVersionFuncTest extends AbstractGradleFuncTest {
6060
return gradleRunner(":${project}:validateTransportVersionReferences").buildAndFail()
6161
}
6262

63-
def validateDefinitionsFails() {
64-
return gradleRunner(":myserver:validateTransportVersionDefinitions").buildAndFail()
63+
def validateResourcesFails() {
64+
return gradleRunner(":myserver:validateTransportVersionResources").buildAndFail()
6565
}
6666

67-
def assertReferencesFailure(BuildResult result, String project, String expectedOutput) {
67+
def assertValidateReferencesFailure(BuildResult result, String project, String expectedOutput) {
6868
result.task(":${project}:validateTransportVersionReferences").outcome == TaskOutcome.FAILED
6969
assertOutputContains(result.output, expectedOutput)
7070
}
7171

72-
def assertDefinitionsFailure(BuildResult result, String expectedOutput) {
73-
result.task(":myserver:validateTransportVersionDefinitions").outcome == TaskOutcome.FAILED
72+
def assertValidateResourcesFailure(BuildResult result, String expectedOutput) {
73+
result.task(":myserver:validateTransportVersionResources").outcome == TaskOutcome.FAILED
7474
assertOutputContains(result.output, expectedOutput)
7575
}
7676

@@ -81,9 +81,6 @@ class AbstractTransportVersionFuncTest extends AbstractGradleFuncTest {
8181
include ':myserver'
8282
include ':myplugin'
8383
"""
84-
file("gradle.properties") << """
85-
org.elasticsearch.transport.definitionsProject=:myserver
86-
"""
8784

8885
file("myserver/build.gradle") << """
8986
apply plugin: 'java-library'

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

Lines changed: 77 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ class TransportVersionValidationFuncTest extends AbstractTransportVersionFuncTes
1616

1717
def "test setup works"() {
1818
when:
19-
def result = gradleRunner("validateTransportVersionDefinitions", "validateTransportVersionReferences").build()
19+
def result = gradleRunner("validateTransportVersionResources", "validateTransportVersionReferences").build()
2020
then:
21-
result.task(":myserver:validateTransportVersionDefinitions").outcome == TaskOutcome.SUCCESS
21+
result.task(":myserver:validateTransportVersionResources").outcome == TaskOutcome.SUCCESS
2222
result.task(":myserver:validateTransportVersionReferences").outcome == TaskOutcome.SUCCESS
2323
result.task(":myplugin:validateTransportVersionReferences").outcome == TaskOutcome.SUCCESS
2424
}
@@ -32,27 +32,27 @@ class TransportVersionValidationFuncTest extends AbstractTransportVersionFuncTes
3232
when:
3333
def result = validateReferencesFails("myplugin")
3434
then:
35-
assertReferencesFailure(result, "myplugin", "TransportVersion.fromName(\"dne\") was used at " +
35+
assertValidateReferencesFailure(result, "myplugin", "TransportVersion.fromName(\"dne\") was used at " +
3636
"org.elasticsearch.plugin.MyPlugin line 6, but lacks a transport version definition.")
3737
}
3838

3939
def "references must be defined"() {
4040
given:
4141
namedTransportVersion("not_used", "1000000")
4242
when:
43-
def result = validateDefinitionsFails()
43+
def result = validateResourcesFails()
4444
then:
45-
assertDefinitionsFailure(result, "Transport version definition file " +
45+
assertValidateResourcesFailure(result, "Transport version definition file " +
4646
"[myserver/src/main/resources/transport/definitions/named/not_used.csv] is not referenced")
4747
}
4848

4949
def "names must be lowercase alphanum or underscore"() {
5050
given:
51-
definedAndUsedTransportVersion("${name}", "8100000", "TestNames")
51+
namedAndReferencedTransportVersion("${name}", "8100000", "TestNames")
5252
when:
53-
def result = validateDefinitionsFails()
53+
def result = validateResourcesFails()
5454
then:
55-
assertDefinitionsFailure(result, "Transport version definition file " +
55+
assertValidateResourcesFailure(result, "Transport version definition file " +
5656
"[myserver/src/main/resources/transport/definitions/named/${name}.csv] does not have a valid name, " +
5757
"must be lowercase alphanumeric and underscore")
5858

@@ -62,130 +62,130 @@ class TransportVersionValidationFuncTest extends AbstractTransportVersionFuncTes
6262

6363
def "definitions contain at least one id"() {
6464
given:
65-
definedAndUsedTransportVersion("empty", "")
65+
namedAndReferencedTransportVersion("empty", "")
6666
when:
67-
def result = validateDefinitionsFails()
67+
def result = validateResourcesFails()
6868
then:
69-
assertDefinitionsFailure(result, "Transport version definition file " +
69+
assertValidateResourcesFailure(result, "Transport version definition file " +
7070
"[myserver/src/main/resources/transport/definitions/named/empty.csv] does not contain any ids")
7171
}
7272

7373
def "definitions have ids in descending order"() {
7474
given:
75-
definedAndUsedTransportVersion("out_of_order", "8100000,8200000")
75+
namedAndReferencedTransportVersion("out_of_order", "8100000,8200000")
7676
when:
77-
def result = validateDefinitionsFails()
77+
def result = validateResourcesFails()
7878
then:
79-
assertDefinitionsFailure(result, "Transport version definition file " +
79+
assertValidateResourcesFailure(result, "Transport version definition file " +
8080
"[myserver/src/main/resources/transport/definitions/named/out_of_order.csv] does not have ordered ids")
8181
}
8282

8383
def "definition ids are unique"() {
8484
given:
85-
definedAndUsedTransportVersion("duplicate", "8123000")
85+
namedAndReferencedTransportVersion("duplicate", "8123000")
8686
when:
87-
def result = validateDefinitionsFails()
87+
def result = validateResourcesFails()
8888
then:
89-
assertDefinitionsFailure(result, "Transport version definition file " +
89+
assertValidateResourcesFailure(result, "Transport version definition file " +
9090
"[myserver/src/main/resources/transport/definitions/named/existing_92.csv] contains id 8123000 already defined in " +
9191
"[myserver/src/main/resources/transport/definitions/named/duplicate.csv]")
9292
}
9393

9494
def "definitions have bwc ids with non-zero patch part"() {
9595
given:
96-
definedAndUsedTransportVersion("patched", "8200000,8100000")
96+
namedAndReferencedTransportVersion("patched", "8200000,8100000")
9797
when:
98-
def result = validateDefinitionsFails()
98+
def result = validateResourcesFails()
9999
then:
100-
assertDefinitionsFailure(result, "Transport version definition file " +
100+
assertValidateResourcesFailure(result, "Transport version definition file " +
101101
"[myserver/src/main/resources/transport/definitions/named/patched.csv] contains bwc id [8100000] with a patch part of 0")
102102
}
103103

104104
def "definitions have primary ids which cannot change"() {
105105
given:
106106
namedTransportVersion("existing_92", "8500000")
107107
when:
108-
def result = validateDefinitionsFails()
108+
def result = validateResourcesFails()
109109
then:
110-
assertDefinitionsFailure(result, "Transport version definition file " +
110+
assertValidateResourcesFailure(result, "Transport version definition file " +
111111
"[myserver/src/main/resources/transport/definitions/named/existing_92.csv] has modified primary id from 8123000 to 8500000")
112112
}
113113

114114
def "cannot change committed ids to a branch"() {
115115
given:
116116
namedTransportVersion("existing_92", "8123000,8012002")
117117
when:
118-
def result = validateDefinitionsFails()
118+
def result = validateResourcesFails()
119119
then:
120-
assertDefinitionsFailure(result, "Transport version definition file " +
120+
assertValidateResourcesFailure(result, "Transport version definition file " +
121121
"[myserver/src/main/resources/transport/definitions/named/existing_92.csv] modifies existing patch id from 8012001 to 8012002")
122122
}
123123

124124
def "latest files must reference defined name"() {
125125
given:
126126
latestTransportVersion("9.2", "dne", "8123000")
127127
when:
128-
def result = validateDefinitionsFails()
128+
def result = validateResourcesFails()
129129
then:
130-
assertDefinitionsFailure(result, "Latest transport version file " +
130+
assertValidateResourcesFailure(result, "Latest transport version file " +
131131
"[myserver/src/main/resources/transport/latest/9.2.csv] contains transport version name [dne] which is not defined")
132132
}
133133

134134
def "latest files id must exist in definition"() {
135135
given:
136136
latestTransportVersion("9.2", "existing_92", "8124000")
137137
when:
138-
def result = validateDefinitionsFails()
138+
def result = validateResourcesFails()
139139
then:
140-
assertDefinitionsFailure(result, "Latest transport version file " +
140+
assertValidateResourcesFailure(result, "Latest transport version file " +
141141
"[myserver/src/main/resources/transport/latest/9.2.csv] has id 8124000 which is not in definition " +
142142
"[myserver/src/main/resources/transport/definitions/named/existing_92.csv]")
143143
}
144144

145145
def "latest files have latest id within base"() {
146146
given:
147147
latestTransportVersion("9.0", "seemingly_latest", "8110001")
148-
definedAndUsedTransportVersion("original", "8110000")
149-
definedAndUsedTransportVersion("seemingly_latest", "8111000,8110001")
150-
definedAndUsedTransportVersion("actual_latest", "8112000,8110002")
148+
namedAndReferencedTransportVersion("original", "8110000")
149+
namedAndReferencedTransportVersion("seemingly_latest", "8111000,8110001")
150+
namedAndReferencedTransportVersion("actual_latest", "8112000,8110002")
151151
when:
152-
def result = validateDefinitionsFails()
152+
def result = validateResourcesFails()
153153
then:
154-
assertDefinitionsFailure(result, "Latest transport version file " +
154+
assertValidateResourcesFailure(result, "Latest transport version file " +
155155
"[myserver/src/main/resources/transport/latest/9.0.csv] has id 8110001 from [seemingly_latest] with base 8110000 " +
156156
"but another id 8110002 from [actual_latest] is later for that base")
157157
}
158158

159159
def "latest files cannot change base id"() {
160160
given:
161-
definedAndUsedTransportVersion("original", "8013000")
162-
definedAndUsedTransportVersion("patch", "8015000,8013001")
161+
namedAndReferencedTransportVersion("original", "8013000")
162+
namedAndReferencedTransportVersion("patch", "8015000,8013001")
163163
latestTransportVersion("9.1", "patch", "8013001")
164164
when:
165-
def result = validateDefinitionsFails()
165+
def result = validateResourcesFails()
166166
then:
167-
assertDefinitionsFailure(result, "Latest transport version file " +
167+
assertValidateResourcesFailure(result, "Latest transport version file " +
168168
"[myserver/src/main/resources/transport/latest/9.1.csv] modifies base id from 8012000 to 8013000")
169169
}
170170

171171
def "ids must be dense"() {
172172
given:
173-
definedAndUsedTransportVersion("original", "8013000")
174-
definedAndUsedTransportVersion("patch1", "8015000,8013002")
173+
namedAndReferencedTransportVersion("original", "8013000")
174+
namedAndReferencedTransportVersion("patch1", "8015000,8013002")
175175
latestTransportVersion("9.0", "patch1", "8013002")
176176
when:
177-
def result = validateDefinitionsFails()
177+
def result = validateResourcesFails()
178178
then:
179-
assertDefinitionsFailure(result, "Transport version base id 8013000 is missing patch ids between 8013000 and 8013002")
179+
assertValidateResourcesFailure(result, "Transport version base id 8013000 is missing patch ids between 8013000 and 8013002")
180180
}
181181

182182
def "primary id must not be patch version"() {
183183
given:
184-
definedAndUsedTransportVersion("patch", "8015001")
184+
namedAndReferencedTransportVersion("patch", "8015001")
185185
when:
186-
def result = validateDefinitionsFails()
186+
def result = validateResourcesFails()
187187
then:
188-
assertDefinitionsFailure(result, "Transport version definition file " +
188+
assertValidateResourcesFailure(result, "Transport version definition file " +
189189
"[myserver/src/main/resources/transport/definitions/named/patch.csv] has patch version 8015001 as primary id")
190190
}
191191

@@ -194,8 +194,39 @@ class TransportVersionValidationFuncTest extends AbstractTransportVersionFuncTes
194194
file("myserver/src/main/resources/transport/unreferenced/initial_9_0_0.csv").delete()
195195
file("myserver/src/main/resources/transport/unreferenced").deleteDir()
196196
when:
197-
def result = gradleRunner(":myserver:validateTransportVersionDefinitions").build()
197+
def result = gradleRunner(":myserver:validateTransportVersionResources").build()
198198
then:
199-
result.task(":myserver:validateTransportVersionDefinitions").outcome == TaskOutcome.SUCCESS
199+
result.task(":myserver:validateTransportVersionResources").outcome == TaskOutcome.SUCCESS
200+
}
201+
202+
def "latest can refer to an unreferenced definition"() {
203+
given:
204+
unreferencedTransportVersion("initial_10.0.0", "10000000")
205+
latestTransportVersion("10.0", "initial_10.0.0", "10000000")
206+
when:
207+
def result = gradleRunner(":myserver:validateTransportVersionResources").build()
208+
then:
209+
result.task(":myserver:validateTransportVersionResources").outcome == TaskOutcome.SUCCESS
210+
}
211+
212+
def "named and unreferenced definitions cannot have the same name"() {
213+
given:
214+
unreferencedTransportVersion("existing_92", "10000000")
215+
when:
216+
def result = validateResourcesFails()
217+
then:
218+
assertValidateResourcesFailure(result, "Transport version definition file " +
219+
"[myserver/src/main/resources/transport/definitions/named/existing_92.csv] " +
220+
"has same name as unreferenced definition " +
221+
"[myserver/src/main/resources/transport/definitions/unreferenced/existing_92.csv]")
222+
}
223+
224+
def "unreferenced definitions can have primary ids that are patches"() {
225+
given:
226+
unreferencedTransportVersion("initial_10.0.1", "10000001")
227+
when:
228+
def result = gradleRunner(":myserver:validateTransportVersionResources").build()
229+
then:
230+
result.task(":myserver:validateTransportVersionResources").outcome == TaskOutcome.SUCCESS
200231
}
201232
}

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@
1010
package org.elasticsearch.gradle.internal.transport;
1111

1212
import org.gradle.api.DefaultTask;
13-
import org.gradle.api.file.DirectoryProperty;
1413
import org.gradle.api.file.RegularFileProperty;
14+
import org.gradle.api.provider.Property;
15+
import org.gradle.api.services.ServiceReference;
1516
import org.gradle.api.tasks.InputDirectory;
17+
import org.gradle.api.tasks.Optional;
1618
import org.gradle.api.tasks.OutputFile;
19+
import org.gradle.api.tasks.PathSensitive;
20+
import org.gradle.api.tasks.PathSensitivity;
1721
import org.gradle.api.tasks.TaskAction;
1822

1923
import java.io.IOException;
@@ -24,15 +28,24 @@
2428
import java.nio.file.attribute.BasicFileAttributes;
2529

2630
public abstract class GenerateTransportVersionManifestTask extends DefaultTask {
31+
32+
@ServiceReference("transportVersionResources")
33+
abstract Property<TransportVersionResourcesService> getTransportResources();
34+
2735
@InputDirectory
28-
public abstract DirectoryProperty getDefinitionsDirectory();
36+
@Optional
37+
@PathSensitive(PathSensitivity.RELATIVE)
38+
public Path getDefinitionsDirectory() {
39+
return getTransportResources().get().getDefinitionsDir();
40+
}
2941

3042
@OutputFile
3143
public abstract RegularFileProperty getManifestFile();
3244

3345
@TaskAction
3446
public void generateTransportVersionManifest() throws IOException {
35-
Path definitionsDir = getDefinitionsDirectory().get().getAsFile().toPath();
47+
48+
Path definitionsDir = getDefinitionsDirectory();
3649
Path manifestFile = getManifestFile().get().getAsFile().toPath();
3750
try (var writer = Files.newBufferedWriter(manifestFile)) {
3851
Files.walkFileTree(definitionsDir, new SimpleFileVisitor<>() {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ static TransportVersionId fromString(String s) {
2222

2323
@Override
2424
public int compareTo(TransportVersionId o) {
25-
return Integer.compare(complete, o.complete);
25+
// note: this is descending order so the arguments are reversed
26+
return Integer.compare(o.complete, complete);
2627
}
2728

2829
@Override

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,15 @@
1212
import org.gradle.api.attributes.Attribute;
1313
import org.gradle.api.attributes.AttributeContainer;
1414

15+
import java.io.File;
1516
import java.io.IOException;
1617
import java.nio.charset.StandardCharsets;
1718
import java.nio.file.Files;
1819
import java.nio.file.Path;
1920
import java.util.ArrayList;
21+
import java.util.HashSet;
2022
import java.util.List;
23+
import java.util.Set;
2124

2225
import static org.gradle.api.artifacts.type.ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE;
2326

@@ -43,6 +46,14 @@ static void addArtifactAttribute(AttributeContainer attributes) {
4346
attributes.attribute(REFERENCES_ATTRIBUTE, true);
4447
}
4548

49+
static Set<String> collectNames(Iterable<File> referencesFiles) throws IOException {
50+
Set<String> names = new HashSet<>();
51+
for (var referencesFile : referencesFiles) {
52+
listFromFile(referencesFile.toPath()).stream().map(TransportVersionReference::name).forEach(names::add);
53+
}
54+
return names;
55+
}
56+
4657
@Override
4758
public String toString() {
4859
return name + "," + location;

0 commit comments

Comments
 (0)