Skip to content

Commit a3146a1

Browse files
committed
fix: minor version parsing in version compatibility check
Signed-off-by: Amir Alavi <[email protected]>
1 parent 55a0812 commit a3146a1

File tree

9 files changed

+840
-23
lines changed

9 files changed

+840
-23
lines changed

pkg/descheduler/descheduler.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ package descheduler
1818

1919
import (
2020
"context"
21-
"errors"
2221
"fmt"
2322
"math"
23+
"strconv"
2424
"time"
2525

2626
"go.opentelemetry.io/otel/attribute"
@@ -285,30 +285,30 @@ func Run(ctx context.Context, rs *options.DeschedulerServer) error {
285285
return runFn()
286286
}
287287

288-
func validateVersionCompatibility(discovery discovery.DiscoveryInterface, versionInfo version.Info) error {
289-
serverVersionInfo, err := discovery.ServerVersion()
288+
func validateVersionCompatibility(discovery discovery.DiscoveryInterface, deschedulerVersionInfo version.Info) error {
289+
kubeServerVersionInfo, err := discovery.ServerVersion()
290290
if err != nil {
291-
return errors.New("failed to discover Kubernetes server version")
291+
return fmt.Errorf("failed to discover Kubernetes server version: %v", err)
292292
}
293293

294-
serverVersion, err := utilversion.ParseSemantic(serverVersionInfo.String())
294+
kubeServerVersion, err := utilversion.ParseSemantic(kubeServerVersionInfo.String())
295295
if err != nil {
296-
return errors.New("failed to parse Kubernetes server version")
296+
return fmt.Errorf("failed to parse Kubernetes server version '%s': %v", kubeServerVersionInfo.String(), err)
297297
}
298298

299-
deschedulerVersion, err := utilversion.ParseGeneric(versionInfo.GitVersion)
299+
deschedulerMinor, err := strconv.ParseFloat(deschedulerVersionInfo.Minor, 64)
300300
if err != nil {
301-
return errors.New("failed to convert Descheduler minor version to float")
301+
return fmt.Errorf("failed to convert Descheduler minor version '%s' to float: %v", deschedulerVersionInfo.Minor, err)
302302
}
303303

304-
deschedulerMinor := float64(deschedulerVersion.Minor())
305-
serverMinor := float64(serverVersion.Minor())
306-
if math.Abs(deschedulerMinor-serverMinor) > 3 {
304+
kubeServerMinor := float64(kubeServerVersion.Minor())
305+
if math.Abs(deschedulerMinor-kubeServerMinor) > 3 {
307306
return fmt.Errorf(
308-
"descheduler version %v may not be supported on your version of Kubernetes %v."+
307+
"descheduler version %s.%s may not be supported on your version of Kubernetes %v."+
309308
"See compatibility docs for more info: https://github.com/kubernetes-sigs/descheduler#compatibility-matrix",
310-
deschedulerVersion.String(),
311-
serverVersionInfo.String(),
309+
deschedulerVersionInfo.Major,
310+
deschedulerVersionInfo.Minor,
311+
kubeServerVersionInfo.String(),
312312
)
313313
}
314314

pkg/descheduler/descheduler_test.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -300,44 +300,44 @@ func TestRootCancelWithNoInterval(t *testing.T) {
300300
func TestValidateVersionCompatibility(t *testing.T) {
301301
type testCase struct {
302302
name string
303-
deschedulerVersion string
303+
deschedulerVersion deschedulerversion.Info
304304
serverVersion string
305305
expectError bool
306306
}
307307
testCases := []testCase{
308308
{
309309
name: "no error when descheduler minor equals to server minor",
310-
deschedulerVersion: "v0.26",
310+
deschedulerVersion: deschedulerversion.Info{Major: "0", Minor: "26"},
311311
serverVersion: "v1.26.1",
312312
expectError: false,
313313
},
314314
{
315315
name: "no error when descheduler minor is 3 behind server minor",
316-
deschedulerVersion: "0.23",
316+
deschedulerVersion: deschedulerversion.Info{Major: "0", Minor: "23"},
317317
serverVersion: "v1.26.1",
318318
expectError: false,
319319
},
320320
{
321321
name: "no error when descheduler minor is 3 ahead of server minor",
322-
deschedulerVersion: "v0.26",
322+
deschedulerVersion: deschedulerversion.Info{Major: "0", Minor: "26"},
323323
serverVersion: "v1.26.1",
324324
expectError: false,
325325
},
326326
{
327327
name: "error when descheduler minor is 4 behind server minor",
328-
deschedulerVersion: "v0.22",
328+
deschedulerVersion: deschedulerversion.Info{Major: "0", Minor: "22"},
329329
serverVersion: "v1.26.1",
330330
expectError: true,
331331
},
332332
{
333333
name: "error when descheduler minor is 4 ahead of server minor",
334-
deschedulerVersion: "v0.27",
334+
deschedulerVersion: deschedulerversion.Info{Major: "0", Minor: "27"},
335335
serverVersion: "v1.23.1",
336336
expectError: true,
337337
},
338338
{
339339
name: "no error when using managed provider version",
340-
deschedulerVersion: "v0.25",
340+
deschedulerVersion: deschedulerversion.Info{Major: "0", Minor: "25"},
341341
serverVersion: "v1.25.12-eks-2d98532",
342342
expectError: false,
343343
},
@@ -347,8 +347,7 @@ func TestValidateVersionCompatibility(t *testing.T) {
347347
for _, tc := range testCases {
348348
t.Run(tc.name, func(t *testing.T) {
349349
fakeDiscovery.FakedServerVersion = &apiversion.Info{GitVersion: tc.serverVersion}
350-
deschedulerVersion := deschedulerversion.Info{GitVersion: tc.deschedulerVersion}
351-
err := validateVersionCompatibility(fakeDiscovery, deschedulerVersion)
350+
err := validateVersionCompatibility(fakeDiscovery, tc.deschedulerVersion)
352351

353352
hasError := err != nil
354353
if tc.expectError != hasError {

pkg/version/version_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package version
2+
3+
import (
4+
"testing"
5+
6+
"github.com/google/go-cmp/cmp"
7+
"github.com/google/go-cmp/cmp/cmpopts"
8+
)
9+
10+
func TestGet(t *testing.T) {
11+
tests := []struct {
12+
name string
13+
version string
14+
want Info
15+
}{
16+
{
17+
name: "parses automated container release tag",
18+
version: "v20240519-v0.30.0",
19+
want: Info{
20+
Major: "0",
21+
Minor: "30.0",
22+
GitVersion: "v20240519-v0.30.0",
23+
},
24+
},
25+
{
26+
name: "parses automated container build",
27+
version: "v20240520-v0.30.0-5-g79990946",
28+
want: Info{
29+
Major: "0",
30+
Minor: "30.0",
31+
GitVersion: "v20240520-v0.30.0-5-g79990946",
32+
},
33+
},
34+
{
35+
name: "parses helm release tag",
36+
version: "v20240606-descheduler-helm-chart-0.30.0-18-g8714397b",
37+
want: Info{
38+
Major: "0",
39+
Minor: "30.0",
40+
GitVersion: "v20240606-descheduler-helm-chart-0.30.0-18-g8714397b",
41+
},
42+
},
43+
}
44+
ignoreRuntimeFields := cmpopts.IgnoreFields(Info{}, "GoVersion", "Compiler", "Platform")
45+
for _, tt := range tests {
46+
version = tt.version
47+
t.Run(tt.name, func(t *testing.T) {
48+
got := Get()
49+
if diff := cmp.Diff(got, tt.want, ignoreRuntimeFields); diff != "" {
50+
t.Errorf("Get (-want, +got):\n%s", diff)
51+
}
52+
})
53+
}
54+
}

vendor/github.com/google/go-cmp/cmp/cmpopts/equate.go

Lines changed: 185 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)