Support unknown fields in ingest pipeline map configuration (#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
This commit is contained in:
Lee Hinman 2019-02-05 07:52:17 -07:00 committed by GitHub
parent 638ba4a59a
commit d862453d68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 10 deletions

View File

@ -20,6 +20,7 @@
package org.elasticsearch.action.ingest; package org.elasticsearch.action.ingest;
import org.elasticsearch.action.ActionResponse; import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.StreamOutput;
@ -109,14 +110,13 @@ public class GetPipelineResponse extends ActionResponse implements StatusToXCont
while(parser.nextToken().equals(Token.FIELD_NAME)) { while(parser.nextToken().equals(Token.FIELD_NAME)) {
String pipelineId = parser.currentName(); String pipelineId = parser.currentName();
parser.nextToken(); parser.nextToken();
XContentBuilder contentBuilder = XContentBuilder.builder(parser.contentType().xContent()); try (XContentBuilder contentBuilder = XContentBuilder.builder(parser.contentType().xContent())) {
contentBuilder.generator().copyCurrentStructure(parser); contentBuilder.generator().copyCurrentStructure(parser);
PipelineConfiguration pipeline = PipelineConfiguration pipeline =
new PipelineConfiguration( new PipelineConfiguration(pipelineId, BytesReference.bytes(contentBuilder), contentBuilder.contentType());
pipelineId, BytesReference.bytes(contentBuilder), contentBuilder.contentType()
);
pipelines.add(pipeline); pipelines.add(pipeline);
} }
}
ensureExpectedToken(XContentParser.Token.END_OBJECT, parser.currentToken(), parser::getTokenLocation); ensureExpectedToken(XContentParser.Token.END_OBJECT, parser.currentToken(), parser::getTokenLocation);
return new GetPipelineResponse(pipelines); return new GetPipelineResponse(pipelines);
} }
@ -148,6 +148,11 @@ public class GetPipelineResponse extends ActionResponse implements StatusToXCont
} }
} }
@Override
public String toString() {
return Strings.toString(this);
}
@Override @Override
public int hashCode() { public int hashCode() {
int result = 1; int result = 1;

View File

@ -22,6 +22,7 @@ package org.elasticsearch.ingest;
import org.elasticsearch.cluster.AbstractDiffable; import org.elasticsearch.cluster.AbstractDiffable;
import org.elasticsearch.cluster.Diff; import org.elasticsearch.cluster.Diff;
import org.elasticsearch.common.ParseField; import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.StreamOutput;
@ -41,7 +42,7 @@ import java.util.Objects;
*/ */
public final class PipelineConfiguration extends AbstractDiffable<PipelineConfiguration> implements ToXContentObject { public final class PipelineConfiguration extends AbstractDiffable<PipelineConfiguration> implements ToXContentObject {
private static final ObjectParser<Builder, Void> PARSER = new ObjectParser<>("pipeline_config", Builder::new); private static final ObjectParser<Builder, Void> PARSER = new ObjectParser<>("pipeline_config", true, Builder::new);
static { static {
PARSER.declareString(Builder::setId, new ParseField("id")); PARSER.declareString(Builder::setId, new ParseField("id"));
PARSER.declareField((parser, builder, aVoid) -> { PARSER.declareField((parser, builder, aVoid) -> {
@ -123,6 +124,11 @@ public final class PipelineConfiguration extends AbstractDiffable<PipelineConfig
return readDiffFrom(PipelineConfiguration::readFrom, in); return readDiffFrom(PipelineConfiguration::readFrom, in);
} }
@Override
public String toString() {
return Strings.toString(this);
}
@Override @Override
public void writeTo(StreamOutput out) throws IOException { public void writeTo(StreamOutput out) throws IOException {
out.writeString(id); out.writeString(id);

View File

@ -31,12 +31,13 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentHelper;
import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.AbstractXContentTestCase;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.function.Predicate;
public class PipelineConfigurationTests extends ESTestCase { public class PipelineConfigurationTests extends AbstractXContentTestCase<PipelineConfiguration> {
public void testSerialization() throws IOException { public void testSerialization() throws IOException {
PipelineConfiguration configuration = new PipelineConfiguration("1", PipelineConfiguration configuration = new PipelineConfiguration("1",
@ -68,4 +69,30 @@ public class PipelineConfigurationTests extends ESTestCase {
assertEquals("{}", XContentHelper.convertToJson(parsed.getConfig(), false, parsed.getXContentType())); assertEquals("{}", XContentHelper.convertToJson(parsed.getConfig(), false, parsed.getXContentType()));
assertEquals("1", parsed.getId()); 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<String> getRandomFieldsExcludeFilter() {
return field -> field.equals("config");
}
} }