Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 139bc6f

Browse files
authored
chore: derive workspace status on backend (#4284)
1 parent d8008de commit 139bc6f

File tree

5 files changed

+126
-14
lines changed

5 files changed

+126
-14
lines changed

coderd/workspaces.go

+35
Original file line numberDiff line numberDiff line change
@@ -996,9 +996,44 @@ func convertWorkspace(
996996
AutostartSchedule: autostartSchedule,
997997
TTLMillis: ttlMillis,
998998
LastUsedAt: workspace.LastUsedAt,
999+
Status: convertStatus(workspaceBuild),
9991000
}
10001001
}
10011002

1003+
func convertStatus(build codersdk.WorkspaceBuild) codersdk.WorkspaceStatus {
1004+
switch build.Job.Status {
1005+
case codersdk.ProvisionerJobPending:
1006+
return codersdk.WorkspaceStatusPending
1007+
case codersdk.ProvisionerJobRunning:
1008+
switch build.Transition {
1009+
case codersdk.WorkspaceTransitionStart:
1010+
return codersdk.WorkspaceStatusStarting
1011+
case codersdk.WorkspaceTransitionStop:
1012+
return codersdk.WorkspaceStatusStopping
1013+
case codersdk.WorkspaceTransitionDelete:
1014+
return codersdk.WorkspaceStatusDeleting
1015+
}
1016+
case codersdk.ProvisionerJobSucceeded:
1017+
switch build.Transition {
1018+
case codersdk.WorkspaceTransitionStart:
1019+
return codersdk.WorkspaceStatusRunning
1020+
case codersdk.WorkspaceTransitionStop:
1021+
return codersdk.WorkspaceStatusStopped
1022+
case codersdk.WorkspaceTransitionDelete:
1023+
return codersdk.WorkspaceStatusDeleted
1024+
}
1025+
case codersdk.ProvisionerJobCanceling:
1026+
return codersdk.WorkspaceStatusCanceling
1027+
case codersdk.ProvisionerJobCanceled:
1028+
return codersdk.WorkspaceStatusCanceled
1029+
case codersdk.ProvisionerJobFailed:
1030+
return codersdk.WorkspaceStatusFailed
1031+
}
1032+
1033+
// return error status since we should never get here
1034+
return codersdk.WorkspaceStatusFailed
1035+
}
1036+
10021037
func convertWorkspaceTTLMillis(i sql.NullInt64) *int64 {
10031038
if !i.Valid {
10041039
return nil

coderd/workspaces_test.go

+46
Original file line numberDiff line numberDiff line change
@@ -1256,6 +1256,52 @@ func TestWorkspaceWatcher(t *testing.T) {
12561256
require.EqualValues(t, codersdk.Workspace{}, <-wc)
12571257
}
12581258

1259+
func TestWorkspaceStatus(t *testing.T) {
1260+
t.Parallel()
1261+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
1262+
defer cancel()
1263+
var (
1264+
client = coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
1265+
user = coderdtest.CreateFirstUser(t, client)
1266+
version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
1267+
_ = coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
1268+
template = coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
1269+
workspace = coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
1270+
)
1271+
1272+
// initial returned state is "pending"
1273+
require.EqualValues(t, codersdk.WorkspaceStatusPending, workspace.Status)
1274+
1275+
// after successful build is "running"
1276+
_ = coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
1277+
workspace, err := client.Workspace(ctx, workspace.ID)
1278+
require.NoError(t, err)
1279+
require.EqualValues(t, codersdk.WorkspaceStatusRunning, workspace.Status)
1280+
1281+
// after successful stop is "stopped"
1282+
build := coderdtest.CreateWorkspaceBuild(t, client, workspace, database.WorkspaceTransitionStop)
1283+
_ = coderdtest.AwaitWorkspaceBuildJob(t, client, build.ID)
1284+
workspace, err = client.Workspace(ctx, workspace.ID)
1285+
require.NoError(t, err)
1286+
require.EqualValues(t, codersdk.WorkspaceStatusStopped, workspace.Status)
1287+
1288+
// after successful cancel is "canceled"
1289+
build = coderdtest.CreateWorkspaceBuild(t, client, workspace, database.WorkspaceTransitionStart)
1290+
err = client.CancelWorkspaceBuild(ctx, build.ID)
1291+
require.NoError(t, err)
1292+
_ = coderdtest.AwaitWorkspaceBuildJob(t, client, build.ID)
1293+
workspace, err = client.Workspace(ctx, workspace.ID)
1294+
require.NoError(t, err)
1295+
require.EqualValues(t, codersdk.WorkspaceStatusCanceled, workspace.Status)
1296+
1297+
// after successful delete is "deleted"
1298+
build = coderdtest.CreateWorkspaceBuild(t, client, workspace, database.WorkspaceTransitionDelete)
1299+
_ = coderdtest.AwaitWorkspaceBuildJob(t, client, build.ID)
1300+
workspace, err = client.DeletedWorkspace(ctx, workspace.ID)
1301+
require.NoError(t, err)
1302+
require.EqualValues(t, codersdk.WorkspaceStatusDeleted, workspace.Status)
1303+
}
1304+
12591305
func mustLocation(t *testing.T, location string) *time.Location {
12601306
t.Helper()
12611307
loc, err := time.LoadLocation(location)

codersdk/workspaces.go

+30-14
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,38 @@ import (
1515
// Workspace is a deployment of a template. It references a specific
1616
// version and can be updated.
1717
type Workspace struct {
18-
ID uuid.UUID `json:"id"`
19-
CreatedAt time.Time `json:"created_at"`
20-
UpdatedAt time.Time `json:"updated_at"`
21-
OwnerID uuid.UUID `json:"owner_id"`
22-
OwnerName string `json:"owner_name"`
23-
TemplateID uuid.UUID `json:"template_id"`
24-
TemplateName string `json:"template_name"`
25-
TemplateIcon string `json:"template_icon"`
26-
LatestBuild WorkspaceBuild `json:"latest_build"`
27-
Outdated bool `json:"outdated"`
28-
Name string `json:"name"`
29-
AutostartSchedule *string `json:"autostart_schedule,omitempty"`
30-
TTLMillis *int64 `json:"ttl_ms,omitempty"`
31-
LastUsedAt time.Time `json:"last_used_at"`
18+
ID uuid.UUID `json:"id"`
19+
CreatedAt time.Time `json:"created_at"`
20+
UpdatedAt time.Time `json:"updated_at"`
21+
OwnerID uuid.UUID `json:"owner_id"`
22+
OwnerName string `json:"owner_name"`
23+
TemplateID uuid.UUID `json:"template_id"`
24+
TemplateName string `json:"template_name"`
25+
TemplateIcon string `json:"template_icon"`
26+
LatestBuild WorkspaceBuild `json:"latest_build"`
27+
Outdated bool `json:"outdated"`
28+
Name string `json:"name"`
29+
AutostartSchedule *string `json:"autostart_schedule,omitempty"`
30+
TTLMillis *int64 `json:"ttl_ms,omitempty"`
31+
LastUsedAt time.Time `json:"last_used_at"`
32+
Status WorkspaceStatus `json:"status"`
3233
}
3334

35+
type WorkspaceStatus string
36+
37+
const (
38+
WorkspaceStatusPending WorkspaceStatus = "pending"
39+
WorkspaceStatusStarting WorkspaceStatus = "starting"
40+
WorkspaceStatusRunning WorkspaceStatus = "running"
41+
WorkspaceStatusStopping WorkspaceStatus = "stopping"
42+
WorkspaceStatusStopped WorkspaceStatus = "stopped"
43+
WorkspaceStatusFailed WorkspaceStatus = "failed"
44+
WorkspaceStatusCanceling WorkspaceStatus = "canceling"
45+
WorkspaceStatusCanceled WorkspaceStatus = "canceled"
46+
WorkspaceStatusDeleting WorkspaceStatus = "deleting"
47+
WorkspaceStatusDeleted WorkspaceStatus = "deleted"
48+
)
49+
3450
// CreateWorkspaceBuildRequest provides options to update the latest workspace build.
3551
type CreateWorkspaceBuildRequest struct {
3652
TemplateVersionID uuid.UUID `json:"template_version_id,omitempty"`

site/src/api/typesGenerated.ts

+14
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,7 @@ export interface Workspace {
550550
readonly autostart_schedule?: string
551551
readonly ttl_ms?: number
552552
readonly last_used_at: string
553+
readonly status: WorkspaceStatus
553554
}
554555

555556
// From codersdk/workspaceresources.go
@@ -735,5 +736,18 @@ export type WorkspaceAgentStatus = "connected" | "connecting" | "disconnected"
735736
// From codersdk/workspaceapps.go
736737
export type WorkspaceAppHealth = "disabled" | "healthy" | "initializing" | "unhealthy"
737738

739+
// From codersdk/workspaces.go
740+
export type WorkspaceStatus =
741+
| "canceled"
742+
| "canceling"
743+
| "deleted"
744+
| "deleting"
745+
| "failed"
746+
| "pending"
747+
| "running"
748+
| "starting"
749+
| "stopped"
750+
| "stopping"
751+
738752
// From codersdk/workspacebuilds.go
739753
export type WorkspaceTransition = "delete" | "start" | "stop"

site/src/testHelpers/entities.ts

+1
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ export const MockWorkspace: TypesGen.Workspace = {
268268
ttl_ms: 2 * 60 * 60 * 1000, // 2 hours as milliseconds
269269
latest_build: MockWorkspaceBuild,
270270
last_used_at: "",
271+
status: "running",
271272
}
272273

273274
export const MockStoppedWorkspace: TypesGen.Workspace = {

0 commit comments

Comments
 (0)