From a4fe397ebda3dc2f4bb0b23db379e080e0c35d01 Mon Sep 17 00:00:00 2001 From: "xin.li" Date: Sun, 10 Mar 2024 17:26:58 +0800 Subject: [PATCH] kubeadm: increase ut converage for config/upgradeconfiguration Signed-off-by: xin.li --- .../util/config/upgradeconfiguration_test.go | 244 ++++++++++++++++++ 1 file changed, 244 insertions(+) diff --git a/cmd/kubeadm/app/util/config/upgradeconfiguration_test.go b/cmd/kubeadm/app/util/config/upgradeconfiguration_test.go index 0aa0744a6c0..cf585640a92 100644 --- a/cmd/kubeadm/app/util/config/upgradeconfiguration_test.go +++ b/cmd/kubeadm/app/util/config/upgradeconfiguration_test.go @@ -17,10 +17,13 @@ limitations under the License. package config import ( + "os" + "path/filepath" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" + "github.com/lithammer/dedent" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/utils/ptr" @@ -104,3 +107,244 @@ func TestDocMapToUpgradeConfiguration(t *testing.T) { }) } } + +func TestLoadUpgradeConfigurationFromFile(t *testing.T) { + tmpdir, err := os.MkdirTemp("", "") + if err != nil { + t.Fatalf("Couldn't create tmpdir: %v", err) + } + defer func() { + if err := os.RemoveAll(tmpdir); err != nil { + t.Fatalf("Couldn't remove tmpdir: %v", err) + } + }() + filename := "kubeadmConfig" + filePath := filepath.Join(tmpdir, filename) + options := LoadOrDefaultConfigurationOptions{} + + tests := []struct { + name string + cfgPath string + fileContents string + want *kubeadmapi.UpgradeConfiguration + wantErr bool + }{ + { + name: "Config file does not exists", + cfgPath: "tmp", + want: nil, + wantErr: true, + }, + { + name: "Config file format is basic text", + cfgPath: filePath, + want: nil, + fileContents: "some-text", + wantErr: true, + }, + { + name: "Unknown kind UpgradeConfiguration for kubeadm.k8s.io/unknown", + cfgPath: filePath, + fileContents: dedent.Dedent(` + apiVersion: kubeadm.k8s.io/unknown + kind: UpgradeConfiguration + `), + want: nil, + wantErr: true, + }, + { + name: "Valid kubeadm config", + cfgPath: filePath, + fileContents: dedent.Dedent(` + apiVersion: kubeadm.k8s.io/v1beta4 + kind: UpgradeConfiguration`), + want: &kubeadmapi.UpgradeConfiguration{ + Apply: kubeadmapi.UpgradeApplyConfiguration{ + CertificateRenewal: ptr.To(true), + EtcdUpgrade: ptr.To(true), + }, + Node: kubeadmapi.UpgradeNodeConfiguration{ + CertificateRenewal: ptr.To(true), + EtcdUpgrade: ptr.To(true), + }, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.cfgPath == filePath { + err = os.WriteFile(tt.cfgPath, []byte(tt.fileContents), 0644) + if err != nil { + t.Fatalf("Couldn't write content to file: %v", err) + } + defer func() { + if err := os.RemoveAll(filePath); err != nil { + t.Fatalf("Couldn't remove filePath: %v", err) + } + }() + } + + got, err := LoadUpgradeConfigurationFromFile(tt.cfgPath, options) + if (err != nil) != tt.wantErr { + t.Errorf("LoadUpgradeConfigurationFromFile() error = %v, wantErr %v", err, tt.wantErr) + } + if tt.want == nil && got != tt.want { + t.Errorf("LoadUpgradeConfigurationFromFile() got = %v, want %v", got, tt.want) + } else if tt.want != nil { + if diff := cmp.Diff(got, tt.want, cmpopts.IgnoreFields(kubeadmapi.UpgradeConfiguration{}, "Timeouts")); diff != "" { + t.Errorf("LoadUpgradeConfigurationFromFile returned unexpected diff (-want,+got):\n%s", diff) + } + } + }) + } +} + +func TestDefaultedUpgradeConfiguration(t *testing.T) { + options := LoadOrDefaultConfigurationOptions{} + tests := []struct { + name string + cfg *kubeadmapiv1.UpgradeConfiguration + want *kubeadmapi.UpgradeConfiguration + }{ + { + name: "config is empty", + cfg: &kubeadmapiv1.UpgradeConfiguration{}, + want: &kubeadmapi.UpgradeConfiguration{ + Apply: kubeadmapi.UpgradeApplyConfiguration{ + CertificateRenewal: ptr.To(true), + EtcdUpgrade: ptr.To(true), + }, + Node: kubeadmapi.UpgradeNodeConfiguration{ + CertificateRenewal: ptr.To(true), + EtcdUpgrade: ptr.To(true), + }, + }, + }, + { + name: "config has some fields configured", + cfg: &kubeadmapiv1.UpgradeConfiguration{ + Apply: kubeadmapiv1.UpgradeApplyConfiguration{ + CertificateRenewal: ptr.To(false), + }, + Node: kubeadmapiv1.UpgradeNodeConfiguration{ + EtcdUpgrade: ptr.To(false), + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: kubeadmapiv1.SchemeGroupVersion.String(), + Kind: constants.UpgradeConfigurationKind, + }, + }, + want: &kubeadmapi.UpgradeConfiguration{ + Apply: kubeadmapi.UpgradeApplyConfiguration{ + CertificateRenewal: ptr.To(false), + EtcdUpgrade: ptr.To(true), + }, + Node: kubeadmapi.UpgradeNodeConfiguration{ + CertificateRenewal: ptr.To(true), + EtcdUpgrade: ptr.To(false), + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, _ := DefaultedUpgradeConfiguration(tt.cfg, options) + if diff := cmp.Diff(got, tt.want, cmpopts.IgnoreFields(kubeadmapi.UpgradeConfiguration{}, "Timeouts")); diff != "" { + t.Errorf("DefaultedUpgradeConfiguration returned unexpected diff (-want,+got):\n%s", diff) + } + }) + } +} + +func TestLoadOrDefaultUpgradeConfiguration(t *testing.T) { + tmpdir, err := os.MkdirTemp("", "") + if err != nil { + t.Fatalf("Couldn't create tmpdir: %v", err) + } + defer func() { + if err := os.RemoveAll(tmpdir); err != nil { + t.Fatalf("Couldn't remove tmpdir: %v", err) + } + }() + filename := "kubeadmConfig" + filePath := filepath.Join(tmpdir, filename) + fileContents := dedent.Dedent(` + apiVersion: kubeadm.k8s.io/v1beta4 + kind: UpgradeConfiguration + `) + err = os.WriteFile(filePath, []byte(fileContents), 0644) + if err != nil { + t.Fatalf("Couldn't write content to file: %v", err) + } + + options := LoadOrDefaultConfigurationOptions{} + + tests := []struct { + name string + cfgPath string + cfg *kubeadmapiv1.UpgradeConfiguration + want *kubeadmapi.UpgradeConfiguration + }{ + { + name: "cfgpPath is empty, the result should be obtained from cfg", + cfgPath: "", + cfg: &kubeadmapiv1.UpgradeConfiguration{ + Apply: kubeadmapiv1.UpgradeApplyConfiguration{ + CertificateRenewal: ptr.To(false), + }, + Node: kubeadmapiv1.UpgradeNodeConfiguration{ + EtcdUpgrade: ptr.To(false), + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: kubeadmapiv1.SchemeGroupVersion.String(), + Kind: constants.UpgradeConfigurationKind, + }, + }, + want: &kubeadmapi.UpgradeConfiguration{ + Apply: kubeadmapi.UpgradeApplyConfiguration{ + CertificateRenewal: ptr.To(false), + EtcdUpgrade: ptr.To(true), + }, + Node: kubeadmapi.UpgradeNodeConfiguration{ + CertificateRenewal: ptr.To(true), + EtcdUpgrade: ptr.To(false), + }, + }, + }, + { + name: "cfgpPath is not empty, the result should be obtained from the configuration file", + cfgPath: filePath, + cfg: &kubeadmapiv1.UpgradeConfiguration{ + Apply: kubeadmapiv1.UpgradeApplyConfiguration{ + CertificateRenewal: ptr.To(false), + }, + Node: kubeadmapiv1.UpgradeNodeConfiguration{ + EtcdUpgrade: ptr.To(false), + }, + TypeMeta: metav1.TypeMeta{ + APIVersion: kubeadmapiv1.SchemeGroupVersion.String(), + Kind: constants.UpgradeConfigurationKind, + }, + }, + want: &kubeadmapi.UpgradeConfiguration{ + Apply: kubeadmapi.UpgradeApplyConfiguration{ + CertificateRenewal: ptr.To(true), + EtcdUpgrade: ptr.To(true), + }, + Node: kubeadmapi.UpgradeNodeConfiguration{ + CertificateRenewal: ptr.To(true), + EtcdUpgrade: ptr.To(true), + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, _ := LoadOrDefaultUpgradeConfiguration(tt.cfgPath, tt.cfg, options) + if diff := cmp.Diff(got, tt.want, cmpopts.IgnoreFields(kubeadmapi.UpgradeConfiguration{}, "Timeouts")); diff != "" { + t.Errorf("LoadOrDefaultUpgradeConfiguration returned unexpected diff (-want,+got):\n%s", diff) + } + }) + } +}