From b91e6f1b19f7cd2d63ce20bb4b38e02d8163df9b Mon Sep 17 00:00:00 2001 From: Puneet Dixit <236133619+puneetdixit200@users.noreply.github.com> Date: Sat, 23 May 2026 22:05:33 +0530 Subject: [PATCH] fix(agent/agentscripts): create script log directories --- agent/agentscripts/agentscripts.go | 5 +++ agent/agentscripts/agentscripts_test.go | 42 +++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/agent/agentscripts/agentscripts.go b/agent/agentscripts/agentscripts.go index e3de3855cfae1..5755f989e19b6 100644 --- a/agent/agentscripts/agentscripts.go +++ b/agent/agentscripts/agentscripts.go @@ -275,6 +275,11 @@ func (r *Runner) run(ctx context.Context, script codersdk.WorkspaceAgentScript, if err != nil { return xerrors.Errorf("%s script: create script temp dir: %w", scriptDataDir, err) } + logDir := filepath.Dir(logPath) + err = r.Filesystem.MkdirAll(logDir, 0o700) + if err != nil { + return xerrors.Errorf("%s script: create script log dir: %w", logDir, err) + } logger := r.Logger.With( slog.F("log_source_id", script.LogSourceID), diff --git a/agent/agentscripts/agentscripts_test.go b/agent/agentscripts/agentscripts_test.go index c032ea1f83a1a..cf69112c89302 100644 --- a/agent/agentscripts/agentscripts_test.go +++ b/agent/agentscripts/agentscripts_test.go @@ -47,6 +47,32 @@ func TestExecuteBasic(t *testing.T) { require.Equal(t, "hello", log.Output) } +func TestExecuteCreatesLogPathParents(t *testing.T) { + t.Parallel() + ctx := testutil.Context(t, testutil.WaitShort) + fLogger := newFakeScriptLogger() + runner := setupWithFilesystem(t, afero.NewOsFs(), t.TempDir(), t.TempDir(), func(uuid.UUID) agentscripts.ScriptLogger { + return fLogger + }) + defer runner.Close() + + logPath := filepath.Join("nested", "install.log") + aAPI := agenttest.NewFakeAgentAPI(t, testutil.Logger(t), nil, nil) + err := runner.Init([]codersdk.WorkspaceAgentScript{{ + LogSourceID: uuid.New(), + LogPath: logPath, + Script: "echo hello", + }}, aAPI.ScriptCompleted) + require.NoError(t, err) + require.NoError(t, runner.Execute(context.Background(), agentscripts.ExecuteAllScripts)) + + log := testutil.TryReceive(ctx, t, fLogger.logs) + require.Equal(t, "hello", log.Output) + + _, err = runner.Filesystem.Stat(filepath.Join(runner.LogDir, logPath)) + require.NoError(t, err) +} + func TestEnv(t *testing.T) { t.Parallel() fLogger := newFakeScriptLogger() @@ -298,6 +324,17 @@ func (*executeOptionTestLogger) Flush(context.Context) error { } func setup(t *testing.T, getScriptLogger func(logSourceID uuid.UUID) agentscripts.ScriptLogger) *agentscripts.Runner { + t.Helper() + return setupWithFilesystem(t, afero.NewMemMapFs(), t.TempDir(), t.TempDir(), getScriptLogger) +} + +func setupWithFilesystem( + t *testing.T, + fs afero.Fs, + logDir string, + dataDirBase string, + getScriptLogger func(logSourceID uuid.UUID) agentscripts.ScriptLogger, +) *agentscripts.Runner { t.Helper() if getScriptLogger == nil { // noop @@ -305,7 +342,6 @@ func setup(t *testing.T, getScriptLogger func(logSourceID uuid.UUID) agentscript return noopScriptLogger{} } } - fs := afero.NewMemMapFs() logger := testutil.Logger(t) s, err := agentssh.NewServer(context.Background(), logger, prometheus.NewRegistry(), fs, agentexec.DefaultExecer, nil) require.NoError(t, err) @@ -313,8 +349,8 @@ func setup(t *testing.T, getScriptLogger func(logSourceID uuid.UUID) agentscript _ = s.Close() }) return agentscripts.New(agentscripts.Options{ - LogDir: t.TempDir(), - DataDirBase: t.TempDir(), + LogDir: logDir, + DataDirBase: dataDirBase, Logger: logger, SSHServer: s, Filesystem: fs,