diff --git a/api/krusty/remoteload_test.go b/api/krusty/remoteload_test.go index 081c0c301..91998758d 100644 --- a/api/krusty/remoteload_test.go +++ b/api/krusty/remoteload_test.go @@ -77,6 +77,66 @@ spec: assert.NoError(t, fSys.RemoveAll(tmpDir.String())) } +func TestRemoteResourceGitHTTP(t *testing.T) { + output := `apiVersion: v1 +kind: Pod +metadata: + labels: + app: myapp + name: dev-myapp-pod +spec: + containers: + - image: nginx:1.7.9 + name: nginx +` + tests := []struct { + input []byte + }{ + { + input: []byte(` +resources: +- https://github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6 +`), + }, + { + input: []byte(` +resources: +- https://github.com/kubernetes-sigs/kustomize//examples/multibases/dev/?ref=v1.0.6 +`), + }, + { + input: []byte(` +resources: +- git::https://github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6 +`), + }, + { + input: []byte(` +resources: +- git::https://github.com/kubernetes-sigs/kustomize//examples/multibases/dev/?ref=v1.0.6 +`), + }, + } + + for _, test := range tests { + fSys := filesys.MakeFsOnDisk() + b := krusty.MakeKustomizer(krusty.MakeDefaultOptions()) + tmpDir, err := filesys.NewTmpConfirmedDir() + assert.NoError(t, err) + assert.NoError(t, fSys.WriteFile(filepath.Join(tmpDir.String(), "kustomization.yaml"), test.input)) + m, err := b.Run(fSys, tmpDir.String()) + if utils.IsErrTimeout(err) { + // Don't fail on timeouts. + t.SkipNow() + } + assert.NoError(t, err) + yml, err := m.AsYaml() + assert.NoError(t, err) + assert.Equal(t, output, string(yml)) + assert.NoError(t, fSys.RemoveAll(tmpDir.String())) + } +} + func TestRemoteResourceWithHTTPError(t *testing.T) { fSys := filesys.MakeFsOnDisk() b := krusty.MakeKustomizer(krusty.MakeDefaultOptions()) diff --git a/api/loader/fileloader.go b/api/loader/fileloader.go index 4426097cf..164560d40 100644 --- a/api/loader/fileloader.go +++ b/api/loader/fileloader.go @@ -4,6 +4,7 @@ package loader import ( + "errors" "fmt" "io/ioutil" "log" @@ -298,7 +299,7 @@ func (fl *fileLoader) errIfRepoCycle(newRepoSpec *git.RepoSpec) error { } // Load returns the content of file at the given path, -// else an error. Relative paths are taken relative +// else an error. Relative paths are taken relative // to the root. func (fl *fileLoader) Load(path string) ([]byte, error) { if u, err := url.Parse(path); err == nil && (u.Scheme == "http" || u.Scheme == "https") { @@ -314,6 +315,10 @@ func (fl *fileLoader) Load(path string) ([]byte, error) { } defer resp.Body.Close() if resp.StatusCode < 200 || resp.StatusCode > 299 { + _, err := git.NewRepoSpecFromUrl(path) + if err == nil { + return nil, errors.New("URL is a git repository") + } return nil, fmt.Errorf("%w: status code %d (%s)", ErrorHTTP, resp.StatusCode, http.StatusText(resp.StatusCode)) } body, err := ioutil.ReadAll(resp.Body)