Skip to content

Commit

Permalink
fix(admin) handle minor number versioning scheme for Kong Enterprise
Browse files Browse the repository at this point in the history
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
  • Loading branch information
fffonion authored and hbagdi committed Sep 26, 2018
1 parent de9e38c commit 4f3a244
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 15 deletions.
36 changes: 21 additions & 15 deletions internal/apis/admin/kong_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"encoding/json"
"fmt"
"regexp"
"strings"

"github.com/blang/semver"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand Down Expand Up @@ -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()
Expand All @@ -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")
Expand Down
38 changes: 38 additions & 0 deletions internal/apis/admin/kong_client_test.go
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 4f3a244

Please sign in to comment.