Fixed error reporting when included invalid files in include section (#543)

## Changes
Fixed error reporting when included invalid files in include section

Case 1. When the file to include is invalid, throw an error
Case 2. When the file is loaded but the schema is wrong, indicate which
file is failed to load

## Tests

With non-existent notexists.yml

```
databricks bundle deploy
Error: notexists.yml defined in 'include' section does not match any files

```

With malformed notexists.yml
```
databricks bundle deploy
Error: failed to load /Users/andrew.nester/dabs/wheel/notexists.yml: error unmarshaling JSON: json: cannot unmarshal string into Go value of type config.Root
```
This commit is contained in:
Andrew Nester 2023-07-07 12:22:58 +02:00 committed by GitHub
parent 6f023f46d8
commit b14920cd12
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 72 additions and 1 deletions

View File

@ -4,6 +4,7 @@ import (
"context"
"fmt"
"path/filepath"
"strings"
"github.com/databricks/cli/bundle"
"github.com/databricks/cli/bundle/config"
@ -49,6 +50,12 @@ func (m *processRootIncludes) Apply(ctx context.Context, b *bundle.Bundle) error
return err
}
// If the entry is not a glob pattern and no matches found,
// return an error because the file defined is not found
if len(matches) == 0 && !strings.ContainsAny(entry, "*?[") {
return fmt.Errorf("%s defined in 'include' section does not match any files", entry)
}
// Filter matches to ones we haven't seen yet.
var includes []string
for _, match := range matches {

View File

@ -108,3 +108,17 @@ func TestProcessRootIncludesRemoveDups(t *testing.T) {
require.NoError(t, err)
assert.Equal(t, []string{"a.yml"}, bundle.Config.Include)
}
func TestProcessRootIncludesNotExists(t *testing.T) {
bundle := &bundle.Bundle{
Config: config.Root{
Path: t.TempDir(),
Include: []string{
"notexist.yml",
},
},
}
err := mutator.ProcessRootIncludes().Apply(context.Background(), bundle)
require.Error(t, err)
assert.Contains(t, err.Error(), "notexist.yml defined in 'include' section does not match any files")
}

View File

@ -118,7 +118,7 @@ func (r *Root) Load(path string) error {
}
err = yaml.Unmarshal(raw, r)
if err != nil {
return err
return fmt.Errorf("failed to load %s: %w", path, err)
}
r.Path = filepath.Dir(path)

View File

@ -0,0 +1,5 @@
bundle:
name: include_invalid
include:
- notexists.yml

View File

@ -0,0 +1,34 @@
package config_tests
import (
"context"
"path/filepath"
"sort"
"testing"
"github.com/databricks/cli/bundle"
"github.com/databricks/cli/bundle/config/mutator"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/exp/maps"
)
func TestIncludeInvalid(t *testing.T) {
b, err := bundle.Load("./include_invalid")
require.NoError(t, err)
err = bundle.Apply(context.Background(), b, bundle.Seq(mutator.DefaultMutators()...))
require.Error(t, err)
assert.Contains(t, err.Error(), "notexists.yml defined in 'include' section does not match any files")
}
func TestIncludeWithGlob(t *testing.T) {
b := load(t, "./include_with_glob")
keys := maps.Keys(b.Config.Resources.Jobs)
sort.Strings(keys)
assert.Equal(t, []string{"my_job"}, keys)
job := b.Config.Resources.Jobs["my_job"]
assert.Equal(t, "1", job.ID)
assert.Equal(t, "include_with_glob/job.yml", filepath.ToSlash(job.ConfigFilePath))
}

View File

@ -0,0 +1,7 @@
bundle:
name: include_with_glob
include:
- "*.yml"
- "?.yml"
- "[a-z].yml"

View File

@ -0,0 +1,4 @@
resources:
jobs:
my_job:
id: 1