diff --git a/cli/clitest/clitest.go b/cli/clitest/clitest.go index 5a7160ffd8..b1fb85e473 100644 --- a/cli/clitest/clitest.go +++ b/cli/clitest/clitest.go @@ -5,6 +5,7 @@ import ( "bytes" "errors" "io" + "io/ioutil" "os" "path/filepath" "testing" @@ -52,6 +53,9 @@ func SetupConfig(t *testing.T, client *codersdk.Client, root config.Root) { // new temporary testing directory. func CreateTemplateVersionSource(t *testing.T, responses *echo.Responses) string { directory := t.TempDir() + f, err := ioutil.TempFile(directory, "*.tf") + require.NoError(t, err) + f.Close() data, err := echo.Tar(responses) require.NoError(t, err) extractTar(t, data, directory) diff --git a/provisionersdk/archive.go b/provisionersdk/archive.go index 941b144bfc..17df9be844 100644 --- a/provisionersdk/archive.go +++ b/provisionersdk/archive.go @@ -16,12 +16,47 @@ const ( 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) { var buffer bytes.Buffer tarWriter := tar.NewWriter(&buffer) 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 { return err } diff --git a/provisionersdk/archive_test.go b/provisionersdk/archive_test.go index 7abe9ce47b..4fb80ff296 100644 --- a/provisionersdk/archive_test.go +++ b/provisionersdk/archive_test.go @@ -12,18 +12,30 @@ import ( func TestTar(t *testing.T) { t.Parallel() - dir := t.TempDir() - file, err := os.CreateTemp(dir, "") - require.NoError(t, err) - _ = file.Close() - _, err = provisionersdk.Tar(dir, 1024) - require.NoError(t, err) + t.Run("NoTF", func(t *testing.T) { + t.Parallel() + dir := t.TempDir() + file, err := os.CreateTemp(dir, "") + 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) { t.Parallel() dir := t.TempDir() - file, err := os.CreateTemp(dir, "") + file, err := os.CreateTemp(dir, "*.tf") require.NoError(t, err) _ = file.Close() archive, err := provisionersdk.Tar(dir, 1024) diff --git a/pty/ptytest/ptytest.go b/pty/ptytest/ptytest.go index 4f67568c8f..a6d6d8ab46 100644 --- a/pty/ptytest/ptytest.go +++ b/pty/ptytest/ptytest.go @@ -133,7 +133,7 @@ func (p *PTY) ExpectMatch(str string) string { p.logf("matched %q = %q", str, buffer.String()) return buffer.String() case <-timeout.Done(): - // Ensure goroutine is cleaned up before test exit. + // Ensure gorouine is cleaned up before test exit. _ = p.out.closeErr(p.Close()) <-match