diff --git a/pkg/descheduler/descheduler.go b/pkg/descheduler/descheduler.go index 8ae974670..8d87416ad 100644 --- a/pkg/descheduler/descheduler.go +++ b/pkg/descheduler/descheduler.go @@ -21,8 +21,6 @@ import ( "errors" "fmt" "math" - "strconv" - "strings" "time" "go.opentelemetry.io/otel/attribute" @@ -38,6 +36,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" + utilversion "k8s.io/apimachinery/pkg/util/version" "k8s.io/apimachinery/pkg/util/wait" clientset "k8s.io/client-go/kubernetes" fakeclientset "k8s.io/client-go/kubernetes/fake" @@ -277,29 +276,29 @@ func Run(ctx context.Context, rs *options.DeschedulerServer) error { } func validateVersionCompatibility(discovery discovery.DiscoveryInterface, versionInfo version.Info) error { - serverVersion, serverErr := discovery.ServerVersion() - if serverErr != nil { - return errors.New("failed to get Kubernetes server version") + serverVersionInfo, err := discovery.ServerVersion() + if err != nil { + return errors.New("failed to discover Kubernetes server version") } - deschedulerMinorVersion := strings.Split(versionInfo.Minor, ".")[0] - deschedulerMinorVersionFloat, err := strconv.ParseFloat(deschedulerMinorVersion, 64) + serverVersion, err := utilversion.ParseSemantic(serverVersionInfo.String()) + if err != nil { + return errors.New("failed to parse Kubernetes server version") + } + + deschedulerVersion, err := utilversion.ParseGeneric(versionInfo.GitVersion) if err != nil { return errors.New("failed to convert Descheduler minor version to float") } - kubernetesMinorVersionFloat, err := strconv.ParseFloat(serverVersion.Minor, 64) - if err != nil { - return errors.New("failed to convert Kubernetes server minor version to float") - } - - if math.Abs(deschedulerMinorVersionFloat-kubernetesMinorVersionFloat) > 3 { + deschedulerMinor := float64(deschedulerVersion.Minor()) + serverMinor := float64(serverVersion.Minor()) + if math.Abs(deschedulerMinor-serverMinor) > 3 { return fmt.Errorf( - "descheduler minor version %v is not supported on your version of Kubernetes %v.%v. "+ + "descheduler version %v may not be supported on your version of Kubernetes %v."+ "See compatibility docs for more info: https://github.com/kubernetes-sigs/descheduler#compatibility-matrix", - deschedulerMinorVersion, - serverVersion.Major, - serverVersion.Minor, + deschedulerVersion.String(), + serverVersionInfo.String(), ) } diff --git a/pkg/descheduler/descheduler_test.go b/pkg/descheduler/descheduler_test.go index afa083036..596def186 100644 --- a/pkg/descheduler/descheduler_test.go +++ b/pkg/descheduler/descheduler_test.go @@ -250,49 +250,55 @@ func TestRootCancelWithNoInterval(t *testing.T) { func TestValidateVersionCompatibility(t *testing.T) { type testCase struct { - name string - deschedulerMinor string - serverMinor string - expectError bool + name string + deschedulerVersion string + serverVersion string + expectError bool } testCases := []testCase{ { - name: "no error when descheduler minor equals to server minor", - deschedulerMinor: "26.0", - serverMinor: "26", - expectError: false, + name: "no error when descheduler minor equals to server minor", + deschedulerVersion: "v0.26", + serverVersion: "v1.26.1", + expectError: false, }, { - name: "no error when descheduler minor is 3 behind server minor", - deschedulerMinor: "23.0", - serverMinor: "26", - expectError: false, + name: "no error when descheduler minor is 3 behind server minor", + deschedulerVersion: "0.23", + serverVersion: "v1.26.1", + expectError: false, }, { - name: "no error when descheduler minor is 3 ahead of server minor", - deschedulerMinor: "26.0", - serverMinor: "23", - expectError: false, + name: "no error when descheduler minor is 3 ahead of server minor", + deschedulerVersion: "v0.26", + serverVersion: "v1.26.1", + expectError: false, }, { - name: "error when descheduler minor is 4 behind server minor", - deschedulerMinor: "22.0", - serverMinor: "26", - expectError: true, + name: "error when descheduler minor is 4 behind server minor", + deschedulerVersion: "v0.22", + serverVersion: "v1.26.1", + expectError: true, }, { - name: "error when descheduler minor is 4 ahead of server minor", - deschedulerMinor: "27.0", - serverMinor: "23", - expectError: true, + name: "error when descheduler minor is 4 ahead of server minor", + deschedulerVersion: "v0.27", + serverVersion: "v1.23.1", + expectError: true, + }, + { + name: "no error when using managed provider version", + deschedulerVersion: "v0.25", + serverVersion: "v1.25.12-eks-2d98532", + expectError: false, }, } client := fakeclientset.NewSimpleClientset() fakeDiscovery, _ := client.Discovery().(*fakediscovery.FakeDiscovery) for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - fakeDiscovery.FakedServerVersion = &apiversion.Info{Major: "1", Minor: tc.serverMinor} - deschedulerVersion := deschedulerversion.Info{Major: "0", Minor: tc.deschedulerMinor} + fakeDiscovery.FakedServerVersion = &apiversion.Info{GitVersion: tc.serverVersion} + deschedulerVersion := deschedulerversion.Info{GitVersion: tc.deschedulerVersion} err := validateVersionCompatibility(fakeDiscovery, deschedulerVersion) hasError := err != nil