fix: return error when config file with unknown extension is passed (#15107)
This commit is contained in:
parent
39e6ca3bf6
commit
2c37b0afd1
|
@ -0,0 +1,3 @@
|
||||||
|
```release-note:bug
|
||||||
|
cli: fatal error if config file does not have HCL or JSON extension, instead of warn and skip
|
||||||
|
```
|
|
@ -56,6 +56,10 @@ type LoadOpts struct {
|
||||||
|
|
||||||
// ConfigFiles is a slice of paths to config files and directories that will
|
// ConfigFiles is a slice of paths to config files and directories that will
|
||||||
// be loaded.
|
// be loaded.
|
||||||
|
//
|
||||||
|
// It is an error for any config files to have an extension other than `hcl`
|
||||||
|
// or `json`, unless ConfigFormat is also set. However, non-HCL/JSON files in
|
||||||
|
// a config directory are merely skipped, with a warning.
|
||||||
ConfigFiles []string
|
ConfigFiles []string
|
||||||
|
|
||||||
// ConfigFormat forces all config files to be interpreted as this format
|
// ConfigFormat forces all config files to be interpreted as this format
|
||||||
|
@ -228,8 +232,7 @@ func (b *builder) sourcesFromPath(path string, format string) ([]Source, error)
|
||||||
|
|
||||||
if !fi.IsDir() {
|
if !fi.IsDir() {
|
||||||
if !shouldParseFile(path, format) {
|
if !shouldParseFile(path, format) {
|
||||||
b.warn("skipping file %v, extension must be .hcl or .json, or config format must be set", path)
|
return nil, fmt.Errorf("file %v has unknown extension; must be .hcl or .json, or config format must be set", path)
|
||||||
return nil, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
src, err := newSourceFromFile(path, format)
|
src, err := newSourceFromFile(path, format)
|
||||||
|
|
|
@ -68,41 +68,6 @@ func TestShouldParseFile(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNewBuilder_PopulatesSourcesFromConfigFiles(t *testing.T) {
|
func TestNewBuilder_PopulatesSourcesFromConfigFiles(t *testing.T) {
|
||||||
paths := setupConfigFiles(t)
|
|
||||||
|
|
||||||
b, err := newBuilder(LoadOpts{ConfigFiles: paths})
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
expected := []Source{
|
|
||||||
FileSource{Name: paths[0], Format: "hcl", Data: "content a"},
|
|
||||||
FileSource{Name: paths[1], Format: "json", Data: "content b"},
|
|
||||||
FileSource{Name: filepath.Join(paths[3], "a.hcl"), Format: "hcl", Data: "content a"},
|
|
||||||
FileSource{Name: filepath.Join(paths[3], "b.json"), Format: "json", Data: "content b"},
|
|
||||||
}
|
|
||||||
require.Equal(t, expected, b.Sources)
|
|
||||||
require.Len(t, b.Warnings, 2)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestNewBuilder_PopulatesSourcesFromConfigFiles_WithConfigFormat(t *testing.T) {
|
|
||||||
paths := setupConfigFiles(t)
|
|
||||||
|
|
||||||
b, err := newBuilder(LoadOpts{ConfigFiles: paths, ConfigFormat: "hcl"})
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
expected := []Source{
|
|
||||||
FileSource{Name: paths[0], Format: "hcl", Data: "content a"},
|
|
||||||
FileSource{Name: paths[1], Format: "hcl", Data: "content b"},
|
|
||||||
FileSource{Name: paths[2], Format: "hcl", Data: "content c"},
|
|
||||||
FileSource{Name: filepath.Join(paths[3], "a.hcl"), Format: "hcl", Data: "content a"},
|
|
||||||
FileSource{Name: filepath.Join(paths[3], "b.json"), Format: "hcl", Data: "content b"},
|
|
||||||
FileSource{Name: filepath.Join(paths[3], "c.yaml"), Format: "hcl", Data: "content c"},
|
|
||||||
}
|
|
||||||
require.Equal(t, expected, b.Sources)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: this would be much nicer with gotest.tools/fs
|
|
||||||
func setupConfigFiles(t *testing.T) []string {
|
|
||||||
t.Helper()
|
|
||||||
path, err := os.MkdirTemp("", t.Name())
|
path, err := os.MkdirTemp("", t.Name())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
t.Cleanup(func() { os.RemoveAll(path) })
|
t.Cleanup(func() { os.RemoveAll(path) })
|
||||||
|
@ -121,12 +86,43 @@ func setupConfigFiles(t *testing.T) []string {
|
||||||
err = os.WriteFile(filepath.Join(dir, "c.yaml"), []byte("content c"), 0644)
|
err = os.WriteFile(filepath.Join(dir, "c.yaml"), []byte("content c"), 0644)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
return []string{
|
paths := []string{
|
||||||
filepath.Join(path, "a.hcl"),
|
filepath.Join(path, "a.hcl"),
|
||||||
filepath.Join(path, "b.json"),
|
filepath.Join(path, "b.json"),
|
||||||
filepath.Join(path, "c.yaml"),
|
filepath.Join(path, "c.yaml"),
|
||||||
subpath,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
t.Run("fail on unknown files", func(t *testing.T) {
|
||||||
|
_, err := newBuilder(LoadOpts{ConfigFiles: append(paths, subpath)})
|
||||||
|
require.Error(t, err)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("skip on unknown files in dir", func(t *testing.T) {
|
||||||
|
b, err := newBuilder(LoadOpts{ConfigFiles: []string{subpath}})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
expected := []Source{
|
||||||
|
FileSource{Name: filepath.Join(subpath, "a.hcl"), Format: "hcl", Data: "content a"},
|
||||||
|
FileSource{Name: filepath.Join(subpath, "b.json"), Format: "json", Data: "content b"},
|
||||||
|
}
|
||||||
|
require.Equal(t, expected, b.Sources)
|
||||||
|
require.Len(t, b.Warnings, 1)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("force config format", func(t *testing.T) {
|
||||||
|
b, err := newBuilder(LoadOpts{ConfigFiles: append(paths, subpath), ConfigFormat: "hcl"})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
expected := []Source{
|
||||||
|
FileSource{Name: paths[0], Format: "hcl", Data: "content a"},
|
||||||
|
FileSource{Name: paths[1], Format: "hcl", Data: "content b"},
|
||||||
|
FileSource{Name: paths[2], Format: "hcl", Data: "content c"},
|
||||||
|
FileSource{Name: filepath.Join(subpath, "a.hcl"), Format: "hcl", Data: "content a"},
|
||||||
|
FileSource{Name: filepath.Join(subpath, "b.json"), Format: "hcl", Data: "content b"},
|
||||||
|
FileSource{Name: filepath.Join(subpath, "c.yaml"), Format: "hcl", Data: "content c"},
|
||||||
|
}
|
||||||
|
require.Equal(t, expected, b.Sources)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLoad_NodeName(t *testing.T) {
|
func TestLoad_NodeName(t *testing.T) {
|
||||||
|
|
Loading…
Reference in New Issue