Skip to content

Commit 28d0f4c

Browse files
committed
move util to codersdk package
1 parent 558ef96 commit 28d0f4c

5 files changed

+150
-158
lines changed

cli/list.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func list() *cobra.Command {
5858

5959
now := time.Now()
6060
for _, workspace := range workspaces {
61-
status := workspaceStatus(workspace.LatestBuild.Job.Status, workspace.LatestBuild.Transition)
61+
status := codersdk.WorkspaceDisplayStatus(workspace.LatestBuild.Job.Status, workspace.LatestBuild.Transition)
6262

6363
lastBuilt := time.Now().UTC().Sub(workspace.LatestBuild.Job.CreatedAt).Truncate(time.Second)
6464
autostartDisplay := "-"

cli/workspacestatus.go

-39
This file was deleted.

cli/workspacestatus_internal_test.go

-118
This file was deleted.

codersdk/workspacedisplaystatus.go

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package codersdk
2+
3+
// Maps workspace transition to display status for Running job status
4+
var runningStatusFromTransition = map[WorkspaceTransition]string{
5+
WorkspaceTransitionStart: "Starting",
6+
WorkspaceTransitionStop: "Stopping",
7+
WorkspaceTransitionDelete: "Deleting",
8+
}
9+
10+
// Maps workspace transition to display status for Succeeded job status
11+
var succeededStatusFromTransition = map[WorkspaceTransition]string{
12+
WorkspaceTransitionStart: "Started",
13+
WorkspaceTransitionStop: "Stopped",
14+
WorkspaceTransitionDelete: "Deleted",
15+
}
16+
17+
const unknownStatus = "Unknown"
18+
19+
// WorkspaceDisplayStatus computes a status to display on CLI/UI based on
20+
// the workspace transition and the status of the provisioner job.
21+
// This code is in sync with how we compute the status on frontend.
22+
// Ref: site/src/util/workspace.ts (getWorkspaceStatus)
23+
func WorkspaceDisplayStatus(jobStatus ProvisionerJobStatus, transition WorkspaceTransition) string {
24+
switch jobStatus {
25+
case ProvisionerJobSucceeded:
26+
status, ok := succeededStatusFromTransition[transition]
27+
if !ok {
28+
return unknownStatus
29+
}
30+
return status
31+
case ProvisionerJobRunning:
32+
status, ok := runningStatusFromTransition[transition]
33+
if !ok {
34+
return unknownStatus
35+
}
36+
return status
37+
case ProvisionerJobPending:
38+
return "Queued"
39+
case ProvisionerJobCanceling:
40+
return "Canceling action"
41+
case ProvisionerJobCanceled:
42+
return "Canceled action"
43+
case ProvisionerJobFailed:
44+
return "Failed"
45+
default:
46+
return unknownStatus
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package codersdk
2+
3+
import "testing"
4+
5+
func TestWorkspaceDisplayStatus(t *testing.T) {
6+
t.Parallel()
7+
tests := []struct {
8+
name string
9+
jobStatus ProvisionerJobStatus
10+
transition WorkspaceTransition
11+
want string
12+
}{
13+
{
14+
name: "SucceededStatusWithStartTransition",
15+
jobStatus: ProvisionerJobSucceeded,
16+
transition: WorkspaceTransitionStart,
17+
want: "Started",
18+
},
19+
{
20+
name: "SucceededStatusWithStopTransition",
21+
jobStatus: ProvisionerJobSucceeded,
22+
transition: WorkspaceTransitionStop,
23+
want: "Stopped",
24+
},
25+
{
26+
name: "SucceededStatusWithDeleteTransition",
27+
jobStatus: ProvisionerJobSucceeded,
28+
transition: WorkspaceTransitionDelete,
29+
want: "Deleted",
30+
},
31+
{
32+
name: "RunningStatusWithStartTransition",
33+
jobStatus: ProvisionerJobRunning,
34+
transition: WorkspaceTransitionStart,
35+
want: "Starting",
36+
},
37+
{
38+
name: "RunningStatusWithStopTransition",
39+
jobStatus: ProvisionerJobRunning,
40+
transition: WorkspaceTransitionStop,
41+
want: "Stopping",
42+
},
43+
{
44+
name: "RunningStatusWithDeleteTransition",
45+
jobStatus: ProvisionerJobRunning,
46+
transition: WorkspaceTransitionDelete,
47+
want: "Deleting",
48+
},
49+
{
50+
name: "PendingStatusWithStartTransition",
51+
jobStatus: ProvisionerJobPending,
52+
transition: WorkspaceTransitionStart,
53+
want: "Queued",
54+
},
55+
{
56+
name: "CancelingStatusWithStartTransition",
57+
jobStatus: ProvisionerJobCanceling,
58+
transition: WorkspaceTransitionStart,
59+
want: "Canceling action",
60+
},
61+
{
62+
name: "CanceledStatusWithStartTransition",
63+
jobStatus: ProvisionerJobCanceled,
64+
transition: WorkspaceTransitionStart,
65+
want: "Canceled action",
66+
},
67+
{
68+
name: "FailedStatusWithDeleteTransition",
69+
jobStatus: ProvisionerJobFailed,
70+
transition: WorkspaceTransitionDelete,
71+
want: "Failed",
72+
},
73+
{
74+
name: "EmptyStatusWithDeleteTransition",
75+
jobStatus: "",
76+
transition: WorkspaceTransitionDelete,
77+
want: unknownStatus,
78+
},
79+
{
80+
name: "RunningStatusWithEmptyTransition",
81+
jobStatus: ProvisionerJobRunning,
82+
transition: "",
83+
want: unknownStatus,
84+
},
85+
{
86+
name: "SucceededStatusWithEmptyTransition",
87+
jobStatus: ProvisionerJobSucceeded,
88+
transition: "",
89+
want: unknownStatus,
90+
},
91+
}
92+
for _, tt := range tests {
93+
tt := tt
94+
t.Run(tt.name, func(t *testing.T) {
95+
t.Parallel()
96+
if got := WorkspaceDisplayStatus(tt.jobStatus, tt.transition); got != tt.want {
97+
t.Errorf("workspaceStatus() = %v, want %v", got, tt.want)
98+
}
99+
})
100+
}
101+
}

0 commit comments

Comments
 (0)