diff --git a/staging/src/k8s.io/cli-runtime/pkg/resource/builder.go b/staging/src/k8s.io/cli-runtime/pkg/resource/builder.go index 4f4b3143abf..fac3d02390c 100644 --- a/staging/src/k8s.io/cli-runtime/pkg/resource/builder.go +++ b/staging/src/k8s.io/cli-runtime/pkg/resource/builder.go @@ -45,7 +45,8 @@ import ( var FileExtensions = []string{".json", ".yaml", ".yml"} var InputExtensions = append(FileExtensions, "stdin") -const defaultHttpGetAttempts int = 3 +const defaultHttpGetAttempts = 3 +const pathNotExistError = "the path %q does not exist" // Builder provides convenience functions for taking arguments and parameters // from the command line and converting them to a list of resources to iterate @@ -416,7 +417,7 @@ func (b *Builder) Path(recursive bool, paths ...string) *Builder { for _, p := range paths { _, err := os.Stat(p) if os.IsNotExist(err) { - b.errs = append(b.errs, fmt.Errorf("the path %q does not exist", p)) + b.errs = append(b.errs, fmt.Errorf(pathNotExistError, p)) continue } if err != nil { @@ -1213,7 +1214,7 @@ func expandIfFilePattern(pattern string) ([]string, error) { if _, err := os.Stat(pattern); os.IsNotExist(err) { matches, err := filepath.Glob(pattern) if err == nil && len(matches) == 0 { - return nil, fmt.Errorf("the path %q does not exist", pattern) + return nil, fmt.Errorf(pathNotExistError, pattern) } if err == filepath.ErrBadPattern { return nil, fmt.Errorf("pattern %q is not valid: %v", pattern, err) diff --git a/staging/src/k8s.io/cli-runtime/pkg/resource/builder_test.go b/staging/src/k8s.io/cli-runtime/pkg/resource/builder_test.go index f44ecb31959..a25fa5302c4 100644 --- a/staging/src/k8s.io/cli-runtime/pkg/resource/builder_test.go +++ b/staging/src/k8s.io/cli-runtime/pkg/resource/builder_test.go @@ -625,28 +625,6 @@ func TestDirectoryBuilder(t *testing.T) { } } -func TestFilePatternBuilderWhenPatternYieldsNoResult(t *testing.T) { - const pathPattern = "../../artifacts/_does_not_exist_/*.yaml" - b := newDefaultBuilder(). - FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{pathPattern}}). - NamespaceParam("test").DefaultNamespace() - - test := &testVisitor{} - singleItemImplied := false - - err := b.Do().IntoSingleItemImplied(&singleItemImplied).Visit(test.Handle) - if err == nil { - t.Fatalf("unexpected response: error is nil") - } - const expectedErrorMsg = "does not exist" - if !strings.Contains(err.Error(), expectedErrorMsg) { - t.Fatalf("expected %s but got %s", expectedErrorMsg, err.Error()) - } - if !strings.Contains(err.Error(), pathPattern) { - t.Fatalf("expected %s but got %s", pathPattern, err.Error()) - } -} - func TestFilePatternBuilderWhenFileLiteralExists(t *testing.T) { const pathPattern = "../../artifacts/oddly-named-file[x].yaml" b := newDefaultBuilder(). @@ -665,28 +643,6 @@ func TestFilePatternBuilderWhenFileLiteralExists(t *testing.T) { } } -func TestFilePatternBuilderWhenBadPatternUsesRawInput(t *testing.T) { - const pathPattern = "../../artifacts/[a-z*.yaml" // missing closing bracket, "[a-z]*.yaml" - b := newDefaultBuilder(). - FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{pathPattern}}). - NamespaceParam("test").DefaultNamespace() - - test := &testVisitor{} - singleItemImplied := false - - err := b.Do().IntoSingleItemImplied(&singleItemImplied).Visit(test.Handle) - if err == nil { - t.Fatalf("unexpected response: error is nil") - } - const expectedErrorMsg = "syntax error in pattern" - if !strings.Contains(err.Error(), expectedErrorMsg) { - t.Fatalf("expected %s but got %s", expectedErrorMsg, err.Error()) - } - if !strings.Contains(err.Error(), pathPattern) { - t.Fatalf("expected %s but got %s", pathPattern, err.Error()) - } -} - func TestFilePatternBuilder(t *testing.T) { b := newDefaultBuilder(). FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{"../../artifacts/guestbook/redis-*.yaml"}}). @@ -709,30 +665,39 @@ func TestFilePatternBuilder(t *testing.T) { func TestErrorFilePatternBuilder(t *testing.T) { testCases := map[string]struct { - input []string - expectedErr string + input string + expectedErr string + inputInError bool }{ "invalid pattern": { - input: []string{"[a-z*.yaml"}, - expectedErr: "syntax error in pattern", + input: "[a-z*.yaml", + expectedErr: "syntax error in pattern", + inputInError: true, }, "file does not exist": { - input: []string{"../../artifacts/guestbook/notexist.yaml"}, - expectedErr: "does not exist", + input: "../../artifacts/guestbook/notexist.yaml", + expectedErr: "does not exist", + inputInError: true, + }, + "directory does not exist and valid glob": { + input: "../../artifacts/_does_not_exist_/*.yaml", + expectedErr: "does not exist", + inputInError: true, }, } for name, tc := range testCases { t.Run(name, func(t *testing.T) { b := newDefaultBuilder(). - FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: tc.input}). + FilenameParam(false, &FilenameOptions{Recursive: false, Filenames: []string{tc.input}}). NamespaceParam("test").DefaultNamespace() test := &testVisitor{} singleItemImplied := false err := b.Do().IntoSingleItemImplied(&singleItemImplied).Visit(test.Handle) - if err == nil || len(test.Infos) != 0 || !strings.Contains(err.Error(), tc.expectedErr) { - t.Fatalf("unexpected response: %v %#v", err, test.Infos) + if err == nil || len(test.Infos) != 0 || !strings.Contains(err.Error(), tc.expectedErr) || + (tc.inputInError && !strings.Contains(err.Error(), tc.input)) { + t.Errorf("unexpected response: %v %#v", err, test.Infos) } }) }