From 567256a7a6ecd207c55baa01b4982498d7af4ccf Mon Sep 17 00:00:00 2001 From: Bernd Ahlers Date: Wed, 10 Aug 2016 16:10:27 +0200 Subject: [PATCH] Allow selection of an input ID for the simulation message (#78) * Invert equals() call to avoid possible null pointer exception Fixes Graylog2/graylog2-server#2610 * Allow selection of an input ID for the simulation message Pipeline rules may use the `from_input` function in a condition so this is needed to make the simulation work. Refs Graylog2/graylog2-server#2610 --- .../pipelineprocessor/functions/FromInput.java | 2 +- .../pipelineprocessor/rest/SimulationRequest.java | 11 ++++++++++- .../pipelineprocessor/rest/SimulatorResource.java | 4 ++++ src/web/simulator/ProcessorSimulator.jsx | 6 +++--- src/web/simulator/SimulatorStore.js | 3 ++- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/graylog/plugins/pipelineprocessor/functions/FromInput.java b/src/main/java/org/graylog/plugins/pipelineprocessor/functions/FromInput.java index 85ab0a2..2d8558d 100644 --- a/src/main/java/org/graylog/plugins/pipelineprocessor/functions/FromInput.java +++ b/src/main/java/org/graylog/plugins/pipelineprocessor/functions/FromInput.java @@ -72,7 +72,7 @@ public Boolean evaluate(FunctionArgs args, EvaluationContext context) { } return input != null - && context.currentMessage().getSourceInputId().equals(input.getId()); + && input.getId().equals(context.currentMessage().getSourceInputId()); } @Override diff --git a/src/main/java/org/graylog/plugins/pipelineprocessor/rest/SimulationRequest.java b/src/main/java/org/graylog/plugins/pipelineprocessor/rest/SimulationRequest.java index 9775533..457276f 100644 --- a/src/main/java/org/graylog/plugins/pipelineprocessor/rest/SimulationRequest.java +++ b/src/main/java/org/graylog/plugins/pipelineprocessor/rest/SimulationRequest.java @@ -21,6 +21,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.google.auto.value.AutoValue; +import javax.annotation.Nullable; import java.util.Map; @AutoValue @@ -32,16 +33,22 @@ public abstract class SimulationRequest { @JsonProperty public abstract Map message(); + @JsonProperty + @Nullable + public abstract String inputId(); + public static Builder builder() { return new AutoValue_SimulationRequest.Builder(); } @JsonCreator public static SimulationRequest create (@JsonProperty("stream_id") String streamId, - @JsonProperty("message") Map message) { + @JsonProperty("message") Map message, + @JsonProperty("input_id") @Nullable String inputId) { return builder() .streamId(streamId) .message(message) + .inputId(inputId) .build(); } @@ -52,5 +59,7 @@ public abstract static class Builder { public abstract Builder streamId(String streamId); public abstract Builder message(Map message); + + public abstract Builder inputId(String inputId); } } diff --git a/src/main/java/org/graylog/plugins/pipelineprocessor/rest/SimulatorResource.java b/src/main/java/org/graylog/plugins/pipelineprocessor/rest/SimulatorResource.java index 1f0c30d..a0424ef 100644 --- a/src/main/java/org/graylog/plugins/pipelineprocessor/rest/SimulatorResource.java +++ b/src/main/java/org/graylog/plugins/pipelineprocessor/rest/SimulatorResource.java @@ -21,6 +21,7 @@ import io.swagger.annotations.ApiParam; import org.apache.shiro.authz.annotation.RequiresAuthentication; import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.elasticsearch.common.Strings; import org.graylog.plugins.pipelineprocessor.processors.PipelineInterpreter; import org.graylog.plugins.pipelineprocessor.simulator.PipelineInterpreterTracer; import org.graylog2.database.NotFoundException; @@ -69,6 +70,9 @@ public SimulationResponse simulate(@ApiParam(name = "simulation", required = tru final Stream stream = streamService.load(request.streamId()); message.addStream(stream); } + if (!Strings.isNullOrEmpty(request.inputId())) { + message.setSourceInputId(request.inputId()); + } final List simulationResults = new ArrayList<>(); final PipelineInterpreterTracer pipelineInterpreterTracer = new PipelineInterpreterTracer(); diff --git a/src/web/simulator/ProcessorSimulator.jsx b/src/web/simulator/ProcessorSimulator.jsx index f063ed7..ba9e1e7 100644 --- a/src/web/simulator/ProcessorSimulator.jsx +++ b/src/web/simulator/ProcessorSimulator.jsx @@ -22,11 +22,11 @@ const ProcessorSimulator = React.createClass({ }; }, - _onMessageLoad(message) { + _onMessageLoad(message, options) { this.setState({ message: message, simulation: undefined, loading: true, error: undefined }); SimulatorActions.simulate - .triggerPromise(this.props.stream, message.fields) + .triggerPromise(this.props.stream, message.fields, options.inputId) .then( response => { this.setState({ simulation: response, loading: false }); @@ -47,7 +47,7 @@ const ProcessorSimulator = React.createClass({ Build an example message that will be used in the simulation.{' '} No real messages stored in Graylog will be changed. All actions are purely simulated on the temporary input you provide below.

- +