Skip to content

Commit f33ba30

Browse files
authored
Merge pull request #8926 from sbueringer/pr-kcp-cache-secrets-ownerref
🌱 KCP: cache secrets between LookupOrGenerate and ensureCertificatesOwnerRef
2 parents 71e6776 + d22e7ce commit f33ba30

File tree

5 files changed

+44
-23
lines changed

5 files changed

+44
-23
lines changed

controlplane/kubeadm/internal/cluster_test.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ func TestGetWorkloadCluster(t *testing.T) {
9393
ObjectMeta: metav1.ObjectMeta{
9494
Name: "my-cluster-etcd",
9595
Namespace: ns.Name,
96+
Labels: map[string]string{
97+
clusterv1.ClusterNameLabel: "my-cluster",
98+
},
9699
},
97100
Data: map[string][]byte{
98101
secret.TLSCrtDataName: certs.EncodeCertPEM(cert),
@@ -120,6 +123,9 @@ func TestGetWorkloadCluster(t *testing.T) {
120123
ObjectMeta: metav1.ObjectMeta{
121124
Name: "my-cluster-kubeconfig",
122125
Namespace: ns.Name,
126+
Labels: map[string]string{
127+
clusterv1.ClusterNameLabel: "my-cluster",
128+
},
123129
},
124130
Data: map[string][]byte{
125131
secret.KubeconfigDataName: testEnvKubeconfig,
@@ -179,7 +185,7 @@ func TestGetWorkloadCluster(t *testing.T) {
179185
g := NewWithT(t)
180186

181187
for _, o := range tt.objs {
182-
g.Expect(env.Client.Create(ctx, o)).To(Succeed())
188+
g.Expect(env.CreateAndWait(ctx, o)).To(Succeed())
183189
defer func(do client.Object) {
184190
g.Expect(env.CleanupAndWait(ctx, do)).To(Succeed())
185191
}(o)
@@ -195,10 +201,8 @@ func TestGetWorkloadCluster(t *testing.T) {
195201
)
196202
g.Expect(err).ToNot(HaveOccurred())
197203

198-
// Note: The API reader is intentionally used instead of the regular (cached) client
199-
// to avoid test failures when the local cache isn't able to catch up in time.
200204
m := Management{
201-
Client: env.GetAPIReader(),
205+
Client: env.GetClient(),
202206
Tracker: tracker,
203207
}
204208

controlplane/kubeadm/internal/controllers/controller.go

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ func (r *KubeadmControlPlaneReconciler) reconcileClusterCertificates(ctx context
488488
return ctrl.Result{}, err
489489
}
490490

491-
if err := r.ensureCertificatesOwnerRef(ctx, util.ObjectKey(controlPlane.Cluster), certificates, *controllerRef); err != nil {
491+
if err := r.ensureCertificatesOwnerRef(ctx, certificates, *controllerRef); err != nil {
492492
return ctrl.Result{}, err
493493
}
494494

@@ -928,38 +928,36 @@ func (r *KubeadmControlPlaneReconciler) adoptOwnedSecrets(ctx context.Context, k
928928
}
929929

930930
// ensureCertificatesOwnerRef ensures an ownerReference to the owner is added on the Secrets holding certificates.
931-
func (r *KubeadmControlPlaneReconciler) ensureCertificatesOwnerRef(ctx context.Context, clusterKey client.ObjectKey, certificates secret.Certificates, owner metav1.OwnerReference) error {
931+
func (r *KubeadmControlPlaneReconciler) ensureCertificatesOwnerRef(ctx context.Context, certificates secret.Certificates, owner metav1.OwnerReference) error {
932932
for _, c := range certificates {
933-
s := &corev1.Secret{}
934-
secretKey := client.ObjectKey{Namespace: clusterKey.Namespace, Name: secret.Name(clusterKey.Name, c.Purpose)}
935-
if err := r.Client.Get(ctx, secretKey, s); err != nil {
936-
return errors.Wrapf(err, "failed to get Secret %s", secretKey)
933+
if c.Secret == nil {
934+
continue
937935
}
938936

939-
patchHelper, err := patch.NewHelper(s, r.Client)
937+
patchHelper, err := patch.NewHelper(c.Secret, r.Client)
940938
if err != nil {
941-
return errors.Wrapf(err, "failed to create patchHelper for Secret %s", secretKey)
939+
return errors.Wrapf(err, "failed to create patchHelper for Secret %s", klog.KObj(c.Secret))
942940
}
943941

944-
controller := metav1.GetControllerOf(s)
942+
controller := metav1.GetControllerOf(c.Secret)
945943
// If the current controller is KCP, ensure the owner reference is up to date.
946944
// Note: This ensures secrets created prior to v1alpha4 are updated to have the correct owner reference apiVersion.
947945
if controller != nil && controller.Kind == kubeadmControlPlaneKind {
948-
s.SetOwnerReferences(util.EnsureOwnerRef(s.GetOwnerReferences(), owner))
946+
c.Secret.SetOwnerReferences(util.EnsureOwnerRef(c.Secret.GetOwnerReferences(), owner))
949947
}
950948

951949
// If the Type doesn't match the type used for secrets created by core components continue without altering the owner reference further.
952950
// Note: This ensures that control plane related secrets created by KubeadmConfig are eventually owned by KCP.
953951
// TODO: Remove this logic once standalone control plane machines are no longer allowed.
954-
if s.Type == clusterv1.ClusterSecretType {
952+
if c.Secret.Type == clusterv1.ClusterSecretType {
955953
// Remove the current controller if one exists.
956954
if controller != nil {
957-
s.SetOwnerReferences(util.RemoveOwnerRef(s.GetOwnerReferences(), *controller))
955+
c.Secret.SetOwnerReferences(util.RemoveOwnerRef(c.Secret.GetOwnerReferences(), *controller))
958956
}
959-
s.SetOwnerReferences(util.EnsureOwnerRef(s.GetOwnerReferences(), owner))
957+
c.Secret.SetOwnerReferences(util.EnsureOwnerRef(c.Secret.GetOwnerReferences(), owner))
960958
}
961-
if err := patchHelper.Patch(ctx, s); err != nil {
962-
return errors.Wrapf(err, "failed to patch Secret %s with ownerReference %s", secretKey, owner.String())
959+
if err := patchHelper.Patch(ctx, c.Secret); err != nil {
960+
return errors.Wrapf(err, "failed to patch Secret %s with ownerReference %s", klog.KObj(c.Secret), owner.String())
963961
}
964962
}
965963
return nil

controlplane/kubeadm/internal/controllers/controller_test.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -815,13 +815,16 @@ func TestKubeadmControlPlaneReconciler_ensureOwnerReferences(t *testing.T) {
815815
// Set the Secret Type to clusterv1.ClusterSecretType which signals this Secret was generated by CAPI.
816816
s.Type = clusterv1.ClusterSecretType
817817

818+
// Store the secret in the certificate.
819+
c.Secret = s
820+
818821
objs = append(objs, s)
819822
}
820823

821824
fakeClient := newFakeClient(objs...)
822825

823826
r := KubeadmControlPlaneReconciler{Client: fakeClient}
824-
err = r.ensureCertificatesOwnerRef(ctx, client.ObjectKeyFromObject(cluster), certificates, kcpOwner)
827+
err = r.ensureCertificatesOwnerRef(ctx, certificates, kcpOwner)
825828
g.Expect(err).To(BeNil())
826829

827830
secrets := &corev1.SecretList{}
@@ -857,13 +860,17 @@ func TestKubeadmControlPlaneReconciler_ensureOwnerReferences(t *testing.T) {
857860
Controller: pointer.Bool(true),
858861
},
859862
})
863+
864+
// Store the secret in the certificate.
865+
c.Secret = s
866+
860867
objs = append(objs, s)
861868
}
862869

863870
fakeClient := newFakeClient(objs...)
864871

865872
r := KubeadmControlPlaneReconciler{Client: fakeClient}
866-
err := r.ensureCertificatesOwnerRef(ctx, client.ObjectKeyFromObject(cluster), certificates, kcpOwner)
873+
err := r.ensureCertificatesOwnerRef(ctx, certificates, kcpOwner)
867874
g.Expect(err).To(BeNil())
868875

869876
secrets := &corev1.SecretList{}
@@ -902,13 +909,16 @@ func TestKubeadmControlPlaneReconciler_ensureOwnerReferences(t *testing.T) {
902909
},
903910
))
904911

912+
// Store the secret in the certificate.
913+
c.Secret = s
914+
905915
objs = append(objs, s)
906916
}
907917

908918
fakeClient := newFakeClient(objs...)
909919

910920
r := KubeadmControlPlaneReconciler{Client: fakeClient}
911-
err := r.ensureCertificatesOwnerRef(ctx, client.ObjectKeyFromObject(cluster), certificates, kcpOwner)
921+
err := r.ensureCertificatesOwnerRef(ctx, certificates, kcpOwner)
912922
g.Expect(err).To(BeNil())
913923

914924
secrets := &corev1.SecretList{}

controlplane/kubeadm/internal/suite_test.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import (
2020
"os"
2121
"testing"
2222

23+
corev1 "k8s.io/api/core/v1"
2324
ctrl "sigs.k8s.io/controller-runtime"
25+
"sigs.k8s.io/controller-runtime/pkg/client"
2426

2527
"sigs.k8s.io/cluster-api/internal/test/envtest"
2628
)
@@ -32,7 +34,11 @@ var (
3234

3335
func TestMain(m *testing.M) {
3436
os.Exit(envtest.Run(ctx, envtest.RunInput{
35-
M: m,
37+
M: m,
38+
ManagerUncachedObjs: []client.Object{
39+
&corev1.ConfigMap{},
40+
&corev1.Secret{},
41+
},
3642
SetupEnv: func(e *envtest.Environment) { env = e },
3743
}))
3844
}

util/secret/certificates.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ func (c Certificates) Lookup(ctx context.Context, ctrlclient client.Client, clus
212212
return err
213213
}
214214
certificate.KeyPair = kp
215+
certificate.Secret = s
215216
}
216217
return nil
217218
}
@@ -257,6 +258,7 @@ func (c Certificates) SaveGenerated(ctx context.Context, ctrlclient client.Clien
257258
if err := ctrlclient.Create(ctx, s); err != nil {
258259
return errors.WithStack(err)
259260
}
261+
certificate.Secret = s
260262
}
261263
return nil
262264
}
@@ -284,6 +286,7 @@ type Certificate struct {
284286
Purpose Purpose
285287
KeyPair *certs.KeyPair
286288
CertFile, KeyFile string
289+
Secret *corev1.Secret
287290
}
288291

289292
// Hashes hashes all the certificates stored in a CA certificate.

0 commit comments

Comments
 (0)