From c0dc68d6e792a53180e6cec018f4bebc15d13118 Mon Sep 17 00:00:00 2001 From: Anna Song Date: Tue, 3 May 2022 13:53:03 -0700 Subject: [PATCH] Add url tests Write comprehensive suite of integration tests for remote resources, as specified by Issue #4588 --- .../builtins/AnnotationsTransformer.go | 5 +- api/krusty/remoteload_test.go | 387 ++++++++++++------ 2 files changed, 256 insertions(+), 136 deletions(-) diff --git a/api/internal/builtins/AnnotationsTransformer.go b/api/internal/builtins/AnnotationsTransformer.go index c84c0d186..7064fa80c 100644 --- a/api/internal/builtins/AnnotationsTransformer.go +++ b/api/internal/builtins/AnnotationsTransformer.go @@ -1,8 +1,6 @@ // Code generated by pluginator on AnnotationsTransformer; DO NOT EDIT. // pluginator {unknown 1970-01-01T00:00:00Z } - - package builtins import ( @@ -18,7 +16,6 @@ type AnnotationsTransformerPlugin struct { FieldSpecs []types.FieldSpec `json:"fieldSpecs,omitempty" yaml:"fieldSpecs,omitempty"` } - func (p *AnnotationsTransformerPlugin) Config( _ *resmap.PluginHelpers, c []byte) (err error) { p.Annotations = nil @@ -37,5 +34,5 @@ func (p *AnnotationsTransformerPlugin) Transform(m resmap.ResMap) error { } func NewAnnotationsTransformerPlugin() resmap.TransformerPlugin { - return &AnnotationsTransformerPlugin{} + return &AnnotationsTransformerPlugin{} } diff --git a/api/krusty/remoteload_test.go b/api/krusty/remoteload_test.go index 91998758d..7e5efc2cb 100644 --- a/api/krusty/remoteload_test.go +++ b/api/krusty/remoteload_test.go @@ -9,6 +9,8 @@ import ( "path/filepath" "testing" + "sigs.k8s.io/kustomize/api/resmap" + "github.com/stretchr/testify/assert" "sigs.k8s.io/kustomize/api/internal/utils" "sigs.k8s.io/kustomize/api/krusty" @@ -16,69 +18,7 @@ import ( "sigs.k8s.io/kustomize/kyaml/filesys" ) -func TestRemoteLoad(t *testing.T) { - fSys := filesys.MakeFsOnDisk() - b := krusty.MakeKustomizer(krusty.MakeDefaultOptions()) - m, err := b.Run( - fSys, - "github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6") - if utils.IsErrTimeout(err) { - // Don't fail on timeouts. - t.SkipNow() - } - if !assert.NoError(t, err) { - t.FailNow() - } - yml, err := m.AsYaml() - assert.NoError(t, err) - assert.Equal(t, `apiVersion: v1 -kind: Pod -metadata: - labels: - app: myapp - name: dev-myapp-pod -spec: - containers: - - image: nginx:1.7.9 - name: nginx -`, string(yml)) -} - -func TestRemoteResource(t *testing.T) { - 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"), []byte(` -resources: -- github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6 -`))) - 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, `apiVersion: v1 -kind: Pod -metadata: - labels: - app: myapp - name: dev-myapp-pod -spec: - containers: - - image: nginx:1.7.9 - name: nginx -`, string(yml)) - assert.NoError(t, fSys.RemoveAll(tmpDir.String())) -} - -func TestRemoteResourceGitHTTP(t *testing.T) { - output := `apiVersion: v1 +const multibaseDevExampleBuild = `apiVersion: v1 kind: Pod metadata: labels: @@ -89,55 +29,253 @@ spec: - image: nginx:1.7.9 name: nginx ` - tests := []struct { - input []byte - }{ - { - input: []byte(` + +type remoteResourceCase struct { + skip bool + kustomization string +} + +func createKusDir(content string, assert *assert.Assertions) (filesys.FileSystem, filesys.ConfirmedDir) { + fSys := filesys.MakeFsOnDisk() + tmpDir, err := filesys.NewTmpConfirmedDir() + assert.NoError(err) + assert.NoError(fSys.WriteFile(filepath.Join(tmpDir.String(), "kustomization.yaml"), []byte(content))) + return fSys, tmpDir +} + +func checkYaml(actual resmap.ResMap, expected string, assert *assert.Assertions) { + yml, err := actual.AsYaml() + assert.NoError(err) + assert.Equal(expected, string(yml)) +} + +func testRemoteResource(assert *assert.Assertions, kustomization string, expected string) { + fSys, tmpDir := createKusDir(kustomization, assert) + + b := krusty.MakeKustomizer(krusty.MakeDefaultOptions()) + m, err := b.Run( + fSys, + tmpDir.String()) + + assert.NoError(err) + checkYaml(m, expected, assert) + + assert.NoError(fSys.RemoveAll(tmpDir.String())) +} + +func TestRemoteLoad(t *testing.T) { + assert := assert.New(t) + + fSys := filesys.MakeFsOnDisk() + b := krusty.MakeKustomizer(krusty.MakeDefaultOptions()) + + m, err := b.Run( + fSys, + "github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6") + assert.NoError(err) + checkYaml(m, multibaseDevExampleBuild, assert) +} + +func TestRemoteResourceHttps(t *testing.T) { + tests := map[string]remoteResourceCase{ + "basic": { + kustomization: ` resources: -- https://github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6 -`), +- https://github.com/kubernetes-sigs/kustomize//examples/multibases/dev/?ref=v1.0.6`, }, - { - input: []byte(` + ".git repo suffix, no slash suffix": { + kustomization: ` resources: -- https://github.com/kubernetes-sigs/kustomize//examples/multibases/dev/?ref=v1.0.6 -`), +- https://github.com/kubernetes-sigs/kustomize.git//examples/multibases/dev?ref=v1.0.6`, }, - { - input: []byte(` + "repo": { + kustomization: ` resources: -- git::https://github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6 -`), +- https://github.com/annasong20/kustomize-test.git?ref=main`, }, - { - input: []byte(` + "raw remote file": { + kustomization: ` resources: -- git::https://github.com/kubernetes-sigs/kustomize//examples/multibases/dev/?ref=v1.0.6 -`), +- https://raw.githubusercontent.com/kubernetes-sigs/kustomize/v3.1.0/examples/multibases/base/pod.yaml +namePrefix: dev-`, }, } - 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() + for name, test := range tests { + test := test + if !test.skip { + t.Run(name, func(t *testing.T) { + testRemoteResource(assert.New(t), test.kustomization, multibaseDevExampleBuild) + }) } - 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) { +func TestRemoteResourceSsh(t *testing.T) { + tests := map[string]remoteResourceCase{ + "scp shorthand": { + kustomization: ` +resources: +- git@github.com:kubernetes-sigs/kustomize//examples/multibases/dev/?ref=v1.0.6`, + }, + "full ssh, no ending slash": { + kustomization: ` +resources: +- ssh://git@github.com/kubernetes-sigs/kustomize//examples/multibases/dev?ref=v1.0.6`, + }, + "repo": { + kustomization: ` +resources: +- ssh://git@github.com/annasong20/kustomize-test.git?ref=main`, + }, + } + + for name, test := range tests { + test := test + if !test.skip { + t.Run(name, func(t *testing.T) { + testRemoteResource(assert.New(t), test.kustomization, multibaseDevExampleBuild) + }) + } + } +} + +func TestRemoteResourcePort(t *testing.T) { + tests := map[string]remoteResourceCase{ + "https": { + skip: true, // timeout + kustomization: ` +resources: +- https://github.com:443/kubernetes-sigs/kustomize//examples/multibases/dev/?ref=v1.0.6`, + }, + "ssh": { + skip: true, // error + kustomization: ` +resources: +- ssh://git@github.com:22/kubernetes-sigs/kustomize//examples/multibases/dev/?ref=v1.0.6`, + }, + } + for name, test := range tests { + test := test + if !test.skip { + t.Run(name, func(t *testing.T) { + testRemoteResource(assert.New(t), test.kustomization, multibaseDevExampleBuild) + }) + } + } +} + +func TestRemoteResourceRepo(t *testing.T) { + tests := map[string]remoteResourceCase{ + "https, no ref": { + kustomization: ` +resources: +- https://github.com/annasong20/kustomize-test.git`, + }, + "ssh, no ref": { + kustomization: ` +resources: +- git@github.com:annasong20/kustomize-test.git`, + }, + } + + for name, test := range tests { + test := test + if !test.skip { + t.Run(name, func(t *testing.T) { + testRemoteResource(assert.New(t), test.kustomization, multibaseDevExampleBuild) + }) + } + } +} + +func TestRemoteResourceParameters(t *testing.T) { + tests := map[string]remoteResourceCase{ + "https no params": { + skip: true, // timeout + kustomization: ` +resources: +- https://github.com/kubernetes-sigs/kustomize//examples/multibases/dev/`, + }, + "https master": { + skip: true, // timeout + kustomization: ` +resources: +- https://github.com/kubernetes-sigs/kustomize//examples/multibases/dev?ref=master`, + }, + "https master and no submodules": { + kustomization: ` +resources: +- https://github.com/kubernetes-sigs/kustomize//examples/multibases/dev?ref=master&submodules=false`, + }, + "https all params": { + kustomization: ` +resources: +- https://github.com/kubernetes-sigs/kustomize//examples/multibases/dev?ref=v1.0.6&timeout=10&submodules=true`, + }, + "ssh no params": { + skip: true, // timeout + kustomization: ` +resources: +- git@github.com:kubernetes-sigs/kustomize//examples/multibases/dev`, + }, + "ssh all params": { + kustomization: ` +resources: +- ssh://git@github.com/annasong20/kustomize-test.git?ref=main&timeout=10&submodules=true`, + }, + } + + for name, test := range tests { + test := test + if !test.skip { + t.Run(name, func(t *testing.T) { + testRemoteResource(assert.New(t), test.kustomization, multibaseDevExampleBuild) + }) + } + } +} + +func TestRemoteResourceGoGetter(t *testing.T) { + tests := map[string]remoteResourceCase{ + "git detector with / subdirectory separator": { + kustomization: ` +resources: +- github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6`, + }, + "git detector for repo": { + kustomization: ` +resources: +- github.com/annasong20/kustomize-test`, + }, + "https with / subdirectory separator": { + kustomization: ` +resources: +- https://github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6`, + }, + "git forced protocol": { + kustomization: ` +resources: +- git::https://github.com/kubernetes-sigs/kustomize//examples/multibases/dev/?ref=v1.0.6`, + }, + "git forced protocol with / subdirectory separator": { + kustomization: ` +resources: +- git::https://github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6`, + }, + } + + for name, test := range tests { + test := test + if !test.skip { + t.Run(name, func(t *testing.T) { + testRemoteResource(assert.New(t), test.kustomization, multibaseDevExampleBuild) + }) + } + } +} + +func TestRemoteResourceWithHttpError(t *testing.T) { fSys := filesys.MakeFsOnDisk() b := krusty.MakeKustomizer(krusty.MakeDefaultOptions()) tmpDir, err := filesys.NewTmpConfirmedDir() @@ -163,26 +301,12 @@ resources: } func TestRemoteResourceAnnoOrigin(t *testing.T) { - 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"), []byte(` + kustomization := ` resources: - github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6 buildMetadata: [originAnnotations] -`))) - 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, `apiVersion: v1 +` + expected := `apiVersion: v1 kind: Pod metadata: annotations: @@ -197,24 +321,26 @@ spec: containers: - image: nginx:1.7.9 name: nginx -`, string(yml)) - assert.NoError(t, fSys.RemoveAll(tmpDir.String())) +` + testRemoteResource(assert.New(t), kustomization, expected) } func TestRemoteResourceAsBaseWithAnnoOrigin(t *testing.T) { + assert := assert.New(t) + fSys := filesys.MakeFsOnDisk() b := krusty.MakeKustomizer(krusty.MakeDefaultOptions()) tmpDir, err := filesys.NewTmpConfirmedDir() - assert.NoError(t, err) + assert.NoError(err) base := filepath.Join(tmpDir.String(), "base") prod := filepath.Join(tmpDir.String(), "prod") - assert.NoError(t, fSys.Mkdir(base)) - assert.NoError(t, fSys.Mkdir(prod)) - assert.NoError(t, fSys.WriteFile(filepath.Join(base, "kustomization.yaml"), []byte(` + assert.NoError(fSys.Mkdir(base)) + assert.NoError(fSys.Mkdir(prod)) + assert.NoError(fSys.WriteFile(filepath.Join(base, "kustomization.yaml"), []byte(` resources: - github.com/kubernetes-sigs/kustomize/examples/multibases/dev/?ref=v1.0.6 `))) - assert.NoError(t, fSys.WriteFile(filepath.Join(prod, "kustomization.yaml"), []byte(` + assert.NoError(fSys.WriteFile(filepath.Join(prod, "kustomization.yaml"), []byte(` resources: - ../base namePrefix: prefix- @@ -224,14 +350,9 @@ buildMetadata: [originAnnotations] m, err := b.Run( fSys, prod) - 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, `apiVersion: v1 + assert.NoError(err) + + expected := `apiVersion: v1 kind: Pod metadata: annotations: @@ -246,6 +367,8 @@ spec: containers: - image: nginx:1.7.9 name: nginx -`, string(yml)) - assert.NoError(t, fSys.RemoveAll(tmpDir.String())) +` + checkYaml(m, expected, assert) + + assert.NoError(fSys.RemoveAll(tmpDir.String())) }