mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
feat: show better error on invalid template upload (#3847)
* feat: show better error on invalid template upload * Fix tests
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user