From d2ca66b98b4d07bc2e29bc9a459a1273611a4e9c Mon Sep 17 00:00:00 2001 From: Jacob Kiefer Date: Wed, 17 Jan 2018 16:51:58 -0500 Subject: [PATCH] fix(pubsub): Add payload to pubsub triggers. (#221) --- .../netflix/spinnaker/echo/model/Trigger.java | 36 +++++-------------- .../monitor/PubsubEventMonitor.java | 9 ++++- .../monitor/WebhookEventMonitor.java | 2 +- .../PubsubEventMonitorSpec.groovy | 30 ++++++++-------- .../spinnaker/echo/test/RetrofitStubs.groovy | 3 +- 5 files changed, 35 insertions(+), 45 deletions(-) diff --git a/echo-model/src/main/java/com/netflix/spinnaker/echo/model/Trigger.java b/echo-model/src/main/java/com/netflix/spinnaker/echo/model/Trigger.java index a5e3ad376..3ae6e8d82 100644 --- a/echo-model/src/main/java/com/netflix/spinnaker/echo/model/Trigger.java +++ b/echo-model/src/main/java/com/netflix/spinnaker/echo/model/Trigger.java @@ -29,7 +29,7 @@ @JsonDeserialize(builder = Trigger.TriggerBuilder.class) @Builder(toBuilder = true) @Wither -@ToString(of = {"type", "master", "job", "cronExpression", "source", "project", "slug", "account", "repository", "tag", "parameters", "payloadConstraints", "attributeConstraints", "branch", "runAsUser", "subscriptionName", "pubsubSystem", "expectedArtifactIds"}, includeFieldNames = false) +@ToString(of = {"type", "master", "job", "cronExpression", "source", "project", "slug", "account", "repository", "tag", "parameters", "payloadConstraints", "attributeConstraints", "branch", "runAsUser", "subscriptionName", "pubsubSystem", "expectedArtifactIds", "payload"}, includeFieldNames = false) @Value public class Trigger { public enum Type { @@ -71,6 +71,7 @@ public String toString() { String tag; String digest; Map payloadConstraints; + Map payload; Map attributeConstraints; String branch; String runAsUser; @@ -90,10 +91,6 @@ public Trigger atBuildNumber(final int buildNumber) { .buildNumber(buildNumber) .hash(null) .tag(null) - .payloadConstraints(null) - .attributeConstraints(null) - .subscriptionName(null) - .pubsubSystem(null) .build(); } @@ -102,10 +99,6 @@ public Trigger atHash(final String hash) { .buildNumber(null) .hash(hash) .tag(null) - .payloadConstraints(null) - .attributeConstraints(null) - .subscriptionName(null) - .pubsubSystem(null) .build(); } @@ -113,11 +106,7 @@ public Trigger atBranch(final String branch) { return this.toBuilder() .buildNumber(null) .tag(null) - .payloadConstraints(null) - .attributeConstraints(null) .branch(branch) - .subscriptionName(null) - .pubsubSystem(null) .build(); } @@ -126,23 +115,18 @@ public Trigger atTag(final String tag) { .buildNumber(null) .hash(null) .tag(tag) - .payloadConstraints(null) - .attributeConstraints(null) - .subscriptionName(null) - .pubsubSystem(null) .build(); } - public Trigger atPayloadConstraints(final Map parameters, final Map payloadConstraints) { + public Trigger atPayload(final Map payload) { + return this.toBuilder() + .payload(payload) + .build(); + } + + public Trigger atParameters(final Map parameters) { return this.toBuilder() - .buildNumber(null) - .hash(null) - .digest(null) .parameters(parameters) - .payloadConstraints(payloadConstraints) - .attributeConstraints(null) - .subscriptionName(null) - .pubsubSystem(null) .build(); } @@ -152,8 +136,6 @@ public Trigger atSecret(final String secret) { .hash(null) .digest(null) .secret(secret) - .subscriptionName(null) - .pubsubSystem(null) .build(); } diff --git a/echo-pipelinetriggers/src/main/java/com/netflix/spinnaker/echo/pipelinetriggers/monitor/PubsubEventMonitor.java b/echo-pipelinetriggers/src/main/java/com/netflix/spinnaker/echo/pipelinetriggers/monitor/PubsubEventMonitor.java index 69a47b202..9c808eff4 100644 --- a/echo-pipelinetriggers/src/main/java/com/netflix/spinnaker/echo/pipelinetriggers/monitor/PubsubEventMonitor.java +++ b/echo-pipelinetriggers/src/main/java/com/netflix/spinnaker/echo/pipelinetriggers/monitor/PubsubEventMonitor.java @@ -34,6 +34,8 @@ import rx.Observable; import rx.functions.Action1; +import java.util.HashMap; +import java.util.Map; import java.util.function.Function; import java.util.function.Predicate; @@ -84,10 +86,15 @@ protected boolean isSuccessfulTriggerEvent(final TriggerEvent event) { @Override protected Function buildTrigger(Pipeline pipeline, TriggerEvent event) { PubsubEvent pubsubEvent = (PubsubEvent) event; + Map payload = pubsubEvent.getPayload(); + Map parameters = payload.containsKey("parameters") ? (Map) payload.get("parameters") : new HashMap(); MessageDescription description = pubsubEvent.getContent().getMessageDescription(); return trigger -> pipeline .withReceivedArtifacts(description.getArtifacts()) - .withTrigger(trigger.atMessageDescription(description.getSubscriptionName(), description.getPubsubSystem().toString())); + .withTrigger(trigger + .atMessageDescription(description.getSubscriptionName(), description.getPubsubSystem().toString()) + .atParameters(parameters) + .atPayload(payload)); } @Override diff --git a/echo-pipelinetriggers/src/main/java/com/netflix/spinnaker/echo/pipelinetriggers/monitor/WebhookEventMonitor.java b/echo-pipelinetriggers/src/main/java/com/netflix/spinnaker/echo/pipelinetriggers/monitor/WebhookEventMonitor.java index df10c4d7a..e8fb84103 100644 --- a/echo-pipelinetriggers/src/main/java/com/netflix/spinnaker/echo/pipelinetriggers/monitor/WebhookEventMonitor.java +++ b/echo-pipelinetriggers/src/main/java/com/netflix/spinnaker/echo/pipelinetriggers/monitor/WebhookEventMonitor.java @@ -84,7 +84,7 @@ protected boolean isSuccessfulTriggerEvent(final TriggerEvent event) { protected Function buildTrigger(Pipeline pipeline, TriggerEvent event) { Map payload = event.getPayload(); Map parameters = payload.containsKey("parameters") ? (Map) payload.get("parameters") : new HashMap(); - return trigger -> pipeline.withTrigger(trigger.atPayloadConstraints(parameters, payload)); + return trigger -> pipeline.withTrigger(trigger.atParameters(parameters).atPayload(payload)); } @Override diff --git a/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/pipelinetriggers/PubsubEventMonitorSpec.groovy b/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/pipelinetriggers/PubsubEventMonitorSpec.groovy index d7ac2bb2a..5ccc9c86b 100644 --- a/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/pipelinetriggers/PubsubEventMonitorSpec.groovy +++ b/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/pipelinetriggers/PubsubEventMonitorSpec.groovy @@ -98,12 +98,12 @@ class PubsubEventMonitorSpec extends Specification implements RetrofitStubs { }) where: - event | trigger - createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", null) | enabledGooglePubsubTrigger - createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", []) | enabledGooglePubsubTrigger - createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", goodArtifacts) | enabledGooglePubsubTrigger.withExpectedArtifactIds(goodExpectedArtifacts*.id) - createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", goodArtifacts) | enabledGooglePubsubTrigger.withExpectedArtifactIds(goodRegexExpectedArtifacts*.id) - createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", goodArtifacts) | enabledGooglePubsubTrigger // Trigger doesn't care about artifacts. + event | trigger + createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", null, [:]) | enabledGooglePubsubTrigger + createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", [], [:]) | enabledGooglePubsubTrigger + createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", goodArtifacts, [:]) | enabledGooglePubsubTrigger.withExpectedArtifactIds(goodExpectedArtifacts*.id) + createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", goodArtifacts, [:]) | enabledGooglePubsubTrigger.withExpectedArtifactIds(goodRegexExpectedArtifacts*.id) + createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", goodArtifacts, [:]) | enabledGooglePubsubTrigger // Trigger doesn't care about artifacts. // TODO(jacobkiefer): Add Kafka cases when that is implemented. } @@ -123,7 +123,7 @@ class PubsubEventMonitorSpec extends Specification implements RetrofitStubs { disabledGooglePubsubTrigger | "disabled Google pubsub trigger" pipeline = createPipelineWith(goodExpectedArtifacts, trigger) - event = createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", []) + event = createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", [], [:]) // TODO(jacobkiefer): Add Kafka cases when that is implemented. } @@ -142,7 +142,7 @@ class PubsubEventMonitorSpec extends Specification implements RetrofitStubs { }) where: - event = createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", []) + event = createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", [], [:]) pipeline = createPipelineWith(goodExpectedArtifacts, enabledGooglePubsubTrigger, disabledGooglePubsubTrigger) } @@ -164,7 +164,7 @@ class PubsubEventMonitorSpec extends Specification implements RetrofitStubs { enabledGooglePubsubTrigger.withPubsubSystem("noogle") | "different subscription name" pipeline = createPipelineWith(goodExpectedArtifacts, trigger) - event = createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", []) + event = createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", [], [:]) } @Unroll @@ -183,7 +183,7 @@ class PubsubEventMonitorSpec extends Specification implements RetrofitStubs { enabledGooglePubsubTrigger.withExpectedArtifactIds(badExpectedArtifacts*.id) | "non-matching artifact in message" pipeline = createPipelineWith(goodExpectedArtifacts, trigger) - event = createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", goodArtifacts) + event = createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", goodArtifacts, [:]) } @Unroll @@ -202,7 +202,7 @@ class PubsubEventMonitorSpec extends Specification implements RetrofitStubs { enabledGooglePubsubTrigger.withSubscriptionName(null) | "subscriptionName" enabledGooglePubsubTrigger.withPubsubSystem(null) | "pubsubSystem" - event = createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", []) + event = createPubsubEvent(PubsubSystem.GOOGLE, "projects/project/subscriptions/subscription", [], [:]) goodPipeline = createPipelineWith(goodExpectedArtifacts, enabledGooglePubsubTrigger) badPipeline = createPipelineWith(goodExpectedArtifacts, trigger) } @@ -237,8 +237,8 @@ class PubsubEventMonitorSpec extends Specification implements RetrofitStubs { }) where: - trigger | callCount - enabledGooglePubsubTrigger | 1 + trigger | callCount + enabledGooglePubsubTrigger | 1 enabledGooglePubsubTrigger.withPayloadConstraints([key: 'value']) | 1 enabledGooglePubsubTrigger.withPayloadConstraints([key: 'wrongValue']) | 0 } @@ -274,8 +274,8 @@ class PubsubEventMonitorSpec extends Specification implements RetrofitStubs { }) where: - trigger | callCount - enabledGooglePubsubTrigger | 1 + trigger | callCount + enabledGooglePubsubTrigger | 1 enabledGooglePubsubTrigger.withAttributeConstraints([key: 'value']) | 1 enabledGooglePubsubTrigger.withAttributeConstraints([key: 'wrongValue']) | 0 } diff --git a/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/test/RetrofitStubs.groovy b/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/test/RetrofitStubs.groovy index 70106431a..789d0ace5 100644 --- a/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/test/RetrofitStubs.groovy +++ b/echo-pipelinetriggers/src/test/groovy/com/netflix/spinnaker/echo/test/RetrofitStubs.groovy @@ -87,7 +87,7 @@ trait RetrofitStubs { return res } - PubsubEvent createPubsubEvent(PubsubSystem pubsubSystem, String subscriptionName, List artifacts) { + PubsubEvent createPubsubEvent(PubsubSystem pubsubSystem, String subscriptionName, List artifacts, Map payload) { def res = new PubsubEvent() def description = MessageDescription.builder() @@ -102,6 +102,7 @@ trait RetrofitStubs { res.details = new Metadata([type: PubsubEventMonitor.PUBSUB_TRIGGER_TYPE]) res.content = content + res.payload = payload return res }