Skip to content

Commit e51de37

Browse files
committed
fix: remote helmfile from git::ssh source
The remote helmfile feature introduced by #648 was unable to be sourced from private git repositories due to URL parsing issue in helmfile. This fixes that. Ref #469 (comment)
1 parent cfe309e commit e51de37

File tree

2 files changed

+82
-6
lines changed

2 files changed

+82
-6
lines changed

pkg/remote/remote.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ func (e InvalidURLError) Error() string {
100100
}
101101

102102
type Source struct {
103-
Getter, Scheme, Host, Dir, File, RawQuery string
103+
Getter, Scheme, User, Host, Dir, File, RawQuery string
104104
}
105105

106106
func IsRemote(goGetterSrc string) bool {
@@ -135,6 +135,7 @@ func Parse(goGetterSrc string) (*Source, error) {
135135

136136
return &Source{
137137
Getter: getter,
138+
User: u.User.String(),
138139
Scheme: u.Scheme,
139140
Host: u.Host,
140141
Dir: pathComponents[0],
@@ -154,6 +155,7 @@ func (r *Remote) Fetch(goGetterSrc string) (string, error) {
154155

155156
r.Logger.Debugf("getter: %s", u.Getter)
156157
r.Logger.Debugf("scheme: %s", u.Scheme)
158+
r.Logger.Debugf("user: %s", u.User)
157159
r.Logger.Debugf("host: %s", u.Host)
158160
r.Logger.Debugf("dir: %s", u.Dir)
159161
r.Logger.Debugf("file: %s", u.File)
@@ -195,11 +197,14 @@ func (r *Remote) Fetch(goGetterSrc string) (string, error) {
195197

196198
if !cached {
197199
var getterSrc string
198-
199-
if len(query) == 0 {
200-
getterSrc = srcDir
200+
if u.User != "" {
201+
getterSrc = fmt.Sprintf("%s://%s@%s%s", u.Scheme, u.User, u.Host, u.Dir)
201202
} else {
202-
getterSrc = strings.Join([]string{srcDir, query}, "?")
203+
getterSrc = fmt.Sprintf("%s://%s%s", u.Scheme, u.Host, u.Dir)
204+
}
205+
206+
if len(query) > 0 {
207+
getterSrc = strings.Join([]string{getterSrc, query}, "?")
203208
}
204209

205210
if u.Getter != "" {

pkg/remote/remote_test.go

+72-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"testing"
99
)
1010

11-
func TestRemote(t *testing.T) {
11+
func TestRemote_HttpsGitHub(t *testing.T) {
1212
cleanfs := map[string]string{
1313
"path/to/home": "",
1414
}
@@ -85,6 +85,77 @@ func TestRemote(t *testing.T) {
8585
}
8686
}
8787

88+
func TestRemote_SShGitHub(t *testing.T) {
89+
cleanfs := map[string]string{
90+
"path/to/home": "",
91+
}
92+
cachefs := map[string]string{
93+
"path/to/home/.helmfile/cache/ssh_github_com_cloudposse_helmfiles_git.ref=0.40.0/releases/kiam.yaml": "foo: bar",
94+
}
95+
96+
type testcase struct {
97+
files map[string]string
98+
expectCacheHit bool
99+
}
100+
101+
testcases := []testcase{
102+
{files: cleanfs, expectCacheHit: false},
103+
{files: cachefs, expectCacheHit: true},
104+
}
105+
106+
for i := range testcases {
107+
testcase := testcases[i]
108+
109+
t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) {
110+
testfs := testhelper.NewTestFs(testcase.files)
111+
112+
hit := true
113+
114+
get := func(wd, src, dst string) error {
115+
if wd != "path/to/home" {
116+
return fmt.Errorf("unexpected wd: %s", wd)
117+
}
118+
if src != "git::ssh://[email protected]/cloudposse/helmfiles.git?ref=0.40.0" {
119+
return fmt.Errorf("unexpected src: %s", src)
120+
}
121+
122+
hit = false
123+
124+
return nil
125+
}
126+
127+
getter := &testGetter{
128+
get: get,
129+
}
130+
remote := &Remote{
131+
Logger: helmexec.NewLogger(os.Stderr, "debug"),
132+
Home: "path/to/home",
133+
Getter: getter,
134+
ReadFile: testfs.ReadFile,
135+
FileExists: testfs.FileExistsAt,
136+
DirExists: testfs.DirectoryExistsAt,
137+
}
138+
139+
url := "git::ssh://[email protected]/cloudposse/helmfiles.git@releases/kiam.yaml?ref=0.40.0"
140+
file, err := remote.Locate(url)
141+
if err != nil {
142+
t.Fatalf("unexpected error: %v", err)
143+
}
144+
145+
if file != "path/to/home/.helmfile/cache/ssh_github_com_cloudposse_helmfiles_git.ref=0.40.0/releases/kiam.yaml" {
146+
t.Errorf("unexpected file located: %s", file)
147+
}
148+
149+
if testcase.expectCacheHit && !hit {
150+
t.Errorf("unexpected result: unexpected cache miss")
151+
}
152+
if !testcase.expectCacheHit && hit {
153+
t.Errorf("unexpected result: unexpected cache hit")
154+
}
155+
})
156+
}
157+
}
158+
88159
type testGetter struct {
89160
get func(wd, src, dst string) error
90161
}

0 commit comments

Comments
 (0)