From 778d1e8f36741a99bfa77cec6f33159b4798fda0 Mon Sep 17 00:00:00 2001 From: 24sama Date: Fri, 21 Oct 2022 14:06:16 +0800 Subject: [PATCH] fix: calculate next version error Signed-off-by: 24sama --- pkg/kubernetes/tasks.go | 17 +++++++-- pkg/kubernetes/tasks_test.go | 73 ++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 pkg/kubernetes/tasks_test.go diff --git a/pkg/kubernetes/tasks.go b/pkg/kubernetes/tasks.go index e461127d9..94f23fc2b 100644 --- a/pkg/kubernetes/tasks.go +++ b/pkg/kubernetes/tasks.go @@ -616,12 +616,15 @@ func (c *CalculateNextVersion) Execute(_ connector.Runtime) error { if !ok { return errors.New("get upgrade plan Kubernetes version failed by pipeline cache") } - nextVersionStr := calculateNextStr(currentVersion, planVersion) + nextVersionStr, err := calculateNextStr(currentVersion, planVersion) + if err != nil { + return errors.Wrap(err, "calculate next version failed") + } c.KubeConf.Cluster.Kubernetes.Version = nextVersionStr return nil } -func calculateNextStr(currentVersion, desiredVersion string) string { +func calculateNextStr(currentVersion, desiredVersion string) (string, error) { current := versionutil.MustParseSemantic(currentVersion) target := versionutil.MustParseSemantic(desiredVersion) var nextVersionMinor uint @@ -632,7 +635,10 @@ func calculateNextStr(currentVersion, desiredVersion string) string { } if nextVersionMinor == target.Minor() { - return desiredVersion + if _, ok := files.FileSha256["kubeadm"]["amd64"][desiredVersion]; !ok { + return "", errors.Errorf("the target version %s is not supported", desiredVersion) + } + return desiredVersion, nil } else { nextVersionPatchList := make([]int, 0) for supportVersionStr := range files.FileSha256["kubeadm"]["amd64"] { @@ -644,9 +650,12 @@ func calculateNextStr(currentVersion, desiredVersion string) string { sort.Ints(nextVersionPatchList) nextVersion := current.WithMinor(nextVersionMinor) + if len(nextVersionPatchList) == 0 { + return "", errors.Errorf("Kubernetes minor version v%d.%d.x is not supported", nextVersion.Major(), nextVersion.Minor()) + } nextVersion = nextVersion.WithPatch(uint(nextVersionPatchList[len(nextVersionPatchList)-1])) - return fmt.Sprintf("v%s", nextVersion.String()) + return fmt.Sprintf("v%s", nextVersion.String()), nil } } diff --git a/pkg/kubernetes/tasks_test.go b/pkg/kubernetes/tasks_test.go new file mode 100644 index 000000000..8fdf21da7 --- /dev/null +++ b/pkg/kubernetes/tasks_test.go @@ -0,0 +1,73 @@ +/* + Copyright 2022 The KubeSphere Authors. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package kubernetes + +import ( + "testing" +) + +func Test_calculateNextStr(t *testing.T) { + tests := []struct { + currentVersion string + desiredVersion string + want string + wantErr bool + errMsg string + }{ + { + currentVersion: "v1.21.5", + desiredVersion: "v1.22.5", + want: "v1.22.5", + wantErr: false, + }, + { + currentVersion: "v1.21.5", + desiredVersion: "v1.23.5", + want: "v1.22.12", + wantErr: false, + }, + { + currentVersion: "v1.17.5", + desiredVersion: "v1.18.5", + want: "", + wantErr: true, + errMsg: "the target version v1.18.5 is not supported", + }, + { + currentVersion: "v1.17.5", + desiredVersion: "v1.21.5", + want: "", + wantErr: true, + errMsg: "Kubernetes minor version v1.18.x is not supported", + }, + } + for _, tt := range tests { + t.Run("", func(t *testing.T) { + got, err := calculateNextStr(tt.currentVersion, tt.desiredVersion) + if (err != nil) != tt.wantErr { + t.Errorf("calculateNextStr() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("calculateNextStr() got = %v, want %v", got, tt.want) + } + if err != nil && err.Error() != tt.errMsg { + t.Errorf("calculateNextStr() error = %v, want %v", err, tt.errMsg) + } + }) + } +}