feat: show better error on invalid template upload (#3847)

* feat: show better error on invalid template upload

* Fix tests
This commit is contained in:
Ammar Bandukwala
2022-09-02 22:48:40 +00:00
committed by GitHub
parent ac50070713
commit a09ffd6c0d
4 changed files with 61 additions and 10 deletions
+4
View File
@@ -5,6 +5,7 @@ import (
"bytes" "bytes"
"errors" "errors"
"io" "io"
"io/ioutil"
"os" "os"
"path/filepath" "path/filepath"
"testing" "testing"
@@ -52,6 +53,9 @@ func SetupConfig(t *testing.T, client *codersdk.Client, root config.Root) {
// new temporary testing directory. // new temporary testing directory.
func CreateTemplateVersionSource(t *testing.T, responses *echo.Responses) string { func CreateTemplateVersionSource(t *testing.T, responses *echo.Responses) string {
directory := t.TempDir() directory := t.TempDir()
f, err := ioutil.TempFile(directory, "*.tf")
require.NoError(t, err)
f.Close()
data, err := echo.Tar(responses) data, err := echo.Tar(responses)
require.NoError(t, err) require.NoError(t, err)
extractTar(t, data, directory) extractTar(t, data, directory)
+37 -2
View File
@@ -16,12 +16,47 @@ const (
TemplateArchiveLimit = 1 << 20 TemplateArchiveLimit = 1 << 20
) )
// Tar archives a directory. func dirHasExt(dir string, ext string) (bool, error) {
dirEnts, err := os.ReadDir(dir)
if err != nil {
return false, err
}
for _, fi := range dirEnts {
if strings.HasSuffix(fi.Name(), ext) {
return true, nil
}
}
return false, nil
}
// Tar archives a Terraform directory.
func Tar(directory string, limit int64) ([]byte, error) { func Tar(directory string, limit int64) ([]byte, error) {
var buffer bytes.Buffer var buffer bytes.Buffer
tarWriter := tar.NewWriter(&buffer) tarWriter := tar.NewWriter(&buffer)
totalSize := int64(0) totalSize := int64(0)
err := filepath.Walk(directory, func(file string, fileInfo os.FileInfo, err error) error {
const tfExt = ".tf"
hasTf, err := dirHasExt(directory, tfExt)
if err != nil {
return nil, err
}
if !hasTf {
absPath, err := filepath.Abs(directory)
if err != nil {
return nil, err
}
// Show absolute path to aid in debugging. E.g. showing "." is
// useless.
return nil, xerrors.Errorf(
"%s is not a valid template since it has no %s files",
absPath, tfExt,
)
}
err = filepath.Walk(directory, func(file string, fileInfo os.FileInfo, err error) error {
if err != nil { if err != nil {
return err return err
} }
+19 -7
View File
@@ -12,18 +12,30 @@ import (
func TestTar(t *testing.T) { func TestTar(t *testing.T) {
t.Parallel() t.Parallel()
dir := t.TempDir() t.Run("NoTF", func(t *testing.T) {
file, err := os.CreateTemp(dir, "") t.Parallel()
require.NoError(t, err) dir := t.TempDir()
_ = file.Close() file, err := os.CreateTemp(dir, "")
_, err = provisionersdk.Tar(dir, 1024) require.NoError(t, err)
require.NoError(t, err) _ = file.Close()
_, err = provisionersdk.Tar(dir, 1024)
require.Error(t, err)
})
t.Run("Valid", func(t *testing.T) {
t.Parallel()
dir := t.TempDir()
file, err := os.CreateTemp(dir, "*.tf")
require.NoError(t, err)
_ = file.Close()
_, err = provisionersdk.Tar(dir, 1024)
require.NoError(t, err)
})
} }
func TestUntar(t *testing.T) { func TestUntar(t *testing.T) {
t.Parallel() t.Parallel()
dir := t.TempDir() dir := t.TempDir()
file, err := os.CreateTemp(dir, "") file, err := os.CreateTemp(dir, "*.tf")
require.NoError(t, err) require.NoError(t, err)
_ = file.Close() _ = file.Close()
archive, err := provisionersdk.Tar(dir, 1024) archive, err := provisionersdk.Tar(dir, 1024)
+1 -1
View File
@@ -133,7 +133,7 @@ func (p *PTY) ExpectMatch(str string) string {
p.logf("matched %q = %q", str, buffer.String()) p.logf("matched %q = %q", str, buffer.String())
return buffer.String() return buffer.String()
case <-timeout.Done(): case <-timeout.Done():
// Ensure goroutine is cleaned up before test exit. // Ensure gorouine is cleaned up before test exit.
_ = p.out.closeErr(p.Close()) _ = p.out.closeErr(p.Close())
<-match <-match