Skip to content

Commit 980592b

Browse files
authored
Merge pull request #25 from weaveworks/sync-secrets-cluster-no-readiness
Don't wait for ControlPlane readiness for secrets.
2 parents 57c407e + 26d417e commit 980592b

File tree

4 files changed

+71
-20
lines changed

4 files changed

+71
-20
lines changed

controllers/cluster.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ const (
2323

2424
// IsControlPlaneReady takes a client connected to a cluster and reports whether or
2525
// not the control-plane for the cluster is "ready".
26+
//
27+
// WARNING: This does not work for "managed clusters" where the control-plane is not available.
2628
func IsControlPlaneReady(ctx context.Context, cl client.Client) (bool, error) {
2729
logger := log.FromContext(ctx)
2830
readiness := []bool{}
@@ -48,6 +50,7 @@ func IsControlPlaneReady(ctx context.Context, cl client.Client) (bool, error) {
4850
}
4951
return true
5052
}
53+
5154
logger.Info("readiness", "len", len(readiness), "is-ready", isReady(readiness))
5255

5356
// If we have no statuses, then we really don't know if we're ready or not.

controllers/common.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ import (
44
"sigs.k8s.io/controller-runtime/pkg/client"
55
)
66

7+
// ConfigParser functions parse a byte slice and return a Kubernetes client.
78
type ConfigParser func(b []byte) (client.Client, error)

controllers/secretsync_controller.go

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -146,18 +146,6 @@ func (r *SecretSyncReconciler) Reconcile(ctx context.Context, req ctrl.Request)
146146
return ctrl.Result{}, fmt.Errorf("failed to create client for cluster %s: %w", clusterName, err)
147147
}
148148

149-
ready, err := IsControlPlaneReady(ctx, clusterClient)
150-
if err != nil {
151-
logger.Error(err, "failed to check readiness of cluster", "cluster", cluster.Name)
152-
continue
153-
}
154-
155-
if !ready {
156-
logger.Info("waiting for control plane to be ready", "cluster", cluster.Name)
157-
requeue = true
158-
continue
159-
}
160-
161149
if err := r.syncSecret(ctx, secret, clusterClient, secretSync.Spec.TargetNamespace); err != nil {
162150
logger.Error(err, "failed to sync secret", "cluster", cluster.Name, "secret", secret.Name)
163151
continue

controllers/secretsync_controller_test.go

Lines changed: 67 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,61 @@ func TestSecretSync(t *testing.T) {
142142
})
143143
}
144144

145+
func TestSecretSyncClusterReadiness(t *testing.T) {
146+
// No control-plane node conditions - no way of knowing that the state.
147+
testCluster, testClusterSecret, testClusterClient := makeTestClusterWithNodeConditions(t, "test")
148+
149+
testSecret := makeTestSecret(types.NamespacedName{
150+
Name: "test-secret",
151+
Namespace: "default",
152+
}, map[string][]byte{"value": []byte("test")})
153+
154+
testSecretSync := makeSecretSync(
155+
"test-secretsync",
156+
testSecret.GetNamespace(),
157+
testSecret.GetName(),
158+
"ns-test",
159+
map[string]string{"environment": "test"},
160+
)
161+
162+
sc, cl := makeTestClientAndScheme(
163+
t, testCluster,
164+
testClusterSecret,
165+
testSecret,
166+
testSecretSync,
167+
)
168+
169+
reconciler := NewSecretSyncReconciler(cl, sc)
170+
reconciler.configParser = func(b []byte) (client.Client, error) {
171+
clusters := map[string]client.Client{
172+
"test": testClusterClient,
173+
}
174+
175+
return clusters[string(b)], nil
176+
}
177+
178+
if _, err := reconciler.Reconcile(context.TODO(), ctrl.Request{NamespacedName: types.NamespacedName{
179+
Name: testSecretSync.GetName(),
180+
Namespace: testSecretSync.GetNamespace(),
181+
}}); err != nil {
182+
t.Fatal(err)
183+
}
184+
185+
var secret v1.Secret
186+
if err := testClusterClient.Get(context.TODO(), client.ObjectKey{Name: "test-secret", Namespace: "ns-test"}, &secret); err != nil {
187+
t.Fatal(err)
188+
}
189+
190+
var secretSync capiv1alpha1.SecretSync
191+
if err := cl.Get(context.TODO(), client.ObjectKeyFromObject(testSecretSync), &secretSync); err != nil {
192+
t.Fatal(err)
193+
}
194+
195+
if _, ok := secretSync.Status.SecretVersions[testCluster.Name]; !ok {
196+
t.Fatalf("secretsync status is not updated")
197+
}
198+
}
199+
145200
func makeSecretSync(name, namespace, secretName, targetNamespace string, selector map[string]string) *capiv1alpha1.SecretSync {
146201
return &capiv1alpha1.SecretSync{
147202
ObjectMeta: metav1.ObjectMeta{
@@ -161,6 +216,17 @@ func makeSecretSync(name, namespace, secretName, targetNamespace string, selecto
161216
}
162217

163218
func makeReadyTestCluster(t *testing.T, key string) (*clustersv1.GitopsCluster, *v1.Secret, client.Client) {
219+
nodeCondition := corev1.NodeCondition{
220+
Type: "Ready",
221+
Status: "True",
222+
LastHeartbeatTime: metav1.Now(),
223+
LastTransitionTime: metav1.Now(), Reason: "KubeletReady",
224+
Message: "kubelet is posting ready status"}
225+
226+
return makeTestClusterWithNodeConditions(t, key, nodeCondition)
227+
}
228+
229+
func makeTestClusterWithNodeConditions(t *testing.T, key string, conds ...corev1.NodeCondition) (*clustersv1.GitopsCluster, *v1.Secret, client.Client) {
164230
cluster := makeTestCluster(func(c *clustersv1.GitopsCluster) {
165231
c.Name = fmt.Sprintf("cluster-%s", key)
166232
c.Namespace = corev1.NamespaceDefault
@@ -170,14 +236,7 @@ func makeReadyTestCluster(t *testing.T, key string) (*clustersv1.GitopsCluster,
170236
c.Status.Conditions = append(c.Status.Conditions, makeReadyCondition())
171237
})
172238

173-
nodeCondition := corev1.NodeCondition{
174-
Type: "Ready",
175-
Status: "True",
176-
LastHeartbeatTime: metav1.Now(),
177-
LastTransitionTime: metav1.Now(), Reason: "KubeletReady",
178-
Message: "kubelet is posting ready status"}
179-
180-
readyNode := makeNode(map[string]string{"node-role.kubernetes.io/master": ""}, nodeCondition)
239+
readyNode := makeNode(map[string]string{"node-role.kubernetes.io/master": ""}, conds...)
181240

182241
secret := makeTestSecret(types.NamespacedName{
183242
Name: cluster.GetName() + "-kubeconfig",

0 commit comments

Comments
 (0)