Make enrich project-aware (#124099)

Makes the execution and use of enrich policies project-aware.
Note: this does not make the enrich cache project-aware. That is to be
handled in a follow-up PR.
This commit is contained in:
Niels Bauman 2025-03-06 19:20:46 +01:00 committed by GitHub
parent ff6465b83b
commit 20e186a252
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
119 changed files with 863 additions and 541 deletions

View file

@ -8,6 +8,7 @@
*/ */
package org.elasticsearch.logstashbridge.ingest; package org.elasticsearch.logstashbridge.ingest;
import org.elasticsearch.core.FixForMultiProject;
import org.elasticsearch.ingest.Pipeline; import org.elasticsearch.ingest.Pipeline;
import org.elasticsearch.logstashbridge.StableBridgeAPI; import org.elasticsearch.logstashbridge.StableBridgeAPI;
import org.elasticsearch.logstashbridge.script.ScriptServiceBridge; import org.elasticsearch.logstashbridge.script.ScriptServiceBridge;
@ -20,6 +21,7 @@ public class PipelineBridge extends StableBridgeAPI.Proxy<Pipeline> {
return new PipelineBridge(pipeline); return new PipelineBridge(pipeline);
} }
@FixForMultiProject(description = "should we pass a non-null project ID here?")
public static PipelineBridge create( public static PipelineBridge create(
String id, String id,
Map<String, Object> config, Map<String, Object> config,
@ -27,7 +29,13 @@ public class PipelineBridge extends StableBridgeAPI.Proxy<Pipeline> {
ScriptServiceBridge scriptServiceBridge ScriptServiceBridge scriptServiceBridge
) throws Exception { ) throws Exception {
return wrap( return wrap(
Pipeline.create(id, config, StableBridgeAPI.unwrap(processorFactories), StableBridgeAPI.unwrapNullable(scriptServiceBridge)) Pipeline.create(
id,
config,
StableBridgeAPI.unwrap(processorFactories),
StableBridgeAPI.unwrapNullable(scriptServiceBridge),
null
)
); );
} }

View file

@ -8,6 +8,7 @@
*/ */
package org.elasticsearch.logstashbridge.ingest; package org.elasticsearch.logstashbridge.ingest;
import org.elasticsearch.core.FixForMultiProject;
import org.elasticsearch.core.TimeValue; import org.elasticsearch.core.TimeValue;
import org.elasticsearch.ingest.IngestService; import org.elasticsearch.ingest.IngestService;
import org.elasticsearch.ingest.Processor; import org.elasticsearch.ingest.Processor;
@ -118,7 +119,7 @@ public interface ProcessorBridge extends StableBridgeAPI<Processor> {
@Override @Override
default Processor.Factory unwrap() { default Processor.Factory unwrap() {
final Factory stableAPIFactory = this; final Factory stableAPIFactory = this;
return (registry, tag, description, config) -> stableAPIFactory.create( return (registry, tag, description, config, projectId) -> stableAPIFactory.create(
StableBridgeAPI.wrap(registry, Factory::wrap), StableBridgeAPI.wrap(registry, Factory::wrap),
tag, tag,
description, description,
@ -131,6 +132,7 @@ public interface ProcessorBridge extends StableBridgeAPI<Processor> {
super(delegate); super(delegate);
} }
@FixForMultiProject(description = "should we pass a non-null project ID here?")
@Override @Override
public ProcessorBridge create( public ProcessorBridge create(
final Map<String, Factory> registry, final Map<String, Factory> registry,
@ -138,7 +140,9 @@ public interface ProcessorBridge extends StableBridgeAPI<Processor> {
final String description, final String description,
final Map<String, Object> config final Map<String, Object> config
) throws Exception { ) throws Exception {
return ProcessorBridge.wrap(this.delegate.create(StableBridgeAPI.unwrap(registry), processorTag, description, config)); return ProcessorBridge.wrap(
this.delegate.create(StableBridgeAPI.unwrap(registry), processorTag, description, config, null)
);
} }
@Override @Override

View file

@ -403,9 +403,9 @@ public class IngestFailureStoreMetricsIT extends ESIntegTestCase {
Map<String, Processor.Factory> processors = new HashMap<>(); Map<String, Processor.Factory> processors = new HashMap<>();
processors.put( processors.put(
"drop", "drop",
(factories, tag, description, config) -> new TestProcessor(tag, "drop", description, ingestDocument -> null) (factories, tag, description, config, projectId) -> new TestProcessor(tag, "drop", description, ingestDocument -> null)
); );
processors.put("reroute", (factories, tag, description, config) -> { processors.put("reroute", (factories, tag, description, config, projectId) -> {
String destination = (String) config.remove("destination"); String destination = (String) config.remove("destination");
return new TestProcessor( return new TestProcessor(
tag, tag,
@ -416,7 +416,12 @@ public class IngestFailureStoreMetricsIT extends ESIntegTestCase {
}); });
processors.put( processors.put(
"fail", "fail",
(processorFactories, tag, description, config) -> new TestProcessor(tag, "fail", description, new RuntimeException()) (processorFactories, tag, description, config, projectId) -> new TestProcessor(
tag,
"fail",
description,
new RuntimeException()
)
); );
return processors; return processors;
} }

View file

@ -15,6 +15,7 @@ import org.apache.tika.metadata.Metadata;
import org.apache.tika.metadata.Office; import org.apache.tika.metadata.Office;
import org.apache.tika.metadata.TikaCoreProperties; import org.apache.tika.metadata.TikaCoreProperties;
import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
import org.elasticsearch.common.logging.DeprecationCategory; import org.elasticsearch.common.logging.DeprecationCategory;
import org.elasticsearch.common.logging.DeprecationLogger; import org.elasticsearch.common.logging.DeprecationLogger;
@ -232,7 +233,8 @@ public final class AttachmentProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) { ) {
String field = readStringProperty(TYPE, processorTag, config, "field"); String field = readStringProperty(TYPE, processorTag, config, "field");
String resourceName = readOptionalStringProperty(TYPE, processorTag, config, "resource_name"); String resourceName = readOptionalStringProperty(TYPE, processorTag, config, "resource_name");

View file

@ -36,7 +36,7 @@ public class AttachmentProcessorFactoryTests extends ESTestCase {
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
AttachmentProcessor processor = factory.create(null, processorTag, null, config); AttachmentProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getTargetField(), equalTo("attachment")); assertThat(processor.getTargetField(), equalTo("attachment"));
@ -57,7 +57,7 @@ public class AttachmentProcessorFactoryTests extends ESTestCase {
config.put("indexed_chars", indexedChars); config.put("indexed_chars", indexedChars);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
AttachmentProcessor processor = factory.create(null, processorTag, null, config); AttachmentProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getIndexedChars(), is(indexedChars)); assertThat(processor.getIndexedChars(), is(indexedChars));
assertFalse(processor.isIgnoreMissing()); assertFalse(processor.isIgnoreMissing());
@ -73,7 +73,7 @@ public class AttachmentProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
config.put("target_field", "_field"); config.put("target_field", "_field");
AttachmentProcessor processor = factory.create(null, null, null, config); AttachmentProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getTargetField(), equalTo("_field")); assertThat(processor.getTargetField(), equalTo("_field"));
assertFalse(processor.isIgnoreMissing()); assertFalse(processor.isIgnoreMissing());
@ -97,7 +97,7 @@ public class AttachmentProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
config.put("properties", fieldNames); config.put("properties", fieldNames);
AttachmentProcessor processor = factory.create(null, null, null, config); AttachmentProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getProperties(), equalTo(properties)); assertThat(processor.getProperties(), equalTo(properties));
assertFalse(processor.isIgnoreMissing()); assertFalse(processor.isIgnoreMissing());
@ -114,7 +114,7 @@ public class AttachmentProcessorFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
config.put("properties", Collections.singletonList("invalid")); config.put("properties", Collections.singletonList("invalid"));
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("exception expected"); fail("exception expected");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), containsString("[properties] illegal field option [invalid]")); assertThat(e.getMessage(), containsString("[properties] illegal field option [invalid]"));
@ -128,7 +128,7 @@ public class AttachmentProcessorFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
config.put("properties", "invalid"); config.put("properties", "invalid");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("exception expected"); fail("exception expected");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[properties] property isn't a list, but of type [java.lang.String]")); assertThat(e.getMessage(), equalTo("[properties] property isn't a list, but of type [java.lang.String]"));
@ -148,7 +148,7 @@ public class AttachmentProcessorFactoryTests extends ESTestCase {
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
AttachmentProcessor processor = factory.create(null, processorTag, null, config); AttachmentProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getTargetField(), equalTo("attachment")); assertThat(processor.getTargetField(), equalTo("attachment"));
@ -169,7 +169,7 @@ public class AttachmentProcessorFactoryTests extends ESTestCase {
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
AttachmentProcessor processor = factory.create(null, processorTag, null, config); AttachmentProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getTargetField(), equalTo("attachment")); assertThat(processor.getTargetField(), equalTo("attachment"));

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.IngestDocument;
@ -108,7 +109,8 @@ abstract class AbstractStringProcessor<T> extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String tag, String tag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String field = ConfigurationUtils.readStringProperty(processorType, tag, config, "field"); String field = ConfigurationUtils.readStringProperty(processorType, tag, config, "field");
boolean ignoreMissing = ConfigurationUtils.readBooleanProperty(processorType, tag, config, "ignore_missing", false); boolean ignoreMissing = ConfigurationUtils.readBooleanProperty(processorType, tag, config, "ignore_missing", false);

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.IngestDocument;
@ -73,7 +74,8 @@ public final class AppendProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field");
Object value = ConfigurationUtils.readObject(TYPE, processorTag, config, "value"); Object value = ConfigurationUtils.readObject(TYPE, processorTag, config, "value");

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.common.network.InetAddresses; import org.elasticsearch.common.network.InetAddresses;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
@ -297,7 +298,8 @@ public final class CommunityIdProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String sourceIpField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "source_ip", DEFAULT_SOURCE_IP); String sourceIpField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "source_ip", DEFAULT_SOURCE_IP);
String sourcePortField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "source_port", DEFAULT_SOURCE_PORT); String sourcePortField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "source_port", DEFAULT_SOURCE_PORT);

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.common.network.InetAddresses; import org.elasticsearch.common.network.InetAddresses;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
@ -216,7 +217,8 @@ public final class ConvertProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field");
String typeProperty = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "type"); String typeProperty = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "type");

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.IngestDocument;
@ -93,7 +94,8 @@ public final class CsvProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) { ) {
String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field");
String quote = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "quote", "\""); String quote = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "quote", "\"");

View file

@ -10,6 +10,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.ExceptionsHelper; import org.elasticsearch.ExceptionsHelper;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.common.time.DateFormatter; import org.elasticsearch.common.time.DateFormatter;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
@ -150,7 +151,8 @@ public final class DateIndexNameProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String tag, String tag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String localeString = ConfigurationUtils.readOptionalStringProperty(TYPE, tag, config, "locale"); String localeString = ConfigurationUtils.readOptionalStringProperty(TYPE, tag, config, "locale");
String timezoneString = ConfigurationUtils.readOptionalStringProperty(TYPE, tag, config, "timezone"); String timezoneString = ConfigurationUtils.readOptionalStringProperty(TYPE, tag, config, "timezone");

View file

@ -10,6 +10,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.ExceptionsHelper; import org.elasticsearch.ExceptionsHelper;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.common.settings.SettingsException; import org.elasticsearch.common.settings.SettingsException;
import org.elasticsearch.common.time.DateFormatter; import org.elasticsearch.common.time.DateFormatter;
import org.elasticsearch.common.util.LocaleUtils; import org.elasticsearch.common.util.LocaleUtils;
@ -183,7 +184,8 @@ public final class DateProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field");
String targetField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "target_field", DEFAULT_TARGET_FIELD); String targetField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "target_field", DEFAULT_TARGET_FIELD);

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.dissect.DissectParser; import org.elasticsearch.dissect.DissectParser;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
@ -60,7 +61,8 @@ public final class DissectProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) { ) {
String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field");
String pattern = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "pattern"); String pattern = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "pattern");

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.IngestDocument;
@ -120,7 +121,8 @@ public final class DotExpanderProcessor extends AbstractProcessor {
Map<String, Processor.Factory> processorFactories, Map<String, Processor.Factory> processorFactories,
String tag, String tag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String field = ConfigurationUtils.readStringProperty(TYPE, tag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, tag, config, "field");
if (field.contains(".") == false && field.equals("*") == false) { if (field.contains(".") == false && field.equals("*") == false) {

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.IngestDocument;
@ -60,7 +61,8 @@ public final class FailProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String message = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "message"); String message = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "message");
TemplateScript.Factory compiledTemplate = ConfigurationUtils.compileTemplate( TemplateScript.Factory compiledTemplate = ConfigurationUtils.compileTemplate(

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
import org.elasticsearch.common.hash.Murmur3Hasher; import org.elasticsearch.common.hash.Murmur3Hasher;
import org.elasticsearch.common.util.ByteUtils; import org.elasticsearch.common.util.ByteUtils;
@ -227,7 +228,8 @@ public final class FingerprintProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
List<String> fields = ConfigurationUtils.readList(TYPE, processorTag, config, "fields"); List<String> fields = ConfigurationUtils.readList(TYPE, processorTag, config, "fields");
if (fields.size() < 1) { if (fields.size() < 1) {

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
import org.elasticsearch.common.util.Maps; import org.elasticsearch.common.util.Maps;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
@ -235,8 +236,13 @@ public final class ForEachProcessor extends AbstractProcessor implements Wrappin
} }
@Override @Override
public ForEachProcessor create(Map<String, Processor.Factory> factories, String tag, String description, Map<String, Object> config) public ForEachProcessor create(
throws Exception { Map<String, Processor.Factory> factories,
String tag,
String description,
Map<String, Object> config,
ProjectId projectId
) throws Exception {
String field = readStringProperty(TYPE, tag, config, "field"); String field = readStringProperty(TYPE, tag, config, "field");
boolean ignoreMissing = readBooleanProperty(TYPE, tag, config, "ignore_missing", false); boolean ignoreMissing = readBooleanProperty(TYPE, tag, config, "ignore_missing", false);
Map<String, Map<String, Object>> processorConfig = readMap(TYPE, tag, config, "processor"); Map<String, Map<String, Object>> processorConfig = readMap(TYPE, tag, config, "processor");
@ -245,7 +251,7 @@ public final class ForEachProcessor extends AbstractProcessor implements Wrappin
throw newConfigurationException(TYPE, tag, "processor", "Must specify exactly one processor type"); throw newConfigurationException(TYPE, tag, "processor", "Must specify exactly one processor type");
} }
Map.Entry<String, Map<String, Object>> entry = entries.iterator().next(); Map.Entry<String, Map<String, Object>> entry = entries.iterator().next();
Processor processor = ConfigurationUtils.readProcessor(factories, scriptService, entry.getKey(), entry.getValue()); Processor processor = ConfigurationUtils.readProcessor(factories, scriptService, entry.getKey(), entry.getValue(), projectId);
return new ForEachProcessor(tag, description, field, processor, ignoreMissing); return new ForEachProcessor(tag, description, field, processor, ignoreMissing);
} }
} }

View file

@ -11,6 +11,7 @@ package org.elasticsearch.ingest.common;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.grok.Grok; import org.elasticsearch.grok.Grok;
import org.elasticsearch.grok.GrokBuiltinPatterns; import org.elasticsearch.grok.GrokBuiltinPatterns;
import org.elasticsearch.grok.MatcherWatchdog; import org.elasticsearch.grok.MatcherWatchdog;
@ -150,7 +151,8 @@ public final class GrokProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String matchField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field"); String matchField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field");
List<String> matchPatterns = ConfigurationUtils.readList(TYPE, processorTag, config, "patterns"); List<String> matchPatterns = ConfigurationUtils.readList(TYPE, processorTag, config, "patterns");

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.IngestDocument;
@ -71,7 +72,8 @@ public final class JoinProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field");
String separator = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "separator"); String separator = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "separator");

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.core.Strings; import org.elasticsearch.core.Strings;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
@ -217,7 +218,8 @@ public final class JsonProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field");
String targetField = ConfigurationUtils.readOptionalStringProperty(TYPE, processorTag, config, "target_field"); String targetField = ConfigurationUtils.readOptionalStringProperty(TYPE, processorTag, config, "target_field");

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.core.Predicates; import org.elasticsearch.core.Predicates;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
@ -256,7 +257,8 @@ public final class KeyValueProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field");
TemplateScript.Factory fieldTemplate = ConfigurationUtils.compileTemplate(TYPE, processorTag, "field", field, scriptService); TemplateScript.Factory fieldTemplate = ConfigurationUtils.compileTemplate(TYPE, processorTag, "field", field, scriptService);

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.common.network.CIDRUtils; import org.elasticsearch.common.network.CIDRUtils;
import org.elasticsearch.common.network.InetAddresses; import org.elasticsearch.common.network.InetAddresses;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
@ -251,7 +252,8 @@ public class NetworkDirectionProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
final String sourceIpField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "source_ip", DEFAULT_SOURCE_IP); final String sourceIpField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "source_ip", DEFAULT_SOURCE_IP);
final String destIpField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "destination_ip", DEFAULT_DEST_IP); final String destIpField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "destination_ip", DEFAULT_DEST_IP);

View file

@ -11,6 +11,7 @@ package org.elasticsearch.ingest.common;
import org.apache.http.conn.util.PublicSuffixMatcher; import org.apache.http.conn.util.PublicSuffixMatcher;
import org.apache.http.conn.util.PublicSuffixMatcherLoader; import org.apache.http.conn.util.PublicSuffixMatcherLoader;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
import org.elasticsearch.core.Nullable; import org.elasticsearch.core.Nullable;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
@ -140,7 +141,8 @@ public class RegisteredDomainProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String tag, String tag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String field = ConfigurationUtils.readStringProperty(TYPE, tag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, tag, config, "field");
String targetField = ConfigurationUtils.readStringProperty(TYPE, tag, config, "target_field", DEFAULT_TARGET_FIELD); String targetField = ConfigurationUtils.readStringProperty(TYPE, tag, config, "target_field", DEFAULT_TARGET_FIELD);

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.IngestDocument;
@ -109,7 +110,8 @@ public final class RemoveProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
final List<TemplateScript.Factory> compiledTemplatesToRemove = getTemplates(processorTag, config, "field"); final List<TemplateScript.Factory> compiledTemplatesToRemove = getTemplates(processorTag, config, "field");
final List<TemplateScript.Factory> compiledTemplatesToKeep = getTemplates(processorTag, config, "keep"); final List<TemplateScript.Factory> compiledTemplatesToKeep = getTemplates(processorTag, config, "keep");

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.IngestDocument;
@ -110,7 +111,8 @@ public final class RenameProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field");
TemplateScript.Factory fieldTemplate = ConfigurationUtils.compileTemplate(TYPE, processorTag, "field", field, scriptService); TemplateScript.Factory fieldTemplate = ConfigurationUtils.compileTemplate(TYPE, processorTag, "field", field, scriptService);

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.core.Nullable; import org.elasticsearch.core.Nullable;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
@ -175,7 +176,8 @@ public final class RerouteProcessor extends AbstractProcessor {
Map<String, Processor.Factory> processorFactories, Map<String, Processor.Factory> processorFactories,
String tag, String tag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
List<DataStreamValueSource> type; List<DataStreamValueSource> type;
try { try {

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.xcontent.LoggingDeprecationHandler; import org.elasticsearch.common.xcontent.LoggingDeprecationHandler;
import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentHelper;
@ -105,7 +106,8 @@ public final class ScriptProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
try ( try (
XContentBuilder builder = XContentBuilder.builder(JsonXContent.jsonXContent).map(config); XContentBuilder builder = XContentBuilder.builder(JsonXContent.jsonXContent).map(config);

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.IngestDocument;
@ -109,7 +110,8 @@ public final class SetProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field");
String copyFrom = ConfigurationUtils.readOptionalStringProperty(TYPE, processorTag, config, "copy_from"); String copyFrom = ConfigurationUtils.readOptionalStringProperty(TYPE, processorTag, config, "copy_from");

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.IngestDocument;
@ -115,7 +116,8 @@ public final class SortProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, FIELD); String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, FIELD);
String targetField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "target_field", field); String targetField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "target_field", field);

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.IngestDocument;
@ -99,7 +100,8 @@ public final class SplitProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field");
boolean ignoreMissing = ConfigurationUtils.readBooleanProperty(TYPE, processorTag, config, "ignore_missing", false); boolean ignoreMissing = ConfigurationUtils.readBooleanProperty(TYPE, processorTag, config, "ignore_missing", false);

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.IngestDocument; import org.elasticsearch.ingest.IngestDocument;
import org.elasticsearch.ingest.Processor; import org.elasticsearch.ingest.Processor;
@ -45,7 +46,8 @@ public class TerminateProcessor extends AbstractProcessor {
Map<String, Processor.Factory> processorFactories, Map<String, Processor.Factory> processorFactories,
String tag, String tag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) { ) {
return new TerminateProcessor(tag, description); return new TerminateProcessor(tag, description);
} }

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.common; package org.elasticsearch.ingest.common;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.core.SuppressForbidden; import org.elasticsearch.core.SuppressForbidden;
import org.elasticsearch.ingest.AbstractProcessor; import org.elasticsearch.ingest.AbstractProcessor;
import org.elasticsearch.ingest.ConfigurationUtils; import org.elasticsearch.ingest.ConfigurationUtils;
@ -184,7 +185,8 @@ public class UriPartsProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field"); String field = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "field");
String targetField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "target_field", "url"); String targetField = ConfigurationUtils.readStringProperty(TYPE, processorTag, config, "target_field", "url");

View file

@ -37,7 +37,7 @@ public abstract class AbstractStringProcessorFactoryTestCase extends ESTestCase
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", fieldName); config.put("field", fieldName);
AbstractStringProcessor<?> processor = factory.create(null, processorTag, null, modifyConfig(config)); AbstractStringProcessor<?> processor = factory.create(null, processorTag, null, modifyConfig(config), null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo(fieldName)); assertThat(processor.getField(), equalTo(fieldName));
assertThat(processor.isIgnoreMissing(), is(false)); assertThat(processor.isIgnoreMissing(), is(false));
@ -54,7 +54,7 @@ public abstract class AbstractStringProcessorFactoryTestCase extends ESTestCase
config.put("field", fieldName); config.put("field", fieldName);
config.put("ignore_missing", true); config.put("ignore_missing", true);
AbstractStringProcessor<?> processor = factory.create(null, processorTag, null, modifyConfig(config)); AbstractStringProcessor<?> processor = factory.create(null, processorTag, null, modifyConfig(config), null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo(fieldName)); assertThat(processor.getField(), equalTo(fieldName));
assertThat(processor.isIgnoreMissing(), is(true)); assertThat(processor.isIgnoreMissing(), is(true));
@ -72,7 +72,7 @@ public abstract class AbstractStringProcessorFactoryTestCase extends ESTestCase
config.put("field", fieldName); config.put("field", fieldName);
config.put("target_field", targetFieldName); config.put("target_field", targetFieldName);
AbstractStringProcessor<?> processor = factory.create(null, processorTag, null, modifyConfig(config)); AbstractStringProcessor<?> processor = factory.create(null, processorTag, null, modifyConfig(config), null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo(fieldName)); assertThat(processor.getField(), equalTo(fieldName));
assertThat(processor.isIgnoreMissing(), is(false)); assertThat(processor.isIgnoreMissing(), is(false));
@ -84,7 +84,7 @@ public abstract class AbstractStringProcessorFactoryTestCase extends ESTestCase
AbstractStringProcessor.Factory factory = newFactory(); AbstractStringProcessor.Factory factory = newFactory();
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));

View file

@ -43,7 +43,7 @@ public class AppendProcessorFactoryTests extends ESTestCase {
} }
config.put("value", value); config.put("value", value);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
AppendProcessor appendProcessor = factory.create(null, processorTag, null, config); AppendProcessor appendProcessor = factory.create(null, processorTag, null, config, null);
assertThat(appendProcessor.getTag(), equalTo(processorTag)); assertThat(appendProcessor.getTag(), equalTo(processorTag));
assertThat(appendProcessor.getField().newInstance(Map.of()).execute(), equalTo("field1")); assertThat(appendProcessor.getField().newInstance(Map.of()).execute(), equalTo("field1"));
assertThat(appendProcessor.getValue().copyAndResolve(Map.of()), equalTo(value)); assertThat(appendProcessor.getValue().copyAndResolve(Map.of()), equalTo(value));
@ -53,7 +53,7 @@ public class AppendProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("value", "value1"); config.put("value", "value1");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));
@ -64,7 +64,7 @@ public class AppendProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "field1"); config.put("field", "field1");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[value] required property is missing")); assertThat(e.getMessage(), equalTo("[value] required property is missing"));
@ -76,7 +76,7 @@ public class AppendProcessorFactoryTests extends ESTestCase {
config.put("field", "field1"); config.put("field", "field1");
config.put("value", null); config.put("value", null);
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[value] required property is missing")); assertThat(e.getMessage(), equalTo("[value] required property is missing"));
@ -91,7 +91,7 @@ public class AppendProcessorFactoryTests extends ESTestCase {
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
ElasticsearchException exception = expectThrows( ElasticsearchException exception = expectThrows(
ElasticsearchException.class, ElasticsearchException.class,
() -> factory.create(null, processorTag, null, config) () -> factory.create(null, processorTag, null, config, null)
); );
assertThat(exception.getMessage(), equalTo("java.lang.RuntimeException: could not compile script")); assertThat(exception.getMessage(), equalTo("java.lang.RuntimeException: could not compile script"));
assertThat(exception.getMetadata("es.processor_tag").get(0), equalTo(processorTag)); assertThat(exception.getMetadata("es.processor_tag").get(0), equalTo(processorTag));
@ -105,7 +105,7 @@ public class AppendProcessorFactoryTests extends ESTestCase {
config.put("value", "value1"); config.put("value", "value1");
config.put("media_type", expectedMediaType); config.put("media_type", expectedMediaType);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
AppendProcessor appendProcessor = factory.create(null, processorTag, null, config); AppendProcessor appendProcessor = factory.create(null, processorTag, null, config, null);
assertThat(appendProcessor.getTag(), equalTo(processorTag)); assertThat(appendProcessor.getTag(), equalTo(processorTag));
// invalid media type // invalid media type
@ -117,7 +117,10 @@ public class AppendProcessorFactoryTests extends ESTestCase {
config2.put("field", "field1"); config2.put("field", "field1");
config2.put("value", "value1"); config2.put("value", "value1");
config2.put("media_type", expectedMediaType); config2.put("media_type", expectedMediaType);
ElasticsearchException e = expectThrows(ElasticsearchException.class, () -> factory.create(null, processorTag, null, config2)); ElasticsearchException e = expectThrows(
ElasticsearchException.class,
() -> factory.create(null, processorTag, null, config2, null)
);
assertThat(e.getMessage(), containsString("property does not contain a supported media type [" + expectedMediaType + "]")); assertThat(e.getMessage(), containsString("property does not contain a supported media type [" + expectedMediaType + "]"));
} }
} }

View file

