org.elasticsearch.ingest.IngestMetadata Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of elasticsearch Show documentation
Show all versions of elasticsearch Show documentation
Elasticsearch subproject :server
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
package org.elasticsearch.ingest;
import org.elasticsearch.TransportVersion;
import org.elasticsearch.TransportVersions;
import org.elasticsearch.cluster.Diff;
import org.elasticsearch.cluster.DiffableUtils;
import org.elasticsearch.cluster.NamedDiff;
import org.elasticsearch.cluster.metadata.Metadata;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.util.Maps;
import org.elasticsearch.common.xcontent.ChunkedToXContentHelper;
import org.elasticsearch.xcontent.ObjectParser;
import org.elasticsearch.xcontent.ParseField;
import org.elasticsearch.xcontent.ToXContent;
import org.elasticsearch.xcontent.XContentParser;
import java.io.IOException;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* Holds the ingest pipelines that are available in the cluster
*/
public final class IngestMetadata implements Metadata.Custom {
public static final String TYPE = "ingest";
private static final ParseField PIPELINES_FIELD = new ParseField("pipeline");
private static final ObjectParser, Void> INGEST_METADATA_PARSER = new ObjectParser<>(
"ingest_metadata",
ArrayList::new
);
static {
INGEST_METADATA_PARSER.declareObjectArray(List::addAll, PipelineConfiguration.getParser(), PIPELINES_FIELD);
}
// We can't use Pipeline class directly in cluster state, because we don't have the processor factories around when
// IngestMetadata is registered as custom metadata.
private final Map pipelines;
public IngestMetadata(Map pipelines) {
this.pipelines = Map.copyOf(pipelines);
}
@Override
public String getWriteableName() {
return TYPE;
}
@Override
public TransportVersion getMinimalSupportedVersion() {
return TransportVersions.MINIMUM_COMPATIBLE;
}
public Map getPipelines() {
return pipelines;
}
public IngestMetadata(StreamInput in) throws IOException {
int size = in.readVInt();
Map pipelines = Maps.newMapWithExpectedSize(size);
for (int i = 0; i < size; i++) {
PipelineConfiguration pipeline = PipelineConfiguration.readFrom(in);
pipelines.put(pipeline.getId(), pipeline);
}
this.pipelines = Map.copyOf(pipelines);
}
@Override
public void writeTo(StreamOutput out) throws IOException {
out.writeVInt(pipelines.size());
for (PipelineConfiguration pipeline : pipelines.values()) {
pipeline.writeTo(out);
}
}
public static IngestMetadata fromXContent(XContentParser parser) throws IOException {
Map pipelines = new HashMap<>();
List configs = INGEST_METADATA_PARSER.parse(parser, null);
for (PipelineConfiguration pipeline : configs) {
pipelines.put(pipeline.getId(), pipeline);
}
return new IngestMetadata(pipelines);
}
@Override
public Iterator extends ToXContent> toXContentChunked(ToXContent.Params ignored) {
return ChunkedToXContentHelper.array(PIPELINES_FIELD.getPreferredName(), pipelines.values().iterator());
}
@Override
public EnumSet context() {
return Metadata.ALL_CONTEXTS;
}
@Override
public Diff diff(Metadata.Custom before) {
return new IngestMetadataDiff((IngestMetadata) before, this);
}
public static NamedDiff readDiffFrom(StreamInput in) throws IOException {
return new IngestMetadataDiff(in);
}
static class IngestMetadataDiff implements NamedDiff {
final Diff