From f22ddd2dcce5826131521e0c1a0be41bff7b4508 Mon Sep 17 00:00:00 2001 From: Christos Arvanitis Date: Fri, 17 Jan 2025 20:43:52 +0200 Subject: [PATCH] feat(web): Exclude Disabled pipelines query parameter (#1520) --- .../controllers/PipelineController.java | 26 ++++++++++++- .../controllers/PipelineControllerTck.groovy | 38 ++++++++++++++++++- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/PipelineController.java b/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/PipelineController.java index 6559df5e7..c6df3ca90 100644 --- a/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/PipelineController.java +++ b/front50-web/src/main/java/com/netflix/spinnaker/front50/controllers/PipelineController.java @@ -202,11 +202,35 @@ public Collection getTriggeredPipelines( public List listByApplication( @PathVariable(value = "application") String application, @RequestParam(value = "pipelineNameFilter", required = false) String pipelineNameFilter, - @RequestParam(required = false, value = "refresh", defaultValue = "true") boolean refresh) { + @RequestParam(required = false, value = "refresh", defaultValue = "true") boolean refresh, + @RequestParam(required = false, value = "enabledPipelines") Boolean enabledPipelines) { List pipelines = new ArrayList<>( pipelineDAO.getPipelinesByApplication(application, pipelineNameFilter, refresh)); + if (enabledPipelines == null) { + return sortPipelines(pipelines); + } + + Predicate pipelinePredicate = + pipeline -> { + // pipeline.getDisabled may be null, so check that before comparing. If + // pipeline.getDisabled is null, the pipeline is enabled. + boolean pipelineEnabled = + (pipeline.getDisabled() == null) || (pipeline.getDisabled() == false); + + return ((enabledPipelines == null) || (pipelineEnabled == enabledPipelines)); + }; + + List retval = + pipelines.stream().filter(pipelinePredicate).collect(Collectors.toList()); + + log.debug("returning {} of {} total pipeline(s)", retval.size(), pipelines.size()); + + return sortPipelines(retval); + } + + private List sortPipelines(List pipelines) { pipelines.sort( (p1, p2) -> { if (p1.getIndex() != null && p2.getIndex() == null) { diff --git a/front50-web/src/test/groovy/com/netflix/spinnaker/front50/controllers/PipelineControllerTck.groovy b/front50-web/src/test/groovy/com/netflix/spinnaker/front50/controllers/PipelineControllerTck.groovy index 87f71818c..5908146c9 100644 --- a/front50-web/src/test/groovy/com/netflix/spinnaker/front50/controllers/PipelineControllerTck.groovy +++ b/front50-web/src/test/groovy/com/netflix/spinnaker/front50/controllers/PipelineControllerTck.groovy @@ -137,7 +137,7 @@ abstract class PipelineControllerTck extends Specification { void "should provide a valid, unique index when listing all for an application"() { given: pipelineDAO.create(null, new Pipeline([ - name: "c", application: "test" + name: "c", application: "test", "disabled": true ])) pipelineDAO.create(null, new Pipeline([ name: "b", application: "test" @@ -149,7 +149,7 @@ abstract class PipelineControllerTck extends Specification { name: "b1", application: "test", index: 1 ])) pipelineDAO.create(null, new Pipeline([ - name: "a3", application: "test", index: 3 + name: "a3", application: "test", index: 3, "disabled": true ])) when: @@ -161,6 +161,40 @@ abstract class PipelineControllerTck extends Specification { .andExpect(jsonPath('$.[*].index').value([0, 1, 2, 3, 4])) } + @Unroll + void "should provide a valid, unique index when listing all for an application excluding the disabled Pipelines - enabledPipelines"() { + given: + pipelineDAO.create(null, new Pipeline([ + name: "c", application: "test", "disabled": true + ])) + pipelineDAO.create(null, new Pipeline([ + name: "b", application: "test" + ])) + pipelineDAO.create(null, new Pipeline([ + name: "a1", application: "test", index: 1 + ])) + pipelineDAO.create(null, new Pipeline([ + name: "b1", application: "test", index: 1 + ])) + pipelineDAO.create(null, new Pipeline([ + name: "a3", application: "test", index: 3, "disabled": true + ])) + + when: + def response = mockMvc.perform(get("/pipelines/test?enabledPipelines=${filter}")) + + then: + response + .andExpect(jsonPath('$.[*].name').value(nameExpectedArray)) + .andExpect(jsonPath('$.[*].index').value(indexExpectedArray)) + + where: + filter || nameExpectedArray | indexExpectedArray + "" || ["a1","b1","a3","b","c"] | [0, 1, 2, 3, 4] + false || ["a3", "c"] | [0, 1] + true || ["a1","b1","b"] | [0, 1, 2] + } + void "should use pipelineNameFilter when getting pipelines for an application"() { given: pipelineDAO.create("0", new Pipeline(application: "test", name: "pipelineName1"))