Skip to content

Commit 91e64ed

Browse files
✨ Allow credentials in multiple clusters (#114)
**What is the purpose of this pull request/Why do we need it?** As we would like to allow referencing the same secret in multiple clusters, we need to make sure to not delete it when it is still in use and set the owner references accordingly. **Description of changes:** Updates the finalizer logic to ensure that a finalizer is not removed as long as the secret is referenced by multiple owners. **Special notes for your reviewer:** * An object in Kubernetes can only have one controller reference, but multiple owner references. **Checklist:** - [x] Includes [emojis](https://github.com/kubernetes-sigs/kubebuilder-release-tools?tab=readme-ov-file#kubebuilder-project-versioning) --------- Co-authored-by: Jonas Riedel <jonas.riedel@ionos.com>
1 parent b6f9c86 commit 91e64ed

File tree

2 files changed

+12
-15
lines changed

2 files changed

+12
-15
lines changed

api/v1alpha1/ionoscloudcluster_types.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@ const (
2727
// associated with the IonosCloudCluster before removing it from the API server.
2828
ClusterFinalizer = "ionoscloudcluster.infrastructure.cluster.x-k8s.io"
2929

30-
// ClusterCredentialsFinalizer allows cleanup of resources, which are
31-
// associated with the IonosCloudCluster credentials before removing it from the API server.
32-
ClusterCredentialsFinalizer = ClusterFinalizer + "/credentials"
33-
3430
// IonosCloudClusterReady is the condition for the IonosCloudCluster, which indicates that the cluster is ready.
3531
IonosCloudClusterReady clusterv1.ConditionType = "ClusterReady"
3632

internal/controller/util.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"time"
2323

2424
"github.com/go-logr/logr"
25+
"github.com/google/go-cmp/cmp"
2526
sdk "github.com/ionos-cloud/sdk-go/v6"
2627
corev1 "k8s.io/api/core/v1"
2728
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -97,30 +98,30 @@ func createServiceFromCluster(
9798
return cloud.NewService(ionosClient, log)
9899
}
99100

100-
// ensureSecretControlledByCluster ensures that the secrets will contain a finalizer and a controller reference.
101-
// The secret should only be deleted when there are no resources left in the IONOS Cloud environment.
101+
// ensureSecretControlledByCluster ensures that the secrets will contain a cluster-specific finalizer and an owner reference.
102+
// The secret will be deleted automatically with its last owner.
102103
func ensureSecretControlledByCluster(
103104
ctx context.Context, c client.Client,
104105
cluster *infrav1.IonosCloudCluster,
105106
secret *corev1.Secret,
106107
) error {
107-
requireUpdate := controllerutil.AddFinalizer(secret, infrav1.ClusterCredentialsFinalizer)
108+
old := secret.DeepCopy()
108109

109-
if !controllerutil.HasControllerReference(secret) {
110-
if err := controllerutil.SetControllerReference(cluster, secret, c.Scheme()); err != nil {
111-
return err
112-
}
113-
requireUpdate = true
110+
finalizerAdded := controllerutil.AddFinalizer(secret, fmt.Sprintf("%s/%s", infrav1.ClusterFinalizer, cluster.GetUID()))
111+
// We want to allow using the secret in multiple clusters.
112+
// Using owner references because Kubernetes only allows us to have one controller reference.
113+
if err := controllerutil.SetOwnerReference(cluster, secret, c.Scheme()); err != nil {
114+
return err
114115
}
115116

116-
if requireUpdate {
117+
if finalizerAdded || !cmp.Equal(old.GetOwnerReferences(), secret.GetOwnerReferences()) {
117118
return c.Update(ctx, secret)
118119
}
119120

120121
return nil
121122
}
122123

123-
// removeCredentialsFinalizer removes the finalizer from the credential secret.
124+
// removeCredentialsFinalizer removes the cluster-specific finalizer from the credentials secret.
124125
func removeCredentialsFinalizer(ctx context.Context, c client.Client, cluster *infrav1.IonosCloudCluster) error {
125126
secretKey := client.ObjectKey{
126127
Namespace: cluster.Namespace,
@@ -133,6 +134,6 @@ func removeCredentialsFinalizer(ctx context.Context, c client.Client, cluster *i
133134
return client.IgnoreNotFound(err)
134135
}
135136

136-
controllerutil.RemoveFinalizer(&secret, infrav1.ClusterCredentialsFinalizer)
137+
controllerutil.RemoveFinalizer(&secret, fmt.Sprintf("%s/%s", infrav1.ClusterFinalizer, cluster.GetUID()))
137138
return c.Update(ctx, &secret)
138139
}

0 commit comments

Comments
 (0)