Skip to content

Commit 8fef99f

Browse files
authored
Merge pull request #5542 from ephesused/issue5540
fix: improve accumulation failure message
2 parents a6149b1 + 14a9a98 commit 8fef99f

File tree

4 files changed

+118
-8
lines changed

4 files changed

+118
-8
lines changed

api/internal/target/kusttarget.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,14 @@ func (kt *KustTarget) accumulateResources(
425425
}
426426
ldr, err := kt.ldr.New(path)
427427
if err != nil {
428-
if kusterr.IsMalformedYAMLError(errF) { // Some error occurred while tyring to decode YAML file
428+
// If accumulateFile found malformed YAML and there was a failure
429+
// loading the resource as a base, then the resource is likely a
430+
// file. The loader failure message is unnecessary, and could be
431+
// confusing. Report only the file load error.
432+
//
433+
// However, a loader timeout implies there is a git repo at the
434+
// path. In that case, both errors could be important.
435+
if kusterr.IsMalformedYAMLError(errF) && !utils.IsErrTimeout(err) {
429436
return nil, errF
430437
}
431438
return nil, errors.WrapPrefixf(

api/internal/target/kusttarget_test.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ import (
88
"fmt"
99
"reflect"
1010
"testing"
11+
"time"
1112

1213
"github.com/stretchr/testify/assert"
1314
"github.com/stretchr/testify/require"
1415
"sigs.k8s.io/kustomize/api/ifc"
1516
. "sigs.k8s.io/kustomize/api/internal/target"
17+
"sigs.k8s.io/kustomize/api/internal/utils"
1618
"sigs.k8s.io/kustomize/api/pkg/loader"
1719
"sigs.k8s.io/kustomize/api/provider"
1820
"sigs.k8s.io/kustomize/api/resmap"
@@ -457,3 +459,80 @@ func TestDuplicateExternalTransformersForbidden(t *testing.T) {
457459
require.Error(t, err)
458460
assert.Contains(t, err.Error(), "may not add resource with an already registered id: ValueAnnotator.v1.transformers.example.co/notImportantHere")
459461
}
462+
463+
func TestErrorMessageForMalformedYAML(t *testing.T) {
464+
// These testcases verify behavior for the scenario described in
465+
// https://github.com/kubernetes-sigs/kustomize/issues/5540 .
466+
467+
testcases := map[string]struct {
468+
loaderNewReturnsError error
469+
shouldShowLoadError bool
470+
}{
471+
"shouldShowLoadError": {
472+
loaderNewReturnsError: utils.NewErrTimeOut(time.Second, "git init"),
473+
shouldShowLoadError: true,
474+
},
475+
"shouldNotShowLoadError": {
476+
loaderNewReturnsError: NewErrMissingKustomization("/should-fail/resources.yaml"),
477+
shouldShowLoadError: false,
478+
},
479+
}
480+
481+
th := kusttest_test.MakeHarness(t)
482+
th.WriteF("/should-fail/kustomization.yaml", `resources:
483+
- resources.yaml
484+
`)
485+
th.WriteF("/should-fail/resources.yaml", `<!DOCTYPE html>
486+
<html class="html-devise-layout ui-light-gray" lang="en">
487+
<head prefix="og: http://ogp.me/ns#">
488+
<meta charset="utf-8">
489+
`)
490+
491+
for name, tc := range testcases {
492+
t.Run(name, func(subT *testing.T) {
493+
ldrWrapper := func(baseLoader ifc.Loader) ifc.Loader {
494+
return loaderNewThrowsError{
495+
baseLoader: baseLoader,
496+
newReturnsError: tc.loaderNewReturnsError,
497+
}
498+
}
499+
_, err := makeAndLoadKustTargetWithLoaderOverride(t, th.GetFSys(), "/should-fail", ldrWrapper).AccumulateTarget()
500+
require.Error(t, err)
501+
errString := err.Error()
502+
assert.Contains(t, errString, "accumulating resources from 'resources.yaml'")
503+
assert.Contains(t, errString, "MalformedYAMLError: yaml: line 3: mapping values are not allowed in this context")
504+
if tc.shouldShowLoadError {
505+
assert.Regexp(t, `hit \w+ timeout running '`, errString)
506+
} else {
507+
assert.NotRegexp(t, `hit \w+ timeout running '`, errString)
508+
}
509+
})
510+
}
511+
}
512+
513+
// loaderNewReturnsError duplicates baseLoader's behavior except
514+
// that New() returns the specified error.
515+
type loaderNewThrowsError struct {
516+
baseLoader ifc.Loader
517+
newReturnsError error
518+
}
519+
520+
func (l loaderNewThrowsError) Repo() string {
521+
return l.baseLoader.Repo()
522+
}
523+
524+
func (l loaderNewThrowsError) Root() string {
525+
return l.baseLoader.Root()
526+
}
527+
528+
func (l loaderNewThrowsError) New(_ string) (ifc.Loader, error) {
529+
return nil, l.newReturnsError
530+
}
531+
532+
func (l loaderNewThrowsError) Load(location string) ([]byte, error) {
533+
return l.baseLoader.Load(location) //nolint:wrapcheck // baseLoader's error is sufficient
534+
}
535+
536+
func (l loaderNewThrowsError) Cleanup() error {
537+
return l.baseLoader.Cleanup() //nolint:wrapcheck // baseLoader's error is sufficient
538+
}

api/internal/target/maker_test.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package target_test
66
import (
77
"testing"
88

9+
"sigs.k8s.io/kustomize/api/ifc"
910
fLdr "sigs.k8s.io/kustomize/api/internal/loader"
1011
pLdr "sigs.k8s.io/kustomize/api/internal/plugins/loader"
1112
"sigs.k8s.io/kustomize/api/internal/target"
@@ -21,23 +22,46 @@ func makeAndLoadKustTarget(
2122
fSys filesys.FileSystem,
2223
root string) *target.KustTarget {
2324
t.Helper()
24-
kt := makeKustTargetWithRf(t, fSys, root, provider.NewDefaultDepProvider())
25+
return makeAndLoadKustTargetWithLoaderOverride(t, fSys, root, nil)
26+
}
27+
28+
func makeKustTargetWithRf(
29+
t *testing.T,
30+
fSys filesys.FileSystem,
31+
root string,
32+
pvd *provider.DepProvider) *target.KustTarget {
33+
t.Helper()
34+
return makeKustTargetWithRfAndLoaderOverride(t, fSys, root, pvd, nil)
35+
}
36+
37+
func makeAndLoadKustTargetWithLoaderOverride(
38+
t *testing.T,
39+
fSys filesys.FileSystem,
40+
root string,
41+
ldrWrapperFn func(ifc.Loader) ifc.Loader) *target.KustTarget {
42+
t.Helper()
43+
kt := makeKustTargetWithRfAndLoaderOverride(t, fSys, root, provider.NewDefaultDepProvider(), ldrWrapperFn)
2544
if err := kt.Load(); err != nil {
2645
t.Fatalf("Unexpected load error %v", err)
2746
}
2847
return kt
2948
}
3049

31-
func makeKustTargetWithRf(
50+
func makeKustTargetWithRfAndLoaderOverride(
3251
t *testing.T,
3352
fSys filesys.FileSystem,
3453
root string,
35-
pvd *provider.DepProvider) *target.KustTarget {
54+
pvd *provider.DepProvider,
55+
ldrWrapperFn func(ifc.Loader) ifc.Loader) *target.KustTarget {
3656
t.Helper()
37-
ldr, err := fLdr.NewLoader(fLdr.RestrictionRootOnly, root, fSys)
57+
baseLoader, err := fLdr.NewLoader(fLdr.RestrictionRootOnly, root, fSys)
3858
if err != nil {
3959
t.Fatal(err)
4060
}
61+
ldr := baseLoader
62+
if ldrWrapperFn != nil {
63+
ldr = ldrWrapperFn(baseLoader)
64+
}
4165
rf := resmap.NewFactory(pvd.GetResourceFactory())
4266
pc := types.DisabledPluginConfig()
4367
return target.NewKustTarget(

api/internal/utils/errtimeout.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ type errTimeOut struct {
1515
cmd string
1616
}
1717

18-
func NewErrTimeOut(d time.Duration, c string) errTimeOut {
19-
return errTimeOut{duration: d, cmd: c}
18+
func NewErrTimeOut(d time.Duration, c string) *errTimeOut {
19+
return &errTimeOut{duration: d, cmd: c}
2020
}
2121

22-
func (e errTimeOut) Error() string {
22+
func (e *errTimeOut) Error() string {
2323
return fmt.Sprintf("hit %s timeout running '%s'", e.duration, e.cmd)
2424
}
2525

0 commit comments

Comments
 (0)