package cluster import ( "bytes" "context" "os" "path/filepath" "testing" "time" "github.com/k3s-io/k3s/pkg/bootstrap" "github.com/k3s-io/k3s/pkg/clientaccess" "github.com/k3s-io/k3s/pkg/cluster/managed" "github.com/k3s-io/k3s/pkg/daemons/config" ) func Test_isDirEmpty(t *testing.T) { const tmpDir = "test_dir" type args struct { name string } tests := []struct { name string args args setup func() error teardown func() error want bool wantErr bool }{ { name: "is empty", args: args{ name: tmpDir, }, setup: func() error { return os.Mkdir(tmpDir, 0700) }, teardown: func() error { return os.RemoveAll(tmpDir) }, want: true, wantErr: false, }, { name: "is not empty", args: args{ name: tmpDir, }, setup: func() error { os.Mkdir(tmpDir, 0700) _, _ = os.Create(filepath.Join(filepath.Dir(tmpDir), tmpDir, "test_file")) return nil }, teardown: func() error { return os.RemoveAll(tmpDir) }, want: false, wantErr: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { defer tt.teardown() if err := tt.setup(); err != nil { t.Errorf("Setup for isDirEmpty() failed = %v", err) return } got, err := isDirEmpty(tt.args.name) if (err != nil) != tt.wantErr { t.Errorf("isDirEmpty() error = %v, wantErr %v", err, tt.wantErr) return } if got != tt.want { t.Errorf("isDirEmpty() = %+v\nWant = %+v", got, tt.want) } }) } } func TestCluster_certDirsExist(t *testing.T) { const testDataDir = "/tmp/k3s/" testCredDir := filepath.Join(testDataDir, "server", "cred") testTLSDir := filepath.Join(testDataDir, "server", "tls") testTLSEtcdDir := filepath.Join(testDataDir, "server", "tls", "etcd") type fields struct { clientAccessInfo *clientaccess.Info config *config.Control managedDB managed.Driver shouldBootstrap bool storageStarted bool saveBootstrap bool } tests := []struct { name string fields fields setup func() error teardown func() error wantErr bool }{ { name: "exists", fields: fields{ config: &config.Control{ DataDir: filepath.Join(testDataDir, "server"), }, }, setup: func() error { os.MkdirAll(testCredDir, 0700) os.MkdirAll(testTLSEtcdDir, 0700) _, _ = os.Create(filepath.Join(testCredDir, "test_file")) _, _ = os.Create(filepath.Join(testTLSDir, "test_file")) _, _ = os.Create(filepath.Join(testTLSEtcdDir, "test_file")) return nil }, teardown: func() error { return os.RemoveAll(testDataDir) }, wantErr: false, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { c := &Cluster{ clientAccessInfo: tt.fields.clientAccessInfo, config: tt.fields.config, managedDB: tt.fields.managedDB, storageStarted: tt.fields.storageStarted, saveBootstrap: tt.fields.saveBootstrap, } defer tt.teardown() if err := tt.setup(); err != nil { t.Errorf("Setup for Cluster.certDirsExist() failed = %v", err) return } if err := c.certDirsExist(); (err != nil) != tt.wantErr { t.Errorf("Cluster.certDirsExist() error = %v, wantErr %v", err, tt.wantErr) } }) } } func TestCluster_migrateBootstrapData(t *testing.T) { type fields struct { clientAccessInfo *clientaccess.Info config *config.Control managedDB managed.Driver joining bool storageStarted bool saveBootstrap bool shouldBootstrap bool } type args struct { ctx context.Context data *bytes.Buffer files bootstrap.PathsDataformat } tests := []struct { name string args args setup func() error // Optional, delete if unused teardown func() error // Optional, delete if unused wantErr bool }{ { name: "Success", args: args{ ctx: context.Background(), data: bytes.NewBuffer([]byte(`{"ServerCA": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ3ZEQ0NBYVFDQVFBd2R6RUxNQWtHQTFVRUJoTUNWVk14RFRBTEJnTlZCQWdNQkZWMFlXZ3hEekFOQmdOVgpCQWNNQmt4cGJtUnZiakVXTUJRR0ExVUVDZ3dOUkdsbmFVTmxjblFnU1c1akxqRVJNQThHQTFVRUN3d0lSR2xuCmFVTmxjblF4SFRBYkJnTlZCQU1NRkdWNFlXMXdiR1V1WkdsbmFXTmxjblF1WTI5dE1JSUJJakFOQmdrcWhraUcKOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTgrVG83ZCsya1BXZUJ2L29yVTNMVmJKd0RyU1FiZUthbUNtbwp3cDVicUR4SXdWMjB6cVJiN0FQVU9LWW9WRUZGT0VRczZUNmdJbW5Jb2xoYmlINm00emdaL0NQdldCT2taYytjCjFQbzJFbXZCeitBRDVzQmRUNWt6R1FBNk5iV3laR2xkeFJ0aE5MT3MxZWZPaGRuV0Z1aEkxNjJxbWNmbGdwaUkKV0R1d3E0QzlmK1lrZUpoTm45ZEY1K293bThjT1FtRHJWOE5OZGlUcWluOHEzcVlBSEhKUlcyOGdsSlVDWmtUWgp3SWFTUjZjckJROFRiWU5FMGRjK0NhYTNET0lrejFFT3NIV3pUeCtuMHpLZnFjYmdYaTRESngrQzFianB0WVBSCkJQWkw4REFlV3VBOGVidWRWVDQ0eUVwODJHOTYvR2djZjdGMzN4TXhlMHljK1hhNm93SURBUUFCb0FBd0RRWUoKS29aSWh2Y05BUUVGQlFBRGdnRUJBQjBrY3JGY2NTbUZEbXhveDBOZTAxVUlxU3NEcUhnTCtYbUhUWEp3cmU2RApoSlNad2J2RXRPSzBHMytkcjRGczExV3VVTnQ1cWNMc3g1YTh1azRHNkFLSE16dWhMc0o3WFpqZ21RWEdFQ3BZClE0bUMzeVQzWm9DR3BJWGJ3K2lQM2xtRUVYZ2FRTDBUeDVMRmwvb2tLYktZd0lxTml5S1dPTWo3WlIvd3hXZy8KWkRHUnM1NXh1b2VMREovWlJGZjliSStJYUNVZDFZcmZZY0hJbDNHODdBdityNDlZVndxUkRUMFZEVjd1TGdxbgoyOVhJMVBwVlVOQ1BRR245cC9lWDZRbzd2cERhUHliUnRBMlI3WExLalFhRjlvWFdlQ1VxeTFodkphYzlRRk8yCjk3T2IxYWxwSFBvWjdtV2lFdUp3akJQaWk2YTlNOUczMG5VbzM5bEJpMXc9Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQ=="}`)), files: make(bootstrap.PathsDataformat), }, wantErr: false, }, { name: "Invalid Old Format", args: args{ ctx: context.Background(), data: &bytes.Buffer{}, files: bootstrap.PathsDataformat{ "ServerCA": bootstrap.File{ Timestamp: time.Now(), }, }, }, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if err := migrateBootstrapData(tt.args.ctx, tt.args.data, tt.args.files); (err != nil) != tt.wantErr { t.Errorf("Cluster.migrateBootstrapData() error = %v, wantErr %v", err, tt.wantErr) } }) } } func TestCluster_Snapshot(t *testing.T) { type fields struct { clientAccessInfo *clientaccess.Info config *config.Control managedDB managed.Driver joining bool storageStarted bool saveBootstrap bool shouldBootstrap bool } type args struct { ctx context.Context config *config.Control } tests := []struct { name string fields fields args args wantErr bool }{ { name: "Fail on non etcd cluster", fields: fields{}, args: args{ ctx: context.Background(), }, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { c := &Cluster{ clientAccessInfo: tt.fields.clientAccessInfo, config: tt.fields.config, managedDB: tt.fields.managedDB, joining: tt.fields.joining, storageStarted: tt.fields.storageStarted, saveBootstrap: tt.fields.saveBootstrap, shouldBootstrap: tt.fields.shouldBootstrap, } if err := c.Snapshot(tt.args.ctx, tt.args.config); (err != nil) != tt.wantErr { t.Errorf("Cluster.Snapshot() error = %v, wantErr %v", err, tt.wantErr) } }) } }