From 512b544c8adfaae49fdb4ed2ce7119545231bf95 Mon Sep 17 00:00:00 2001 From: Benjamin Broadaway <4554569+benbroadaway@users.noreply.github.com> Date: Wed, 18 Sep 2024 17:22:15 -0500 Subject: [PATCH 1/4] runtime-v2: add github exclusive trigger to schema --- .../v2/model/DefaultExclusiveMode.java | 44 +++++++++++++++++++ .../runtime/v2/model/ExclusiveMode.java | 13 ------ .../v2/model/GithubTriggerExclusiveMode.java | 4 +- .../v2/parser/ConfigurationGrammar.java | 4 +- .../runtime/v2/schema/TriggerMixIn.java | 3 +- .../runtime/v2/parser/YamlOkParserTest.java | 2 +- .../concord/server/process/PayloadUtils.java | 7 +-- 7 files changed, 56 insertions(+), 21 deletions(-) create mode 100644 runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/DefaultExclusiveMode.java diff --git a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/DefaultExclusiveMode.java b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/DefaultExclusiveMode.java new file mode 100644 index 0000000000..14cd5e4a2e --- /dev/null +++ b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/DefaultExclusiveMode.java @@ -0,0 +1,44 @@ +package com.walmartlabs.concord.runtime.v2.model; + +/*- + * ***** + * Concord + * ----- + * Copyright (C) 2017 - 2024 Walmart Inc. + * ----- + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ===== + */ + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.immutables.value.Value; + +import java.io.Serial; + +@Value.Immutable +@Value.Style(jdkOnly = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonSerialize(as = ImmutableDefaultExclusiveMode.class) +@JsonDeserialize(as = ImmutableDefaultExclusiveMode.class) +public interface DefaultExclusiveMode extends ExclusiveMode { + + @Serial + long serialVersionUID = 1L; + + static ExclusiveMode of(String group, Mode mode) { + return ImmutableDefaultExclusiveMode.of(group, mode); + } + +} diff --git a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java index 0afe042353..ef26c4b608 100644 --- a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java +++ b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java @@ -20,23 +20,13 @@ * ===== */ -import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.immutables.value.Value; import java.io.Serializable; -@Value.Immutable -@Value.Style(jdkOnly = true) -@JsonInclude(JsonInclude.Include.NON_EMPTY) -@JsonSerialize(as = ImmutableExclusiveMode.class) -@JsonDeserialize(as = ImmutableExclusiveMode.class) public interface ExclusiveMode extends Serializable { - long serialVersionUID = 1L; - @Value.Parameter @JsonProperty(value = "group", required = true) String group(); @@ -64,7 +54,4 @@ enum Mode { wait } - static ExclusiveMode of(String group, Mode mode) { - return ImmutableExclusiveMode.of(group, mode); - } } diff --git a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/GithubTriggerExclusiveMode.java b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/GithubTriggerExclusiveMode.java index a862d7980e..e2ddae06d2 100644 --- a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/GithubTriggerExclusiveMode.java +++ b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/GithubTriggerExclusiveMode.java @@ -28,6 +28,7 @@ import org.immutables.value.Value; import javax.annotation.Nullable; +import java.io.Serial; import java.io.Serializable; @Value.Immutable @@ -35,8 +36,9 @@ @JsonInclude(JsonInclude.Include.NON_EMPTY) @JsonSerialize(as = ImmutableGithubTriggerExclusiveMode.class) @JsonDeserialize(as = ImmutableGithubTriggerExclusiveMode.class) -public interface GithubTriggerExclusiveMode extends Serializable { +public interface GithubTriggerExclusiveMode extends ExclusiveMode, Serializable { + @Serial long serialVersionUID = 1L; @Nullable diff --git a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/parser/ConfigurationGrammar.java b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/parser/ConfigurationGrammar.java index d8ed19a165..c2893182fd 100644 --- a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/parser/ConfigurationGrammar.java +++ b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/parser/ConfigurationGrammar.java @@ -35,11 +35,11 @@ public final class ConfigurationGrammar { private static final Parser exclusive = betweenTokens(JsonToken.START_OBJECT, JsonToken.END_OBJECT, - with(ImmutableExclusiveMode::builder, + with(ImmutableDefaultExclusiveMode::builder, o -> options( mandatory("group", stringNotEmptyVal.map(o::group)), optional("mode", enumVal(ExclusiveMode.Mode.class).map(o::mode)))) - .map(ImmutableExclusiveMode.Builder::build)); + .map(ImmutableDefaultExclusiveMode.Builder::build)); public static final Parser exclusiveVal = orError(exclusive, YamlValueType.EXCLUSIVE_MODE); diff --git a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/schema/TriggerMixIn.java b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/schema/TriggerMixIn.java index 55bc7145a2..34c6d7efb8 100644 --- a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/schema/TriggerMixIn.java +++ b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/schema/TriggerMixIn.java @@ -24,6 +24,7 @@ import com.kjetland.jackson.jsonSchema.annotations.JsonSchemaInject; import com.kjetland.jackson.jsonSchema.annotations.JsonSchemaString; import com.walmartlabs.concord.runtime.v2.model.ExclusiveMode; +import com.walmartlabs.concord.runtime.v2.model.GithubTriggerExclusiveMode; import com.walmartlabs.concord.runtime.v2.model.Trigger; import java.util.List; @@ -111,7 +112,7 @@ interface GithubTriggerParams extends DefaultTriggerParams { GithubTriggerConditions conditions(); @JsonProperty("exclusive") - ExclusiveMode exclusive(); + GithubTriggerExclusiveMode exclusive(); interface GithubTriggerConditions { @JsonProperty(value = "type", required = true) diff --git a/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java b/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java index a17574b9a6..683af36d82 100644 --- a/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java +++ b/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java @@ -351,7 +351,7 @@ public void test008() throws Exception { assertEquals(Collections.singletonMap("k", "v"), cfg.arguments()); assertEquals(Collections.singletonMap("k", "v1"), cfg.requirements()); assertEquals(Duration.parse("PT1H"), cfg.processTimeout()); - assertEquals(ExclusiveMode.of("X", ExclusiveMode.Mode.cancel), cfg.exclusive()); + assertEquals(DefaultExclusiveMode.of("X", ExclusiveMode.Mode.cancel), cfg.exclusive()); assertEquals(EventConfiguration.builder() .recordTaskInVars(true) .inVarsBlacklist(Collections.singletonList("pass")) diff --git a/server/impl/src/main/java/com/walmartlabs/concord/server/process/PayloadUtils.java b/server/impl/src/main/java/com/walmartlabs/concord/server/process/PayloadUtils.java index 0ecc7c756d..b717e09ff5 100644 --- a/server/impl/src/main/java/com/walmartlabs/concord/server/process/PayloadUtils.java +++ b/server/impl/src/main/java/com/walmartlabs/concord/server/process/PayloadUtils.java @@ -22,6 +22,7 @@ import com.walmartlabs.concord.common.DateTimeUtils; import com.walmartlabs.concord.repository.Snapshot; +import com.walmartlabs.concord.runtime.v2.model.DefaultExclusiveMode; import com.walmartlabs.concord.runtime.v2.model.ExclusiveMode; import com.walmartlabs.concord.sdk.Constants; import com.walmartlabs.concord.sdk.MapUtils; @@ -44,7 +45,7 @@ public static ExclusiveMode getExclusive(Payload p) { throw new ProcessException(p.getProcessKey(), "Invalid exclusive mode: exclusive group not specified or empty"); } ExclusiveMode.Mode mode = MapUtils.getEnum(exclusive, "mode", ExclusiveMode.Mode.class, ExclusiveMode.Mode.cancel); - return ExclusiveMode.of(group, mode); + return DefaultExclusiveMode.of(group, mode); } @SuppressWarnings("unchecked") @@ -65,10 +66,10 @@ public static OffsetDateTime getStartAt(Payload p) { return null; } - if (v instanceof String) { + if (v instanceof String iso) { OffsetDateTime t; try { - t = DateTimeUtils.fromIsoString((String) v); + t = DateTimeUtils.fromIsoString(iso); } catch (DateTimeParseException e) { throw new ProcessException(p.getProcessKey(), "Invalid '" + k + "' format, expected an ISO-8601 value, got: " + v); } From 4eff1027ba13b9fe0db9a1917089aec9b74caa96 Mon Sep 17 00:00:00 2001 From: Benjamin Broadaway <4554569+benbroadaway@users.noreply.github.com> Date: Thu, 19 Sep 2024 07:15:59 -0500 Subject: [PATCH 2/4] add JsonDeserialize annotation --- .../com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java index ef26c4b608..193a8cb70b 100644 --- a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java +++ b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java @@ -21,10 +21,12 @@ */ import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import org.immutables.value.Value; import java.io.Serializable; +@JsonDeserialize(as = DefaultExclusiveMode.class) public interface ExclusiveMode extends Serializable { @Value.Parameter From fcf35e112943378d957e6251e4e4e23582fc2489 Mon Sep 17 00:00:00 2001 From: Benjamin Broadaway <4554569+benbroadaway@users.noreply.github.com> Date: Thu, 19 Sep 2024 09:38:37 -0500 Subject: [PATCH 3/4] up --- .../v2/model/DefaultExclusiveMode.java | 44 ------------------- .../runtime/v2/model/ExclusiveMode.java | 21 ++++++++- .../runtime/v2/parser/YamlOkParserTest.java | 2 +- .../concord/server/process/PayloadUtils.java | 3 +- 4 files changed, 22 insertions(+), 48 deletions(-) delete mode 100644 runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/DefaultExclusiveMode.java diff --git a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/DefaultExclusiveMode.java b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/DefaultExclusiveMode.java deleted file mode 100644 index 14cd5e4a2e..0000000000 --- a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/DefaultExclusiveMode.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.walmartlabs.concord.runtime.v2.model; - -/*- - * ***** - * Concord - * ----- - * Copyright (C) 2017 - 2024 Walmart Inc. - * ----- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ===== - */ - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import org.immutables.value.Value; - -import java.io.Serial; - -@Value.Immutable -@Value.Style(jdkOnly = true) -@JsonInclude(JsonInclude.Include.NON_EMPTY) -@JsonSerialize(as = ImmutableDefaultExclusiveMode.class) -@JsonDeserialize(as = ImmutableDefaultExclusiveMode.class) -public interface DefaultExclusiveMode extends ExclusiveMode { - - @Serial - long serialVersionUID = 1L; - - static ExclusiveMode of(String group, Mode mode) { - return ImmutableDefaultExclusiveMode.of(group, mode); - } - -} diff --git a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java index 193a8cb70b..e2f40fd7e2 100644 --- a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java +++ b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java @@ -20,13 +20,16 @@ * ===== */ +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.immutables.value.Value; +import java.io.Serial; import java.io.Serializable; -@JsonDeserialize(as = DefaultExclusiveMode.class) +@JsonDeserialize(as = ImmutableDefaultExclusiveMode.class) public interface ExclusiveMode extends Serializable { @Value.Parameter @@ -56,4 +59,20 @@ enum Mode { wait } + static ExclusiveMode of(String group, Mode mode) { + return ImmutableDefaultExclusiveMode.of(group, mode); + } + + @Value.Immutable + @Value.Style(jdkOnly = true) + @JsonInclude(JsonInclude.Include.NON_EMPTY) + @JsonSerialize(as = ImmutableDefaultExclusiveMode.class) + @JsonDeserialize(as = ImmutableDefaultExclusiveMode.class) + interface DefaultExclusiveMode extends ExclusiveMode { + + @Serial + long serialVersionUID = 1L; + + } + } diff --git a/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java b/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java index 683af36d82..a17574b9a6 100644 --- a/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java +++ b/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java @@ -351,7 +351,7 @@ public void test008() throws Exception { assertEquals(Collections.singletonMap("k", "v"), cfg.arguments()); assertEquals(Collections.singletonMap("k", "v1"), cfg.requirements()); assertEquals(Duration.parse("PT1H"), cfg.processTimeout()); - assertEquals(DefaultExclusiveMode.of("X", ExclusiveMode.Mode.cancel), cfg.exclusive()); + assertEquals(ExclusiveMode.of("X", ExclusiveMode.Mode.cancel), cfg.exclusive()); assertEquals(EventConfiguration.builder() .recordTaskInVars(true) .inVarsBlacklist(Collections.singletonList("pass")) diff --git a/server/impl/src/main/java/com/walmartlabs/concord/server/process/PayloadUtils.java b/server/impl/src/main/java/com/walmartlabs/concord/server/process/PayloadUtils.java index b717e09ff5..4b0bf5e78c 100644 --- a/server/impl/src/main/java/com/walmartlabs/concord/server/process/PayloadUtils.java +++ b/server/impl/src/main/java/com/walmartlabs/concord/server/process/PayloadUtils.java @@ -22,7 +22,6 @@ import com.walmartlabs.concord.common.DateTimeUtils; import com.walmartlabs.concord.repository.Snapshot; -import com.walmartlabs.concord.runtime.v2.model.DefaultExclusiveMode; import com.walmartlabs.concord.runtime.v2.model.ExclusiveMode; import com.walmartlabs.concord.sdk.Constants; import com.walmartlabs.concord.sdk.MapUtils; @@ -45,7 +44,7 @@ public static ExclusiveMode getExclusive(Payload p) { throw new ProcessException(p.getProcessKey(), "Invalid exclusive mode: exclusive group not specified or empty"); } ExclusiveMode.Mode mode = MapUtils.getEnum(exclusive, "mode", ExclusiveMode.Mode.class, ExclusiveMode.Mode.cancel); - return DefaultExclusiveMode.of(group, mode); + return ExclusiveMode.of(group, mode); } @SuppressWarnings("unchecked") From fb1755a06715b3320010b6c06fa56f3d72eae23c Mon Sep 17 00:00:00 2001 From: Benjamin Broadaway <4554569+benbroadaway@users.noreply.github.com> Date: Mon, 7 Oct 2024 08:05:32 -0500 Subject: [PATCH 4/4] refactor without extra interface --- .../runtime/v2/model/ExclusiveMode.java | 24 ++++++------------- .../v2/model/GithubTriggerExclusiveMode.java | 2 +- .../v2/parser/ConfigurationGrammar.java | 4 ++-- .../runtime/v2/schema/TriggerMixIn.java | 6 ++--- .../runtime/v2/parser/YamlOkParserTest.java | 20 ++++++++++++++++ runtime/v2/model/src/test/resources/020.yml | 19 +++++++++++++++ 6 files changed, 52 insertions(+), 23 deletions(-) create mode 100644 runtime/v2/model/src/test/resources/020.yml diff --git a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java index 7392c8445a..35d60b51bc 100644 --- a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java +++ b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/ExclusiveMode.java @@ -27,15 +27,18 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.immutables.value.Value; -import java.io.Serial; import java.io.Serializable; +@Value.Immutable +@Value.Style(jdkOnly = true) @JsonInclude(JsonInclude.Include.NON_EMPTY) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(as = ImmutableDefaultExclusiveMode.class) -@JsonDeserialize(as = ImmutableDefaultExclusiveMode.class) +@JsonSerialize(as = ImmutableExclusiveMode.class) +@JsonDeserialize(as = ImmutableExclusiveMode.class) public interface ExclusiveMode extends Serializable { + long serialVersionUID = 1L; + @Value.Parameter @JsonProperty(value = "group", required = true) String group(); @@ -64,19 +67,6 @@ enum Mode { } static ExclusiveMode of(String group, Mode mode) { - return ImmutableDefaultExclusiveMode.of(group, mode); - } - - @Value.Immutable - @Value.Style(jdkOnly = true) - @JsonInclude(JsonInclude.Include.NON_EMPTY) - @JsonSerialize(as = ImmutableDefaultExclusiveMode.class) - @JsonDeserialize(as = ImmutableDefaultExclusiveMode.class) - interface DefaultExclusiveMode extends ExclusiveMode { - - @Serial - long serialVersionUID = 1L; - + return ImmutableExclusiveMode.of(group, mode); } - } diff --git a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/GithubTriggerExclusiveMode.java b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/GithubTriggerExclusiveMode.java index e2ddae06d2..1cf65b7fb7 100644 --- a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/GithubTriggerExclusiveMode.java +++ b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/model/GithubTriggerExclusiveMode.java @@ -36,7 +36,7 @@ @JsonInclude(JsonInclude.Include.NON_EMPTY) @JsonSerialize(as = ImmutableGithubTriggerExclusiveMode.class) @JsonDeserialize(as = ImmutableGithubTriggerExclusiveMode.class) -public interface GithubTriggerExclusiveMode extends ExclusiveMode, Serializable { +public interface GithubTriggerExclusiveMode extends Serializable { @Serial long serialVersionUID = 1L; diff --git a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/parser/ConfigurationGrammar.java b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/parser/ConfigurationGrammar.java index c2893182fd..d8ed19a165 100644 --- a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/parser/ConfigurationGrammar.java +++ b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/parser/ConfigurationGrammar.java @@ -35,11 +35,11 @@ public final class ConfigurationGrammar { private static final Parser exclusive = betweenTokens(JsonToken.START_OBJECT, JsonToken.END_OBJECT, - with(ImmutableDefaultExclusiveMode::builder, + with(ImmutableExclusiveMode::builder, o -> options( mandatory("group", stringNotEmptyVal.map(o::group)), optional("mode", enumVal(ExclusiveMode.Mode.class).map(o::mode)))) - .map(ImmutableDefaultExclusiveMode.Builder::build)); + .map(ImmutableExclusiveMode.Builder::build)); public static final Parser exclusiveVal = orError(exclusive, YamlValueType.EXCLUSIVE_MODE); diff --git a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/schema/TriggerMixIn.java b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/schema/TriggerMixIn.java index 34c6d7efb8..cf2725e062 100644 --- a/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/schema/TriggerMixIn.java +++ b/runtime/v2/model/src/main/java/com/walmartlabs/concord/runtime/v2/schema/TriggerMixIn.java @@ -175,6 +175,9 @@ interface GenericTriggerParams extends DefaultTriggerParams { @JsonProperty("conditions") Map conditions(); + + @JsonProperty("exclusive") + ExclusiveMode exclusive(); } } @@ -188,8 +191,5 @@ interface DefaultTriggerParams { @JsonProperty("arguments") Map arguments(); - - @JsonProperty("exclusive") - ExclusiveMode exclusive(); } } diff --git a/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java b/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java index a17574b9a6..36603effea 100644 --- a/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java +++ b/runtime/v2/model/src/test/java/com/walmartlabs/concord/project/runtime/v2/parser/YamlOkParserTest.java @@ -570,6 +570,26 @@ public void test019() throws Exception { assertTrue(p1.configuration().debug()); } + @Test // GitHub trigger exclusive grouping + void test020() throws Exception { + ProcessDefinition pd = load("020.yml"); + + List triggers = pd.triggers(); + assertNotNull(triggers); + + assertEquals(2, triggers.size()); + + Trigger t = triggers.get(0); + assertEquals("github", t.name()); + var exclusive = assertInstanceOf(GithubTriggerExclusiveMode.class, t.configuration().get("exclusive")); + assertEquals("branch", exclusive.groupByProperty()); + + t = triggers.get(1); + assertEquals("github", t.name()); + exclusive = assertInstanceOf(GithubTriggerExclusiveMode.class, t.configuration().get("exclusive")); + assertEquals("event.pull_request.html_url", exclusive.groupByProperty()); + } + @Test public void testArgsOrder() throws Exception { ProcessDefinition pd = load("args-order.concord.yml"); diff --git a/runtime/v2/model/src/test/resources/020.yml b/runtime/v2/model/src/test/resources/020.yml new file mode 100644 index 0000000000..231c15c35a --- /dev/null +++ b/runtime/v2/model/src/test/resources/020.yml @@ -0,0 +1,19 @@ + +triggers: + - github: + version: 2 + useInitiator: true + entryPoint: onPush + conditions: + type: "push" + exclusive: + groupBy: branch + + - github: + version: 2 + useInitiator: true + entryPoint: onPush2 + conditions: + type: push2 + exclusive: + groupBy: "event.pull_request.html_url"