11package org .opendevstack .projects_info_service .server .facade ;
22
3+ import jakarta .annotation .PostConstruct ;
4+ import lombok .extern .slf4j .Slf4j ;
5+ import org .apache .commons .lang3 .StringUtils ;
36import org .opendevstack .projects_info_service .configuration .ClusterConfiguration ;
47import org .opendevstack .projects_info_service .server .annotations .CacheableWithFallback ;
58import org .opendevstack .projects_info_service .server .client .AzureGraphClient ;
811import org .opendevstack .projects_info_service .server .dto .ProjectInfo ;
912import org .opendevstack .projects_info_service .server .dto .ProjectPlatforms ;
1013import org .opendevstack .projects_info_service .server .dto .Section ;
14+ import org .opendevstack .projects_info_service .server .model .OpenshiftProjectCluster ;
1115import org .opendevstack .projects_info_service .server .model .PlatformsWithTitle ;
1216import org .opendevstack .projects_info_service .server .security .GroupValidatorService ;
1317import org .opendevstack .projects_info_service .server .service .EdpProjectsService ;
1418import org .opendevstack .projects_info_service .server .service .MocksService ;
1519import org .opendevstack .projects_info_service .server .service .OpenShiftProjectService ;
1620import org .opendevstack .projects_info_service .server .service .PlatformService ;
17- import jakarta .annotation .PostConstruct ;
18- import lombok .extern .slf4j .Slf4j ;
19- import org .apache .commons .lang3 .StringUtils ;
2021import org .springframework .stereotype .Component ;
2122
2223import java .util .*;
@@ -36,13 +37,13 @@ public class ProjectsFacade {
3637
3738 private final PlatformService platformService ;
3839
39- private final GroupValidatorService groupValidatorService ;
40+ private final GroupValidatorService groupValidatorService ;
4041
4142 private final ClusterConfiguration clusterConfiguration ;
4243
4344 private Map <String , String > clusterMapper ;
4445
45- private final ProjectWhitelistYmlClient projectWhitelistYmlClient ;
46+ private final ProjectWhitelistYmlClient projectWhitelistYmlClient ;
4647
4748 public ProjectsFacade (AzureGraphClient azureGraphClient ,
4849 OpenShiftProjectService openShiftProjectService ,
@@ -68,7 +69,7 @@ void initializeClusterMapper() {
6869
6970 Map <String , String > result = new HashMap <>();
7071
71- mapper .forEach ( (key , value ) -> {
72+ mapper .forEach ((key , value ) -> {
7273 var values = value .split ("," );
7374
7475 for (String val : values ) {
@@ -97,19 +98,19 @@ public Map<String, ProjectInfo> getProjects(String token) {
9798 Map <String , ProjectInfo > result = new HashMap <>();
9899
99100 edpProjects .forEach (edpProject -> {
100- if (result .containsKey (edpProject .getProjectKey ())) {
101- var resultProjectClusters = result .get (edpProject .getProjectKey ()).getClusters ();
102- var edpProjectClusters = edpProject .getClusters ();
103-
104- // Merge clusters if project already exists
105- var mergedClusters = Stream .concat (resultProjectClusters .stream (), edpProjectClusters .stream ())
106- .distinct ()
107- .toList ();
108-
109- result .get (edpProject .getProjectKey ()).setClusters (mergedClusters );
110- } else {
111- result .put (edpProject .getProjectKey (), edpProject );
112- }
101+ if (result .containsKey (edpProject .getProjectKey ())) {
102+ var resultProjectClusters = result .get (edpProject .getProjectKey ()).getClusters ();
103+ var edpProjectClusters = edpProject .getClusters ();
104+
105+ // Merge clusters if project already exists
106+ var mergedClusters = Stream .concat (resultProjectClusters .stream (), edpProjectClusters .stream ())
107+ .distinct ()
108+ .toList ();
109+
110+ result .get (edpProject .getProjectKey ()).setClusters (mergedClusters );
111+ } else {
112+ result .put (edpProject .getProjectKey (), edpProject );
113+ }
113114 });
114115
115116 for (Map .Entry <String , ProjectInfo > mockEntry : mockProjects .entrySet ()) {
@@ -129,36 +130,39 @@ public ProjectPlatforms getProjectPlatforms(String projectKey) {
129130 var allEdpProjectsInfo = openShiftProjectService .fetchProjects ();
130131 var mockProjectsAndClusters = mocksService .getDefaultProjectsAndClusters ();
131132
132- var edProjectInfo = allEdpProjectsInfo .stream ()
133+ var edpProjectsInfo = allEdpProjectsInfo .stream ()
133134 .filter (p -> p .getProject ().equals (projectKey ))
134- .findFirst ();
135+ .toList ();
135136
136137 var mockClusters = mockProjectsAndClusters .entrySet ().stream ()
137138 .filter (e -> e .getValue ().getProjectKey ().equals (projectKey ))
138139 .flatMap (e -> e .getValue ().getClusters ().stream ())
139140 .toList ();
140141
141142 // If EDP project exists, add its clusters to the front of the list, so we prioritize them
142- var mergedClusters = edProjectInfo .map (projectInfo -> {
143- List <String > clusters = new ArrayList <>();
144-
145- clusters .add (projectInfo .getCluster ());
146-
147- clusters .addAll (mockClusters );
143+ var mergedClusters = new ArrayList <String >();
144+
145+ if (!edpProjectsInfo .isEmpty ()) {
146+ mergedClusters .addAll (
147+ edpProjectsInfo .stream ()
148+ .map (OpenshiftProjectCluster ::getCluster )
149+ .toList ()
150+ );
151+ }
148152
149- return List . copyOf ( clusters ); // We always prefer immutable lists
150- }). orElse ( mockClusters );
153+ mergedClusters . addAll ( mockClusters );
154+ var sanitizedClusters = sanitizeClusters ( mergedClusters );
151155
152- if (mergedClusters .isEmpty ()) {
156+ if (sanitizedClusters .isEmpty ()) {
153157 log .debug ("Project not found: {}" , projectKey );
154158
155159 return null ;
156160 } else {
157- log .debug ("Project found: {}, returning ProjectPlatforms for clusters: {}." , projectKey , mergedClusters );
158-
159- List <Section > sections = new ArrayList <>( platformService . getSections ( projectKey , mergedClusters . getFirst ()) );
161+ log .debug ("Project found: {}, returning ProjectPlatforms for clusters: {}." , projectKey , sanitizedClusters );
162+ var clusters = getClusterBySanitizedValue ( clusterMapper , sanitizedClusters . getFirst ());
163+ List <Section > sections = getSectionFromFirstAvailableCluster ( projectKey , clusters );
160164 var disabledPlatforms = platformService .getDisabledPlatforms (projectKey );
161- var platformsWithTitle = platformService . getPlatforms (projectKey , mergedClusters . getFirst () );
165+ var platformsWithTitle = getPlatformsWithTitleFromFirstAvailableCluster (projectKey , clusters );
162166
163167 var firstSection = componseFirstSection (platformsWithTitle , disabledPlatforms );
164168
@@ -223,4 +227,32 @@ private List<String> sanitizeClusters(List<String> clusters) {
223227 return new ArrayList <>(sanitizedClusters );
224228 }
225229
230+ private <K , V > List <K > getClusterBySanitizedValue (Map <K , V > map , V value ) {
231+ return map .entrySet ().stream ()
232+ .filter (entry -> Objects .equals (entry .getValue (), value ))
233+ .map (Map .Entry ::getKey )
234+ .toList ();
235+ }
236+
237+ private List <Section > getSectionFromFirstAvailableCluster (String projectKey , List <String > clusters ) {
238+ for (String cluster : clusters ) {
239+ try {
240+ return new ArrayList <>(platformService .getSections (projectKey , cluster ));
241+ } catch (Exception e ) {
242+ log .warn ("In sections for projectKey {}, cluster is not configured: {}." , projectKey , cluster , e );
243+ }
244+ }
245+ return List .of ();
246+ }
247+
248+ private PlatformsWithTitle getPlatformsWithTitleFromFirstAvailableCluster (String projectKey , List <String > clusters ) {
249+ for (String cluster : clusters ) {
250+ try {
251+ return platformService .getPlatforms (projectKey , cluster );
252+ } catch (Exception e ) {
253+ log .warn ("In platforms for projectKey {}, cluster is not configured: {}." , projectKey , cluster , e );
254+ }
255+ }
256+ return new PlatformsWithTitle ();
257+ }
226258}
0 commit comments