@ -65,7 +65,7 @@ public class CommunityIdProcessorFactoryTests extends ESTestCase {
config.put("ignore_missing", ignoreMissing); config.put("ignore_missing", ignoreMissing);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
CommunityIdProcessor communityIdProcessor = factory.create(null, processorTag, null, config); CommunityIdProcessor communityIdProcessor = factory.create(null, processorTag, null, config, null);
assertThat(communityIdProcessor.getTag(), equalTo(processorTag)); assertThat(communityIdProcessor.getTag(), equalTo(processorTag));
assertThat(communityIdProcessor.getSourceIpField(), equalTo(sourceIpField)); assertThat(communityIdProcessor.getSourceIpField(), equalTo(sourceIpField));
assertThat(communityIdProcessor.getSourcePortField(), equalTo(sourcePortField)); assertThat(communityIdProcessor.getSourcePortField(), equalTo(sourcePortField));
@ -87,27 +87,27 @@ public class CommunityIdProcessorFactoryTests extends ESTestCase {
// negative seeds are rejected // negative seeds are rejected
int tooSmallSeed = randomIntBetween(Integer.MIN_VALUE, -1); int tooSmallSeed = randomIntBetween(Integer.MIN_VALUE, -1);
config.put("seed", Integer.toString(tooSmallSeed)); config.put("seed", Integer.toString(tooSmallSeed));
ElasticsearchException e = expectThrows(ElasticsearchException.class, () -> factory.create(null, processorTag, null, config)); ElasticsearchException e = expectThrows(ElasticsearchException.class, () -> factory.create(null, processorTag, null, config, null));
assertThat(e.getMessage(), containsString("must be a value between 0 and 65535")); assertThat(e.getMessage(), containsString("must be a value between 0 and 65535"));
// seeds >= 2^16 are rejected // seeds >= 2^16 are rejected
int tooBigSeed = randomIntBetween(65536, Integer.MAX_VALUE); int tooBigSeed = randomIntBetween(65536, Integer.MAX_VALUE);
config.put("seed", Integer.toString(tooBigSeed)); config.put("seed", Integer.toString(tooBigSeed));
e = expectThrows(ElasticsearchException.class, () -> factory.create(null, processorTag, null, config)); e = expectThrows(ElasticsearchException.class, () -> factory.create(null, processorTag, null, config, null));
assertThat(e.getMessage(), containsString("must be a value between 0 and 65535")); assertThat(e.getMessage(), containsString("must be a value between 0 and 65535"));
// seeds between 0 and 2^16-1 are accepted // seeds between 0 and 2^16-1 are accepted
int justRightSeed = randomIntBetween(0, 65535); int justRightSeed = randomIntBetween(0, 65535);
byte[] expectedSeed = new byte[] { (byte) (justRightSeed >> 8), (byte) justRightSeed }; byte[] expectedSeed = new byte[] { (byte) (justRightSeed >> 8), (byte) justRightSeed };
config.put("seed", Integer.toString(justRightSeed)); config.put("seed", Integer.toString(justRightSeed));
CommunityIdProcessor communityIdProcessor = factory.create(null, processorTag, null, config); CommunityIdProcessor communityIdProcessor = factory.create(null, processorTag, null, config, null);
assertThat(communityIdProcessor.getSeed(), equalTo(expectedSeed)); assertThat(communityIdProcessor.getSeed(), equalTo(expectedSeed));
} }
public void testRequiredFields() throws Exception { public void testRequiredFields() throws Exception {
HashMap<String, Object> config = new HashMap<>(); HashMap<String, Object> config = new HashMap<>();
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
CommunityIdProcessor communityIdProcessor = factory.create(null, processorTag, null, config); CommunityIdProcessor communityIdProcessor = factory.create(null, processorTag, null, config, null);
assertThat(communityIdProcessor.getTag(), equalTo(processorTag)); assertThat(communityIdProcessor.getTag(), equalTo(processorTag));
assertThat(communityIdProcessor.getSourceIpField(), equalTo(DEFAULT_SOURCE_IP)); assertThat(communityIdProcessor.getSourceIpField(), equalTo(DEFAULT_SOURCE_IP));
assertThat(communityIdProcessor.getSourcePortField(), equalTo(DEFAULT_SOURCE_PORT)); assertThat(communityIdProcessor.getSourcePortField(), equalTo(DEFAULT_SOURCE_PORT));

View file

@ -28,7 +28,7 @@ public class ConvertProcessorFactoryTests extends ESTestCase {
config.put("field", "field1"); config.put("field", "field1");
config.put("type", type.toString()); config.put("type", type.toString());
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
ConvertProcessor convertProcessor = factory.create(null, processorTag, null, config); ConvertProcessor convertProcessor = factory.create(null, processorTag, null, config, null);
assertThat(convertProcessor.getTag(), equalTo(processorTag)); assertThat(convertProcessor.getTag(), equalTo(processorTag));
assertThat(convertProcessor.getField(), equalTo("field1")); assertThat(convertProcessor.getField(), equalTo("field1"));
assertThat(convertProcessor.getTargetField(), equalTo("field1")); assertThat(convertProcessor.getTargetField(), equalTo("field1"));
@ -43,7 +43,7 @@ public class ConvertProcessorFactoryTests extends ESTestCase {
config.put("field", "field1"); config.put("field", "field1");
config.put("type", type); config.put("type", type);
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[type] type [" + type + "] not supported, cannot convert field.")); assertThat(e.getMessage(), equalTo("[type] type [" + type + "] not supported, cannot convert field."));
@ -59,7 +59,7 @@ public class ConvertProcessorFactoryTests extends ESTestCase {
String type = "type-" + randomAlphaOfLengthBetween(1, 10); String type = "type-" + randomAlphaOfLengthBetween(1, 10);
config.put("type", type); config.put("type", type);
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));
@ -71,7 +71,7 @@ public class ConvertProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "field1"); config.put("field", "field1");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[type] required property is missing")); assertThat(e.getMessage(), equalTo("[type] required property is missing"));
@ -86,7 +86,7 @@ public class ConvertProcessorFactoryTests extends ESTestCase {
config.put("target_field", "field2"); config.put("target_field", "field2");
config.put("type", type.toString()); config.put("type", type.toString());
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
ConvertProcessor convertProcessor = factory.create(null, processorTag, null, config); ConvertProcessor convertProcessor = factory.create(null, processorTag, null, config, null);
assertThat(convertProcessor.getTag(), equalTo(processorTag)); assertThat(convertProcessor.getTag(), equalTo(processorTag));
assertThat(convertProcessor.getField(), equalTo("field1")); assertThat(convertProcessor.getField(), equalTo("field1"));
assertThat(convertProcessor.getTargetField(), equalTo("field2")); assertThat(convertProcessor.getTargetField(), equalTo("field2"));
@ -102,7 +102,7 @@ public class ConvertProcessorFactoryTests extends ESTestCase {
config.put("type", type.toString()); config.put("type", type.toString());
config.put("ignore_missing", true); config.put("ignore_missing", true);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
ConvertProcessor convertProcessor = factory.create(null, processorTag, null, config); ConvertProcessor convertProcessor = factory.create(null, processorTag, null, config, null);
assertThat(convertProcessor.getTag(), equalTo(processorTag)); assertThat(convertProcessor.getTag(), equalTo(processorTag));
assertThat(convertProcessor.getField(), equalTo("field1")); assertThat(convertProcessor.getField(), equalTo("field1"));
assertThat(convertProcessor.getTargetField(), equalTo("field1")); assertThat(convertProcessor.getTargetField(), equalTo("field1"));

View file

@ -31,7 +31,7 @@ public class CsvProcessorFactoryTests extends ESTestCase {
properties.put("empty_value", "empty"); properties.put("empty_value", "empty");
properties.put("trim", true); properties.put("trim", true);
properties.put("ignore_missing", true); properties.put("ignore_missing", true);
CsvProcessor csv = factory.create(null, "csv", null, properties); CsvProcessor csv = factory.create(null, "csv", null, properties, null);
assertThat(csv, notNullValue()); assertThat(csv, notNullValue());
assertThat(csv.field, equalTo("field")); assertThat(csv.field, equalTo("field"));
assertThat(csv.headers, equalTo(new String[] { "target" })); assertThat(csv.headers, equalTo(new String[] { "target" }));

View file

@ -28,7 +28,7 @@ public class DateIndexNameFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
config.put("date_rounding", "y"); config.put("date_rounding", "y");
DateIndexNameProcessor processor = factory.create(null, null, null, config); DateIndexNameProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getDateFormats().size(), equalTo(1)); assertThat(processor.getDateFormats().size(), equalTo(1));
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getIndexNamePrefixTemplate().newInstance(Map.of()).execute(), equalTo("")); assertThat(processor.getIndexNamePrefixTemplate().newInstance(Map.of()).execute(), equalTo(""));
@ -45,7 +45,7 @@ public class DateIndexNameFactoryTests extends ESTestCase {
config.put("date_rounding", "y"); config.put("date_rounding", "y");
config.put("date_formats", List.of("UNIX", "UNIX_MS")); config.put("date_formats", List.of("UNIX", "UNIX_MS"));
DateIndexNameProcessor processor = factory.create(null, null, null, config); DateIndexNameProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getDateFormats().size(), equalTo(2)); assertThat(processor.getDateFormats().size(), equalTo(2));
config = new HashMap<>(); config = new HashMap<>();
@ -54,7 +54,7 @@ public class DateIndexNameFactoryTests extends ESTestCase {
config.put("date_rounding", "y"); config.put("date_rounding", "y");
config.put("index_name_format", "yyyyMMdd"); config.put("index_name_format", "yyyyMMdd");
processor = factory.create(null, null, null, config); processor = factory.create(null, null, null, config, null);
assertThat(processor.getIndexNameFormatTemplate().newInstance(Map.of()).execute(), equalTo("yyyyMMdd")); assertThat(processor.getIndexNameFormatTemplate().newInstance(Map.of()).execute(), equalTo("yyyyMMdd"));
config = new HashMap<>(); config = new HashMap<>();
@ -63,7 +63,7 @@ public class DateIndexNameFactoryTests extends ESTestCase {
config.put("date_rounding", "y"); config.put("date_rounding", "y");
config.put("timezone", "+02:00"); config.put("timezone", "+02:00");
processor = factory.create(null, null, null, config); processor = factory.create(null, null, null, config, null);
assertThat(processor.getTimezone(), equalTo(ZoneOffset.ofHours(2))); assertThat(processor.getTimezone(), equalTo(ZoneOffset.ofHours(2)));
config = new HashMap<>(); config = new HashMap<>();
@ -71,7 +71,7 @@ public class DateIndexNameFactoryTests extends ESTestCase {
config.put("index_name_prefix", "_prefix"); config.put("index_name_prefix", "_prefix");
config.put("date_rounding", "y"); config.put("date_rounding", "y");
processor = factory.create(null, null, null, config); processor = factory.create(null, null, null, config, null);
assertThat(processor.getIndexNamePrefixTemplate().newInstance(Map.of()).execute(), equalTo("_prefix")); assertThat(processor.getIndexNamePrefixTemplate().newInstance(Map.of()).execute(), equalTo("_prefix"));
} }
@ -79,12 +79,15 @@ public class DateIndexNameFactoryTests extends ESTestCase {
DateIndexNameProcessor.Factory factory = new DateIndexNameProcessor.Factory(TestTemplateService.instance()); DateIndexNameProcessor.Factory factory = new DateIndexNameProcessor.Factory(TestTemplateService.instance());
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("date_rounding", "y"); config.put("date_rounding", "y");
ElasticsearchParseException e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config)); ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class,
() -> factory.create(null, null, null, config, null)
);
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));
config.clear(); config.clear();
config.put("field", "_field"); config.put("field", "_field");
e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config)); e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config, null));
assertThat(e.getMessage(), equalTo("[date_rounding] required property is missing")); assertThat(e.getMessage(), equalTo("[date_rounding] required property is missing"));
} }
} }

View file

@ -38,7 +38,7 @@ public class DateProcessorFactoryTests extends ESTestCase {
config.put("field", sourceField); config.put("field", sourceField);
config.put("formats", List.of("dd/MM/yyyyy")); config.put("formats", List.of("dd/MM/yyyyy"));
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
DateProcessor processor = factory.create(null, processorTag, null, config); DateProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo(sourceField)); assertThat(processor.getField(), equalTo(sourceField));
assertThat(processor.getTargetField(), equalTo(DateProcessor.DEFAULT_TARGET_FIELD)); assertThat(processor.getTargetField(), equalTo(DateProcessor.DEFAULT_TARGET_FIELD));
@ -54,7 +54,7 @@ public class DateProcessorFactoryTests extends ESTestCase {
config.put("formats", List.of("dd/MM/yyyyy")); config.put("formats", List.of("dd/MM/yyyyy"));
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("processor creation should have failed"); fail("processor creation should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), containsString("[field] required property is missing")); assertThat(e.getMessage(), containsString("[field] required property is missing"));
@ -69,7 +69,7 @@ public class DateProcessorFactoryTests extends ESTestCase {
config.put("target_field", targetField); config.put("target_field", targetField);
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("processor creation should have failed"); fail("processor creation should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), containsString("[formats] required property is missing")); assertThat(e.getMessage(), containsString("[formats] required property is missing"));
@ -84,7 +84,7 @@ public class DateProcessorFactoryTests extends ESTestCase {
Locale locale = randomFrom(Locale.GERMANY, Locale.FRENCH, Locale.ROOT); Locale locale = randomFrom(Locale.GERMANY, Locale.FRENCH, Locale.ROOT);
config.put("locale", locale.toLanguageTag()); config.put("locale", locale.toLanguageTag());
DateProcessor processor = factory.create(null, null, null, config); DateProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getLocale().newInstance(Map.of()).execute(), equalTo(locale.toLanguageTag())); assertThat(processor.getLocale().newInstance(Map.of()).execute(), equalTo(locale.toLanguageTag()));
} }
@ -96,7 +96,7 @@ public class DateProcessorFactoryTests extends ESTestCase {
ZoneId timezone = randomZone(); ZoneId timezone = randomZone();
config.put("timezone", timezone.getId()); config.put("timezone", timezone.getId());
DateProcessor processor = factory.create(null, null, null, config); DateProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getTimezone().newInstance(Map.of()).execute(), equalTo(timezone.getId())); assertThat(processor.getTimezone().newInstance(Map.of()).execute(), equalTo(timezone.getId()));
} }
@ -106,7 +106,7 @@ public class DateProcessorFactoryTests extends ESTestCase {
config.put("field", sourceField); config.put("field", sourceField);
config.put("formats", List.of("dd/MM/yyyy", "dd-MM-yyyy")); config.put("formats", List.of("dd/MM/yyyy", "dd-MM-yyyy"));
DateProcessor processor = factory.create(null, null, null, config); DateProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getFormats(), equalTo(List.of("dd/MM/yyyy", "dd-MM-yyyy"))); assertThat(processor.getFormats(), equalTo(List.of("dd/MM/yyyy", "dd-MM-yyyy")));
} }
@ -117,7 +117,7 @@ public class DateProcessorFactoryTests extends ESTestCase {
config.put("formats", "dd/MM/yyyy"); config.put("formats", "dd/MM/yyyy");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("processor creation should have failed"); fail("processor creation should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), containsString("[formats] property isn't a list, but of type [java.lang.String]")); assertThat(e.getMessage(), containsString("[formats] property isn't a list, but of type [java.lang.String]"));
@ -132,7 +132,7 @@ public class DateProcessorFactoryTests extends ESTestCase {
config.put("target_field", targetField); config.put("target_field", targetField);
config.put("formats", List.of("dd/MM/yyyy", "dd-MM-yyyy")); config.put("formats", List.of("dd/MM/yyyy", "dd-MM-yyyy"));
DateProcessor processor = factory.create(null, null, null, config); DateProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getTargetField(), equalTo(targetField)); assertThat(processor.getTargetField(), equalTo(targetField));
} }
@ -145,7 +145,7 @@ public class DateProcessorFactoryTests extends ESTestCase {
config.put("target_field", targetField); config.put("target_field", targetField);
config.put("formats", List.of("dd/MM/yyyy", "dd-MM-yyyy")); config.put("formats", List.of("dd/MM/yyyy", "dd-MM-yyyy"));
config.put("output_format", outputFormat); config.put("output_format", outputFormat);
DateProcessor processor = factory.create(null, null, null, config); DateProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getOutputFormat(), equalTo(outputFormat)); assertThat(processor.getOutputFormat(), equalTo(outputFormat));
} }
@ -156,7 +156,7 @@ public class DateProcessorFactoryTests extends ESTestCase {
config.put("field", sourceField); config.put("field", sourceField);
config.put("target_field", targetField); config.put("target_field", targetField);
config.put("formats", List.of("dd/MM/yyyy", "dd-MM-yyyy")); config.put("formats", List.of("dd/MM/yyyy", "dd-MM-yyyy"));
DateProcessor processor = factory.create(null, null, null, config); DateProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getOutputFormat(), equalTo(DateProcessor.DEFAULT_OUTPUT_FORMAT)); assertThat(processor.getOutputFormat(), equalTo(DateProcessor.DEFAULT_OUTPUT_FORMAT));
} }
@ -170,7 +170,7 @@ public class DateProcessorFactoryTests extends ESTestCase {
config.put("formats", List.of("dd/MM/yyyy", "dd-MM-yyyy")); config.put("formats", List.of("dd/MM/yyyy", "dd-MM-yyyy"));
config.put("output_format", outputFormat); config.put("output_format", outputFormat);
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> factory.create(null, null, null, config)); IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> factory.create(null, null, null, config, null));
assertThat(e.getMessage(), containsString("invalid output format [" + outputFormat + "]")); assertThat(e.getMessage(), containsString("invalid output format [" + outputFormat + "]"));
} }
} }

View file

@ -36,7 +36,7 @@ public class DissectProcessorFactoryTests extends ESTestCase {
config.put("append_separator", appendSeparator); config.put("append_separator", appendSeparator);
config.put("ignore_missing", true); config.put("ignore_missing", true);
DissectProcessor processor = factory.create(null, processorTag, null, config); DissectProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.field, equalTo(fieldName)); assertThat(processor.field, equalTo(fieldName));
assertThat(processor.pattern, equalTo(pattern)); assertThat(processor.pattern, equalTo(pattern));
@ -49,7 +49,7 @@ public class DissectProcessorFactoryTests extends ESTestCase {
DissectProcessor.Factory factory = new DissectProcessor.Factory(); DissectProcessor.Factory factory = new DissectProcessor.Factory();
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("pattern", "%{a},%{b},%{c}"); config.put("pattern", "%{a},%{b},%{c}");
Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, "_tag", null, config)); Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, "_tag", null, config, null));
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));
} }
@ -57,7 +57,7 @@ public class DissectProcessorFactoryTests extends ESTestCase {
DissectProcessor.Factory factory = new DissectProcessor.Factory(); DissectProcessor.Factory factory = new DissectProcessor.Factory();
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", randomAlphaOfLength(10)); config.put("field", randomAlphaOfLength(10));
Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, "_tag", null, config)); Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, "_tag", null, config, null));
assertThat(e.getMessage(), equalTo("[pattern] required property is missing")); assertThat(e.getMessage(), equalTo("[pattern] required property is missing"));
} }
@ -66,7 +66,7 @@ public class DissectProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("pattern", "%{a},%{b},%{c}"); config.put("pattern", "%{a},%{b},%{c}");
config.put("field", randomAlphaOfLength(10)); config.put("field", randomAlphaOfLength(10));
DissectProcessor processor = factory.create(null, "_tag", null, config); DissectProcessor processor = factory.create(null, "_tag", null, config, null);
assertThat(processor.appendSeparator, equalTo("")); assertThat(processor.appendSeparator, equalTo(""));
assertThat(processor.ignoreMissing, is(false)); assertThat(processor.ignoreMissing, is(false));
} }
@ -76,6 +76,6 @@ public class DissectProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("pattern", "no keys defined"); config.put("pattern", "no keys defined");
config.put("field", randomAlphaOfLength(10)); config.put("field", randomAlphaOfLength(10));
expectThrows(DissectException.class, () -> factory.create(null, "_tag", null, config)); expectThrows(DissectException.class, () -> factory.create(null, "_tag", null, config, null));
} }
} }

View file

@ -26,13 +26,13 @@ public class DotExpanderProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "_field.field"); config.put("field", "_field.field");
config.put("path", "_path"); config.put("path", "_path");
DotExpanderProcessor processor = (DotExpanderProcessor) factory.create(null, "_tag", null, config); DotExpanderProcessor processor = (DotExpanderProcessor) factory.create(null, "_tag", null, config, null);
assertThat(processor.getField(), equalTo("_field.field")); assertThat(processor.getField(), equalTo("_field.field"));
assertThat(processor.getPath(), equalTo("_path")); assertThat(processor.getPath(), equalTo("_path"));
config = new HashMap<>(); config = new HashMap<>();
config.put("field", "_field.field"); config.put("field", "_field.field");
processor = (DotExpanderProcessor) factory.create(null, "_tag", null, config); processor = (DotExpanderProcessor) factory.create(null, "_tag", null, config, null);
assertThat(processor.getField(), equalTo("_field.field")); assertThat(processor.getField(), equalTo("_field.field"));
assertThat(processor.getPath(), nullValue()); assertThat(processor.getPath(), nullValue());
} }
@ -45,7 +45,7 @@ public class DotExpanderProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", field); config.put("field", field);
config.put("path", "_path"); config.put("path", "_path");
DotExpanderProcessor processor = (DotExpanderProcessor) factory.create(null, "_tag", null, config); DotExpanderProcessor processor = (DotExpanderProcessor) factory.create(null, "_tag", null, config, null);
assertThat(processor.getField(), equalTo(field)); assertThat(processor.getField(), equalTo(field));
assertThat(processor.getPath(), equalTo("_path")); assertThat(processor.getPath(), equalTo("_path"));
} }
@ -56,7 +56,7 @@ public class DotExpanderProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("path", "_path"); config.put("path", "_path");
Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, "_tag", null, config)); Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, "_tag", null, config, null));
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));
} }
@ -66,7 +66,7 @@ public class DotExpanderProcessorFactoryTests extends ESTestCase {
for (String field : fields) { for (String field : fields) {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", field); config.put("field", field);
Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, "_tag", null, config)); Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, "_tag", null, config, null));
assertThat(e.getMessage(), equalTo("[field] field does not contain a dot and is not a wildcard")); assertThat(e.getMessage(), equalTo("[field] field does not contain a dot and is not a wildcard"));
} }
@ -74,7 +74,7 @@ public class DotExpanderProcessorFactoryTests extends ESTestCase {
for (String field : fields) { for (String field : fields) {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", field); config.put("field", field);
Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, "_tag", null, config)); Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, "_tag", null, config, null));
assertThat(e.getMessage(), equalTo("[field] Field can't start or end with a dot")); assertThat(e.getMessage(), equalTo("[field] Field can't start or end with a dot"));
} }
@ -82,7 +82,7 @@ public class DotExpanderProcessorFactoryTests extends ESTestCase {
for (String field : fields) { for (String field : fields) {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", field); config.put("field", field);
Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, "_tag", null, config)); Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, "_tag", null, config, null));
assertThat(e.getMessage(), equalTo("[field] No space between dots")); assertThat(e.getMessage(), equalTo("[field] No space between dots"));
} }
} }

View file

@ -33,7 +33,7 @@ public class FailProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("message", "error"); config.put("message", "error");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
FailProcessor failProcessor = factory.create(null, processorTag, null, config); FailProcessor failProcessor = factory.create(null, processorTag, null, config, null);
assertThat(failProcessor.getTag(), equalTo(processorTag)); assertThat(failProcessor.getTag(), equalTo(processorTag));
assertThat(failProcessor.getMessage().newInstance(Map.of()).execute(), equalTo("error")); assertThat(failProcessor.getMessage().newInstance(Map.of()).execute(), equalTo("error"));
} }
@ -41,7 +41,7 @@ public class FailProcessorFactoryTests extends ESTestCase {
public void testCreateMissingMessageField() throws Exception { public void testCreateMissingMessageField() throws Exception {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[message] required property is missing")); assertThat(e.getMessage(), equalTo("[message] required property is missing"));
@ -55,7 +55,7 @@ public class FailProcessorFactoryTests extends ESTestCase {
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
ElasticsearchException exception = expectThrows( ElasticsearchException exception = expectThrows(
ElasticsearchException.class, ElasticsearchException.class,
() -> factory.create(null, processorTag, null, config) () -> factory.create(null, processorTag, null, config, null)
); );
assertThat(exception.getMessage(), equalTo("java.lang.RuntimeException: could not compile script")); assertThat(exception.getMessage(), equalTo("java.lang.RuntimeException: could not compile script"));
assertThat(exception.getMetadata("es.processor_tag").get(0), equalTo(processorTag)); assertThat(exception.getMetadata("es.processor_tag").get(0), equalTo(processorTag));

View file

@ -48,7 +48,7 @@ public class FingerprintProcessorFactoryTests extends ESTestCase {
config.put("ignore_missing", ignoreMissing); config.put("ignore_missing", ignoreMissing);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
FingerprintProcessor fingerprintProcessor = factory.create(null, processorTag, null, config); FingerprintProcessor fingerprintProcessor = factory.create(null, processorTag, null, config, null);
assertThat(fingerprintProcessor.getTag(), equalTo(processorTag)); assertThat(fingerprintProcessor.getTag(), equalTo(processorTag));
assertThat(fingerprintProcessor.getFields(), equalTo(sortedFieldList)); assertThat(fingerprintProcessor.getFields(), equalTo(sortedFieldList));
assertThat(fingerprintProcessor.getTargetField(), equalTo(targetField)); assertThat(fingerprintProcessor.getTargetField(), equalTo(targetField));
@ -68,7 +68,7 @@ public class FingerprintProcessorFactoryTests extends ESTestCase {
config.put("method", method); config.put("method", method);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
FingerprintProcessor fingerprintProcessor = factory.create(null, processorTag, null, config); FingerprintProcessor fingerprintProcessor = factory.create(null, processorTag, null, config, null);
assertThat(fingerprintProcessor.getTag(), equalTo(processorTag)); assertThat(fingerprintProcessor.getTag(), equalTo(processorTag));
assertThat(fingerprintProcessor.getFields(), equalTo(sortedFieldList)); assertThat(fingerprintProcessor.getFields(), equalTo(sortedFieldList));
assertThat(fingerprintProcessor.getThreadLocalHasher().get().getAlgorithm(), equalTo(method)); assertThat(fingerprintProcessor.getThreadLocalHasher().get().getAlgorithm(), equalTo(method));
@ -80,7 +80,7 @@ public class FingerprintProcessorFactoryTests extends ESTestCase {
); );
config.put("fields", fieldList); config.put("fields", fieldList);
config.put("method", invalidMethod); config.put("method", invalidMethod);
ElasticsearchException e = expectThrows(ElasticsearchException.class, () -> factory.create(null, processorTag, null, config)); ElasticsearchException e = expectThrows(ElasticsearchException.class, () -> factory.create(null, processorTag, null, config, null));
assertThat(e.getMessage(), containsString("[" + invalidMethod + "] must be one of the supported hash methods [")); assertThat(e.getMessage(), containsString("[" + invalidMethod + "] must be one of the supported hash methods ["));
} }
@ -93,17 +93,17 @@ public class FingerprintProcessorFactoryTests extends ESTestCase {
config.put("fields", fieldList); config.put("fields", fieldList);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
FingerprintProcessor fingerprintProcessor = factory.create(null, processorTag, null, config); FingerprintProcessor fingerprintProcessor = factory.create(null, processorTag, null, config, null);
assertThat(fingerprintProcessor.getTag(), equalTo(processorTag)); assertThat(fingerprintProcessor.getTag(), equalTo(processorTag));
assertThat(fingerprintProcessor.getFields(), equalTo(sortedFieldList)); assertThat(fingerprintProcessor.getFields(), equalTo(sortedFieldList));
// fields is a list of length zero // fields is a list of length zero
config.put("fields", List.of()); config.put("fields", List.of());
ElasticsearchException e = expectThrows(ElasticsearchException.class, () -> factory.create(null, processorTag, null, config)); ElasticsearchException e = expectThrows(ElasticsearchException.class, () -> factory.create(null, processorTag, null, config, null));
assertThat(e.getMessage(), containsString("must specify at least one field")); assertThat(e.getMessage(), containsString("must specify at least one field"));
// fields is missing // fields is missing
e = expectThrows(ElasticsearchException.class, () -> factory.create(null, processorTag, null, config)); e = expectThrows(ElasticsearchException.class, () -> factory.create(null, processorTag, null, config, null));
assertThat(e.getMessage(), containsString("[fields] required property is missing")); assertThat(e.getMessage(), containsString("[fields] required property is missing"));
} }
@ -115,7 +115,7 @@ public class FingerprintProcessorFactoryTests extends ESTestCase {
HashMap<String, Object> config = new HashMap<>(); HashMap<String, Object> config = new HashMap<>();
config.put("fields", fieldList); config.put("fields", fieldList);
FingerprintProcessor fingerprintProcessor = factory.create(null, processorTag, null, config); FingerprintProcessor fingerprintProcessor = factory.create(null, processorTag, null, config, null);
assertThat(fingerprintProcessor.getTag(), equalTo(processorTag)); assertThat(fingerprintProcessor.getTag(), equalTo(processorTag));
assertThat(fingerprintProcessor.getFields(), equalTo(sortedFieldList)); assertThat(fingerprintProcessor.getFields(), equalTo(sortedFieldList));
assertThat(fingerprintProcessor.getTargetField(), equalTo(FingerprintProcessor.Factory.DEFAULT_TARGET)); assertThat(fingerprintProcessor.getTargetField(), equalTo(FingerprintProcessor.Factory.DEFAULT_TARGET));

View file

@ -215,7 +215,7 @@ public class FingerprintProcessorTests extends ESTestCase {
if (salt != null) { if (salt != null) {
config.put("salt", salt); config.put("salt", salt);
} }
FingerprintProcessor fp = factory.create(null, randomAlphaOfLength(10), null, config); FingerprintProcessor fp = factory.create(null, randomAlphaOfLength(10), null, config, null);
byte[] expectedBytes = new byte[0]; byte[] expectedBytes = new byte[0];
if (salt != null) { if (salt != null) {
@ -257,7 +257,7 @@ public class FingerprintProcessorTests extends ESTestCase {
config.put("fields", List.of("foo", "bar")); config.put("fields", List.of("foo", "bar"));
config.put("method", FingerprintProcessor.Factory.SUPPORTED_DIGESTS[k]); config.put("method", FingerprintProcessor.Factory.SUPPORTED_DIGESTS[k]);
FingerprintProcessor fp = factory.create(null, randomAlphaOfLength(10), null, config); FingerprintProcessor fp = factory.create(null, randomAlphaOfLength(10), null, config, null);
var input = TestIngestDocument.withDefaultVersion(inputMap); var input = TestIngestDocument.withDefaultVersion(inputMap);
var output = fp.execute(input); var output = fp.execute(input);
assertTrue(output.hasField("fingerprint")); assertTrue(output.hasField("fingerprint"));

View file

@ -32,13 +32,13 @@ public class ForEachProcessorFactoryTests extends ESTestCase {
public void testCreate() throws Exception { public void testCreate() throws Exception {
Processor processor = new TestProcessor(ingestDocument -> {}); Processor processor = new TestProcessor(ingestDocument -> {});
Map<String, Processor.Factory> registry = new HashMap<>(); Map<String, Processor.Factory> registry = new HashMap<>();
registry.put("_name", (r, t, description, c) -> processor); registry.put("_name", (r, t, description, c, projectId) -> processor);
ForEachProcessor.Factory forEachFactory = new ForEachProcessor.Factory(scriptService); ForEachProcessor.Factory forEachFactory = new ForEachProcessor.Factory(scriptService);
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
config.put("processor", Map.of("_name", Collections.emptyMap())); config.put("processor", Map.of("_name", Collections.emptyMap()));
ForEachProcessor forEachProcessor = forEachFactory.create(registry, null, null, config); ForEachProcessor forEachProcessor = forEachFactory.create(registry, null, null, config, null);
assertThat(forEachProcessor, notNullValue()); assertThat(forEachProcessor, notNullValue());
assertThat(forEachProcessor.getField(), equalTo("_field")); assertThat(forEachProcessor.getField(), equalTo("_field"));
assertThat(forEachProcessor.getInnerProcessor(), sameInstance(processor)); assertThat(forEachProcessor.getInnerProcessor(), sameInstance(processor));
@ -48,14 +48,14 @@ public class ForEachProcessorFactoryTests extends ESTestCase {
public void testSetIgnoreMissing() throws Exception { public void testSetIgnoreMissing() throws Exception {
Processor processor = new TestProcessor(ingestDocument -> {}); Processor processor = new TestProcessor(ingestDocument -> {});
Map<String, Processor.Factory> registry = new HashMap<>(); Map<String, Processor.Factory> registry = new HashMap<>();
registry.put("_name", (r, t, description, c) -> processor); registry.put("_name", (r, t, description, c, projectId) -> processor);
ForEachProcessor.Factory forEachFactory = new ForEachProcessor.Factory(scriptService); ForEachProcessor.Factory forEachFactory = new ForEachProcessor.Factory(scriptService);
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
config.put("processor", Map.of("_name", Collections.emptyMap())); config.put("processor", Map.of("_name", Collections.emptyMap()));
config.put("ignore_missing", true); config.put("ignore_missing", true);
ForEachProcessor forEachProcessor = forEachFactory.create(registry, null, null, config); ForEachProcessor forEachProcessor = forEachFactory.create(registry, null, null, config, null);
assertThat(forEachProcessor, notNullValue()); assertThat(forEachProcessor, notNullValue());
assertThat(forEachProcessor.getField(), equalTo("_field")); assertThat(forEachProcessor.getField(), equalTo("_field"));
assertThat(forEachProcessor.getInnerProcessor(), sameInstance(processor)); assertThat(forEachProcessor.getInnerProcessor(), sameInstance(processor));
@ -65,8 +65,8 @@ public class ForEachProcessorFactoryTests extends ESTestCase {
public void testCreateWithTooManyProcessorTypes() throws Exception { public void testCreateWithTooManyProcessorTypes() throws Exception {
Processor processor = new TestProcessor(ingestDocument -> {}); Processor processor = new TestProcessor(ingestDocument -> {});
Map<String, Processor.Factory> registry = new HashMap<>(); Map<String, Processor.Factory> registry = new HashMap<>();
registry.put("_first", (r, t, description, c) -> processor); registry.put("_first", (r, t, description, c, projectId) -> processor);
registry.put("_second", (r, t, description, c) -> processor); registry.put("_second", (r, t, description, c, projectId) -> processor);
ForEachProcessor.Factory forEachFactory = new ForEachProcessor.Factory(scriptService); ForEachProcessor.Factory forEachFactory = new ForEachProcessor.Factory(scriptService);
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
@ -75,7 +75,10 @@ public class ForEachProcessorFactoryTests extends ESTestCase {
processorTypes.put("_first", Map.of()); processorTypes.put("_first", Map.of());
processorTypes.put("_second", Map.of()); processorTypes.put("_second", Map.of());
config.put("processor", processorTypes); config.put("processor", processorTypes);
Exception exception = expectThrows(ElasticsearchParseException.class, () -> forEachFactory.create(registry, null, null, config)); Exception exception = expectThrows(
ElasticsearchParseException.class,
() -> forEachFactory.create(registry, null, null, config, null)
);
assertThat(exception.getMessage(), equalTo("[processor] Must specify exactly one processor type")); assertThat(exception.getMessage(), equalTo("[processor] Must specify exactly one processor type"));
} }
@ -86,7 +89,7 @@ public class ForEachProcessorFactoryTests extends ESTestCase {
config.put("processor", Map.of("_name", Collections.emptyMap())); config.put("processor", Map.of("_name", Collections.emptyMap()));
Exception expectedException = expectThrows( Exception expectedException = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> forEachFactory.create(Map.of(), null, null, config) () -> forEachFactory.create(Map.of(), null, null, config, null)
); );
assertThat(expectedException.getMessage(), equalTo("No processor type exists with name [_name]")); assertThat(expectedException.getMessage(), equalTo("No processor type exists with name [_name]"));
} }
@ -94,11 +97,11 @@ public class ForEachProcessorFactoryTests extends ESTestCase {
public void testCreateWithMissingField() throws Exception { public void testCreateWithMissingField() throws Exception {
Processor processor = new TestProcessor(ingestDocument -> {}); Processor processor = new TestProcessor(ingestDocument -> {});
Map<String, Processor.Factory> registry = new HashMap<>(); Map<String, Processor.Factory> registry = new HashMap<>();
registry.put("_name", (r, t, description, c) -> processor); registry.put("_name", (r, t, description, c, projectId) -> processor);
ForEachProcessor.Factory forEachFactory = new ForEachProcessor.Factory(scriptService); ForEachProcessor.Factory forEachFactory = new ForEachProcessor.Factory(scriptService);
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("processor", List.of(Map.of("_name", Map.of()))); config.put("processor", List.of(Map.of("_name", Map.of())));
Exception exception = expectThrows(Exception.class, () -> forEachFactory.create(registry, null, null, config)); Exception exception = expectThrows(Exception.class, () -> forEachFactory.create(registry, null, null, config, null));
assertThat(exception.getMessage(), equalTo("[field] required property is missing")); assertThat(exception.getMessage(), equalTo("[field] required property is missing"));
} }
@ -106,7 +109,7 @@ public class ForEachProcessorFactoryTests extends ESTestCase {
ForEachProcessor.Factory forEachFactory = new ForEachProcessor.Factory(scriptService); ForEachProcessor.Factory forEachFactory = new ForEachProcessor.Factory(scriptService);
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
Exception exception = expectThrows(Exception.class, () -> forEachFactory.create(Map.of(), null, null, config)); Exception exception = expectThrows(Exception.class, () -> forEachFactory.create(Map.of(), null, null, config, null));
assertThat(exception.getMessage(), equalTo("[processor] required property is missing")); assertThat(exception.getMessage(), equalTo("[processor] required property is missing"));
} }

View file

@ -30,7 +30,7 @@ public class GrokProcessorFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
config.put("patterns", List.of("(?<foo>\\w+)")); config.put("patterns", List.of("(?<foo>\\w+)"));
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
GrokProcessor processor = factory.create(null, processorTag, null, config); GrokProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getMatchField(), equalTo("_field")); assertThat(processor.getMatchField(), equalTo("_field"));
assertThat(processor.getGrok(), notNullValue()); assertThat(processor.getGrok(), notNullValue());
@ -45,7 +45,7 @@ public class GrokProcessorFactoryTests extends ESTestCase {
config.put("patterns", List.of("(?<foo>\\w+)")); config.put("patterns", List.of("(?<foo>\\w+)"));
config.put("ignore_missing", true); config.put("ignore_missing", true);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
GrokProcessor processor = factory.create(null, processorTag, null, config); GrokProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getMatchField(), equalTo("_field")); assertThat(processor.getMatchField(), equalTo("_field"));
assertThat(processor.getGrok(), notNullValue()); assertThat(processor.getGrok(), notNullValue());
@ -56,7 +56,10 @@ public class GrokProcessorFactoryTests extends ESTestCase {
GrokProcessor.Factory factory = new GrokProcessor.Factory(MatcherWatchdog.noop()); GrokProcessor.Factory factory = new GrokProcessor.Factory(MatcherWatchdog.noop());
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("patterns", List.of("(?<foo>\\w+)")); config.put("patterns", List.of("(?<foo>\\w+)"));
ElasticsearchParseException e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config)); ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class,
() -> factory.create(null, null, null, config, null)
);
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));
} }
@ -64,7 +67,10 @@ public class GrokProcessorFactoryTests extends ESTestCase {
GrokProcessor.Factory factory = new GrokProcessor.Factory(MatcherWatchdog.noop()); GrokProcessor.Factory factory = new GrokProcessor.Factory(MatcherWatchdog.noop());
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "foo"); config.put("field", "foo");
ElasticsearchParseException e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config)); ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class,
() -> factory.create(null, null, null, config, null)
);
assertThat(e.getMessage(), equalTo("[patterns] required property is missing")); assertThat(e.getMessage(), equalTo("[patterns] required property is missing"));
} }
@ -73,7 +79,10 @@ public class GrokProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "foo"); config.put("field", "foo");
config.put("patterns", List.of()); config.put("patterns", List.of());
ElasticsearchParseException e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config)); ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class,
() -> factory.create(null, null, null, config, null)
);
assertThat(e.getMessage(), equalTo("[patterns] List of patterns must not be empty")); assertThat(e.getMessage(), equalTo("[patterns] List of patterns must not be empty"));
} }
@ -84,7 +93,7 @@ public class GrokProcessorFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
config.put("patterns", List.of("%{MY_PATTERN:name}!")); config.put("patterns", List.of("%{MY_PATTERN:name}!"));
config.put("pattern_definitions", Map.of("MY_PATTERN", "foo")); config.put("pattern_definitions", Map.of("MY_PATTERN", "foo"));
GrokProcessor processor = factory.create(null, null, null, config); GrokProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getMatchField(), equalTo("_field")); assertThat(processor.getMatchField(), equalTo("_field"));
assertThat(processor.getGrok(), notNullValue()); assertThat(processor.getGrok(), notNullValue());
assertThat(processor.getGrok().match("foo!"), equalTo(true)); assertThat(processor.getGrok().match("foo!"), equalTo(true));
@ -95,7 +104,10 @@ public class GrokProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
config.put("patterns", List.of("[")); config.put("patterns", List.of("["));
ElasticsearchParseException e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config)); ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class,
() -> factory.create(null, null, null, config, null)
);
assertThat(e.getMessage(), equalTo("[patterns] Invalid regex pattern found in: [[]. premature end of char-class")); assertThat(e.getMessage(), equalTo("[patterns] Invalid regex pattern found in: [[]. premature end of char-class"));
} }
@ -105,7 +117,10 @@ public class GrokProcessorFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
config.put("patterns", List.of("%{MY_PATTERN:name}!")); config.put("patterns", List.of("%{MY_PATTERN:name}!"));
config.put("pattern_definitions", Map.of("MY_PATTERN", "[")); config.put("pattern_definitions", Map.of("MY_PATTERN", "["));
ElasticsearchParseException e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config)); ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class,
() -> factory.create(null, null, null, config, null)
);
assertThat( assertThat(
e.getMessage(), e.getMessage(),
equalTo("[patterns] Invalid regex pattern found in: [%{MY_PATTERN:name}!]. premature end of char-class") equalTo("[patterns] Invalid regex pattern found in: [%{MY_PATTERN:name}!]. premature end of char-class")
@ -119,7 +134,10 @@ public class GrokProcessorFactoryTests extends ESTestCase {
config.put("patterns", List.of("(?<foo>\\w+)")); config.put("patterns", List.of("(?<foo>\\w+)"));
String invalidEcsMode = randomAlphaOfLength(3); String invalidEcsMode = randomAlphaOfLength(3);
config.put("ecs_compatibility", invalidEcsMode); config.put("ecs_compatibility", invalidEcsMode);
ElasticsearchParseException e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config)); ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class,
() -> factory.create(null, null, null, config, null)
);
assertThat(e.getMessage(), equalTo("[ecs_compatibility] unsupported mode '" + invalidEcsMode + "'")); assertThat(e.getMessage(), equalTo("[ecs_compatibility] unsupported mode '" + invalidEcsMode + "'"));
} }
} }

