Skip to content

Commit d5c71ad

Browse files
authored
Merge pull request #1100 from squeed/parse-semver
2 parents e82d996 + 587837e commit d5c71ad

File tree

5 files changed

+61
-18
lines changed

5 files changed

+61
-18
lines changed

go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ module github.com/containernetworking/cni
33
go 1.21
44

55
require (
6-
github.com/Masterminds/semver/v3 v3.2.1
76
github.com/onsi/ginkgo/v2 v2.19.0
87
github.com/onsi/gomega v1.33.1
98
github.com/vishvananda/netns v0.0.4

go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0=
2-
github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
31
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
42
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
53
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=

libcni/conf.go

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,10 @@ import (
2020
"fmt"
2121
"os"
2222
"path/filepath"
23+
"slices"
2324
"sort"
2425
"strings"
2526

26-
"github.com/Masterminds/semver/v3"
27-
2827
"github.com/containernetworking/cni/pkg/types"
2928
"github.com/containernetworking/cni/pkg/version"
3029
)
@@ -92,41 +91,46 @@ func ConfListFromBytes(bytes []byte) (*NetworkConfigList, error) {
9291
rawVersions, ok := rawList["cniVersions"]
9392
if ok {
9493
// Parse the current package CNI version
95-
currentVersion, err := semver.NewVersion(version.Current())
96-
if err != nil {
97-
panic("CNI version is invalid semver!")
98-
}
99-
10094
rvs, ok := rawVersions.([]interface{})
10195
if !ok {
10296
return nil, fmt.Errorf("error parsing configuration list: invalid type for cniVersions: %T", rvs)
10397
}
104-
vs := make([]*semver.Version, 0, len(rvs))
98+
vs := make([]string, 0, len(rvs))
10599
for i, rv := range rvs {
106100
v, ok := rv.(string)
107101
if !ok {
108102
return nil, fmt.Errorf("error parsing configuration list: invalid type for cniVersions index %d: %T", i, rv)
109103
}
110-
if v, err := semver.NewVersion(v); err != nil {
104+
gt, err := version.GreaterThan(v, version.Current())
105+
if err != nil {
111106
return nil, fmt.Errorf("error parsing configuration list: invalid cniVersions entry %s at index %d: %w", v, i, err)
112-
} else if !v.GreaterThan(currentVersion) {
107+
} else if !gt {
113108
// Skip versions "greater" than this implementation of the spec
114109
vs = append(vs, v)
115110
}
116111
}
117112

118113
// if cniVersion was already set, append it to the list for sorting.
119114
if cniVersion != "" {
120-
if v, err := semver.NewVersion(cniVersion); err != nil {
115+
gt, err := version.GreaterThan(cniVersion, version.Current())
116+
if err != nil {
121117
return nil, fmt.Errorf("error parsing configuration list: invalid cniVersion %s: %w", cniVersion, err)
122-
} else if !v.GreaterThan(currentVersion) {
118+
} else if !gt {
123119
// ignore any versions higher than the current implemented spec version
124-
vs = append(vs, v)
120+
vs = append(vs, cniVersion)
125121
}
126122
}
127-
sort.Sort(semver.Collection(vs))
123+
slices.SortFunc[[]string](vs, func(v1, v2 string) int {
124+
if v1 == v2 {
125+
return 0
126+
}
127+
if gt, _ := version.GreaterThan(v1, v2); gt {
128+
return 1
129+
}
130+
return -1
131+
})
128132
if len(vs) > 0 {
129-
cniVersion = vs[len(vs)-1].String()
133+
cniVersion = vs[len(vs)-1]
130134
}
131135
}
132136

pkg/version/plugin.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,3 +142,27 @@ func GreaterThanOrEqualTo(version, otherVersion string) (bool, error) {
142142
}
143143
return false, nil
144144
}
145+
146+
// GreaterThan returns true if the first version is greater than the second
147+
func GreaterThan(version, otherVersion string) (bool, error) {
148+
firstMajor, firstMinor, firstMicro, err := ParseVersion(version)
149+
if err != nil {
150+
return false, err
151+
}
152+
153+
secondMajor, secondMinor, secondMicro, err := ParseVersion(otherVersion)
154+
if err != nil {
155+
return false, err
156+
}
157+
158+
if firstMajor > secondMajor {
159+
return true, nil
160+
} else if firstMajor == secondMajor {
161+
if firstMinor > secondMinor {
162+
return true, nil
163+
} else if firstMinor == secondMinor && firstMicro > secondMicro {
164+
return true, nil
165+
}
166+
}
167+
return false, nil
168+
}

pkg/version/version_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,22 @@ var _ = Describe("Version operations", func() {
139139
Expect(conf.PrevResult).To(BeNil())
140140
})
141141
})
142+
143+
Context("version parsing", func() {
144+
It("parses versions correctly", func() {
145+
v1 := "1.1.0"
146+
v2 := "1.1.1"
147+
148+
check := func(a, b string, want bool) {
149+
GinkgoHelper()
150+
gt, err := version.GreaterThan(a, b)
151+
Expect(err).NotTo(HaveOccurred())
152+
Expect(gt).To(Equal(want))
153+
}
154+
155+
check(v1, v2, false)
156+
check(v2, v1, true)
157+
check(v2, v2, false)
158+
})
159+
})
142160
})

0 commit comments

Comments
 (0)