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:
parent
638ba4a59a
commit
d862453d68
|
@ -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,13 +110,12 @@ 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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue