From 4f3a244d35b05dd37c3ebf46be023e7defb7207a Mon Sep 17 00:00:00 2001 From: Wangchong Zhou Date: Tue, 25 Sep 2018 19:14:00 -0700 Subject: [PATCH] fix(admin) handle minor number versioning scheme for Kong Enterprise Kong Enterprise follows a version scheme of `x.y-z` while Kong follow `x.y.z`. Both products have an `rc` or other meta appended without a `-`, which makes semver unhappy. For #141 --- internal/apis/admin/kong_client.go | 36 +++++++++++++---------- internal/apis/admin/kong_client_test.go | 38 +++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 internal/apis/admin/kong_client_test.go diff --git a/internal/apis/admin/kong_client.go b/internal/apis/admin/kong_client.go index d6879486f4..74fddc100e 100644 --- a/internal/apis/admin/kong_client.go +++ b/internal/apis/admin/kong_client.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "regexp" + "strings" "github.com/blang/semver" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -126,6 +127,25 @@ func (c *RestClient) Credentials() CredentialInterface { return &credentialAPI{c.RESTClient()} } +func fixVersion(v string) (semver.Version, error) { + // fix enterprise edition semver adding patch number + // fix enterprise edition version with dash + // fix bad version formats like 0.13.0preview1 + re := regexp.MustCompile(`(\d+\.\d+)(?:[\.-](\d+))?(?:\-?(.+)$|$)`) + m := re.FindStringSubmatch(v) + if len(m) != 4 { + return semver.Version{}, fmt.Errorf("Unknown Kong version") + } + if m[2] == "" { + m[2] = "0" + } + if m[3] != "" { + m[3] = "-" + strings.Replace(m[3], "enterprise-edition", "enterprise", 1) + } + v = fmt.Sprintf("%s.%s%s", m[1], m[2], m[3]) + return semver.Make(v) +} + func (c *RestClient) GetVersion() (semver.Version, error) { var info map[string]interface{} data, err := c.RESTClient().Get().RequestURI("/").DoRaw() @@ -137,21 +157,7 @@ func (c *RestClient) GetVersion() (semver.Version, error) { } if version, ok := info["version"]; ok { - v := version.(string) - - // fix enterprise edition semver adding patch number - re := regexp.MustCompile(`([\d\.]+)-enterprise-edition`) - if re.MatchString(v) { - v = re.ReplaceAllString(v, "$1.0-enterprise") - } - - // fix bad version formats like 0.13.0preview1 - re = regexp.MustCompile(`(.*\d)(preview.*|rc.*)`) - if re.MatchString(v) { - v = re.ReplaceAllString(v, "$1-$2") - } - - return semver.Make(v) + return fixVersion(version.(string)) } return semver.Version{}, fmt.Errorf("Unknown Kong version") diff --git a/internal/apis/admin/kong_client_test.go b/internal/apis/admin/kong_client_test.go new file mode 100644 index 0000000000..813df1bf38 --- /dev/null +++ b/internal/apis/admin/kong_client_test.go @@ -0,0 +1,38 @@ +package admin + +import ( + "testing" +) + +func TestFixVersion(t *testing.T) { + validVersions := map[string]string{ + "0.14.1": "0.14.1", + "0.14.2rc": "0.14.2-rc", + "0.14.2rc1": "0.14.2-rc1", + "0.14.2preview": "0.14.2-preview", + "0.14.2preview1": "0.14.2-preview1", + "0.33-enterprise-edition": "0.33.0-enterprise", + "0.33-1-enterprise-edition": "0.33.1-enterprise", + } + for inputVersion, expectedVersion := range validVersions { + v, err := fixVersion(inputVersion) + if err != nil { + t.Errorf("error converting %s: %v", inputVersion, err) + } else if v.String() != expectedVersion { + t.Errorf("converting %s, expecting %s, getting %s", inputVersion, expectedVersion, v.String()) + } + } + + invalidVersions := []string{ + "", + "0-1-1", + } + for _, inputVersion := range invalidVersions { + _, err := fixVersion(inputVersion) + if err == nil { + t.Errorf("expecting error converting %s, getting no errors", inputVersion) + } + } + + return +}