mirror of https://github.com/coder/coder.git
feat: add more logging around echo tar (#10731)
This commit is contained in:
parent
ced6ae01b7
commit
0e5eecd7da
|
@ -709,7 +709,7 @@ func createAnotherUserRetry(t testing.TB, client *codersdk.Client, organizationI
|
||||||
// with testing.
|
// with testing.
|
||||||
func CreateTemplateVersion(t testing.TB, client *codersdk.Client, organizationID uuid.UUID, res *echo.Responses, mutators ...func(*codersdk.CreateTemplateVersionRequest)) codersdk.TemplateVersion {
|
func CreateTemplateVersion(t testing.TB, client *codersdk.Client, organizationID uuid.UUID, res *echo.Responses, mutators ...func(*codersdk.CreateTemplateVersionRequest)) codersdk.TemplateVersion {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
data, err := echo.Tar(res)
|
data, err := echo.TarWithOptions(context.Background(), client.Logger(), res)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
file, err := client.Upload(context.Background(), codersdk.ContentTypeTar, bytes.NewReader(data))
|
file, err := client.Upload(context.Background(), codersdk.ContentTypeTar, bytes.NewReader(data))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
|
@ -15,6 +15,7 @@ import (
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"cdr.dev/slog"
|
||||||
"cdr.dev/slog/sloggers/slogtest"
|
"cdr.dev/slog/sloggers/slogtest"
|
||||||
"github.com/coder/coder/v2/agent/agenttest"
|
"github.com/coder/coder/v2/agent/agenttest"
|
||||||
"github.com/coder/coder/v2/coderd/coderdtest"
|
"github.com/coder/coder/v2/coderd/coderdtest"
|
||||||
|
@ -41,6 +42,7 @@ func TestCollectInsights(t *testing.T) {
|
||||||
Pubsub: ps,
|
Pubsub: ps,
|
||||||
}
|
}
|
||||||
client := coderdtest.New(t, options)
|
client := coderdtest.New(t, options)
|
||||||
|
client.SetLogger(logger.Named("client").Leveled(slog.LevelDebug))
|
||||||
|
|
||||||
// Given
|
// Given
|
||||||
// Initialize metrics collector
|
// Initialize metrics collector
|
||||||
|
|
|
@ -13,6 +13,8 @@ import (
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
protobuf "google.golang.org/protobuf/proto"
|
protobuf "google.golang.org/protobuf/proto"
|
||||||
|
|
||||||
|
"cdr.dev/slog"
|
||||||
|
|
||||||
"github.com/coder/coder/v2/provisionersdk"
|
"github.com/coder/coder/v2/provisionersdk"
|
||||||
"github.com/coder/coder/v2/provisionersdk/proto"
|
"github.com/coder/coder/v2/provisionersdk/proto"
|
||||||
)
|
)
|
||||||
|
@ -211,6 +213,15 @@ type Responses struct {
|
||||||
|
|
||||||
// Tar returns a tar archive of responses to provisioner operations.
|
// Tar returns a tar archive of responses to provisioner operations.
|
||||||
func Tar(responses *Responses) ([]byte, error) {
|
func Tar(responses *Responses) ([]byte, error) {
|
||||||
|
logger := slog.Make()
|
||||||
|
return TarWithOptions(context.Background(), logger, responses)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TarWithOptions returns a tar archive of responses to provisioner operations,
|
||||||
|
// but it gives more insight into the archiving process.
|
||||||
|
func TarWithOptions(ctx context.Context, logger slog.Logger, responses *Responses) ([]byte, error) {
|
||||||
|
logger = logger.Named("echo_tar")
|
||||||
|
|
||||||
if responses == nil {
|
if responses == nil {
|
||||||
responses = &Responses{
|
responses = &Responses{
|
||||||
ParseComplete, ApplyComplete, PlanComplete,
|
ParseComplete, ApplyComplete, PlanComplete,
|
||||||
|
@ -242,6 +253,7 @@ func Tar(responses *Responses) ([]byte, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
logger.Debug(ctx, "write proto", slog.F("name", name), slog.F("message", string(data)))
|
||||||
|
|
||||||
err = writer.WriteHeader(&tar.Header{
|
err = writer.WriteHeader(&tar.Header{
|
||||||
Name: name,
|
Name: name,
|
||||||
|
@ -252,10 +264,11 @@ func Tar(responses *Responses) ([]byte, error) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = writer.Write(data)
|
n, err := writer.Write(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
logger.Debug(context.Background(), "proto written", slog.F("name", name), slog.F("bytes_written", n))
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"hash/crc32"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
@ -216,6 +217,11 @@ func (s *Session) extractArchive() error {
|
||||||
}
|
}
|
||||||
return xerrors.Errorf("read template source archive: %w", err)
|
return xerrors.Errorf("read template source archive: %w", err)
|
||||||
}
|
}
|
||||||
|
s.Logger.Debug(context.Background(), "read archive entry",
|
||||||
|
slog.F("name", header.Name),
|
||||||
|
slog.F("mod_time", header.ModTime),
|
||||||
|
slog.F("size", header.Size))
|
||||||
|
|
||||||
// Security: don't untar absolute or relative paths, as this can allow a malicious tar to overwrite
|
// Security: don't untar absolute or relative paths, as this can allow a malicious tar to overwrite
|
||||||
// files outside the workdir.
|
// files outside the workdir.
|
||||||
if !filepath.IsLocal(header.Name) {
|
if !filepath.IsLocal(header.Name) {
|
||||||
|
@ -253,8 +259,11 @@ func (s *Session) extractArchive() error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("create file %q (mode %s): %w", headerPath, mode, err)
|
return xerrors.Errorf("create file %q (mode %s): %w", headerPath, mode, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hash := crc32.NewIEEE()
|
||||||
|
hashReader := io.TeeReader(reader, hash)
|
||||||
// Max file size of 10MiB.
|
// Max file size of 10MiB.
|
||||||
size, err := io.CopyN(file, reader, 10<<20)
|
size, err := io.CopyN(file, hashReader, 10<<20)
|
||||||
if xerrors.Is(err, io.EOF) {
|
if xerrors.Is(err, io.EOF) {
|
||||||
err = nil
|
err = nil
|
||||||
}
|
}
|
||||||
|
@ -270,7 +279,7 @@ func (s *Session) extractArchive() error {
|
||||||
slog.F("size_bytes", size),
|
slog.F("size_bytes", size),
|
||||||
slog.F("path", headerPath),
|
slog.F("path", headerPath),
|
||||||
slog.F("mode", mode),
|
slog.F("mode", mode),
|
||||||
)
|
slog.F("checksum", fmt.Sprintf("%x", hash.Sum(nil))))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
Loading…
Reference in New Issue