From b3a62efd6beed7ad93cae3bad5a34a83f7c05387 Mon Sep 17 00:00:00 2001 From: lewisbirks <22620804+lewisbirks@users.noreply.github.com> Date: Sat, 19 Apr 2025 22:45:00 +0100 Subject: [PATCH 1/4] Convert pipeline stage/step state to an enum --- .../utils/AbstractPipelineNode.java | 9 ++-- .../utils/PipelineGraphApi.java | 33 +++++-------- .../utils/PipelineStage.java | 2 +- .../utils/PipelineStageInternal.java | 13 +++-- .../utils/PipelineStatus.java | 47 ++++++++++++++++++ .../pipelinegraphview/utils/PipelineStep.java | 8 ++- .../utils/PipelineStepApi.java | 9 +--- .../pipelinegraphview/utils/TreeBuilder.java | 1 - .../utils/PipelineStatusTest.java | 49 +++++++++++++++++++ 9 files changed, 128 insertions(+), 43 deletions(-) create mode 100644 src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatus.java delete mode 100644 src/main/java/io/jenkins/plugins/pipelinegraphview/utils/TreeBuilder.java create mode 100644 src/test/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatusTest.java diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/AbstractPipelineNode.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/AbstractPipelineNode.java index d3fcff972..8d4a3753c 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/AbstractPipelineNode.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/AbstractPipelineNode.java @@ -1,11 +1,10 @@ package io.jenkins.plugins.pipelinegraphview.utils; -import java.util.Locale; import org.jenkinsci.plugins.workflow.pipelinegraphanalysis.TimingInfo; public class AbstractPipelineNode { private String name; - private String state; // TODO enum + private PipelineStatus state; private String type; // TODO enum private String title; private String id; @@ -14,10 +13,10 @@ public class AbstractPipelineNode { private TimingInfo timingInfo; public AbstractPipelineNode( - String id, String name, String state, String type, String title, TimingInfo timingInfo) { + String id, String name, PipelineStatus state, String type, String title, TimingInfo timingInfo) { this.id = id; this.name = name; - this.state = state.toLowerCase(Locale.ROOT); + this.state = state; this.type = type; this.title = title; this.timingInfo = timingInfo; @@ -46,7 +45,7 @@ public String getName() { return name; } - public String getState() { + public PipelineStatus getState() { return state; } diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineGraphApi.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineGraphApi.java index a73ae52db..f05cc078c 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineGraphApi.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineGraphApi.java @@ -50,26 +50,19 @@ public Integer replay() throws ExecutionException, InterruptedException, Timeout private List getPipelineNodes(PipelineGraphBuilderApi builder) { return builder.getPipelineNodes().stream() - .map(flowNodeWrapper -> { - String state = - flowNodeWrapper.getStatus().getResult().name().toLowerCase(Locale.ROOT); - if (flowNodeWrapper.getStatus().getState() != BlueRun.BlueRunState.FINISHED) { - state = flowNodeWrapper.getStatus().getState().name().toLowerCase(Locale.ROOT); - } - return new PipelineStageInternal( - flowNodeWrapper.getId(), // TODO no need to parse it BO returns a string even though the - // datatype is number on the frontend - flowNodeWrapper.getDisplayName(), - flowNodeWrapper.getParents().stream() - .map(FlowNodeWrapper::getId) - .collect(Collectors.toList()), - state, - flowNodeWrapper.getType().name(), - flowNodeWrapper.getDisplayName(), // TODO blue ocean uses timing information: "Passed in 0s" - flowNodeWrapper.isSynthetic(), - flowNodeWrapper.getTiming(), - getStageNode(flowNodeWrapper)); - }) + .map(flowNodeWrapper -> new PipelineStageInternal( + flowNodeWrapper.getId(), // TODO no need to parse it BO returns a string even though the + // datatype is number on the frontend + flowNodeWrapper.getDisplayName(), + flowNodeWrapper.getParents().stream() + .map(FlowNodeWrapper::getId) + .collect(Collectors.toList()), + PipelineStatus.of(flowNodeWrapper.getStatus()), + flowNodeWrapper.getType().name(), + flowNodeWrapper.getDisplayName(), // TODO blue ocean uses timing information: "Passed in 0s" + flowNodeWrapper.isSynthetic(), + flowNodeWrapper.getTiming(), + getStageNode(flowNodeWrapper))) .collect(Collectors.toList()); } diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStage.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStage.java index e24e3e64a..c75164963 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStage.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStage.java @@ -17,7 +17,7 @@ public PipelineStage( String id, String name, List children, - String state, + PipelineStatus state, String type, String title, String seqContainerName, diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStageInternal.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStageInternal.java index 425413fcb..246fcd902 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStageInternal.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStageInternal.java @@ -2,14 +2,13 @@ import java.util.Collections; import java.util.List; -import java.util.Locale; import org.jenkinsci.plugins.workflow.pipelinegraphanalysis.TimingInfo; -public class PipelineStageInternal { +class PipelineStageInternal { private String name; private List parents; - private String state; // TODO enum + private PipelineStatus state; private String type; // TODO enum private String title; private String id; @@ -24,7 +23,7 @@ public PipelineStageInternal( String id, String name, List parents, - String state, + PipelineStatus state, String type, String title, boolean synthetic, @@ -33,7 +32,7 @@ public PipelineStageInternal( this.id = id; this.name = name; this.parents = parents; - this.state = state.toLowerCase(Locale.ROOT); + this.state = state; this.type = type; this.title = title; this.synthetic = synthetic; @@ -53,7 +52,7 @@ public void setSequential(boolean sequential) { this.sequential = sequential; } - public void setState(String state) { + public void setState(PipelineStatus state) { this.state = state; } @@ -93,7 +92,7 @@ public List getParents() { return parents; } - public String getState() { + public PipelineStatus getState() { return state; } diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatus.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatus.java new file mode 100644 index 000000000..8507b269e --- /dev/null +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatus.java @@ -0,0 +1,47 @@ +package io.jenkins.plugins.pipelinegraphview.utils; + +import com.fasterxml.jackson.annotation.JsonValue; +import java.util.Locale; + +public enum PipelineStatus { + // BlueRunState + QUEUED, + RUNNING, + PAUSED, + SKIPPED, + NOT_BUILT, + FINISHED, + // BlueRunResult + SUCCESS, + UNSTABLE, + FAILURE, + UNKNOWN, + ABORTED; + + public static PipelineStatus of(NodeRunStatus status) { + if (status.getState() == BlueRun.BlueRunState.FINISHED) { + return switch (status.getResult()) { + case SUCCESS -> SUCCESS; + case UNSTABLE -> UNSTABLE; + case FAILURE -> FAILURE; + case NOT_BUILT -> NOT_BUILT; + case UNKNOWN -> UNKNOWN; + case ABORTED -> ABORTED; + }; + } + return switch (status.getState()) { + case QUEUED -> QUEUED; + case RUNNING -> RUNNING; + case PAUSED -> PAUSED; + case SKIPPED -> SKIPPED; + case NOT_BUILT -> NOT_BUILT; + case FINISHED -> FINISHED; // not reached but required for compiler + }; + } + + @JsonValue + @Override + public String toString() { + return name().toLowerCase(Locale.ROOT); + } +} diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStep.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStep.java index e1c8644e5..b76f247bf 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStep.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStep.java @@ -6,7 +6,13 @@ public class PipelineStep extends AbstractPipelineNode { private String stageId; public PipelineStep( - String id, String name, String state, String type, String title, String stageId, TimingInfo timingInfo) { + String id, + String name, + PipelineStatus state, + String type, + String title, + String stageId, + TimingInfo timingInfo) { super(id, name, state, type, title, timingInfo); this.stageId = stageId; } diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStepApi.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStepApi.java index 20f02af57..e58298284 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStepApi.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStepApi.java @@ -3,7 +3,6 @@ import io.jenkins.plugins.pipelinegraphview.treescanner.PipelineNodeGraphAdapter; import io.jenkins.plugins.pipelinegraphview.utils.legacy.PipelineStepVisitor; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.stream.Collectors; import org.jenkinsci.plugins.workflow.job.WorkflowRun; @@ -24,12 +23,6 @@ private List parseSteps(List stepNodes, String st } List steps = stepNodes.stream() .map(flowNodeWrapper -> { - String state = - flowNodeWrapper.getStatus().getResult().name().toLowerCase(Locale.ROOT); - if (flowNodeWrapper.getStatus().getState() != BlueRun.BlueRunState.FINISHED) { - state = flowNodeWrapper.getStatus().getState().name().toLowerCase(Locale.ROOT); - } - String displayName = flowNodeWrapper.getDisplayName(); String title = ""; if (flowNodeWrapper.getType() == FlowNodeWrapper.NodeType.UNHANDLED_EXCEPTION) { @@ -55,7 +48,7 @@ private List parseSteps(List stepNodes, String st return new PipelineStep( flowNodeWrapper.getId(), displayName, - state, + PipelineStatus.of(flowNodeWrapper.getStatus()), flowNodeWrapper.getType().name(), title, // TODO blue ocean uses timing information: "Passed in // 0s" diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/TreeBuilder.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/TreeBuilder.java deleted file mode 100644 index 8b1378917..000000000 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/TreeBuilder.java +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/test/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatusTest.java b/src/test/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatusTest.java new file mode 100644 index 000000000..04b0c5e19 --- /dev/null +++ b/src/test/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatusTest.java @@ -0,0 +1,49 @@ +package io.jenkins.plugins.pipelinegraphview.utils; + +import java.util.stream.Stream; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class PipelineStatusTest { + + @ParameterizedTest + @MethodSource("whenFinished") + void of_usesResultWhenStateIsFinished(BlueRun.BlueRunResult result, PipelineStatus expected) { + NodeRunStatus runStatus = new NodeRunStatus(result, BlueRun.BlueRunState.FINISHED); + + PipelineStatus status = PipelineStatus.of(runStatus); + + Assertions.assertEquals(expected, status); + } + + private static Stream whenFinished() { + return Stream.of( + Arguments.arguments(BlueRun.BlueRunResult.SUCCESS, PipelineStatus.SUCCESS), + Arguments.arguments(BlueRun.BlueRunResult.UNSTABLE, PipelineStatus.UNSTABLE), + Arguments.arguments(BlueRun.BlueRunResult.FAILURE, PipelineStatus.FAILURE), + Arguments.arguments(BlueRun.BlueRunResult.NOT_BUILT, PipelineStatus.NOT_BUILT), + Arguments.arguments(BlueRun.BlueRunResult.UNKNOWN, PipelineStatus.UNKNOWN), + Arguments.arguments(BlueRun.BlueRunResult.ABORTED, PipelineStatus.ABORTED)); + } + + @ParameterizedTest + @MethodSource("whenNotFinished") + void of_usesStateWhenStateIsNotFinished(BlueRun.BlueRunState state, PipelineStatus expected) { + NodeRunStatus runStatus = new NodeRunStatus(null, state); + + PipelineStatus status = PipelineStatus.of(runStatus); + + Assertions.assertEquals(expected, status); + } + + private static Stream whenNotFinished() { + return Stream.of( + Arguments.arguments(BlueRun.BlueRunState.QUEUED, PipelineStatus.QUEUED), + Arguments.arguments(BlueRun.BlueRunState.RUNNING, PipelineStatus.RUNNING), + Arguments.arguments(BlueRun.BlueRunState.PAUSED, PipelineStatus.PAUSED), + Arguments.arguments(BlueRun.BlueRunState.SKIPPED, PipelineStatus.SKIPPED), + Arguments.arguments(BlueRun.BlueRunState.NOT_BUILT, PipelineStatus.NOT_BUILT)); + } +} From 64e80b457cb4037f8dfb20f1e66c2064c71539a7 Mon Sep 17 00:00:00 2001 From: lewisbirks <22620804+lewisbirks@users.noreply.github.com> Date: Tue, 22 Apr 2025 11:23:30 +0100 Subject: [PATCH 2/4] Add test for serialization backwards compatibility --- .../utils/PipelineStatusTest.java | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/test/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatusTest.java b/src/test/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatusTest.java index 04b0c5e19..ddcc6e262 100644 --- a/src/test/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatusTest.java +++ b/src/test/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatusTest.java @@ -1,9 +1,13 @@ package io.jenkins.plugins.pipelinegraphview.utils; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import java.util.stream.Stream; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.MethodSource; class PipelineStatusTest { @@ -15,7 +19,7 @@ void of_usesResultWhenStateIsFinished(BlueRun.BlueRunResult result, PipelineStat PipelineStatus status = PipelineStatus.of(runStatus); - Assertions.assertEquals(expected, status); + assertEquals(expected, status); } private static Stream whenFinished() { @@ -35,7 +39,7 @@ void of_usesStateWhenStateIsNotFinished(BlueRun.BlueRunState state, PipelineStat PipelineStatus status = PipelineStatus.of(runStatus); - Assertions.assertEquals(expected, status); + assertEquals(expected, status); } private static Stream whenNotFinished() { @@ -46,4 +50,28 @@ private static Stream whenNotFinished() { Arguments.arguments(BlueRun.BlueRunState.SKIPPED, PipelineStatus.SKIPPED), Arguments.arguments(BlueRun.BlueRunState.NOT_BUILT, PipelineStatus.NOT_BUILT)); } + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @ParameterizedTest + @CsvSource({ + "QUEUED, queued", + "RUNNING, running", + "PAUSED, paused", + "SKIPPED, skipped", + "NOT_BUILT, not_built", + "FINISHED, finished", + "SUCCESS, success", + "UNSTABLE, unstable", + "FAILURE, failure", + "UNKNOWN, unknown", + "ABORTED, aborted" + }) + void serialization(String input, String expected) throws JsonProcessingException { + PipelineStatus status = PipelineStatus.valueOf(input); + + String serialized = MAPPER.writeValueAsString(status); + + assertEquals("\"%s\"".formatted(expected), serialized); + } } From 45c0da834ccfffcc724cd401065ca80630fd6b1d Mon Sep 17 00:00:00 2001 From: lewisbirks <22620804+lewisbirks@users.noreply.github.com> Date: Tue, 22 Apr 2025 11:27:41 +0100 Subject: [PATCH 3/4] Rename Status to State Signed-off-by: lewisbirks <22620804+lewisbirks@users.noreply.github.com> --- .../utils/AbstractPipelineNode.java | 6 ++-- .../utils/PipelineGraphApi.java | 2 +- .../utils/PipelineStage.java | 2 +- .../utils/PipelineStageInternal.java | 8 ++--- ...PipelineStatus.java => PipelineState.java} | 4 +-- .../pipelinegraphview/utils/PipelineStep.java | 2 +- .../utils/PipelineStepApi.java | 2 +- ...StatusTest.java => PipelineStateTest.java} | 34 +++++++++---------- 8 files changed, 30 insertions(+), 30 deletions(-) rename src/main/java/io/jenkins/plugins/pipelinegraphview/utils/{PipelineStatus.java => PipelineState.java} (92%) rename src/test/java/io/jenkins/plugins/pipelinegraphview/utils/{PipelineStatusTest.java => PipelineStateTest.java} (80%) diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/AbstractPipelineNode.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/AbstractPipelineNode.java index 8d4a3753c..5560bd8a7 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/AbstractPipelineNode.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/AbstractPipelineNode.java @@ -4,7 +4,7 @@ public class AbstractPipelineNode { private String name; - private PipelineStatus state; + private PipelineState state; private String type; // TODO enum private String title; private String id; @@ -13,7 +13,7 @@ public class AbstractPipelineNode { private TimingInfo timingInfo; public AbstractPipelineNode( - String id, String name, PipelineStatus state, String type, String title, TimingInfo timingInfo) { + String id, String name, PipelineState state, String type, String title, TimingInfo timingInfo) { this.id = id; this.name = name; this.state = state; @@ -45,7 +45,7 @@ public String getName() { return name; } - public PipelineStatus getState() { + public PipelineState getState() { return state; } diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineGraphApi.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineGraphApi.java index f05cc078c..4ab06b347 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineGraphApi.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineGraphApi.java @@ -57,7 +57,7 @@ private List getPipelineNodes(PipelineGraphBuilderApi bui flowNodeWrapper.getParents().stream() .map(FlowNodeWrapper::getId) .collect(Collectors.toList()), - PipelineStatus.of(flowNodeWrapper.getStatus()), + PipelineState.of(flowNodeWrapper.getStatus()), flowNodeWrapper.getType().name(), flowNodeWrapper.getDisplayName(), // TODO blue ocean uses timing information: "Passed in 0s" flowNodeWrapper.isSynthetic(), diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStage.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStage.java index c75164963..c37798876 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStage.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStage.java @@ -17,7 +17,7 @@ public PipelineStage( String id, String name, List children, - PipelineStatus state, + PipelineState state, String type, String title, String seqContainerName, diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStageInternal.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStageInternal.java index 246fcd902..4ea127701 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStageInternal.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStageInternal.java @@ -8,7 +8,7 @@ class PipelineStageInternal { private String name; private List parents; - private PipelineStatus state; + private PipelineState state; private String type; // TODO enum private String title; private String id; @@ -23,7 +23,7 @@ public PipelineStageInternal( String id, String name, List parents, - PipelineStatus state, + PipelineState state, String type, String title, boolean synthetic, @@ -52,7 +52,7 @@ public void setSequential(boolean sequential) { this.sequential = sequential; } - public void setState(PipelineStatus state) { + public void setState(PipelineState state) { this.state = state; } @@ -92,7 +92,7 @@ public List getParents() { return parents; } - public PipelineStatus getState() { + public PipelineState getState() { return state; } diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatus.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineState.java similarity index 92% rename from src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatus.java rename to src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineState.java index 8507b269e..630ec6938 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatus.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineState.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonValue; import java.util.Locale; -public enum PipelineStatus { +public enum PipelineState { // BlueRunState QUEUED, RUNNING, @@ -18,7 +18,7 @@ public enum PipelineStatus { UNKNOWN, ABORTED; - public static PipelineStatus of(NodeRunStatus status) { + public static PipelineState of(NodeRunStatus status) { if (status.getState() == BlueRun.BlueRunState.FINISHED) { return switch (status.getResult()) { case SUCCESS -> SUCCESS; diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStep.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStep.java index b76f247bf..1df34f5b3 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStep.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStep.java @@ -8,7 +8,7 @@ public class PipelineStep extends AbstractPipelineNode { public PipelineStep( String id, String name, - PipelineStatus state, + PipelineState state, String type, String title, String stageId, diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStepApi.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStepApi.java index e58298284..ca9aadb56 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStepApi.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStepApi.java @@ -48,7 +48,7 @@ private List parseSteps(List stepNodes, String st return new PipelineStep( flowNodeWrapper.getId(), displayName, - PipelineStatus.of(flowNodeWrapper.getStatus()), + PipelineState.of(flowNodeWrapper.getStatus()), flowNodeWrapper.getType().name(), title, // TODO blue ocean uses timing information: "Passed in // 0s" diff --git a/src/test/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatusTest.java b/src/test/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStateTest.java similarity index 80% rename from src/test/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatusTest.java rename to src/test/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStateTest.java index ddcc6e262..9b6989c6c 100644 --- a/src/test/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStatusTest.java +++ b/src/test/java/io/jenkins/plugins/pipelinegraphview/utils/PipelineStateTest.java @@ -10,45 +10,45 @@ import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.MethodSource; -class PipelineStatusTest { +class PipelineStateTest { @ParameterizedTest @MethodSource("whenFinished") - void of_usesResultWhenStateIsFinished(BlueRun.BlueRunResult result, PipelineStatus expected) { + void of_usesResultWhenStateIsFinished(BlueRun.BlueRunResult result, PipelineState expected) { NodeRunStatus runStatus = new NodeRunStatus(result, BlueRun.BlueRunState.FINISHED); - PipelineStatus status = PipelineStatus.of(runStatus); + PipelineState status = PipelineState.of(runStatus); assertEquals(expected, status); } private static Stream whenFinished() { return Stream.of( - Arguments.arguments(BlueRun.BlueRunResult.SUCCESS, PipelineStatus.SUCCESS), - Arguments.arguments(BlueRun.BlueRunResult.UNSTABLE, PipelineStatus.UNSTABLE), - Arguments.arguments(BlueRun.BlueRunResult.FAILURE, PipelineStatus.FAILURE), - Arguments.arguments(BlueRun.BlueRunResult.NOT_BUILT, PipelineStatus.NOT_BUILT), - Arguments.arguments(BlueRun.BlueRunResult.UNKNOWN, PipelineStatus.UNKNOWN), - Arguments.arguments(BlueRun.BlueRunResult.ABORTED, PipelineStatus.ABORTED)); + Arguments.arguments(BlueRun.BlueRunResult.SUCCESS, PipelineState.SUCCESS), + Arguments.arguments(BlueRun.BlueRunResult.UNSTABLE, PipelineState.UNSTABLE), + Arguments.arguments(BlueRun.BlueRunResult.FAILURE, PipelineState.FAILURE), + Arguments.arguments(BlueRun.BlueRunResult.NOT_BUILT, PipelineState.NOT_BUILT), + Arguments.arguments(BlueRun.BlueRunResult.UNKNOWN, PipelineState.UNKNOWN), + Arguments.arguments(BlueRun.BlueRunResult.ABORTED, PipelineState.ABORTED)); } @ParameterizedTest @MethodSource("whenNotFinished") - void of_usesStateWhenStateIsNotFinished(BlueRun.BlueRunState state, PipelineStatus expected) { + void of_usesStateWhenStateIsNotFinished(BlueRun.BlueRunState state, PipelineState expected) { NodeRunStatus runStatus = new NodeRunStatus(null, state); - PipelineStatus status = PipelineStatus.of(runStatus); + PipelineState status = PipelineState.of(runStatus); assertEquals(expected, status); } private static Stream whenNotFinished() { return Stream.of( - Arguments.arguments(BlueRun.BlueRunState.QUEUED, PipelineStatus.QUEUED), - Arguments.arguments(BlueRun.BlueRunState.RUNNING, PipelineStatus.RUNNING), - Arguments.arguments(BlueRun.BlueRunState.PAUSED, PipelineStatus.PAUSED), - Arguments.arguments(BlueRun.BlueRunState.SKIPPED, PipelineStatus.SKIPPED), - Arguments.arguments(BlueRun.BlueRunState.NOT_BUILT, PipelineStatus.NOT_BUILT)); + Arguments.arguments(BlueRun.BlueRunState.QUEUED, PipelineState.QUEUED), + Arguments.arguments(BlueRun.BlueRunState.RUNNING, PipelineState.RUNNING), + Arguments.arguments(BlueRun.BlueRunState.PAUSED, PipelineState.PAUSED), + Arguments.arguments(BlueRun.BlueRunState.SKIPPED, PipelineState.SKIPPED), + Arguments.arguments(BlueRun.BlueRunState.NOT_BUILT, PipelineState.NOT_BUILT)); } private static final ObjectMapper MAPPER = new ObjectMapper(); @@ -68,7 +68,7 @@ private static Stream whenNotFinished() { "ABORTED, aborted" }) void serialization(String input, String expected) throws JsonProcessingException { - PipelineStatus status = PipelineStatus.valueOf(input); + PipelineState status = PipelineState.valueOf(input); String serialized = MAPPER.writeValueAsString(status); From 6e238f8cdab58f7f40640660f3065ce7db80f6d6 Mon Sep 17 00:00:00 2001 From: lewisbirks <22620804+lewisbirks@users.noreply.github.com> Date: Tue, 22 Apr 2025 11:35:14 +0100 Subject: [PATCH 4/4] remove decodeResultValue as it shouldn't be needed now --- .../pipeline-console/main/PipelineConsoleModel.tsx | 5 +---- .../pipeline-graph/main/PipelineGraphModel.tsx | 13 +------------ .../pipeline-graph/main/support/nodes.tsx | 7 ++----- 3 files changed, 4 insertions(+), 21 deletions(-) diff --git a/src/main/frontend/pipeline-console-view/pipeline-console/main/PipelineConsoleModel.tsx b/src/main/frontend/pipeline-console-view/pipeline-console/main/PipelineConsoleModel.tsx index b8e67e271..b9cef2d45 100644 --- a/src/main/frontend/pipeline-console-view/pipeline-console/main/PipelineConsoleModel.tsx +++ b/src/main/frontend/pipeline-console-view/pipeline-console/main/PipelineConsoleModel.tsx @@ -1,10 +1,7 @@ import { Result } from "../../../pipeline-graph-view/pipeline-graph/main/PipelineGraphModel"; // re-export Result so the relative path exists in one location. -export { - Result, - decodeResultValue, -} from "../../../pipeline-graph-view/pipeline-graph/main/PipelineGraphModel"; +export { Result } from "../../../pipeline-graph-view/pipeline-graph/main/PipelineGraphModel"; export type { StageInfo, diff --git a/src/main/frontend/pipeline-graph-view/pipeline-graph/main/PipelineGraphModel.tsx b/src/main/frontend/pipeline-graph-view/pipeline-graph/main/PipelineGraphModel.tsx index b16cd282b..fd8755ea9 100644 --- a/src/main/frontend/pipeline-graph-view/pipeline-graph/main/PipelineGraphModel.tsx +++ b/src/main/frontend/pipeline-graph-view/pipeline-graph/main/PipelineGraphModel.tsx @@ -8,18 +8,7 @@ export enum Result { aborted = "aborted", not_built = "not_built", // May be pending, or job was ended before this point skipped = "skipped", // excluded via pipeline "when" clause - unknown = "unknown", // bad data or client code needs updating for new values -} - -export function decodeResultValue(resultMaybe: any): Result { - const lcase = String(resultMaybe).toLowerCase(); - - // TODO: validate this - if ((Object.values(Result) as any).includes(lcase)) { - return lcase as Result; - } - - return Result.unknown; + unknown = "unknown", // bad data } // Dimensions used for layout, px diff --git a/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/nodes.tsx b/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/nodes.tsx index d696b3f85..99eddbd3a 100644 --- a/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/nodes.tsx +++ b/src/main/frontend/pipeline-graph-view/pipeline-graph/main/support/nodes.tsx @@ -1,7 +1,7 @@ import * as React from "react"; +import { CSSProperties } from "react"; import { - decodeResultValue, LayoutInfo, NodeColumn, NodeInfo, @@ -10,7 +10,6 @@ import { import StatusIcon, { resultToColor, } from "../../../../common/components/status-icon"; -import { CSSProperties } from "react"; type SVGChildren = Array; // Fixme: Maybe refine this? Not sure what should go here, we have working code I can't make typecheck @@ -40,8 +39,6 @@ export function Node({ node }: NodeProps) { } const { title, state, url } = node.stage ?? {}; - const resultClean = decodeResultValue(state); - groupChildren.push(