Skip to content

Commit f25b64b

Browse files
committed
feat: show better error on invalid template upload
1 parent ff0aa8d commit f25b64b

File tree

2 files changed

+56
-8
lines changed

2 files changed

+56
-8
lines changed

provisionersdk/archive.go

+38-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"archive/tar"
55
"bytes"
66
"io"
7+
"io/ioutil"
78
"os"
89
"path/filepath"
910
"strings"
@@ -16,12 +17,47 @@ const (
1617
TemplateArchiveLimit = 1 << 20
1718
)
1819

19-
// Tar archives a directory.
20+
func dirHasExt(dir string, ext string) (bool, error) {
21+
dirEnts, err := ioutil.ReadDir(dir)
22+
if err != nil {
23+
return false, err
24+
}
25+
26+
for _, fi := range dirEnts {
27+
if strings.HasSuffix(fi.Name(), ext) {
28+
return true, nil
29+
}
30+
}
31+
32+
return false, nil
33+
}
34+
35+
// Tar archives a Terraform directory.
2036
func Tar(directory string, limit int64) ([]byte, error) {
2137
var buffer bytes.Buffer
2238
tarWriter := tar.NewWriter(&buffer)
2339
totalSize := int64(0)
24-
err := filepath.Walk(directory, func(file string, fileInfo os.FileInfo, err error) error {
40+
41+
const tfExt = ".tf"
42+
hasTf, err := dirHasExt(directory, tfExt)
43+
if err != nil {
44+
return nil, err
45+
}
46+
if !hasTf {
47+
absPath, err := filepath.Abs(directory)
48+
if err != nil {
49+
return nil, err
50+
}
51+
52+
// Show absolute path to aid in debugging. E.g. showing "." is
53+
// useless.
54+
return nil, xerrors.Errorf(
55+
"%s is not a valid template since it has no %s files",
56+
absPath, tfExt,
57+
)
58+
}
59+
60+
err = filepath.Walk(directory, func(file string, fileInfo os.FileInfo, err error) error {
2561
if err != nil {
2662
return err
2763
}

provisionersdk/archive_test.go

+18-6
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,24 @@ import (
1212

1313
func TestTar(t *testing.T) {
1414
t.Parallel()
15-
dir := t.TempDir()
16-
file, err := os.CreateTemp(dir, "")
17-
require.NoError(t, err)
18-
_ = file.Close()
19-
_, err = provisionersdk.Tar(dir, 1024)
20-
require.NoError(t, err)
15+
t.Run("NoTF", func(t *testing.T) {
16+
t.Parallel()
17+
dir := t.TempDir()
18+
file, err := os.CreateTemp(dir, "")
19+
require.NoError(t, err)
20+
_ = file.Close()
21+
_, err = provisionersdk.Tar(dir, 1024)
22+
require.Error(t, err)
23+
})
24+
t.Run("Valid", func(t *testing.T) {
25+
t.Parallel()
26+
dir := t.TempDir()
27+
file, err := os.CreateTemp(dir, "*.tf")
28+
require.NoError(t, err)
29+
_ = file.Close()
30+
_, err = provisionersdk.Tar(dir, 1024)
31+
require.NoError(t, err)
32+
})
2133
}
2234

2335
func TestUntar(t *testing.T) {

0 commit comments

Comments
 (0)