@@ -158,13 +158,8 @@ func (r *IONOSCloudClusterReconciler) reconcileNormal(ctx *context.ClusterContex
158158 return * result , err
159159 }
160160
161- if result , err := r .reconcilePrivateLan (ctx ); err != nil {
162- conditions .MarkFalse (ctx .IONOSCloudCluster , v1alpha1 .PrivateLanCreatedCondition , v1alpha1 .PrivateLanCreationFailedReason , clusterv1 .ConditionSeverityError , err .Error ())
163- return * result , err
164- }
165-
166- if result , err := r .reconcilePublicLan (ctx ); err != nil {
167- conditions .MarkFalse (ctx .IONOSCloudCluster , v1alpha1 .PublicLanCreatedCondition , v1alpha1 .PublicLanCreationFailedReason , clusterv1 .ConditionSeverityError , err .Error ())
161+ if result , err := r .reconcileLan (ctx ); err != nil {
162+ conditions .MarkFalse (ctx .IONOSCloudCluster , v1alpha1 .LanCreatedCondition , v1alpha1 .LanCreationFailedReason , clusterv1 .ConditionSeverityError , err .Error ())
168163 return * result , err
169164 }
170165
@@ -173,11 +168,6 @@ func (r *IONOSCloudClusterReconciler) reconcileNormal(ctx *context.ClusterContex
173168 return * result , err
174169 }
175170
176- if result , err := r .reconcileInternet (ctx ); err != nil {
177- conditions .MarkFalse (ctx .IONOSCloudCluster , v1alpha1 .InternetLanCreatedCondition , v1alpha1 .InternetLanCreationFailedReason , clusterv1 .ConditionSeverityError , err .Error ())
178- return * result , err
179- }
180-
181171 ctx .IONOSCloudCluster .Status .Ready = true
182172
183173 return reconcile.Result {}, nil
@@ -211,107 +201,49 @@ func (r *IONOSCloudClusterReconciler) reconcileDataCenter(ctx *context.ClusterCo
211201 return nil , nil
212202}
213203
214- func (r * IONOSCloudClusterReconciler ) reconcilePrivateLan (ctx * context.ClusterContext ) (* reconcile.Result , error ) {
215- ctx .Logger .Info ("Reconciling private Lan" )
216- if ctx .IONOSCloudCluster .Spec .PrivateLanID == nil {
217- lanID , err := createLan (ctx , false )
218- if err != nil {
219- return & reconcile.Result {}, errors .Wrap (err , "error creating private Lan" )
204+ func (r * IONOSCloudClusterReconciler ) reconcileLan (ctx * context.ClusterContext ) (* reconcile.Result , error ) {
205+ for i := range ctx .IONOSCloudCluster .Spec .Lans {
206+ lanSpec := & ctx .IONOSCloudCluster .Spec .Lans [i ]
207+ ctx .Logger .Info (fmt .Sprintf ("Reconciling %s Lan" , lanSpec .Name ))
208+ if lanSpec .LanID == nil {
209+ lanID , err := createLan (ctx , lanSpec .Public )
210+ if err != nil {
211+ return & reconcile.Result {}, err
212+ }
213+ lanSpec .LanID = lanID
220214 }
221- ctx .IONOSCloudCluster .Spec .PrivateLanID = lanID
222- }
223-
224- ctx .IONOSCloudCluster .EnsureLan (v1alpha1.IONOSLanSpec {
225- Name : "private" ,
226- LanID : ctx .IONOSCloudCluster .Spec .PrivateLanID ,
227- Public : false ,
228- })
229215
230- // check status
231- lanId := fmt .Sprint (* ctx . IONOSCloudCluster . Spec . PrivateLanID )
232- lan , resp , err := ctx .IONOSClient .GetLan (ctx , ctx .IONOSCloudCluster .Spec .DataCenterID , lanId )
216+ // check status
217+ lanId := fmt .Sprint (* lanSpec . LanID )
218+ lan , resp , err := ctx .IONOSClient .GetLan (ctx , ctx .IONOSCloudCluster .Spec .DataCenterID , lanId )
233219
234- if err != nil && resp .StatusCode != http .StatusNotFound {
235- return & reconcile.Result {}, errors .Wrap (err , "error getting private Lan" )
236- }
237-
238- if resp .StatusCode == http .StatusNotFound || * lan .Metadata .State == STATE_BUSY {
239- return & reconcile.Result {RequeueAfter : defaultRetryIntervalOnBusy }, errors .New ("private Lan not available (yet)" )
240- }
241-
242- conditions .MarkTrue (ctx .IONOSCloudCluster , v1alpha1 .PrivateLanCreatedCondition )
243-
244- return nil , nil
245- }
246-
247- func (r * IONOSCloudClusterReconciler ) reconcilePublicLan (ctx * context.ClusterContext ) (* reconcile.Result , error ) {
248- ctx .Logger .Info ("Reconciling public Lan" )
249- if ctx .IONOSCloudCluster .Spec .PublicLanID == nil {
250- lanID , err := createLan (ctx , true )
251- if err != nil {
252- return & reconcile.Result {}, err
220+ if err != nil && resp .StatusCode != http .StatusNotFound {
221+ return & reconcile.Result {}, errors .Wrap (err , fmt .Sprintf ("error getting %s Lan" , lanSpec .Name ))
253222 }
254- ctx .IONOSCloudCluster .Spec .PublicLanID = lanID
255- }
256-
257- ctx .IONOSCloudCluster .EnsureLan (v1alpha1.IONOSLanSpec {
258- Name : "public" ,
259- LanID : ctx .IONOSCloudCluster .Spec .PublicLanID ,
260- Public : true ,
261- })
262223
263- // check status
264- lanId := fmt .Sprint (* ctx .IONOSCloudCluster .Spec .PublicLanID )
265- lan , resp , err := ctx .IONOSClient .GetLan (ctx , ctx .IONOSCloudCluster .Spec .DataCenterID , lanId )
266-
267- if err != nil && resp .StatusCode != http .StatusNotFound {
268- return & reconcile.Result {}, errors .Wrap (err , "error getting public Lan" )
269- }
270-
271- if resp .StatusCode == http .StatusNotFound || * lan .Metadata .State == STATE_BUSY {
272- return & reconcile.Result {RequeueAfter : defaultRetryIntervalOnBusy }, errors .New ("public Lan not available (yet)" )
224+ if resp .StatusCode == http .StatusNotFound || * lan .Metadata .State == STATE_BUSY {
225+ return & reconcile.Result {RequeueAfter : defaultRetryIntervalOnBusy }, errors .New (fmt .Sprintf ("%s Lan not available (yet)" , lanSpec .Name ))
226+ }
273227 }
274228
275- conditions .MarkTrue (ctx .IONOSCloudCluster , v1alpha1 .PublicLanCreatedCondition )
229+ conditions .MarkTrue (ctx .IONOSCloudCluster , v1alpha1 .LanCreatedCondition )
276230 return nil , nil
277231}
278232
279- func (r * IONOSCloudClusterReconciler ) reconcileInternet (ctx * context.ClusterContext ) (* reconcile.Result , error ) {
280- ctx .Logger .Info ("Reconciling internet" )
281- if ctx .IONOSCloudCluster .Spec .InternetLanID == nil {
282- lanID , err := createLan (ctx , true )
283- if err != nil {
284- return & reconcile.Result {}, err
285- }
286- ctx .IONOSCloudCluster .Spec .InternetLanID = lanID
287- }
288-
289- ctx .IONOSCloudCluster .EnsureLan (v1alpha1.IONOSLanSpec {
290- Name : "internet" ,
291- LanID : ctx .IONOSCloudCluster .Spec .InternetLanID ,
292- Public : true ,
293- })
294-
295- // check status
296- lanId := fmt .Sprint (* ctx .IONOSCloudCluster .Spec .InternetLanID )
297- lan , resp , err := ctx .IONOSClient .GetLan (ctx , ctx .IONOSCloudCluster .Spec .DataCenterID , lanId )
233+ func (r * IONOSCloudClusterReconciler ) reconcileLoadBalancer (ctx * context.ClusterContext ) (* reconcile.Result , error ) {
234+ ctx .Logger .Info ("Reconciling LoadBalancer" )
235+ lbSpec := & ctx .IONOSCloudCluster .Spec .LoadBalancer
236+ listenerLan := ctx .IONOSCloudCluster .Lan (lbSpec .ListenerLanRef .Name )
237+ targetLan := ctx .IONOSCloudCluster .Lan (lbSpec .TargetLanRef .Name )
298238
299- if err != nil && resp . StatusCode != http . StatusNotFound {
300- return & reconcile.Result {}, errors .New ("error getting internet Lan" )
239+ if listenerLan == nil {
240+ return & reconcile.Result {RequeueAfter : defaultRetryIntervalOnBusy }, errors .New (fmt . Sprintf ( "listener lb %s Lan not available (yet)" , lbSpec . ListenerLanRef . Name ) )
301241 }
302-
303- if resp .StatusCode == http .StatusNotFound || * lan .Metadata .State == STATE_BUSY {
304- return & reconcile.Result {RequeueAfter : defaultRetryIntervalOnBusy }, errors .New ("internet Lan not available (yet)" )
242+ if targetLan == nil {
243+ return & reconcile.Result {RequeueAfter : defaultRetryIntervalOnBusy }, errors .New (fmt .Sprintf ("target lb %s Lan not available (yet)" , lbSpec .TargetLanRef .Name ))
305244 }
306245
307- conditions .MarkTrue (ctx .IONOSCloudCluster , v1alpha1 .InternetLanCreatedCondition )
308-
309- return nil , nil
310- }
311-
312- func (r * IONOSCloudClusterReconciler ) reconcileLoadBalancer (ctx * context.ClusterContext ) (* reconcile.Result , error ) {
313- ctx .Logger .Info ("Reconciling LoadBalancer" )
314- if ctx .IONOSCloudCluster .Spec .LoadBalancerID == "" {
246+ if lbSpec .ID == "" {
315247 loadBalancerName := fmt .Sprintf ("lb-%s" , ctx .Cluster .Name )
316248 loadBalancer := ionoscloud.NetworkLoadBalancer {
317249 Entities : & ionoscloud.NetworkLoadBalancerEntities {
@@ -330,31 +262,21 @@ func (r *IONOSCloudClusterReconciler) reconcileLoadBalancer(ctx *context.Cluster
330262 },
331263 },
332264 Properties : & ionoscloud.NetworkLoadBalancerProperties {
333- ListenerLan : ctx . IONOSCloudCluster . Spec . PublicLanID ,
265+ ListenerLan : listenerLan . LanID ,
334266 Name : & loadBalancerName ,
335- TargetLan : ctx . IONOSCloudCluster . Spec . PrivateLanID ,
267+ TargetLan : targetLan . LanID ,
336268 Ips : & []string {ctx .IONOSCloudCluster .Spec .ControlPlaneEndpoint .Host },
337269 },
338270 }
339271 loadBalancer , _ , err := ctx .IONOSClient .CreateLoadBalancer (ctx , ctx .IONOSCloudCluster .Spec .DataCenterID , loadBalancer )
340272 if err != nil {
341273 return & reconcile.Result {}, err
342274 }
343- ctx .IONOSCloudCluster .Spec .LoadBalancerID = * loadBalancer .Id
344- }
345-
346- ctx .IONOSCloudCluster .Spec .LoadBalancer = & v1alpha1.IONOSLoadBalancerSpec {
347- ID : ctx .IONOSCloudCluster .Spec .LoadBalancerID ,
348- ListenerLanRef : v1alpha1.IONOSLanRefSpec {
349- Name : "public" ,
350- },
351- TargetLanRef : v1alpha1.IONOSLanRefSpec {
352- Name : "private" ,
353- },
275+ lbSpec .ID = * loadBalancer .Id
354276 }
355277
356278 // check status
357- loadBalancer , resp , err := ctx .IONOSClient .GetLoadBalancer (ctx , ctx .IONOSCloudCluster .Spec .DataCenterID , ctx . IONOSCloudCluster . Spec . LoadBalancerID )
279+ loadBalancer , resp , err := ctx .IONOSClient .GetLoadBalancer (ctx , ctx .IONOSCloudCluster .Spec .DataCenterID , lbSpec . ID )
358280 if err != nil && resp .StatusCode != http .StatusNotFound {
359281 return & reconcile.Result {}, errors .Wrap (err , "error getting loadbalancer" )
360282 }
0 commit comments