From 76c6ca7faba6d5cf4c4dd423488916806ed367fd Mon Sep 17 00:00:00 2001 From: liz Date: Tue, 24 Jul 2018 14:20:40 -0400 Subject: [PATCH] Support GKE's weird 10+ versions Signed-off-by: liz --- cmd/sonobuoy/app/imageversion.go | 20 ++++++++++++++------ cmd/sonobuoy/app/imageversion_test.go | 21 ++++++++++++++++++++- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/cmd/sonobuoy/app/imageversion.go b/cmd/sonobuoy/app/imageversion.go index 314ce18b6..8ad97246e 100644 --- a/cmd/sonobuoy/app/imageversion.go +++ b/cmd/sonobuoy/app/imageversion.go @@ -55,10 +55,11 @@ func (c *ConformanceImageVersion) Set(str string) error { case ConformanceImageVersionLatest: *c = ConformanceImageVersionLatest default: - if err := validateVersion(str); err != nil { + version, err := validateVersion(str) + if err != nil { return err } - *c = ConformanceImageVersion(str) + *c = ConformanceImageVersion(version.String()) } return nil @@ -77,19 +78,25 @@ func (c *ConformanceImageVersion) Get(client discovery.ServerVersionInterface) ( return "", errors.Wrap(err, "couldn't retrieve server version") } - if err := validateVersion(version.GitVersion); err != nil { + parsedVersion, err := validateVersion(version.GitVersion) + if err != nil { return "", err } + segments := parsedVersion.Segments() + if len(segments) < 2 { + return "", fmt.Errorf("version %q only has %d segments, need at least 2", version.GitVersion, len(segments)) + } + // NOTE: Until the kube-conformance container is pushed upstream we can't // guarantee alignment with exact versioning see https://github.com/heptio/kube-conformance/issues/25 // for more details - return fmt.Sprintf("v%s.%s", version.Major, version.Minor), nil + return fmt.Sprintf("v%d.%d", segments[0], segments[1]), nil } return string(*c), nil } -func validateVersion(v string) error { +func validateVersion(v string) (*version.Version, error) { version, err := version.NewVersion(v) if err == nil { if version.Metadata() != "" || version.Prerelease() != "" { @@ -98,5 +105,6 @@ func validateVersion(v string) error { err = errors.New("version must start with v") } } - return errors.Wrapf(err, "version %q is invalid", v) + + return version, errors.Wrapf(err, "version %q is invalid", v) } diff --git a/cmd/sonobuoy/app/imageversion_test.go b/cmd/sonobuoy/app/imageversion_test.go index f02d1ddea..c09b79b70 100644 --- a/cmd/sonobuoy/app/imageversion_test.go +++ b/cmd/sonobuoy/app/imageversion_test.go @@ -70,6 +70,11 @@ func TestSetConformanceImageVersion(t *testing.T) { version: "v1.11.0-beta.2.78+e0b33dbc2bde88", error: false, }, + { + name: "version with plus", + version: "v1.10+", + error: true, + }, } for _, test := range tests { @@ -106,6 +111,14 @@ func TestGetConformanceImageVersion(t *testing.T) { }, } + gkeServerVersion := &fakeServerVersionInterface{ + version: version.Info{ + Major: "1", + Minor: "10+", + GitVersion: "v1.10.5-gke.3", + }, + } + brokenServerVersion := &fakeServerVersionInterface{ err: errors.New("can't connect"), } @@ -131,12 +144,18 @@ func TestGetConformanceImageVersion(t *testing.T) { error: true, }, { - name: "beta server version throws error", + name: "beta server version throws warning", version: "auto", serverVersion: betaServerVersion, warning: true, expected: "v1.11", }, + { + name: "gke server strips plus sign", + version: "auto", + serverVersion: gkeServerVersion, + expected: "v1.10", + }, { name: "set version ignores server version", version: "v1.10.2",