Skip to content

Commit 31350db

Browse files
authored
Use GitVersion to parse version from discovery (#2312)
In some cases, the discovery client can return a kube server version with the minor version field as a non uint value. To properly parse the value and get all version fields correctly, instead directly parse the GitVersion string for all values of the kube server version
1 parent 4fc476f commit 31350db

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

pkg/lib/catalogsource/image_template.go

+10-9
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import (
77
"strings"
88
"sync"
99

10-
"github.com/blang/semver/v4"
1110
"github.com/sirupsen/logrus"
11+
versionutil "k8s.io/apimachinery/pkg/util/version"
1212
"k8s.io/apimachinery/pkg/version"
1313

1414
"github.com/operator-framework/api/pkg/operators/v1alpha1"
@@ -171,14 +171,15 @@ func UpdateKubeVersion(serverVersion *version.Info, logger *logrus.Logger) {
171171
return
172172
}
173173

174-
templateNameToReplacementValuesMap[TemplKubeMajorV] = serverVersion.Major
175-
templateNameToReplacementValuesMap[TemplKubeMinorV] = serverVersion.Minor
176-
177-
// api server does not explicitly give patch value, so we have to resort to parsing the git version
178-
serverGitVersion, err := semver.Parse(serverVersion.GitVersion)
174+
// need to use the gitversion from version.info.String() because minor version is not always Uint value
175+
// and patch version is not returned as a first class field
176+
semver, err := versionutil.ParseSemantic(serverVersion.String())
179177
if err != nil {
180-
templateNameToReplacementValuesMap[TemplKubePatchV] = strconv.FormatUint(serverGitVersion.Patch, 10)
181-
} else {
182-
logger.WithError(err).Warn("unable to obtain kube server patch value")
178+
logger.WithError(err).Error("unable to parse kube server version")
179+
return
183180
}
181+
182+
templateNameToReplacementValuesMap[TemplKubeMajorV] = strconv.FormatUint(uint64(semver.Major()), 10)
183+
templateNameToReplacementValuesMap[TemplKubeMinorV] = strconv.FormatUint(uint64(semver.Minor()), 10)
184+
templateNameToReplacementValuesMap[TemplKubePatchV] = strconv.FormatUint(uint64(semver.Patch()), 10)
184185
}

pkg/lib/catalogsource/image_template_test.go

+19
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ func TestImageTemplateFlow(t *testing.T) {
5858
GitVersion: "v1.20.0+bd9e442",
5959
}
6060

61+
serverVersionNonReleaseBuild := version.Info{
62+
Major: "1",
63+
Minor: "20+",
64+
GitVersion: "v1.20.1+bd9e442",
65+
}
66+
6167
var table = []struct {
6268
description string // description of test case
6369
catsrc v1alpha1.CatalogSource // fake catalog source for testing
@@ -124,6 +130,19 @@ func TestImageTemplateFlow(t *testing.T) {
124130
expectedCatalogTemplate: "foo/v{foobar}",
125131
expectedUnresolvedTemplates: []string{},
126132
},
133+
{
134+
description: "multiple kube image template with patch and nonrelease build version",
135+
catsrc: v1alpha1.CatalogSource{
136+
ObjectMeta: v1.ObjectMeta{
137+
Annotations: map[string]string{
138+
CatalogImageTemplateAnnotation: fmt.Sprintf("foo/v%s.%s.%s", TemplKubeMajorV, TemplKubeMinorV, TemplKubePatchV),
139+
},
140+
},
141+
},
142+
serverVersion: &serverVersionNonReleaseBuild,
143+
expectedCatalogTemplate: "foo/v1.20.1",
144+
expectedUnresolvedTemplates: []string{},
145+
},
127146
}
128147

129148
logger := logrus.New()

0 commit comments

Comments
 (0)