Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: improve accumulation failure message #5542

Merged
merged 4 commits into from
Mar 27, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
test: add test for issue 5440
  • Loading branch information
ephesused committed Mar 8, 2024
commit 62eca858f32c8863f5e01e4be52767b108ca3795
79 changes: 79 additions & 0 deletions api/internal/target/kusttarget_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ import (
"fmt"
"reflect"
"testing"
"time"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"sigs.k8s.io/kustomize/api/ifc"
. "sigs.k8s.io/kustomize/api/internal/target"
"sigs.k8s.io/kustomize/api/internal/utils"
"sigs.k8s.io/kustomize/api/pkg/loader"
"sigs.k8s.io/kustomize/api/provider"
"sigs.k8s.io/kustomize/api/resmap"
Expand Down Expand Up @@ -455,3 +457,80 @@ func TestDuplicateExternalTransformersForbidden(t *testing.T) {
assert.Error(t, err)
assert.Contains(t, err.Error(), "may not add resource with an already registered id: ValueAnnotator.v1.transformers.example.co/notImportantHere")
}

func TestErrorMessageForMalformedYAML(t *testing.T) {
// These testcases verify behavior for the scenario described in
// https://github.com/kubernetes-sigs/kustomize/issues/5540 .

testcases := map[string]struct {
loaderNewReturnsError error
shouldShowLoadError bool
}{
"shouldShowLoadError": {
loaderNewReturnsError: utils.NewErrTimeOut(time.Second, "git init"),
shouldShowLoadError: true,
},
"shouldNotShowLoadError": {
loaderNewReturnsError: NewErrMissingKustomization("/should-fail/resources.yaml"),
shouldShowLoadError: false,
},
}

th := kusttest_test.MakeHarness(t)
th.WriteF("/should-fail/kustomization.yaml", `resources:
- resources.yaml
`)
th.WriteF("/should-fail/resources.yaml", `<!DOCTYPE html>
<html class="html-devise-layout ui-light-gray" lang="en">
<head prefix="og: http:https://ogp.me/ns#">
<meta charset="utf-8">
`)

for name, tc := range testcases {
t.Run(name, func(subT *testing.T) {
ldrWrapper := func(baseLoader ifc.Loader) ifc.Loader {
return loaderNewThrowsError{
baseLoader: baseLoader,
newReturnsError: tc.loaderNewReturnsError,
}
}
_, err := makeAndLoadKustTargetWithLoaderOverride(t, th.GetFSys(), "/should-fail", ldrWrapper).AccumulateTarget()
require.Error(t, err)
errString := err.Error()
assert.Contains(t, errString, "accumulating resources from 'resources.yaml'")
assert.Contains(t, errString, "MalformedYAMLError: yaml: line 3: mapping values are not allowed in this context")
if tc.shouldShowLoadError {
assert.Regexp(t, `hit \w+ timeout running '`, errString)
} else {
assert.NotRegexp(t, `hit \w+ timeout running '`, errString)
}
})
}
}

// loaderNewReturnsError duplicates baseLoader's behavior except
// that New() returns the specified error.
type loaderNewThrowsError struct {
baseLoader ifc.Loader
newReturnsError error
}

func (l loaderNewThrowsError) Repo() string {
return l.baseLoader.Repo()
}

func (l loaderNewThrowsError) Root() string {
return l.baseLoader.Root()
}

func (l loaderNewThrowsError) New(_ string) (ifc.Loader, error) {
return nil, l.newReturnsError
}

func (l loaderNewThrowsError) Load(location string) ([]byte, error) {
return l.baseLoader.Load(location)
}

func (l loaderNewThrowsError) Cleanup() error {
return l.baseLoader.Cleanup()
}
32 changes: 28 additions & 4 deletions api/internal/target/maker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package target_test
import (
"testing"

"sigs.k8s.io/kustomize/api/ifc"
fLdr "sigs.k8s.io/kustomize/api/internal/loader"
pLdr "sigs.k8s.io/kustomize/api/internal/plugins/loader"
"sigs.k8s.io/kustomize/api/internal/target"
Expand All @@ -21,23 +22,46 @@ func makeAndLoadKustTarget(
fSys filesys.FileSystem,
root string) *target.KustTarget {
t.Helper()
kt := makeKustTargetWithRf(t, fSys, root, provider.NewDefaultDepProvider())
return makeAndLoadKustTargetWithLoaderOverride(t, fSys, root, nil)
}

func makeKustTargetWithRf(
t *testing.T,
fSys filesys.FileSystem,
root string,
pvd *provider.DepProvider) *target.KustTarget {
t.Helper()
return makeKustTargetWithRfAndLoaderOverride(t, fSys, root, pvd, nil)
}

func makeAndLoadKustTargetWithLoaderOverride(
t *testing.T,
fSys filesys.FileSystem,
root string,
ldrWrapperFn func(ifc.Loader) ifc.Loader) *target.KustTarget {
t.Helper()
kt := makeKustTargetWithRfAndLoaderOverride(t, fSys, root, provider.NewDefaultDepProvider(), ldrWrapperFn)
if err := kt.Load(); err != nil {
t.Fatalf("Unexpected load error %v", err)
}
return kt
}

func makeKustTargetWithRf(
func makeKustTargetWithRfAndLoaderOverride(
t *testing.T,
fSys filesys.FileSystem,
root string,
pvd *provider.DepProvider) *target.KustTarget {
pvd *provider.DepProvider,
ldrWrapperFn func(ifc.Loader) ifc.Loader) *target.KustTarget {
t.Helper()
ldr, err := fLdr.NewLoader(fLdr.RestrictionRootOnly, root, fSys)
baseLoader, err := fLdr.NewLoader(fLdr.RestrictionRootOnly, root, fSys)
if err != nil {
t.Fatal(err)
}
ldr := baseLoader
if ldrWrapperFn != nil {
ldr = ldrWrapperFn(baseLoader)
}
rf := resmap.NewFactory(pvd.GetResourceFactory())
pc := types.DisabledPluginConfig()
return target.NewKustTarget(
Expand Down