From c07e1a770614adccf0052ca100f4d10ff3568465 Mon Sep 17 00:00:00 2001 From: Joe Cavanagh Date: Tue, 27 Apr 2021 17:37:35 -0500 Subject: [PATCH] fix(core): Unable to list project clusters The affected code is attempting to merge image lists from the "same" builds across various clusters. In the case of Kubernetes, the list returned from KubernetesImageSummary is immutable. So, always convert the (maybe) immutable list from the ImageSummary implementation to a regular mutable list. Resolves #6149 --- .../core/ProjectClustersService.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/clouddriver-core/src/main/java/com/netflix/spinnaker/clouddriver/core/ProjectClustersService.java b/clouddriver-core/src/main/java/com/netflix/spinnaker/clouddriver/core/ProjectClustersService.java index 746778d7639..add627d695b 100644 --- a/clouddriver-core/src/main/java/com/netflix/spinnaker/clouddriver/core/ProjectClustersService.java +++ b/clouddriver-core/src/main/java/com/netflix/spinnaker/clouddriver/core/ProjectClustersService.java @@ -299,7 +299,7 @@ static class ApplicationClusterModel { new OptionalConsumer<>( (DeployedBuild b) -> { b.deployed = Math.max(b.deployed, serverGroup.getCreatedTime()); - List images = getServerGroupBuildInfoImages(imageSummaries); + List images = getServerGroupBuildInfoImages(imageSummaries); if (images != null) { images.forEach( image -> { @@ -376,9 +376,10 @@ static class DeployedBuild { public String job; public String buildNumber; public Long deployed; - public List images; + public List images; - public DeployedBuild(String host, String job, String buildNumber, Long deployed, List images) { + public DeployedBuild( + String host, String job, String buildNumber, Long deployed, List images) { this.host = host; this.job = job; this.buildNumber = buildNumber; @@ -426,7 +427,7 @@ private static JenkinsBuildInfo extractJenkinsBuildInfo( return new JenkinsBuildInfo(buildNumber, host, job); } - private static List getServerGroupBuildInfoImages( + private static List getServerGroupBuildInfoImages( List imageSummaries) { if (imageSummaries.isEmpty()) { return null; @@ -437,7 +438,17 @@ private static List getServerGroupBuildInfoImages( return null; } - return (List) buildInfo.get("images"); + try { + // Some ImageSummary implementations use immutable image collections, so this needs to be + // copied to a mutable one. Notably, KubernetesImageSummary images are immutable. + return new ArrayList<>((List) buildInfo.get("images")); + } catch (ClassCastException e) { + log.warn( + "Expected List for buildInfo images list, but was not. serverGroup={}", + imageSummary.getServerGroupName(), + e); + return new ArrayList<>(); + } } private static class OptionalConsumer implements Consumer> {