View file

@ -44,7 +44,7 @@ public class GsubProcessorFactoryTests extends AbstractStringProcessorFactoryTes
config.put("field", "field1"); config.put("field", "field1");
config.put("replacement", "-"); config.put("replacement", "-");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[pattern] required property is missing")); assertThat(e.getMessage(), equalTo("[pattern] required property is missing"));
@ -57,7 +57,7 @@ public class GsubProcessorFactoryTests extends AbstractStringProcessorFactoryTes
config.put("field", "field1"); config.put("field", "field1");
config.put("pattern", "\\."); config.put("pattern", "\\.");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[replacement] required property is missing")); assertThat(e.getMessage(), equalTo("[replacement] required property is missing"));
@ -71,7 +71,7 @@ public class GsubProcessorFactoryTests extends AbstractStringProcessorFactoryTes
config.put("pattern", "["); config.put("pattern", "[");
config.put("replacement", "-"); config.put("replacement", "-");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), containsString("[pattern] Invalid regex pattern. Unclosed character class")); assertThat(e.getMessage(), containsString("[pattern] Invalid regex pattern. Unclosed character class"));

View file

@ -25,7 +25,7 @@ public class JoinProcessorFactoryTests extends ESTestCase {
config.put("field", "field1"); config.put("field", "field1");
config.put("separator", "-"); config.put("separator", "-");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
JoinProcessor joinProcessor = factory.create(null, processorTag, null, config); JoinProcessor joinProcessor = factory.create(null, processorTag, null, config, null);
assertThat(joinProcessor.getTag(), equalTo(processorTag)); assertThat(joinProcessor.getTag(), equalTo(processorTag));
assertThat(joinProcessor.getField(), equalTo("field1")); assertThat(joinProcessor.getField(), equalTo("field1"));
assertThat(joinProcessor.getSeparator(), equalTo("-")); assertThat(joinProcessor.getSeparator(), equalTo("-"));
@ -37,7 +37,7 @@ public class JoinProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("separator", "-"); config.put("separator", "-");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));
@ -49,7 +49,7 @@ public class JoinProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "field1"); config.put("field", "field1");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[separator] required property is missing")); assertThat(e.getMessage(), equalTo("[separator] required property is missing"));
@ -63,7 +63,7 @@ public class JoinProcessorFactoryTests extends ESTestCase {
config.put("separator", "-"); config.put("separator", "-");
config.put("target_field", "target"); config.put("target_field", "target");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
JoinProcessor joinProcessor = factory.create(null, processorTag, null, config); JoinProcessor joinProcessor = factory.create(null, processorTag, null, config, null);
assertThat(joinProcessor.getTag(), equalTo(processorTag)); assertThat(joinProcessor.getTag(), equalTo(processorTag));
assertThat(joinProcessor.getField(), equalTo("field1")); assertThat(joinProcessor.getField(), equalTo("field1"));
assertThat(joinProcessor.getSeparator(), equalTo("-")); assertThat(joinProcessor.getSeparator(), equalTo("-"));

View file

@ -31,7 +31,7 @@ public class JsonProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", randomField); config.put("field", randomField);
config.put("target_field", randomTargetField); config.put("target_field", randomTargetField);
JsonProcessor jsonProcessor = FACTORY.create(null, processorTag, null, config); JsonProcessor jsonProcessor = FACTORY.create(null, processorTag, null, config, null);
assertThat(jsonProcessor.getTag(), equalTo(processorTag)); assertThat(jsonProcessor.getTag(), equalTo(processorTag));
assertThat(jsonProcessor.getField(), equalTo(randomField)); assertThat(jsonProcessor.getField(), equalTo(randomField));
assertThat(jsonProcessor.getTargetField(), equalTo(randomTargetField)); assertThat(jsonProcessor.getTargetField(), equalTo(randomTargetField));
@ -43,7 +43,7 @@ public class JsonProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", randomField); config.put("field", randomField);
config.put("add_to_root", true); config.put("add_to_root", true);
JsonProcessor jsonProcessor = FACTORY.create(null, processorTag, null, config); JsonProcessor jsonProcessor = FACTORY.create(null, processorTag, null, config, null);
assertThat(jsonProcessor.getTag(), equalTo(processorTag)); assertThat(jsonProcessor.getTag(), equalTo(processorTag));
assertThat(jsonProcessor.getField(), equalTo(randomField)); assertThat(jsonProcessor.getField(), equalTo(randomField));
assertThat(jsonProcessor.getTargetField(), equalTo(randomField)); assertThat(jsonProcessor.getTargetField(), equalTo(randomField));
@ -55,7 +55,7 @@ public class JsonProcessorFactoryTests extends ESTestCase {
String randomField = randomAlphaOfLength(10); String randomField = randomAlphaOfLength(10);
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", randomField); config.put("field", randomField);
JsonProcessor jsonProcessor = FACTORY.create(null, processorTag, null, config); JsonProcessor jsonProcessor = FACTORY.create(null, processorTag, null, config, null);
assertThat(jsonProcessor.getTag(), equalTo(processorTag)); assertThat(jsonProcessor.getTag(), equalTo(processorTag));
assertThat(jsonProcessor.getField(), equalTo(randomField)); assertThat(jsonProcessor.getField(), equalTo(randomField));
assertThat(jsonProcessor.getTargetField(), equalTo(randomField)); assertThat(jsonProcessor.getTargetField(), equalTo(randomField));
@ -66,7 +66,7 @@ public class JsonProcessorFactoryTests extends ESTestCase {
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
ElasticsearchException exception = expectThrows( ElasticsearchException exception = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> FACTORY.create(null, processorTag, null, config) () -> FACTORY.create(null, processorTag, null, config, null)
); );
assertThat(exception.getMessage(), equalTo("[field] required property is missing")); assertThat(exception.getMessage(), equalTo("[field] required property is missing"));
} }
@ -79,7 +79,7 @@ public class JsonProcessorFactoryTests extends ESTestCase {
{ {
Map<String, Object> strictConfig = new HashMap<>(); Map<String, Object> strictConfig = new HashMap<>();
strictConfig.put("field", fieldName); strictConfig.put("field", fieldName);
JsonProcessor strictProcessor = FACTORY.create(null, processorTag, null, strictConfig); JsonProcessor strictProcessor = FACTORY.create(null, processorTag, null, strictConfig, null);
IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> strictProcessor.execute(document)); IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> strictProcessor.execute(document));
assertThat(exception.getMessage(), containsString("is not valid JSON and the strict_json_parsing parameter is true")); assertThat(exception.getMessage(), containsString("is not valid JSON and the strict_json_parsing parameter is true"));
} }
@ -88,7 +88,7 @@ public class JsonProcessorFactoryTests extends ESTestCase {
Map<String, Object> lenientConfig = new HashMap<>(); Map<String, Object> lenientConfig = new HashMap<>();
lenientConfig.put("field", fieldName); lenientConfig.put("field", fieldName);
lenientConfig.put("strict_json_parsing", false); lenientConfig.put("strict_json_parsing", false);
JsonProcessor lenientProcessor = FACTORY.create(null, processorTag, null, lenientConfig); JsonProcessor lenientProcessor = FACTORY.create(null, processorTag, null, lenientConfig, null);
IngestDocument result = lenientProcessor.execute(document); IngestDocument result = lenientProcessor.execute(document);
assertThat(result.getSource().get(fieldName), equalTo(123)); assertThat(result.getSource().get(fieldName), equalTo(123));
} }
@ -103,7 +103,7 @@ public class JsonProcessorFactoryTests extends ESTestCase {
config.put("add_to_root", true); config.put("add_to_root", true);
ElasticsearchException exception = expectThrows( ElasticsearchException exception = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> FACTORY.create(null, randomAlphaOfLength(10), null, config) () -> FACTORY.create(null, randomAlphaOfLength(10), null, config, null)
); );
assertThat(exception.getMessage(), equalTo("[target_field] Cannot set a target field while also setting `add_to_root` to true")); assertThat(exception.getMessage(), equalTo("[target_field] Cannot set a target field while also setting `add_to_root` to true"));
} }
@ -151,6 +151,6 @@ public class JsonProcessorFactoryTests extends ESTestCase {
if (mergeStrategy != null) { if (mergeStrategy != null) {
config.put("add_to_root_conflict_strategy", mergeStrategy); config.put("add_to_root_conflict_strategy", mergeStrategy);
} }
return FACTORY.create(null, randomAlphaOfLength(10), null, config); return FACTORY.create(null, randomAlphaOfLength(10), null, config, null);
} }
} }

View file

@ -40,7 +40,7 @@ public class KeyValueProcessorFactoryTests extends ESTestCase {
config.put("field_split", "&"); config.put("field_split", "&");
config.put("value_split", "="); config.put("value_split", "=");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
KeyValueProcessor processor = factory.create(null, processorTag, null, config); KeyValueProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField().newInstance(Map.of()).execute(), equalTo("field1")); assertThat(processor.getField().newInstance(Map.of()).execute(), equalTo("field1"));
assertThat(processor.getFieldSplit(), equalTo("&")); assertThat(processor.getFieldSplit(), equalTo("&"));
@ -60,7 +60,7 @@ public class KeyValueProcessorFactoryTests extends ESTestCase {
config.put("exclude_keys", List.of()); config.put("exclude_keys", List.of());
config.put("ignore_missing", true); config.put("ignore_missing", true);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
KeyValueProcessor processor = factory.create(null, processorTag, null, config); KeyValueProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField().newInstance(Map.of()).execute(), equalTo("field1")); assertThat(processor.getField().newInstance(Map.of()).execute(), equalTo("field1"));
assertThat(processor.getFieldSplit(), equalTo("&")); assertThat(processor.getFieldSplit(), equalTo("&"));
@ -76,7 +76,7 @@ public class KeyValueProcessorFactoryTests extends ESTestCase {
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
ElasticsearchException exception = expectThrows( ElasticsearchException exception = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> factory.create(null, processorTag, null, config) () -> factory.create(null, processorTag, null, config, null)
); );
assertThat(exception.getMessage(), equalTo("[field] required property is missing")); assertThat(exception.getMessage(), equalTo("[field] required property is missing"));
} }
@ -87,7 +87,7 @@ public class KeyValueProcessorFactoryTests extends ESTestCase {
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
ElasticsearchException exception = expectThrows( ElasticsearchException exception = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> factory.create(null, processorTag, null, config) () -> factory.create(null, processorTag, null, config, null)
); );
assertThat(exception.getMessage(), equalTo("[field_split] required property is missing")); assertThat(exception.getMessage(), equalTo("[field_split] required property is missing"));
} }
@ -99,7 +99,7 @@ public class KeyValueProcessorFactoryTests extends ESTestCase {
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
ElasticsearchException exception = expectThrows( ElasticsearchException exception = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> factory.create(null, processorTag, null, config) () -> factory.create(null, processorTag, null, config, null)
); );
assertThat(exception.getMessage(), equalTo("[value_split] required property is missing")); assertThat(exception.getMessage(), equalTo("[value_split] required property is missing"));
} }

View file

@ -251,6 +251,6 @@ public class KeyValueProcessorTests extends ESTestCase {
if (prefix != null) { if (prefix != null) {
config.put("prefix", prefix); config.put("prefix", prefix);
} }
return FACTORY.create(null, randomAlphaOfLength(10), null, config); return FACTORY.create(null, randomAlphaOfLength(10), null, config, null);
} }
} }

View file

