fix: remote helmfile from git::ssh source (#719)

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 https://github.com/roboll/helmfile/issues/469#issuecomment-505236600
This commit is contained in:
KUOKA Yusuke 2019-06-25 12:45:56 +09:00 committed by GitHub
parent b6a04d012c
commit e6bb8282db
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 82 additions and 6 deletions

View File

@ -100,7 +100,7 @@ func (e InvalidURLError) Error() string {
} }
type Source struct { type Source struct {
Getter, Scheme, Host, Dir, File, RawQuery string Getter, Scheme, User, Host, Dir, File, RawQuery string
} }
func IsRemote(goGetterSrc string) bool { func IsRemote(goGetterSrc string) bool {
@ -135,6 +135,7 @@ func Parse(goGetterSrc string) (*Source, error) {
return &Source{ return &Source{
Getter: getter, Getter: getter,
User: u.User.String(),
Scheme: u.Scheme, Scheme: u.Scheme,
Host: u.Host, Host: u.Host,
Dir: pathComponents[0], Dir: pathComponents[0],
@ -154,6 +155,7 @@ func (r *Remote) Fetch(goGetterSrc string) (string, error) {
r.Logger.Debugf("getter: %s", u.Getter) r.Logger.Debugf("getter: %s", u.Getter)
r.Logger.Debugf("scheme: %s", u.Scheme) r.Logger.Debugf("scheme: %s", u.Scheme)
r.Logger.Debugf("user: %s", u.User)
r.Logger.Debugf("host: %s", u.Host) r.Logger.Debugf("host: %s", u.Host)
r.Logger.Debugf("dir: %s", u.Dir) r.Logger.Debugf("dir: %s", u.Dir)
r.Logger.Debugf("file: %s", u.File) r.Logger.Debugf("file: %s", u.File)
@ -195,11 +197,14 @@ func (r *Remote) Fetch(goGetterSrc string) (string, error) {
if !cached { if !cached {
var getterSrc string var getterSrc string
if u.User != "" {
if len(query) == 0 { getterSrc = fmt.Sprintf("%s://%s@%s%s", u.Scheme, u.User, u.Host, u.Dir)
getterSrc = srcDir
} else { } else {
getterSrc = strings.Join([]string{srcDir, query}, "?") getterSrc = fmt.Sprintf("%s://%s%s", u.Scheme, u.Host, u.Dir)
}
if len(query) > 0 {
getterSrc = strings.Join([]string{getterSrc, query}, "?")
} }
if u.Getter != "" { if u.Getter != "" {

View File

@ -8,7 +8,7 @@ import (
"testing" "testing"
) )
func TestRemote(t *testing.T) { func TestRemote_HttpsGitHub(t *testing.T) {
cleanfs := map[string]string{ cleanfs := map[string]string{
"path/to/home": "", "path/to/home": "",
} }
@ -85,6 +85,77 @@ func TestRemote(t *testing.T) {
} }
} }
func TestRemote_SShGitHub(t *testing.T) {
cleanfs := map[string]string{
"path/to/home": "",
}
cachefs := map[string]string{
"path/to/home/.helmfile/cache/ssh_github_com_cloudposse_helmfiles_git.ref=0.40.0/releases/kiam.yaml": "foo: bar",
}
type testcase struct {
files map[string]string
expectCacheHit bool
}
testcases := []testcase{
{files: cleanfs, expectCacheHit: false},
{files: cachefs, expectCacheHit: true},
}
for i := range testcases {
testcase := testcases[i]
t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) {
testfs := testhelper.NewTestFs(testcase.files)
hit := true
get := func(wd, src, dst string) error {
if wd != "path/to/home" {
return fmt.Errorf("unexpected wd: %s", wd)
}
if src != "git::ssh://git@github.com/cloudposse/helmfiles.git?ref=0.40.0" {
return fmt.Errorf("unexpected src: %s", src)
}
hit = false
return nil
}
getter := &testGetter{
get: get,
}
remote := &Remote{
Logger: helmexec.NewLogger(os.Stderr, "debug"),
Home: "path/to/home",
Getter: getter,
ReadFile: testfs.ReadFile,
FileExists: testfs.FileExistsAt,
DirExists: testfs.DirectoryExistsAt,
}
url := "git::ssh://git@github.com/cloudposse/helmfiles.git@releases/kiam.yaml?ref=0.40.0"
file, err := remote.Locate(url)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if file != "path/to/home/.helmfile/cache/ssh_github_com_cloudposse_helmfiles_git.ref=0.40.0/releases/kiam.yaml" {
t.Errorf("unexpected file located: %s", file)
}
if testcase.expectCacheHit && !hit {
t.Errorf("unexpected result: unexpected cache miss")
}
if !testcase.expectCacheHit && hit {
t.Errorf("unexpected result: unexpected cache hit")
}
})
}
}
type testGetter struct { type testGetter struct {
get func(wd, src, dst string) error get func(wd, src, dst string) error
} }