@@ -97,34 +97,41 @@ func (ch *ClusterHandler) ListClusters(c *gin.Context) {
9797
9898// AddClusters add the clusters which has deployed crane server. cluster info must has valid & accessible crane server url
9999func (ch * ClusterHandler ) AddClusters (c * gin.Context ) {
100- var r AddClustersRequest
101- if err := c .ShouldBindJSON (& r ); err != nil {
100+ var request AddClustersRequest
101+ if err := c .ShouldBindJSON (& request ); err != nil {
102102 ginwrapper .WriteResponse (c , err , nil )
103103 return
104104 }
105105
106- if len (r .Clusters ) == 0 {
107- ginwrapper .WriteResponse (c , fmt .Errorf ("req is empty, check your input para " ), nil )
106+ if len (request .Clusters ) == 0 {
107+ ginwrapper .WriteResponse (c , fmt .Errorf ("no clusters provided " ), nil )
108108 return
109109 }
110110
111111 clustersMap , err := ch .getClusterMap ()
112+
112113 if err != nil {
113114 ginwrapper .WriteResponse (c , err , nil )
114115 return
115116 }
116117
117- for _ , cluster := range r .Clusters {
118- if cluster .CraneUrl == "" || cluster .Name == "" {
119- err := fmt .Errorf ("cluster CraneUrl, Name field must not be empty" )
120- ginwrapper .WriteResponse (c , err , nil )
121- return
118+ var errors []error
119+ var addedClusters []* store.Cluster
120+
121+ for _ , cluster := range request .Clusters {
122+ if err := validateCluster (cluster ); err != nil {
123+ errors = append (errors , err )
124+ continue
122125 }
123126
124- if ! IsUrl (cluster .CraneUrl ) {
125- err := fmt .Errorf ("cluster CraneUrl %v is not valid url" , cluster .CraneUrl )
126- ginwrapper .WriteResponse (c , err , nil )
127- return
127+ if _ , ok := clustersMap [cluster .Id ]; ok {
128+ errors = append (errors , fmt .Errorf ("cluster id %v duplicated" , cluster .Id ))
129+ continue
130+ }
131+
132+ if cluster .CraneUrlDuplicated (clustersMap ) {
133+ errors = append (errors , fmt .Errorf ("cluster CraneUrl %v duplicated" , cluster .CraneUrl ))
134+ continue
128135 }
129136
130137 if cluster .Id == "" {
@@ -136,49 +143,62 @@ func (ch *ClusterHandler) AddClusters(c *gin.Context) {
136143 cluster .Discount = 100
137144 }
138145
139- if _ , ok := clustersMap [cluster .Id ]; ok {
140- err := fmt .Errorf ("cluster id %v duplicated" , cluster .Id )
141- ginwrapper .WriteResponse (c , err , nil )
142- return
143- }
146+ clustersMap [cluster .Id ] = cluster
144147
145- if cluster .CraneUrlDuplicated (clustersMap ) {
146- err := fmt .Errorf ("cluster CraneUlr %v duplicated" , cluster .CraneUrl )
147- ginwrapper .WriteResponse (c , err , nil )
148- return
149- }
148+ addedClusters = append (addedClusters , cluster )
149+ }
150150
151- clustersMap [cluster .Id ] = cluster
151+ if len (errors ) > 0 {
152+ ginwrapper .WriteResponse (c , fmt .Errorf ("encountered errors adding clusters: %v" , errors ), nil )
153+ return
152154 }
153155
154- for _ , cluster := range r .Clusters {
155- err := ch .clusterSrv .AddCluster (context .TODO (), cluster )
156- if err != nil {
157- ginwrapper .WriteResponse (c , err , nil )
158- return
156+ for _ , cluster := range addedClusters {
157+ if err := ch .clusterSrv .AddCluster (context .TODO (), cluster ); err != nil {
158+ errors = append (errors , err )
159+ continue
159160 }
160161
161- if cluster .PreinstallRecommendation && err == nil {
162- err := ch .upsertRecommendationRule (RecommendationRuleWorkloadsName , RecommendationRuleWorkloadsYAML )
163- if err != nil {
164- ginwrapper .WriteResponse (c , err , nil )
165- return
166- }
167-
168- err = ch .upsertRecommendationRule (RecommendationRuleIdleNodeName , RecommendationRuleIdleNodeYAML )
169- if err != nil {
170- ginwrapper .WriteResponse (c , err , nil )
171- return
162+ if cluster .PreinstallRecommendation {
163+ if err := ch .upsertRecommendationRules (); err != nil {
164+ errors = append (errors , err )
165+ continue
172166 }
173- } else if err != nil {
174- ginwrapper .WriteResponse (c , err , nil )
175- return
176167 }
177168 }
178169
170+ if len (errors ) > 0 {
171+ ginwrapper .WriteResponse (c , fmt .Errorf ("encountered errors adding clusters: %v" , errors ), nil )
172+ return
173+ }
174+
179175 ginwrapper .WriteResponse (c , nil , nil )
180176}
181177
178+ func validateCluster (cluster * store.Cluster ) error {
179+ if cluster .CraneUrl == "" || cluster .Name == "" {
180+ return fmt .Errorf ("cluster CraneUrl or Name field is empty" )
181+ }
182+
183+ if ! IsUrl (cluster .CraneUrl ) {
184+ return fmt .Errorf ("cluster CraneUrl %v is not valid url" , cluster .CraneUrl )
185+ }
186+
187+ return nil
188+ }
189+
190+ func (ch * ClusterHandler ) upsertRecommendationRules () error {
191+ if err := ch .upsertRecommendationRule (RecommendationRuleWorkloadsName , RecommendationRuleWorkloadsYAML ); err != nil {
192+ return err
193+ }
194+
195+ if err := ch .upsertRecommendationRule (RecommendationRuleIdleNodeName , RecommendationRuleIdleNodeYAML ); err != nil {
196+ return err
197+ }
198+
199+ return nil
200+ }
201+
182202// UpdateCluster the clusters crane info
183203func (ch * ClusterHandler ) UpdateCluster (c * gin.Context ) {
184204 var r store.Cluster
0 commit comments