Skip to content

Commit bce3480

Browse files
committed
fix: Make Cluster the owner of image registry credential secret
1 parent 4cb10d8 commit bce3480

File tree

2 files changed

+67
-43
lines changed

2 files changed

+67
-43
lines changed

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

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
1818
ctrl "sigs.k8s.io/controller-runtime"
1919
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
20+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2021

2122
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/api/v1alpha1"
2223
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/handlers/mutation"
@@ -69,7 +70,7 @@ func (h *imageRegistriesPatchHandler) Mutate(
6970
vars map[string]apiextensionsv1.JSON,
7071
holderRef runtimehooksv1.HolderReference,
7172
clusterKey ctrlclient.ObjectKey,
72-
_ mutation.ClusterGetter,
73+
clusterGetter mutation.ClusterGetter,
7374
) error {
7475
log := ctrl.LoggerFrom(ctx).WithValues(
7576
"holderRef", holderRef,
@@ -151,6 +152,33 @@ func (h *imageRegistriesPatchHandler) Mutate(
151152
return generateErr
152153
}
153154

155+
credentialsSecret, generateErr := generateCredentialsSecret(
156+
registriesWithOptionalCredentials,
157+
clusterKey.Name,
158+
clusterKey.Namespace,
159+
)
160+
if generateErr != nil {
161+
return fmt.Errorf(
162+
"error generating credentials Secret for Image Registry Credentials variable: %w",
163+
err,
164+
)
165+
}
166+
167+
cluster, err := clusterGetter(ctx)
168+
if err != nil {
169+
log.Error(
170+
err,
171+
"failed to get cluster from Image Registry Credentials mutation handler",
172+
)
173+
return err
174+
}
175+
if err = controllerutil.SetOwnerReference(cluster, credentialsSecret, h.client.Scheme()); err != nil {
176+
return fmt.Errorf(
177+
"failed to set owner reference on Image Registry Credentials Secret: %w",
178+
err,
179+
)
180+
}
181+
154182
if err := patches.MutateIfApplicable(
155183
obj, vars, &holderRef, selectors.ControlPlane(), log,
156184
func(obj *controlplanev1.KubeadmControlPlaneTemplate) error {
@@ -172,9 +200,8 @@ func (h *imageRegistriesPatchHandler) Mutate(
172200
commands...,
173201
)
174202

175-
generateErr = createSecretIfNeeded(ctx, h.client, registriesWithOptionalCredentials, clusterKey)
176-
if generateErr != nil {
177-
return generateErr
203+
if err := client.ServerSideApply(ctx, h.client, credentialsSecret, client.ForceOwnership); err != nil {
204+
return fmt.Errorf("failed to apply Image Registry Credentials Secret: %w", err)
178205
}
179206

180207
initConfiguration := obj.Spec.Template.Spec.KubeadmConfigSpec.InitConfiguration
@@ -216,9 +243,8 @@ func (h *imageRegistriesPatchHandler) Mutate(
216243
).Info("adding PreKubeadmCommands to worker node kubeadm config template")
217244
obj.Spec.Template.Spec.PreKubeadmCommands = append(obj.Spec.Template.Spec.PreKubeadmCommands, commands...)
218245

219-
generateErr := createSecretIfNeeded(ctx, h.client, registriesWithOptionalCredentials, clusterKey)
220-
if generateErr != nil {
221-
return generateErr
246+
if err := client.ServerSideApply(ctx, h.client, credentialsSecret, client.ForceOwnership); err != nil {
247+
return fmt.Errorf("failed to apply Image Registry Credentials Secret: %w", err)
222248
}
223249

224250
joinConfiguration := obj.Spec.Template.Spec.JoinConfiguration
@@ -331,32 +357,6 @@ func generateFilesAndCommands(
331357
return files, commands, err
332358
}
333359

334-
func createSecretIfNeeded(
335-
ctx context.Context,
336-
c ctrlclient.Client,
337-
registriesWithOptionalCredentials []providerConfig,
338-
clusterKey ctrlclient.ObjectKey,
339-
) error {
340-
credentialsSecret, err := generateCredentialsSecret(
341-
registriesWithOptionalCredentials,
342-
clusterKey.Name,
343-
clusterKey.Namespace,
344-
)
345-
if err != nil {
346-
return fmt.Errorf(
347-
"error generating credentials Secret for Image Registry Credentials variable: %w",
348-
err,
349-
)
350-
}
351-
if credentialsSecret != nil {
352-
if err := client.ServerSideApply(ctx, c, credentialsSecret, client.ForceOwnership); err != nil {
353-
return fmt.Errorf("failed to apply Image Registry Credentials Secret: %w", err)
354-
}
355-
}
356-
357-
return nil
358-
}
359-
360360
// secretForImageRegistryCredentials returns the Secret for the given ImageRegistryCredentials.
361361
// Returns nil if the secret field is empty.
362362
func secretForImageRegistryCredentials(

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

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,11 @@ import (
1111
"github.com/stretchr/testify/assert"
1212
corev1 "k8s.io/api/core/v1"
1313
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
"k8s.io/apimachinery/pkg/runtime"
15+
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1416
"k8s.io/apiserver/pkg/storage/names"
17+
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
18+
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
1519
runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1"
1620

1721
"github.com/nutanix-cloud-native/cluster-api-runtime-extensions-nutanix/api/v1alpha1"
@@ -126,15 +130,13 @@ func TestImageRegistriesPatch(t *testing.T) {
126130
}
127131

128132
var _ = Describe("Generate Image registry patches", func() {
133+
clientScheme := runtime.NewScheme()
134+
utilruntime.Must(clientgoscheme.AddToScheme(clientScheme))
135+
utilruntime.Must(clusterv1.AddToScheme(clientScheme))
136+
129137
patchGenerator := func() mutation.GeneratePatches {
130-
// Always initialize the testEnv variable in the closure.
131-
// This will allow ginkgo to initialize testEnv variable during test execution time.
132-
testEnv := helpers.TestEnv
133-
// use direct client instead of controller client. This will allow the patch handler to read k8s object
134-
// that are written by the tests.
135-
// Test cases writes credentials secret that the mutator handler reads.
136-
// Using direct client will enable reading it immediately.
137-
client, err := testEnv.GetK8sClient()
138+
// Use direct client to allow patch handler to read objects created by tests.
139+
client, err := helpers.TestEnv.GetK8sClientWithScheme(clientScheme)
138140
gomega.Expect(err).To(gomega.BeNil())
139141
return mutation.NewMetaGeneratePatchesHandler("", client, NewPatch(client)).(mutation.GeneratePatches)
140142
}
@@ -392,22 +394,44 @@ var _ = Describe("Generate Image registry patches", func() {
392394

393395
// Create credentials secret before each test
394396
BeforeEach(func(ctx SpecContext) {
395-
client, err := helpers.TestEnv.GetK8sClient()
397+
client, err := helpers.TestEnv.GetK8sClientWithScheme(clientScheme)
396398
gomega.Expect(err).To(gomega.BeNil())
399+
397400
gomega.Expect(client.Create(
398401
ctx,
399402
newRegistryCredentialsSecret(validSecretName, request.Namespace),
400403
)).To(gomega.BeNil())
404+
405+
gomega.Expect(client.Create(
406+
ctx,
407+
&clusterv1.Cluster{
408+
ObjectMeta: metav1.ObjectMeta{
409+
Name: request.ClusterName,
410+
Namespace: metav1.NamespaceDefault,
411+
},
412+
},
413+
)).To(gomega.BeNil())
401414
})
402415

403416
// Delete credentials secret after each test
404417
AfterEach(func(ctx SpecContext) {
405-
client, err := helpers.TestEnv.GetK8sClient()
418+
client, err := helpers.TestEnv.GetK8sClientWithScheme(clientScheme)
406419
gomega.Expect(err).To(gomega.BeNil())
420+
407421
gomega.Expect(client.Delete(
408422
ctx,
409423
newRegistryCredentialsSecret(validSecretName, request.Namespace),
410424
)).To(gomega.BeNil())
425+
426+
gomega.Expect(client.Delete(
427+
ctx,
428+
&clusterv1.Cluster{
429+
ObjectMeta: metav1.ObjectMeta{
430+
Name: request.ClusterName,
431+
Namespace: metav1.NamespaceDefault,
432+
},
433+
},
434+
)).To(gomega.BeNil())
411435
})
412436
// create test node for each case
413437
for testIdx := range testDefs {

0 commit comments

Comments
 (0)