talos/internal/integration/integration_test.go
Andrey Smirnov 2ae0e3a569
test: add a test for version of Go Talos was built with
This is to ensure that in fact Talos is built with Go version we expect.

Signed-off-by: Andrey Smirnov <andrey.smirnov@talos-systems.com>
2022-05-11 21:51:12 +03:00

162 lines
6.7 KiB
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
//go:build integration
// +build integration
// Package integration_test contains core runners for integration tests
package integration_test
import (
"context"
"flag"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/suite"
"github.com/talos-systems/talos/internal/integration/api"
"github.com/talos-systems/talos/internal/integration/base"
"github.com/talos-systems/talos/internal/integration/cli"
"github.com/talos-systems/talos/internal/integration/k8s"
provision_test "github.com/talos-systems/talos/internal/integration/provision"
clientconfig "github.com/talos-systems/talos/pkg/machinery/client/config"
"github.com/talos-systems/talos/pkg/machinery/constants"
"github.com/talos-systems/talos/pkg/provision"
"github.com/talos-systems/talos/pkg/provision/providers"
"github.com/talos-systems/talos/pkg/version"
)
// Accumulated list of all the suites to run.
var allSuites []suite.TestingSuite
// Flag values.
var (
failFast bool
crashdumpEnabled bool
talosConfig string
endpoint string
k8sEndpoint string
expectedVersion string
expectedGoVersion string
talosctlPath string
kubectlPath string
provisionerName string
clusterName string
stateDir string
)
// TestIntegration ...
//
//nolint:gocyclo
func TestIntegration(t *testing.T) {
if talosConfig == "" {
t.Error("--talos.config is not provided")
}
var (
cluster provision.Cluster
provisioner provision.Provisioner
err error
)
if provisionerName != "" {
// use provisioned cluster state as discovery source
ctx := context.Background()
provisioner, err = providers.Factory(ctx, provisionerName)
if err != nil {
t.Error("error initializing provisioner", err)
}
defer provisioner.Close() //nolint:errcheck
cluster, err = provisioner.Reflect(ctx, clusterName, stateDir)
if err != nil {
t.Error("error reflecting cluster via provisioner", err)
}
}
provision_test.DefaultSettings.CurrentVersion = expectedVersion
provision_test.DefaultSettings.CrashdumpEnabled = crashdumpEnabled
for _, s := range allSuites {
if configuredSuite, ok := s.(base.ConfiguredSuite); ok {
configuredSuite.SetConfig(base.TalosSuite{
Endpoint: endpoint,
K8sEndpoint: k8sEndpoint,
Cluster: cluster,
TalosConfig: talosConfig,
Version: expectedVersion,
GoVersion: expectedGoVersion,
TalosctlPath: talosctlPath,
KubectlPath: kubectlPath,
})
}
var suiteName string
if namedSuite, ok := s.(base.NamedSuite); ok {
suiteName = namedSuite.SuiteName()
}
t.Run(suiteName, func(tt *testing.T) {
suite.Run(tt, s) //nolint:scopelint
})
if failFast && t.Failed() {
t.Log("fastfail mode enabled, aborting on first failure")
break
}
}
if t.Failed() && crashdumpEnabled && cluster != nil && provisioner != nil {
// if provisioner & cluster are available,
// debugging failed test is easier with crashdump
provisioner.CrashDump(context.Background(), cluster, os.Stderr)
}
}
func init() {
defaultTalosConfig, _ := clientconfig.GetDefaultPath() //nolint:errcheck
defaultStateDir, err := clientconfig.GetTalosDirectory()
if err == nil {
defaultStateDir = filepath.Join(defaultStateDir, "clusters")
}
flag.BoolVar(&failFast, "talos.failfast", false, "fail the test run on the first failed test")
flag.BoolVar(&crashdumpEnabled, "talos.crashdump", true, "print crashdump on test failure (only if provisioner is enabled)")
flag.StringVar(&talosConfig, "talos.config", defaultTalosConfig, "The path to the Talos configuration file")
flag.StringVar(&endpoint, "talos.endpoint", "", "endpoint to use (overrides config)")
flag.StringVar(&k8sEndpoint, "talos.k8sendpoint", "", "Kubernetes endpoint to use (overrides kubeconfig)")
flag.StringVar(&provisionerName, "talos.provisioner", "", "Talos cluster provisioner to use, if not set cluster state is disabled")
flag.StringVar(&stateDir, "talos.state", defaultStateDir, "directory path to store cluster state")
flag.StringVar(&clusterName, "talos.name", "talos-default", "the name of the cluster")
flag.StringVar(&expectedVersion, "talos.version", version.Tag, "expected Talos version")
flag.StringVar(&expectedGoVersion, "talos.go.version", constants.GoVersion, "expected Talos version")
flag.StringVar(&talosctlPath, "talos.talosctlpath", "talosctl", "The path to 'talosctl' binary")
flag.StringVar(&kubectlPath, "talos.kubectlpath", "kubectl", "The path to 'kubectl' binary")
flag.StringVar(&provision_test.DefaultSettings.CIDR, "talos.provision.cidr", provision_test.DefaultSettings.CIDR, "CIDR to use to provision clusters (provision tests only)")
flag.Var(&provision_test.DefaultSettings.RegistryMirrors, "talos.provision.registry-mirror", "registry mirrors to use (provision tests only)")
flag.IntVar(&provision_test.DefaultSettings.MTU, "talos.provision.mtu", provision_test.DefaultSettings.MTU, "MTU to use for cluster network (provision tests only)")
flag.Int64Var(&provision_test.DefaultSettings.CPUs, "talos.provision.cpu", provision_test.DefaultSettings.CPUs, "CPU count for each VM (provision tests only)")
flag.Int64Var(&provision_test.DefaultSettings.MemMB, "talos.provision.mem", provision_test.DefaultSettings.MemMB, "memory (in MiB) for each VM (provision tests only)")
flag.Uint64Var(&provision_test.DefaultSettings.DiskGB, "talos.provision.disk", provision_test.DefaultSettings.DiskGB, "disk size (in GiB) for each VM (provision tests only)")
flag.IntVar(&provision_test.DefaultSettings.MasterNodes, "talos.provision.masters", provision_test.DefaultSettings.MasterNodes, "master node count (provision tests only)")
flag.IntVar(&provision_test.DefaultSettings.WorkerNodes, "talos.provision.workers", provision_test.DefaultSettings.WorkerNodes, "worker node count (provision tests only)")
flag.StringVar(&provision_test.DefaultSettings.TargetInstallImageRegistry, "talos.provision.target-installer-registry",
provision_test.DefaultSettings.TargetInstallImageRegistry, "image registry for target installer image (provision tests only)")
flag.StringVar(&provision_test.DefaultSettings.CustomCNIURL, "talos.provision.custom-cni-url", provision_test.DefaultSettings.CustomCNIURL, "custom CNI URL for the cluster (provision tests only)")
flag.StringVar(&provision_test.DefaultSettings.CNIBundleURL, "talos.provision.cni-bundle-url", provision_test.DefaultSettings.CNIBundleURL, "URL to download CNI bundle from")
allSuites = append(allSuites, api.GetAllSuites()...)
allSuites = append(allSuites, cli.GetAllSuites()...)
allSuites = append(allSuites, k8s.GetAllSuites()...)
allSuites = append(allSuites, provision_test.GetAllSuites()...)
}