From a9f2b4a73f6b0dcecbdea5a3e8ae294f7d58db39 Mon Sep 17 00:00:00 2001 From: Remy Rojas Date: Wed, 2 Sep 2026 17:33:53 +0200 Subject: [PATCH 1/3] feat(sks): allow major.minor version input --- cmd/compute/sks/sks_create.go | 51 ++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/cmd/compute/sks/sks_create.go b/cmd/compute/sks/sks_create.go index b6508c2dc..de234a25a 100644 --- a/cmd/compute/sks/sks_create.go +++ b/cmd/compute/sks/sks_create.go @@ -1,6 +1,7 @@ package sks import ( + "context" "errors" "fmt" "slices" @@ -178,16 +179,9 @@ func (c *sksCreateCmd) CmdRun(cmd *cobra.Command, _ []string) error { //nolint:g } } - if clusterReq.Version == "latest" { - versions, err := client.ListSKSClusterVersions(ctx) - if err != nil || len(versions.SKSClusterVersions) == 0 { - return fmt.Errorf("unable to retrieve SKS versions: %w", err) - } - if versions == nil || len(versions.SKSClusterVersions) == 0 { - return errors.New("no version returned by the API") - } - - clusterReq.Version = versions.SKSClusterVersions[0] + clusterReq.Version, err = resolveSKSClusterVersion(ctx, client, clusterReq.Version) + if err != nil { + return err } if c.OIDCClientID != "" { @@ -303,3 +297,40 @@ func init() { })) } + +// Computes the major.minor.patch version of an SKS cluster from an resSKSClusterAttrVersion inputVersion +// Defaults to latest version +func resolveSKSClusterVersion(ctx context.Context, client *v3.Client, inputVersion string) (string, error) { + + inputVersionLength := len(strings.Split(inputVersion, ".")) + isMajorMinor := inputVersionLength == 2 + isMajorMinorPatch := inputVersionLength == 3 + + if isMajorMinorPatch { + return inputVersion, nil + } + + availableVersions, err := client.ListSKSClusterVersions(ctx) + if err != nil { + return "", err + } + if len(availableVersions.SKSClusterVersions) == 0 { + return "", fmt.Errorf("ListSKSClusterVersions: API returned empty list") + } + + defaultVersion := availableVersions.SKSClusterVersions[0] + if "latest" == inputVersion { + return defaultVersion, nil + } + + if isMajorMinor { + for _, v := range availableVersions.SKSClusterVersions { + if inputVersion == strings.Join(strings.Split(v, ".")[:2], ".") { + return v, nil + } + } + return "", fmt.Errorf("the SKS cluster version %s is not supported. Available versions: %s", inputVersion, strings.Join(availableVersions.SKSClusterVersions, ", ")) + } + + return "", fmt.Errorf("error resolving the provided SKS cluster version: %s. Available versions: %s", inputVersion, strings.Join(availableVersions.SKSClusterVersions, ", ")) +} From f52111e207d9c51f8ffbfd4f79e2b7f24816543a Mon Sep 17 00:00:00 2001 From: Remy Rojas Date: Wed, 2 Sep 2026 17:35:46 +0200 Subject: [PATCH 2/3] fixup! feat(sks): allow major.minor version input --- cmd/compute/sks/sks_create.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/compute/sks/sks_create.go b/cmd/compute/sks/sks_create.go index de234a25a..05c4ece8b 100644 --- a/cmd/compute/sks/sks_create.go +++ b/cmd/compute/sks/sks_create.go @@ -298,8 +298,8 @@ func init() { } -// Computes the major.minor.patch version of an SKS cluster from an resSKSClusterAttrVersion inputVersion -// Defaults to latest version +// Computes the major.minor.patch version of an SKS cluster +// Defaults to the latest version func resolveSKSClusterVersion(ctx context.Context, client *v3.Client, inputVersion string) (string, error) { inputVersionLength := len(strings.Split(inputVersion, ".")) From e5ab26cc82c6cabc07d18b91ec48e3beb8b4f9a4 Mon Sep 17 00:00:00 2001 From: Remy Rojas Date: Wed, 2 Sep 2026 17:38:02 +0200 Subject: [PATCH 3/3] changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a21827e6..2c8aa0be4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- sks: allow `major.minor` format for kube version when creating a cluster + ### Breaking changes ### Features