Skip to content

Commit

Permalink
fix: incorrect tag selection in arkade chart upgrade
Browse files Browse the repository at this point in the history
Signed-off-by: Nana Kwadwo <[email protected]>
  • Loading branch information
bxffour committed Jun 30, 2023
1 parent 4a2c818 commit 114e9bb
Show file tree
Hide file tree
Showing 4 changed files with 152 additions and 9 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ gofmt:

.PHONY: test
test:
CGO_ENABLED=0 go test $(shell go list ./... | grep -v /vendor/|xargs echo) -cover
CGO_ENABLED=0 go test $(shell go list ./... | grep -v /vendor/|xargs echo) -run "!Test_ChartUpgrade" -cover

.PHONY: e2e
e2e:
Expand Down
36 changes: 32 additions & 4 deletions cmd/chart/upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,17 +92,20 @@ Otherwise, it returns a non-zero exit code and the updated values.yaml file.`,
return errors.New("unable to list tags for " + imageName)
}

current, err := semver.NewVersion(tag)
if err != nil {
return err
}

var vs []*semver.Version
for _, r := range ref {
v, err := semver.NewVersion(r)
if err == nil {
if err == nil && v.GreaterThan(current) {
vs = append(vs, v)
}
}

sort.Sort(sort.Reverse(semver.Collection(vs)))

latestTag := vs[0].String()
latestTag := getLatest(vs, current)

if latestTag != tag {
updated++
Expand Down Expand Up @@ -144,3 +147,28 @@ func splitImageName(reposName string) (string, string) {
nameParts := strings.SplitN(reposName, ":", 2)
return nameParts[0], nameParts[1]
}

func getLatest(vv []*semver.Version, current *semver.Version) string {
sort.Sort(sort.Reverse(semver.Collection(vv)))
hasRootless := strings.Contains(current.Prerelease(), "rootless")

if len(vv) == 0 {
return current.String()
}

latest := vv[0]
if latest.Prerelease() != "" {
for _, v := range vv {
if v.Prerelease() == "" {
latest = v
break
}
}
}

if hasRootless && !strings.Contains(latest.Prerelease(), "rootless") {
return latest.String() + "-rootless"
}

return latest.String()
}
97 changes: 97 additions & 0 deletions cmd/chart/upgrade_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package chart

import (
"os"
"testing"

"gopkg.in/yaml.v2"
)

type test struct {
name string
image string
expected string
}

func Test_ChartUpgrade(t *testing.T) {
tests := []test{
{
name: "builder_v11_rootless",
image: "moby/buildkit:v0.11.5-rootless",
expected: "moby/buildkit:v0.11.6-rootless",
},
{
name: "builder_v10_rootless",
image: "moby/buildkit:v0.10.0-rootless",
expected: "moby/buildkit:v0.11.6-rootless",
},
{
name: "builder_v8_no_rootless",
image: "moby/buildkit:v0.8.0",
expected: "moby/buildkit:v0.11.6",
},
{
name: "prom_Stable",
image: "prom/prometheus:v2.42.0",
expected: "prom/prometheus:v2.45.0",
},
{
name: "prom_Stable_v2_2",
image: "prom/prometheus:v2.2.0",
expected: "prom/prometheus:v2.45.0",
},
{
name: "prom_RC_To_Stable",
image: "prom/prometheus:v2.42.0-rc.2",
expected: "prom/prometheus:v2.45.0",
},
}

testFile, err := os.CreateTemp(os.TempDir(), "arkade_*.yml")
if err != nil {
t.Fatal(err)
}

defer os.Remove(testFile.Name())

testData := make(map[string]map[string]string)
for _, t := range tests {
testData[t.name] = map[string]string{"image": t.image}
}

yamlBytes, err := yaml.Marshal(testData)
if err != nil {
t.Fatal(err)
}

if _, err := testFile.Write(yamlBytes); err != nil {
t.Fatal(err)
}

cmd := MakeUpgrade()
cmd.SetArgs([]string{"--write", "--verbose", "--file", testFile.Name()})

if err := cmd.Execute(); err != nil {
t.Fatal(err)
}

yamlData, err := os.ReadFile(testFile.Name())
if err != nil {
t.Fatal(err)
}

var final map[string]map[string]string
err = yaml.Unmarshal(yamlData, &final)
if err != nil {
t.Fatal(err)
}

for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
got := final[tc.name]["image"]
if got != tc.expected {
t.Fatalf("expected: %s, got: %s", tc.expected, got)
}
})
}
}
26 changes: 22 additions & 4 deletions pkg/helm/io.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package helm

import (
"bufio"
"bytes"
"fmt"
"os"
"reflect"
"strings"
"regexp"

"gopkg.in/yaml.v2"
)
Expand Down Expand Up @@ -38,10 +40,26 @@ func ReplaceValuesInHelmValuesFile(values map[string]string, yamlPath string) (s
return "", err
}

fileContent := string(readFile)
for k, v := range values {
fileContent = strings.ReplaceAll(fileContent, k, v)
var buffer bytes.Buffer

scanner := bufio.NewScanner(bytes.NewReader(readFile))
for scanner.Scan() {
line := scanner.Text()

for k, v := range values {
re := regexp.MustCompile(`\b` + regexp.QuoteMeta(k) + `$`)
line = re.ReplaceAllString(line, v)
}

buffer.WriteString(line)
buffer.WriteByte('\n')
}

if err := scanner.Err(); err != nil {
return "", err
}

fileContent := buffer.String()
return fileContent, nil
}

Expand Down

0 comments on commit 114e9bb

Please sign in to comment.