diff --git a/pkg/app/application_test.go b/pkg/app/application_test.go index 555f38111..077ccf185 100644 --- a/pkg/app/application_test.go +++ b/pkg/app/application_test.go @@ -19,6 +19,7 @@ package app import ( "encoding/base64" "reflect" + "strings" "testing" "github.com/kubernetes-sigs/kustomize/pkg/constants" @@ -197,6 +198,27 @@ func TestResources1(t *testing.T) { } } +func TestResourceNotFound(t *testing.T) { + l := loadertest.NewFakeLoader("/testpath") + err := l.AddFile("/testpath/"+constants.KustomizationFileName, []byte(kustomizationContent1)) + if err != nil { + t.Fatalf("Failed to setup fake ldr.") + } + fakeFs := fs.MakeFakeFS() + fakeFs.Mkdir("/") + app, err := NewApplication(l, fakeFs) + if err != nil { + t.Fatalf("Unexpected construction error %v", err) + } + _, err = app.MakeCustomizedResMap() + if err == nil { + t.Fatalf("Didn't get the expected error for an unknown resource") + } + if !strings.Contains(err.Error(), `cannot read file "/testpath/deployment.yaml"`) { + t.Fatalf("Unpexpected error message %q", err) + } +} + func TestRawResources1(t *testing.T) { expected := resmap.ResMap{ resource.NewResId(deploy, "dply1"): resource.NewResourceFromMap( diff --git a/pkg/resmap/resmap.go b/pkg/resmap/resmap.go index cb09a6d37..995c81e27 100644 --- a/pkg/resmap/resmap.go +++ b/pkg/resmap/resmap.go @@ -211,10 +211,14 @@ func newResourceSliceFromBytes(in []byte) ([]*resource.Resource, error) { return result, nil } -// MergeWithoutOverride combines multiple ResMap instances, failing on key collision. +// MergeWithoutOverride combines multiple ResMap instances, failing on key collision +// and skipping nil maps. In case if all of the maps are nil, an empty ResMap is returned. func MergeWithoutOverride(maps ...ResMap) (ResMap, error) { result := ResMap{} for _, m := range maps { + if m == nil { + continue + } for id, res := range m { if _, found := result[id]; found { return nil, fmt.Errorf("id '%q' already used", id) @@ -226,14 +230,21 @@ func MergeWithoutOverride(maps ...ResMap) (ResMap, error) { } // MergeWithOverride combines multiple ResMap instances, allowing and sometimes -// demanding certain collisions. +// demanding certain collisions and skipping nil maps. +// In case if all of the maps are nil, an empty ResMap is returned. // When looping over the instances to combine them, if a resource id for resource X // is found to be already in the combined map, then the behavior field for X // must be BehaviorMerge or BehaviorReplace. If X is not in the map, then it's // behavior cannot be merge or replace. func MergeWithOverride(maps ...ResMap) (ResMap, error) { result := maps[0] + if result == nil { + result = ResMap{} + } for _, m := range maps[1:] { + if m == nil { + continue + } for id, r := range m { matchedId := result.FindByGVKN(id) if len(matchedId) == 1 { diff --git a/pkg/resmap/resmap_test.go b/pkg/resmap/resmap_test.go index 774a32198..bba8c8c93 100644 --- a/pkg/resmap/resmap_test.go +++ b/pkg/resmap/resmap_test.go @@ -202,6 +202,22 @@ func TestMergeWithoutOverride(t *testing.T) { if !reflect.DeepEqual(merged, expected) { t.Fatalf("%#v doesn't equal expected %#v", merged, expected) } + input3 := []ResMap{merged, nil} + merged1, err := MergeWithoutOverride(input3...) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !reflect.DeepEqual(merged1, expected) { + t.Fatalf("%#v doesn't equal expected %#v", merged1, expected) + } + input4 := []ResMap{nil, merged} + merged2, err := MergeWithoutOverride(input4...) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !reflect.DeepEqual(merged2, expected) { + t.Fatalf("%#v doesn't equal expected %#v", merged2, expected) + } } func TestMergeWithOverride(t *testing.T) { @@ -262,4 +278,20 @@ func TestMergeWithOverride(t *testing.T) { if !reflect.DeepEqual(merged, expected) { t.Fatalf("%#v doesn't equal expected %#v", merged, expected) } + input3 := []ResMap{merged, nil} + merged1, err := MergeWithOverride(input3...) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !reflect.DeepEqual(merged1, expected) { + t.Fatalf("%#v doesn't equal expected %#v", merged1, expected) + } + input4 := []ResMap{nil, merged} + merged2, err := MergeWithOverride(input4...) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if !reflect.DeepEqual(merged2, expected) { + t.Fatalf("%#v doesn't equal expected %#v", merged2, expected) + } }