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.
-
+