@@ -127,116 +127,76 @@ func (r *GitopsClusterReconciler) Reconcile(ctx context.Context, req ctrl.Reques
127
127
}
128
128
129
129
// examine DeletionTimestamp to determine if object is under deletion
130
- if cluster .ObjectMeta .DeletionTimestamp .IsZero () {
131
- if cluster .Spec .SecretRef != nil || cluster .Spec .CAPIClusterRef != nil {
132
- if ! controllerutil .ContainsFinalizer (cluster , GitOpsClusterFinalizer ) {
133
- controllerutil .AddFinalizer (cluster , GitOpsClusterFinalizer )
134
- if err := r .Update (ctx , cluster ); err != nil {
135
- return ctrl.Result {}, err
136
- }
137
- }
138
- }
139
- } else {
140
- if controllerutil .ContainsFinalizer (cluster , GitOpsClusterFinalizer ) {
141
- err := r .reconcileDeletedReferences (ctx , cluster )
142
- if err != nil {
143
- return ctrl.Result {}, err
144
- }
145
- controllerutil .RemoveFinalizer (cluster , GitOpsClusterFinalizer )
146
- if err := r .Update (ctx , cluster ); err != nil {
147
- return ctrl.Result {}, err
148
- }
149
- return ctrl.Result {}, nil
150
- }
130
+ if ! cluster .ObjectMeta .DeletionTimestamp .IsZero () {
131
+ return r .finalize (ctx , cluster )
151
132
}
152
133
153
- if cluster .Spec .SecretRef != nil {
154
- name := types.NamespacedName {
155
- Namespace : cluster .GetNamespace (),
156
- Name : cluster .Spec .SecretRef .Name ,
157
- }
134
+ if cluster .Spec .CAPIClusterRef == nil && cluster .Spec .SecretRef == nil {
135
+ return ctrl.Result {}, nil
136
+ }
158
137
159
- if metav1 .HasAnnotation (cluster .ObjectMeta , GitOpsClusterProvisionedAnnotation ) {
160
- conditions .MarkTrue (cluster , gitopsv1alpha1 .ClusterProvisionedCondition , gitopsv1alpha1 .ClusterProvisionedReason , "Cluster Provisioned annotation detected" )
138
+ if ! controllerutil .ContainsFinalizer (cluster , GitOpsClusterFinalizer ) {
139
+ controllerutil .AddFinalizer (cluster , GitOpsClusterFinalizer )
140
+ if err := r .Update (ctx , cluster ); err != nil {
141
+ return ctrl.Result {}, err
161
142
}
162
143
163
- var secret corev1.Secret
164
- if err := r .Get (ctx , name , & secret ); err != nil {
165
- e := fmt .Errorf ("failed to get secret %q: %w" , name , err )
166
- if apierrors .IsNotFound (err ) {
167
- // TODO: this could _possibly_ be controllable by the
168
- // `GitopsCluster` itself.
169
- log .Info ("waiting for cluster secret to be available" )
170
- conditions .MarkFalse (cluster , meta .ReadyCondition , gitopsv1alpha1 .WaitingForSecretReason , e .Error ())
171
- if err := r .Status ().Update (ctx , cluster ); err != nil {
172
- log .Error (err , "failed to update Cluster status" )
173
- return ctrl.Result {}, err
174
- }
175
- return ctrl.Result {RequeueAfter : MissingSecretRequeueTime }, nil
176
- }
177
- conditions .MarkFalse (cluster , meta .ReadyCondition , gitopsv1alpha1 .WaitingForSecretReason , e .Error ())
178
- if err := r .Status ().Update (ctx , cluster ); err != nil {
179
- log .Error (err , "failed to update Cluster status" )
180
- return ctrl.Result {}, err
181
- }
144
+ return ctrl.Result {}, nil
145
+ }
182
146
183
- return ctrl.Result {}, e
147
+ if cluster .Spec .CAPIClusterRef != nil {
148
+ if err := r .reconcileCAPICluster (ctx , cluster ); err != nil {
149
+ return ctrl.Result {}, err
184
150
}
185
151
186
- log .Info ("Secret found" , "secret" , name )
152
+ return ctrl.Result {RequeueAfter : r .Options .DefaultRequeueTime }, nil
153
+ }
187
154
188
- conditions .MarkTrue (cluster , meta .ReadyCondition , gitopsv1alpha1 .SecretFoundReason , "" )
189
- if err := r .Status ().Update (ctx , cluster ); err != nil {
190
- log .Error (err , "failed to update Cluster status" )
191
- return ctrl.Result {}, err
192
- }
155
+ secretErr := r .checkClusterSecret (ctx , cluster )
156
+ if secretErr == nil {
157
+ log .Info ("Secret found" )
193
158
}
194
159
195
- if cluster .Spec .CAPIClusterRef != nil {
196
- name := types.NamespacedName {
197
- Namespace : cluster .GetNamespace (),
198
- Name : cluster .Spec .CAPIClusterRef .Name ,
199
- }
200
- var capiCluster clusterv1.Cluster
201
- if err := r .Get (ctx , name , & capiCluster ); err != nil {
202
- e := fmt .Errorf ("failed to get CAPI cluster %q: %w" , name , err )
203
- conditions .MarkFalse (cluster , meta .ReadyCondition , gitopsv1alpha1 .WaitingForCAPIClusterReason , e .Error ())
160
+ var connectivityErr error
161
+ // TODO: We should check for connectivity with CAPI clusters
162
+ if secretErr == nil {
163
+ connectivityErr = r .verifyConnectivity (ctx , cluster )
164
+ }
165
+
166
+ if secretErr != nil {
167
+ e := fmt .Errorf ("failed to get referenced secret: %w" , secretErr )
168
+ if apierrors .IsNotFound (secretErr ) {
169
+ log .Info ("waiting for cluster secret to be available" )
170
+ conditions .MarkFalse (cluster , meta .ReadyCondition , gitopsv1alpha1 .WaitingForSecretReason , e .Error ())
204
171
if err := r .Status ().Update (ctx , cluster ); err != nil {
205
172
log .Error (err , "failed to update Cluster status" )
206
173
return ctrl.Result {}, err
207
174
}
208
175
209
- return ctrl.Result {}, e
176
+ return ctrl.Result {RequeueAfter : MissingSecretRequeueTime }, nil
210
177
}
211
178
212
- log .Info ("CAPI Cluster found" , "CAPI cluster" , name )
213
-
214
- if ! capiCluster .Status .ControlPlaneReady {
215
- conditions .MarkFalse (cluster , meta .ReadyCondition , gitopsv1alpha1 .WaitingForControlPlaneReadyStatusReason , "Waiting for ControlPlaneReady status" )
216
- } else {
217
- conditions .MarkTrue (cluster , meta .ReadyCondition , gitopsv1alpha1 .ControlPlaneReadyStatusReason , "" )
218
- }
219
- if clusterv1 .ClusterPhase (capiCluster .Status .Phase ) == clusterv1 .ClusterPhaseProvisioned {
220
- conditions .MarkTrue (cluster , gitopsv1alpha1 .ClusterProvisionedCondition , gitopsv1alpha1 .ClusterProvisionedReason , "CAPI Cluster has been provisioned" )
221
- }
179
+ conditions .MarkFalse (cluster , meta .ReadyCondition , gitopsv1alpha1 .WaitingForSecretReason , e .Error ())
222
180
if err := r .Status ().Update (ctx , cluster ); err != nil {
223
181
log .Error (err , "failed to update Cluster status" )
224
- return ctrl.Result {}, err
182
+ return ctrl.Result {}, e
225
183
}
226
- }
227
184
228
- if err := r .verifyConnectivity (ctx , cluster ); err != nil {
229
- return ctrl.Result {}, err
185
+ return ctrl.Result {}, e
230
186
}
231
187
232
- if conditions .IsTrue (cluster , gitopsv1alpha1 .SecretFoundReason ) {
233
- if conditions .IsTrue (cluster , gitopsv1alpha1 .ClusterConnectivity ) {
234
- conditions .MarkTrue (cluster , meta .ReadyCondition , gitopsv1alpha1 .ClusterConnectedReason , "" )
235
- } else {
236
- conditions .MarkFalse (cluster , meta .ReadyCondition , gitopsv1alpha1 .ClusterNotConnectedReason , "No Connectivity" )
188
+ if connectivityErr != nil {
189
+ e := fmt .Errorf ("failed to connect to cluster with secret: %w" , connectivityErr )
190
+ conditions .MarkFalse (cluster , meta .ReadyCondition , gitopsv1alpha1 .ClusterNotConnectedReason , e .Error ())
191
+ if err := r .Status ().Update (ctx , cluster ); err != nil {
192
+ log .Error (err , "failed to update Cluster status" )
193
+ return ctrl.Result {}, e
237
194
}
195
+
196
+ return ctrl.Result {}, e
238
197
}
239
198
199
+ conditions .MarkTrue (cluster , meta .ReadyCondition , gitopsv1alpha1 .ClusterConnectedReason , "cluster is connected" )
240
200
if err := r .Status ().Update (ctx , cluster ); err != nil {
241
201
log .Error (err , "failed to update Cluster status" )
242
202
return ctrl.Result {}, err
@@ -385,12 +345,6 @@ func (r *GitopsClusterReconciler) requestsForCAPIClusterChange(ctx context.Conte
385
345
386
346
func (r * GitopsClusterReconciler ) verifyConnectivity (ctx context.Context , cluster * gitopsv1alpha1.GitopsCluster ) error {
387
347
log := log .FromContext (ctx )
388
-
389
- // avoid checking the cluster if it's under deletion.
390
- if ! cluster .ObjectMeta .DeletionTimestamp .IsZero () {
391
- return nil
392
- }
393
-
394
348
log .Info ("checking connectivity" , "cluster" , cluster .Name )
395
349
396
350
nsName := types.NamespacedName {Namespace : cluster .Namespace , Name : cluster .Name }
@@ -405,26 +359,80 @@ func (r *GitopsClusterReconciler) verifyConnectivity(ctx context.Context, cluste
405
359
406
360
config , err := r .restConfigFromSecret (ctx , cluster )
407
361
if err != nil {
408
- conditions .MarkFalse (cluster , gitopsv1alpha1 . ClusterConnectivity , gitopsv1alpha1 .ClusterConnectionFailedReason , fmt .Sprintf ("failed creating rest config from secret: %s" , err ))
362
+ conditions .MarkFalse (cluster , meta . ReadyCondition , gitopsv1alpha1 .ClusterConnectionFailedReason , fmt .Sprintf ("failed creating rest config from secret: %s" , err ))
409
363
if err := r .Status ().Update (ctx , cluster ); err != nil {
410
364
log .Error (err , "failed to update Cluster status" )
411
365
return err
412
366
}
413
367
414
- return nil
368
+ return err
415
369
}
416
370
417
371
if _ , err := client .New (config , client.Options {}); err != nil {
418
- conditions .MarkFalse (cluster , gitopsv1alpha1 . ClusterConnectivity , gitopsv1alpha1 .ClusterConnectionFailedReason , fmt .Sprintf ("failed connecting to the cluster: %s" , err ))
372
+ conditions .MarkFalse (cluster , meta . ReadyCondition , gitopsv1alpha1 .ClusterConnectionFailedReason , fmt .Sprintf ("failed connecting to the cluster: %s" , err ))
419
373
if err := r .Status ().Update (ctx , cluster ); err != nil {
420
374
log .Error (err , "failed to update Cluster status" )
421
375
return err
422
376
}
423
377
378
+ return err
379
+ }
380
+
381
+ conditions .MarkTrue (cluster , meta .ReadyCondition , gitopsv1alpha1 .ClusterConnectionSucceededReason , "cluster connectivity is ok" )
382
+ if err := r .Status ().Update (ctx , cluster ); err != nil {
383
+ log .Error (err , "failed to update Cluster status" )
384
+ return err
385
+ }
386
+
387
+ return nil
388
+ }
389
+
390
+ func (r * GitopsClusterReconciler ) checkClusterSecret (ctx context.Context , cluster * gitopsv1alpha1.GitopsCluster ) error {
391
+ if cluster .Spec .SecretRef == nil {
424
392
return nil
425
393
}
394
+ name := types.NamespacedName {
395
+ Namespace : cluster .GetNamespace (),
396
+ Name : cluster .Spec .SecretRef .Name ,
397
+ }
398
+
399
+ if metav1 .HasAnnotation (cluster .ObjectMeta , GitOpsClusterProvisionedAnnotation ) {
400
+ conditions .MarkTrue (cluster , gitopsv1alpha1 .ClusterProvisionedCondition , gitopsv1alpha1 .ClusterProvisionedReason , "Cluster Provisioned annotation detected" )
401
+ }
402
+
403
+ var secret corev1.Secret
404
+ // TODO This should check for a value key in the secret data.
405
+ return r .Get (ctx , name , & secret )
406
+ }
407
+
408
+ func (r * GitopsClusterReconciler ) reconcileCAPICluster (ctx context.Context , cluster * gitopsv1alpha1.GitopsCluster ) error {
409
+ log := log .FromContext (ctx )
410
+ name := types.NamespacedName {
411
+ Namespace : cluster .GetNamespace (),
412
+ Name : cluster .Spec .CAPIClusterRef .Name ,
413
+ }
414
+ var capiCluster clusterv1.Cluster
415
+ if err := r .Get (ctx , name , & capiCluster ); err != nil {
416
+ e := fmt .Errorf ("failed to get CAPI cluster %q: %w" , name , err )
417
+ conditions .MarkFalse (cluster , meta .ReadyCondition , gitopsv1alpha1 .WaitingForCAPIClusterReason , e .Error ())
418
+ if err := r .Status ().Update (ctx , cluster ); err != nil {
419
+ log .Error (err , "failed to update Cluster status" )
420
+ return e
421
+ }
422
+
423
+ return e
424
+ }
425
+
426
+ log .Info ("CAPI Cluster found" , "CAPI cluster" , name )
426
427
427
- conditions .MarkTrue (cluster , gitopsv1alpha1 .ClusterConnectivity , gitopsv1alpha1 .ClusterConnectionSucceededReason , "cluster connectivity is ok" )
428
+ if ! capiCluster .Status .ControlPlaneReady {
429
+ conditions .MarkFalse (cluster , meta .ReadyCondition , gitopsv1alpha1 .WaitingForControlPlaneReadyStatusReason , "Waiting for ControlPlaneReady status" )
430
+ } else {
431
+ conditions .MarkTrue (cluster , meta .ReadyCondition , gitopsv1alpha1 .ControlPlaneReadyStatusReason , "" )
432
+ }
433
+ if clusterv1 .ClusterPhase (capiCluster .Status .Phase ) == clusterv1 .ClusterPhaseProvisioned {
434
+ conditions .MarkTrue (cluster , gitopsv1alpha1 .ClusterProvisionedCondition , gitopsv1alpha1 .ClusterProvisionedReason , "CAPI Cluster has been provisioned" )
435
+ }
428
436
if err := r .Status ().Update (ctx , cluster ); err != nil {
429
437
log .Error (err , "failed to update Cluster status" )
430
438
return err
@@ -433,6 +441,21 @@ func (r *GitopsClusterReconciler) verifyConnectivity(ctx context.Context, cluste
433
441
return nil
434
442
}
435
443
444
+ func (r * GitopsClusterReconciler ) finalize (ctx context.Context , cluster * gitopsv1alpha1.GitopsCluster ) (ctrl.Result , error ) {
445
+ if controllerutil .ContainsFinalizer (cluster , GitOpsClusterFinalizer ) {
446
+ err := r .reconcileDeletedReferences (ctx , cluster )
447
+ if err != nil {
448
+ return ctrl.Result {}, err
449
+ }
450
+ controllerutil .RemoveFinalizer (cluster , GitOpsClusterFinalizer )
451
+ if err := r .Update (ctx , cluster ); err != nil {
452
+ return ctrl.Result {}, err
453
+ }
454
+ }
455
+
456
+ return ctrl.Result {}, nil
457
+ }
458
+
436
459
func (r * GitopsClusterReconciler ) restConfigFromSecret (ctx context.Context , cluster * gitopsv1alpha1.GitopsCluster ) (* rest.Config , error ) {
437
460
log := log .FromContext (ctx )
438
461
@@ -476,11 +499,11 @@ func (r *GitopsClusterReconciler) restConfigFromSecret(ctx context.Context, clus
476
499
return nil , errors .New ("no data present in cluster secret" )
477
500
}
478
501
479
- restCfg , err := clientcmd .RESTConfigFromKubeConfig ([] byte ( data ) )
502
+ restCfg , err := clientcmd .RESTConfigFromKubeConfig (data )
480
503
if err != nil {
481
- log .Error (err , "unable to create kubconfig from GitOps Cluster secret data" , "cluster" , cluster .Name )
504
+ log .Error (err , "unable to create KubeConfig from GitOps Cluster secret data" , "cluster" , cluster .Name )
482
505
483
- return nil , err
506
+ return nil , errors . New ( "failed to parse KubeConfig from Secret" )
484
507
}
485
508
486
509
return restCfg , nil
0 commit comments