Skip to content

Commit 9dde53b

Browse files
authored
Support unknown fields in ingest pipeline map configuration (#38429)
Backport of #38352 We already support unknown objects in the list of pipelines, this changes the `PipelineConfiguration` to support fields other than just `id` and `config`. Relates to #36938
1 parent 62933db commit 9dde53b

File tree

3 files changed

+48
-10
lines changed

3 files changed

+48
-10
lines changed

server/src/main/java/org/elasticsearch/action/ingest/GetPipelineResponse.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.action.ingest;
2121

2222
import org.elasticsearch.action.ActionResponse;
23+
import org.elasticsearch.common.Strings;
2324
import org.elasticsearch.common.bytes.BytesReference;
2425
import org.elasticsearch.common.io.stream.StreamInput;
2526
import org.elasticsearch.common.io.stream.StreamOutput;
@@ -109,13 +110,12 @@ public static GetPipelineResponse fromXContent(XContentParser parser) throws IOE
109110
while(parser.nextToken().equals(Token.FIELD_NAME)) {
110111
String pipelineId = parser.currentName();
111112
parser.nextToken();
112-
XContentBuilder contentBuilder = XContentBuilder.builder(parser.contentType().xContent());
113-
contentBuilder.generator().copyCurrentStructure(parser);
114-
PipelineConfiguration pipeline =
115-
new PipelineConfiguration(
116-
pipelineId, BytesReference.bytes(contentBuilder), contentBuilder.contentType()
117-
);
118-
pipelines.add(pipeline);
113+
try (XContentBuilder contentBuilder = XContentBuilder.builder(parser.contentType().xContent())) {
114+
contentBuilder.generator().copyCurrentStructure(parser);
115+
PipelineConfiguration pipeline =
116+
new PipelineConfiguration(pipelineId, BytesReference.bytes(contentBuilder), contentBuilder.contentType());
117+
pipelines.add(pipeline);
118+
}
119119
}
120120
ensureExpectedToken(XContentParser.Token.END_OBJECT, parser.currentToken(), parser::getTokenLocation);
121121
return new GetPipelineResponse(pipelines);
@@ -148,6 +148,11 @@ public boolean equals(Object other) {
148148
}
149149
}
150150

151+
@Override
152+
public String toString() {
153+
return Strings.toString(this);
154+
}
155+
151156
@Override
152157
public int hashCode() {
153158
int result = 1;

server/src/main/java/org/elasticsearch/ingest/PipelineConfiguration.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.elasticsearch.cluster.AbstractDiffable;
2424
import org.elasticsearch.cluster.Diff;
2525
import org.elasticsearch.common.ParseField;
26+
import org.elasticsearch.common.Strings;
2627
import org.elasticsearch.common.bytes.BytesReference;
2728
import org.elasticsearch.common.io.stream.StreamInput;
2829
import org.elasticsearch.common.io.stream.StreamOutput;
@@ -42,7 +43,7 @@
4243
*/
4344
public final class PipelineConfiguration extends AbstractDiffable<PipelineConfiguration> implements ToXContentObject {
4445

45-
private static final ObjectParser<Builder, Void> PARSER = new ObjectParser<>("pipeline_config", Builder::new);
46+
private static final ObjectParser<Builder, Void> PARSER = new ObjectParser<>("pipeline_config", true, Builder::new);
4647
static {
4748
PARSER.declareString(Builder::setId, new ParseField("id"));
4849
PARSER.declareField((parser, builder, aVoid) -> {
@@ -130,6 +131,11 @@ public static Diff<PipelineConfiguration> readDiffFrom(StreamInput in) throws IO
130131
return readDiffFrom(PipelineConfiguration::readFrom, in);
131132
}
132133

134+
@Override
135+
public String toString() {
136+
return Strings.toString(this);
137+
}
138+
133139
@Override
134140
public void writeTo(StreamOutput out) throws IOException {
135141
out.writeString(id);

server/src/test/java/org/elasticsearch/ingest/PipelineConfigurationTests.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@
3131
import org.elasticsearch.common.xcontent.XContentHelper;
3232
import org.elasticsearch.common.xcontent.XContentParser;
3333
import org.elasticsearch.common.xcontent.XContentType;
34-
import org.elasticsearch.test.ESTestCase;
34+
import org.elasticsearch.test.AbstractXContentTestCase;
3535

3636
import java.io.IOException;
3737
import java.nio.charset.StandardCharsets;
38+
import java.util.function.Predicate;
3839

39-
public class PipelineConfigurationTests extends ESTestCase {
40+
public class PipelineConfigurationTests extends AbstractXContentTestCase<PipelineConfiguration> {
4041

4142
public void testSerialization() throws IOException {
4243
PipelineConfiguration configuration = new PipelineConfiguration("1",
@@ -68,4 +69,30 @@ public void testParser() throws IOException {
6869
assertEquals("{}", XContentHelper.convertToJson(parsed.getConfig(), false, parsed.getXContentType()));
6970
assertEquals("1", parsed.getId());
7071
}
72+
73+
@Override
74+
protected PipelineConfiguration createTestInstance() {
75+
BytesArray config;
76+
if (randomBoolean()) {
77+
config = new BytesArray("{}".getBytes(StandardCharsets.UTF_8));
78+
} else {
79+
config = new BytesArray("{\"foo\": \"bar\"}".getBytes(StandardCharsets.UTF_8));
80+
}
81+
return new PipelineConfiguration(randomAlphaOfLength(4), config, XContentType.JSON);
82+
}
83+
84+
@Override
85+
protected PipelineConfiguration doParseInstance(XContentParser parser) throws IOException {
86+
return PipelineConfiguration.getParser().parse(parser, null);
87+
}
88+
89+
@Override
90+
protected boolean supportsUnknownFields() {
91+
return true;
92+
}
93+
94+
@Override
95+
protected Predicate<String> getRandomFieldsExcludeFilter() {
96+
return field -> field.equals("config");
97+
}
7198
}

0 commit comments

Comments
 (0)