From ea852eea164121d75b79c04d5984d578a5ba740c Mon Sep 17 00:00:00 2001 From: Artiom Diomin Date: Wed, 7 Aug 2024 18:01:31 +0300 Subject: [PATCH] unittests for MigrateV1beta2V1beta3 Signed-off-by: Artiom Diomin --- pkg/apis/kubeone/config/migrate.go | 4 +- pkg/apis/kubeone/config/migrate_test.go | 46 +++++++++++++++++++ ...2ToV1Beta3Migration-addons_and_helm.golden | 20 ++++++++ ...eta3Migration-addons_and_helm_v1beta2.yaml | 22 +++++++++ .../TestV1Beta2ToV1Beta3Migration-helm.golden | 17 +++++++ ...1Beta2ToV1Beta3Migration-helm_v1beta2.yaml | 16 +++++++ ...Beta2ToV1Beta3Migration-just_addons.golden | 9 ++++ ...oV1Beta3Migration-just_addons_v1beta2.yaml | 11 +++++ ...estV1Beta2ToV1Beta3Migration-simple.golden | 4 ++ ...eta2ToV1Beta3Migration-simple_v1beta2.yaml | 5 ++ pkg/testhelper/helper.go | 16 ++++++- 11 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 pkg/apis/kubeone/config/migrate_test.go create mode 100644 pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-addons_and_helm.golden create mode 100644 pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-addons_and_helm_v1beta2.yaml create mode 100644 pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-helm.golden create mode 100644 pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-helm_v1beta2.yaml create mode 100644 pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-just_addons.golden create mode 100644 pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-just_addons_v1beta2.yaml create mode 100644 pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-simple.golden create mode 100644 pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-simple_v1beta2.yaml diff --git a/pkg/apis/kubeone/config/migrate.go b/pkg/apis/kubeone/config/migrate.go index 8c18daaf8..860decbf6 100644 --- a/pkg/apis/kubeone/config/migrate.go +++ b/pkg/apis/kubeone/config/migrate.go @@ -76,7 +76,8 @@ func MigrateV1beta2V1beta3(clusterFilePath string) ([]byte, error) { { path: yamled.Path{"addons"}, convertor: func(p yamled.Path) { - if originalManifest.Has(p) { + // we moved helmReleases inside the addons + if originalManifest.Has(p) || originalManifest.Has(yamled.Path{"helmReleases"}) { ybuf, _ := kyaml.Marshal(newManifest.Addons) addons, _ := yamled.Load(bytes.NewBuffer(ybuf)) originalManifest.Set(p, addons) @@ -86,6 +87,7 @@ func MigrateV1beta2V1beta3(clusterFilePath string) ([]byte, error) { { path: yamled.Path{"addons"}, convertor: func(p yamled.Path) { + // cleanup addons from all the nil/zero/invalid values originalManifest.Walk(p, func(key yamled.Path, value any) { refval := reflect.ValueOf(value) diff --git a/pkg/apis/kubeone/config/migrate_test.go b/pkg/apis/kubeone/config/migrate_test.go new file mode 100644 index 000000000..cfe8ccb4c --- /dev/null +++ b/pkg/apis/kubeone/config/migrate_test.go @@ -0,0 +1,46 @@ +/* +Copyright 2020 The KubeOne Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package config + +import ( + "flag" + "testing" + + "k8c.io/kubeone/pkg/testhelper" +) + +var updateFlag = flag.Bool("update", false, "update testdata files") + +func TestV1Beta2ToV1Beta3Migration(t *testing.T) { + tests := []string{ + "simple", + "just addons", + "helm", + "addons and helm", + } + + for _, test := range tests { + t.Run(test, func(t *testing.T) { + got, err := MigrateV1beta2V1beta3(testhelper.TestDataFSName(t, "_v1beta2.yaml")) + if err != nil { + t.Fatalf("%s", err) + } + + testhelper.DiffOutput(t, testhelper.FSGoldenName(t), string(got), *updateFlag) + }) + } +} diff --git a/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-addons_and_helm.golden b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-addons_and_helm.golden new file mode 100644 index 000000000..dfd495cf5 --- /dev/null +++ b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-addons_and_helm.golden @@ -0,0 +1,20 @@ +apiVersion: kubeone.k8c.io/v1beta3 +kind: KubeOneCluster +versions: + kubernetes: 1.30.1 +addons: + addons: + - addon: + name: name1 + - helmRelease: + chart: kube-state-metrics + namespace: kube-state-metrics + releaseName: ksm + repoURL: https://prometheus-community.github.io/helm-charts + timeout: 0s + values: + - valuesFile: ksm-values.yaml + - inline: + replicas: 3 + version: 4.22.3 + path: something diff --git a/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-addons_and_helm_v1beta2.yaml b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-addons_and_helm_v1beta2.yaml new file mode 100644 index 000000000..720512dab --- /dev/null +++ b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-addons_and_helm_v1beta2.yaml @@ -0,0 +1,22 @@ +apiVersion: kubeone.k8c.io/v1beta2 +kind: KubeOneCluster + +versions: + kubernetes: 1.30.1 + +addons: + path: "something" + + addons: + - name: "name1" + +helmReleases: + - releaseName: ksm + chart: kube-state-metrics + repoURL: https://prometheus-community.github.io/helm-charts + namespace: kube-state-metrics + version: 4.22.3 + values: + - valuesFile: ksm-values.yaml + - inline: + replicas: 3 diff --git a/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-helm.golden b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-helm.golden new file mode 100644 index 000000000..528136be6 --- /dev/null +++ b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-helm.golden @@ -0,0 +1,17 @@ +apiVersion: kubeone.k8c.io/v1beta3 +kind: KubeOneCluster +versions: + kubernetes: 1.30.1 +addons: + addons: + - helmRelease: + chart: kube-state-metrics + namespace: kube-state-metrics + releaseName: ksm + repoURL: https://prometheus-community.github.io/helm-charts + timeout: 0s + values: + - valuesFile: ksm-values.yaml + - inline: + replicas: 3 + version: 4.22.3 diff --git a/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-helm_v1beta2.yaml b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-helm_v1beta2.yaml new file mode 100644 index 000000000..93af87246 --- /dev/null +++ b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-helm_v1beta2.yaml @@ -0,0 +1,16 @@ +apiVersion: kubeone.k8c.io/v1beta2 +kind: KubeOneCluster + +versions: + kubernetes: 1.30.1 + +helmReleases: + - releaseName: ksm + chart: kube-state-metrics + repoURL: https://prometheus-community.github.io/helm-charts + namespace: kube-state-metrics + version: 4.22.3 + values: + - valuesFile: ksm-values.yaml + - inline: + replicas: 3 diff --git a/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-just_addons.golden b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-just_addons.golden new file mode 100644 index 000000000..665397181 --- /dev/null +++ b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-just_addons.golden @@ -0,0 +1,9 @@ +apiVersion: kubeone.k8c.io/v1beta3 +kind: KubeOneCluster +versions: + kubernetes: 1.30.1 +addons: + addons: + - addon: + name: name1 + path: something diff --git a/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-just_addons_v1beta2.yaml b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-just_addons_v1beta2.yaml new file mode 100644 index 000000000..3385d27f4 --- /dev/null +++ b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-just_addons_v1beta2.yaml @@ -0,0 +1,11 @@ +apiVersion: kubeone.k8c.io/v1beta2 +kind: KubeOneCluster + +versions: + kubernetes: 1.30.1 + +addons: + path: "something" + + addons: + - name: "name1" diff --git a/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-simple.golden b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-simple.golden new file mode 100644 index 000000000..5eede3402 --- /dev/null +++ b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-simple.golden @@ -0,0 +1,4 @@ +apiVersion: kubeone.k8c.io/v1beta3 +kind: KubeOneCluster +versions: + kubernetes: 1.30.1 diff --git a/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-simple_v1beta2.yaml b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-simple_v1beta2.yaml new file mode 100644 index 000000000..b03af859c --- /dev/null +++ b/pkg/apis/kubeone/config/testdata/TestV1Beta2ToV1Beta3Migration-simple_v1beta2.yaml @@ -0,0 +1,5 @@ +apiVersion: kubeone.k8c.io/v1beta2 +kind: KubeOneCluster + +versions: + kubernetes: 1.30.1 diff --git a/pkg/testhelper/helper.go b/pkg/testhelper/helper.go index 43e28a839..61b08846a 100644 --- a/pkg/testhelper/helper.go +++ b/pkg/testhelper/helper.go @@ -26,10 +26,22 @@ import ( "github.com/pmezard/go-difflib/difflib" ) +func fsName(t *testing.T, ext ...string) string { + t.Helper() + + return strings.Join(append([]string{strings.ReplaceAll(t.Name(), "/", "-")}, ext...), "") +} + func FSGoldenName(t *testing.T) string { t.Helper() - return strings.ReplaceAll(t.Name(), "/", "-") + ".golden" + return fsName(t, ".golden") +} + +func TestDataFSName(t *testing.T, ext ...string) string { + t.Helper() + + return filepath.Join([]string{"testdata", fsName(t, ext...)}...) } func DiffOutput(t *testing.T, name, output string, update bool) { @@ -40,7 +52,7 @@ func DiffOutput(t *testing.T, name, output string, update bool) { } if update { - if errw := os.WriteFile(golden, []byte(output), 0600); errw != nil { + if errw := os.WriteFile(golden, []byte(output), 0o600); errw != nil { t.Fatalf("failed to write updated fixture: %v", errw) } }