8000 Merge remote-tracking branch 'origin/main' into stevenmasley/param_fo… · coder/coder@6e9beed · GitHub
[go: up one dir, main page]

Skip to content

Commit 6e9beed

Browse files
committed
Merge remote-tracking branch 'origin/main' into stevenmasley/param_form_type
2 parents cedf39f + 513a468 commit 6e9beed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+1909
-319
lines changed

agent/agent_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2226,7 +2226,7 @@ func TestAgent_DevcontainerRecreate(t *testing.T) {
22262226
// devcontainer, we do it in a goroutine so we can process logs
22272227
// concurrently.
22282228
go func(container codersdk.WorkspaceAgentContainer) {
2229-
err := conn.RecreateDevcontainer(ctx, container.ID)
2229+
_, err := conn.RecreateDevcontainer(ctx, container.ID)
22302230
assert.NoError(t, err, "recreate devcontainer should succeed")
22312231
}(container)
22322232

agent/agentcontainers/api.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ func (api *API) processUpdatedContainersLocked(ctx context.Context, updated code
403403
// Check if the container is running and update the known devcontainers.
404404
for i := range updated.Containers {
405405
container := &updated.Containers[i] // Grab a reference to the container to allow mutating it.
406+
container.DevcontainerStatus = "" // Reset the status for the container (updated later).
406407
container.DevcontainerDirty = false // Reset dirty state for the container (updated later).
407408

408409
workspaceFolder := container.Labels[DevcontainerLocalFolderLabel]
@@ -465,16 +466,25 @@ func (api *API) processUpdatedContainersLocked(ctx context.Context, updated code
465466
for _, dc := range api.knownDevcontainers {
466467
switch {
467468
case dc.Status == codersdk.WorkspaceAgentDevcontainerStatusStarting:
469+
if dc.Container != nil {
470+
dc.Container.DevcontainerStatus = dc.Status
471+
dc.Container.DevcontainerDirty = dc.Dirty
472+
}
468473
continue // This state is handled by the recreation routine.
469474

470475
case dc.Status == codersdk.WorkspaceAgentDevcontainerStatusError && (dc.Container == nil || dc.Container.CreatedAt.Before(api.recreateErrorTimes[dc.WorkspaceFolder])):
476+
if dc.Container != nil {
477+
dc.Container.DevcontainerStatus = dc.Status
478+
dc.Container.DevcontainerDirty = dc.Dirty
479+
}
471480
continue // The devcontainer needs to be recreated.
472481

473482
case dc.Container != nil:
474483
dc.Status = codersdk.WorkspaceAgentDevcontainerStatusStopped
475484
if dc.Container.Running {
476485
dc.Status = codersdk.WorkspaceAgentDevcontainerStatusRunning
477486
}
487+
dc.Container.DevcontainerStatus = dc.Status
478488

479489
dc.Dirty = false
480490
if lastModified, hasModTime := api.configFileModifiedTimes[dc.ConfigPath]; hasModTime && dc.Container.CreatedAt.Before(lastModified) {
@@ -608,6 +618,9 @@ func (api *API) handleDevcontainerRecreate(w http.ResponseWriter, r *http.Reques
608618
// Update the status so that we don't try to recreate the
609619
// devcontainer multiple times in parallel.
610620
dc.Status = codersdk.WorkspaceAgentDevcontainerStatusStarting
621+
if dc.Container != nil {
622+
dc.Container.DevcontainerStatus = dc.Status
623+
}
611624
api.knownDevcontainers[dc.WorkspaceFolder] = dc
612625
api.recreateWg.Add(1)
613626
go api.recreateDevcontainer(dc, configPath)
@@ -680,6 +693,9 @@ func (api *API) recreateDevcontainer(dc codersdk.WorkspaceAgentDevcontainer, con
680693
api.mu.Lock()
681694
dc = api.knownDevcontainers[dc.WorkspaceFolder]
682695
dc.Status = codersdk.WorkspaceAgentDevcontainerStatusError
696+
if dc.Container != nil {
697+
dc.Container.DevcontainerStatus = dc.Status
698+
}
683699
api.knownDevcontainers[dc.WorkspaceFolder] = dc
684700
api.recreateErrorTimes[dc.WorkspaceFolder] = api.clock.Now("recreate", "errorTimes")
685701
api.mu.Unlock()
@@ -695,10 +711,12 @@ func (api *API) recreateDevcontainer(dc codersdk.WorkspaceAgentDevcontainer, con
695711
// allows the update routine to update the devcontainer status, but
696712
// to minimize the time between API consistency, we guess the status
697713
// based on the container state.
698-
if dc.Container != nil && dc.Container.Running {
699-
dc.Status = codersdk.WorkspaceAgentDevcontainerStatusRunning
700-
} else {
701-
dc.Status = codersdk.WorkspaceAgentDevcontainerStatusStopped
714+
dc.Status = codersdk.WorkspaceAgentDevcontainerStatusStopped
715+
if dc.Container != nil {
716+
if dc.Container.Running {
717+
dc.Status = codersdk.WorkspaceAgentDevcontainerStatusRunning
718+
}
719+
dc.Container.DevcontainerStatus = dc.Status
702720
}
703721
dc.Dirty = false
704722
api.recreateSuccessTimes[dc.WorkspaceFolder] = api.clock.Now("recreate", "successTimes")

agent/agentcontainers/api_test.go

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,8 @@ func TestAPI(t *testing.T) {
477477
require.NoError(t, err, "unmarshal response failed")
478478
require.Len(t, resp.Devcontainers, 1, "expected one devcontainer in response")
479479
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusStarting, resp.Devcontainers[0].Status, "devcontainer is not starting")
480+
require.NotNil(t, resp.Devcontainers[0].Container, "devcontainer should have container reference")
481+
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusStarting, resp.Devcontainers[0].Container.DevcontainerStatus, "container dc status is not starting")
480482

481483
// Allow the devcontainer CLI to continue the up process.
482484
close(tt.devcontainerCLI.continueUp)
@@ -503,6 +505,8 @@ func TestAPI(t *testing.T) {
503505
require.NoError(t, err, "unmarshal response failed after error")
504506
require.Len(t, resp.Devcontainers, 1, "expected one devcontainer in response after error")
505507
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusError, resp.Devcontainers[0].Status, "devcontainer is not in an error state after up failure")
508+
require.NotNil(t, resp.Devcontainers[0].Container, "devcontainer should have container reference after up failure")
509+
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusError, resp.Devcontainers[0].Container.DevcontainerStatus, "container dc status is not error after up failure")
506510
return
507511
}
508512

@@ -525,7 +529,9 @@ func TestAPI(t *testing.T) {
525529
err = json.NewDecoder(rec.Body).Decode(&resp)
526530
require.NoError(t, err, "unmarshal response failed after recreation")
527531
require.Len(t, resp.Devcontainers, 1, "expected one devcontainer in response after recreation")
528-
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusRunning, resp.Devcontainers[0].Status, "devcontainer is not stopped after recreation")
532+
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusRunning, resp.Devcontainers[0].Status, "devcontainer is not running after recreation")
533+
require.NotNil(t, resp.Devcontainers[0].Container, "devcontainer should have container reference after recreation")
534+
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusRunning, resp.Devcontainers[0].Container.DevcontainerStatus, "container dc status is not running after recreation")
529535
})
530536
}
531537
})
@@ -620,6 +626,7 @@ func TestAPI(t *testing.T) {
620626
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusRunning, dc.Status)
621627
require.NotNil(t, dc.Container)
622628
assert.Equal(t, "runtime-container-1", dc.Container.ID)
629+
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusRunning, dc.Container.DevcontainerStatus)
623630
},
624631
},
625632
{
@@ -660,12 +667,14 @@ func TestAPI(t *testing.T) {
660667
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusStopped, known2.Status)
661668
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusRunning, runtime1.Status)
662669

