diff --git a/pkg/agent/flannel/setup.go b/pkg/agent/flannel/setup.go index df158be8ebcf..4dc14931634a 100644 --- a/pkg/agent/flannel/setup.go +++ b/pkg/agent/flannel/setup.go @@ -161,7 +161,7 @@ func createCNIConf(dir string, nodeConfig *config.Node) error { if nodeConfig.AgentConfig.FlannelCniConfFile != "" { logrus.Debugf("Using %s as the flannel CNI conf", nodeConfig.AgentConfig.FlannelCniConfFile) - return util.CopyFile(nodeConfig.AgentConfig.FlannelCniConfFile, p) + return util.CopyFile(nodeConfig.AgentConfig.FlannelCniConfFile, p, false) } return util.WriteFile(p, cniConf) } diff --git a/pkg/agent/util/file.go b/pkg/agent/util/file.go index ae4633e7a09f..2420acc8f4bc 100644 --- a/pkg/agent/util/file.go +++ b/pkg/agent/util/file.go @@ -16,10 +16,12 @@ func WriteFile(name string, content string) error { return nil } -func CopyFile(sourceFile string, destinationFile string) error { +func CopyFile(sourceFile string, destinationFile string, ignoreNotExist bool) error { os.MkdirAll(filepath.Dir(destinationFile), 0755) input, err := os.ReadFile(sourceFile) - if err != nil { + if errors.Is(err, os.ErrNotExist) && ignoreNotExist { + return nil + } else if err != nil { return errors.Wrapf(err, "copying %s to %s", sourceFile, destinationFile) } err = os.WriteFile(destinationFile, input, 0644) diff --git a/pkg/cli/cert/cert.go b/pkg/cli/cert/cert.go index ebe36fc4417d..ed9999fe7c2b 100644 --- a/pkg/cli/cert/cert.go +++ b/pkg/cli/cert/cert.go @@ -9,6 +9,7 @@ import ( "time" "github.com/erikdubbelboer/gspt" + "github.com/k3s-io/k3s/pkg/agent/util" "github.com/k3s-io/k3s/pkg/bootstrap" "github.com/k3s-io/k3s/pkg/cli/cmds" "github.com/k3s-io/k3s/pkg/clientaccess" @@ -210,20 +211,6 @@ func rotate(app *cli.Context, cfg *cmds.Server) error { return nil } -func copyFile(src, destDir string) error { - _, err := os.Stat(src) - if err == nil { - input, err := os.ReadFile(src) - if err != nil { - return err - } - return os.WriteFile(filepath.Join(destDir, filepath.Base(src)), input, 0644) - } else if errors.Is(err, os.ErrNotExist) { - return nil - } - return err -} - func backupCertificates(serverDataDir, agentDataDir string) (string, error) { serverTLSDir := filepath.Join(serverDataDir, "tls") tlsBackupDir := filepath.Join(serverDataDir, "tls-"+strconv.Itoa(int(time.Now().Unix()))) @@ -234,18 +221,20 @@ func backupCertificates(serverDataDir, agentDataDir string) (string, error) { if err := copy.Copy(serverTLSDir, tlsBackupDir); err != nil { return "", err } - agentCerts := []string{ - filepath.Join(agentDataDir, "client-"+version.Program+"-controller.crt"), - filepath.Join(agentDataDir, "client-"+version.Program+"-controller.key"), - filepath.Join(agentDataDir, "client-kubelet.crt"), - filepath.Join(agentDataDir, "client-kubelet.key"), - filepath.Join(agentDataDir, "serving-kubelet.crt"), - filepath.Join(agentDataDir, "serving-kubelet.key"), - filepath.Join(agentDataDir, "client-kube-proxy.crt"), - filepath.Join(agentDataDir, "client-kube-proxy.key"), + certs := []string{ + "client-" + version.Program + "-controller.crt", + "client-" + version.Program + "-controller.key", + "client-kubelet.crt", + "client-kubelet.key", + "serving-kubelet.crt", + "serving-kubelet.key", + "client-kube-proxy.crt", + "client-kube-proxy.key", } - for _, cert := range agentCerts { - if err := copyFile(cert, tlsBackupDir); err != nil { + for _, cert := range certs { + agentCert := filepath.Join(agentDataDir, cert) + tlsBackupCert := filepath.Join(tlsBackupDir, cert) + if err := util.CopyFile(agentCert, tlsBackupCert, true); err != nil { return "", err } } diff --git a/pkg/configfilearg/defaultparser_test.go b/pkg/configfilearg/defaultparser_test.go index b7c09308efaf..8ae8decc26fa 100644 --- a/pkg/configfilearg/defaultparser_test.go +++ b/pkg/configfilearg/defaultparser_test.go @@ -1,6 +1,7 @@ package configfilearg import ( + "os" "reflect" "testing" ) @@ -72,3 +73,57 @@ func Test_UnitMustParse(t *testing.T) { }) } } + +func Test_UnitMustFindString(t *testing.T) { + tests := []struct { + name string + args []string + target string + setup func() error // Optional, delete if unused + teardown func() error // Optional, delete if unused + want string + }{ + { + name: "Target not found in config file", + args: []string{"--foo", "bar"}, + target: "token", + + want: "", + + setup: func() error { return os.Setenv("K3S_CONFIG_FILE", "./testdata/data.yaml") }, + teardown: func() error { return os.Unsetenv("K3S_CONFIG_FILE") }, + }, + { + name: "Target found in config file", + args: []string{"--foo", "bar"}, + target: "token", + + want: "12345", + + setup: func() error { return os.Setenv("K3S_CONFIG_FILE", "./testdata/defaultdata.yaml") }, + teardown: func() error { return os.Unsetenv("K3S_CONFIG_FILE") }, + }, + { + name: "Override flag found, function is short-circuited", + args: []string{"--foo", "bar", "-h"}, + target: "token", + + want: "-h", + + setup: func() error { return os.Setenv("K3S_CONFIG_FILE", "./testdata/defaultdata.yaml") }, + teardown: func() error { return os.Unsetenv("K3S_CONFIG_FILE") }, + }, + } + 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 MustFindString() failed = %v", err) + return + } + if got := MustFindString(tt.args, tt.target); got != tt.want { + t.Errorf("MustFindString() = %+v\nWant = %+v", got, tt.want) + } + }) + } +} diff --git a/tests/e2e/dualstack/Vagrantfile b/tests/e2e/dualstack/Vagrantfile index b81b06c263c3..b87c73b440d0 100644 --- a/tests/e2e/dualstack/Vagrantfile +++ b/tests/e2e/dualstack/Vagrantfile @@ -11,9 +11,9 @@ NETWORK4_PREFIX = "10.10.10" NETWORK6_PREFIX = "fd11:decf:c0ff:ee" install_type = "" -def provision(vm, roles, role_num, node_num) +def provision(vm, role, role_num, node_num) vm.box = NODE_BOXES[node_num] - vm.hostname = "#{roles[0]}-#{role_num}" + vm.hostname = role node_ip4 = "#{NETWORK4_PREFIX}.#{100+node_num}" node_ip6 = "#{NETWORK6_PREFIX}::#{10+node_num}" node_ip6_gw = "#{NETWORK6_PREFIX}::1" @@ -36,7 +36,7 @@ def provision(vm, roles, role_num, node_num) vm.provision "Ping Check", type: "shell", inline: "ping -c 2 k3s.io" - if roles.include?("server") && role_num == 0 + if role.include?("server") && role_num == 0 vm.provision :k3s, run: 'once' do |k3s| k3s.config_mode = '0644' # side-step https://github.com/k3s-io/k3s/issues/4321 k3s.args = "server " @@ -53,7 +53,7 @@ def provision(vm, roles, role_num, node_num) YAML k3s.env = ["K3S_KUBECONFIG_MODE=0644", install_type] end - elsif roles.include?("server") && role_num != 0 + elsif role.include?("server") && role_num != 0 vm.provision :k3s, run: 'once' do |k3s| k3s.config_mode = '0644' # side-step https://github.com/k3s-io/k3s/issues/4321 k3s.args = "server " @@ -70,7 +70,7 @@ def provision(vm, roles, role_num, node_num) k3s.env = ["K3S_KUBECONFIG_MODE=0644", install_type] end end - if roles.include?("agent") + if role.include?("agent") vm.provision :k3s, run: 'once' do |k3s| k3s.config_mode = '0644' # side-step https://github.com/k3s-io/k3s/issues/4321 k3s.args = "agent " @@ -105,10 +105,9 @@ Vagrant.configure("2") do |config| # over the node roles themselves NODE_ROLES.length.times do |i| name = NODE_ROLES[i] + role_num = name.split("-", -1).pop.to_i config.vm.define name do |node| - roles = name.split("-", -1) - role_num = roles.pop.to_i - provision(node.vm, roles, role_num, i) + provision(node.vm, name, role_num, i) end end end diff --git a/tests/e2e/externalip/Vagrantfile b/tests/e2e/externalip/Vagrantfile index 7c2e5d64994a..c519615506fe 100644 --- a/tests/e2e/externalip/Vagrantfile +++ b/tests/e2e/externalip/Vagrantfile @@ -11,9 +11,9 @@ NETWORK4_PREFIX = "10.10.10" PUBLIC_NETWORK4_PREFIX = "10.100.100" install_type = "" -def provision(vm, roles, role_num, node_num) +def provision(vm, role, role_num, node_num) vm.box = NODE_BOXES[node_num] - vm.hostname = "#{roles[0]}-#{role_num}" + vm.hostname = role node_ip4 = "#{NETWORK4_PREFIX}.#{100+node_num}" node_ip4_public = "#{PUBLIC_NETWORK4_PREFIX}.#{100+node_num}" vm.network "private_network", :ip => node_ip4, :netmask => "255.255.255.0" @@ -27,7 +27,7 @@ def provision(vm, roles, role_num, node_num) install_type = getInstallType(vm, RELEASE_VERSION, GITHUB_BRANCH) - if roles.include?("server") && role_num == 0 + if role.include?("server") && role_num == 0 vm.provision :k3s, run: 'once' do |k3s| k3s.config_mode = '0644' # side-step https://github.com/k3s-io/k3s/issues/4321 k3s.args = "server " @@ -41,7 +41,7 @@ def provision(vm, roles, role_num, node_num) k3s.env = ["K3S_KUBECONFIG_MODE=0644", install_type] end end - if roles.include?("agent") + if role.include?("agent") vm.provision :k3s, run: 'once' do |k3s| k3s.config_mode = '0644' # side-step https://github.com/k3s-io/k3s/issues/4321 k3s.args = "agent " @@ -77,10 +77,9 @@ Vagrant.configure("2") do |config| # over the node roles themselves NODE_ROLES.length.times do |i| name = NODE_ROLES[i] + role_num = name.split("-", -1).pop.to_i config.vm.define name do |node| - roles = name.split("-", -1) - role_num = roles.pop.to_i - provision(node.vm, roles, role_num, i) + provision(node.vm, name, role_num, i) end end end diff --git a/tests/e2e/snapshotrestore/Vagrantfile b/tests/e2e/snapshotrestore/Vagrantfile index 99301ead320a..6f802d250a1b 100644 --- a/tests/e2e/snapshotrestore/Vagrantfile +++ b/tests/e2e/snapshotrestore/Vagrantfile @@ -5,7 +5,6 @@ NODE_BOXES = (ENV['E2E_NODE_BOXES'] || ['generic/ubuntu2004', 'generic/ubuntu2004', 'generic/ubuntu2004', 'generic/ubuntu2004', 'generic/ubuntu2004']) GITHUB_BRANCH = (ENV['E2E_GITHUB_BRANCH'] || "master") RELEASE_VERSION = (ENV['E2E_RELEASE_VERSION'] || "") -EXTERNAL_DB = (ENV['E2E_EXTERNAL_DB'] || "etcd") NODE_CPUS = (ENV['E2E_NODE_CPUS'] || 2).to_i NODE_MEMORY = (ENV['E2E_NODE_MEMORY'] || 1024).to_i # Virtualbox >= 6.1.28 require `/etc/vbox/network.conf` for expanded private networks @@ -35,10 +34,10 @@ def provision(vm, role, role_num, node_num) k3s.args = "server " k3s.config = <<~YAML token: vagrant + cluster-init: true node-external-ip: #{NETWORK_PREFIX}.100 flannel-iface: eth1 tls-san: #{NETWORK_PREFIX}.100.nip.io - #{db_type} YAML k3s.env = %W[K3S_KUBECONFIG_MODE=0644 #{install_type}] k3s.config_mode = '0644' # side-step https://github.com/k3s-io/k3s/issues/4321 @@ -52,7 +51,6 @@ def provision(vm, role, role_num, node_num) token: vagrant node-external-ip: #{node_ip} flannel-iface: eth1 - #{db_type} YAML k3s.env = %W[K3S_KUBECONFIG_MODE=0644 K3S_TOKEN=vagrant #{install_type}] k3s.config_mode = '0644' # side-step https://github.com/k3s-io/k3s/issues/4321 @@ -67,7 +65,6 @@ def provision(vm, role, role_num, node_num) token: vagrant node-external-ip: #{node_ip} flannel-iface: eth1 - #{db_type} YAML k3s.env = %W[K3S_KUBECONFIG_MODE=0644 #{install_type}] k3s.config_mode = '0644' # side-step https://github.com/k3s-io/k3s/issues/4321 @@ -75,24 +72,10 @@ def provision(vm, role, role_num, node_num) end if vm.box.to_s.include?("microos") vm.provision 'k3s-reload', type: 'reload', run: 'once' - if !EXTERNAL_DB.empty? - vm.provision "shell", inline: "docker start #{EXTERNAL_DB}" - end end # This step does not run by default and is designed to be called by higher level tools end -def getDBType(role, role_num, vm) - if ( EXTERNAL_DB == "" || EXTERNAL_DB == "etcd" ) - if role.include?("server") && role_num == 0 - return "cluster-init: true" - end - else - puts "Unknown EXTERNAL_DB: " + EXTERNAL_DB - abort - end - return "" -end Vagrant.configure("2") do |config| config.vagrant.plugins = ["vagrant-k3s", "vagrant-reload"] diff --git a/tests/e2e/snapshotrestore/snapshotrestore_test.go b/tests/e2e/snapshotrestore/snapshotrestore_test.go index d0d8c412f5ef..4bdccc8874fa 100644 --- a/tests/e2e/snapshotrestore/snapshotrestore_test.go +++ b/tests/e2e/snapshotrestore/snapshotrestore_test.go @@ -25,7 +25,6 @@ var ci = flag.Bool("ci", false, "running on CI") var local = flag.Bool("local", false, "deploy a locally built K3s binary") // Environment Variables Info: -// E2E_EXTERNAL_DB: mysql, postgres, etcd (default: etcd) // E2E_RELEASE_VERSION=v1.23.1+k3s2 (default: latest commit from master) func Test_E2ESnapshotRestore(t *testing.T) {