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

Skip to content

Commit de1fc40

Browse files
authored
fix: consistent workspace status b/w CLI and UI (coder#2743)
1 parent 9776e66 commit de1fc40

File tree

4 files changed

+151
-28
lines changed

4 files changed

+151
-28
lines changed

cli/list.go

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

5959
now := time.Now()
6060
for _, workspace := range workspaces {
61-
status := ""
62-
inProgress := false
63-
if workspace.LatestBuild.Job.Status == codersdk.ProvisionerJobRunning ||
64-
workspace.LatestBuild.Job.Status == codersdk.ProvisionerJobCanceling {
65-
inProgress = true
66-
}
67-
68-
switch workspace.LatestBuild.Transition {
69-
case codersdk.WorkspaceTransitionStart:
70-
status = "Running"
71-
if inProgress {
72-
status = "Starting"
73-
}
74-
case codersdk.WorkspaceTransitionStop:
75-
status = "Stopped"
76-
if inProgress {
77-
status = "Stopping"
78-
}
79-
case codersdk.WorkspaceTransitionDelete:
80-
status = "Deleted"
81-
if inProgress {
82-
status = "Deleting"
83-
}
84-
}
85-
if workspace.LatestBuild.Job.Status == codersdk.ProvisionerJobFailed {
86-
status = "Failed"
87-
}
61+
status := codersdk.WorkspaceDisplayStatus(workspace.LatestBuild.Job.Status, workspace.LatestBuild.Transition)
8862

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

cli/list_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func TestList(t *testing.T) {
3737
close(done)
3838
}()
3939
pty.ExpectMatch(workspace.Name)
40-
pty.ExpectMatch("Running")
40+
pty.ExpectMatch("Started")
4141
cancelFunc()
4242
<-done
4343
})

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)