From 49a5ef552742f70c9441f77335045161f03a3e6d Mon Sep 17 00:00:00 2001 From: Lee Hinman Date: Mon, 4 Feb 2019 10:54:33 -0700 Subject: [PATCH] Support unknown fields in ingest pipeline map 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 --- .../action/ingest/GetPipelineResponse.java | 19 +++++++----- .../ingest/PipelineConfiguration.java | 8 ++++- .../ingest/PipelineConfigurationTests.java | 31 +++++++++++++++++-- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/ingest/GetPipelineResponse.java b/server/src/main/java/org/elasticsearch/action/ingest/GetPipelineResponse.java index 297a7f0efc1d2..fdbd241431394 100644 --- a/server/src/main/java/org/elasticsearch/action/ingest/GetPipelineResponse.java +++ b/server/src/main/java/org/elasticsearch/action/ingest/GetPipelineResponse.java @@ -20,6 +20,7 @@ package org.elasticsearch.action.ingest; import org.elasticsearch.action.ActionResponse; +import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -109,13 +110,12 @@ public static GetPipelineResponse fromXContent(XContentParser parser) throws IOE while(parser.nextToken().equals(Token.FIELD_NAME)) { String pipelineId = parser.currentName(); parser.nextToken(); - XContentBuilder contentBuilder = XContentBuilder.builder(parser.contentType().xContent()); - contentBuilder.generator().copyCurrentStructure(parser); - PipelineConfiguration pipeline = - new PipelineConfiguration( - pipelineId, BytesReference.bytes(contentBuilder), contentBuilder.contentType() - ); - pipelines.add(pipeline); + try (XContentBuilder contentBuilder = XContentBuilder.builder(parser.contentType().xContent())) { + contentBuilder.generator().copyCurrentStructure(parser); + PipelineConfiguration pipeline = + new PipelineConfiguration(pipelineId, BytesReference.bytes(contentBuilder), contentBuilder.contentType()); + pipelines.add(pipeline); + } } ensureExpectedToken(XContentParser.Token.END_OBJECT, parser.currentToken(), parser::getTokenLocation); return new GetPipelineResponse(pipelines); @@ -148,6 +148,11 @@ public boolean equals(Object other) { } } + @Override + public String toString() { + return Strings.toString(this); + } + @Override public int hashCode() { int result = 1; diff --git a/server/src/main/java/org/elasticsearch/ingest/PipelineConfiguration.java b/server/src/main/java/org/elasticsearch/ingest/PipelineConfiguration.java index 6778f3d1eaa6a..81ef55ecf40a6 100644 --- a/server/src/main/java/org/elasticsearch/ingest/PipelineConfiguration.java +++ b/server/src/main/java/org/elasticsearch/ingest/PipelineConfiguration.java @@ -22,6 +22,7 @@ import org.elasticsearch.cluster.AbstractDiffable; import org.elasticsearch.cluster.Diff; import org.elasticsearch.common.ParseField; +import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -41,7 +42,7 @@ */ public final class PipelineConfiguration extends AbstractDiffable implements ToXContentObject { - private static final ObjectParser PARSER = new ObjectParser<>("pipeline_config", Builder::new); + private static final ObjectParser PARSER = new ObjectParser<>("pipeline_config", true, Builder::new); static { PARSER.declareString(Builder::setId, new ParseField("id")); PARSER.declareField((parser, builder, aVoid) -> { @@ -123,6 +124,11 @@ public static Diff readDiffFrom(StreamInput in) throws IO return readDiffFrom(PipelineConfiguration::readFrom, in); } + @Override + public String toString() { + return Strings.toString(this); + } + @Override public void writeTo(StreamOutput out) throws IOException { out.writeString(id); diff --git a/server/src/test/java/org/elasticsearch/ingest/PipelineConfigurationTests.java b/server/src/test/java/org/elasticsearch/ingest/PipelineConfigurationTests.java index 7b134879cda45..eb1171f66a597 100644 --- a/server/src/test/java/org/elasticsearch/ingest/PipelineConfigurationTests.java +++ b/server/src/test/java/org/elasticsearch/ingest/PipelineConfigurationTests.java @@ -31,12 +31,13 @@ import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; -import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.test.AbstractXContentTestCase; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.util.function.Predicate; -public class PipelineConfigurationTests extends ESTestCase { +public class PipelineConfigurationTests extends AbstractXContentTestCase { public void testSerialization() throws IOException { PipelineConfiguration configuration = new PipelineConfiguration("1", @@ -68,4 +69,30 @@ public void testParser() throws IOException { assertEquals("{}", XContentHelper.convertToJson(parsed.getConfig(), false, parsed.getXContentType())); assertEquals("1", parsed.getId()); } + + @Override + protected PipelineConfiguration createTestInstance() { + BytesArray config; + if (randomBoolean()) { + config = new BytesArray("{}".getBytes(StandardCharsets.UTF_8)); + } else { + config = new BytesArray("{\"foo\": \"bar\"}".getBytes(StandardCharsets.UTF_8)); + } + return new PipelineConfiguration(randomAlphaOfLength(4), config, XContentType.JSON); + } + + @Override + protected PipelineConfiguration doParseInstance(XContentParser parser) throws IOException { + return PipelineConfiguration.getParser().parse(parser, null); + } + + @Override + protected boolean supportsUnknownFields() { + return true; + } + + @Override + protected Predicate getRandomFieldsExcludeFilter() { + return field -> field.equals("config"); + } }