From 14dc6691452d33b6830a29fd9f3547f5dcda0eab Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Wed, 25 Jun 2025 10:29:15 +0000 Subject: [PATCH 1/3] fix(agent/agentcontainers): filter out "is a test" devcontainers --- agent/agentcontainers/api.go | 3 +- agent/agentcontainers/api_test.go | 50 +++++++++++++++++++++++++++ agent/agentcontainers/devcontainer.go | 3 ++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/agent/agentcontainers/api.go b/agent/agentcontainers/api.go index 6d2c46b961122..eb003c2ed8d54 100644 --- a/agent/agentcontainers/api.go +++ b/agent/agentcontainers/api.go @@ -571,7 +571,8 @@ func (api *API) processUpdatedContainersLocked(ctx context.Context, updated code slog.F("config_file", configFile), ) - if len(api.containerLabelIncludeFilter) > 0 { + // Filter out devcontainer tests, unless explicitly set in include filters. + if len(api.containerLabelIncludeFilter) > 0 || container.Labels[DevcontainerIsTestRunLabel] == "true" { var ok bool for label, value := range api.containerLabelIncludeFilter { if v, found := container.Labels[label]; found && v == value { diff --git a/agent/agentcontainers/api_test.go b/agent/agentcontainers/api_test.go index b6bae46c835c9..ed58ba17753aa 100644 --- a/agent/agentcontainers/api_test.go +++ b/agent/agentcontainers/api_test.go @@ -793,6 +793,16 @@ func TestAPI(t *testing.T) { agentcontainers.DevcontainerConfigFileLabel: "/workspace/runtime1/.devcontainer/devcontainer.json", }, }, + { + ID: "test-container-1", + FriendlyName: "test-container-1", + Running: true, + Labels: map[string]string{ + agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", + agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", + agentcontainers.DevcontainerIsTestRunLabel: "true", + }, + }, { ID: "not-a-devcontainer", FriendlyName: "not-a-devcontainer", @@ -834,6 +844,16 @@ func TestAPI(t *testing.T) { agentcontainers.DevcontainerLocalFolderLabel: "/workspace/runtime1", agentcontainers.DevcontainerConfigFileLabel: "/workspace/runtime1/.devcontainer/devcontainer.json", }, + }, + { + ID: "test-container-1", + FriendlyName: "test-container-1", + Running: true, + Labels: map[string]string{ + agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", + agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", + agentcontainers.DevcontainerIsTestRunLabel: "true", + }, }, }, }, @@ -880,6 +900,16 @@ func TestAPI(t *testing.T) { agentcontainers.DevcontainerLocalFolderLabel: "/workspace/non-running", agentcontainers.DevcontainerConfigFileLabel: "/workspace/non-running/.devcontainer/devcontainer.json", }, + }, + { + ID: "test-container-1", + FriendlyName: "test-container-1", + Running: true, + Labels: map[string]string{ + agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", + agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", + agentcontainers.DevcontainerIsTestRunLabel: "true", + }, }, }, }, @@ -913,6 +943,16 @@ func TestAPI(t *testing.T) { agentcontainers.DevcontainerLocalFolderLabel: "/workspace/known2", agentcontainers.DevcontainerConfigFileLabel: "/workspace/known2/.devcontainer/devcontainer.json", }, + }, + { + ID: "test-container-1", + FriendlyName: "test-container-1", + Running: true, + Labels: map[string]string{ + agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", + agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", + agentcontainers.DevcontainerIsTestRunLabel: "true", + }, }, }, }, @@ -966,6 +1006,16 @@ func TestAPI(t *testing.T) { agentcontainers.DevcontainerLocalFolderLabel: "/var/lib/project3", agentcontainers.DevcontainerConfigFileLabel: "/var/lib/project3/.devcontainer/devcontainer.json", }, + }, + { + ID: "test-container-1", + FriendlyName: "test-container-1", + Running: true, + Labels: map[string]string{ + agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", + agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", + agentcontainers.DevcontainerIsTestRunLabel: "true", + }, }, }, }, diff --git a/agent/agentcontainers/devcontainer.go b/agent/agentcontainers/devcontainer.go index f13963d7b63d7..3980872c32e3e 100644 --- a/agent/agentcontainers/devcontainer.go +++ b/agent/agentcontainers/devcontainer.go @@ -18,6 +18,9 @@ const ( // DevcontainerConfigFileLabel is the label that contains the path to // the devcontainer.json configuration file. DevcontainerConfigFileLabel = "devcontainer.config_file" + // DevcontainerIsTestRunLabel is set if the devcontainer is part of a test + // and should be excluded. + DevcontainerIsTestRunLabel = "devcontainer.is_test_run" // The default workspace folder inside the devcontainer. DevcontainerDefaultContainerWorkspaceFolder = "/workspaces" ) From eccc8e9e94e709af00b308209a41a5d838414ec0 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Wed, 25 Jun 2025 10:38:54 +0000 Subject: [PATCH 2/3] fmt --- agent/agentcontainers/api_test.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/agent/agentcontainers/api_test.go b/agent/agentcontainers/api_test.go index ed58ba17753aa..249e110234f8a 100644 --- a/agent/agentcontainers/api_test.go +++ b/agent/agentcontainers/api_test.go @@ -800,7 +800,7 @@ func TestAPI(t *testing.T) { Labels: map[string]string{ agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", - agentcontainers.DevcontainerIsTestRunLabel: "true", + agentcontainers.DevcontainerIsTestRunLabel: "true", }, }, { @@ -845,14 +845,14 @@ func TestAPI(t *testing.T) { agentcontainers.DevcontainerConfigFileLabel: "/workspace/runtime1/.devcontainer/devcontainer.json", }, }, - { + { ID: "test-container-1", FriendlyName: "test-container-1", Running: true, Labels: map[string]string{ agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", - agentcontainers.DevcontainerIsTestRunLabel: "true", + agentcontainers.DevcontainerIsTestRunLabel: "true", }, }, }, @@ -901,14 +901,14 @@ func TestAPI(t *testing.T) { agentcontainers.DevcontainerConfigFileLabel: "/workspace/non-running/.devcontainer/devcontainer.json", }, }, - { + { ID: "test-container-1", FriendlyName: "test-container-1", Running: true, Labels: map[string]string{ agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", - agentcontainers.DevcontainerIsTestRunLabel: "true", + agentcontainers.DevcontainerIsTestRunLabel: "true", }, }, }, @@ -944,14 +944,14 @@ func TestAPI(t *testing.T) { agentcontainers.DevcontainerConfigFileLabel: "/workspace/known2/.devcontainer/devcontainer.json", }, }, - { + { ID: "test-container-1", FriendlyName: "test-container-1", Running: true, Labels: map[string]string{ agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", - agentcontainers.DevcontainerIsTestRunLabel: "true", + agentcontainers.DevcontainerIsTestRunLabel: "true", }, }, }, @@ -1007,14 +1007,14 @@ func TestAPI(t *testing.T) { agentcontainers.DevcontainerConfigFileLabel: "/var/lib/project3/.devcontainer/devcontainer.json", }, }, - { + { ID: "test-container-1", FriendlyName: "test-container-1", Running: true, Labels: map[string]string{ agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", - agentcontainers.DevcontainerIsTestRunLabel: "true", + agentcontainers.DevcontainerIsTestRunLabel: "true", }, }, }, From 18f1c892923050cf45260429ad1a0bafcc5092ad Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Wed, 25 Jun 2025 10:55:06 +0000 Subject: [PATCH 3/3] improve test --- agent/agentcontainers/api_test.go | 76 +++++++++++-------------------- 1 file changed, 26 insertions(+), 50 deletions(-) diff --git a/agent/agentcontainers/api_test.go b/agent/agentcontainers/api_test.go index 249e110234f8a..e0197db919f8f 100644 --- a/agent/agentcontainers/api_test.go +++ b/agent/agentcontainers/api_test.go @@ -747,6 +747,7 @@ func TestAPI(t *testing.T) { knownDevcontainers []codersdk.WorkspaceAgentDevcontainer wantStatus int wantCount int + wantTestContainer bool verify func(t *testing.T, devcontainers []codersdk.WorkspaceAgentDevcontainer) }{ { @@ -793,16 +794,6 @@ func TestAPI(t *testing.T) { agentcontainers.DevcontainerConfigFileLabel: "/workspace/runtime1/.devcontainer/devcontainer.json", }, }, - { - ID: "test-container-1", - FriendlyName: "test-container-1", - Running: true, - Labels: map[string]string{ - agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", - agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", - agentcontainers.DevcontainerIsTestRunLabel: "true", - }, - }, { ID: "not-a-devcontainer", FriendlyName: "not-a-devcontainer", @@ -845,16 +836,6 @@ func TestAPI(t *testing.T) { agentcontainers.DevcontainerConfigFileLabel: "/workspace/runtime1/.devcontainer/devcontainer.json", }, }, - { - ID: "test-container-1", - FriendlyName: "test-container-1", - Running: true, - Labels: map[string]string{ - agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", - agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", - agentcontainers.DevcontainerIsTestRunLabel: "true", - }, - }, }, }, }, @@ -901,16 +882,6 @@ func TestAPI(t *testing.T) { agentcontainers.DevcontainerConfigFileLabel: "/workspace/non-running/.devcontainer/devcontainer.json", }, }, - { - ID: "test-container-1", - FriendlyName: "test-container-1", - Running: true, - Labels: map[string]string{ - agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", - agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", - agentcontainers.DevcontainerIsTestRunLabel: "true", - }, - }, }, }, }, @@ -944,16 +915,6 @@ func TestAPI(t *testing.T) { agentcontainers.DevcontainerConfigFileLabel: "/workspace/known2/.devcontainer/devcontainer.json", }, }, - { - ID: "test-container-1", - FriendlyName: "test-container-1", - Running: true, - Labels: map[string]string{ - agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", - agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", - agentcontainers.DevcontainerIsTestRunLabel: "true", - }, - }, }, }, }, @@ -1007,16 +968,6 @@ func TestAPI(t *testing.T) { agentcontainers.DevcontainerConfigFileLabel: "/var/lib/project3/.devcontainer/devcontainer.json", }, }, - { - ID: "test-container-1", - FriendlyName: "test-container-1", - Running: true, - Labels: map[string]string{ - agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", - agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", - agentcontainers.DevcontainerIsTestRunLabel: "true", - }, - }, }, }, }, @@ -1043,6 +994,13 @@ func TestAPI(t *testing.T) { assert.Len(t, names, 4, "should have four unique devcontainer names") }, }, + { + name: "Include test containers", + lister: &fakeContainerCLI{}, + wantStatus: http.StatusOK, + wantTestContainer: true, + wantCount: 1, // Will be appended. + }, } for _, tt := range tests { @@ -1055,6 +1013,18 @@ func TestAPI(t *testing.T) { mClock.Set(time.Now()).MustWait(testutil.Context(t, testutil.WaitShort)) tickerTrap := mClock.Trap().TickerFunc("updaterLoop") + // This container should be ignored unless explicitly included. + tt.lister.containers.Containers = append(tt.lister.containers.Containers, codersdk.WorkspaceAgentContainer{ + ID: "test-container-1", + FriendlyName: "test-container-1", + Running: true, + Labels: map[string]string{ + agentcontainers.DevcontainerLocalFolderLabel: "/workspace/test1", + agentcontainers.DevcontainerConfigFileLabel: "/workspace/test1/.devcontainer/devcontainer.json", + agentcontainers.DevcontainerIsTestRunLabel: "true", + }, + }) + // Setup router with the handler under test. r := chi.NewRouter() apiOptions := []agentcontainers.Option{ @@ -1063,6 +1033,12 @@ func TestAPI(t *testing.T) { agentcontainers.WithWatcher(watcher.NewNoop()), } + if tt.wantTestContainer { + apiOptions = append(apiOptions, agentcontainers.WithContainerLabelIncludeFilter( + agentcontainers.DevcontainerIsTestRunLabel, "true", + )) + } + // Generate matching scripts for the known devcontainers // (required to extract log source ID). var scripts []codersdk.WorkspaceAgentScript