Unverified Commit 0981f006 authored by Derek Nola's avatar Derek Nola Committed by GitHub

Add E2E Split Server to Drone, support parrallel testing in Drone (#9940)

* Fix SE old test name * E2E: support multiple VMs at once in CI with time prefix * Add local binary support to split server test, add to drone CI * Cleanup old VMs in drone Signed-off-by: 's avatarDerek Nola <derek.nola@suse.com>
parent 5c94ce2c
...@@ -617,33 +617,24 @@ steps: ...@@ -617,33 +617,24 @@ steps:
- mkdir -p dist/artifacts - mkdir -p dist/artifacts
- cp /tmp/artifacts/* dist/artifacts/ - cp /tmp/artifacts/* dist/artifacts/
- docker stop registry && docker rm registry - docker stop registry && docker rm registry
# Cleanup VMs running, happens if a previous test panics # Cleanup VMs that are older than 2h. Happens if a previous test panics or is canceled
# Cleanup inactive domains, happens if previous test is canceled - tests/e2e/scripts/cleanup_vms.sh
- |
VMS=$(virsh list --name | grep '_server-\|_agent-' || true)
if [ -n "$VMS" ]; then
for vm in $VMS
do
virsh destroy $vm
virsh undefine $vm --remove-all-storage
done
fi
VMS=$(virsh list --name --inactive | grep '_server-\|_agent-' || true)
if [ -n "$VMS" ]; then
for vm in $VMS
do
virsh undefine $vm
done
fi
- docker run -d -p 5000:5000 -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io --name registry registry:2 - docker run -d -p 5000:5000 -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io --name registry registry:2
- cd tests/e2e/validatecluster - |
- vagrant destroy -f cd tests/e2e/validatecluster
- go test -v -timeout=45m ./validatecluster_test.go -ci -local vagrant destroy -f
- cp ./coverage.out /tmp/artifacts/validate-coverage.out go test -v -timeout=45m ./validatecluster_test.go -ci -local
- cd ../secretsencryption cp ./coverage.out /tmp/artifacts/validate-coverage.out
- vagrant destroy -f - |
- go test -v -timeout=30m ./secretsencryption_test.go -ci -local cd ../secretsencryption
- cp ./coverage.out /tmp/artifacts/se-coverage.out vagrant destroy -f
go test -v -timeout=30m ./secretsencryption_test.go -ci -local
cp ./coverage.out /tmp/artifacts/se-coverage.out
- |
cd ../splitserver
vagrant destroy -f
go test -v -timeout=30m ./splitserver_test.go -ci -local
cp ./coverage.out /tmp/artifacts/split-coverage.out
- | - |
if [ "$DRONE_BUILD_EVENT" = "pull_request" ]; then if [ "$DRONE_BUILD_EVENT" = "pull_request" ]; then
cd ../upgradecluster cd ../upgradecluster
...@@ -669,6 +660,7 @@ steps: ...@@ -669,6 +660,7 @@ steps:
files: files:
- /tmp/artifacts/validate-coverage.out - /tmp/artifacts/validate-coverage.out
- /tmp/artifacts/se-coverage.out - /tmp/artifacts/se-coverage.out
- /tmp/artifacts/split-coverage.out
- /tmp/artifacts/upgrade-coverage.out - /tmp/artifacts/upgrade-coverage.out
flags: flags:
- e2etests - e2etests
......
...@@ -90,6 +90,8 @@ Vagrant.configure("2") do |config| ...@@ -90,6 +90,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
if NODE_ROLES.kind_of?(String) if NODE_ROLES.kind_of?(String)
......
...@@ -97,6 +97,8 @@ Vagrant.configure("2") do |config| ...@@ -97,6 +97,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
......
...@@ -65,6 +65,8 @@ Vagrant.configure("2") do |config| ...@@ -65,6 +65,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
if NODE_ROLES.kind_of?(String) if NODE_ROLES.kind_of?(String)
......
...@@ -103,6 +103,8 @@ Vagrant.configure("2") do |config| ...@@ -103,6 +103,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
......
...@@ -45,6 +45,8 @@ Vagrant.configure("2") do |config| ...@@ -45,6 +45,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
......
...@@ -65,6 +65,8 @@ Vagrant.configure("2") do |config| ...@@ -65,6 +65,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
......
...@@ -69,6 +69,8 @@ Vagrant.configure("2") do |config| ...@@ -69,6 +69,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
......
#!/bin/bash
# Clean up any VMS that are older than 2 hours.
#
# We embed the time in the VM name, so we can easily filter them out.
# Get the current time in seconds since the epoch
current_time=$(date +%s)
# Get the list of VMs
vms=$(virsh list --name --all)
time_regex="_([0-9]+)_(server|agent)"
# Cleanup running VMs, happens if a previous test panics
for vm in $vms; do
if [[ $vm =~ $time_regex ]]; then
vm_time="${BASH_REMATCH[1]}"
age=$((current_time - vm_time))
if [ $age -gt 7200 ]; then
virsh destroy $vm
virsh undefine $vm --remove-all-storage
fi
fi
done
# Cleanup inactive domains, happens if previous test is canceled
vms=$(virsh list --name --inactive)
for vm in $vms; do
if [[ $vm =~ $time_regex ]]; then
vm_time="${BASH_REMATCH[1]}"
age=$((current_time - vm_time))
if [ $age -gt 7200 ]; then
virsh undefine $vm --remove-all-storage
fi
fi
done
\ No newline at end of file
...@@ -9,7 +9,7 @@ GOCOVER = (ENV['E2E_GOCOVER'] || "") ...@@ -9,7 +9,7 @@ GOCOVER = (ENV['E2E_GOCOVER'] || "")
NODE_CPUS = (ENV['E2E_NODE_CPUS'] || 2).to_i NODE_CPUS = (ENV['E2E_NODE_CPUS'] || 2).to_i
NODE_MEMORY = (ENV['E2E_NODE_MEMORY'] || 2048).to_i NODE_MEMORY = (ENV['E2E_NODE_MEMORY'] || 2048).to_i
# Virtualbox >= 6.1.28 require `/etc/vbox/network.conf` for expanded private networks # Virtualbox >= 6.1.28 require `/etc/vbox/network.conf` for expanded private networks
NETWORK_PREFIX = "10.10.10" NETWORK_PREFIX = "10.10.13"
install_type = "" install_type = ""
def provision(vm, role, role_num, node_num) def provision(vm, role, role_num, node_num)
...@@ -53,6 +53,8 @@ Vagrant.configure("2") do |config| ...@@ -53,6 +53,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
......
...@@ -52,6 +52,8 @@ Vagrant.configure("2") do |config| ...@@ -52,6 +52,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
......
...@@ -22,7 +22,7 @@ var local = flag.Bool("local", false, "deploy a locally built K3s binary") ...@@ -22,7 +22,7 @@ var local = flag.Bool("local", false, "deploy a locally built K3s binary")
// Environment Variables Info: // Environment Variables Info:
// E2E_RELEASE_VERSION=v1.23.1+k3s2 or nil for latest commit from master // E2E_RELEASE_VERSION=v1.23.1+k3s2 or nil for latest commit from master
func Test_E2ESecretsEncryption(t *testing.T) { func Test_E2ESecretsEncryptionOld(t *testing.T) {
RegisterFailHandler(Fail) RegisterFailHandler(Fail)
flag.Parse() flag.Parse()
suiteConfig, reporterConfig := GinkgoConfiguration() suiteConfig, reporterConfig := GinkgoConfiguration()
......
...@@ -82,6 +82,8 @@ Vagrant.configure("2") do |config| ...@@ -82,6 +82,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
......
ENV['VAGRANT_NO_PARALLEL'] = 'no' ENV['VAGRANT_NO_PARALLEL'] = 'no'
NODE_ROLES = (ENV['E2E_NODE_ROLES'] || NODE_ROLES = (ENV['E2E_NODE_ROLES'] ||
["server-etcd-0", "server-etcd-1", "server-etcd-2", "server-cp-0", "server-cp-1", "agent-0"]) ["server-etcd-0", "server-etcd-1", "server-etcd-2", "server-cp-0", "server-cp-1", "agent-0", "agent-1"])
NODE_BOXES = (ENV['E2E_NODE_BOXES'] || NODE_BOXES = (ENV['E2E_NODE_BOXES'] ||
['generic/ubuntu2310', 'generic/ubuntu2310', 'generic/ubuntu2310', 'generic/ubuntu2310', 'generic/ubuntu2310']) ['generic/ubuntu2310', 'generic/ubuntu2310', 'generic/ubuntu2310', 'generic/ubuntu2310', 'generic/ubuntu2310'])
GITHUB_BRANCH = (ENV['E2E_GITHUB_BRANCH'] || "master") GITHUB_BRANCH = (ENV['E2E_GITHUB_BRANCH'] || "master")
RELEASE_VERSION = (ENV['E2E_RELEASE_VERSION'] || "") RELEASE_VERSION = (ENV['E2E_RELEASE_VERSION'] || "")
GOCOVER = (ENV['E2E_GOCOVER'] || "")
NODE_CPUS = (ENV['E2E_NODE_CPUS'] || 2).to_i NODE_CPUS = (ENV['E2E_NODE_CPUS'] || 2).to_i
NODE_MEMORY = (ENV['E2E_NODE_MEMORY'] || 2048).to_i NODE_MEMORY = (ENV['E2E_NODE_MEMORY'] || 2048).to_i
# Virtualbox >= 6.1.28 require `/etc/vbox/network.conf` for expanded private networks # Virtualbox >= 6.1.28 require `/etc/vbox/network.conf` for expanded private networks
NETWORK_PREFIX = "10.10.10" NETWORK_PREFIX = "10.10.12"
def provision(vm, role, role_num, node_num) def provision(vm, role, role_num, node_num)
vm.box = NODE_BOXES[node_num] vm.box = NODE_BOXES[node_num]
...@@ -22,12 +23,14 @@ def provision(vm, role, role_num, node_num) ...@@ -22,12 +23,14 @@ def provision(vm, role, role_num, node_num)
defaultOSConfigure(vm) defaultOSConfigure(vm)
install_type = getInstallType(vm, RELEASE_VERSION, GITHUB_BRANCH) install_type = getInstallType(vm, RELEASE_VERSION, GITHUB_BRANCH)
addCoverageDir(vm, role, GOCOVER)
vm.provision "ping k3s.io", type: "shell", inline: "ping -c 2 k3s.io" vm.provision "ping k3s.io", type: "shell", inline: "ping -c 2 k3s.io"
if node_num == 0 && !role.include?("server") && !role.include?("etcd") if node_num == 0 && !role.include?("server") && !role.include?("etcd")
puts "first node must be a etcd server" if ARGV.include?("up") || (ARGV.include?("reload") && ARGV.include?("--provision"))
puts "Error: first node provisioned must be a etcd server"
abort abort
end
elsif role.include?("server") && role.include?("etcd") && role_num == 0 elsif role.include?("server") && role.include?("etcd") && role_num == 0
vm.provision 'k3s-install', type: 'k3s', run: 'once' do |k3s| vm.provision 'k3s-install', type: 'k3s', run: 'once' do |k3s|
k3s.args = "server" k3s.args = "server"
...@@ -102,6 +105,8 @@ Vagrant.configure("2") do |config| ...@@ -102,6 +105,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
...@@ -116,6 +121,7 @@ Vagrant.configure("2") do |config| ...@@ -116,6 +121,7 @@ Vagrant.configure("2") do |config|
end end
NODE_ROLES.each_with_index do |role, i| NODE_ROLES.each_with_index do |role, i|
# Find the first number in the role name
role_num = role.split("-", -1).pop.to_i role_num = role.split("-", -1).pop.to_i
config.vm.define role do |node| config.vm.define role do |node|
provision(node.vm, role, role_num, i) provision(node.vm, role, role_num, i)
......
package splitserver package splitserver
import ( import (
"context"
"flag" "flag"
"fmt" "fmt"
"os" "os"
"strconv" "strconv"
"strings" "strings"
"testing" "testing"
"time"
"github.com/k3s-io/k3s/tests/e2e" "github.com/k3s-io/k3s/tests/e2e"
. "github.com/onsi/ginkgo/v2" . "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega" . "github.com/onsi/gomega"
"golang.org/x/sync/errgroup"
) )
// Valid nodeOS: generic/ubuntu2310, opensuse/Leap-15.3.x86_64 // Valid nodeOS: generic/ubuntu2310, opensuse/Leap-15.3.x86_64
...@@ -19,21 +22,25 @@ var etcdCount = flag.Int("etcdCount", 3, "number of server nodes only deploying ...@@ -19,21 +22,25 @@ var etcdCount = flag.Int("etcdCount", 3, "number of server nodes only deploying
var controlPlaneCount = flag.Int("controlPlaneCount", 1, "number of server nodes acting as control plane") var controlPlaneCount = flag.Int("controlPlaneCount", 1, "number of server nodes acting as control plane")
var agentCount = flag.Int("agentCount", 1, "number of agent nodes") var agentCount = flag.Int("agentCount", 1, "number of agent nodes")
var ci = flag.Bool("ci", false, "running on CI") var ci = flag.Bool("ci", false, "running on CI")
var local = flag.Bool("local", false, "deploy a locally built K3s binary")
var hardened = flag.Bool("hardened", false, "true or false") var hardened = flag.Bool("hardened", false, "true or false")
// Environment Variables Info: // Environment Variables Info:
// E2E_RELEASE_VERSION=v1.23.1+k3s2 or nil for latest commit from master // E2E_RELEASE_VERSION=v1.23.1+k3s2 or nil for latest commit from master
func createSplitCluster(nodeOS string, etcdCount, controlPlaneCount, agentCount int) ([]string, []string, []string, error) { // createSplitCluster creates a split server cluster with the given nodeOS, etcdCount, controlPlaneCount, and agentCount.
// It duplicates and merges functionality found in the e2e.CreateCluster and e2e.CreateLocalCluster functions.
func createSplitCluster(nodeOS string, etcdCount, controlPlaneCount, agentCount int, local bool) ([]string, []string, []string, error) {
etcdNodeNames := make([]string, etcdCount) etcdNodeNames := make([]string, etcdCount)
cpNodeNames := make([]string, controlPlaneCount)
agentNodeNames := make([]string, agentCount)
for i := 0; i < etcdCount; i++ { for i := 0; i < etcdCount; i++ {
etcdNodeNames[i] = "server-etcd-" + strconv.Itoa(i) etcdNodeNames[i] = "server-etcd-" + strconv.Itoa(i)
} }
cpNodeNames := make([]string, controlPlaneCount)
for i := 0; i < controlPlaneCount; i++ { for i := 0; i < controlPlaneCount; i++ {
cpNodeNames[i] = "server-cp-" + strconv.Itoa(i) cpNodeNames[i] = "server-cp-" + strconv.Itoa(i)
} }
agentNodeNames := make([]string, agentCount)
for i := 0; i < agentCount; i++ { for i := 0; i < agentCount; i++ {
agentNodeNames[i] = "agent-" + strconv.Itoa(i) agentNodeNames[i] = "agent-" + strconv.Itoa(i)
} }
...@@ -43,6 +50,9 @@ func createSplitCluster(nodeOS string, etcdCount, controlPlaneCount, agentCount ...@@ -43,6 +50,9 @@ func createSplitCluster(nodeOS string, etcdCount, controlPlaneCount, agentCount
nodeBoxes := strings.Repeat(nodeOS+" ", etcdCount+controlPlaneCount+agentCount) nodeBoxes := strings.Repeat(nodeOS+" ", etcdCount+controlPlaneCount+agentCount)
nodeBoxes = strings.TrimSpace(nodeBoxes) nodeBoxes = strings.TrimSpace(nodeBoxes)
allNodes := append(etcdNodeNames, cpNodeNames...)
allNodes = append(allNodes, agentNodeNames...)
var testOptions string var testOptions string
for _, env := range os.Environ() { for _, env := range os.Environ() {
if strings.HasPrefix(env, "E2E_") { if strings.HasPrefix(env, "E2E_") {
...@@ -50,14 +60,58 @@ func createSplitCluster(nodeOS string, etcdCount, controlPlaneCount, agentCount ...@@ -50,14 +60,58 @@ func createSplitCluster(nodeOS string, etcdCount, controlPlaneCount, agentCount
} }
} }
cmd := fmt.Sprintf(`E2E_NODE_ROLES="%s" E2E_NODE_BOXES="%s" %s vagrant up &> vagrant.log`, nodeRoles, nodeBoxes, testOptions) // Provision the first etcd node. In GitHub Actions, this also imports the VM image into libvirt, which
// takes time and can cause the next vagrant up to fail if it is not given enough time to complete.
cmd := fmt.Sprintf(`E2E_NODE_ROLES="%s" E2E_NODE_BOXES="%s" vagrant up --no-provision %s &> vagrant.log`, nodeRoles, nodeBoxes, etcdNodeNames[0])
fmt.Println(cmd) fmt.Println(cmd)
if _, err := e2e.RunCommand(cmd); err != nil { if _, err := e2e.RunCommand(cmd); err != nil {
fmt.Println("Error Creating Cluster", err) return etcdNodeNames, cpNodeNames, agentNodeNames, err
return nil, nil, nil, err }
// Bring up the rest of the nodes in parallel
errg, _ := errgroup.WithContext(context.Background())
for _, node := range allNodes[1:] {
cmd := fmt.Sprintf(`E2E_NODE_ROLES="%s" E2E_NODE_BOXES="%s" vagrant up --no-provision %s &>> vagrant.log`, nodeRoles, nodeBoxes, node)
errg.Go(func() error {
_, err := e2e.RunCommand(cmd)
return err
})
// libVirt/Virtualbox needs some time between provisioning nodes
time.Sleep(10 * time.Second)
}
if err := errg.Wait(); err != nil {
return etcdNodeNames, cpNodeNames, agentNodeNames, err
}
if local {
testOptions += " E2E_RELEASE_VERSION=skip"
for _, node := range allNodes {
cmd := fmt.Sprintf(`E2E_NODE_ROLES=%s vagrant scp ../../../dist/artifacts/k3s %s:/tmp/`, node, node)
if _, err := e2e.RunCommand(cmd); err != nil {
return etcdNodeNames, cpNodeNames, agentNodeNames, fmt.Errorf("failed to scp k3s binary to %s: %v", node, err)
}
if _, err := e2e.RunCmdOnNode("mv /tmp/k3s /usr/local/bin/", node); err != nil {
return etcdNodeNames, cpNodeNames, agentNodeNames, err
}
}
}
// Install K3s on all nodes in parallel
errg, _ = errgroup.WithContext(context.Background())
for _, node := range allNodes {
cmd = fmt.Sprintf(`E2E_NODE_ROLES="%s" E2E_NODE_BOXES="%s" %s vagrant provision %s &>> vagrant.log`, nodeRoles, nodeBoxes, testOptions, node)
errg.Go(func() error {
_, err := e2e.RunCommand(cmd)
return err
})
// K3s needs some time between joining nodes to avoid learner issues
time.Sleep(10 * time.Second)
}
if err := errg.Wait(); err != nil {
return etcdNodeNames, cpNodeNames, agentNodeNames, err
} }
return etcdNodeNames, cpNodeNames, agentNodeNames, nil return etcdNodeNames, cpNodeNames, agentNodeNames, nil
} }
func Test_E2ESplitServer(t *testing.T) { func Test_E2ESplitServer(t *testing.T) {
RegisterFailHandler(Fail) RegisterFailHandler(Fail)
flag.Parse() flag.Parse()
...@@ -78,7 +132,7 @@ var _ = Describe("Verify Create", Ordered, func() { ...@@ -78,7 +132,7 @@ var _ = Describe("Verify Create", Ordered, func() {
Context("Cluster :", func() { Context("Cluster :", func() {
It("Starts up with no issues", func() { It("Starts up with no issues", func() {
var err error var err error
etcdNodeNames, cpNodeNames, agentNodeNames, err = createSplitCluster(*nodeOS, *etcdCount, *controlPlaneCount, *agentCount) etcdNodeNames, cpNodeNames, agentNodeNames, err = createSplitCluster(*nodeOS, *etcdCount, *controlPlaneCount, *agentCount, *local)
Expect(err).NotTo(HaveOccurred(), e2e.GetVagrantLog(err)) Expect(err).NotTo(HaveOccurred(), e2e.GetVagrantLog(err))
fmt.Println("CLUSTER CONFIG") fmt.Println("CLUSTER CONFIG")
fmt.Println("OS:", *nodeOS) fmt.Println("OS:", *nodeOS)
...@@ -229,6 +283,11 @@ var _ = AfterEach(func() { ...@@ -229,6 +283,11 @@ var _ = AfterEach(func() {
}) })
var _ = AfterSuite(func() { var _ = AfterSuite(func() {
if !failed {
allNodes := append(cpNodeNames, etcdNodeNames...)
allNodes = append(allNodes, agentNodeNames...)
Expect(e2e.GetCoverageReport(allNodes)).To(Succeed())
}
if !failed || *ci { if !failed || *ci {
Expect(e2e.DestroyCluster()).To(Succeed()) Expect(e2e.DestroyCluster()).To(Succeed())
Expect(os.Remove(kubeConfigFile)).To(Succeed()) Expect(os.Remove(kubeConfigFile)).To(Succeed())
......
...@@ -67,6 +67,8 @@ Vagrant.configure("2") do |config| ...@@ -67,6 +67,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
......
...@@ -63,6 +63,8 @@ Vagrant.configure("2") do |config| ...@@ -63,6 +63,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
if NODE_ROLES.kind_of?(String) if NODE_ROLES.kind_of?(String)
......
...@@ -72,6 +72,8 @@ Vagrant.configure("2") do |config| ...@@ -72,6 +72,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
if NODE_ROLES.kind_of?(String) if NODE_ROLES.kind_of?(String)
......
...@@ -11,7 +11,7 @@ GOCOVER = (ENV['E2E_GOCOVER'] || "") ...@@ -11,7 +11,7 @@ GOCOVER = (ENV['E2E_GOCOVER'] || "")
NODE_CPUS = (ENV['E2E_NODE_CPUS'] || 2).to_i NODE_CPUS = (ENV['E2E_NODE_CPUS'] || 2).to_i
NODE_MEMORY = (ENV['E2E_NODE_MEMORY'] || 2048).to_i NODE_MEMORY = (ENV['E2E_NODE_MEMORY'] || 2048).to_i
# Virtualbox >= 6.1.28 require `/etc/vbox/network.conf` for expanded private networks # Virtualbox >= 6.1.28 require `/etc/vbox/network.conf` for expanded private networks
NETWORK_PREFIX = "10.10.10" NETWORK_PREFIX = "10.10.11"
install_type = "" install_type = ""
def provision(vm, role, role_num, node_num) def provision(vm, role, role_num, node_num)
...@@ -141,6 +141,8 @@ Vagrant.configure("2") do |config| ...@@ -141,6 +141,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
......
...@@ -139,6 +139,8 @@ Vagrant.configure("2") do |config| ...@@ -139,6 +139,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
......
...@@ -69,6 +69,8 @@ Vagrant.configure("2") do |config| ...@@ -69,6 +69,8 @@ Vagrant.configure("2") do |config|
config.vm.provider "libvirt" do |v| config.vm.provider "libvirt" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
v.memory = NODE_MEMORY v.memory = NODE_MEMORY
# We replicate the default prefix, but add a timestamp to enable parallel runs and cleanup of old VMs
v.default_prefix = File.basename(Dir.getwd) + "_" + Time.now.to_i.to_s + "_"
end end
config.vm.provider "virtualbox" do |v| config.vm.provider "virtualbox" do |v|
v.cpus = NODE_CPUS v.cpus = NODE_CPUS
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment