Skip to content

Commit 8761ba6

Browse files
DaveCTurnerGurkan Kaymak
authored and
Gurkan Kaymak
committed
Use TAR instead of DOCKER build type before 6.7.0 (elastic#40723)
In 6.7.0 (elastic#39378) we added a build type of DOCKER for the docker images, but unfortunately earlier versions do not understand this and will reject any transport messages that mention this build type. This commit fixes this by reporting TAR instead of DOCKER when talking to older nodes. Relates (but does not fix) elastic#40511 Relates elastic#39378
1 parent 5236fc3 commit 8761ba6

File tree

2 files changed

+114
-1
lines changed

2 files changed

+114
-1
lines changed

server/src/main/java/org/elasticsearch/Build.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,13 @@ public static void writeBuild(Build build, StreamOutput out) throws IOException
241241
out.writeString(build.flavor().displayName());
242242
}
243243
if (out.getVersion().onOrAfter(Version.V_6_3_0)) {
244-
out.writeString(build.type().displayName());
244+
final Type buildType;
245+
if (out.getVersion().before(Version.V_6_7_0) && build.type() == Type.DOCKER) {
246+
buildType = Type.TAR;
247+
} else {
248+
buildType = build.type();
249+
}
250+
out.writeString(buildType.displayName());
245251
}
246252
out.writeString(build.shortHash());
247253
out.writeString(build.date());

server/src/test/java/org/elasticsearch/BuildTests.java

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,23 @@
2020
package org.elasticsearch;
2121

2222
import org.elasticsearch.common.io.FileSystemUtils;
23+
import org.elasticsearch.common.io.stream.StreamInput;
24+
import org.elasticsearch.common.io.stream.StreamOutput;
25+
import org.elasticsearch.common.io.stream.Writeable;
2326
import org.elasticsearch.test.ESTestCase;
27+
import org.elasticsearch.test.EqualsHashCodeTestUtils;
2428

2529
import java.io.IOException;
2630
import java.io.InputStream;
2731
import java.net.URL;
2832
import java.util.Arrays;
33+
import java.util.List;
34+
import java.util.Objects;
2935
import java.util.Set;
3036
import java.util.stream.Collectors;
3137

38+
import static org.hamcrest.Matchers.equalTo;
39+
3240
public class BuildTests extends ESTestCase {
3341

3442
/** Asking for the jar metadata should not throw exception in tests, no matter how configured */
@@ -115,4 +123,103 @@ public void testEqualsAndHashCode() {
115123
);
116124
assertNotEquals(build, differentVersion);
117125
}
126+
127+
private static class WriteableBuild implements Writeable {
128+
private final Build build;
129+
130+
WriteableBuild(StreamInput in) throws IOException {
131+
build = Build.readBuild(in);
132+
}
133+
134+
WriteableBuild(Build build) {
135+
this.build = build;
136+
}
137+
138+
@Override
139+
public void writeTo(StreamOutput out) throws IOException {
140+
Build.writeBuild(build, out);
141+
}
142+
143+
@Override
144+
public boolean equals(Object o) {
145+
if (this == o) return true;
146+
if (o == null || getClass() != o.getClass()) return false;
147+
WriteableBuild that = (WriteableBuild) o;
148+
return build.equals(that.build);
149+
}
150+
151+
@Override
152+
public int hashCode() {
153+
return Objects.hash(build);
154+
}
155+
}
156+
157+
private static String randomStringExcept(final String s) {
158+
return randomAlphaOfLength(13 - s.length());
159+
}
160+
161+
public void testSerialization() {
162+
EqualsHashCodeTestUtils.checkEqualsAndHashCode(new WriteableBuild(new Build(
163+
randomFrom(Build.Flavor.values()), randomFrom(Build.Type.values()),
164+
randomAlphaOfLength(6), randomAlphaOfLength(6), randomBoolean(), randomAlphaOfLength(6))),
165+
b -> copyWriteable(b, writableRegistry(), WriteableBuild::new, Version.CURRENT),
166+
b -> {
167+
switch (randomIntBetween(1, 6)) {
168+
case 1:
169+
return new WriteableBuild(new Build(
170+
randomValueOtherThan(b.build.flavor(), () -> randomFrom(Build.Flavor.values())), b.build.type(),
171+
b.build.shortHash(), b.build.date(), b.build.isSnapshot(), b.build.getQualifiedVersion()));
172+
case 2:
173+
return new WriteableBuild(new Build(b.build.flavor(),
174+
randomValueOtherThan(b.build.type(), () -> randomFrom(Build.Type.values())),
175+
b.build.shortHash(), b.build.date(), b.build.isSnapshot(), b.build.getQualifiedVersion()));
176+
case 3:
177+
return new WriteableBuild(new Build(b.build.flavor(), b.build.type(),
178+
randomStringExcept(b.build.shortHash()), b.build.date(), b.build.isSnapshot(), b.build.getQualifiedVersion()));
179+
case 4:
180+
return new WriteableBuild(new Build(b.build.flavor(), b.build.type(),
181+
b.build.shortHash(), randomStringExcept(b.build.date()), b.build.isSnapshot(), b.build.getQualifiedVersion()));
182+
case 5:
183+
return new WriteableBuild(new Build(b.build.flavor(), b.build.type(),
184+
b.build.shortHash(), b.build.date(), b.build.isSnapshot() == false, b.build.getQualifiedVersion()));
185+
case 6:
186+
return new WriteableBuild(new Build(b.build.flavor(), b.build.type(),
187+
b.build.shortHash(), b.build.date(), b.build.isSnapshot(), randomStringExcept(b.build.getQualifiedVersion())));
188+
}
189+
throw new AssertionError();
190+
});
191+
}
192+
193+
public void testSerializationBWC() throws IOException {
194+
final WriteableBuild dockerBuild = new WriteableBuild(new Build(randomFrom(Build.Flavor.values()), Build.Type.DOCKER,
195+
randomAlphaOfLength(6), randomAlphaOfLength(6), randomBoolean(), randomAlphaOfLength(6)));
196+
197+
final List<Version> versions = Version.getDeclaredVersions(Version.class);
198+
final Version pre63Version = randomFrom(versions.stream().filter(v -> v.before(Version.V_6_3_0)).collect(Collectors.toList()));
199+
final Version post63Pre67Version = randomFrom(versions.stream()
200+
.filter(v -> v.onOrAfter(Version.V_6_3_0) && v.before(Version.V_6_7_0)).collect(Collectors.toList()));
201+
final Version post67Pre70Version = randomFrom(versions.stream()
202+
.filter(v -> v.onOrAfter(Version.V_6_7_0) && v.before(Version.V_7_0_0)).collect(Collectors.toList()));
203+
final Version post70Version = randomFrom(versions.stream().filter(v -> v.onOrAfter(Version.V_7_0_0)).collect(Collectors.toList()));
204+
205+
final WriteableBuild pre63 = copyWriteable(dockerBuild, writableRegistry(), WriteableBuild::new, pre63Version);
206+
final WriteableBuild post63pre67 = copyWriteable(dockerBuild, writableRegistry(), WriteableBuild::new, post63Pre67Version);
207+
final WriteableBuild post67pre70 = copyWriteable(dockerBuild, writableRegistry(), WriteableBuild::new, post67Pre70Version);
208+
final WriteableBuild post70 = copyWriteable(dockerBuild, writableRegistry(), WriteableBuild::new, post70Version);
209+
210+
assertThat(pre63.build.flavor(), equalTo(Build.Flavor.OSS));
211+
assertThat(post63pre67.build.flavor(), equalTo(dockerBuild.build.flavor()));
212+
assertThat(post67pre70.build.flavor(), equalTo(dockerBuild.build.flavor()));
213+
assertThat(post70.build.flavor(), equalTo(dockerBuild.build.flavor()));
214+
215+
assertThat(pre63.build.type(), equalTo(Build.Type.UNKNOWN));
216+
assertThat(post63pre67.build.type(), equalTo(Build.Type.TAR));
217+
assertThat(post67pre70.build.type(), equalTo(dockerBuild.build.type()));
218+
assertThat(post70.build.type(), equalTo(dockerBuild.build.type()));
219+
220+
assertThat(pre63.build.getQualifiedVersion(), equalTo(pre63Version.toString()));
221+
assertThat(post63pre67.build.getQualifiedVersion(), equalTo(post63Pre67Version.toString()));
222+
assertThat(post67pre70.build.getQualifiedVersion(), equalTo(post67Pre70Version.toString()));
223+
assertThat(post70.build.getQualifiedVersion(), equalTo(dockerBuild.build.getQualifiedVersion()));
224+
}
118225
}

0 commit comments

Comments
 (0)