Skip to content

Commit 0db9b0f

Browse files
committed
feat: adds cluster's ownerref on cilium helm values source object
1 parent 269b38b commit 0db9b0f

File tree

7 files changed

+94
-21
lines changed

7 files changed

+94
-21
lines changed

docs/content/addons/cni.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,6 @@ data:
7575
mode: kubernetes
7676
kind: ConfigMap
7777
metadata:
78-
labels:
79-
clusterctl.cluster.x-k8s.io/move: ""
8078
name: <CLUSTER_NAME>-cilium-cni-helm-values-template
8179
namespace: <CLUSTER_NAMESPACE>
8280
```
@@ -94,8 +92,6 @@ stringData:
9492
mode: kubernetes
9593
kind: Secret
9694
metadata:
97-
labels:
98-
clusterctl.cluster.x-k8s.io/move: ""
9995
name: <CLUSTER_NAME>-cilium-cni-helm-values-template
10096
namespace: <CLUSTER_NAMESPACE>
10197
type: Opaque

pkg/handlers/generic/lifecycle/ccm/nutanix/handler.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
"github.com/go-logr/logr"
1515
"github.com/spf13/pflag"
16+
corev1 "k8s.io/api/core/v1"
1617
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1718
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
1819
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
@@ -84,10 +85,13 @@ func (p *provider) Apply(
8485
// However, that would leave the credentials visible in the HelmChartProxy.
8586
// Instead, we'll create the Secret on the remote cluster and reference it in the Helm values.
8687
if clusterConfig.Addons.CCM.Credentials != nil {
87-
err := handlersutils.EnsureOwnerReferenceForSecret(
88+
err := handlersutils.EnsureClusterOwnerReferenceForObject(
8889
ctx,
8990
p.client,
90-
clusterConfig.Addons.CCM.Credentials.SecretRef.Name,
91+
&corev1.TypedLocalObjectReference{
92+
Kind: "Secret",
93+
Name: clusterConfig.Addons.CCM.Credentials.SecretRef.Name,
94+
},
9195
cluster,
9296
)
9397
if err != nil {

pkg/handlers/generic/lifecycle/cni/cilium/handler.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"fmt"
99

1010
"github.com/spf13/pflag"
11+
corev1 "k8s.io/api/core/v1"
1112
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1213
"k8s.io/utils/ptr"
1314
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
@@ -22,6 +23,7 @@ import (
2223
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/lifecycle/addons"
2324
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/lifecycle/config"
2425
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pkg/handlers/options"
26+
handlersutils "github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/pkg/handlers/utils"
2527
)
2628

2729
type CNIConfig struct {
@@ -183,6 +185,33 @@ func (c *CiliumCNI) apply(
183185
helmValuesSourceRefName = cniVar.Values.SourceRef.Name
184186
// Use cluster's namespace since Values.SourceRef is always a LocalObjectReference
185187
targetNamespace = cluster.Namespace
188+
189+
err := handlersutils.EnsureClusterOwnerReferenceForObject(
190+
ctx,
191+
c.client,
192+
&corev1.TypedLocalObjectReference{
193+
Kind: cniVar.Values.SourceRef.Kind,
194+
Name: cniVar.Values.SourceRef.Name,
195+
},
196+
cluster,
197+
)
198+
if err != nil {
199+
log.Error(
200+
err,
201+
"error updating Cluster's owner reference on cilium helm values source object",
202+
"name",
203+
cniVar.Values.SourceRef.Name,
204+
"kind",
205+
cniVar.Values.SourceRef.Kind,
206+
)
207+
resp.SetStatus(runtimehooksv1.ResponseStatusFailure)
208+
resp.SetMessage(
209+
fmt.Sprintf(
210+
"failed to set Cluster's owner reference on cilium helm values source object: %v",
211+
err,
212+
),
213+
)
214+
}
186215
}
187216

188217
strategy = addons.NewHelmAddonApplier(

pkg/handlers/generic/lifecycle/csi/nutanix/handler.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"github.com/go-logr/logr"
1111
"github.com/spf13/pflag"
12+
corev1 "k8s.io/api/core/v1"
1213
"k8s.io/utils/ptr"
1314
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
1415
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
@@ -108,10 +109,13 @@ func (n *NutanixCSI) Apply(
108109
}
109110

110111
if provider.Credentials != nil {
111-
err := handlersutils.EnsureOwnerReferenceForSecret(
112+
err := handlersutils.EnsureClusterOwnerReferenceForObject(
112113
ctx,
113114
n.client,
114-
provider.Credentials.SecretRef.Name,
115+
&corev1.TypedLocalObjectReference{
116+
Kind: "Secret",
117+
Name: provider.Credentials.SecretRef.Name,
118+
},
115119
cluster,
116120
)
117121
if err != nil {

pkg/handlers/generic/mutation/imageregistries/credentials/inject.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"errors"
99
"fmt"
1010

11+
corev1 "k8s.io/api/core/v1"
1112
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1213
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1314
"k8s.io/apimachinery/pkg/runtime"
@@ -287,10 +288,13 @@ func ensureOwnerReferenceOnCredentialsSecrets(
287288
if secretName := handlersutils.SecretNameForImageRegistryCredentials(credential); secretName != "" {
288289
// Ensure the Secret is owned by the Cluster so it is correctly moved and deleted with the Cluster.
289290
// This code assumes that Secret exists and that was validated before calling this function.
290-
err := handlersutils.EnsureOwnerReferenceForSecret(
291+
err := handlersutils.EnsureClusterOwnerReferenceForObject(
291292
ctx,
292293
c,
293-
secretName,
294+
&corev1.TypedLocalObjectReference{
295+
Kind: "Secret",
296+
Name: secretName,
297+
},
294298
cluster,
295299
)
296300
if err != nil {

pkg/handlers/utils/secrets.go

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99

1010
corev1 "k8s.io/api/core/v1"
1111
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
13+
"k8s.io/apimachinery/pkg/runtime/schema"
1214
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
1315
"sigs.k8s.io/cluster-api/controllers/remote"
1416
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
@@ -64,30 +66,61 @@ func CopySecretToRemoteCluster(
6466
return nil
6567
}
6668

67-
// EnsureOwnerReferenceForSecret will ensure that the secretName Secret has an OwnerReference of the cluster.
68-
func EnsureOwnerReferenceForSecret(
69+
// EnsureClusterOwnerReferenceForObject ensures that OwnerReference of the cluster is added on provided object.
70+
func EnsureClusterOwnerReferenceForObject(
6971
ctx context.Context,
7072
cl ctrlclient.Client,
71-
secretName string,
73+
objectRef *corev1.TypedLocalObjectReference,
7274
cluster *clusterv1.Cluster,
7375
) error {
74-
secret, err := getSecretForCluster(ctx, cl, secretName, cluster)
76+
targetObj, err := GetResourceFromTypedLocalObjectReference(
77+
ctx,
78+
cl,
79+
objectRef,
80+
cluster.Namespace,
81+
)
7582
if err != nil {
76-
return err
83+
return fmt.Errorf("failed to get object from TypedLocalObjectReference: %w", err)
7784
}
7885

79-
err = controllerutil.SetOwnerReference(cluster, secret, cl.Scheme())
86+
err = controllerutil.SetOwnerReference(cluster, targetObj, cl.Scheme())
8087
if err != nil {
81-
return fmt.Errorf("failed to set owner reference on Secret: %w", err)
88+
return fmt.Errorf("failed to set cluster's owner reference on object: %w", err)
8289
}
8390

84-
err = cl.Update(ctx, secret)
91+
err = cl.Update(ctx, targetObj)
8592
if err != nil {
86-
return fmt.Errorf("failed to update Secret with owner references: %w", err)
93+
return fmt.Errorf("failed to update object with cluster's owner reference: %w", err)
8794
}
8895
return nil
8996
}
9097

98+
// GetResourceFromTypedLocalObjectReference gets the resource from the provided TypedLocalObjectReference.
99+
func GetResourceFromTypedLocalObjectReference(
100+
ctx context.Context,
101+
cl ctrlclient.Client,
102+
objectRef *corev1.TypedLocalObjectReference,
103+
ns string,
104+
) (*unstructured.Unstructured, error) {
105+
targetObj := &unstructured.Unstructured{}
106+
107+
apiVersion := corev1.SchemeGroupVersion.String()
108+
if objectRef.APIGroup != nil {
109+
apiVersion = *objectRef.APIGroup
110+
}
111+
112+
targetObj.SetGroupVersionKind(schema.FromAPIVersionAndKind(apiVersion, objectRef.Kind))
113+
err := cl.Get(ctx, ctrlclient.ObjectKey{
114+
Namespace: ns,
115+
Name: objectRef.Name,
116+
}, targetObj)
117+
if err != nil {
118+
return nil, err
119+
}
120+
121+
return targetObj, nil
122+
}
123+
91124
func getSecretForCluster(
92125
ctx context.Context,
93126
c ctrlclient.Client,

pkg/handlers/utils/secrets_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,13 @@ func Test_EnsureOwnerReferenceForSecret(t *testing.T) {
104104
t.Run(tt.name, func(t *testing.T) {
105105
t.Parallel()
106106

107-
err := EnsureOwnerReferenceForSecret(
107+
err := EnsureClusterOwnerReferenceForObject(
108108
context.Background(),
109109
tt.client,
110-
tt.secretName,
110+
&corev1.TypedLocalObjectReference{
111+
Kind: "Secret",
112+
Name: tt.secretName,
113+
},
111114
tt.cluster,
112115
)
113116
require.Equal(t, tt.wantErr, err)

0 commit comments

Comments
 (0)