Skip to content

Commit 558ef96

Browse files
committed
fix: consistent workspace status b/w CLI and UI
1 parent 482feef commit 558ef96

File tree

4 files changed

+159
-28
lines changed

4 files changed

+159
-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 := workspaceStatus(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
})

cli/workspacestatus.go

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package cli
2+
3+
import (
4+
"github.com/coder/coder/codersdk"
5+
)
6+
7+
var inProgressToStatus = map[codersdk.WorkspaceTransition]string{
8+
codersdk.WorkspaceTransitionStart: "Starting",
9+
codersdk.WorkspaceTransitionStop: "Stopping",
10+
codersdk.WorkspaceTransitionDelete: "Deleting",
11+
}
12+
var succeededToStatus = map[codersdk.WorkspaceTransition]string{
13+
codersdk.WorkspaceTransitionStart: "Started",
14+
codersdk.WorkspaceTransitionStop: "Stopped",
15+
codersdk.WorkspaceTransitionDelete: "Deleted",
16+
}
17+
18+
// workspaceStatus computes a status to display on CLI based on
19+
// the workspace transition and the status of the provisioner job.
20+
// This code is in sync with how we compute the status on frontend.
21+
// Ref: site/src/util/workspace.ts (getWorkspaceStatus)
22+
func workspaceStatus(jobStatus codersdk.ProvisionerJobStatus, transition codersdk.WorkspaceTransition) string {
23+
switch jobStatus {
24+
case codersdk.ProvisionerJobSucceeded:
25+
return succeededToStatus[transition]
26+
case codersdk.ProvisionerJobRunning:
27+
return inProgressToStatus[transition]
28+
case codersdk.ProvisionerJobPending:
29+
return "Queued"
30+
case codersdk.ProvisionerJobCanceling:
31+
return "Canceling action"
32+
case codersdk.ProvisionerJobCanceled:
33+
return "Canceled action"
34+
case codersdk.ProvisionerJobFailed:
35+
return "Failed"
36+
default:
37+
return "Loading..."
38+
}
39+
}

cli/workspacestatus_internal_test.go

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

0 commit comments

Comments
 (0)