From f60cc565f76b0c748f57ab0532bd693b36e2a97a Mon Sep 17 00:00:00 2001 From: Dario Tranchitella Date: Tue, 4 Mar 2025 20:44:44 +0100 Subject: [PATCH 1/2] fix(datastore): pod template hashing for storage migration Signed-off-by: Dario Tranchitella --- internal/builders/controlplane/deployment.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/builders/controlplane/deployment.go b/internal/builders/controlplane/deployment.go index ca7bf893..e7f0b887 100644 --- a/internal/builders/controlplane/deployment.go +++ b/internal/builders/controlplane/deployment.go @@ -64,7 +64,7 @@ func (d Deployment) Build(ctx context.Context, deployment *appsv1.Deployment, te d.setLabels(deployment, utilities.MergeMaps(utilities.KamajiLabels(tenantControlPlane.GetName(), "deployment"), tenantControlPlane.Spec.ControlPlane.Deployment.AdditionalMetadata.Labels)) d.setAnnotations(deployment, utilities.MergeMaps(deployment.Annotations, tenantControlPlane.Spec.ControlPlane.Deployment.AdditionalMetadata.Annotations)) d.setTemplateLabels(&deployment.Spec.Template, utilities.MergeMaps(d.templateLabels(ctx, &tenantControlPlane), tenantControlPlane.Spec.ControlPlane.Deployment.PodAdditionalMetadata.Labels)) - d.setTemplateAnnotations(&deployment.Spec.Template, tenantControlPlane.Spec.ControlPlane.Deployment.PodAdditionalMetadata.Annotations) + d.setTemplateAnnotations(&deployment.Spec.Template, utilities.MergeMaps(tenantControlPlane.Spec.ControlPlane.Deployment.PodAdditionalMetadata.Annotations, map[string]string{"storage.kamaji.clastix.io/config": tenantControlPlane.Status.Storage.Config.Checksum})) d.setNodeSelector(&deployment.Spec.Template.Spec, tenantControlPlane) d.setToleration(&deployment.Spec.Template.Spec, tenantControlPlane) d.setAffinity(&deployment.Spec.Template.Spec, tenantControlPlane) From 5ad5afdba466704b004482d7b82009cd32a22b0d Mon Sep 17 00:00:00 2001 From: Dario Tranchitella Date: Tue, 4 Mar 2025 20:53:25 +0100 Subject: [PATCH 2/2] test: ensuring migration works for etcd and postgresql Signed-off-by: Dario Tranchitella --- .../kamaji_v1alpha1_tenantcontrolplane.yaml | 1 + e2e/tcp_migration_test.go | 27 +++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/config/samples/kamaji_v1alpha1_tenantcontrolplane.yaml b/config/samples/kamaji_v1alpha1_tenantcontrolplane.yaml index 9018c262..9fe2518f 100644 --- a/config/samples/kamaji_v1alpha1_tenantcontrolplane.yaml +++ b/config/samples/kamaji_v1alpha1_tenantcontrolplane.yaml @@ -5,6 +5,7 @@ metadata: labels: tenant.clastix.io: k8s-130 spec: + dataStore: postgresql-bronze controlPlane: deployment: replicas: 2 diff --git a/e2e/tcp_migration_test.go b/e2e/tcp_migration_test.go index db2df85a..e0fc4c67 100644 --- a/e2e/tcp_migration_test.go +++ b/e2e/tcp_migration_test.go @@ -22,18 +22,18 @@ import ( "github.com/clastix/kamaji/internal/utilities" ) -var _ = Describe("When migrating a Tenant Control Plane to another datastore", func() { +func featureTestMigration(driver string) { var tcp *kamajiv1alpha1.TenantControlPlane // Create a TenantControlPlane resource into the cluster JustBeforeEach(func() { // Fill TenantControlPlane object tcp = &kamajiv1alpha1.TenantControlPlane{ ObjectMeta: metav1.ObjectMeta{ - Name: fmt.Sprintf("migrating-%s-etcd", rand.String(5)), + Name: fmt.Sprintf("migrating-%s-%s", rand.String(5), driver), Namespace: "default", }, Spec: kamajiv1alpha1.TenantControlPlaneSpec{ - DataStore: "etcd-bronze", + DataStore: fmt.Sprintf("%s-bronze", driver), ControlPlane: kamajiv1alpha1.ControlPlane{ Deployment: kamajiv1alpha1.DeploymentSpec{ Replicas: pointer.To(int32(1)), @@ -91,7 +91,7 @@ var _ = Describe("When migrating a Tenant Control Plane to another datastore", f return err } - tcp.Spec.DataStore = "etcd-silver" + tcp.Spec.DataStore = fmt.Sprintf("%s-silver", driver) return k8sClient.Update(context.Background(), tcp) }, time.Minute, time.Second).ShouldNot(HaveOccurred()) @@ -114,11 +114,28 @@ var _ = Describe("When migrating a Tenant Control Plane to another datastore", f } return tcp.Status.Storage.DataStoreName - }, time.Minute, time.Second).Should(BeEquivalentTo("etcd-silver")) + }, time.Minute, time.Second).Should(BeEquivalentTo(fmt.Sprintf("%s-silver", driver))) By("checking the presence of the previous Namespace") Eventually(func() error { return tcpClient.Get(context.Background(), types.NamespacedName{Name: ns.GetName()}, &corev1.Namespace{}) }).ShouldNot(HaveOccurred()) + // The Freeze ValidatingWebhookConfiguration should have been removed successfully: + // we're checking write operations are allowed. + By("checking the changes are newly allowed") + Eventually(func() error { + var writeNamespace corev1.Namespace + writeNamespace.Name = fmt.Sprintf("write-%s-%s", rand.String(5), driver) + + return tcpClient.Create(context.Background(), &writeNamespace) + }).ShouldNot(HaveOccurred()) }) +} + +var _ = Describe("When migrating a Tenant Control Plane to another datastore (etcd)", func() { + featureTestMigration("etcd") +}) + +var _ = Describe("When migrating a Tenant Control Plane to another datastore (postgresql)", func() { + featureTestMigration("postgresql") })