Skip to content

Commit 6e6b7a3

Browse files
committed
move util to codersdk package
1 parent 558ef96 commit 6e6b7a3

5 files changed

+154
-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,105 @@
1+
package codersdk
2+
3+
import "testing"
4+
5+
func TestWorkspaceDisplayStatus(t *testing.T) {
6+
t.Parallel()
7+
type args struct {
8+
jobStatus ProvisionerJobStatus
9+
transition WorkspaceTransition
10+
}
11+
tests := []struct {
12+
name string
13+
jobStatus ProvisionerJobStatus
14+
transition WorkspaceTransition
15+
want string
16+
}{
17+
{
18+
name: "SucceededStatusWithStartTransition",
19+
jobStatus: ProvisionerJobSucceeded,
20+
transition: WorkspaceTransitionStart,
21+
want: "Started",
22+
},
23+
{
24+
name: "SucceededStatusWithStopTransition",
25+
jobStatus: ProvisionerJobSucceeded,
26+
transition: WorkspaceTransitionStop,
27+
want: "Stopped",
28+
},
29+
{
30+
name: "SucceededStatusWithDeleteTransition",
31+
jobStatus: ProvisionerJobSucceeded,
32+
transition: WorkspaceTransitionDelete,
33+
want: "Deleted",
34+
},
35+
{
36+
name: "RunningStatusWithStartTransition",
37+
jobStatus: ProvisionerJobRunning,
38+
transition: WorkspaceTransitionStart,
39+
want: "Starting",
40+
},
41+
{
42+
name: "RunningStatusWithStopTransition",
43+
jobStatus: ProvisionerJobRunning,
44+
transition: WorkspaceTransitionStop,
45+
want: "Stopping",
46+
},
47+
{
48+
name: "RunningStatusWithDeleteTransition",
49+
jobStatus: ProvisionerJobRunning,
50+
transition: WorkspaceTransitionDelete,
51+
want: "Deleting",
52+
},
53+
{
54+
name: "PendingStatusWithStartTransition",
55+
jobStatus: ProvisionerJobPending,
56+
transition: WorkspaceTransitionStart,
57+
want: "Queued",
58+
},
59+
{
60+
name: "CancelingStatusWithStartTransition",
61+
jobStatus: ProvisionerJobCanceling,
62+
transition: WorkspaceTransitionStart,
63+
want: "Canceling action",
64+
},
65+
{
66+
name: "CanceledStatusWithStartTransition",
67+
jobStatus: ProvisionerJobCanceled,
68+
transition: WorkspaceTransitionStart,
69+
want: "Canceled action",
70+
},
71+
{
72+
name: "FailedStatusWithDeleteTransition",
73+
jobStatus: ProvisionerJobFailed,
74+
transition: WorkspaceTransitionDelete,
75+
want: "Failed",
76+
},
77+
{
78+
name: "EmptyStatusWithDeleteTransition",
79+
jobStatus: "",
80+
transition: WorkspaceTransitionDelete,
81+
want: unknownStatus,
82+
},
83+
{
84+
name: "RunningStatusWithEmptyTransition",
85+
jobStatus: ProvisionerJobRunning,
86+
transition: "",
87+
want: unknownStatus,
88+
},
89+
{
90+
name: "SucceededStatusWithEmptyTransition",
91+
jobStatus: ProvisionerJobSucceeded,
92+
transition: "",
93+
want: unknownStatus,
94+
},
95+
}
96+
for _, tt := range tests {
97+
tt := tt
98+
t.Run(tt.name, func(t *testing.T) {
99+
t.Parallel()
100+
if got := WorkspaceDisplayStatus(tt.jobStatus, tt.transition); got != tt.want {
101+
t.Errorf("workspaceStatus() = %v, want %v", got, tt.want)
102+
}
103+
})
104+
}
105+
}

0 commit comments

Comments
 (0)