Skip to content

Commit

Permalink
fix: absolute chart path (roboll#753)
Browse files Browse the repository at this point in the history
Resolves roboll#743
  • Loading branch information
mumoshu authored Jul 12, 2019
1 parent 4166b41 commit b2a6231
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 10 deletions.
42 changes: 42 additions & 0 deletions pkg/app/app_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1028,6 +1028,48 @@ x:
}
}

func TestVisitDesiredStatesWithReleasesFiltered_ChartAtAbsPath(t *testing.T) {
files := map[string]string{
"/path/to/helmfile.yaml": `
releases:
- name: myapp
chart: /path/to/mychart
`,
}

actual := []state.ReleaseSpec{}

collectReleases := func(st *state.HelmState, helm helmexec.Interface) []error {
for _, r := range st.Releases {
actual = append(actual, r)
}
return []error{}
}
app := appWithFs(&App{
KubeContext: "default",
Logger: helmexec.NewLogger(os.Stderr, "debug"),
Reverse: false,
Namespace: "",
Env: "default",
Selectors: []string{},
}, files)
err := app.VisitDesiredStatesWithReleasesFiltered(
"helmfile.yaml", collectReleases,
)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if len(actual) != 1 {
t.Errorf("unexpected number of processed releases: expected=1, got=%d", len(actual))
}
if actual[0].Name != "myapp" {
t.Errorf("unexpected name: expected=%s, got=%s", "myapp", actual[0].Name)
}
if actual[0].Chart != "/path/to/mychart" {
t.Errorf("unexpected chart: expected=%s, got=%s", "/path/to/mychart", actual[0].Chart)
}
}

func TestVisitDesiredStatesWithReleasesFiltered_RemoteTgzAsChart(t *testing.T) {
testcases := []struct {
expr, env, expected string
Expand Down
10 changes: 0 additions & 10 deletions pkg/state/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -1092,16 +1092,6 @@ func (st *HelmState) BuildDeps(helm helmexec.Interface) []error {
return nil
}

// normalizeChart allows for the distinction between a file path reference and repository references.
// - Any single (or double character) followed by a `/` will be considered a local file reference and
// be constructed relative to the `base path`.
// - Everything else is assumed to be an absolute path or an actual <repository>/<chart> reference.
func normalizeChart(basePath, chart string) string {
if !isLocalChart(chart) {
return chart
}
return filepath.Join(basePath, chart)
}
func pathExists(chart string) bool {
_, err := os.Stat(chart)
return err == nil
Expand Down
12 changes: 12 additions & 0 deletions pkg/state/util.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package state

import (
"path/filepath"
"regexp"
"strings"
)
Expand Down Expand Up @@ -38,3 +39,14 @@ func resolveRemoteChart(repoAndChart string) (string, string, bool) {

return repo, chart, true
}

// normalizeChart allows for the distinction between a file path reference and repository references.
// - Any single (or double character) followed by a `/` will be considered a local file reference and
// be constructed relative to the `base path`.
// - Everything else is assumed to be an absolute path or an actual <repository>/<chart> reference.
func normalizeChart(basePath, chart string) string {
if !isLocalChart(chart) || chart[0] == '/' {
return chart
}
return filepath.Join(basePath, chart)
}
34 changes: 34 additions & 0 deletions pkg/state/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ func TestIsLocalChart(t *testing.T) {
input: "./charts/mysubsystem/myapp",
expected: true,
},
{
input: "/charts/mysubsystem/myapp",
expected: true,
},
{
// Regression test case for:
// * https://github.com/roboll/helmfile/issues/675
Expand Down Expand Up @@ -80,6 +84,10 @@ func TestResolveRemortChart(t *testing.T) {
input: "./charts/mysubsystem/myapp",
remote: false,
},
{
input: "/charts/mysubsystem/myapp",
remote: false,
},
{
// Regression test case for:
// * https://github.com/roboll/helmfile/issues/675
Expand Down Expand Up @@ -111,3 +119,29 @@ func TestResolveRemortChart(t *testing.T) {
}
}
}

func TestNormalizeChart(t *testing.T) {
testcases := []struct {
input string
expected string
}{
{
input: "mychart",
expected: "/path/to/mychart",
},
{
input: "/charts/mychart",
expected: "/charts/mychart",
},
}

for i := range testcases {
testcase := testcases[i]

actual := normalizeChart("/path/to", testcase.input)

if testcase.expected != actual {
t.Fatalf("unexpected result: normalizeChart(\"/path/to\", \"%s\"): expected=%v, got=%v", testcase.input, testcase.expected, actual)
}
}
}

0 comments on commit b2a6231

Please sign in to comment.