Skip to content

Commit a09ffd6

Browse files
authored
feat: show better error on invalid template upload (#3847)
* feat: show better error on invalid template upload * Fix tests
1 parent ac50070 commit a09ffd6

File tree

4 files changed

+61
-10
lines changed

4 files changed

+61
-10
lines changed

cli/clitest/clitest.go

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"bytes"
66
"errors"
77
"io"
8+
"io/ioutil"
89
"os"
910
"path/filepath"
1011
"testing"
@@ -52,6 +53,9 @@ func SetupConfig(t *testing.T, client *codersdk.Client, root config.Root) {
5253
// new temporary testing directory.
5354
func CreateTemplateVersionSource(t *testing.T, responses *echo.Responses) string {
5455
directory := t.TempDir()
56+
f, err := ioutil.TempFile(directory, "*.tf")
57+
require.NoError(t, err)
58+
f.Close()
5559
data, err := echo.Tar(responses)
5660
require.NoError(t, err)
5761
extractTar(t, data, directory)

provisionersdk/archive.go

+37-2
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,47 @@ const (
1616
TemplateArchiveLimit = 1 << 20
1717
)
1818

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

provisionersdk/archive_test.go

+19-7
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,30 @@ 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) {
2436
t.Parallel()
2537
dir := t.TempDir()
26-
file, err := os.CreateTemp(dir, "")
38+
file, err := os.CreateTemp(dir, "*.tf")
2739
require.NoError(t, err)
2840
_ = file.Close()
2941
archive, err := provisionersdk.Tar(dir, 1024)

pty/ptytest/ptytest.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func (p *PTY) ExpectMatch(str string) string {
133133
p.logf("matched %q = %q", str, buffer.String())
134134
return buffer.String()
135135
case <-timeout.Done():
136-
// Ensure goroutine is cleaned up before test exit.
136+
// Ensure gorouine is cleaned up before test exit.
137137
_ = p.out.closeErr(p.Close())
138138
<-match
139139

0 commit comments

Comments
 (0)