@ -50,7 +50,7 @@ public class NetworkDirectionProcessorFactoryTests extends ESTestCase {
config.put("ignore_missing", ignoreMissing); config.put("ignore_missing", ignoreMissing);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
NetworkDirectionProcessor networkProcessor = factory.create(null, processorTag, null, config); NetworkDirectionProcessor networkProcessor = factory.create(null, processorTag, null, config, null);
assertThat(networkProcessor.getTag(), equalTo(processorTag)); assertThat(networkProcessor.getTag(), equalTo(processorTag));
assertThat(networkProcessor.getSourceIpField(), equalTo(sourceIpField)); assertThat(networkProcessor.getSourceIpField(), equalTo(sourceIpField));
assertThat(networkProcessor.getDestinationIpField(), equalTo(destIpField)); assertThat(networkProcessor.getDestinationIpField(), equalTo(destIpField));
@ -75,7 +75,7 @@ public class NetworkDirectionProcessorFactoryTests extends ESTestCase {
config.put("ignore_missing", ignoreMissing); config.put("ignore_missing", ignoreMissing);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
NetworkDirectionProcessor networkProcessor = factory.create(null, processorTag, null, config); NetworkDirectionProcessor networkProcessor = factory.create(null, processorTag, null, config, null);
assertThat(networkProcessor.getTag(), equalTo(processorTag)); assertThat(networkProcessor.getTag(), equalTo(processorTag));
assertThat(networkProcessor.getSourceIpField(), equalTo(sourceIpField)); assertThat(networkProcessor.getSourceIpField(), equalTo(sourceIpField));
assertThat(networkProcessor.getDestinationIpField(), equalTo(destIpField)); assertThat(networkProcessor.getDestinationIpField(), equalTo(destIpField));
@ -88,7 +88,7 @@ public class NetworkDirectionProcessorFactoryTests extends ESTestCase {
HashMap<String, Object> config = new HashMap<>(); HashMap<String, Object> config = new HashMap<>();
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
try { try {
factory.create(null, processorTag, null, config); factory.create(null, processorTag, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[internal_networks] or [internal_networks_field] must be specified")); assertThat(e.getMessage(), equalTo("[internal_networks] or [internal_networks_field] must be specified"));
@ -102,7 +102,7 @@ public class NetworkDirectionProcessorFactoryTests extends ESTestCase {
internalNetworks.add("10.0.0.0/8"); internalNetworks.add("10.0.0.0/8");
config.put("internal_networks", internalNetworks); config.put("internal_networks", internalNetworks);
NetworkDirectionProcessor networkProcessor = factory.create(null, processorTag, null, config); NetworkDirectionProcessor networkProcessor = factory.create(null, processorTag, null, config, null);
assertThat(networkProcessor.getTag(), equalTo(processorTag)); assertThat(networkProcessor.getTag(), equalTo(processorTag));
assertThat(networkProcessor.getSourceIpField(), equalTo(DEFAULT_SOURCE_IP)); assertThat(networkProcessor.getSourceIpField(), equalTo(DEFAULT_SOURCE_IP));
assertThat(networkProcessor.getDestinationIpField(), equalTo(DEFAULT_DEST_IP)); assertThat(networkProcessor.getDestinationIpField(), equalTo(DEFAULT_DEST_IP));

View file

@ -139,7 +139,8 @@ public class NetworkDirectionProcessorTests extends ESTestCase {
null, null,
processorTag, processorTag,
null, null,
config config,
null
); );
IngestDocument input = TestIngestDocument.withDefaultVersion(source); IngestDocument input = TestIngestDocument.withDefaultVersion(source);
IngestDocument output = processor.execute(input); IngestDocument output = processor.execute(input);
@ -158,7 +159,7 @@ public class NetworkDirectionProcessorTests extends ESTestCase {
config.put("internal_networks", networks); config.put("internal_networks", networks);
ElasticsearchParseException e = expectThrows( ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> new NetworkDirectionProcessor.Factory(TestTemplateService.instance()).create(null, processorTag, null, config) () -> new NetworkDirectionProcessor.Factory(TestTemplateService.instance()).create(null, processorTag, null, config, null)
); );
assertThat( assertThat(
e.getMessage(), e.getMessage(),
@ -184,7 +185,8 @@ public class NetworkDirectionProcessorTests extends ESTestCase {
null, null,
processorTag, processorTag,
null, null,
config config,
null
); );
IngestDocument input = TestIngestDocument.withDefaultVersion(source); IngestDocument input = TestIngestDocument.withDefaultVersion(source);

View file

@ -38,7 +38,7 @@ public class RegisteredDomainProcessorFactoryTests extends ESTestCase {
config.put("ignore_missing", ignoreMissing); config.put("ignore_missing", ignoreMissing);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
RegisteredDomainProcessor publicSuffixProcessor = factory.create(null, processorTag, null, config); RegisteredDomainProcessor publicSuffixProcessor = factory.create(null, processorTag, null, config, null);
assertThat(publicSuffixProcessor.getTag(), equalTo(processorTag)); assertThat(publicSuffixProcessor.getTag(), equalTo(processorTag));
assertThat(publicSuffixProcessor.getTargetField(), equalTo(targetField)); assertThat(publicSuffixProcessor.getTargetField(), equalTo(targetField));
assertThat(publicSuffixProcessor.getIgnoreMissing(), equalTo(ignoreMissing)); assertThat(publicSuffixProcessor.getIgnoreMissing(), equalTo(ignoreMissing));
@ -51,7 +51,7 @@ public class RegisteredDomainProcessorFactoryTests extends ESTestCase {
config.put("field", field); config.put("field", field);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
RegisteredDomainProcessor publicSuffixProcessor = factory.create(null, processorTag, null, config); RegisteredDomainProcessor publicSuffixProcessor = factory.create(null, processorTag, null, config, null);
assertThat(publicSuffixProcessor.getTargetField(), equalTo(RegisteredDomainProcessor.Factory.DEFAULT_TARGET_FIELD)); assertThat(publicSuffixProcessor.getTargetField(), equalTo(RegisteredDomainProcessor.Factory.DEFAULT_TARGET_FIELD));
} }
@ -59,7 +59,7 @@ public class RegisteredDomainProcessorFactoryTests extends ESTestCase {
HashMap<String, Object> config = new HashMap<>(); HashMap<String, Object> config = new HashMap<>();
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
try { try {
factory.create(null, processorTag, null, config); factory.create(null, processorTag, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));

View file

@ -34,7 +34,7 @@ public class RemoveProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "field1"); config.put("field", "field1");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
RemoveProcessor removeProcessor = factory.create(null, processorTag, null, config); RemoveProcessor removeProcessor = factory.create(null, processorTag, null, config, null);
assertThat(removeProcessor.getTag(), equalTo(processorTag)); assertThat(removeProcessor.getTag(), equalTo(processorTag));
assertThat(removeProcessor.getFieldsToRemove().get(0).newInstance(Map.of()).execute(), equalTo("field1")); assertThat(removeProcessor.getFieldsToRemove().get(0).newInstance(Map.of()).execute(), equalTo("field1"));
} }
@ -43,7 +43,7 @@ public class RemoveProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("keep", List.of("field1", "field2")); config.put("keep", List.of("field1", "field2"));
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
RemoveProcessor removeProcessor = factory.create(null, processorTag, null, config); RemoveProcessor removeProcessor = factory.create(null, processorTag, null, config, null);
assertThat(removeProcessor.getTag(), equalTo(processorTag)); assertThat(removeProcessor.getTag(), equalTo(processorTag));
assertThat(removeProcessor.getFieldsToKeep().get(0).newInstance(Map.of()).execute(), equalTo("field1")); assertThat(removeProcessor.getFieldsToKeep().get(0).newInstance(Map.of()).execute(), equalTo("field1"));
assertThat(removeProcessor.getFieldsToKeep().get(1).newInstance(Map.of()).execute(), equalTo("field2")); assertThat(removeProcessor.getFieldsToKeep().get(1).newInstance(Map.of()).execute(), equalTo("field2"));
@ -53,7 +53,7 @@ public class RemoveProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", List.of("field1", "field2")); config.put("field", List.of("field1", "field2"));
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
RemoveProcessor removeProcessor = factory.create(null, processorTag, null, config); RemoveProcessor removeProcessor = factory.create(null, processorTag, null, config, null);
assertThat(removeProcessor.getTag(), equalTo(processorTag)); assertThat(removeProcessor.getTag(), equalTo(processorTag));
assertThat( assertThat(
removeProcessor.getFieldsToRemove().stream().map(template -> template.newInstance(Map.of()).execute()).toList(), removeProcessor.getFieldsToRemove().stream().map(template -> template.newInstance(Map.of()).execute()).toList(),
@ -64,7 +64,7 @@ public class RemoveProcessorFactoryTests extends ESTestCase {
public void testCreateMissingField() throws Exception { public void testCreateMissingField() throws Exception {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[keep] or [field] must be specified")); assertThat(e.getMessage(), equalTo("[keep] or [field] must be specified"));
@ -76,7 +76,7 @@ public class RemoveProcessorFactoryTests extends ESTestCase {
config.put("field", "field1"); config.put("field", "field1");
config.put("keep", "field2"); config.put("keep", "field2");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[keep] and [field] cannot both be used in the same processor")); assertThat(e.getMessage(), equalTo("[keep] and [field] cannot both be used in the same processor"));
@ -90,7 +90,7 @@ public class RemoveProcessorFactoryTests extends ESTestCase {
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
ElasticsearchException exception = expectThrows( ElasticsearchException exception = expectThrows(
ElasticsearchException.class, ElasticsearchException.class,
() -> factory.create(null, processorTag, null, config) () -> factory.create(null, processorTag, null, config, null)
); );
assertThat(exception.getMessage(), equalTo("java.lang.RuntimeException: could not compile script")); assertThat(exception.getMessage(), equalTo("java.lang.RuntimeException: could not compile script"));
assertThat(exception.getMetadata("es.processor_tag").get(0), equalTo(processorTag)); assertThat(exception.getMetadata("es.processor_tag").get(0), equalTo(processorTag));

View file

@ -46,7 +46,7 @@ public class RemoveProcessorTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", fieldName); config.put("field", fieldName);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
Processor processor = new RemoveProcessor.Factory(TestTemplateService.instance()).create(null, processorTag, null, config); Processor processor = new RemoveProcessor.Factory(TestTemplateService.instance()).create(null, processorTag, null, config, null);
try { try {
processor.execute(ingestDocument); processor.execute(ingestDocument);
fail("remove field should have failed"); fail("remove field should have failed");
@ -62,7 +62,7 @@ public class RemoveProcessorTests extends ESTestCase {
config.put("field", fieldName); config.put("field", fieldName);
config.put("ignore_missing", true); config.put("ignore_missing", true);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
Processor processor = new RemoveProcessor.Factory(TestTemplateService.instance()).create(null, processorTag, null, config); Processor processor = new RemoveProcessor.Factory(TestTemplateService.instance()).create(null, processorTag, null, config, null);
processor.execute(ingestDocument); processor.execute(ingestDocument);
} }

View file

@ -33,7 +33,7 @@ public class RenameProcessorFactoryTests extends ESTestCase {
config.put("field", "old_field"); config.put("field", "old_field");
config.put("target_field", "new_field"); config.put("target_field", "new_field");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
RenameProcessor renameProcessor = factory.create(null, processorTag, null, config); RenameProcessor renameProcessor = factory.create(null, processorTag, null, config, null);
assertThat(renameProcessor.getTag(), equalTo(processorTag)); assertThat(renameProcessor.getTag(), equalTo(processorTag));
assertThat(renameProcessor.getField().newInstance(Map.of()).execute(), equalTo("old_field")); assertThat(renameProcessor.getField().newInstance(Map.of()).execute(), equalTo("old_field"));
assertThat(renameProcessor.getTargetField().newInstance(Map.of()).execute(), equalTo("new_field")); assertThat(renameProcessor.getTargetField().newInstance(Map.of()).execute(), equalTo("new_field"));
@ -47,7 +47,7 @@ public class RenameProcessorFactoryTests extends ESTestCase {
config.put("target_field", "new_field"); config.put("target_field", "new_field");
config.put("ignore_missing", true); config.put("ignore_missing", true);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
RenameProcessor renameProcessor = factory.create(null, processorTag, null, config); RenameProcessor renameProcessor = factory.create(null, processorTag, null, config, null);
assertThat(renameProcessor.getTag(), equalTo(processorTag)); assertThat(renameProcessor.getTag(), equalTo(processorTag));
assertThat(renameProcessor.getField().newInstance(Map.of()).execute(), equalTo("old_field")); assertThat(renameProcessor.getField().newInstance(Map.of()).execute(), equalTo("old_field"));
assertThat(renameProcessor.getTargetField().newInstance(Map.of()).execute(), equalTo("new_field")); assertThat(renameProcessor.getTargetField().newInstance(Map.of()).execute(), equalTo("new_field"));
@ -60,7 +60,7 @@ public class RenameProcessorFactoryTests extends ESTestCase {
config.put("target_field", "new_field"); config.put("target_field", "new_field");
config.put("override", true); config.put("override", true);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
RenameProcessor renameProcessor = factory.create(null, processorTag, null, config); RenameProcessor renameProcessor = factory.create(null, processorTag, null, config, null);
assertThat(renameProcessor.getTag(), equalTo(processorTag)); assertThat(renameProcessor.getTag(), equalTo(processorTag));
assertThat(renameProcessor.getField().newInstance(Map.of()).execute(), equalTo("old_field")); assertThat(renameProcessor.getField().newInstance(Map.of()).execute(), equalTo("old_field"));
assertThat(renameProcessor.getTargetField().newInstance(Map.of()).execute(), equalTo("new_field")); assertThat(renameProcessor.getTargetField().newInstance(Map.of()).execute(), equalTo("new_field"));
@ -71,7 +71,7 @@ public class RenameProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("target_field", "new_field"); config.put("target_field", "new_field");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));
@ -82,7 +82,7 @@ public class RenameProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "old_field"); config.put("field", "old_field");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[target_field] required property is missing")); assertThat(e.getMessage(), equalTo("[target_field] required property is missing"));

View file

@ -74,6 +74,6 @@ public class RerouteProcessorFactoryTests extends ESTestCase {
} }
private static RerouteProcessor create(Map<String, Object> config) throws Exception { private static RerouteProcessor create(Map<String, Object> config) throws Exception {
return new RerouteProcessor.Factory().create(null, null, null, new HashMap<>(config)); return new RerouteProcessor.Factory().create(null, null, null, new HashMap<>(config), null);
} }
} }

View file

@ -53,7 +53,7 @@ public class ScriptProcessorFactoryTests extends ESTestCase {
Map<String, Object> configMap = new HashMap<>(); Map<String, Object> configMap = new HashMap<>();
String randomType = randomFrom("id", "source"); String randomType = randomFrom("id", "source");
configMap.put(randomType, "foo"); configMap.put(randomType, "foo");
ScriptProcessor processor = factory.create(null, randomAlphaOfLength(10), null, configMap); ScriptProcessor processor = factory.create(null, randomAlphaOfLength(10), null, configMap, null);
assertThat(processor.getScript().getLang(), equalTo(randomType.equals("id") ? null : Script.DEFAULT_SCRIPT_LANG)); assertThat(processor.getScript().getLang(), equalTo(randomType.equals("id") ? null : Script.DEFAULT_SCRIPT_LANG));
assertThat(processor.getScript().getType().toString(), equalTo(INGEST_SCRIPT_PARAM_TO_TYPE.get(randomType))); assertThat(processor.getScript().getType().toString(), equalTo(INGEST_SCRIPT_PARAM_TO_TYPE.get(randomType)));
assertThat(processor.getScript().getParams(), equalTo(Map.of())); assertThat(processor.getScript().getParams(), equalTo(Map.of()));
@ -69,7 +69,7 @@ public class ScriptProcessorFactoryTests extends ESTestCase {
Map<String, Object> randomParams = Map.of(randomAlphaOfLength(10), randomAlphaOfLength(10)); Map<String, Object> randomParams = Map.of(randomAlphaOfLength(10), randomAlphaOfLength(10));
configMap.put(randomType, "foo"); configMap.put(randomType, "foo");
configMap.put("params", randomParams); configMap.put("params", randomParams);
ScriptProcessor processor = factory.create(null, randomAlphaOfLength(10), null, configMap); ScriptProcessor processor = factory.create(null, randomAlphaOfLength(10), null, configMap, null);
assertThat(processor.getScript().getLang(), equalTo(randomType.equals("id") ? null : Script.DEFAULT_SCRIPT_LANG)); assertThat(processor.getScript().getLang(), equalTo(randomType.equals("id") ? null : Script.DEFAULT_SCRIPT_LANG));
assertThat(processor.getScript().getType().toString(), equalTo(INGEST_SCRIPT_PARAM_TO_TYPE.get(randomType))); assertThat(processor.getScript().getType().toString(), equalTo(INGEST_SCRIPT_PARAM_TO_TYPE.get(randomType)));
assertThat(processor.getScript().getParams(), equalTo(randomParams)); assertThat(processor.getScript().getParams(), equalTo(randomParams));
@ -83,7 +83,7 @@ public class ScriptProcessorFactoryTests extends ESTestCase {
XContentParseException exception = expectThrows( XContentParseException exception = expectThrows(
XContentParseException.class, XContentParseException.class,
() -> factory.create(null, randomAlphaOfLength(10), null, configMap) () -> factory.create(null, randomAlphaOfLength(10), null, configMap, null)
); );
assertThat(exception.getMessage(), containsString("[script] failed to parse field [source]")); assertThat(exception.getMessage(), containsString("[script] failed to parse field [source]"));
} }
@ -94,7 +94,7 @@ public class ScriptProcessorFactoryTests extends ESTestCase {
IllegalArgumentException exception = expectThrows( IllegalArgumentException exception = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> factory.create(null, randomAlphaOfLength(10), null, configMap) () -> factory.create(null, randomAlphaOfLength(10), null, configMap, null)
); );
assertThat(exception.getMessage(), is("must specify either [source] for an inline script or [id] for a stored script")); assertThat(exception.getMessage(), is("must specify either [source] for an inline script or [id] for a stored script"));
@ -108,7 +108,7 @@ public class ScriptProcessorFactoryTests extends ESTestCase {
Map<String, Object> configMap = new HashMap<>(); Map<String, Object> configMap = new HashMap<>();
configMap.put("inline", "code"); configMap.put("inline", "code");
factory.create(null, randomAlphaOfLength(10), null, configMap); factory.create(null, randomAlphaOfLength(10), null, configMap, null);
assertWarnings("Deprecated field [inline] used, expected [source] instead"); assertWarnings("Deprecated field [inline] used, expected [source] instead");
} }
@ -130,7 +130,7 @@ public class ScriptProcessorFactoryTests extends ESTestCase {
ElasticsearchException exception = expectThrows( ElasticsearchException exception = expectThrows(
ElasticsearchException.class, ElasticsearchException.class,
() -> factory.create(null, randomAlphaOfLength(10), null, configMap) () -> factory.create(null, randomAlphaOfLength(10), null, configMap, null)
); );
assertThat(exception.getMessage(), is("compile-time exception")); assertThat(exception.getMessage(), is("compile-time exception"));
@ -151,7 +151,7 @@ public class ScriptProcessorFactoryTests extends ESTestCase {
Map<String, Object> configMap = new HashMap<>(); Map<String, Object> configMap = new HashMap<>();
configMap.put("source", scriptName); configMap.put("source", scriptName);
ScriptProcessor processor = factory.create(null, null, randomAlphaOfLength(10), configMap); ScriptProcessor processor = factory.create(null, null, randomAlphaOfLength(10), configMap, null);
assertThat(processor.getScript().getLang(), equalTo(Script.DEFAULT_SCRIPT_LANG)); assertThat(processor.getScript().getLang(), equalTo(Script.DEFAULT_SCRIPT_LANG));
assertThat(processor.getScript().getType(), equalTo(ScriptType.INLINE)); assertThat(processor.getScript().getType(), equalTo(ScriptType.INLINE));
assertThat(processor.getScript().getParams(), equalTo(Map.of())); assertThat(processor.getScript().getParams(), equalTo(Map.of()));
@ -167,7 +167,7 @@ public class ScriptProcessorFactoryTests extends ESTestCase {
factory = new ScriptProcessor.Factory(mockedScriptService); factory = new ScriptProcessor.Factory(mockedScriptService);
Map<String, Object> configMap = new HashMap<>(); Map<String, Object> configMap = new HashMap<>();
configMap.put("id", "script_name"); configMap.put("id", "script_name");
ScriptProcessor processor = factory.create(null, null, randomAlphaOfLength(10), configMap); ScriptProcessor processor = factory.create(null, null, randomAlphaOfLength(10), configMap, null);
assertNull(processor.getScript().getLang()); assertNull(processor.getScript().getLang());
assertThat(processor.getScript().getType(), equalTo(ScriptType.STORED)); assertThat(processor.getScript().getType(), equalTo(ScriptType.STORED));
assertThat(processor.getScript().getParams(), equalTo(Map.of())); assertThat(processor.getScript().getParams(), equalTo(Map.of()));

View file

@ -37,7 +37,7 @@ public class SetProcessorFactoryTests extends ESTestCase {
config.put("field", "field1"); config.put("field", "field1");
config.put("value", "value1"); config.put("value", "value1");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
SetProcessor setProcessor = factory.create(null, processorTag, null, config); SetProcessor setProcessor = factory.create(null, processorTag, null, config, null);
assertThat(setProcessor.getTag(), equalTo(processorTag)); assertThat(setProcessor.getTag(), equalTo(processorTag));
assertThat(setProcessor.getField().newInstance(Map.of()).execute(), equalTo("field1")); assertThat(setProcessor.getField().newInstance(Map.of()).execute(), equalTo("field1"));
assertThat(setProcessor.getValue().copyAndResolve(Map.of()), equalTo("value1")); assertThat(setProcessor.getValue().copyAndResolve(Map.of()), equalTo("value1"));
@ -52,7 +52,7 @@ public class SetProcessorFactoryTests extends ESTestCase {
config.put("value", "value1"); config.put("value", "value1");
config.put("override", overrideEnabled); config.put("override", overrideEnabled);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
SetProcessor setProcessor = factory.create(null, processorTag, null, config); SetProcessor setProcessor = factory.create(null, processorTag, null, config, null);
assertThat(setProcessor.getTag(), equalTo(processorTag)); assertThat(setProcessor.getTag(), equalTo(processorTag));
assertThat(setProcessor.getField().newInstance(Map.of()).execute(), equalTo("field1")); assertThat(setProcessor.getField().newInstance(Map.of()).execute(), equalTo("field1"));
assertThat(setProcessor.getValue().copyAndResolve(Map.of()), equalTo("value1")); assertThat(setProcessor.getValue().copyAndResolve(Map.of()), equalTo("value1"));
@ -66,7 +66,7 @@ public class SetProcessorFactoryTests extends ESTestCase {
config.put("value", "value1"); config.put("value", "value1");
config.put("ignore_empty_value", ignoreEmptyValueEnabled); config.put("ignore_empty_value", ignoreEmptyValueEnabled);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
SetProcessor setProcessor = factory.create(null, processorTag, null, config); SetProcessor setProcessor = factory.create(null, processorTag, null, config, null);
assertThat(setProcessor.getTag(), equalTo(processorTag)); assertThat(setProcessor.getTag(), equalTo(processorTag));
assertThat(setProcessor.getField().newInstance(Map.of()).execute(), equalTo("field1")); assertThat(setProcessor.getField().newInstance(Map.of()).execute(), equalTo("field1"));
assertThat(setProcessor.getValue().copyAndResolve(Map.of()), equalTo("value1")); assertThat(setProcessor.getValue().copyAndResolve(Map.of()), equalTo("value1"));
@ -77,7 +77,7 @@ public class SetProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("value", "value1"); config.put("value", "value1");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));
@ -88,7 +88,7 @@ public class SetProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "field1"); config.put("field", "field1");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[value] required property is missing")); assertThat(e.getMessage(), equalTo("[value] required property is missing"));
@ -100,7 +100,7 @@ public class SetProcessorFactoryTests extends ESTestCase {
config.put("field", "field1"); config.put("field", "field1");
config.put("value", null); config.put("value", null);
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[value] required property is missing")); assertThat(e.getMessage(), equalTo("[value] required property is missing"));
@ -115,7 +115,7 @@ public class SetProcessorFactoryTests extends ESTestCase {
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
ElasticsearchException exception = expectThrows( ElasticsearchException exception = expectThrows(
ElasticsearchException.class, ElasticsearchException.class,
() -> factory.create(null, processorTag, null, config) () -> factory.create(null, processorTag, null, config, null)
); );
assertThat(exception.getMessage(), equalTo("java.lang.RuntimeException: could not compile script")); assertThat(exception.getMessage(), equalTo("java.lang.RuntimeException: could not compile script"));
assertThat(exception.getMetadata("es.processor_tag").get(0), equalTo(processorTag)); assertThat(exception.getMetadata("es.processor_tag").get(0), equalTo(processorTag));
@ -126,7 +126,7 @@ public class SetProcessorFactoryTests extends ESTestCase {
config.put("field", "field1"); config.put("field", "field1");
config.put("copy_from", "field2"); config.put("copy_from", "field2");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
SetProcessor setProcessor = factory.create(null, processorTag, null, config); SetProcessor setProcessor = factory.create(null, processorTag, null, config, null);
assertThat(setProcessor.getTag(), equalTo(processorTag)); assertThat(setProcessor.getTag(), equalTo(processorTag));
assertThat(setProcessor.getField().newInstance(Map.of()).execute(), equalTo("field1")); assertThat(setProcessor.getField().newInstance(Map.of()).execute(), equalTo("field1"));
assertThat(setProcessor.getCopyFrom(), equalTo("field2")); assertThat(setProcessor.getCopyFrom(), equalTo("field2"));
@ -140,7 +140,7 @@ public class SetProcessorFactoryTests extends ESTestCase {
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
ElasticsearchException exception = expectThrows( ElasticsearchException exception = expectThrows(
ElasticsearchException.class, ElasticsearchException.class,
() -> factory.create(null, processorTag, null, config) () -> factory.create(null, processorTag, null, config, null)
); );
assertThat(exception.getMessage(), equalTo("[copy_from] cannot set both `copy_from` and `value` in the same processor")); assertThat(exception.getMessage(), equalTo("[copy_from] cannot set both `copy_from` and `value` in the same processor"));
} }
@ -153,7 +153,7 @@ public class SetProcessorFactoryTests extends ESTestCase {
config.put("value", "value1"); config.put("value", "value1");
config.put("media_type", expectedMediaType); config.put("media_type", expectedMediaType);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
SetProcessor setProcessor = factory.create(null, processorTag, null, config); SetProcessor setProcessor = factory.create(null, processorTag, null, config, null);
assertThat(setProcessor.getTag(), equalTo(processorTag)); assertThat(setProcessor.getTag(), equalTo(processorTag));
// invalid media type // invalid media type
@ -165,7 +165,10 @@ public class SetProcessorFactoryTests extends ESTestCase {
config2.put("field", "field1"); config2.put("field", "field1");
config2.put("value", "value1"); config2.put("value", "value1");
config2.put("media_type", expectedMediaType); config2.put("media_type", expectedMediaType);
ElasticsearchException e = expectThrows(ElasticsearchException.class, () -> factory.create(null, processorTag, null, config2)); ElasticsearchException e = expectThrows(
ElasticsearchException.class,
() -> factory.create(null, processorTag, null, config2, null)
);
assertThat(e.getMessage(), containsString("property does not contain a supported media type [" + expectedMediaType + "]")); assertThat(e.getMessage(), containsString("property does not contain a supported media type [" + expectedMediaType + "]"));
} }
@ -176,7 +179,7 @@ public class SetProcessorFactoryTests extends ESTestCase {
config.put("field", ""); config.put("field", "");
config.put("value", "value1"); config.put("value", "value1");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
SetProcessor setProcessor = factory.create(null, processorTag, null, config); SetProcessor setProcessor = factory.create(null, processorTag, null, config, null);
assertThat(setProcessor.getTag(), equalTo(processorTag)); assertThat(setProcessor.getTag(), equalTo(processorTag));
assertThat(setProcessor.getField().newInstance(Map.of()).execute(), equalTo("")); assertThat(setProcessor.getField().newInstance(Map.of()).execute(), equalTo(""));
assertThat(setProcessor.getValue().copyAndResolve(Map.of()), equalTo("value1")); assertThat(setProcessor.getValue().copyAndResolve(Map.of()), equalTo("value1"));

View file

@ -28,7 +28,7 @@ public class SortProcessorFactoryTests extends ESTestCase {
config.put("field", fieldName); config.put("field", fieldName);
SortProcessor.Factory factory = new SortProcessor.Factory(); SortProcessor.Factory factory = new SortProcessor.Factory();
SortProcessor processor = factory.create(null, processorTag, null, config); SortProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo(fieldName)); assertThat(processor.getField(), equalTo(fieldName));
assertThat(processor.getOrder(), equalTo(SortProcessor.SortOrder.ASCENDING)); assertThat(processor.getOrder(), equalTo(SortProcessor.SortOrder.ASCENDING));
@ -44,7 +44,7 @@ public class SortProcessorFactoryTests extends ESTestCase {
config.put("order", "desc"); config.put("order", "desc");
SortProcessor.Factory factory = new SortProcessor.Factory(); SortProcessor.Factory factory = new SortProcessor.Factory();
SortProcessor processor = factory.create(null, processorTag, null, config); SortProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo(fieldName)); assertThat(processor.getField(), equalTo(fieldName));
assertThat(processor.getOrder(), equalTo(SortProcessor.SortOrder.DESCENDING)); assertThat(processor.getOrder(), equalTo(SortProcessor.SortOrder.DESCENDING));
@ -61,7 +61,7 @@ public class SortProcessorFactoryTests extends ESTestCase {
config.put("target_field", targetFieldName); config.put("target_field", targetFieldName);
SortProcessor.Factory factory = new SortProcessor.Factory(); SortProcessor.Factory factory = new SortProcessor.Factory();
SortProcessor processor = factory.create(null, processorTag, null, config); SortProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo(fieldName)); assertThat(processor.getField(), equalTo(fieldName));
assertThat(processor.getOrder(), equalTo(SortProcessor.SortOrder.ASCENDING)); assertThat(processor.getOrder(), equalTo(SortProcessor.SortOrder.ASCENDING));
@ -78,7 +78,7 @@ public class SortProcessorFactoryTests extends ESTestCase {
SortProcessor.Factory factory = new SortProcessor.Factory(); SortProcessor.Factory factory = new SortProcessor.Factory();
try { try {
factory.create(null, processorTag, null, config); factory.create(null, processorTag, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[order] Sort direction [invalid] not recognized. Valid values are: [asc, desc]")); assertThat(e.getMessage(), equalTo("[order] Sort direction [invalid] not recognized. Valid values are: [asc, desc]"));
@ -89,7 +89,7 @@ public class SortProcessorFactoryTests extends ESTestCase {
SortProcessor.Factory factory = new SortProcessor.Factory(); SortProcessor.Factory factory = new SortProcessor.Factory();
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));

View file

@ -25,7 +25,7 @@ public class SplitProcessorFactoryTests extends ESTestCase {
config.put("field", "field1"); config.put("field", "field1");
config.put("separator", "\\."); config.put("separator", "\\.");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
SplitProcessor splitProcessor = factory.create(null, processorTag, null, config); SplitProcessor splitProcessor = factory.create(null, processorTag, null, config, null);
assertThat(splitProcessor.getTag(), equalTo(processorTag)); assertThat(splitProcessor.getTag(), equalTo(processorTag));
assertThat(splitProcessor.getField(), equalTo("field1")); assertThat(splitProcessor.getField(), equalTo("field1"));
assertThat(splitProcessor.getSeparator(), equalTo("\\.")); assertThat(splitProcessor.getSeparator(), equalTo("\\."));
@ -38,7 +38,7 @@ public class SplitProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("separator", "\\."); config.put("separator", "\\.");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));
@ -50,7 +50,7 @@ public class SplitProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "field1"); config.put("field", "field1");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[separator] required property is missing")); assertThat(e.getMessage(), equalTo("[separator] required property is missing"));
@ -64,7 +64,7 @@ public class SplitProcessorFactoryTests extends ESTestCase {
config.put("separator", "\\."); config.put("separator", "\\.");
config.put("target_field", "target"); config.put("target_field", "target");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
SplitProcessor splitProcessor = factory.create(null, processorTag, null, config); SplitProcessor splitProcessor = factory.create(null, processorTag, null, config, null);
assertThat(splitProcessor.getTag(), equalTo(processorTag)); assertThat(splitProcessor.getTag(), equalTo(processorTag));
assertThat(splitProcessor.getField(), equalTo("field1")); assertThat(splitProcessor.getField(), equalTo("field1"));
assertThat(splitProcessor.getSeparator(), equalTo("\\.")); assertThat(splitProcessor.getSeparator(), equalTo("\\."));
@ -81,7 +81,7 @@ public class SplitProcessorFactoryTests extends ESTestCase {
config.put("target_field", "target"); config.put("target_field", "target");
config.put("preserve_trailing", true); config.put("preserve_trailing", true);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
SplitProcessor splitProcessor = factory.create(null, processorTag, null, config); SplitProcessor splitProcessor = factory.create(null, processorTag, null, config, null);
assertThat(splitProcessor.getTag(), equalTo(processorTag)); assertThat(splitProcessor.getTag(), equalTo(processorTag));
assertThat(splitProcessor.getField(), equalTo("field1")); assertThat(splitProcessor.getField(), equalTo("field1"));
assertThat(splitProcessor.getSeparator(), equalTo("\\.")); assertThat(splitProcessor.getSeparator(), equalTo("\\."));

View file

@ -97,7 +97,7 @@ public class SplitProcessorTests extends ESTestCase {
Map<String, Object> splitConfig = new HashMap<>(); Map<String, Object> splitConfig = new HashMap<>();
splitConfig.put("field", "flags"); splitConfig.put("field", "flags");
splitConfig.put("separator", "\\|"); splitConfig.put("separator", "\\|");
Processor splitProcessor = (new SplitProcessor.Factory()).create(null, null, null, splitConfig); Processor splitProcessor = (new SplitProcessor.Factory()).create(null, null, null, splitConfig, null);
Map<String, Object> source = new HashMap<>(); Map<String, Object> source = new HashMap<>();
source.put("flags", "new|hot|super|fun|interesting"); source.put("flags", "new|hot|super|fun|interesting");
IngestDocument ingestDocument = TestIngestDocument.withDefaultVersion(source); IngestDocument ingestDocument = TestIngestDocument.withDefaultVersion(source);

View file

@ -45,7 +45,7 @@ public class UriPartsProcessorFactoryTests extends ESTestCase {
config.put("ignore_missing", ignoreMissing); config.put("ignore_missing", ignoreMissing);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
UriPartsProcessor uriPartsProcessor = factory.create(null, processorTag, null, config); UriPartsProcessor uriPartsProcessor = factory.create(null, processorTag, null, config, null);
assertThat(uriPartsProcessor.getTag(), equalTo(processorTag)); assertThat(uriPartsProcessor.getTag(), equalTo(processorTag));
assertThat(uriPartsProcessor.getField(), equalTo(field)); assertThat(uriPartsProcessor.getField(), equalTo(field));
assertThat(uriPartsProcessor.getTargetField(), equalTo(targetField)); assertThat(uriPartsProcessor.getTargetField(), equalTo(targetField));
@ -58,7 +58,7 @@ public class UriPartsProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("value", "value1"); config.put("value", "value1");
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));
@ -69,7 +69,7 @@ public class UriPartsProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", null); config.put("field", null);
try { try {
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
fail("factory create should have failed"); fail("factory create should have failed");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[field] required property is missing")); assertThat(e.getMessage(), equalTo("[field] required property is missing"));

View file

@ -811,7 +811,7 @@ public class GeoIpDownloaderIT extends AbstractGeoIpIT {
@Override @Override
public Map<String, Processor.Factory> getProcessors(Processor.Parameters parameters) { public Map<String, Processor.Factory> getProcessors(Processor.Parameters parameters) {
Map<String, Processor.Factory> procMap = new HashMap<>(); Map<String, Processor.Factory> procMap = new HashMap<>();
procMap.put(NON_GEO_PROCESSOR_TYPE, (factories, tag, description, config) -> { procMap.put(NON_GEO_PROCESSOR_TYPE, (factories, tag, description, config, projectId) -> {
readStringProperty(NON_GEO_PROCESSOR_TYPE, tag, config, "randomField"); readStringProperty(NON_GEO_PROCESSOR_TYPE, tag, config, "randomField");
return new AbstractProcessor(tag, description) { return new AbstractProcessor(tag, description) {
@Override @Override

View file

@ -74,12 +74,19 @@ public class ReloadingDatabasesWhilePerformingGeoLookupsIT extends ESTestCase {
databaseNodeService.updateDatabase("GeoLite2-City-Test.mmdb", "md5", geoIpTmpDir.resolve("GeoLite2-City-Test.mmdb")); databaseNodeService.updateDatabase("GeoLite2-City-Test.mmdb", "md5", geoIpTmpDir.resolve("GeoLite2-City-Test.mmdb"));
lazyLoadReaders(databaseNodeService); lazyLoadReaders(databaseNodeService);
final GeoIpProcessor processor1 = (GeoIpProcessor) factory.create(null, "_tag", null, new HashMap<>(Map.of("field", "_field"))); final GeoIpProcessor processor1 = (GeoIpProcessor) factory.create(
null,
"_tag",
null,
new HashMap<>(Map.of("field", "_field")),
null
);
final GeoIpProcessor processor2 = (GeoIpProcessor) factory.create( final GeoIpProcessor processor2 = (GeoIpProcessor) factory.create(
null, null,
"_tag", "_tag",
null, null,
new HashMap<>(Map.of("field", "_field", "database_file", "GeoLite2-City-Test.mmdb")) new HashMap<>(Map.of("field", "_field", "database_file", "GeoLite2-City-Test.mmdb")),
null
); );
final AtomicBoolean completed = new AtomicBoolean(false); final AtomicBoolean completed = new AtomicBoolean(false);

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.geoip; package org.elasticsearch.ingest.geoip;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.common.CheckedSupplier; import org.elasticsearch.common.CheckedSupplier;
import org.elasticsearch.common.logging.DeprecationCategory; import org.elasticsearch.common.logging.DeprecationCategory;
import org.elasticsearch.common.logging.DeprecationLogger; import org.elasticsearch.common.logging.DeprecationLogger;
@ -227,7 +228,8 @@ public final class GeoIpProcessor extends AbstractProcessor {
final Map<String, Processor.Factory> registry, final Map<String, Processor.Factory> registry,
final String processorTag, final String processorTag,
final String description, final String description,
final Map<String, Object> config final Map<String, Object> config,
final ProjectId projectId
) throws IOException { ) throws IOException {
String ipField = readStringProperty(type, processorTag, config, "field"); String ipField = readStringProperty(type, processorTag, config, "field");
String targetField = readStringProperty(type, processorTag, config, "target_field", type); String targetField = readStringProperty(type, processorTag, config, "target_field", type);

View file

@ -95,7 +95,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, processorTag, null, config); GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getTargetField(), equalTo("geoip")); assertThat(processor.getTargetField(), equalTo("geoip"));
@ -112,7 +112,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
config.put("ignore_missing", true); config.put("ignore_missing", true);
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, processorTag, null, config); GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getTargetField(), equalTo("geoip")); assertThat(processor.getTargetField(), equalTo("geoip"));
@ -129,7 +129,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
config.put("database_file", "GeoLite2-Country.mmdb"); config.put("database_file", "GeoLite2-Country.mmdb");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, processorTag, null, config); GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
@ -147,7 +147,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
config.put("database_file", "GeoLite2-ASN.mmdb"); config.put("database_file", "GeoLite2-ASN.mmdb");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, processorTag, null, config); GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
@ -162,7 +162,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
config.put("target_field", "_field"); config.put("target_field", "_field");
GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, null, null, config); GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, null, null, config, null);
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getTargetField(), equalTo("_field")); assertThat(processor.getTargetField(), equalTo("_field"));
assertFalse(processor.isIgnoreMissing()); assertFalse(processor.isIgnoreMissing());
@ -173,7 +173,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
config.put("database_file", "GeoLite2-Country.mmdb"); config.put("database_file", "GeoLite2-Country.mmdb");
GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, null, null, config); GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, null, null, config, null);
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getTargetField(), equalTo("geoip")); assertThat(processor.getTargetField(), equalTo("geoip"));
assertThat(processor.getDatabaseType(), equalTo("GeoLite2-Country")); assertThat(processor.getDatabaseType(), equalTo("GeoLite2-Country"));
@ -190,7 +190,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
asnOnlyProperties.remove(Property.IP); asnOnlyProperties.remove(Property.IP);
String asnProperty = RandomPicks.randomFrom(Randomness.get(), asnOnlyProperties).toString(); String asnProperty = RandomPicks.randomFrom(Randomness.get(), asnOnlyProperties).toString();
config.put("properties", List.of(asnProperty)); config.put("properties", List.of(asnProperty));
Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config)); Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config, null));
assertThat( assertThat(
e.getMessage(), e.getMessage(),
equalTo( equalTo(
@ -211,7 +211,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
cityOnlyProperties.remove(Property.IP); cityOnlyProperties.remove(Property.IP);
String cityProperty = RandomPicks.randomFrom(Randomness.get(), cityOnlyProperties).toString(); String cityProperty = RandomPicks.randomFrom(Randomness.get(), cityOnlyProperties).toString();
config.put("properties", List.of(cityProperty)); config.put("properties", List.of(cityProperty));
Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config)); Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config, null));
assertThat( assertThat(
e.getMessage(), e.getMessage(),
equalTo("[properties] illegal property value [" + cityProperty + "]. valid values are [IP, ASN, ORGANIZATION_NAME, NETWORK]") equalTo("[properties] illegal property value [" + cityProperty + "]. valid values are [IP, ASN, ORGANIZATION_NAME, NETWORK]")
@ -226,7 +226,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
config.put("database_file", "does-not-exist.mmdb"); config.put("database_file", "does-not-exist.mmdb");
Processor processor = factory.create(null, null, null, config); Processor processor = factory.create(null, null, null, config, null);
assertThat(processor, instanceOf(GeoIpProcessor.DatabaseUnavailableProcessor.class)); assertThat(processor, instanceOf(GeoIpProcessor.DatabaseUnavailableProcessor.class));
} }
@ -237,7 +237,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
config.put("database_file", randomFrom(DEFAULT_DATABASES)); config.put("database_file", randomFrom(DEFAULT_DATABASES));
Processor processor = factory.create(null, null, null, config); Processor processor = factory.create(null, null, null, config, null);
assertThat(processor, instanceOf(GeoIpProcessor.DatabaseUnavailableProcessor.class)); assertThat(processor, instanceOf(GeoIpProcessor.DatabaseUnavailableProcessor.class));
} }
@ -259,7 +259,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
config.put("properties", fieldNames); config.put("properties", fieldNames);
GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, null, null, config); GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, null, null, config, null);
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getProperties(), equalTo(properties)); assertThat(processor.getProperties(), equalTo(properties));
assertFalse(processor.isIgnoreMissing()); assertFalse(processor.isIgnoreMissing());
@ -271,7 +271,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
Map<String, Object> config1 = new HashMap<>(); Map<String, Object> config1 = new HashMap<>();
config1.put("field", "_field"); config1.put("field", "_field");
config1.put("properties", List.of("invalid")); config1.put("properties", List.of("invalid"));
Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config1)); Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config1, null));
assertThat( assertThat(
e.getMessage(), e.getMessage(),
equalTo( equalTo(
@ -285,7 +285,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
Map<String, Object> config2 = new HashMap<>(); Map<String, Object> config2 = new HashMap<>();
config2.put("field", "_field"); config2.put("field", "_field");
config2.put("properties", "invalid"); config2.put("properties", "invalid");
e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config2)); e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config2, null));
assertThat(e.getMessage(), equalTo("[properties] property isn't a list, but of type [java.lang.String]")); assertThat(e.getMessage(), equalTo("[properties] property isn't a list, but of type [java.lang.String]"));
} }
@ -301,7 +301,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
Map<String, Object> config1 = new HashMap<>(); Map<String, Object> config1 = new HashMap<>();
config1.put("field", "_field"); config1.put("field", "_field");
config1.put("properties", List.of("ip")); config1.put("properties", List.of("ip"));
Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config1)); Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config1, null));
assertThat( assertThat(
e.getMessage(), e.getMessage(),
equalTo("[database_file] Unsupported database type [some-unsupported-database] for file [GeoLite2-City.mmdb]") equalTo("[database_file] Unsupported database type [some-unsupported-database] for file [GeoLite2-City.mmdb]")
@ -320,7 +320,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
Map<String, Object> config1 = new HashMap<>(); Map<String, Object> config1 = new HashMap<>();
config1.put("field", "_field"); config1.put("field", "_field");
config1.put("properties", List.of("ip")); config1.put("properties", List.of("ip"));
Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config1)); Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config1, null));
assertThat(e.getMessage(), equalTo("[database_file] Unsupported database type [null] for file [GeoLite2-City.mmdb]")); assertThat(e.getMessage(), equalTo("[database_file] Unsupported database type [null] for file [GeoLite2-City.mmdb]"));
} }
@ -336,7 +336,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
config1.put("database_file", "some-ipinfo-database.mmdb"); config1.put("database_file", "some-ipinfo-database.mmdb");
config1.put("field", "_field"); config1.put("field", "_field");
config1.put("properties", List.of("ip")); config1.put("properties", List.of("ip"));
Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config1)); Exception e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config1, null));
assertThat( assertThat(
e.getMessage(), e.getMessage(),
equalTo( equalTo(
@ -358,7 +358,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
config1.put("database_file", "some-custom-database.mmdb"); config1.put("database_file", "some-custom-database.mmdb");
config1.put("field", "_field"); config1.put("field", "_field");
config1.put("properties", List.of("ip")); config1.put("properties", List.of("ip"));
factory.create(null, null, null, config1); factory.create(null, null, null, config1, null);
assertWarnings(GeoIpProcessor.UNSUPPORTED_DATABASE_DEPRECATION_MESSAGE.replaceAll("\\{}", "some_custom_database.mmdb-City")); assertWarnings(GeoIpProcessor.UNSUPPORTED_DATABASE_DEPRECATION_MESSAGE.replaceAll("\\{}", "some_custom_database.mmdb-City"));
} }
@ -393,7 +393,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
config.put("database_file", "GeoLite2-City.mmdb"); config.put("database_file", "GeoLite2-City.mmdb");
final GeoIpProcessor city = (GeoIpProcessor) factory.create(null, "_tag", null, config); final GeoIpProcessor city = (GeoIpProcessor) factory.create(null, "_tag", null, config, null);
// these are lazy loaded until first use, so we expect null here // these are lazy loaded until first use, so we expect null here
assertNull(databaseNodeService.getDatabaseReaderLazyLoader("GeoLite2-City.mmdb").databaseReader.get()); assertNull(databaseNodeService.getDatabaseReaderLazyLoader("GeoLite2-City.mmdb").databaseReader.get());
@ -404,7 +404,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
config = new HashMap<>(); config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
config.put("database_file", "GeoLite2-Country.mmdb"); config.put("database_file", "GeoLite2-Country.mmdb");
final GeoIpProcessor country = (GeoIpProcessor) factory.create(null, "_tag", null, config); final GeoIpProcessor country = (GeoIpProcessor) factory.create(null, "_tag", null, config, null);
// these are lazy loaded until first use, so we expect null here // these are lazy loaded until first use, so we expect null here
assertNull(databaseNodeService.getDatabaseReaderLazyLoader("GeoLite2-Country.mmdb").databaseReader.get()); assertNull(databaseNodeService.getDatabaseReaderLazyLoader("GeoLite2-Country.mmdb").databaseReader.get());
@ -415,7 +415,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
config = new HashMap<>(); config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
config.put("database_file", "GeoLite2-ASN.mmdb"); config.put("database_file", "GeoLite2-ASN.mmdb");
final GeoIpProcessor asn = (GeoIpProcessor) factory.create(null, "_tag", null, config); final GeoIpProcessor asn = (GeoIpProcessor) factory.create(null, "_tag", null, config, null);
// these are lazy loaded until first use, so we expect null here // these are lazy loaded until first use, so we expect null here
assertNull(databaseNodeService.getDatabaseReaderLazyLoader("GeoLite2-ASN.mmdb").databaseReader.get()); assertNull(databaseNodeService.getDatabaseReaderLazyLoader("GeoLite2-ASN.mmdb").databaseReader.get());
@ -462,7 +462,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "_field"); config.put("field", "_field");
config.put("database_file", "GeoIP2-City.mmdb"); config.put("database_file", "GeoIP2-City.mmdb");
final GeoIpProcessor city = (GeoIpProcessor) factory.create(null, "_tag", null, config); final GeoIpProcessor city = (GeoIpProcessor) factory.create(null, "_tag", null, config, null);
// these are lazy loaded until first use, so we expect null here // these are lazy loaded until first use, so we expect null here
assertNull(databaseNodeService.getDatabaseReaderLazyLoader("GeoIP2-City.mmdb").databaseReader.get()); assertNull(databaseNodeService.getDatabaseReaderLazyLoader("GeoIP2-City.mmdb").databaseReader.get());
@ -478,7 +478,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", randomIdentifier()); config.put("field", randomIdentifier());
config.put("download_database_on_pipeline_creation", randomBoolean()); config.put("download_database_on_pipeline_creation", randomBoolean());
factory.create(null, null, null, config); factory.create(null, null, null, config, null);
// Check all the config params were consumed. // Check all the config params were consumed.
assertThat(config, anEmptyMap()); assertThat(config, anEmptyMap());
} }
@ -498,7 +498,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, processorTag, null, config); GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, processorTag, null, config, null);
processor.execute(RandomDocumentPicks.randomIngestDocument(random(), new HashMap<>(Map.of("_field", "89.160.20.128")))); processor.execute(RandomDocumentPicks.randomIngestDocument(random(), new HashMap<>(Map.of("_field", "89.160.20.128"))));
} }
@ -507,7 +507,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
GeoIpProcessor.Factory factory = new GeoIpProcessor.Factory(GEOIP_TYPE, databaseNodeService); GeoIpProcessor.Factory factory = new GeoIpProcessor.Factory(GEOIP_TYPE, databaseNodeService);
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("field", "source_field"); config.put("field", "source_field");
GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, null, null, config); GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, null, null, config, null);
Map<String, Object> document = Map.of("source_field", "89.160.20.128"); Map<String, Object> document = Map.of("source_field", "89.160.20.128");
{ {
IngestDocument ingestDocument = RandomDocumentPicks.randomIngestDocument(random(), new HashMap<>(document)); IngestDocument ingestDocument = RandomDocumentPicks.randomIngestDocument(random(), new HashMap<>(document));
@ -558,7 +558,8 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
null, null,
null, null,
null, null,
config config,
null
); );
processor.execute(ingestDocument); processor.execute(ingestDocument);
assertThat(ingestDocument.getSourceAndMetadata().get("geoip"), nullValue()); assertThat(ingestDocument.getSourceAndMetadata().get("geoip"), nullValue());
@ -580,7 +581,7 @@ public class GeoIpProcessorFactoryTests extends ESTestCase {
document.put("source_field", "89.160.20.128"); document.put("source_field", "89.160.20.128");
IngestDocument ingestDocument = RandomDocumentPicks.randomIngestDocument(random(), document); IngestDocument ingestDocument = RandomDocumentPicks.randomIngestDocument(random(), document);
GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, null, null, config); GeoIpProcessor processor = (GeoIpProcessor) factory.create(null, null, null, config, null);
processor.execute(ingestDocument); processor.execute(ingestDocument);
assertThat(ingestDocument.getSourceAndMetadata().get("tags"), nullValue()); assertThat(ingestDocument.getSourceAndMetadata().get("tags"), nullValue());
Map<?, ?> geoData = (Map<?, ?>) ingestDocument.getSourceAndMetadata().get("geoip"); Map<?, ?> geoData = (Map<?, ?>) ingestDocument.getSourceAndMetadata().get("geoip");

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest.useragent; package org.elasticsearch.ingest.useragent;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
import org.elasticsearch.common.util.Maps; import org.elasticsearch.common.util.Maps;
import org.elasticsearch.core.UpdateForV10; import org.elasticsearch.core.UpdateForV10;
@ -191,7 +192,8 @@ public class UserAgentProcessor extends AbstractProcessor {
Map<String, Processor.Factory> factories, Map<String, Processor.Factory> factories,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) { ) {
String field = readStringProperty(TYPE, processorTag, config, "field"); String field = readStringProperty(TYPE, processorTag, config, "field");
String targetField = readStringProperty(TYPE, processorTag, config, "target_field", "user_agent"); String targetField = readStringProperty(TYPE, processorTag, config, "target_field", "user_agent");

View file

@ -74,7 +74,7 @@ public class UserAgentProcessorFactoryTests extends ESTestCase {
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
UserAgentProcessor processor = factory.create(null, processorTag, null, config); UserAgentProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getTargetField(), equalTo("user_agent")); assertThat(processor.getTargetField(), equalTo("user_agent"));
@ -95,7 +95,7 @@ public class UserAgentProcessorFactoryTests extends ESTestCase {
String processorTag = randomAlphaOfLength(10); String processorTag = randomAlphaOfLength(10);
UserAgentProcessor processor = factory.create(null, processorTag, null, config); UserAgentProcessor processor = factory.create(null, processorTag, null, config, null);
assertThat(processor.getTag(), equalTo(processorTag)); assertThat(processor.getTag(), equalTo(processorTag));
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getTargetField(), equalTo("user_agent")); assertThat(processor.getTargetField(), equalTo("user_agent"));
@ -113,7 +113,7 @@ public class UserAgentProcessorFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
config.put("target_field", "_target_field"); config.put("target_field", "_target_field");
UserAgentProcessor processor = factory.create(null, null, null, config); UserAgentProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getTargetField(), equalTo("_target_field")); assertThat(processor.getTargetField(), equalTo("_target_field"));
} }
@ -125,7 +125,7 @@ public class UserAgentProcessorFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
config.put("regex_file", regexWithoutDevicesFilename); config.put("regex_file", regexWithoutDevicesFilename);
UserAgentProcessor processor = factory.create(null, null, null, config); UserAgentProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getUaParser().getUaPatterns().size(), greaterThan(0)); assertThat(processor.getUaParser().getUaPatterns().size(), greaterThan(0));
assertThat(processor.getUaParser().getOsPatterns().size(), greaterThan(0)); assertThat(processor.getUaParser().getOsPatterns().size(), greaterThan(0));
@ -140,7 +140,7 @@ public class UserAgentProcessorFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
config.put("extract_device_type", extractDeviceType); config.put("extract_device_type", extractDeviceType);
UserAgentProcessor processor = factory.create(null, null, null, config); UserAgentProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.isExtractDeviceType(), equalTo(extractDeviceType)); assertThat(processor.isExtractDeviceType(), equalTo(extractDeviceType));
} }
@ -152,7 +152,10 @@ public class UserAgentProcessorFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
config.put("regex_file", "does-not-exist.yml"); config.put("regex_file", "does-not-exist.yml");
ElasticsearchParseException e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config)); ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class,
() -> factory.create(null, null, null, config, null)
);
assertThat(e.getMessage(), equalTo("[regex_file] regex file [does-not-exist.yml] doesn't exist (has to exist at node startup)")); assertThat(e.getMessage(), equalTo("[regex_file] regex file [does-not-exist.yml] doesn't exist (has to exist at node startup)"));
} }
@ -172,7 +175,7 @@ public class UserAgentProcessorFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
config.put("properties", fieldNames); config.put("properties", fieldNames);
UserAgentProcessor processor = factory.create(null, null, null, config); UserAgentProcessor processor = factory.create(null, null, null, config, null);
assertThat(processor.getField(), equalTo("_field")); assertThat(processor.getField(), equalTo("_field"));
assertThat(processor.getProperties(), equalTo(properties)); assertThat(processor.getProperties(), equalTo(properties));
} }
@ -184,7 +187,10 @@ public class UserAgentProcessorFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
config.put("properties", Collections.singletonList("invalid")); config.put("properties", Collections.singletonList("invalid"));
ElasticsearchParseException e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config)); ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class,
() -> factory.create(null, null, null, config, null)
);
assertThat( assertThat(
e.getMessage(), e.getMessage(),
equalTo("[properties] illegal property value [invalid]. valid values are [NAME, OS, DEVICE, " + "ORIGINAL, VERSION]") equalTo("[properties] illegal property value [invalid]. valid values are [NAME, OS, DEVICE, " + "ORIGINAL, VERSION]")
@ -198,7 +204,10 @@ public class UserAgentProcessorFactoryTests extends ESTestCase {
config.put("field", "_field"); config.put("field", "_field");
config.put("properties", "invalid"); config.put("properties", "invalid");
ElasticsearchParseException e = expectThrows(ElasticsearchParseException.class, () -> factory.create(null, null, null, config)); ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class,
() -> factory.create(null, null, null, config, null)
);
assertThat(e.getMessage(), equalTo("[properties] property isn't a list, but of type [java.lang.String]")); assertThat(e.getMessage(), equalTo("[properties] property isn't a list, but of type [java.lang.String]"));
} }
} }