663-
require.NotNil(t, known1.Container)
664670
assert.Nil(t, known2.Container)
665-
require.NotNil(t, runtime1.Container)
666671

672+
require.NotNil(t, known1.Container)
667673
assert.Equal(t, "known-container-1", known1.Container.ID)
674+
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusRunning, known1.Container.DevcontainerStatus)
675+
require.NotNil(t, runtime1.Container)
668676
assert.Equal(t, "runtime-container-1", runtime1.Container.ID)
677+
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusRunning, runtime1.Container.DevcontainerStatus)
669678
},
670679
},
671680
{
@@ -704,10 +713,12 @@ func TestAPI(t *testing.T) {
704713
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusStopped, nonRunning.Status)
705714

706715
require.NotNil(t, running.Container, "running container should have container reference")
707-
require.NotNil(t, nonRunning.Container, "non-running container should have container reference")
708-
709716
assert.Equal(t, "running-container", running.Container.ID)
717+
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusRunning, running.Container.DevcontainerStatus)
718+
719+
require.NotNil(t, nonRunning.Container, "non-running container should have container reference")
710720
assert.Equal(t, "non-running-container", nonRunning.Container.ID)
721+
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusStopped, nonRunning.Container.DevcontainerStatus)
711722
},
712723
},
713724
{
@@ -743,6 +754,7 @@ func TestAPI(t *testing.T) {
743754
assert.NotEmpty(t, dc2.ConfigPath)
744755
require.NotNil(t, dc2.Container)
745756
assert.Equal(t, "known-container-2", dc2.Container.ID)
757+
assert.Equal(t, codersdk.WorkspaceAgentDevcontainerStatusRunning, dc2.Container.DevcontainerStatus)
746758
},
747759
},
748760
{
@@ -811,9 +823,14 @@ func TestAPI(t *testing.T) {
811823

812824
logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}).Leveled(slog.LevelDebug)
813825

