mirror of
				https://github.com/siderolabs/talos.git
				synced 2025-11-04 02:11:12 +01:00 
			
		
		
		
	For Talos 1.6 this means 1.24-1.29 Kubernetes. Signed-off-by: Andrey Smirnov <andrey.smirnov@siderolabs.com>
		
			
				
	
	
		
			158 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			4.1 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_provision
 | 
						|
 | 
						|
package provision
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"slices"
 | 
						|
 | 
						|
	"github.com/blang/semver/v4"
 | 
						|
	"github.com/google/go-containerregistry/pkg/name"
 | 
						|
	"github.com/google/go-containerregistry/pkg/v1/remote"
 | 
						|
	"github.com/siderolabs/gen/maps"
 | 
						|
	"github.com/siderolabs/gen/xslices"
 | 
						|
 | 
						|
	"github.com/siderolabs/talos/cmd/talosctl/pkg/mgmt/helpers"
 | 
						|
	"github.com/siderolabs/talos/pkg/images"
 | 
						|
	"github.com/siderolabs/talos/pkg/machinery/constants"
 | 
						|
)
 | 
						|
 | 
						|
// K8sCompatibilitySuite ...
 | 
						|
type K8sCompatibilitySuite struct {
 | 
						|
	BaseSuite
 | 
						|
 | 
						|
	track int
 | 
						|
 | 
						|
	versionsSequence []string
 | 
						|
}
 | 
						|
 | 
						|
// SuiteName ...
 | 
						|
func (suite *K8sCompatibilitySuite) SuiteName() string {
 | 
						|
	return fmt.Sprintf("provision.UpgradeSuite.KubernetesCompatibility-TR%d", suite.track)
 | 
						|
}
 | 
						|
 | 
						|
// SetupSuite ...
 | 
						|
func (suite *K8sCompatibilitySuite) SetupSuite() {
 | 
						|
	// figure out Kubernetes versions to go through, the calculation is based on:
 | 
						|
	//  * DefaultKubernetesVersion, e.g. 1.29.0
 | 
						|
	//  * SupportedKubernetesVersions, e.g. 6
 | 
						|
	//  * available `kubelet` images (tags)
 | 
						|
	//
 | 
						|
	// E.g. with example values above, upgrade will go through:
 | 
						|
	// 1.24 -> 1.25 -> 1.26 -> 1.27 -> 1.28 -> 1.29 (6 versions)
 | 
						|
	// For each past Kubernetes release, latest patch release will be used,
 | 
						|
	// for the latest version (DefaultKubernetesVersion), the exact version will be used
 | 
						|
	kubeletRepository, err := name.NewRepository(constants.KubeletImage)
 | 
						|
	suite.Require().NoError(err)
 | 
						|
 | 
						|
	maxVersion, err := semver.Parse(constants.DefaultKubernetesVersion)
 | 
						|
	suite.Require().NoError(err)
 | 
						|
 | 
						|
	minVersion := semver.Version{
 | 
						|
		Major: maxVersion.Major,
 | 
						|
		Minor: maxVersion.Minor - constants.SupportedKubernetesVersions + 1,
 | 
						|
		Patch: 0,
 | 
						|
	}
 | 
						|
 | 
						|
	type versionInfo struct {
 | 
						|
		Major uint64
 | 
						|
		Minor uint64
 | 
						|
	}
 | 
						|
 | 
						|
	versionsToUse := map[versionInfo]semver.Version{
 | 
						|
		{
 | 
						|
			Major: maxVersion.Major,
 | 
						|
			Minor: maxVersion.Minor,
 | 
						|
		}: maxVersion,
 | 
						|
	}
 | 
						|
 | 
						|
	tags, err := remote.List(kubeletRepository)
 | 
						|
	suite.Require().NoError(err)
 | 
						|
 | 
						|
	for _, tag := range tags {
 | 
						|
		version, err := semver.ParseTolerant(tag)
 | 
						|
		if err != nil {
 | 
						|
			continue
 | 
						|
		}
 | 
						|
 | 
						|
		if version.Pre != nil {
 | 
						|
			continue
 | 
						|
		}
 | 
						|
 | 
						|
		if version.LT(minVersion) {
 | 
						|
			continue
 | 
						|
		}
 | 
						|
 | 
						|
		if version.GT(maxVersion) {
 | 
						|
			continue
 | 
						|
		}
 | 
						|
 | 
						|
		versionKey := versionInfo{
 | 
						|
			Major: version.Major,
 | 
						|
			Minor: version.Minor,
 | 
						|
		}
 | 
						|
 | 
						|
		if curVersion := versionsToUse[versionKey]; version.GT(curVersion) {
 | 
						|
			versionsToUse[versionKey] = version
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	k8sVersions := maps.Values(versionsToUse)
 | 
						|
 | 
						|
	slices.SortFunc(k8sVersions, func(a, b semver.Version) int {
 | 
						|
		return a.Compare(b)
 | 
						|
	})
 | 
						|
 | 
						|
	suite.versionsSequence = xslices.Map(k8sVersions, semver.Version.String)
 | 
						|
 | 
						|
	suite.T().Logf("using following upgrade sequence: %v", suite.versionsSequence)
 | 
						|
 | 
						|
	suite.Assert().Len(suite.versionsSequence, constants.SupportedKubernetesVersions)
 | 
						|
 | 
						|
	suite.BaseSuite.SetupSuite()
 | 
						|
}
 | 
						|
 | 
						|
// TestAllVersions tries to run cluster on all Kubernetes versions.
 | 
						|
func (suite *K8sCompatibilitySuite) TestAllVersions() {
 | 
						|
	// start a cluster using latest Talos, and on earliest supported Kubernetes version
 | 
						|
	suite.setupCluster(clusterOptions{
 | 
						|
		ClusterName: "k8s-compat",
 | 
						|
 | 
						|
		ControlplaneNodes: DefaultSettings.ControlplaneNodes,
 | 
						|
		WorkerNodes:       DefaultSettings.WorkerNodes,
 | 
						|
 | 
						|
		SourceKernelPath:    helpers.ArtifactPath(constants.KernelAssetWithArch),
 | 
						|
		SourceInitramfsPath: helpers.ArtifactPath(constants.InitramfsAssetWithArch),
 | 
						|
		SourceInstallerImage: fmt.Sprintf(
 | 
						|
			"%s/%s:%s",
 | 
						|
			DefaultSettings.TargetInstallImageRegistry,
 | 
						|
			images.DefaultInstallerImageName,
 | 
						|
			DefaultSettings.CurrentVersion,
 | 
						|
		),
 | 
						|
		SourceVersion:    DefaultSettings.CurrentVersion,
 | 
						|
		SourceK8sVersion: suite.versionsSequence[0],
 | 
						|
	})
 | 
						|
 | 
						|
	suite.runE2E(suite.versionsSequence[0])
 | 
						|
 | 
						|
	// for each next supported Kubernetes version, upgrade k8s and run e2e tests
 | 
						|
	for i := 1; i < len(suite.versionsSequence); i++ {
 | 
						|
		suite.upgradeKubernetes(suite.versionsSequence[i-1], suite.versionsSequence[i], false)
 | 
						|
 | 
						|
		suite.waitForClusterHealth()
 | 
						|
 | 
						|
		suite.runE2E(suite.versionsSequence[i])
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func init() {
 | 
						|
	allSuites = append(
 | 
						|
		allSuites,
 | 
						|
		&K8sCompatibilitySuite{track: 2},
 | 
						|
	)
 | 
						|
}
 |