View file

@ -358,7 +358,7 @@ public class FinalPipelineIT extends ESIntegTestCase {
"final", "final",
getFinal(parameters, randomBoolean()), getFinal(parameters, randomBoolean()),
"request", "request",
(processorFactories, tag, description, config) -> new AbstractProcessor(tag, description) { (processorFactories, tag, description, config, projectId) -> new AbstractProcessor(tag, description) {
@Override @Override
public IngestDocument execute(final IngestDocument ingestDocument) throws Exception { public IngestDocument execute(final IngestDocument ingestDocument) throws Exception {
ingestDocument.setFieldValue("request", true); ingestDocument.setFieldValue("request", true);
@ -371,7 +371,7 @@ public class FinalPipelineIT extends ESIntegTestCase {
} }
}, },
"changing_dest", "changing_dest",
(processorFactories, tag, description, config) -> new AbstractProcessor(tag, description) { (processorFactories, tag, description, config, projectId) -> new AbstractProcessor(tag, description) {
@Override @Override
public IngestDocument execute(final IngestDocument ingestDocument) throws Exception { public IngestDocument execute(final IngestDocument ingestDocument) throws Exception {
ingestDocument.setFieldValue(IngestDocument.Metadata.INDEX.getFieldName(), "target"); ingestDocument.setFieldValue(IngestDocument.Metadata.INDEX.getFieldName(), "target");
@ -385,7 +385,7 @@ public class FinalPipelineIT extends ESIntegTestCase {
}, },
"reroute", "reroute",
(processorFactories, tag, description, config) -> { (processorFactories, tag, description, config, projectId) -> {
final String dest = Objects.requireNonNullElse( final String dest = Objects.requireNonNullElse(
ConfigurationUtils.readOptionalStringProperty(description, tag, config, "dest"), ConfigurationUtils.readOptionalStringProperty(description, tag, config, "dest"),
"target" "target"
@ -408,7 +408,7 @@ public class FinalPipelineIT extends ESIntegTestCase {
} }
private static Processor.Factory getDefault(Processor.Parameters parameters, boolean async) { private static Processor.Factory getDefault(Processor.Parameters parameters, boolean async) {
return (factories, tag, description, config) -> new AbstractProcessor(tag, description) { return (factories, tag, description, config, projectId) -> new AbstractProcessor(tag, description) {
@Override @Override
public void execute(IngestDocument ingestDocument, BiConsumer<IngestDocument, Exception> handler) { public void execute(IngestDocument ingestDocument, BiConsumer<IngestDocument, Exception> handler) {
@ -446,7 +446,7 @@ public class FinalPipelineIT extends ESIntegTestCase {
} }
private static Processor.Factory getFinal(Processor.Parameters parameters, boolean async) { private static Processor.Factory getFinal(Processor.Parameters parameters, boolean async) {
return (processorFactories, tag, description, config) -> { return (processorFactories, tag, description, config, projectId) -> {
final String exists = (String) config.remove("exists"); final String exists = (String) config.remove("exists");
return new AbstractProcessor(tag, description) { return new AbstractProcessor(tag, description) {

View file

@ -96,7 +96,7 @@ public class IngestAsyncProcessorIT extends ESSingleNodeTestCase {
@Override @Override
public Map<String, Processor.Factory> getProcessors(Processor.Parameters parameters) { public Map<String, Processor.Factory> getProcessors(Processor.Parameters parameters) {
return Map.of("test-async", (factories, tag, description, config) -> new AbstractProcessor(tag, description) { return Map.of("test-async", (factories, tag, description, config, projectId) -> new AbstractProcessor(tag, description) {
@Override @Override
public void execute(IngestDocument ingestDocument, BiConsumer<IngestDocument, Exception> handler) { public void execute(IngestDocument ingestDocument, BiConsumer<IngestDocument, Exception> handler) {
@ -129,7 +129,7 @@ public class IngestAsyncProcessorIT extends ESSingleNodeTestCase {
return true; return true;
} }
}, "test", (processorFactories, tag, description, config) -> new AbstractProcessor(tag, description) { }, "test", (processorFactories, tag, description, config, projectId) -> new AbstractProcessor(tag, description) {
@Override @Override
public IngestDocument execute(IngestDocument ingestDocument) throws Exception { public IngestDocument execute(IngestDocument ingestDocument) throws Exception {
String id = (String) ingestDocument.getSourceAndMetadata().get("_id"); String id = (String) ingestDocument.getSourceAndMetadata().get("_id");

View file

@ -386,11 +386,16 @@ public class IngestClientIT extends ESIntegTestCase {
factories.put(PipelineProcessor.TYPE, new PipelineProcessor.Factory(parameters.ingestService)); factories.put(PipelineProcessor.TYPE, new PipelineProcessor.Factory(parameters.ingestService));
factories.put( factories.put(
"fail", "fail",
(processorFactories, tag, description, config) -> new TestProcessor(tag, "fail", description, new RuntimeException()) (processorFactories, tag, description, config, projectId) -> new TestProcessor(
tag,
"fail",
description,
new RuntimeException()
)
); );
factories.put( factories.put(
"onfailure_processor", "onfailure_processor",
(processorFactories, tag, description, config) -> new TestProcessor(tag, "fail", description, document -> { (processorFactories, tag, description, config, projectId) -> new TestProcessor(tag, "fail", description, document -> {
String onFailurePipeline = document.getFieldValue("_ingest.on_failure_pipeline", String.class); String onFailurePipeline = document.getFieldValue("_ingest.on_failure_pipeline", String.class);
document.setFieldValue("readme", "pipeline with id [" + onFailurePipeline + "] is a bad pipeline"); document.setFieldValue("readme", "pipeline with id [" + onFailurePipeline + "] is a bad pipeline");
}) })

View file

@ -262,7 +262,7 @@ public class IngestFileSettingsIT extends ESIntegTestCase {
@Override @Override
public Map<String, Processor.Factory> getProcessors(Processor.Parameters parameters) { public Map<String, Processor.Factory> getProcessors(Processor.Parameters parameters) {
Map<String, Processor.Factory> processors = new HashMap<>(); Map<String, Processor.Factory> processors = new HashMap<>();
processors.put("test", (factories, tag, description, config) -> { processors.put("test", (factories, tag, description, config, projectId) -> {
String field = (String) config.remove("field"); String field = (String) config.remove("field");
String value = (String) config.remove("value"); String value = (String) config.remove("value");
return new FakeProcessor("test", tag, description, (ingestDocument) -> ingestDocument.setFieldValue(field, value)); return new FakeProcessor("test", tag, description, (ingestDocument) -> ingestDocument.setFieldValue(field, value));

View file

@ -166,7 +166,7 @@ public class IngestStatsNamesAndTypesIT extends ESIntegTestCase {
@Override @Override
public Map<String, Processor.Factory> getProcessors(Processor.Parameters parameters) { public Map<String, Processor.Factory> getProcessors(Processor.Parameters parameters) {
Map<String, Processor.Factory> processors = new HashMap<>(); Map<String, Processor.Factory> processors = new HashMap<>();
processors.put("set", (factories, tag, description, config) -> { processors.put("set", (factories, tag, description, config, projectId) -> {
String field = (String) config.remove("field"); String field = (String) config.remove("field");
String value = (String) config.remove("value"); String value = (String) config.remove("value");
return new FakeProcessor("set", tag, description, (ingestDocument) -> ingestDocument.setFieldValue(field, value)); return new FakeProcessor("set", tag, description, (ingestDocument) -> ingestDocument.setFieldValue(field, value));

View file

@ -149,14 +149,20 @@ public class SimulatePipelineRequest extends ActionRequest implements ToXContent
return new Parsed(pipeline, ingestDocumentList, verbose); return new Parsed(pipeline, ingestDocumentList, verbose);
} }
static Parsed parse(Map<String, Object> config, boolean verbose, IngestService ingestService, RestApiVersion restApiVersion) static Parsed parse(
throws Exception { ProjectId projectId,
Map<String, Object> config,
boolean verbose,
IngestService ingestService,
RestApiVersion restApiVersion
) throws Exception {
Map<String, Object> pipelineConfig = ConfigurationUtils.readMap(null, null, config, Fields.PIPELINE); Map<String, Object> pipelineConfig = ConfigurationUtils.readMap(null, null, config, Fields.PIPELINE);
Pipeline pipeline = Pipeline.create( Pipeline pipeline = Pipeline.create(
SIMULATED_PIPELINE_ID, SIMULATED_PIPELINE_ID,
pipelineConfig, pipelineConfig,
ingestService.getProcessorFactories(), ingestService.getProcessorFactories(),
ingestService.getScriptService() ingestService.getScriptService(),
projectId
); );
List<IngestDocument> ingestDocumentList = parseDocs(config, restApiVersion); List<IngestDocument> ingestDocumentList = parseDocs(config, restApiVersion);
return new Parsed(pipeline, ingestDocumentList, verbose); return new Parsed(pipeline, ingestDocumentList, verbose);

View file

@ -113,6 +113,7 @@ public class SimulatePipelineTransportAction extends HandledTransportAction<Simu
); );
} else { } else {
simulateRequest = SimulatePipelineRequest.parse( simulateRequest = SimulatePipelineRequest.parse(
projectId,
source, source,
request.isVerbose(), request.isVerbose(),
ingestService, ingestService,

View file

@ -12,6 +12,7 @@ package org.elasticsearch.ingest;
import org.elasticsearch.ElasticsearchException; import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.ExceptionsHelper; import org.elasticsearch.ExceptionsHelper;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.util.Maps; import org.elasticsearch.common.util.Maps;
@ -487,7 +488,8 @@ public final class ConfigurationUtils {
public static List<Processor> readProcessorConfigs( public static List<Processor> readProcessorConfigs(
List<Map<String, Object>> processorConfigs, List<Map<String, Object>> processorConfigs,
ScriptService scriptService, ScriptService scriptService,
Map<String, Processor.Factory> processorFactories Map<String, Processor.Factory> processorFactories,
ProjectId projectId
) throws Exception { ) throws Exception {
Exception exception = null; Exception exception = null;
List<Processor> processors = new ArrayList<>(); List<Processor> processors = new ArrayList<>();
@ -498,7 +500,7 @@ public final class ConfigurationUtils {
if (entry.getValue() == null) { if (entry.getValue() == null) {
throw newConfigurationException(entry.getKey(), null, null, "processor config cannot be [null]"); throw newConfigurationException(entry.getKey(), null, null, "processor config cannot be [null]");
} else { } else {
processors.add(readProcessor(processorFactories, scriptService, entry.getKey(), entry.getValue())); processors.add(readProcessor(processorFactories, scriptService, entry.getKey(), entry.getValue(), projectId));
} }
} catch (Exception e) { } catch (Exception e) {
exception = ExceptionsHelper.useOrSuppress(exception, e); exception = ExceptionsHelper.useOrSuppress(exception, e);
@ -575,14 +577,15 @@ public final class ConfigurationUtils {
Map<String, Processor.Factory> processorFactories, Map<String, Processor.Factory> processorFactories,
ScriptService scriptService, ScriptService scriptService,
String type, String type,
Object config Object config,
ProjectId projectId
) throws Exception { ) throws Exception {
if (config instanceof Map) { if (config instanceof Map) {
return readProcessor(processorFactories, scriptService, type, (Map<String, Object>) config); return readProcessor(processorFactories, scriptService, type, (Map<String, Object>) config, projectId);
} else if (config instanceof String && "script".equals(type)) { } else if (config instanceof String && "script".equals(type)) {
Map<String, Object> normalizedScript = Maps.newMapWithExpectedSize(1); Map<String, Object> normalizedScript = Maps.newMapWithExpectedSize(1);
normalizedScript.put(ScriptType.INLINE.getParseField().getPreferredName(), config); normalizedScript.put(ScriptType.INLINE.getParseField().getPreferredName(), config);
return readProcessor(processorFactories, scriptService, type, normalizedScript); return readProcessor(processorFactories, scriptService, type, normalizedScript, projectId);
} else { } else {
throw newConfigurationException(type, null, null, "property isn't a map, but of type [" + config.getClass().getName() + "]"); throw newConfigurationException(type, null, null, "property isn't a map, but of type [" + config.getClass().getName() + "]");
} }
@ -592,7 +595,8 @@ public final class ConfigurationUtils {
Map<String, Processor.Factory> processorFactories, Map<String, Processor.Factory> processorFactories,
ScriptService scriptService, ScriptService scriptService,
String type, String type,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
String tag = ConfigurationUtils.readOptionalStringProperty(null, null, config, TAG_KEY); String tag = ConfigurationUtils.readOptionalStringProperty(null, null, config, TAG_KEY);
String description = ConfigurationUtils.readOptionalStringProperty(null, tag, config, DESCRIPTION_KEY); String description = ConfigurationUtils.readOptionalStringProperty(null, tag, config, DESCRIPTION_KEY);
@ -607,14 +611,19 @@ public final class ConfigurationUtils {
Pipeline.ON_FAILURE_KEY Pipeline.ON_FAILURE_KEY
); );
List<Processor> onFailureProcessors = readProcessorConfigs(onFailureProcessorConfigs, scriptService, processorFactories); List<Processor> onFailureProcessors = readProcessorConfigs(
onFailureProcessorConfigs,
scriptService,
processorFactories,
projectId
);
if (onFailureProcessorConfigs != null && onFailureProcessors.isEmpty()) { if (onFailureProcessorConfigs != null && onFailureProcessors.isEmpty()) {
throw newConfigurationException(type, tag, Pipeline.ON_FAILURE_KEY, "processors list cannot be empty"); throw newConfigurationException(type, tag, Pipeline.ON_FAILURE_KEY, "processors list cannot be empty");
} }
try { try {
Processor processor = factory.create(processorFactories, tag, description, config); Processor processor = factory.create(processorFactories, tag, description, config, projectId);
if (config.isEmpty() == false) { if (config.isEmpty() == false) {
throw new ElasticsearchParseException( throw new ElasticsearchParseException(
"processor [{}] doesn't support one or more provided configuration parameters {}", "processor [{}] doesn't support one or more provided configuration parameters {}",

View file

@ -9,6 +9,8 @@
package org.elasticsearch.ingest; package org.elasticsearch.ingest;
import org.elasticsearch.cluster.metadata.ProjectId;
import java.util.Map; import java.util.Map;
/** /**
@ -40,7 +42,8 @@ public final class DropProcessor extends AbstractProcessor {
final Map<String, Processor.Factory> processorFactories, final Map<String, Processor.Factory> processorFactories,
final String tag, final String tag,
final String description, final String description,
final Map<String, Object> config final Map<String, Object> config,
final ProjectId projectId
) { ) {
return new DropProcessor(tag, description); return new DropProcessor(tag, description);
} }

View file

@ -372,6 +372,10 @@ public class IngestService implements ClusterStateApplier, ReportingService<Inge
return scriptService; return scriptService;
} }
public ProjectResolver getProjectResolver() {
return projectResolver;
}
/** /**
* Deletes the pipeline specified by id in the request. * Deletes the pipeline specified by id in the request.
*/ */
@ -522,7 +526,7 @@ public class IngestService implements ClusterStateApplier, ReportingService<Inge
} }
nodeInfoListener.accept(listener.delegateFailureAndWrap((l, nodeInfos) -> { nodeInfoListener.accept(listener.delegateFailureAndWrap((l, nodeInfos) -> {
validatePipelineRequest(request, nodeInfos); validatePipelineRequest(projectId, request, nodeInfos);
taskQueue.submitTask( taskQueue.submitTask(
"put-pipeline-" + request.getId(), "put-pipeline-" + request.getId(),
@ -532,14 +536,14 @@ public class IngestService implements ClusterStateApplier, ReportingService<Inge
})); }));
} }
public void validatePipelineRequest(PutPipelineRequest request, NodesInfoResponse nodeInfos) throws Exception { public void validatePipelineRequest(ProjectId projectId, PutPipelineRequest request, NodesInfoResponse nodeInfos) throws Exception {
final Map<String, Object> config = XContentHelper.convertToMap(request.getSource(), false, request.getXContentType()).v2(); final Map<String, Object> config = XContentHelper.convertToMap(request.getSource(), false, request.getXContentType()).v2();
Map<DiscoveryNode, IngestInfo> ingestInfos = new HashMap<>(); Map<DiscoveryNode, IngestInfo> ingestInfos = new HashMap<>();
for (NodeInfo nodeInfo : nodeInfos.getNodes()) { for (NodeInfo nodeInfo : nodeInfos.getNodes()) {
ingestInfos.put(nodeInfo.getNode(), nodeInfo.getInfo(IngestInfo.class)); ingestInfos.put(nodeInfo.getNode(), nodeInfo.getInfo(IngestInfo.class));
} }
validatePipeline(ingestInfos, request.getId(), config); validatePipeline(ingestInfos, projectId, request.getId(), config);
} }
public static boolean isNoOpPipelineUpdate(ProjectMetadata metadata, PutPipelineRequest request) { public static boolean isNoOpPipelineUpdate(ProjectMetadata metadata, PutPipelineRequest request) {
@ -729,8 +733,12 @@ public class IngestService implements ClusterStateApplier, ReportingService<Inge
} }
@UpdateForV10(owner = DATA_MANAGEMENT) // Change deprecation log for special characters in name to a failure @UpdateForV10(owner = DATA_MANAGEMENT) // Change deprecation log for special characters in name to a failure
void validatePipeline(Map<DiscoveryNode, IngestInfo> ingestInfos, String pipelineId, Map<String, Object> pipelineConfig) void validatePipeline(
throws Exception { Map<DiscoveryNode, IngestInfo> ingestInfos,
ProjectId projectId,
String pipelineId,
Map<String, Object> pipelineConfig
) throws Exception {
if (ingestInfos.isEmpty()) { if (ingestInfos.isEmpty()) {
throw new IllegalStateException("Ingest info is empty"); throw new IllegalStateException("Ingest info is empty");
} }
@ -746,7 +754,7 @@ public class IngestService implements ClusterStateApplier, ReportingService<Inge
deprecationLogger.critical(DeprecationCategory.API, "pipeline_name_special_chars", e.getMessage()); deprecationLogger.critical(DeprecationCategory.API, "pipeline_name_special_chars", e.getMessage());
} }
Pipeline pipeline = Pipeline.create(pipelineId, pipelineConfig, processorFactories, scriptService); Pipeline pipeline = Pipeline.create(pipelineId, pipelineConfig, processorFactories, scriptService, projectId);
List<Exception> exceptions = new ArrayList<>(); List<Exception> exceptions = new ArrayList<>();
for (Processor processor : pipeline.flattenAllProcessors()) { for (Processor processor : pipeline.flattenAllProcessors()) {
@ -1394,7 +1402,8 @@ public class IngestService implements ClusterStateApplier, ReportingService<Inge
newConfiguration.getId(), newConfiguration.getId(),
newConfiguration.getConfig(false), newConfiguration.getConfig(false),
processorFactories, processorFactories,
scriptService scriptService,
projectId
); );
newPipelines.put(newConfiguration.getId(), new PipelineHolder(newConfiguration, newPipeline)); newPipelines.put(newConfiguration.getId(), new PipelineHolder(newConfiguration, newPipeline));
@ -1523,7 +1532,7 @@ public class IngestService implements ClusterStateApplier, ReportingService<Inge
public synchronized void reloadPipeline(ProjectId projectId, String id) throws Exception { public synchronized void reloadPipeline(ProjectId projectId, String id) throws Exception {
var originalPipelines = this.pipelines.getOrDefault(projectId, ImmutableOpenMap.of()); var originalPipelines = this.pipelines.getOrDefault(projectId, ImmutableOpenMap.of());
PipelineHolder holder = originalPipelines.get(id); PipelineHolder holder = originalPipelines.get(id);
Pipeline updatedPipeline = Pipeline.create(id, holder.configuration.getConfig(false), processorFactories, scriptService); Pipeline updatedPipeline = Pipeline.create(id, holder.configuration.getConfig(false), processorFactories, scriptService, projectId);
ImmutableOpenMap<String, PipelineHolder> updatedPipelines = ImmutableOpenMap.builder(originalPipelines) ImmutableOpenMap<String, PipelineHolder> updatedPipelines = ImmutableOpenMap.builder(originalPipelines)
.fPut(id, new PipelineHolder(holder.configuration, updatedPipeline)) .fPut(id, new PipelineHolder(holder.configuration, updatedPipeline))
.build(); .build();

View file

@ -10,6 +10,7 @@
package org.elasticsearch.ingest; package org.elasticsearch.ingest;
import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.core.Nullable; import org.elasticsearch.core.Nullable;
import org.elasticsearch.script.ScriptService; import org.elasticsearch.script.ScriptService;
@ -89,19 +90,26 @@ public final class Pipeline {
String id, String id,
Map<String, Object> config, Map<String, Object> config,
Map<String, Processor.Factory> processorFactories, Map<String, Processor.Factory> processorFactories,
ScriptService scriptService ScriptService scriptService,
ProjectId projectId
) throws Exception { ) throws Exception {
String description = ConfigurationUtils.readOptionalStringProperty(null, null, config, DESCRIPTION_KEY); String description = ConfigurationUtils.readOptionalStringProperty(null, null, config, DESCRIPTION_KEY);
Integer version = ConfigurationUtils.readIntProperty(null, null, config, VERSION_KEY, null); Integer version = ConfigurationUtils.readIntProperty(null, null, config, VERSION_KEY, null);
Map<String, Object> metadata = ConfigurationUtils.readOptionalMap(null, null, config, META_KEY); Map<String, Object> metadata = ConfigurationUtils.readOptionalMap(null, null, config, META_KEY);
Boolean deprecated = ConfigurationUtils.readOptionalBooleanProperty(null, null, config, DEPRECATED_KEY); Boolean deprecated = ConfigurationUtils.readOptionalBooleanProperty(null, null, config, DEPRECATED_KEY);
List<Map<String, Object>> processorConfigs = ConfigurationUtils.readList(null, null, config, PROCESSORS_KEY); List<Map<String, Object>> processorConfigs = ConfigurationUtils.readList(null, null, config, PROCESSORS_KEY);
List<Processor> processors = ConfigurationUtils.readProcessorConfigs(processorConfigs, scriptService, processorFactories); List<Processor> processors = ConfigurationUtils.readProcessorConfigs(
processorConfigs,
scriptService,
processorFactories,
projectId
);
List<Map<String, Object>> onFailureProcessorConfigs = ConfigurationUtils.readOptionalList(null, null, config, ON_FAILURE_KEY); List<Map<String, Object>> onFailureProcessorConfigs = ConfigurationUtils.readOptionalList(null, null, config, ON_FAILURE_KEY);
List<Processor> onFailureProcessors = ConfigurationUtils.readProcessorConfigs( List<Processor> onFailureProcessors = ConfigurationUtils.readProcessorConfigs(
onFailureProcessorConfigs, onFailureProcessorConfigs,
scriptService, scriptService,
processorFactories processorFactories,
projectId
); );
if (config.isEmpty() == false) { if (config.isEmpty() == false) {
throw new ElasticsearchParseException( throw new ElasticsearchParseException(

View file

@ -9,6 +9,7 @@
package org.elasticsearch.ingest; package org.elasticsearch.ingest;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.script.TemplateScript; import org.elasticsearch.script.TemplateScript;
import java.util.Map; import java.util.Map;
@ -93,7 +94,8 @@ public class PipelineProcessor extends AbstractProcessor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
TemplateScript.Factory pipelineTemplate = ConfigurationUtils.readTemplateProperty( TemplateScript.Factory pipelineTemplate = ConfigurationUtils.readTemplateProperty(
TYPE, TYPE,

View file

@ -10,6 +10,7 @@
package org.elasticsearch.ingest; package org.elasticsearch.ingest;
import org.elasticsearch.client.internal.Client; import org.elasticsearch.client.internal.Client;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.util.concurrent.ThreadContext;
import org.elasticsearch.env.Environment; import org.elasticsearch.env.Environment;
import org.elasticsearch.grok.MatcherWatchdog; import org.elasticsearch.grok.MatcherWatchdog;
@ -84,12 +85,12 @@ public interface Processor {
* *
* Override this method to perform additional post-construction validation that should be performed at the rest/transport level. * Override this method to perform additional post-construction validation that should be performed at the rest/transport level.
* If there's an issue with the processor, then indicate that by throwing an exception. See * If there's an issue with the processor, then indicate that by throwing an exception. See
* {@link IngestService#validatePipeline(Map, String, Map)}} for the call site where there is invoked in a try/catch. * {@link IngestService#validatePipeline(Map, ProjectId, String, Map)}} for the call site where there is invoked in a try/catch.
* *
* An example of where this would be needed is a processor that interacts with external state like the license state -- it may * An example of where this would be needed is a processor that interacts with external state like the license state -- it may
* be okay to create that processor on day 1 with license state A, but later illegal to create a similar processor on day 2 with * be okay to create that processor on day 1 with license state A, but later illegal to create a similar processor on day 2 with
* state B. We want to reject put requests on day 2 (at the rest/transport level), but still allow for restarting nodes in the * state B. We want to reject put requests on day 2 (at the rest/transport level), but still allow for restarting nodes in the
* cluster (so we can't throw exceptions from {@link Factory#create(Map, String, String, Map)}). * cluster (so we can't throw exceptions from {@link Factory#create(Map, String, String, Map, ProjectId)}).
*/ */
default void extraValidation() throws Exception {} default void extraValidation() throws Exception {}
@ -100,15 +101,22 @@ public interface Processor {
/** /**
* Creates a processor based on the specified map of maps config. * Creates a processor based on the specified map of maps config.
* @param processorFactories Other processors which may be created inside this processor *
* @param processorFactories Other processors which may be created inside this processor
* @param tag The tag for the processor * @param tag The tag for the processor
* @param description A short description of what this processor does * @param description A short description of what this processor does
* @param config The configuration for the processor * @param config The configuration for the processor
* @param projectId The project for which the processor is created
* *
* <b>Note:</b> Implementations are responsible for removing the used configuration keys, so that after * <b>Note:</b> Implementations are responsible for removing the used configuration keys, so that after
*/ */
Processor create(Map<String, Factory> processorFactories, String tag, String description, Map<String, Object> config) Processor create(
throws Exception; Map<String, Factory> processorFactories,
String tag,
String description,
Map<String, Object> config,
ProjectId projectId
) throws Exception;
} }
/** /**

View file

@ -57,7 +57,8 @@ public class SimulateIngestService extends IngestService {
pipelineId, pipelineId,
entry.getValue(), entry.getValue(),
ingestService.getProcessorFactories(), ingestService.getProcessorFactories(),
ingestService.getScriptService() ingestService.getScriptService(),
ingestService.getProjectResolver().getProjectId()
); );
parsedPipelineSubstitutions.put(pipelineId, pipeline); parsedPipelineSubstitutions.put(pipelineId, pipeline);
} }

View file

@ -261,7 +261,7 @@ public class SimulateExecutionServiceTests extends ESTestCase {
public void testDropDocument() throws Exception { public void testDropDocument() throws Exception {
TestProcessor processor1 = new TestProcessor(ingestDocument -> ingestDocument.setFieldValue("field", "value")); TestProcessor processor1 = new TestProcessor(ingestDocument -> ingestDocument.setFieldValue("field", "value"));
Processor processor2 = new DropProcessor.Factory().create(Map.of(), null, null, Map.of()); Processor processor2 = new DropProcessor.Factory().create(Map.of(), null, null, Map.of(), null);
Pipeline pipeline = new Pipeline("_id", "_description", version, null, new CompoundProcessor(processor1, processor2)); Pipeline pipeline = new Pipeline("_id", "_description", version, null, new CompoundProcessor(processor1, processor2));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
@ -281,7 +281,7 @@ public class SimulateExecutionServiceTests extends ESTestCase {
public void testDropDocumentVerbose() throws Exception { public void testDropDocumentVerbose() throws Exception {
TestProcessor processor1 = new TestProcessor(ingestDocument -> ingestDocument.setFieldValue("field", "value")); TestProcessor processor1 = new TestProcessor(ingestDocument -> ingestDocument.setFieldValue("field", "value"));
Processor processor2 = new DropProcessor.Factory().create(Map.of(), null, null, Map.of()); Processor processor2 = new DropProcessor.Factory().create(Map.of(), null, null, Map.of(), null);
Pipeline pipeline = new Pipeline("_id", "_description", version, null, new CompoundProcessor(processor1, processor2)); Pipeline pipeline = new Pipeline("_id", "_description", version, null, new CompoundProcessor(processor1, processor2));
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
@ -304,7 +304,7 @@ public class SimulateExecutionServiceTests extends ESTestCase {
public void testDropDocumentVerboseExtraProcessor() throws Exception { public void testDropDocumentVerboseExtraProcessor() throws Exception {
TestProcessor processor1 = new TestProcessor(ingestDocument -> ingestDocument.setFieldValue("field1", "value")); TestProcessor processor1 = new TestProcessor(ingestDocument -> ingestDocument.setFieldValue("field1", "value"));
Processor processor2 = new DropProcessor.Factory().create(Map.of(), null, null, Map.of()); Processor processor2 = new DropProcessor.Factory().create(Map.of(), null, null, Map.of(), null);
TestProcessor processor3 = new TestProcessor(ingestDocument -> ingestDocument.setFieldValue("field2", "value")); TestProcessor processor3 = new TestProcessor(ingestDocument -> ingestDocument.setFieldValue("field2", "value"));
Pipeline pipeline = new Pipeline("_id", "_description", version, null, new CompoundProcessor(processor1, processor2, processor3)); Pipeline pipeline = new Pipeline("_id", "_description", version, null, new CompoundProcessor(processor1, processor2, processor3));

View file

@ -60,7 +60,7 @@ public class SimulatePipelineRequestParsingTests extends ESTestCase {
Pipeline pipeline = new Pipeline(SIMULATED_PIPELINE_ID, null, null, null, pipelineCompoundProcessor); Pipeline pipeline = new Pipeline(SIMULATED_PIPELINE_ID, null, null, null, pipelineCompoundProcessor);
Map<String, Processor.Factory> registry = Collections.singletonMap( Map<String, Processor.Factory> registry = Collections.singletonMap(
"mock_processor", "mock_processor",
(factories, tag, description, config) -> processor (factories, tag, description, config, projectId) -> processor
); );
ingestService = mock(IngestService.class); ingestService = mock(IngestService.class);
when(ingestService.getPipeline(any(), eq(SIMULATED_PIPELINE_ID))).thenReturn(pipeline); when(ingestService.getPipeline(any(), eq(SIMULATED_PIPELINE_ID))).thenReturn(pipeline);
@ -189,7 +189,9 @@ public class SimulatePipelineRequestParsingTests extends ESTestCase {
requestContent.put(Fields.PIPELINE, pipelineConfig); requestContent.put(Fields.PIPELINE, pipelineConfig);
var projectId = randomProjectIdOrDefault();
SimulatePipelineRequest.Parsed actualRequest = SimulatePipelineRequest.parse( SimulatePipelineRequest.Parsed actualRequest = SimulatePipelineRequest.parse(
projectId,
requestContent, requestContent,
false, false,
ingestService, ingestService,
@ -256,6 +258,7 @@ public class SimulatePipelineRequestParsingTests extends ESTestCase {
} }
public void testNotValidDocs() { public void testNotValidDocs() {
var projectId = randomProjectIdOrDefault();
Map<String, Object> requestContent = new HashMap<>(); Map<String, Object> requestContent = new HashMap<>();
List<Map<String, Object>> docs = new ArrayList<>(); List<Map<String, Object>> docs = new ArrayList<>();
Map<String, Object> pipelineConfig = new HashMap<>(); Map<String, Object> pipelineConfig = new HashMap<>();
@ -265,7 +268,7 @@ public class SimulatePipelineRequestParsingTests extends ESTestCase {
requestContent.put(Fields.PIPELINE, pipelineConfig); requestContent.put(Fields.PIPELINE, pipelineConfig);
Exception e1 = expectThrows( Exception e1 = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> SimulatePipelineRequest.parse(requestContent, false, ingestService, RestApiVersion.current()) () -> SimulatePipelineRequest.parse(projectId, requestContent, false, ingestService, RestApiVersion.current())
); );
assertThat(e1.getMessage(), equalTo("must specify at least one document in [docs]")); assertThat(e1.getMessage(), equalTo("must specify at least one document in [docs]"));
@ -276,7 +279,7 @@ public class SimulatePipelineRequestParsingTests extends ESTestCase {
requestContent.put(Fields.PIPELINE, pipelineConfig); requestContent.put(Fields.PIPELINE, pipelineConfig);
Exception e2 = expectThrows( Exception e2 = expectThrows(
IllegalArgumentException.class, IllegalArgumentException.class,
() -> SimulatePipelineRequest.parse(requestContent, false, ingestService, RestApiVersion.current()) () -> SimulatePipelineRequest.parse(projectId, requestContent, false, ingestService, RestApiVersion.current())
); );
assertThat(e2.getMessage(), equalTo("malformed [docs] section, should include an inner object")); assertThat(e2.getMessage(), equalTo("malformed [docs] section, should include an inner object"));
@ -285,7 +288,7 @@ public class SimulatePipelineRequestParsingTests extends ESTestCase {
requestContent.put(Fields.PIPELINE, pipelineConfig); requestContent.put(Fields.PIPELINE, pipelineConfig);
Exception e3 = expectThrows( Exception e3 = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> SimulatePipelineRequest.parse(requestContent, false, ingestService, RestApiVersion.current()) () -> SimulatePipelineRequest.parse(projectId, requestContent, false, ingestService, RestApiVersion.current())
); );
assertThat(e3.getMessage(), containsString("required property is missing")); assertThat(e3.getMessage(), containsString("required property is missing"));
} }
@ -358,7 +361,9 @@ public class SimulatePipelineRequestParsingTests extends ESTestCase {
pipelineConfig.put("on_failure", onFailureProcessors); pipelineConfig.put("on_failure", onFailureProcessors);
} }
requestContent.put(Fields.PIPELINE, pipelineConfig); requestContent.put(Fields.PIPELINE, pipelineConfig);
var projectId = randomProjectIdOrDefault();
SimulatePipelineRequest.Parsed actualRequest = SimulatePipelineRequest.parse( SimulatePipelineRequest.Parsed actualRequest = SimulatePipelineRequest.parse(
projectId,
requestContent, requestContent,
false, false,
ingestService, ingestService,

View file

@ -11,6 +11,7 @@ package org.elasticsearch.ingest;
import org.elasticsearch.ElasticsearchException; import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.script.ScriptService; import org.elasticsearch.script.ScriptService;
import org.elasticsearch.script.TemplateScript; import org.elasticsearch.script.TemplateScript;
import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.ESTestCase;
@ -40,6 +41,7 @@ public class ConfigurationUtilsTests extends ESTestCase {
private final ScriptService scriptService = mock(ScriptService.class); private final ScriptService scriptService = mock(ScriptService.class);
private final ProjectId projectId = randomProjectIdOrDefault();
private Map<String, Object> config; private Map<String, Object> config;
@Before @Before
@ -148,7 +150,7 @@ public class ConfigurationUtilsTests extends ESTestCase {
Processor processor = mock(Processor.class); Processor processor = mock(Processor.class);
Map<String, Processor.Factory> registry = Collections.singletonMap( Map<String, Processor.Factory> registry = Collections.singletonMap(
"test_processor", "test_processor",
(factories, tag, description, config) -> processor (factories, tag, description, config, projectId) -> processor
); );
List<Map<String, Object>> config = new ArrayList<>(); List<Map<String, Object>> config = new ArrayList<>();
@ -156,7 +158,7 @@ public class ConfigurationUtilsTests extends ESTestCase {
config.add(Collections.singletonMap("test_processor", emptyConfig)); config.add(Collections.singletonMap("test_processor", emptyConfig));
config.add(Collections.singletonMap("test_processor", emptyConfig)); config.add(Collections.singletonMap("test_processor", emptyConfig));
List<Processor> result = ConfigurationUtils.readProcessorConfigs(config, scriptService, registry); List<Processor> result = ConfigurationUtils.readProcessorConfigs(config, scriptService, registry, projectId);
assertThat(result.size(), equalTo(2)); assertThat(result.size(), equalTo(2));
assertThat(result.get(0), sameInstance(processor)); assertThat(result.get(0), sameInstance(processor));
assertThat(result.get(1), sameInstance(processor)); assertThat(result.get(1), sameInstance(processor));
@ -169,7 +171,7 @@ public class ConfigurationUtilsTests extends ESTestCase {
config.add(Collections.singletonMap("unknown_processor", unknownTaggedConfig)); config.add(Collections.singletonMap("unknown_processor", unknownTaggedConfig));
ElasticsearchParseException e = expectThrows( ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> ConfigurationUtils.readProcessorConfigs(config, scriptService, registry) () -> ConfigurationUtils.readProcessorConfigs(config, scriptService, registry, projectId)
); );
assertThat(e.getMessage(), equalTo("No processor type exists with name [unknown_processor]")); assertThat(e.getMessage(), equalTo("No processor type exists with name [unknown_processor]"));
assertThat(e.getMetadata("es.processor_tag"), equalTo(Collections.singletonList("my_unknown"))); assertThat(e.getMetadata("es.processor_tag"), equalTo(Collections.singletonList("my_unknown")));
@ -186,7 +188,7 @@ public class ConfigurationUtilsTests extends ESTestCase {
config2.add(Collections.singletonMap("second_unknown_processor", secondUnknownTaggedConfig)); config2.add(Collections.singletonMap("second_unknown_processor", secondUnknownTaggedConfig));
e = expectThrows( e = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> ConfigurationUtils.readProcessorConfigs(config2, scriptService, registry) () -> ConfigurationUtils.readProcessorConfigs(config2, scriptService, registry, projectId)
); );
assertThat(e.getMessage(), equalTo("No processor type exists with name [unknown_processor]")); assertThat(e.getMessage(), equalTo("No processor type exists with name [unknown_processor]"));
assertThat(e.getMetadata("es.processor_tag"), equalTo(Collections.singletonList("my_unknown"))); assertThat(e.getMetadata("es.processor_tag"), equalTo(Collections.singletonList("my_unknown")));
@ -205,7 +207,7 @@ public class ConfigurationUtilsTests extends ESTestCase {
config3.add(Collections.singletonMap("test_processor", null)); config3.add(Collections.singletonMap("test_processor", null));
ElasticsearchParseException e3 = expectThrows( ElasticsearchParseException e3 = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> ConfigurationUtils.readProcessorConfigs(config3, scriptService, registry) () -> ConfigurationUtils.readProcessorConfigs(config3, scriptService, registry, projectId)
); );
assertThat(e3.getMetadata("es.processor_type"), equalTo(Collections.singletonList("test_processor"))); assertThat(e3.getMetadata("es.processor_type"), equalTo(Collections.singletonList("test_processor")));
assertThat(e3.getMessage(), equalTo("processor config cannot be [null]")); assertThat(e3.getMessage(), equalTo("processor config cannot be [null]"));
@ -213,15 +215,18 @@ public class ConfigurationUtilsTests extends ESTestCase {
public void testReadProcessorNullDescription() throws Exception { public void testReadProcessorNullDescription() throws Exception {
Processor processor = new TestProcessor("tag", "type", null, (ingestDocument) -> {}); Processor processor = new TestProcessor("tag", "type", null, (ingestDocument) -> {});
Map<String, Processor.Factory> registry = Collections.singletonMap("test_processor", (factories, tag, description, config) -> { Map<String, Processor.Factory> registry = Collections.singletonMap(
assertNull(description); "test_processor",
return processor; (factories, tag, description, config, projectId) -> {
}); assertNull(description);
return processor;
}
);
List<Map<String, Object>> config = new ArrayList<>(); List<Map<String, Object>> config = new ArrayList<>();
Map<String, Object> emptyConfig = Collections.emptyMap(); Map<String, Object> emptyConfig = Collections.emptyMap();
config.add(Collections.singletonMap("test_processor", emptyConfig)); config.add(Collections.singletonMap("test_processor", emptyConfig));
List<Processor> result = ConfigurationUtils.readProcessorConfigs(config, scriptService, registry); List<Processor> result = ConfigurationUtils.readProcessorConfigs(config, scriptService, registry, projectId);
assertThat(result.size(), equalTo(1)); assertThat(result.size(), equalTo(1));
assertThat(result.get(0), sameInstance(processor)); assertThat(result.get(0), sameInstance(processor));
} }
@ -229,40 +234,46 @@ public class ConfigurationUtilsTests extends ESTestCase {
public void testReadProcessorDescription() throws Exception { public void testReadProcessorDescription() throws Exception {
String testDescription = randomAlphaOfLengthBetween(10, 20); String testDescription = randomAlphaOfLengthBetween(10, 20);
Processor processor = new TestProcessor("tag", "type", testDescription, (ingestDocument) -> {}); Processor processor = new TestProcessor("tag", "type", testDescription, (ingestDocument) -> {});
Map<String, Processor.Factory> registry = Collections.singletonMap("test_processor", (factories, tag, description, config) -> { Map<String, Processor.Factory> registry = Collections.singletonMap(
assertThat(description, equalTo(processor.getDescription())); "test_processor",
return processor; (factories, tag, description, config, projectId) -> {
}); assertThat(description, equalTo(processor.getDescription()));
return processor;
}
);
List<Map<String, Object>> config = new ArrayList<>(); List<Map<String, Object>> config = new ArrayList<>();
Map<String, Object> processorConfig = new HashMap<>(); Map<String, Object> processorConfig = new HashMap<>();
processorConfig.put(ConfigurationUtils.DESCRIPTION_KEY, testDescription); processorConfig.put(ConfigurationUtils.DESCRIPTION_KEY, testDescription);
config.add(Collections.singletonMap("test_processor", processorConfig)); config.add(Collections.singletonMap("test_processor", processorConfig));
List<Processor> result = ConfigurationUtils.readProcessorConfigs(config, scriptService, registry); List<Processor> result = ConfigurationUtils.readProcessorConfigs(config, scriptService, registry, projectId);
assertThat(result.size(), equalTo(1)); assertThat(result.size(), equalTo(1));
assertThat(result.get(0), sameInstance(processor)); assertThat(result.get(0), sameInstance(processor));
} }
public void testReadProcessorFromObjectOrMap() throws Exception { public void testReadProcessorFromObjectOrMap() throws Exception {
Processor processor = mock(Processor.class); Processor processor = mock(Processor.class);
Map<String, Processor.Factory> registry = Collections.singletonMap("script", (processorFactories, tag, description, config) -> { Map<String, Processor.Factory> registry = Collections.singletonMap(
config.clear(); "script",
return processor; (processorFactories, tag, description, config, projectId) -> {
}); config.clear();
return processor;
}
);
Object emptyConfig = Collections.emptyMap(); Object emptyConfig = Collections.emptyMap();
Processor processor1 = ConfigurationUtils.readProcessor(registry, scriptService, "script", emptyConfig); Processor processor1 = ConfigurationUtils.readProcessor(registry, scriptService, "script", emptyConfig, projectId);
assertThat(processor1, sameInstance(processor)); assertThat(processor1, sameInstance(processor));
Object inlineScript = "test_script"; Object inlineScript = "test_script";
Processor processor2 = ConfigurationUtils.readProcessor(registry, scriptService, "script", inlineScript); Processor processor2 = ConfigurationUtils.readProcessor(registry, scriptService, "script", inlineScript, projectId);
assertThat(processor2, sameInstance(processor)); assertThat(processor2, sameInstance(processor));
Object invalidConfig = 12L; Object invalidConfig = 12L;
ElasticsearchParseException ex = expectThrows( ElasticsearchParseException ex = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> ConfigurationUtils.readProcessor(registry, scriptService, "unknown_processor", invalidConfig) () -> ConfigurationUtils.readProcessor(registry, scriptService, "unknown_processor", invalidConfig, projectId)
); );
assertThat(ex.getMessage(), equalTo("property isn't a map, but of type [" + invalidConfig.getClass().getName() + "]")); assertThat(ex.getMessage(), equalTo("property isn't a map, but of type [" + invalidConfig.getClass().getName() + "]"));
} }

View file

@ -135,7 +135,7 @@ public class IngestServiceTests extends ESTestCase {
private static final IngestPlugin DUMMY_PLUGIN = new IngestPlugin() { private static final IngestPlugin DUMMY_PLUGIN = new IngestPlugin() {
@Override @Override
public Map<String, Processor.Factory> getProcessors(Processor.Parameters parameters) { public Map<String, Processor.Factory> getProcessors(Processor.Parameters parameters) {
return Map.of("foo", (factories, tag, description, config) -> null); return Map.of("foo", (factories, tag, description, config, projectId) -> null);
} }
}; };
@ -347,11 +347,11 @@ public class IngestServiceTests extends ESTestCase {
public void testInnerUpdatePipelinesValidation() { public void testInnerUpdatePipelinesValidation() {
Map<String, Processor.Factory> processors = new HashMap<>(); Map<String, Processor.Factory> processors = new HashMap<>();
processors.put("fail_validation", (factories, tag, description, config) -> { processors.put("fail_validation", (factories, tag, description, config, projectId) -> {
// ordinary validation issues happen at processor construction time // ordinary validation issues happen at processor construction time
throw newConfigurationException("fail_validation", tag, "no_property_name", "validation failure reason"); throw newConfigurationException("fail_validation", tag, "no_property_name", "validation failure reason");
}); });
processors.put("fail_extra_validation", (factories, tag, description, config) -> { processors.put("fail_extra_validation", (factories, tag, description, config, projectId) -> {
// 'extra validation' issues happen post- processor construction time // 'extra validation' issues happen post- processor construction time
return new FakeProcessor("fail_extra_validation", tag, description, ingestDocument -> {}) { return new FakeProcessor("fail_extra_validation", tag, description, ingestDocument -> {}) {
@Override @Override
@ -444,16 +444,17 @@ public class IngestServiceTests extends ESTestCase {
PutPipelineRequest putRequest = putJsonPipelineRequest("pipeline-id", """ PutPipelineRequest putRequest = putJsonPipelineRequest("pipeline-id", """
{"processors": [{"set" : {"field": "_field", "value": "_value"}}]}"""); {"processors": [{"set" : {"field": "_field", "value": "_value"}}]}""");
var projectId = randomProjectIdOrDefault();
var pipelineConfig = XContentHelper.convertToMap(putRequest.getSource(), false, putRequest.getXContentType()).v2(); var pipelineConfig = XContentHelper.convertToMap(putRequest.getSource(), false, putRequest.getXContentType()).v2();
Exception e = expectThrows( Exception e = expectThrows(
IllegalStateException.class, IllegalStateException.class,
() -> ingestService.validatePipeline(Map.of(), putRequest.getId(), pipelineConfig) () -> ingestService.validatePipeline(Map.of(), projectId, putRequest.getId(), pipelineConfig)
); );
assertEquals("Ingest info is empty", e.getMessage()); assertEquals("Ingest info is empty", e.getMessage());
DiscoveryNode discoveryNode = DiscoveryNodeUtils.create("_node_id", buildNewFakeTransportAddress(), Map.of(), Set.of()); DiscoveryNode discoveryNode = DiscoveryNodeUtils.create("_node_id", buildNewFakeTransportAddress(), Map.of(), Set.of());
IngestInfo ingestInfo = new IngestInfo(List.of(new ProcessorInfo("set"))); IngestInfo ingestInfo = new IngestInfo(List.of(new ProcessorInfo("set")));
ingestService.validatePipeline(Map.of(discoveryNode, ingestInfo), putRequest.getId(), pipelineConfig); ingestService.validatePipeline(Map.of(discoveryNode, ingestInfo), projectId, putRequest.getId(), pipelineConfig);
} }
public void testValidateNotInUse() { public void testValidateNotInUse() {
@ -618,7 +619,7 @@ public class IngestServiceTests extends ESTestCase {
boolean[] externalProperty = new boolean[] { false }; boolean[] externalProperty = new boolean[] { false };
Map<String, Processor.Factory> processorFactories = new HashMap<>(); Map<String, Processor.Factory> processorFactories = new HashMap<>();
processorFactories.put("set", (factories, tag, description, config) -> { processorFactories.put("set", (factories, tag, description, config, projectId) -> {
String field = (String) config.remove("field"); String field = (String) config.remove("field");
String value = (String) config.remove("value"); String value = (String) config.remove("value");
if (externalProperty[0]) { if (externalProperty[0]) {
@ -685,7 +686,7 @@ public class IngestServiceTests extends ESTestCase {
); );
Map<String, Processor.Factory> processors = new HashMap<>(); Map<String, Processor.Factory> processors = new HashMap<>();
processors.put("complexSet", (factories, tag, description, config) -> { processors.put("complexSet", (factories, tag, description, config, projectId) -> {
String field = (String) config.remove("field"); String field = (String) config.remove("field");
String value = (String) config.remove("value"); String value = (String) config.remove("value");
@ -1017,6 +1018,7 @@ public class IngestServiceTests extends ESTestCase {
public void testValidateProcessorTypeOnAllNodes() throws Exception { public void testValidateProcessorTypeOnAllNodes() throws Exception {
IngestService ingestService = createWithProcessors(); IngestService ingestService = createWithProcessors();
var projectId = randomProjectIdOrDefault();
PutPipelineRequest putRequest = putJsonPipelineRequest("pipeline-id", """ PutPipelineRequest putRequest = putJsonPipelineRequest("pipeline-id", """
{ {
"processors": [ "processors": [
@ -1045,7 +1047,7 @@ public class IngestServiceTests extends ESTestCase {
ElasticsearchParseException e = expectThrows( ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> ingestService.validatePipeline(ingestInfos, putRequest.getId(), pipelineConfig) () -> ingestService.validatePipeline(ingestInfos, projectId, putRequest.getId(), pipelineConfig)
); );
assertEquals("Processor type [remove] is not installed on node [" + node2 + "]", e.getMessage()); assertEquals("Processor type [remove] is not installed on node [" + node2 + "]", e.getMessage());
assertEquals("remove", e.getMetadata("es.processor_type").get(0)); assertEquals("remove", e.getMetadata("es.processor_type").get(0));
@ -1053,14 +1055,15 @@ public class IngestServiceTests extends ESTestCase {
var pipelineConfig2 = XContentHelper.convertToMap(putRequest.getSource(), false, putRequest.getXContentType()).v2(); var pipelineConfig2 = XContentHelper.convertToMap(putRequest.getSource(), false, putRequest.getXContentType()).v2();
ingestInfos.put(node2, new IngestInfo(List.of(new ProcessorInfo("set"), new ProcessorInfo("remove")))); ingestInfos.put(node2, new IngestInfo(List.of(new ProcessorInfo("set"), new ProcessorInfo("remove"))));
ingestService.validatePipeline(ingestInfos, putRequest.getId(), pipelineConfig2); ingestService.validatePipeline(ingestInfos, projectId, putRequest.getId(), pipelineConfig2);
} }
public void testValidateConfigurationExceptions() { public void testValidateConfigurationExceptions() {
IngestService ingestService = createWithProcessors(Map.of("fail_validation", (factories, tag, description, config) -> { IngestService ingestService = createWithProcessors(Map.of("fail_validation", (factories, tag, description, config, projectId) -> {
// ordinary validation issues happen at processor construction time // ordinary validation issues happen at processor construction time
throw newConfigurationException("fail_validation", tag, "no_property_name", "validation failure reason"); throw newConfigurationException("fail_validation", tag, "no_property_name", "validation failure reason");
})); }));
var projectId = randomProjectIdOrDefault();
PutPipelineRequest putRequest = putJsonPipelineRequest("pipeline-id", """ PutPipelineRequest putRequest = putJsonPipelineRequest("pipeline-id", """
{ {
"processors": [ "processors": [
@ -1079,22 +1082,30 @@ public class IngestServiceTests extends ESTestCase {
ElasticsearchParseException e = expectThrows( ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> ingestService.validatePipeline(ingestInfos, putRequest.getId(), pipelineConfig) () -> ingestService.validatePipeline(ingestInfos, projectId, putRequest.getId(), pipelineConfig)
); );
assertEquals("[no_property_name] validation failure reason", e.getMessage()); assertEquals("[no_property_name] validation failure reason", e.getMessage());
assertEquals("fail_validation", e.getMetadata("es.processor_type").get(0)); assertEquals("fail_validation", e.getMetadata("es.processor_type").get(0));
} }
public void testValidateExtraValidationConfigurationExceptions() { public void testValidateExtraValidationConfigurationExceptions() {
IngestService ingestService = createWithProcessors(Map.of("fail_extra_validation", (factories, tag, description, config) -> { IngestService ingestService = createWithProcessors(
// 'extra validation' issues happen post- processor construction time Map.of("fail_extra_validation", (factories, tag, description, config, projectId) -> {
return new FakeProcessor("fail_extra_validation", tag, description, ingestDocument -> {}) { // 'extra validation' issues happen post- processor construction time
@Override return new FakeProcessor("fail_extra_validation", tag, description, ingestDocument -> {}) {
public void extraValidation() throws Exception { @Override
throw newConfigurationException("fail_extra_validation", tag, "no_property_name", "extra validation failure reason"); public void extraValidation() throws Exception {
} throw newConfigurationException(
}; "fail_extra_validation",
})); tag,
"no_property_name",
"extra validation failure reason"
);
}
};
})
);
var projectId = randomProjectIdOrDefault();
PutPipelineRequest putRequest = putJsonPipelineRequest("pipeline-id", """ PutPipelineRequest putRequest = putJsonPipelineRequest("pipeline-id", """
{ {
"processors": [ "processors": [
@ -1113,13 +1124,14 @@ public class IngestServiceTests extends ESTestCase {
ElasticsearchParseException e = expectThrows( ElasticsearchParseException e = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> ingestService.validatePipeline(ingestInfos, putRequest.getId(), pipelineConfig) () -> ingestService.validatePipeline(ingestInfos, projectId, putRequest.getId(), pipelineConfig)
); );
assertEquals("[no_property_name] extra validation failure reason", e.getMessage()); assertEquals("[no_property_name] extra validation failure reason", e.getMessage());
assertEquals("fail_extra_validation", e.getMetadata("es.processor_type").get(0)); assertEquals("fail_extra_validation", e.getMetadata("es.processor_type").get(0));
} }
public void testValidatePipelineName() throws Exception { public void testValidatePipelineName() throws Exception {
var projectId = randomProjectIdOrDefault();
IngestService ingestService = createWithProcessors(); IngestService ingestService = createWithProcessors();
for (Character badChar : List.of('\\', '/', '*', '?', '"', '<', '>', '|', ' ', ',')) { for (Character badChar : List.of('\\', '/', '*', '?', '"', '<', '>', '|', ' ', ',')) {
PutPipelineRequest putRequest = new PutPipelineRequest( PutPipelineRequest putRequest = new PutPipelineRequest(
@ -1135,7 +1147,7 @@ public class IngestServiceTests extends ESTestCase {
Map<DiscoveryNode, IngestInfo> ingestInfos = new HashMap<>(); Map<DiscoveryNode, IngestInfo> ingestInfos = new HashMap<>();
ingestInfos.put(node1, new IngestInfo(List.of(new ProcessorInfo("set")))); ingestInfos.put(node1, new IngestInfo(List.of(new ProcessorInfo("set"))));
final String name = randomAlphaOfLength(5) + badChar + randomAlphaOfLength(5); final String name = randomAlphaOfLength(5) + badChar + randomAlphaOfLength(5);
ingestService.validatePipeline(ingestInfos, name, pipelineConfig); ingestService.validatePipeline(ingestInfos, projectId, name, pipelineConfig);
assertCriticalWarnings( assertCriticalWarnings(
"Pipeline name [" "Pipeline name ["
+ name + name
@ -1147,7 +1159,7 @@ public class IngestServiceTests extends ESTestCase {
public void testExecuteIndexPipelineExistsButFailedParsing() { public void testExecuteIndexPipelineExistsButFailedParsing() {
IngestService ingestService = createWithProcessors( IngestService ingestService = createWithProcessors(
Map.of("mock", (factories, tag, description, config) -> new AbstractProcessor("mock", "description") { Map.of("mock", (factories, tag, description, config, projectId) -> new AbstractProcessor("mock", "description") {
@Override @Override
public IngestDocument execute(IngestDocument ingestDocument) { public IngestDocument execute(IngestDocument ingestDocument) {
throw new IllegalStateException("error"); throw new IllegalStateException("error");
@ -1213,7 +1225,7 @@ public class IngestServiceTests extends ESTestCase {
public void testExecuteBulkPipelineDoesNotExist() { public void testExecuteBulkPipelineDoesNotExist() {
IngestService ingestService = createWithProcessors( IngestService ingestService = createWithProcessors(
Map.of("mock", (factories, tag, description, config) -> mockCompoundProcessor()) Map.of("mock", (factories, tag, description, config, projectId) -> mockCompoundProcessor())
); );
PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}"); PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}");
@ -1267,7 +1279,7 @@ public class IngestServiceTests extends ESTestCase {
public void testExecuteSuccess() { public void testExecuteSuccess() {
IngestService ingestService = createWithProcessors( IngestService ingestService = createWithProcessors(
Map.of("mock", (factories, tag, description, config) -> mockCompoundProcessor()) Map.of("mock", (factories, tag, description, config, projectId) -> mockCompoundProcessor())
); );
PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}"); PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}");
var projectId = randomProjectIdOrDefault(); var projectId = randomProjectIdOrDefault();
@ -1304,7 +1316,7 @@ public class IngestServiceTests extends ESTestCase {
IngestService ingestService = createWithProcessors( IngestService ingestService = createWithProcessors(
Map.of( Map.of(
"set", "set",
(factories, tag, description, config) -> new FakeProcessor( (factories, tag, description, config, projectId) -> new FakeProcessor(
"set", "set",
"", "",
"", "",
@ -1380,7 +1392,7 @@ public class IngestServiceTests extends ESTestCase {
public void testExecutePropagateAllMetadataUpdates() throws Exception { public void testExecutePropagateAllMetadataUpdates() throws Exception {
final CompoundProcessor processor = mockCompoundProcessor(); final CompoundProcessor processor = mockCompoundProcessor();
IngestService ingestService = createWithProcessors(Map.of("mock", (factories, tag, description, config) -> processor)); IngestService ingestService = createWithProcessors(Map.of("mock", (factories, tag, description, config, projectId) -> processor));
PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}"); PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}");
var projectId = randomProjectIdOrDefault(); var projectId = randomProjectIdOrDefault();
ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT) ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT)
@ -1454,9 +1466,9 @@ public class IngestServiceTests extends ESTestCase {
IngestService ingestService = createWithProcessors( IngestService ingestService = createWithProcessors(
Map.of( Map.of(
"mock", "mock",
(factories, tag, description, config) -> processor, (factories, tag, description, config, projectId) -> processor,
"set", "set",
(factories, tag, description, config) -> new FakeProcessor("set", "", "", (ingestDocument) -> fail()) (factories, tag, description, config, projectId) -> new FakeProcessor("set", "", "", (ingestDocument) -> fail())
) )
); );
PutPipelineRequest putRequest1 = putJsonPipelineRequest("_id1", "{\"processors\": [{\"mock\" : {}}]}"); PutPipelineRequest putRequest1 = putJsonPipelineRequest("_id1", "{\"processors\": [{\"mock\" : {}}]}");
@ -1526,7 +1538,9 @@ public class IngestServiceTests extends ESTestCase {
List.of(processor), List.of(processor),
List.of(new CompoundProcessor(onFailureProcessor)) List.of(new CompoundProcessor(onFailureProcessor))
); );
IngestService ingestService = createWithProcessors(Map.of("mock", (factories, tag, description, config) -> compoundProcessor)); IngestService ingestService = createWithProcessors(
Map.of("mock", (factories, tag, description, config, projectId) -> compoundProcessor)
);
PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}"); PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}");
var projectId = randomProjectIdOrDefault(); var projectId = randomProjectIdOrDefault();
ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT) ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT)
@ -1572,7 +1586,9 @@ public class IngestServiceTests extends ESTestCase {
List.of(processor), List.of(processor),
List.of(new CompoundProcessor(false, processors, onFailureProcessors)) List.of(new CompoundProcessor(false, processors, onFailureProcessors))
); );
IngestService ingestService = createWithProcessors(Map.of("mock", (factories, tag, description, config) -> compoundProcessor)); IngestService ingestService = createWithProcessors(
Map.of("mock", (factories, tag, description, config, projectId) -> compoundProcessor)
);
PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}"); PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}");
var projectId = randomProjectIdOrDefault(); var projectId = randomProjectIdOrDefault();
ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT) ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT)
@ -1650,7 +1666,7 @@ public class IngestServiceTests extends ESTestCase {
handler.accept(null, error); handler.accept(null, error);
return null; return null;
}).when(processor).execute(any(), any()); }).when(processor).execute(any(), any());
IngestService ingestService = createWithProcessors(Map.of("mock", (factories, tag, description, config) -> processor)); IngestService ingestService = createWithProcessors(Map.of("mock", (factories, tag, description, config, projectId) -> processor));
PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}"); PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}");
var projectId = randomProjectIdOrDefault(); var projectId = randomProjectIdOrDefault();
ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT) ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT)
@ -1691,9 +1707,9 @@ public class IngestServiceTests extends ESTestCase {
IngestService ingestService = createWithProcessors( IngestService ingestService = createWithProcessors(
Map.of( Map.of(
"mock", "mock",
(factories, tag, description, config) -> processor, (factories, tag, description, config, projectId) -> processor,
"set", "set",
(factories, tag, description, config) -> new FakeProcessor("set", "", "", (ingestDocument) -> fail()) (factories, tag, description, config, projectId) -> new FakeProcessor("set", "", "", (ingestDocument) -> fail())
) )
); );
PutPipelineRequest putRequest1 = putJsonPipelineRequest("_id1", "{\"processors\": [{\"mock\" : {}}]}"); PutPipelineRequest putRequest1 = putJsonPipelineRequest("_id1", "{\"processors\": [{\"mock\" : {}}]}");
@ -1742,9 +1758,9 @@ public class IngestServiceTests extends ESTestCase {
IngestService ingestService = createWithProcessors( IngestService ingestService = createWithProcessors(
Map.of( Map.of(
"mock", "mock",
(factories, tag, description, config) -> processor, (factories, tag, description, config, projectId) -> processor,
"set", "set",
(factories, tag, description, config) -> new FakeProcessor("set", "", "", (ingestDocument) -> fail()) (factories, tag, description, config, projectId) -> new FakeProcessor("set", "", "", (ingestDocument) -> fail())
) )
); );
PutPipelineRequest putRequest1 = putJsonPipelineRequest("_id1", "{\"processors\": [{\"mock\" : {}}]}"); PutPipelineRequest putRequest1 = putJsonPipelineRequest("_id1", "{\"processors\": [{\"mock\" : {}}]}");
@ -1799,7 +1815,9 @@ public class IngestServiceTests extends ESTestCase {
List.of(processor), List.of(processor),
List.of(new CompoundProcessor(false, processors, onFailureProcessors)) List.of(new CompoundProcessor(false, processors, onFailureProcessors))
); );
IngestService ingestService = createWithProcessors(Map.of("mock", (factories, tag, description, config) -> compoundProcessor)); IngestService ingestService = createWithProcessors(
Map.of("mock", (factories, tag, description, config, projectId) -> compoundProcessor)
);
PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}"); PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}");
var projectId = randomProjectIdOrDefault(); var projectId = randomProjectIdOrDefault();
ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT) ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT)
@ -1875,7 +1893,7 @@ public class IngestServiceTests extends ESTestCase {
handler.accept(null, error); handler.accept(null, error);
return null; return null;
}).when(processor).execute(any(), any()); }).when(processor).execute(any(), any());
IngestService ingestService = createWithProcessors(Map.of("mock", (factories, tag, description, config) -> processor)); IngestService ingestService = createWithProcessors(Map.of("mock", (factories, tag, description, config, projectId) -> processor));
PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}"); PutPipelineRequest putRequest = putJsonPipelineRequest("_id", "{\"processors\": [{\"mock\" : {}}]}");
var projectId = randomProjectIdOrDefault(); var projectId = randomProjectIdOrDefault();
ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT) ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT)
@ -1939,7 +1957,7 @@ public class IngestServiceTests extends ESTestCase {
return null; return null;
}).when(processor).execute(any(), any()); }).when(processor).execute(any(), any());
Map<String, Processor.Factory> map = Maps.newMapWithExpectedSize(2); Map<String, Processor.Factory> map = Maps.newMapWithExpectedSize(2);
map.put("mock", (factories, tag, description, config) -> processor); map.put("mock", (factories, tag, description, config, projectId) -> processor);
IngestService ingestService = createWithProcessors(map); IngestService ingestService = createWithProcessors(map);
PutPipelineRequest putRequest = putJsonPipelineRequest("_id", """ PutPipelineRequest putRequest = putJsonPipelineRequest("_id", """
@ -2007,14 +2025,20 @@ public class IngestServiceTests extends ESTestCase {
IngestService ingestService = createWithProcessors( IngestService ingestService = createWithProcessors(
Map.of( Map.of(
"pipeline", "pipeline",
(factories, tag, description, config) -> new PipelineProcessor(tag, description, (params) -> new TemplateScript(params) { (factories, tag, description, config, projectId) -> new PipelineProcessor(
@Override tag,
public String execute() { description,
return "_id3"; (params) -> new TemplateScript(params) {
} // this pipeline processor will always execute the '_id3' processor @Override
}, false, pipelineIngestService), public String execute() {
return "_id3";
} // this pipeline processor will always execute the '_id3' processor
},
false,
pipelineIngestService
),
"mock", "mock",
(factories, tag, description, config) -> processor (factories, tag, description, config, projectId) -> processor
) )
); );
@ -2116,8 +2140,8 @@ public class IngestServiceTests extends ESTestCase {
return null; return null;
}).when(processorFailure).execute(any(IngestDocument.class), any()); }).when(processorFailure).execute(any(IngestDocument.class), any());
Map<String, Processor.Factory> map = Maps.newMapWithExpectedSize(2); Map<String, Processor.Factory> map = Maps.newMapWithExpectedSize(2);
map.put("mock", (factories, tag, description, config) -> processor); map.put("mock", (factories, tag, description, config, projectId) -> processor);
map.put("failure-mock", (factories, tag, description, config) -> processorFailure); map.put("failure-mock", (factories, tag, description, config, projectId) -> processorFailure);
map.put("drop", new DropProcessor.Factory()); map.put("drop", new DropProcessor.Factory());
IngestService ingestService = createWithProcessors(map); IngestService ingestService = createWithProcessors(map);
@ -2324,7 +2348,7 @@ public class IngestServiceTests extends ESTestCase {
public void testExecuteWithDrop() { public void testExecuteWithDrop() {
Map<String, Processor.Factory> factories = new HashMap<>(); Map<String, Processor.Factory> factories = new HashMap<>();
factories.put("drop", new DropProcessor.Factory()); factories.put("drop", new DropProcessor.Factory());
factories.put("mock", (processorFactories, tag, description, config) -> new Processor() { factories.put("mock", (processorFactories, tag, description, config, projectId) -> new Processor() {
@Override @Override
public IngestDocument execute(final IngestDocument ingestDocument) { public IngestDocument execute(final IngestDocument ingestDocument) {
throw new AssertionError("Document should have been dropped but reached this processor"); throw new AssertionError("Document should have been dropped but reached this processor");
@ -2397,7 +2421,7 @@ public class IngestServiceTests extends ESTestCase {
IngestPlugin testPlugin = new IngestPlugin() { IngestPlugin testPlugin = new IngestPlugin() {
@Override @Override
public Map<String, Processor.Factory> getProcessors(Processor.Parameters parameters) { public Map<String, Processor.Factory> getProcessors(Processor.Parameters parameters) {
return Map.of("test", (factories, tag, description, config) -> { return Map.of("test", (factories, tag, description, config, projectId) -> {
assertThat(counter.compareAndSet(1, 2), is(true)); assertThat(counter.compareAndSet(1, 2), is(true));
return new FakeProcessor("test", tag, description, ingestDocument -> {}); return new FakeProcessor("test", tag, description, ingestDocument -> {});
}); });
@ -2438,7 +2462,7 @@ public class IngestServiceTests extends ESTestCase {
AtomicReference<Object> reference = new AtomicReference<>(); AtomicReference<Object> reference = new AtomicReference<>();
Consumer<IngestDocument> executor = doc -> reference.set(doc.getFieldValueAsBytes("data")); Consumer<IngestDocument> executor = doc -> reference.set(doc.getFieldValueAsBytes("data"));
final IngestService ingestService = createWithProcessors( final IngestService ingestService = createWithProcessors(
Map.of("foo", (factories, tag, description, config) -> new FakeProcessor("foo", tag, description, executor)) Map.of("foo", (factories, tag, description, config, projectId) -> new FakeProcessor("foo", tag, description, executor))
); );
var projectId = randomProjectIdOrDefault(); var projectId = randomProjectIdOrDefault();
@ -2481,9 +2505,9 @@ public class IngestServiceTests extends ESTestCase {
IngestService ingestService = createWithProcessors( IngestService ingestService = createWithProcessors(
Map.of( Map.of(
"mock", "mock",
(factories, tag, description, config) -> mockCompoundProcessor(), (factories, tag, description, config, projectId) -> mockCompoundProcessor(),
"set", "set",
(factories, tag, description, config) -> new FakeProcessor( (factories, tag, description, config, projectId) -> new FakeProcessor(
"set", "set",
tag, tag,
description, description,
@ -3206,12 +3230,12 @@ public class IngestServiceTests extends ESTestCase {
private static IngestService createWithProcessors() { private static IngestService createWithProcessors() {
Map<String, Processor.Factory> processors = new HashMap<>(); Map<String, Processor.Factory> processors = new HashMap<>();
processors.put("set", (factories, tag, description, config) -> { processors.put("set", (factories, tag, description, config, projectId) -> {
String field = (String) config.remove("field"); String field = (String) config.remove("field");
String value = (String) config.remove("value"); String value = (String) config.remove("value");
return new FakeProcessor("set", tag, description, (ingestDocument) -> ingestDocument.setFieldValue(field, value)); return new FakeProcessor("set", tag, description, (ingestDocument) -> ingestDocument.setFieldValue(field, value));
}); });
processors.put("remove", (factories, tag, description, config) -> { processors.put("remove", (factories, tag, description, config, projectId) -> {
String field = (String) config.remove("field"); String field = (String) config.remove("field");
return new WrappingProcessorImpl("remove", tag, description, (ingestDocument -> ingestDocument.removeField(field))) { return new WrappingProcessorImpl("remove", tag, description, (ingestDocument -> ingestDocument.removeField(field))) {
}; };

View file

@ -10,6 +10,7 @@
package org.elasticsearch.ingest; package org.elasticsearch.ingest;
import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.core.Tuple; import org.elasticsearch.core.Tuple;
import org.elasticsearch.script.ScriptService; import org.elasticsearch.script.ScriptService;
import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.ESTestCase;
@ -26,6 +27,7 @@ import static org.mockito.Mockito.mock;
public class PipelineFactoryTests extends ESTestCase { public class PipelineFactoryTests extends ESTestCase {
private final ProjectId projectId = randomProjectIdOrDefault();
private final Integer version = randomBoolean() ? randomInt() : null; private final Integer version = randomBoolean() ? randomInt() : null;
private final String versionString = version != null ? Integer.toString(version) : null; private final String versionString = version != null ? Integer.toString(version) : null;
private final ScriptService scriptService = mock(ScriptService.class); private final ScriptService scriptService = mock(ScriptService.class);
@ -45,7 +47,7 @@ public class PipelineFactoryTests extends ESTestCase {
pipelineConfig.put(Pipeline.DEPRECATED_KEY, deprecated); pipelineConfig.put(Pipeline.DEPRECATED_KEY, deprecated);
pipelineConfig.put(Pipeline.PROCESSORS_KEY, List.of(Map.of("test", processorConfig0), Map.of("test", processorConfig1))); pipelineConfig.put(Pipeline.PROCESSORS_KEY, List.of(Map.of("test", processorConfig0), Map.of("test", processorConfig1)));
Map<String, Processor.Factory> processorRegistry = Map.of("test", new TestProcessor.Factory()); Map<String, Processor.Factory> processorRegistry = Map.of("test", new TestProcessor.Factory());
Pipeline pipeline = Pipeline.create("_id", pipelineConfig, processorRegistry, scriptService); Pipeline pipeline = Pipeline.create("_id", pipelineConfig, processorRegistry, scriptService, null);
assertThat(pipeline.getId(), equalTo("_id")); assertThat(pipeline.getId(), equalTo("_id"));
assertThat(pipeline.getDescription(), equalTo("_description")); assertThat(pipeline.getDescription(), equalTo("_description"));
assertThat(pipeline.getVersion(), equalTo(version)); assertThat(pipeline.getVersion(), equalTo(version));
@ -65,7 +67,7 @@ public class PipelineFactoryTests extends ESTestCase {
pipelineConfig.put(Pipeline.META_KEY, metadata); pipelineConfig.put(Pipeline.META_KEY, metadata);
} }
try { try {
Pipeline.create("_id", pipelineConfig, Map.of(), scriptService); Pipeline.create("_id", pipelineConfig, Map.of(), scriptService, null);
fail("should fail, missing required [processors] field"); fail("should fail, missing required [processors] field");
} catch (ElasticsearchParseException e) { } catch (ElasticsearchParseException e) {
assertThat(e.getMessage(), equalTo("[processors] required property is missing")); assertThat(e.getMessage(), equalTo("[processors] required property is missing"));
@ -80,7 +82,7 @@ public class PipelineFactoryTests extends ESTestCase {
pipelineConfig.put(Pipeline.META_KEY, metadata); pipelineConfig.put(Pipeline.META_KEY, metadata);
} }
pipelineConfig.put(Pipeline.PROCESSORS_KEY, List.of()); pipelineConfig.put(Pipeline.PROCESSORS_KEY, List.of());
Pipeline pipeline = Pipeline.create("_id", pipelineConfig, null, scriptService); Pipeline pipeline = Pipeline.create("_id", pipelineConfig, null, scriptService, null);
assertThat(pipeline.getId(), equalTo("_id")); assertThat(pipeline.getId(), equalTo("_id"));
assertThat(pipeline.getDescription(), equalTo("_description")); assertThat(pipeline.getDescription(), equalTo("_description"));
assertThat(pipeline.getVersion(), equalTo(version)); assertThat(pipeline.getVersion(), equalTo(version));
@ -98,7 +100,7 @@ public class PipelineFactoryTests extends ESTestCase {
pipelineConfig.put(Pipeline.PROCESSORS_KEY, List.of(Map.of("test", processorConfig))); pipelineConfig.put(Pipeline.PROCESSORS_KEY, List.of(Map.of("test", processorConfig)));
pipelineConfig.put(Pipeline.ON_FAILURE_KEY, List.of(Map.of("test", processorConfig))); pipelineConfig.put(Pipeline.ON_FAILURE_KEY, List.of(Map.of("test", processorConfig)));
Map<String, Processor.Factory> processorRegistry = Map.of("test", new TestProcessor.Factory()); Map<String, Processor.Factory> processorRegistry = Map.of("test", new TestProcessor.Factory());
Pipeline pipeline = Pipeline.create("_id", pipelineConfig, processorRegistry, scriptService); Pipeline pipeline = Pipeline.create("_id", pipelineConfig, processorRegistry, scriptService, null);
assertThat(pipeline.getId(), equalTo("_id")); assertThat(pipeline.getId(), equalTo("_id"));
assertThat(pipeline.getDescription(), equalTo("_description")); assertThat(pipeline.getDescription(), equalTo("_description"));
assertThat(pipeline.getVersion(), equalTo(version)); assertThat(pipeline.getVersion(), equalTo(version));
@ -121,7 +123,7 @@ public class PipelineFactoryTests extends ESTestCase {
Map<String, Processor.Factory> processorRegistry = Map.of("test", new TestProcessor.Factory()); Map<String, Processor.Factory> processorRegistry = Map.of("test", new TestProcessor.Factory());
Exception e = expectThrows( Exception e = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> Pipeline.create("_id", pipelineConfig, processorRegistry, scriptService) () -> Pipeline.create("_id", pipelineConfig, processorRegistry, scriptService, null)
); );
assertThat(e.getMessage(), equalTo("pipeline [_id] cannot have an empty on_failure option defined")); assertThat(e.getMessage(), equalTo("pipeline [_id] cannot have an empty on_failure option defined"));
} }
@ -139,7 +141,7 @@ public class PipelineFactoryTests extends ESTestCase {
Map<String, Processor.Factory> processorRegistry = Map.of("test", new TestProcessor.Factory()); Map<String, Processor.Factory> processorRegistry = Map.of("test", new TestProcessor.Factory());
Exception e = expectThrows( Exception e = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> Pipeline.create("_id", pipelineConfig, processorRegistry, scriptService) () -> Pipeline.create("_id", pipelineConfig, processorRegistry, scriptService, null)
); );
assertThat(e.getMessage(), equalTo("[on_failure] processors list cannot be empty")); assertThat(e.getMessage(), equalTo("[on_failure] processors list cannot be empty"));
} }
@ -157,7 +159,7 @@ public class PipelineFactoryTests extends ESTestCase {
} }
pipelineConfig.put(Pipeline.PROCESSORS_KEY, List.of(Map.of("test", processorConfig))); pipelineConfig.put(Pipeline.PROCESSORS_KEY, List.of(Map.of("test", processorConfig)));
Pipeline pipeline = Pipeline.create("_id", pipelineConfig, processorRegistry, scriptService); Pipeline pipeline = Pipeline.create("_id", pipelineConfig, processorRegistry, scriptService, null);
assertThat(pipeline.getId(), equalTo("_id")); assertThat(pipeline.getId(), equalTo("_id"));
assertThat(pipeline.getDescription(), equalTo("_description")); assertThat(pipeline.getDescription(), equalTo("_description"));
assertThat(pipeline.getVersion(), equalTo(version)); assertThat(pipeline.getVersion(), equalTo(version));
@ -182,7 +184,7 @@ public class PipelineFactoryTests extends ESTestCase {
Map<String, Processor.Factory> processorRegistry = Map.of("test", new TestProcessor.Factory()); Map<String, Processor.Factory> processorRegistry = Map.of("test", new TestProcessor.Factory());
Exception e = expectThrows( Exception e = expectThrows(
ElasticsearchParseException.class, ElasticsearchParseException.class,
() -> Pipeline.create("_id", pipelineConfig, processorRegistry, scriptService) () -> Pipeline.create("_id", pipelineConfig, processorRegistry, scriptService, null)
); );
assertThat(e.getMessage(), equalTo("processor [test] doesn't support one or more provided configuration parameters [unused]")); assertThat(e.getMessage(), equalTo("processor [test] doesn't support one or more provided configuration parameters [unused]"));
} }
@ -199,7 +201,7 @@ public class PipelineFactoryTests extends ESTestCase {
} }
pipelineConfig.put(Pipeline.PROCESSORS_KEY, List.of(Map.of("test", processorConfig))); pipelineConfig.put(Pipeline.PROCESSORS_KEY, List.of(Map.of("test", processorConfig)));
Map<String, Processor.Factory> processorRegistry = Map.of("test", new TestProcessor.Factory()); Map<String, Processor.Factory> processorRegistry = Map.of("test", new TestProcessor.Factory());
Pipeline pipeline = Pipeline.create("_id", pipelineConfig, processorRegistry, scriptService); Pipeline pipeline = Pipeline.create("_id", pipelineConfig, processorRegistry, scriptService, null);
assertThat(pipeline.getId(), equalTo("_id")); assertThat(pipeline.getId(), equalTo("_id"));
assertThat(pipeline.getDescription(), equalTo("_description")); assertThat(pipeline.getDescription(), equalTo("_description"));
assertThat(pipeline.getVersion(), equalTo(version)); assertThat(pipeline.getVersion(), equalTo(version));

View file

@ -61,7 +61,7 @@ public class PipelineProcessorTests extends ESTestCase {
PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService); PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("name", pipelineId); config.put("name", pipelineId);
factory.create(Map.of(), null, null, config).execute(testIngestDocument, (result, e) -> {}); factory.create(Map.of(), null, null, config, null).execute(testIngestDocument, (result, e) -> {});
assertIngestDocument(testIngestDocument, safeGet(invoked)); assertIngestDocument(testIngestDocument, safeGet(invoked));
} }
@ -72,7 +72,7 @@ public class PipelineProcessorTests extends ESTestCase {
Map<String, Object> config = new HashMap<>(); Map<String, Object> config = new HashMap<>();
config.put("name", "missingPipelineId"); config.put("name", "missingPipelineId");
IllegalStateException[] e = new IllegalStateException[1]; IllegalStateException[] e = new IllegalStateException[1];
factory.create(Map.of(), null, null, config).execute(testIngestDocument, (result, e1) -> e[0] = (IllegalStateException) e1); factory.create(Map.of(), null, null, config, null).execute(testIngestDocument, (result, e1) -> e[0] = (IllegalStateException) e1);
assertEquals("Pipeline processor configured for non-existent pipeline [missingPipelineId]", e[0].getMessage()); assertEquals("Pipeline processor configured for non-existent pipeline [missingPipelineId]", e[0].getMessage());
} }
@ -86,7 +86,7 @@ public class PipelineProcessorTests extends ESTestCase {
var r = new IngestDocument[1]; var r = new IngestDocument[1];
var e = new Exception[1]; var e = new Exception[1];
var processor = factory.create(Map.of(), null, null, config); var processor = factory.create(Map.of(), null, null, config, null);
processor.execute(testIngestDocument, (result, e1) -> { processor.execute(testIngestDocument, (result, e1) -> {
r[0] = result; r[0] = result;
e[0] = e1; e[0] = e1;
@ -108,7 +108,7 @@ public class PipelineProcessorTests extends ESTestCase {
null, null,
null, null,
null, null,
new CompoundProcessor(factory.create(Map.of(), null, null, outerConfig)) new CompoundProcessor(factory.create(Map.of(), null, null, outerConfig, null))
); );
Map<String, Object> innerConfig = new HashMap<>(); Map<String, Object> innerConfig = new HashMap<>();
innerConfig.put("name", outerPipelineId); innerConfig.put("name", outerPipelineId);
@ -117,13 +117,14 @@ public class PipelineProcessorTests extends ESTestCase {
null, null,
null, null,
null, null,
new CompoundProcessor(factory.create(Map.of(), null, null, innerConfig)) new CompoundProcessor(factory.create(Map.of(), null, null, innerConfig, null))
); );
when(ingestService.getPipeline(outerPipelineId)).thenReturn(outer); when(ingestService.getPipeline(outerPipelineId)).thenReturn(outer);
when(ingestService.getPipeline(innerPipelineId)).thenReturn(inner); when(ingestService.getPipeline(innerPipelineId)).thenReturn(inner);
outerConfig.put("name", innerPipelineId); outerConfig.put("name", innerPipelineId);
ElasticsearchException[] e = new ElasticsearchException[1]; ElasticsearchException[] e = new ElasticsearchException[1];
factory.create(Map.of(), null, null, outerConfig).execute(testIngestDocument, (result, e1) -> e[0] = (ElasticsearchException) e1); factory.create(Map.of(), null, null, outerConfig, null)
.execute(testIngestDocument, (result, e1) -> e[0] = (ElasticsearchException) e1);
assertEquals("Cycle detected for pipeline: inner", e[0].getRootCause().getMessage()); assertEquals("Cycle detected for pipeline: inner", e[0].getRootCause().getMessage());
} }
@ -136,7 +137,7 @@ public class PipelineProcessorTests extends ESTestCase {
PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService); PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
Pipeline inner = new Pipeline(innerPipelineId, null, null, null, new CompoundProcessor()); Pipeline inner = new Pipeline(innerPipelineId, null, null, null, new CompoundProcessor());
when(ingestService.getPipeline(innerPipelineId)).thenReturn(inner); when(ingestService.getPipeline(innerPipelineId)).thenReturn(inner);
Processor outerProc = factory.create(Map.of(), null, null, outerConfig); Processor outerProc = factory.create(Map.of(), null, null, outerConfig, null);
outerProc.execute(testIngestDocument, (result, e) -> {}); outerProc.execute(testIngestDocument, (result, e) -> {});
outerProc.execute(testIngestDocument, (result, e) -> {}); outerProc.execute(testIngestDocument, (result, e) -> {});
} }
@ -150,11 +151,11 @@ public class PipelineProcessorTests extends ESTestCase {
Map<String, Object> pipeline1ProcessorConfig = new HashMap<>(); Map<String, Object> pipeline1ProcessorConfig = new HashMap<>();
pipeline1ProcessorConfig.put("name", pipeline2Id); pipeline1ProcessorConfig.put("name", pipeline2Id);
PipelineProcessor pipeline1Processor = factory.create(Map.of(), null, null, pipeline1ProcessorConfig); PipelineProcessor pipeline1Processor = factory.create(Map.of(), null, null, pipeline1ProcessorConfig, null);
Map<String, Object> pipeline2ProcessorConfig = new HashMap<>(); Map<String, Object> pipeline2ProcessorConfig = new HashMap<>();
pipeline2ProcessorConfig.put("name", pipeline3Id); pipeline2ProcessorConfig.put("name", pipeline3Id);
PipelineProcessor pipeline2Processor = factory.create(Map.of(), null, null, pipeline2ProcessorConfig); PipelineProcessor pipeline2Processor = factory.create(Map.of(), null, null, pipeline2ProcessorConfig, null);
LongSupplier relativeTimeProvider = mock(LongSupplier.class); LongSupplier relativeTimeProvider = mock(LongSupplier.class);
when(relativeTimeProvider.getAsLong()).thenReturn(0L); when(relativeTimeProvider.getAsLong()).thenReturn(0L);

View file

@ -12,6 +12,7 @@ package org.elasticsearch.ingest;
import org.elasticsearch.action.bulk.FailureStoreMetrics; import org.elasticsearch.action.bulk.FailureStoreMetrics;
import org.elasticsearch.action.bulk.SimulateBulkRequest; import org.elasticsearch.action.bulk.SimulateBulkRequest;
import org.elasticsearch.client.internal.Client; import org.elasticsearch.client.internal.Client;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.cluster.project.TestProjectResolvers; import org.elasticsearch.cluster.project.TestProjectResolvers;
import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesArray;
@ -48,21 +49,21 @@ public class SimulateIngestServiceTests extends ESTestCase {
Map<String, Processor.Factory> processors = new HashMap<>(); Map<String, Processor.Factory> processors = new HashMap<>();
processors.put( processors.put(
"processor1", "processor1",
(factories, tag, description, config) -> new FakeProcessor("processor1", tag, description, ingestDocument -> {}) { (factories, tag, description, config, projectId) -> new FakeProcessor("processor1", tag, description, ingestDocument -> {}) {
} }
); );
processors.put( processors.put(
"processor2", "processor2",
(factories, tag, description, config) -> new FakeProcessor("processor2", tag, description, ingestDocument -> {}) { (factories, tag, description, config, projectId) -> new FakeProcessor("processor2", tag, description, ingestDocument -> {}) {
} }
); );
processors.put( processors.put(
"processor3", "processor3",
(factories, tag, description, config) -> new FakeProcessor("processor3", tag, description, ingestDocument -> {}) { (factories, tag, description, config, projectId) -> new FakeProcessor("processor3", tag, description, ingestDocument -> {}) {
} }
); );
IngestService ingestService = createWithProcessors(processors);
final var projectId = randomProjectIdOrDefault(); final var projectId = randomProjectIdOrDefault();
IngestService ingestService = createWithProcessors(projectId, processors);
ingestService.innerUpdatePipelines(projectId, ingestMetadata); ingestService.innerUpdatePipelines(projectId, ingestMetadata);
{ {
// First we make sure that if there are no substitutions that we get our original pipeline back: // First we make sure that if there are no substitutions that we get our original pipeline back:
@ -113,7 +114,7 @@ public class SimulateIngestServiceTests extends ESTestCase {
} }
} }
private static IngestService createWithProcessors(Map<String, Processor.Factory> processors) { private static IngestService createWithProcessors(ProjectId projectId, Map<String, Processor.Factory> processors) {
Client client = mock(Client.class); Client client = mock(Client.class);
ThreadPool threadPool = mock(ThreadPool.class); ThreadPool threadPool = mock(ThreadPool.class);
when(threadPool.generic()).thenReturn(EsExecutors.DIRECT_EXECUTOR_SERVICE); when(threadPool.generic()).thenReturn(EsExecutors.DIRECT_EXECUTOR_SERVICE);
@ -134,7 +135,7 @@ public class SimulateIngestServiceTests extends ESTestCase {
client, client,
null, null,
FailureStoreMetrics.NOOP, FailureStoreMetrics.NOOP,
TestProjectResolvers.singleProjectOnly() TestProjectResolvers.singleProject(projectId)
); );
} }
} }

View file

@ -306,7 +306,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
}))); })));
when(ingestService.getPipeline(pipelineId)).thenReturn(pipeline); when(ingestService.getPipeline(pipelineId)).thenReturn(pipeline);
PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, pipelineConfig); PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, pipelineConfig, null);
CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor); CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor);
CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList); CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList);
@ -375,7 +375,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
null, null,
new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, scriptName, Map.of()), new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, scriptName, Map.of()),
scriptService, scriptService,
factory.create(Map.of(), "pipeline1", null, pipelineConfig2) factory.create(Map.of(), "pipeline1", null, pipelineConfig2, null)
), ),
new TestProcessor(ingestDocument -> { new TestProcessor(ingestDocument -> {
ingestDocument.setFieldValue(key3, randomInt()); ingestDocument.setFieldValue(key3, randomInt());
@ -389,7 +389,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
when(ingestService.getPipeline(pipelineId1)).thenReturn(pipeline1); when(ingestService.getPipeline(pipelineId1)).thenReturn(pipeline1);
when(ingestService.getPipeline(pipelineId2)).thenReturn(pipeline2); when(ingestService.getPipeline(pipelineId2)).thenReturn(pipeline2);
PipelineProcessor pipelineProcessor = factory.create(Map.of(), "pipeline0", null, pipelineConfig0); PipelineProcessor pipelineProcessor = factory.create(Map.of(), "pipeline0", null, pipelineConfig0, null);
CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor); CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor);
CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList); CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList);
@ -468,7 +468,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
null, null,
new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, scriptName, Map.of()), new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, scriptName, Map.of()),
scriptService, scriptService,
factory.create(Map.of(), null, null, pipelineConfig2) factory.create(Map.of(), null, null, pipelineConfig2, null)
), ),
new TestProcessor(ingestDocument -> { new TestProcessor(ingestDocument -> {
ingestDocument.setFieldValue(key3, randomInt()); ingestDocument.setFieldValue(key3, randomInt());
@ -482,7 +482,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
when(ingestService.getPipeline(pipelineId1)).thenReturn(pipeline1); when(ingestService.getPipeline(pipelineId1)).thenReturn(pipeline1);
when(ingestService.getPipeline(pipelineId2)).thenReturn(pipeline2); when(ingestService.getPipeline(pipelineId2)).thenReturn(pipeline2);
PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, pipelineConfig0); PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, pipelineConfig0, null);
CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor); CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor);
CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList); CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList);
@ -545,7 +545,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
)); ));
when(ingestService.getPipeline(pipelineId)).thenReturn(pipeline); when(ingestService.getPipeline(pipelineId)).thenReturn(pipeline);
PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, pipelineConfig); PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, pipelineConfig, null);
CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor); CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor);
CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList); CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList);
@ -608,7 +608,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
); );
when(ingestService.getPipeline(pipelineId)).thenReturn(pipeline); when(ingestService.getPipeline(pipelineId)).thenReturn(pipeline);
PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, pipelineConfig); PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, pipelineConfig, null);
CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor); CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor);
CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList); CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList);
@ -650,7 +650,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
null, null,
null, null,
null, null,
new CompoundProcessor(factory.create(Map.of(), null, null, pipelineConfig2)) new CompoundProcessor(factory.create(Map.of(), null, null, pipelineConfig2, null))
); );
Pipeline pipeline2 = new Pipeline( Pipeline pipeline2 = new Pipeline(
@ -658,13 +658,13 @@ public class TrackingResultProcessorTests extends ESTestCase {
null, null,
null, null,
null, null,
new CompoundProcessor(factory.create(Map.of(), null, null, pipelineConfig1)) new CompoundProcessor(factory.create(Map.of(), null, null, pipelineConfig1, null))
); );
when(ingestService.getPipeline(pipelineId1)).thenReturn(pipeline1); when(ingestService.getPipeline(pipelineId1)).thenReturn(pipeline1);
when(ingestService.getPipeline(pipelineId2)).thenReturn(pipeline2); when(ingestService.getPipeline(pipelineId2)).thenReturn(pipeline2);
PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, pipelineConfig0); PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, pipelineConfig0, null);
CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor); CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor);
CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList); CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList);
@ -694,7 +694,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
null, null,
null, null,
null, null,
new CompoundProcessor(factory.create(Map.of(), null, null, nextPipelineConfig)) new CompoundProcessor(factory.create(Map.of(), null, null, nextPipelineConfig, null))
); );
when(ingestService.getPipeline(pipelineId)).thenReturn(pipeline); when(ingestService.getPipeline(pipelineId)).thenReturn(pipeline);
} }
@ -708,7 +708,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
String firstPipelineId = "pipeline0"; String firstPipelineId = "pipeline0";
Map<String, Object> firstPipelineConfig = new HashMap<>(); Map<String, Object> firstPipelineConfig = new HashMap<>();
firstPipelineConfig.put("name", firstPipelineId); firstPipelineConfig.put("name", firstPipelineId);
PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, firstPipelineConfig); PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, firstPipelineConfig, null);
CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor); CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor);
CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList); CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList);
@ -747,7 +747,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
null, null,
null, null,
null, null,
new CompoundProcessor(factory.create(Map.of(), null, null, nextPipelineConfig)) new CompoundProcessor(factory.create(Map.of(), null, null, nextPipelineConfig, null))
); );
when(ingestService.getPipeline(pipelineId)).thenReturn(pipeline); when(ingestService.getPipeline(pipelineId)).thenReturn(pipeline);
} }
@ -761,7 +761,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
String firstPipelineId = "pipeline0"; String firstPipelineId = "pipeline0";
Map<String, Object> firstPipelineConfig = new HashMap<>(); Map<String, Object> firstPipelineConfig = new HashMap<>();
firstPipelineConfig.put("name", firstPipelineId); firstPipelineConfig.put("name", firstPipelineId);
PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, firstPipelineConfig); PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, firstPipelineConfig, null);
CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor); CompoundProcessor actualProcessor = new CompoundProcessor(pipelineProcessor);
CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList); CompoundProcessor trackingProcessor = decorate(actualProcessor, null, resultList);
@ -789,7 +789,7 @@ public class TrackingResultProcessorTests extends ESTestCase {
PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService); PipelineProcessor.Factory factory = new PipelineProcessor.Factory(ingestService);
String key1 = randomAlphaOfLength(10); String key1 = randomAlphaOfLength(10);
PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, pipelineConfig); PipelineProcessor pipelineProcessor = factory.create(Map.of(), null, null, pipelineConfig, null);
Pipeline pipeline = new Pipeline(pipelineId, null, null, null, new CompoundProcessor(new TestProcessor(ingestDocument -> { Pipeline pipeline = new Pipeline(pipelineId, null, null, null, new CompoundProcessor(new TestProcessor(ingestDocument -> {
ingestDocument.setFieldValue(key1, randomInt()); ingestDocument.setFieldValue(key1, randomInt());
}))); })));

View file

@ -20,7 +20,7 @@ import java.util.Map;
public class IngestTestPlugin extends Plugin implements IngestPlugin { public class IngestTestPlugin extends Plugin implements IngestPlugin {
@Override @Override
public Map<String, Processor.Factory> getProcessors(Processor.Parameters parameters) { public Map<String, Processor.Factory> getProcessors(Processor.Parameters parameters) {
return Map.of("test", (factories, tag, description, config) -> new TestProcessor("id", "test", "description", doc -> { return Map.of("test", (factories, tag, description, config, projectId) -> new TestProcessor("id", "test", "description", doc -> {
doc.setFieldValue("processed", true); doc.setFieldValue("processed", true);
if (doc.hasField("fail") && doc.getFieldValue("fail", Boolean.class)) { if (doc.hasField("fail") && doc.getFieldValue("fail", Boolean.class)) {
throw new IllegalArgumentException("test processor failed"); throw new IllegalArgumentException("test processor failed");

View file

@ -9,6 +9,8 @@
package org.elasticsearch.ingest; package org.elasticsearch.ingest;
import org.elasticsearch.cluster.metadata.ProjectId;
import java.util.Map; import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
@ -102,7 +104,8 @@ public class TestProcessor implements Processor {
Map<String, Processor.Factory> registry, Map<String, Processor.Factory> registry,
String processorTag, String processorTag,
String description, String description,
Map<String, Object> config Map<String, Object> config,
ProjectId projectId
) throws Exception { ) throws Exception {
return new TestProcessor(processorTag, "test-processor", description, ingestDocument -> {}); return new TestProcessor(processorTag, "test-processor", description, ingestDocument -> {});
} }

View file

@ -599,7 +599,8 @@ public class SourceDestValidatorTests extends ESTestCase {
Arrays.asList(Collections.singletonMap("test", processorConfig0), Collections.singletonMap("test", processorConfig1)) Arrays.asList(Collections.singletonMap("test", processorConfig0), Collections.singletonMap("test", processorConfig1))
); );
Map<String, Processor.Factory> processorRegistry = Collections.singletonMap("test", new TestProcessor.Factory()); Map<String, Processor.Factory> processorRegistry = Collections.singletonMap("test", new TestProcessor.Factory());
Pipeline pipeline = Pipeline.create("missing-pipeline", pipelineConfig, processorRegistry, null); var projectId = randomProjectIdOrDefault();
Pipeline pipeline = Pipeline.create("missing-pipeline", pipelineConfig, processorRegistry, null, projectId);
when(ingestService.getPipeline("missing-pipeline")).thenReturn(pipeline); when(ingestService.getPipeline("missing-pipeline")).thenReturn(pipeline);
assertValidation( assertValidation(

View file

@ -13,6 +13,7 @@ import org.elasticsearch.common.cache.Cache;
import org.elasticsearch.common.cache.CacheBuilder; import org.elasticsearch.common.cache.CacheBuilder;
import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.util.Maps; import org.elasticsearch.common.util.Maps;
import org.elasticsearch.core.FixForMultiProject;
import org.elasticsearch.core.TimeValue; import org.elasticsearch.core.TimeValue;
import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHit;
import org.elasticsearch.xpack.core.enrich.action.EnrichStatsAction; import org.elasticsearch.xpack.core.enrich.action.EnrichStatsAction;
@ -89,6 +90,7 @@ public final class EnrichCache {
* @param searchResponseFetcher The function used to compute the value to be put in the cache, if there is no value in the cache already * @param searchResponseFetcher The function used to compute the value to be put in the cache, if there is no value in the cache already
* @param listener A listener to be notified of the value in the cache * @param listener A listener to be notified of the value in the cache
*/ */
@FixForMultiProject(description = "The enrich cache will currently leak data between projects. We need to either disable or fix it.")
public void computeIfAbsent( public void computeIfAbsent(
String enrichIndex, String enrichIndex,
Object lookupValue, Object lookupValue,

View file

@ -18,6 +18,7 @@ import org.elasticsearch.action.admin.cluster.node.tasks.get.GetTaskRequest;
import org.elasticsearch.action.admin.cluster.node.tasks.get.GetTaskResponse; import org.elasticsearch.action.admin.cluster.node.tasks.get.GetTaskResponse;
import org.elasticsearch.client.internal.Client; import org.elasticsearch.client.internal.Client;
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.util.concurrent.EsRejectedExecutionException; import org.elasticsearch.common.util.concurrent.EsRejectedExecutionException;
@ -115,19 +116,20 @@ public class EnrichPolicyExecutor {
} }
public void runPolicyLocally( public void runPolicyLocally(
ProjectId projectId,
ExecuteEnrichPolicyTask task, ExecuteEnrichPolicyTask task,
String policyName, String policyName,
String enrichIndexName, String enrichIndexName,
ActionListener<ExecuteEnrichPolicyStatus> listener ActionListener<ExecuteEnrichPolicyStatus> listener
) { ) {
try { try {
EnrichPolicy policy = EnrichStore.getPolicy(policyName, clusterService.state().metadata().getProject()); EnrichPolicy policy = EnrichStore.getPolicy(policyName, clusterService.state().metadata().getProject(projectId));
if (policy == null) { if (policy == null) {
throw new ResourceNotFoundException("policy [{}] does not exist", policyName); throw new ResourceNotFoundException("policy [{}] does not exist", policyName);
} }
task.setStatus(new ExecuteEnrichPolicyStatus(ExecuteEnrichPolicyStatus.PolicyPhases.SCHEDULED)); task.setStatus(new ExecuteEnrichPolicyStatus(ExecuteEnrichPolicyStatus.PolicyPhases.SCHEDULED));
var policyRunner = createPolicyRunner(policyName, policy, enrichIndexName, task); var policyRunner = createPolicyRunner(projectId, policyName, policy, enrichIndexName, task);
threadPool.executor(ThreadPool.Names.GENERIC) threadPool.executor(ThreadPool.Names.GENERIC)
.execute(ActionRunnable.wrap(ActionListener.assertOnce(listener), policyRunner::run)); .execute(ActionRunnable.wrap(ActionListener.assertOnce(listener), policyRunner::run));
} catch (Exception e) { } catch (Exception e) {
@ -209,12 +211,14 @@ public class EnrichPolicyExecutor {
} }
private EnrichPolicyRunner createPolicyRunner( private EnrichPolicyRunner createPolicyRunner(
ProjectId projectId,
String policyName, String policyName,
EnrichPolicy policy, EnrichPolicy policy,
String enrichIndexName, String enrichIndexName,
ExecuteEnrichPolicyTask task ExecuteEnrichPolicyTask task
) { ) {
return new EnrichPolicyRunner( return new EnrichPolicyRunner(
projectId,
policyName, policyName,
policy, policy,
task, task,

View file

@ -12,7 +12,7 @@ import org.elasticsearch.action.ingest.PutPipelineRequest;
import org.elasticsearch.action.ingest.PutPipelineTransportAction; import org.elasticsearch.action.ingest.PutPipelineTransportAction;
import org.elasticsearch.action.support.master.AcknowledgedResponse; import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.internal.Client; import org.elasticsearch.client.internal.Client;
import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.ProjectMetadata;
import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.ingest.IngestMetadata; import org.elasticsearch.ingest.IngestMetadata;
import org.elasticsearch.ingest.PipelineConfiguration; import org.elasticsearch.ingest.PipelineConfiguration;
@ -47,11 +47,11 @@ public class EnrichPolicyReindexPipeline {
/** /**
* Checks if the current version of the pipeline definition is installed in the cluster * Checks if the current version of the pipeline definition is installed in the cluster
* @param clusterState The cluster state to check * @param project The project metadata to check
* @return true if a pipeline exists that is compatible with this version of Enrich, false otherwise * @return true if a pipeline exists that is compatible with this version of Enrich, false otherwise
*/ */
static boolean exists(ClusterState clusterState) { static boolean exists(ProjectMetadata project) {
final IngestMetadata ingestMetadata = clusterState.getMetadata().getProject().custom(IngestMetadata.TYPE); final IngestMetadata ingestMetadata = project.custom(IngestMetadata.TYPE);
// we ensure that we both have the pipeline and its version represents the current (or later) version // we ensure that we both have the pipeline and its version represents the current (or later) version
if (ingestMetadata != null) { if (ingestMetadata != null) {
final PipelineConfiguration pipeline = ingestMetadata.getPipelines().get(pipelineName()); final PipelineConfiguration pipeline = ingestMetadata.getPipelines().get(pipelineName());

View file

@ -40,10 +40,11 @@ import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.internal.Client; import org.elasticsearch.client.internal.Client;
import org.elasticsearch.client.internal.FilterClient; import org.elasticsearch.client.internal.FilterClient;
import org.elasticsearch.client.internal.OriginSettingClient; import org.elasticsearch.client.internal.OriginSettingClient;
import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.cluster.metadata.IndexMetadata;
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
import org.elasticsearch.cluster.metadata.MappingMetadata; import org.elasticsearch.cluster.metadata.MappingMetadata;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.cluster.metadata.ProjectMetadata;
import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
import org.elasticsearch.common.UUIDs; import org.elasticsearch.common.UUIDs;
@ -102,6 +103,7 @@ public class EnrichPolicyRunner {
*/ */
static final TimeValue ENRICH_MASTER_REQUEST_TIMEOUT = TimeValue.THIRTY_SECONDS; static final TimeValue ENRICH_MASTER_REQUEST_TIMEOUT = TimeValue.THIRTY_SECONDS;
private final ProjectId projectId;
private final String policyName; private final String policyName;
private final EnrichPolicy policy; private final EnrichPolicy policy;
private final ExecuteEnrichPolicyTask task; private final ExecuteEnrichPolicyTask task;
@ -114,6 +116,7 @@ public class EnrichPolicyRunner {
private final int maxForceMergeAttempts; private final int maxForceMergeAttempts;
EnrichPolicyRunner( EnrichPolicyRunner(
ProjectId projectId,
String policyName, String policyName,
EnrichPolicy policy, EnrichPolicy policy,
ExecuteEnrichPolicyTask task, ExecuteEnrichPolicyTask task,
@ -125,6 +128,7 @@ public class EnrichPolicyRunner {
int fetchSize, int fetchSize,
int maxForceMergeAttempts int maxForceMergeAttempts
) { ) {
this.projectId = projectId;
this.policyName = Objects.requireNonNull(policyName); this.policyName = Objects.requireNonNull(policyName);
this.policy = Objects.requireNonNull(policy); this.policy = Objects.requireNonNull(policy);
this.task = Objects.requireNonNull(task); this.task = Objects.requireNonNull(task);
@ -480,7 +484,7 @@ public class EnrichPolicyRunner {
private void prepareReindexOperation(ActionListener<AcknowledgedResponse> listener) { private void prepareReindexOperation(ActionListener<AcknowledgedResponse> listener) {
// Check to make sure that the enrich pipeline exists, and create it if it is missing. // Check to make sure that the enrich pipeline exists, and create it if it is missing.
if (EnrichPolicyReindexPipeline.exists(clusterService.state())) { if (EnrichPolicyReindexPipeline.exists(clusterService.state().getMetadata().getProject(projectId))) {
listener.onResponse(null); listener.onResponse(null);
} else { } else {
EnrichPolicyReindexPipeline.create(enrichOriginClient(), listener); EnrichPolicyReindexPipeline.create(enrichOriginClient(), listener);
@ -700,8 +704,8 @@ public class EnrichPolicyRunner {
* and recreated with invalid mappings/data. We validate that the mapping exists and that it contains the expected meta fields on it to * and recreated with invalid mappings/data. We validate that the mapping exists and that it contains the expected meta fields on it to
* guard against accidental removal and recreation during policy execution. * guard against accidental removal and recreation during policy execution.
*/ */
private void validateIndexBeforePromotion(String destinationIndexName, ClusterState clusterState) { private void validateIndexBeforePromotion(String destinationIndexName, ProjectMetadata project) {
IndexMetadata destinationIndex = clusterState.metadata().getProject().index(destinationIndexName); IndexMetadata destinationIndex = project.index(destinationIndexName);
if (destinationIndex == null) { if (destinationIndex == null) {
throw new IndexNotFoundException( throw new IndexNotFoundException(
"was not able to promote it as part of executing enrich policy [" + policyName + "]", "was not able to promote it as part of executing enrich policy [" + policyName + "]",
@ -749,12 +753,12 @@ public class EnrichPolicyRunner {
String enrichIndexBase = EnrichPolicy.getBaseName(policyName); String enrichIndexBase = EnrichPolicy.getBaseName(policyName);
logger.debug("Policy [{}]: Promoting new enrich index [{}] to alias [{}]", policyName, enrichIndexName, enrichIndexBase); logger.debug("Policy [{}]: Promoting new enrich index [{}] to alias [{}]", policyName, enrichIndexName, enrichIndexBase);
GetAliasesRequest aliasRequest = new GetAliasesRequest(ENRICH_MASTER_REQUEST_TIMEOUT, enrichIndexBase); GetAliasesRequest aliasRequest = new GetAliasesRequest(ENRICH_MASTER_REQUEST_TIMEOUT, enrichIndexBase);
ClusterState clusterState = clusterService.state(); final var project = clusterService.state().metadata().getProject(projectId);
validateIndexBeforePromotion(enrichIndexName, clusterState); validateIndexBeforePromotion(enrichIndexName, project);
String[] concreteIndices = indexNameExpressionResolver.concreteIndexNamesWithSystemIndexAccess(clusterState, aliasRequest); String[] concreteIndices = indexNameExpressionResolver.concreteIndexNamesWithSystemIndexAccess(project, aliasRequest);
String[] aliases = aliasRequest.aliases(); String[] aliases = aliasRequest.aliases();
IndicesAliasesRequest aliasToggleRequest = new IndicesAliasesRequest(ENRICH_MASTER_REQUEST_TIMEOUT, ENRICH_MASTER_REQUEST_TIMEOUT); IndicesAliasesRequest aliasToggleRequest = new IndicesAliasesRequest(ENRICH_MASTER_REQUEST_TIMEOUT, ENRICH_MASTER_REQUEST_TIMEOUT);
String[] indices = clusterState.metadata().getProject().findAliases(aliases, concreteIndices).keySet().toArray(new String[0]); String[] indices = project.findAliases(aliases, concreteIndices).keySet().toArray(new String[0]);
if (indices.length > 0) { if (indices.length > 0) {
aliasToggleRequest.addAliasAction(IndicesAliasesRequest.AliasActions.remove().indices(indices).alias(enrichIndexBase)); aliasToggleRequest.addAliasAction(IndicesAliasesRequest.AliasActions.remove().indices(indices).alias(enrichIndexBase));
} }

View file

@ -14,6 +14,8 @@ import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.metadata.IndexAbstraction; import org.elasticsearch.cluster.metadata.IndexAbstraction;
import org.elasticsearch.cluster.metadata.IndexMetadata; import org.elasticsearch.cluster.metadata.IndexMetadata;
import org.elasticsearch.cluster.metadata.Metadata; import org.elasticsearch.cluster.metadata.Metadata;
import org.elasticsearch.cluster.metadata.ProjectId;
import org.elasticsearch.cluster.metadata.ProjectMetadata;
import org.elasticsearch.common.geo.Orientation; import org.elasticsearch.common.geo.Orientation;
import org.elasticsearch.common.geo.ShapeRelation; import org.elasticsearch.common.geo.ShapeRelation;
import org.elasticsearch.common.xcontent.support.XContentMapValues; import org.elasticsearch.common.xcontent.support.XContentMapValues;
@ -50,20 +52,26 @@ final class EnrichProcessorFactory implements Processor.Factory, Consumer<Cluste
} }
@Override @Override
public Processor create(Map<String, Processor.Factory> processorFactories, String tag, String description, Map<String, Object> config) public Processor create(
throws Exception { Map<String, Processor.Factory> processorFactories,
String tag,
String description,
Map<String, Object> config,
ProjectId projectId
) throws Exception {
final String policyName = ConfigurationUtils.readStringProperty(TYPE, tag, config, "policy_name"); final String policyName = ConfigurationUtils.readStringProperty(TYPE, tag, config, "policy_name");
final String indexAlias = EnrichPolicy.getBaseName(policyName); final String indexAlias = EnrichPolicy.getBaseName(policyName);
if (metadata == null) { if (metadata == null) {
throw new IllegalStateException("enrich processor factory has not yet been initialized with cluster state"); throw new IllegalStateException("enrich processor factory has not yet been initialized with cluster state");
} }
IndexAbstraction indexAbstraction = metadata.getProject().getIndicesLookup().get(indexAlias); final var project = metadata.getProject(projectId);
IndexAbstraction indexAbstraction = project.getIndicesLookup().get(indexAlias);
if (indexAbstraction == null) { if (indexAbstraction == null) {
throw new IllegalArgumentException("no enrich index exists for policy with name [" + policyName + "]"); throw new IllegalArgumentException("no enrich index exists for policy with name [" + policyName + "]");
} }
assert indexAbstraction.getType() == IndexAbstraction.Type.ALIAS; assert indexAbstraction.getType() == IndexAbstraction.Type.ALIAS;
assert indexAbstraction.getIndices().size() == 1; assert indexAbstraction.getIndices().size() == 1;
IndexMetadata imd = metadata.getProject().index(indexAbstraction.getIndices().get(0)); IndexMetadata imd = project.index(indexAbstraction.getIndices().get(0));
Map<String, Object> mappingAsMap = imd.mapping().sourceAsMap(); Map<String, Object> mappingAsMap = imd.mapping().sourceAsMap();
String policyType = (String) XContentMapValues.extractValue( String policyType = (String) XContentMapValues.extractValue(
@ -80,7 +88,7 @@ final class EnrichProcessorFactory implements Processor.Factory, Consumer<Cluste
if (maxMatches < 1 || maxMatches > 128) { if (maxMatches < 1 || maxMatches > 128) {
throw ConfigurationUtils.newConfigurationException(TYPE, tag, "max_matches", "should be between 1 and 128"); throw ConfigurationUtils.newConfigurationException(TYPE, tag, "max_matches", "should be between 1 and 128");
} }
var searchRunner = createSearchRunner(indexAlias, client, enrichCache); var searchRunner = createSearchRunner(project, indexAlias);
switch (policyType) { switch (policyType) {
case EnrichPolicy.MATCH_TYPE: case EnrichPolicy.MATCH_TYPE:
case EnrichPolicy.RANGE_TYPE: case EnrichPolicy.RANGE_TYPE:
@ -125,12 +133,12 @@ final class EnrichProcessorFactory implements Processor.Factory, Consumer<Cluste
metadata = state.getMetadata(); metadata = state.getMetadata();
} }
private SearchRunner createSearchRunner(String indexAlias, Client client, EnrichCache enrichCache) { private SearchRunner createSearchRunner(ProjectMetadata project, String indexAlias) {
Client originClient = new OriginSettingClient(client, ENRICH_ORIGIN); Client originClient = new OriginSettingClient(client, ENRICH_ORIGIN);
return (value, maxMatches, reqSupplier, handler) -> { return (value, maxMatches, reqSupplier, handler) -> {
// intentionally non-locking for simplicity...it's OK if we re-put the same key/value in the cache during a race condition. // intentionally non-locking for simplicity...it's OK if we re-put the same key/value in the cache during a race condition.
enrichCache.computeIfAbsent( enrichCache.computeIfAbsent(
getEnrichIndexKey(indexAlias), getEnrichIndexKey(project, indexAlias),
value, value,
maxMatches, maxMatches,
(searchResponseActionListener) -> originClient.execute( (searchResponseActionListener) -> originClient.execute(
@ -143,8 +151,8 @@ final class EnrichProcessorFactory implements Processor.Factory, Consumer<Cluste
}; };
} }
private String getEnrichIndexKey(String indexAlias) { private String getEnrichIndexKey(ProjectMetadata project, String indexAlias) {
IndexAbstraction ia = metadata.getProject().getIndicesLookup().get(indexAlias); IndexAbstraction ia = project.getIndicesLookup().get(indexAlias);
if (ia == null) { if (ia == null) {
throw new IndexNotFoundException("no generated enrich index [" + indexAlias + "]"); throw new IndexNotFoundException("no generated enrich index [" + indexAlias + "]");
} }

Some files were not shown because too many files have changed in this diff Show more