From ca851109b92b902e61788f1ce1a1faca8ea44348 Mon Sep 17 00:00:00 2001 From: Daniel Lipovetsky Date: Wed, 27 Mar 2024 17:05:24 -0700 Subject: [PATCH 1/4] feat: Make containerd restart its own patch --- .../aws/mutation/metapatch_handler_test.go | 206 ++++++++++++++++++ .../docker/mutation/metapatch_handler_test.go | 130 +++++++++++ .../mutation/containerdrestart/inject.go | 86 ++++++++ .../mutation/containerdrestart/restart.go | 27 +++ .../templates/containerd-restart.sh | 0 .../tests/generate_patches.go | 71 ++++++ pkg/handlers/generic/mutation/handlers.go | 6 + .../generic/mutation/mirrors/inject.go | 4 - .../generic/mutation/mirrors/inject_test.go | 16 -- .../generic/mutation/mirrors/mirror.go | 17 -- 10 files changed, 526 insertions(+), 37 deletions(-) create mode 100644 pkg/handlers/aws/mutation/metapatch_handler_test.go create mode 100644 pkg/handlers/docker/mutation/metapatch_handler_test.go create mode 100644 pkg/handlers/generic/mutation/containerdrestart/inject.go create mode 100644 pkg/handlers/generic/mutation/containerdrestart/restart.go rename pkg/handlers/generic/mutation/{mirrors => containerdrestart}/templates/containerd-restart.sh (100%) create mode 100644 pkg/handlers/generic/mutation/containerdrestart/tests/generate_patches.go diff --git a/pkg/handlers/aws/mutation/metapatch_handler_test.go b/pkg/handlers/aws/mutation/metapatch_handler_test.go new file mode 100644 index 000000000..bb455747d --- /dev/null +++ b/pkg/handlers/aws/mutation/metapatch_handler_test.go @@ -0,0 +1,206 @@ +// Copyright 2023 D2iQ, Inc. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +package mutation + +import ( + "testing" + + "sigs.k8s.io/controller-runtime/pkg/manager" + + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/api/v1alpha1" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/handlers/mutation" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/ami" + amitests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/ami/tests" + calicotests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/cni/calico/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/controlplaneloadbalancer" + controlplaneloadbalancertests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/controlplaneloadbalancer/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/iaminstanceprofile" + iaminstanceprofiletests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/iaminstanceprofile/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/instancetype" + instancetypetests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/instancetype/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/network" + networktests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/network/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/region" + regiontests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/region/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/clusterconfig" + auditpolicytests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/auditpolicy/tests" + containerdrestarttests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/containerdrestart/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/etcd" + etcdtests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/etcd/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/extraapiservercertsans" + extraapiservercertsanstests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/extraapiservercertsans/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/httpproxy" + httpproxytests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/httpproxy/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/imageregistries" + imageregistrycredentialstests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/imageregistries/credentials/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/kubernetesimagerepository" + kubernetesimagerepositorytests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/kubernetesimagerepository/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/mirrors" + globalimageregistrymirrortests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/mirrors/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/users" + userstests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/users/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/workerconfig" +) + +func metaPatchGeneratorFunc(mgr manager.Manager) func() mutation.GeneratePatches { + return func() mutation.GeneratePatches { + return MetaPatchHandler(mgr).(mutation.GeneratePatches) + } +} + +func workerPatchGeneratorFunc() func() mutation.GeneratePatches { + return func() mutation.GeneratePatches { + return MetaWorkerPatchHandler().(mutation.GeneratePatches) + } +} + +func TestGeneratePatches(t *testing.T) { + t.Parallel() + + mgr := testEnv.Manager + + regiontests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + v1alpha1.AWSVariableName, + region.VariableName, + ) + + iaminstanceprofiletests.TestControlPlaneGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + clusterconfig.MetaControlPlaneConfigName, + v1alpha1.AWSVariableName, + iaminstanceprofile.VariableName, + ) + + iaminstanceprofiletests.TestWorkerGeneratePatches( + t, + workerPatchGeneratorFunc(), + workerconfig.MetaVariableName, + v1alpha1.AWSVariableName, + iaminstanceprofile.VariableName, + ) + + instancetypetests.TestControlPlaneGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + clusterconfig.MetaControlPlaneConfigName, + v1alpha1.AWSVariableName, + instancetype.VariableName, + ) + + instancetypetests.TestWorkerGeneratePatches( + t, + workerPatchGeneratorFunc(), + workerconfig.MetaVariableName, + v1alpha1.AWSVariableName, + instancetype.VariableName, + ) + + calicotests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + "addons", + v1alpha1.CNIVariableName, + ) + + auditpolicytests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + ) + + httpproxytests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + httpproxy.VariableName, + ) + + etcdtests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + etcd.VariableName, + ) + + extraapiservercertsanstests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + extraapiservercertsans.VariableName, + ) + + kubernetesimagerepositorytests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + kubernetesimagerepository.VariableName, + ) + + imageregistrycredentialstests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + mgr.GetClient(), + clusterconfig.MetaVariableName, + imageregistries.VariableName, + ) + + globalimageregistrymirrortests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + mgr.GetClient(), + clusterconfig.MetaVariableName, + mirrors.GlobalMirrorVariableName, + ) + + amitests.TestControlPlaneGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + clusterconfig.MetaControlPlaneConfigName, + v1alpha1.AWSVariableName, + ami.VariableName, + ) + + amitests.TestWorkerGeneratePatches( + t, + workerPatchGeneratorFunc(), + workerconfig.MetaVariableName, + v1alpha1.AWSVariableName, + ami.VariableName, + ) + + networktests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + v1alpha1.AWSVariableName, + network.VariableName, + ) + + controlplaneloadbalancertests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + v1alpha1.AWSVariableName, + controlplaneloadbalancer.VariableName, + ) + + userstests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + users.VariableName, + ) + + containerdrestarttests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + ) +} diff --git a/pkg/handlers/docker/mutation/metapatch_handler_test.go b/pkg/handlers/docker/mutation/metapatch_handler_test.go new file mode 100644 index 000000000..81e8e134f --- /dev/null +++ b/pkg/handlers/docker/mutation/metapatch_handler_test.go @@ -0,0 +1,130 @@ +// Copyright 2023 D2iQ, Inc. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +package mutation + +import ( + "testing" + + "sigs.k8s.io/controller-runtime/pkg/manager" + + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/handlers/mutation" + dockerclusterconfig "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/docker/clusterconfig" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/docker/mutation/customimage" + customimagetests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/docker/mutation/customimage/tests" + dockerworkerconfig "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/docker/workerconfig" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/clusterconfig" + auditpolicytests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/auditpolicy/tests" + containerdrestarttests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/containerdrestart/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/etcd" + etcdtests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/etcd/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/extraapiservercertsans" + extraapiservercertsanstests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/extraapiservercertsans/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/httpproxy" + httpproxytests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/httpproxy/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/imageregistries" + imageregistrycredentialstests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/imageregistries/credentials/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/kubernetesimagerepository" + kubernetesimagerepositorytests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/kubernetesimagerepository/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/mirrors" + globalimageregistrymirrortests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/mirrors/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/users" + userstests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/users/tests" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/workerconfig" +) + +func metaPatchGeneratorFunc(mgr manager.Manager) func() mutation.GeneratePatches { + return func() mutation.GeneratePatches { + return MetaPatchHandler(mgr).(mutation.GeneratePatches) + } +} + +func workerPatchGeneratorFunc() func() mutation.GeneratePatches { + return func() mutation.GeneratePatches { + return MetaWorkerPatchHandler().(mutation.GeneratePatches) + } +} + +func TestGeneratePatches(t *testing.T) { + t.Parallel() + + mgr := testEnv.Manager + + customimagetests.TestControlPlaneGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + clusterconfig.MetaControlPlaneConfigName, + dockerclusterconfig.DockerVariableName, + customimage.VariableName, + ) + + customimagetests.TestWorkerGeneratePatches( + t, + workerPatchGeneratorFunc(), + workerconfig.MetaVariableName, + dockerworkerconfig.DockerVariableName, + customimage.VariableName, + ) + + auditpolicytests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + ) + + httpproxytests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + httpproxy.VariableName, + ) + + etcdtests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + etcd.VariableName, + ) + + extraapiservercertsanstests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + extraapiservercertsans.VariableName, + ) + + kubernetesimagerepositorytests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + kubernetesimagerepository.VariableName, + ) + + imageregistrycredentialstests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + mgr.GetClient(), + clusterconfig.MetaVariableName, + imageregistries.VariableName, + ) + + globalimageregistrymirrortests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + mgr.GetClient(), + clusterconfig.MetaVariableName, + mirrors.GlobalMirrorVariableName, + ) + + userstests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + clusterconfig.MetaVariableName, + users.VariableName, + ) + + containerdrestarttests.TestGeneratePatches( + t, + metaPatchGeneratorFunc(mgr), + ) +} diff --git a/pkg/handlers/generic/mutation/containerdrestart/inject.go b/pkg/handlers/generic/mutation/containerdrestart/inject.go new file mode 100644 index 000000000..adf8b99b6 --- /dev/null +++ b/pkg/handlers/generic/mutation/containerdrestart/inject.go @@ -0,0 +1,86 @@ +// Copyright 2023 D2iQ, Inc. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +package containerdrestart + +import ( + "context" + + apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + bootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" + controlplanev1 "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" + runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1" + ctrl "sigs.k8s.io/controller-runtime" + ctrlclient "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/patches" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/patches/selectors" +) + +type globalMirrorPatchHandler struct{} + +func NewPatch() *globalMirrorPatchHandler { + return &globalMirrorPatchHandler{} +} + +func (h *globalMirrorPatchHandler) Mutate( + ctx context.Context, + obj *unstructured.Unstructured, + vars map[string]apiextensionsv1.JSON, + holderRef runtimehooksv1.HolderReference, + clusterKey ctrlclient.ObjectKey, +) error { + log := ctrl.LoggerFrom(ctx).WithValues( + "holderRef", holderRef, + ) + + file, command := generateContainerdRestartScript() + + if err := patches.MutateIfApplicable( + obj, vars, &holderRef, selectors.ControlPlane(), log, + func(obj *controlplanev1.KubeadmControlPlaneTemplate) error { + log.WithValues( + "patchedObjectKind", obj.GetObjectKind().GroupVersionKind().String(), + "patchedObjectName", ctrlclient.ObjectKeyFromObject(obj), + ).Info("adding containerd restart script to control plane kubeadm config spec") + obj.Spec.Template.Spec.KubeadmConfigSpec.Files = append( + obj.Spec.Template.Spec.KubeadmConfigSpec.Files, + file, + ) + + log.WithValues( + "patchedObjectKind", obj.GetObjectKind().GroupVersionKind().String(), + "patchedObjectName", ctrlclient.ObjectKeyFromObject(obj), + ).Info("adding containerd restart command to control plane kubeadm config spec") + obj.Spec.Template.Spec.KubeadmConfigSpec.PreKubeadmCommands = append( + obj.Spec.Template.Spec.KubeadmConfigSpec.PreKubeadmCommands, + command, + ) + + return nil + }); err != nil { + return err + } + + if err := patches.MutateIfApplicable( + obj, vars, &holderRef, selectors.WorkersKubeadmConfigTemplateSelector(), log, + func(obj *bootstrapv1.KubeadmConfigTemplate) error { + log.WithValues( + "patchedObjectKind", obj.GetObjectKind().GroupVersionKind().String(), + "patchedObjectName", ctrlclient.ObjectKeyFromObject(obj), + ).Info("adding containerd restart script to worker node kubeadm config template") + obj.Spec.Template.Spec.Files = append(obj.Spec.Template.Spec.Files, file) + + log.WithValues( + "patchedObjectKind", obj.GetObjectKind().GroupVersionKind().String(), + "patchedObjectName", ctrlclient.ObjectKeyFromObject(obj), + ).Info("adding containerd restart command to worker node kubeadm config template") + obj.Spec.Template.Spec.PreKubeadmCommands = append(obj.Spec.Template.Spec.PreKubeadmCommands, command) + + return nil + }); err != nil { + return err + } + + return nil +} diff --git a/pkg/handlers/generic/mutation/containerdrestart/restart.go b/pkg/handlers/generic/mutation/containerdrestart/restart.go new file mode 100644 index 000000000..8826cceed --- /dev/null +++ b/pkg/handlers/generic/mutation/containerdrestart/restart.go @@ -0,0 +1,27 @@ +// Copyright 2023 D2iQ, Inc. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 +package containerdrestart + +import ( + _ "embed" + + bootstrapv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" +) + +const ( + ContainerdRestartScriptOnRemote = "/etc/containerd/restart.sh" + ContainerdRestartScriptOnRemoteCommand = "/bin/bash " + ContainerdRestartScriptOnRemote +) + +//go:embed templates/containerd-restart.sh +var containerdRestartScript []byte + +//nolint:gocritic // no need for named return values +func generateContainerdRestartScript() (bootstrapv1.File, string) { + return bootstrapv1.File{ + Path: ContainerdRestartScriptOnRemote, + Content: string(containerdRestartScript), + Permissions: "0700", + }, + ContainerdRestartScriptOnRemoteCommand +} diff --git a/pkg/handlers/generic/mutation/mirrors/templates/containerd-restart.sh b/pkg/handlers/generic/mutation/containerdrestart/templates/containerd-restart.sh similarity index 100% rename from pkg/handlers/generic/mutation/mirrors/templates/containerd-restart.sh rename to pkg/handlers/generic/mutation/containerdrestart/templates/containerd-restart.sh diff --git a/pkg/handlers/generic/mutation/containerdrestart/tests/generate_patches.go b/pkg/handlers/generic/mutation/containerdrestart/tests/generate_patches.go new file mode 100644 index 000000000..e2e757234 --- /dev/null +++ b/pkg/handlers/generic/mutation/containerdrestart/tests/generate_patches.go @@ -0,0 +1,71 @@ +// Copyright 2023 D2iQ, Inc. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +package tests + +import ( + "testing" + + "github.com/onsi/gomega" + + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/handlers/mutation" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/testutils/capitest" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/testutils/capitest/request" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/containerdrestart" +) + +func TestGeneratePatches( + t *testing.T, + generatorFunc func() mutation.GeneratePatches, +) { + t.Helper() + + capitest.ValidateGeneratePatches( + t, + generatorFunc, + capitest.PatchTestDef{ + Name: "restart script and command added to control plane kubeadm config spec", + RequestItem: request.NewKubeadmControlPlaneTemplateRequestItem(""), + ExpectedPatchMatchers: []capitest.JSONPatchMatcher{ + { + Operation: "add", + Path: "/spec/template/spec/kubeadmConfigSpec/files", + ValueMatcher: gomega.ContainElements( + gomega.HaveKeyWithValue( + "path", containerdrestart.ContainerdRestartScriptOnRemote, + ), + ), + }, + { + Operation: "add", + Path: "/spec/template/spec/kubeadmConfigSpec/preKubeadmCommands", + ValueMatcher: gomega.ContainElements( + containerdrestart.ContainerdRestartScriptOnRemoteCommand, + ), + }, + }, + }, + capitest.PatchTestDef{ + Name: "restart script and command added to worker node kubeadm config template", + RequestItem: request.NewKubeadmControlPlaneTemplateRequestItem(""), + ExpectedPatchMatchers: []capitest.JSONPatchMatcher{ + { + Operation: "add", + Path: "/spec/template/spec/kubeadmConfigSpec/files", + ValueMatcher: gomega.ContainElements( + gomega.HaveKeyWithValue( + "path", containerdrestart.ContainerdRestartScriptOnRemote, + ), + ), + }, + { + Operation: "add", + Path: "/spec/template/spec/kubeadmConfigSpec/preKubeadmCommands", + ValueMatcher: gomega.ContainElements( + containerdrestart.ContainerdRestartScriptOnRemoteCommand, + ), + }, + }, + }, + ) +} diff --git a/pkg/handlers/generic/mutation/handlers.go b/pkg/handlers/generic/mutation/handlers.go index bd71c8caa..0a3e4b71e 100644 --- a/pkg/handlers/generic/mutation/handlers.go +++ b/pkg/handlers/generic/mutation/handlers.go @@ -9,6 +9,7 @@ import ( "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/handlers/mutation" "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/cni/calico" "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/auditpolicy" + "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/containerdrestart" "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/etcd" "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/extraapiservercertsans" "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/httpproxy" @@ -30,5 +31,10 @@ func MetaMutators(mgr manager.Manager) []mutation.MetaMutator { mirrors.NewPatch(mgr.GetClient()), calico.NewPatch(), users.NewPatch(), + + // Some patches may have changed containerd configuration. + // We must restart containerd for the configuration to take effect. + // Therefore, we must apply this patch last. + containerdrestart.NewPatch(), } } diff --git a/pkg/handlers/generic/mutation/mirrors/inject.go b/pkg/handlers/generic/mutation/mirrors/inject.go index a1e5e8e3b..42ad077d0 100644 --- a/pkg/handlers/generic/mutation/mirrors/inject.go +++ b/pkg/handlers/generic/mutation/mirrors/inject.go @@ -191,10 +191,6 @@ func generateFilesAndCommands( } files = append(files, applyPatchesFile...) commands = append(commands, applyPatchesCommand) - // generate Containerd restart script and command - restartFile, restartCommand := generateContainerdRestartScript() - files = append(files, restartFile...) - commands = append(commands, restartCommand) return files, commands, err } diff --git a/pkg/handlers/generic/mutation/mirrors/inject_test.go b/pkg/handlers/generic/mutation/mirrors/inject_test.go index 3e7c9106d..24ca2ae17 100644 --- a/pkg/handlers/generic/mutation/mirrors/inject_test.go +++ b/pkg/handlers/generic/mutation/mirrors/inject_test.go @@ -75,9 +75,6 @@ var _ = Describe("Generate Global mirror patches", func() { gomega.HaveKeyWithValue( "path", "/etc/containerd/apply-patches.sh", ), - gomega.HaveKeyWithValue( - "path", "/etc/containerd/restart.sh", - ), ), }, { @@ -85,7 +82,6 @@ var _ = Describe("Generate Global mirror patches", func() { Path: "/spec/template/spec/kubeadmConfigSpec/preKubeadmCommands", ValueMatcher: gomega.ContainElements( "/bin/bash /etc/containerd/apply-patches.sh", - "/bin/bash /etc/containerd/restart.sh", ), }, }, @@ -124,9 +120,6 @@ var _ = Describe("Generate Global mirror patches", func() { gomega.HaveKeyWithValue( "path", "/etc/containerd/apply-patches.sh", ), - gomega.HaveKeyWithValue( - "path", "/etc/containerd/restart.sh", - ), ), }, { @@ -134,7 +127,6 @@ var _ = Describe("Generate Global mirror patches", func() { Path: "/spec/template/spec/kubeadmConfigSpec/preKubeadmCommands", ValueMatcher: gomega.ContainElements( "/bin/bash /etc/containerd/apply-patches.sh", - "/bin/bash /etc/containerd/restart.sh", ), }, }, @@ -173,9 +165,6 @@ var _ = Describe("Generate Global mirror patches", func() { gomega.HaveKeyWithValue( "path", "/etc/containerd/apply-patches.sh", ), - gomega.HaveKeyWithValue( - "path", "/etc/containerd/restart.sh", - ), ), }, { @@ -183,7 +172,6 @@ var _ = Describe("Generate Global mirror patches", func() { Path: "/spec/template/spec/preKubeadmCommands", ValueMatcher: gomega.ContainElements( "/bin/bash /etc/containerd/apply-patches.sh", - "/bin/bash /etc/containerd/restart.sh", ), }, }, @@ -230,9 +218,6 @@ var _ = Describe("Generate Global mirror patches", func() { gomega.HaveKeyWithValue( "path", "/etc/containerd/apply-patches.sh", ), - gomega.HaveKeyWithValue( - "path", "/etc/containerd/restart.sh", - ), ), }, { @@ -240,7 +225,6 @@ var _ = Describe("Generate Global mirror patches", func() { Path: "/spec/template/spec/preKubeadmCommands", ValueMatcher: gomega.ContainElements( "/bin/bash /etc/containerd/apply-patches.sh", - "/bin/bash /etc/containerd/restart.sh", ), }, }, diff --git a/pkg/handlers/generic/mutation/mirrors/mirror.go b/pkg/handlers/generic/mutation/mirrors/mirror.go index ff14c2b62..8ab281f9c 100644 --- a/pkg/handlers/generic/mutation/mirrors/mirror.go +++ b/pkg/handlers/generic/mutation/mirrors/mirror.go @@ -28,9 +28,6 @@ const ( containerdPatchesDirOnRemote = "/etc/containerd/cre.d" containerdApplyPatchesScriptOnRemote = "/etc/containerd/apply-patches.sh" containerdApplyPatchesScriptOnRemoteCommand = "/bin/bash " + containerdApplyPatchesScriptOnRemote - - containerdRestartScriptOnRemote = "/etc/containerd/restart.sh" - containerdRestartScriptOnRemoteCommand = "/bin/bash " + containerdRestartScriptOnRemote ) var ( @@ -50,9 +47,6 @@ var ( //go:embed templates/containerd-apply-patches.sh.gotmpl containerdApplyConfigPatchesScript []byte - - //go:embed templates/containerd-restart.sh - containerdRestartScript []byte ) type mirrorConfig struct { @@ -226,14 +220,3 @@ func generateContainerdApplyPatchesScript() ([]cabpkv1.File, string, error) { }, }, containerdApplyPatchesScriptOnRemoteCommand, nil } - -//nolint:gocritic // no need for named return values -func generateContainerdRestartScript() ([]cabpkv1.File, string) { - return []cabpkv1.File{ - { - Path: containerdRestartScriptOnRemote, - Content: string(containerdRestartScript), - Permissions: "0700", - }, - }, containerdRestartScriptOnRemoteCommand -} From db01c53f0883eba89feed5d3cc79ca3d2753b029 Mon Sep 17 00:00:00 2001 From: Shalin Patel Date: Mon, 1 Apr 2024 11:37:37 -0700 Subject: [PATCH 2/4] fix: unit tests for kubeadmconfigtemplate with containerdrestart patch --- .../mutation/containerdrestart/inject.go | 8 ++++---- .../tests/generate_patches.go | 19 +++++++++++++++---- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/pkg/handlers/generic/mutation/containerdrestart/inject.go b/pkg/handlers/generic/mutation/containerdrestart/inject.go index adf8b99b6..92edab3de 100644 --- a/pkg/handlers/generic/mutation/containerdrestart/inject.go +++ b/pkg/handlers/generic/mutation/containerdrestart/inject.go @@ -17,13 +17,13 @@ import ( "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/patches/selectors" ) -type globalMirrorPatchHandler struct{} +type containerdRestartPatchHandler struct{} -func NewPatch() *globalMirrorPatchHandler { - return &globalMirrorPatchHandler{} +func NewPatch() *containerdRestartPatchHandler { + return &containerdRestartPatchHandler{} } -func (h *globalMirrorPatchHandler) Mutate( +func (h *containerdRestartPatchHandler) Mutate( ctx context.Context, obj *unstructured.Unstructured, vars map[string]apiextensionsv1.JSON, diff --git a/pkg/handlers/generic/mutation/containerdrestart/tests/generate_patches.go b/pkg/handlers/generic/mutation/containerdrestart/tests/generate_patches.go index e2e757234..9ef570535 100644 --- a/pkg/handlers/generic/mutation/containerdrestart/tests/generate_patches.go +++ b/pkg/handlers/generic/mutation/containerdrestart/tests/generate_patches.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/onsi/gomega" + runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1" "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/handlers/mutation" "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/testutils/capitest" @@ -46,12 +47,22 @@ func TestGeneratePatches( }, }, capitest.PatchTestDef{ - Name: "restart script and command added to worker node kubeadm config template", - RequestItem: request.NewKubeadmControlPlaneTemplateRequestItem(""), + Name: "restart script and command added to worker node kubeadm config template", + Vars: []runtimehooksv1.Variable{ + capitest.VariableWithValue( + "builtin", + map[string]any{ + "machineDeployment": map[string]any{ + "class": "*", + }, + }, + ), + }, + RequestItem: request.NewKubeadmConfigTemplateRequestItem(""), ExpectedPatchMatchers: []capitest.JSONPatchMatcher{ { Operation: "add", - Path: "/spec/template/spec/kubeadmConfigSpec/files", + Path: "/spec/template/spec/files", ValueMatcher: gomega.ContainElements( gomega.HaveKeyWithValue( "path", containerdrestart.ContainerdRestartScriptOnRemote, @@ -60,7 +71,7 @@ func TestGeneratePatches( }, { Operation: "add", - Path: "/spec/template/spec/kubeadmConfigSpec/preKubeadmCommands", + Path: "/spec/template/spec/preKubeadmCommands", ValueMatcher: gomega.ContainElements( containerdrestart.ContainerdRestartScriptOnRemoteCommand, ), From cbea9a092486973e9092c11df58243dd933cdf65 Mon Sep 17 00:00:00 2001 From: Shalin Patel Date: Tue, 2 Apr 2024 14:31:54 -0700 Subject: [PATCH 3/4] fix: add comment for always add containerd patch --- pkg/handlers/generic/mutation/handlers.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/handlers/generic/mutation/handlers.go b/pkg/handlers/generic/mutation/handlers.go index 0a3e4b71e..9ec605971 100644 --- a/pkg/handlers/generic/mutation/handlers.go +++ b/pkg/handlers/generic/mutation/handlers.go @@ -35,6 +35,10 @@ func MetaMutators(mgr manager.Manager) []mutation.MetaMutator { // Some patches may have changed containerd configuration. // We must restart containerd for the configuration to take effect. // Therefore, we must apply this patch last. + // + // Containerd restart and readiness altogether could take ~5s. + // We want to keep patch independent of each other and not share any state. + // Therefore, We must always apply this patch regardless any other patch modified containerd configuration. containerdrestart.NewPatch(), } } From ec630e299c1c6fe243dde84a4677b6c556cdbe44 Mon Sep 17 00:00:00 2001 From: Shalin Patel Date: Fri, 5 Apr 2024 14:47:07 -0700 Subject: [PATCH 4/4] test: move unit test to their own package --- .../aws/mutation/metapatch_handler_test.go | 206 ------------------ .../docker/mutation/metapatch_handler_test.go | 130 ----------- .../generate_patches.go => inject_test.go} | 51 +++-- 3 files changed, 33 insertions(+), 354 deletions(-) delete mode 100644 pkg/handlers/aws/mutation/metapatch_handler_test.go delete mode 100644 pkg/handlers/docker/mutation/metapatch_handler_test.go rename pkg/handlers/generic/mutation/containerdrestart/{tests/generate_patches.go => inject_test.go} (67%) diff --git a/pkg/handlers/aws/mutation/metapatch_handler_test.go b/pkg/handlers/aws/mutation/metapatch_handler_test.go deleted file mode 100644 index bb455747d..000000000 --- a/pkg/handlers/aws/mutation/metapatch_handler_test.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2023 D2iQ, Inc. All rights reserved. -// SPDX-License-Identifier: Apache-2.0 - -package mutation - -import ( - "testing" - - "sigs.k8s.io/controller-runtime/pkg/manager" - - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/api/v1alpha1" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/handlers/mutation" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/ami" - amitests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/ami/tests" - calicotests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/cni/calico/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/controlplaneloadbalancer" - controlplaneloadbalancertests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/controlplaneloadbalancer/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/iaminstanceprofile" - iaminstanceprofiletests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/iaminstanceprofile/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/instancetype" - instancetypetests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/instancetype/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/network" - networktests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/network/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/region" - regiontests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/aws/mutation/region/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/clusterconfig" - auditpolicytests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/auditpolicy/tests" - containerdrestarttests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/containerdrestart/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/etcd" - etcdtests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/etcd/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/extraapiservercertsans" - extraapiservercertsanstests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/extraapiservercertsans/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/httpproxy" - httpproxytests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/httpproxy/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/imageregistries" - imageregistrycredentialstests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/imageregistries/credentials/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/kubernetesimagerepository" - kubernetesimagerepositorytests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/kubernetesimagerepository/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/mirrors" - globalimageregistrymirrortests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/mirrors/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/users" - userstests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/users/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/workerconfig" -) - -func metaPatchGeneratorFunc(mgr manager.Manager) func() mutation.GeneratePatches { - return func() mutation.GeneratePatches { - return MetaPatchHandler(mgr).(mutation.GeneratePatches) - } -} - -func workerPatchGeneratorFunc() func() mutation.GeneratePatches { - return func() mutation.GeneratePatches { - return MetaWorkerPatchHandler().(mutation.GeneratePatches) - } -} - -func TestGeneratePatches(t *testing.T) { - t.Parallel() - - mgr := testEnv.Manager - - regiontests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - v1alpha1.AWSVariableName, - region.VariableName, - ) - - iaminstanceprofiletests.TestControlPlaneGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - clusterconfig.MetaControlPlaneConfigName, - v1alpha1.AWSVariableName, - iaminstanceprofile.VariableName, - ) - - iaminstanceprofiletests.TestWorkerGeneratePatches( - t, - workerPatchGeneratorFunc(), - workerconfig.MetaVariableName, - v1alpha1.AWSVariableName, - iaminstanceprofile.VariableName, - ) - - instancetypetests.TestControlPlaneGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - clusterconfig.MetaControlPlaneConfigName, - v1alpha1.AWSVariableName, - instancetype.VariableName, - ) - - instancetypetests.TestWorkerGeneratePatches( - t, - workerPatchGeneratorFunc(), - workerconfig.MetaVariableName, - v1alpha1.AWSVariableName, - instancetype.VariableName, - ) - - calicotests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - "addons", - v1alpha1.CNIVariableName, - ) - - auditpolicytests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - ) - - httpproxytests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - httpproxy.VariableName, - ) - - etcdtests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - etcd.VariableName, - ) - - extraapiservercertsanstests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - extraapiservercertsans.VariableName, - ) - - kubernetesimagerepositorytests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - kubernetesimagerepository.VariableName, - ) - - imageregistrycredentialstests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - mgr.GetClient(), - clusterconfig.MetaVariableName, - imageregistries.VariableName, - ) - - globalimageregistrymirrortests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - mgr.GetClient(), - clusterconfig.MetaVariableName, - mirrors.GlobalMirrorVariableName, - ) - - amitests.TestControlPlaneGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - clusterconfig.MetaControlPlaneConfigName, - v1alpha1.AWSVariableName, - ami.VariableName, - ) - - amitests.TestWorkerGeneratePatches( - t, - workerPatchGeneratorFunc(), - workerconfig.MetaVariableName, - v1alpha1.AWSVariableName, - ami.VariableName, - ) - - networktests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - v1alpha1.AWSVariableName, - network.VariableName, - ) - - controlplaneloadbalancertests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - v1alpha1.AWSVariableName, - controlplaneloadbalancer.VariableName, - ) - - userstests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - users.VariableName, - ) - - containerdrestarttests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - ) -} diff --git a/pkg/handlers/docker/mutation/metapatch_handler_test.go b/pkg/handlers/docker/mutation/metapatch_handler_test.go deleted file mode 100644 index 81e8e134f..000000000 --- a/pkg/handlers/docker/mutation/metapatch_handler_test.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2023 D2iQ, Inc. All rights reserved. -// SPDX-License-Identifier: Apache-2.0 - -package mutation - -import ( - "testing" - - "sigs.k8s.io/controller-runtime/pkg/manager" - - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/handlers/mutation" - dockerclusterconfig "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/docker/clusterconfig" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/docker/mutation/customimage" - customimagetests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/docker/mutation/customimage/tests" - dockerworkerconfig "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/docker/workerconfig" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/clusterconfig" - auditpolicytests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/auditpolicy/tests" - containerdrestarttests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/containerdrestart/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/etcd" - etcdtests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/etcd/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/extraapiservercertsans" - extraapiservercertsanstests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/extraapiservercertsans/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/httpproxy" - httpproxytests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/httpproxy/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/imageregistries" - imageregistrycredentialstests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/imageregistries/credentials/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/kubernetesimagerepository" - kubernetesimagerepositorytests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/kubernetesimagerepository/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/mirrors" - globalimageregistrymirrortests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/mirrors/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/users" - userstests "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/users/tests" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/workerconfig" -) - -func metaPatchGeneratorFunc(mgr manager.Manager) func() mutation.GeneratePatches { - return func() mutation.GeneratePatches { - return MetaPatchHandler(mgr).(mutation.GeneratePatches) - } -} - -func workerPatchGeneratorFunc() func() mutation.GeneratePatches { - return func() mutation.GeneratePatches { - return MetaWorkerPatchHandler().(mutation.GeneratePatches) - } -} - -func TestGeneratePatches(t *testing.T) { - t.Parallel() - - mgr := testEnv.Manager - - customimagetests.TestControlPlaneGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - clusterconfig.MetaControlPlaneConfigName, - dockerclusterconfig.DockerVariableName, - customimage.VariableName, - ) - - customimagetests.TestWorkerGeneratePatches( - t, - workerPatchGeneratorFunc(), - workerconfig.MetaVariableName, - dockerworkerconfig.DockerVariableName, - customimage.VariableName, - ) - - auditpolicytests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - ) - - httpproxytests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - httpproxy.VariableName, - ) - - etcdtests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - etcd.VariableName, - ) - - extraapiservercertsanstests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - extraapiservercertsans.VariableName, - ) - - kubernetesimagerepositorytests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - kubernetesimagerepository.VariableName, - ) - - imageregistrycredentialstests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - mgr.GetClient(), - clusterconfig.MetaVariableName, - imageregistries.VariableName, - ) - - globalimageregistrymirrortests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - mgr.GetClient(), - clusterconfig.MetaVariableName, - mirrors.GlobalMirrorVariableName, - ) - - userstests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - clusterconfig.MetaVariableName, - users.VariableName, - ) - - containerdrestarttests.TestGeneratePatches( - t, - metaPatchGeneratorFunc(mgr), - ) -} diff --git a/pkg/handlers/generic/mutation/containerdrestart/tests/generate_patches.go b/pkg/handlers/generic/mutation/containerdrestart/inject_test.go similarity index 67% rename from pkg/handlers/generic/mutation/containerdrestart/tests/generate_patches.go rename to pkg/handlers/generic/mutation/containerdrestart/inject_test.go index 9ef570535..c654edc1d 100644 --- a/pkg/handlers/generic/mutation/containerdrestart/tests/generate_patches.go +++ b/pkg/handlers/generic/mutation/containerdrestart/inject_test.go @@ -1,30 +1,33 @@ // Copyright 2023 D2iQ, Inc. All rights reserved. // SPDX-License-Identifier: Apache-2.0 -package tests +package containerdrestart import ( "testing" + . "github.com/onsi/ginkgo/v2" "github.com/onsi/gomega" runtimehooksv1 "sigs.k8s.io/cluster-api/exp/runtime/hooks/api/v1alpha1" "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/capi/clustertopology/handlers/mutation" "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/testutils/capitest" "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/common/pkg/testutils/capitest/request" - "github.com/d2iq-labs/cluster-api-runtime-extensions-nutanix/pkg/handlers/generic/mutation/containerdrestart" ) -func TestGeneratePatches( - t *testing.T, - generatorFunc func() mutation.GeneratePatches, -) { - t.Helper() +func TestContainerdRestartPatch(t *testing.T) { + gomega.RegisterFailHandler(Fail) + RunSpecs(t, "Containerd restart mutator suite") +} + +var _ = Describe("Generate Containerd restart patches", func() { + // only add aws region patch + patchGenerator := func() mutation.GeneratePatches { + return mutation.NewMetaGeneratePatchesHandler("", NewPatch()).(mutation.GeneratePatches) + } - capitest.ValidateGeneratePatches( - t, - generatorFunc, - capitest.PatchTestDef{ + testDefs := []capitest.PatchTestDef{ + { Name: "restart script and command added to control plane kubeadm config spec", RequestItem: request.NewKubeadmControlPlaneTemplateRequestItem(""), ExpectedPatchMatchers: []capitest.JSONPatchMatcher{ @@ -33,7 +36,7 @@ func TestGeneratePatches( Path: "/spec/template/spec/kubeadmConfigSpec/files", ValueMatcher: gomega.ContainElements( gomega.HaveKeyWithValue( - "path", containerdrestart.ContainerdRestartScriptOnRemote, + "path", ContainerdRestartScriptOnRemote, ), ), }, @@ -41,12 +44,12 @@ func TestGeneratePatches( Operation: "add", Path: "/spec/template/spec/kubeadmConfigSpec/preKubeadmCommands", ValueMatcher: gomega.ContainElements( - containerdrestart.ContainerdRestartScriptOnRemoteCommand, + ContainerdRestartScriptOnRemoteCommand, ), }, }, }, - capitest.PatchTestDef{ + { Name: "restart script and command added to worker node kubeadm config template", Vars: []runtimehooksv1.Variable{ capitest.VariableWithValue( @@ -65,7 +68,7 @@ func TestGeneratePatches( Path: "/spec/template/spec/files", ValueMatcher: gomega.ContainElements( gomega.HaveKeyWithValue( - "path", containerdrestart.ContainerdRestartScriptOnRemote, + "path", ContainerdRestartScriptOnRemote, ), ), }, @@ -73,10 +76,22 @@ func TestGeneratePatches( Operation: "add", Path: "/spec/template/spec/preKubeadmCommands", ValueMatcher: gomega.ContainElements( - containerdrestart.ContainerdRestartScriptOnRemoteCommand, + ContainerdRestartScriptOnRemoteCommand, ), }, }, }, - ) -} + } + + // create test node for each case + for testIdx := range testDefs { + tt := testDefs[testIdx] + It(tt.Name, func() { + capitest.AssertGeneratePatches( + GinkgoT(), + patchGenerator, + &tt, + ) + }) + } +})