826+
mClock := quartz.NewMock(t)
827+
mClock.Set(time.Now()).MustWait(testutil.Context(t, testutil.WaitShort))
828+
tickerTrap := mClock.Trap().TickerFunc("updaterLoop")
829+
814830
// Setup router with the handler under test.
815831
r := chi.NewRouter()
816832
apiOptions := []agentcontainers.Option{
833+
agentcontainers.WithClock(mClock),
817834
agentcontainers.WithLister(tt.lister),
818835
agentcontainers.WithWatcher(watcher.NewNoop()),
819836
}
@@ -838,6 +855,15 @@ func TestAPI(t *testing.T) {
838855

839856
ctx := testutil.Context(t, testutil.WaitShort)
840857

858+
// Make sure the ticker function has been registered
859+
// before advancing the clock.
860+
tickerTrap.MustWait(ctx).MustRelease(ctx)
861+
tickerTrap.Close()
862+
863+
// Advance the clock to run the updater loop.
864+
_, aw := mClock.AdvanceNext()
865+
aw.MustWait(ctx)
866+
841867
req := httptest.NewRequest(http.MethodGet, "/devcontainers", nil).
842868
WithContext(ctx)
843869
rec := httptest.NewRecorder()

cli/testdata/coder_list_--output_json.golden

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"workspace_id": "===========[workspace ID]===========",
2424
"workspace_name": "test-workspace",
2525
"workspace_owner_id": "==========[first user ID]===========",
26-
"workspace_owner_name": "testuser",
26+
"workspace_owner_username": "testuser",
2727
"template_version_id": "============[version ID]============",
2828
"template_version_name": "===========[version name]===========",
2929
"build_number": 1,

coderd/apidoc/docs.go

Lines changed: 31 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

Lines changed: 26 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbmem/dbmem.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,7 @@ func (q *FakeQuerier) convertToWorkspaceRowsNoLock(ctx context.Context, workspac
531531

532532
OwnerAvatarUrl: extended.OwnerAvatarUrl,
533533
OwnerUsername: extended.OwnerUsername,
534+
OwnerName: extended.OwnerName,
534535

535536
OrganizationName: extended.OrganizationName,
536537
OrganizationDisplayName: extended.OrganizationDisplayName,
@@ -628,6 +629,7 @@ func (q *FakeQuerier) extendWorkspace(w database.WorkspaceTable) database.Worksp
628629
return u.ID == w.OwnerID
629630
})
630631
extended.OwnerUsername = owner.Username
632+
extended.OwnerName = owner.Name
631633
extended.OwnerAvatarUrl = owner.AvatarURL
632634

633635
return extended

coderd/database/dump.sql

Lines changed: 7 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
0