Skip to content

Commit 499edca

Browse files
committed
Update reconciler so that GitopsClusters are only Ready if ClusterConnected is Ready too
1 parent 7ac3571 commit 499edca

File tree

3 files changed

+66
-3
lines changed

3 files changed

+66
-3
lines changed

api/v1alpha1/condition_types.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ const (
1111
ControlPlaneReadyStatusReason string = "ControlPlaneReadyStatus"
1212
// WaitingForCAPIClusterReason signals that a given CAPI cluster has not been found.
1313
WaitingForCAPIClusterReason string = "WaitingForCAPICluster"
14+
// ClusterConnectedReason signals that a given cluster is connected.
15+
ClusterConnectedReason string = "ClusterConnected"
16+
// ClusterNotConnectedReason signals that a given cluster is not connected.
17+
ClusterNotConnectedReason string = "ClusterNotConnected"
18+
// SecretMissingAndNoConnectivityReason signals that a given secret is missing and there is no connectivity to the cluster.
19+
SecretMissingAndNoConnectivityReason string = "SecretMissingAndNoConnectivity"
1420

1521
// WaitingForCAPIClusterDeletionReason signals that this cluster has been
1622
// deleted, but the referenced CAPI Cluster still exists.

controllers/gitopscluster_controller.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"github.com/fluxcd/pkg/apis/meta"
2626
"github.com/fluxcd/pkg/runtime/conditions"
2727
corev1 "k8s.io/api/core/v1"
28-
v1 "k8s.io/api/core/v1"
2928
apierrors "k8s.io/apimachinery/pkg/api/errors"
3029
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3130
"k8s.io/apimachinery/pkg/runtime"
@@ -230,6 +229,19 @@ func (r *GitopsClusterReconciler) Reconcile(ctx context.Context, req ctrl.Reques
230229
return ctrl.Result{}, err
231230
}
232231

232+
secretFound := conditions.IsTrue(cluster, gitopsv1alpha1.SecretFoundReason)
233+
234+
if secretFound && conditions.IsTrue(cluster, gitopsv1alpha1.ClusterConnectivity) {
235+
conditions.MarkTrue(cluster, meta.ReadyCondition, gitopsv1alpha1.ClusterConnectedReason, "")
236+
} else {
237+
conditions.MarkFalse(cluster, meta.ReadyCondition, gitopsv1alpha1.ClusterNotConnectedReason, "No Connectivity")
238+
}
239+
240+
if err := r.Status().Update(ctx, cluster); err != nil {
241+
log.Error(err, "failed to update Cluster status")
242+
return ctrl.Result{}, err
243+
}
244+
233245
return ctrl.Result{RequeueAfter: r.Options.DefaultRequeueTime}, nil
234246
}
235247

@@ -443,7 +455,7 @@ func (r *GitopsClusterReconciler) restConfigFromSecret(ctx context.Context, clus
443455
Namespace: cluster.Namespace,
444456
}
445457

446-
var secret v1.Secret
458+
var secret corev1.Secret
447459
if err := r.Get(ctx, key, &secret); err != nil {
448460
log.Error(err, "unable to fetch secret for GitOps Cluster", "cluster", cluster.Name)
449461

controllers/gitopscluster_controller_test.go

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func TestReconcile(t *testing.T) {
7373
makeTestSecret(types.NamespacedName{
7474
Name: "dev",
7575
Namespace: testNamespace,
76-
}, map[string][]byte{"value": []byte("testing")}),
76+
}, map[string][]byte{"value": kubeConfig}),
7777
},
7878
obj: types.NamespacedName{Namespace: testNamespace, Name: testName},
7979
opts: controllers.Options{
@@ -282,6 +282,51 @@ func TestReconcile(t *testing.T) {
282282
wantStatus: "False",
283283
wantStatusMessage: `failed creating rest config from secret: invalid configuration: no server found for cluster "envtest"`,
284284
},
285+
{
286+
name: "Both Secret and Connectivity are ok, mark as Ready",
287+
state: []runtime.Object{
288+
makeTestCluster(func(c *gitopsv1alpha1.GitopsCluster) {
289+
c.Spec.SecretRef = &meta.LocalObjectReference{
290+
Name: "dev",
291+
}
292+
}),
293+
makeTestSecret(types.NamespacedName{
294+
Name: "dev",
295+
Namespace: testNamespace,
296+
}, map[string][]byte{"value": kubeConfig}),
297+
},
298+
obj: types.NamespacedName{Namespace: testNamespace, Name: testName},
299+
opts: controllers.Options{
300+
CAPIEnabled: false,
301+
DefaultRequeueTime: defaultRequeueTime,
302+
},
303+
requeueAfter: defaultRequeueTime,
304+
wantCondition: meta.ReadyCondition,
305+
wantStatus: "True",
306+
},
307+
{
308+
name: "No connectivity causes ready condition to be false",
309+
state: []runtime.Object{
310+
makeTestCluster(func(c *gitopsv1alpha1.GitopsCluster) {
311+
c.Spec.SecretRef = &meta.LocalObjectReference{
312+
Name: "dev",
313+
}
314+
}),
315+
makeTestSecret(types.NamespacedName{
316+
Name: "dev",
317+
Namespace: testNamespace,
318+
}, map[string][]byte{"value": kubeconfigWithError(t)}),
319+
},
320+
obj: types.NamespacedName{Namespace: testNamespace, Name: testName},
321+
opts: controllers.Options{
322+
CAPIEnabled: true,
323+
DefaultRequeueTime: defaultRequeueTime,
324+
},
325+
requeueAfter: defaultRequeueTime,
326+
wantCondition: meta.ReadyCondition,
327+
wantStatus: "False",
328+
wantStatusMessage: "No connectivity",
329+
},
285330
}
286331

287332
for _, tt := range tests {

0 commit comments

Comments
 (0)