Skip to content

Commit 07ac6c5

Browse files
committed
[wsman-mk2] Refactor conditions
1 parent b39902f commit 07ac6c5

File tree

5 files changed

+112
-79
lines changed

5 files changed

+112
-79
lines changed

components/ws-daemon/pkg/controller/workspace_controller.go

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -170,20 +170,9 @@ func (wsc *WorkspaceController) handleWorkspaceInit(ctx context.Context, ws *wor
170170

171171
if failure != "" {
172172
log.Error(initErr, "could not initialize workspace", "name", ws.Name)
173-
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
174-
Type: string(workspacev1.WorkspaceConditionContentReady),
175-
Status: metav1.ConditionFalse,
176-
Message: failure,
177-
Reason: "InitializationFailure",
178-
LastTransitionTime: metav1.Now(),
179-
})
173+
ws.Status.SetCondition(workspacev1.NewWorkspaceConditionContentReady(metav1.ConditionFalse, "InitializationFailure", failure))
180174
} else {
181-
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
182-
Type: string(workspacev1.WorkspaceConditionContentReady),
183-
Status: metav1.ConditionTrue,
184-
Reason: "InitializationSuccess",
185-
LastTransitionTime: metav1.Now(),
186-
})
175+
ws.Status.SetCondition(workspacev1.NewWorkspaceConditionContentReady(metav1.ConditionTrue, "InitializationSuccess", ""))
187176
}
188177

189178
return wsc.Status().Update(ctx, ws)
@@ -276,20 +265,9 @@ func (wsc *WorkspaceController) handleWorkspaceStop(ctx context.Context, ws *wor
276265

277266
if disposeErr != nil {
278267
log.Error(disposeErr, "failed to dispose workspace", "name", ws.Name)
279-
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
280-
Type: string(workspacev1.WorkspaceConditionBackupFailure),
281-
Status: metav1.ConditionTrue,
282-
Reason: "BackupFailed",
283-
Message: disposeErr.Error(),
284-
LastTransitionTime: metav1.Now(),
285-
})
268+
ws.Status.SetCondition(workspacev1.NewWorkspaceConditionBackupFailure(disposeErr.Error()))
286269
} else {
287-
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
288-
Type: string(workspacev1.WorkspaceConditionBackupComplete),
289-
Status: metav1.ConditionTrue,
290-
Reason: "BackupComplete",
291-
LastTransitionTime: metav1.Now(),
292-
})
270+
ws.Status.SetCondition(workspacev1.NewWorkspaceConditionBackupComplete())
293271
}
294272

295273
return wsc.Status().Update(ctx, ws)

components/ws-manager-api/go/crd/v1/workspace_types.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package v1
66

77
import (
8+
wsk8s "github.com/gitpod-io/gitpod/common-go/kubernetes"
89
corev1 "k8s.io/api/core/v1"
910
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1011
)
@@ -140,6 +141,10 @@ type WorkspaceStatus struct {
140141
Runtime *WorkspaceRuntimeStatus `json:"runtime,omitempty"`
141142
}
142143

144+
func (s *WorkspaceStatus) SetCondition(cond metav1.Condition) {
145+
s.Conditions = wsk8s.AddUniqueCondition(s.Conditions, cond)
146+
}
147+
143148
// +kubebuilder:validation:Enum=Deployed;Failed;Timeout;FirstUserActivity;Closed;HeadlessTaskFailed;StoppedByRequest;Aborted;ContentReady;BackupComplete;BackupFailure
144149
type WorkspaceCondition string
145150

@@ -180,6 +185,99 @@ const (
180185
WorkspaceConditionBackupFailure WorkspaceCondition = "BackupFailure"
181186
)
182187

188+
func NewWorkspaceConditionDeployed() metav1.Condition {
189+
return metav1.Condition{
190+
Type: string(WorkspaceConditionDeployed),
191+
LastTransitionTime: metav1.Now(),
192+
Status: metav1.ConditionTrue,
193+
}
194+
}
195+
196+
func NewWorkspaceConditionFailed(message string) metav1.Condition {
197+
return metav1.Condition{
198+
Type: string(WorkspaceConditionFailed),
199+
LastTransitionTime: metav1.Now(),
200+
Status: metav1.ConditionTrue,
201+
Message: message,
202+
}
203+
}
204+
205+
func NewWorkspaceConditionTimeout(message string) metav1.Condition {
206+
return metav1.Condition{
207+
Type: string(WorkspaceConditionTimeout),
208+
LastTransitionTime: metav1.Now(),
209+
Status: metav1.ConditionTrue,
210+
Reason: "TimedOut",
211+
Message: message,
212+
}
213+
}
214+
215+
func NewWorkspaceConditionFirstUserActivity() metav1.Condition {
216+
return metav1.Condition{
217+
Type: string(WorkspaceConditionFirstUserActivity),
218+
LastTransitionTime: metav1.Now(),
219+
Status: metav1.ConditionTrue,
220+
Reason: "MarkActiveRequest",
221+
}
222+
}
223+
224+
func NewWorkspaceConditionClosed(status metav1.ConditionStatus) metav1.Condition {
225+
return metav1.Condition{
226+
Type: string(WorkspaceConditionClosed),
227+
LastTransitionTime: metav1.Now(),
228+
Status: status,
229+
Reason: "MarkActiveRequest",
230+
}
231+
}
232+
233+
func NewWorkspaceConditionStoppedByRequest(message string) metav1.Condition {
234+
return metav1.Condition{
235+
Type: string(WorkspaceConditionStoppedByRequest),
236+
LastTransitionTime: metav1.Now(),
237+
Status: metav1.ConditionTrue,
238+
Reason: "StopWorkspaceRequest",
239+
Message: message,
240+
}
241+
}
242+
243+
func NewWorkspaceConditionAborted(reason string) metav1.Condition {
244+
return metav1.Condition{
245+
Type: string(WorkspaceConditionAborted),
246+
LastTransitionTime: metav1.Now(),
247+
Status: metav1.ConditionTrue,
248+
Reason: reason,
249+
}
250+
}
251+
252+
func NewWorkspaceConditionContentReady(status metav1.ConditionStatus, reason, message string) metav1.Condition {
253+
return metav1.Condition{
254+
Type: string(WorkspaceConditionContentReady),
255+
LastTransitionTime: metav1.Now(),
256+
Status: status,
257+
Reason: reason,
258+
Message: message,
259+
}
260+
}
261+
262+
func NewWorkspaceConditionBackupComplete() metav1.Condition {
263+
return metav1.Condition{
264+
Type: string(WorkspaceConditionBackupComplete),
265+
LastTransitionTime: metav1.Now(),
266+
Status: metav1.ConditionTrue,
267+
Reason: "BackupComplete",
268+
}
269+
}
270+
271+
func NewWorkspaceConditionBackupFailure(message string) metav1.Condition {
272+
return metav1.Condition{
273+
Type: string(WorkspaceConditionBackupFailure),
274+
LastTransitionTime: metav1.Now(),
275+
Status: metav1.ConditionTrue,
276+
Reason: "BackupFailed",
277+
Message: message,
278+
}
279+
}
280+
183281
// +kubebuilder:validation:Enum:=Unknown;Pending;Imagebuild;Creating;Initializing;Running;Stopping;Stopped
184282
type WorkspacePhase string
185283

components/ws-manager-mk2/controllers/status.go

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,13 @@ func updateWorkspaceStatus(ctx context.Context, workspace *workspacev1.Workspace
4848
// continue below
4949
default:
5050
// This is exceptional - not sure what to do here. Probably fail the pod
51-
workspace.Status.Conditions = wsk8s.AddUniqueCondition(workspace.Status.Conditions, metav1.Condition{
52-
Type: string(workspacev1.WorkspaceConditionFailed),
53-
Status: metav1.ConditionTrue,
54-
LastTransitionTime: metav1.Now(),
55-
Message: "multiple pods exists - this should never happen",
56-
})
57-
51+
workspace.Status.SetCondition(
52+
workspacev1.NewWorkspaceConditionFailed("multiple pods exists - this should never happen"))
5853
return nil
5954
}
6055

6156
if c := wsk8s.GetCondition(workspace.Status.Conditions, string(workspacev1.WorkspaceConditionDeployed)); c == nil {
62-
workspace.Status.Conditions = wsk8s.AddUniqueCondition(workspace.Status.Conditions, metav1.Condition{
63-
Type: string(workspacev1.WorkspaceConditionDeployed),
64-
Status: metav1.ConditionTrue,
65-
LastTransitionTime: metav1.Now(),
66-
})
57+
workspace.Status.SetCondition(workspacev1.NewWorkspaceConditionDeployed())
6758
}
6859

6960
pod := &pods.Items[0]

components/ws-manager-mk2/controllers/timeout_controller.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"time"
1111

1212
apierrors "k8s.io/apimachinery/pkg/api/errors"
13-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1413
"k8s.io/apimachinery/pkg/types"
1514
"k8s.io/client-go/util/retry"
1615
ctrl "sigs.k8s.io/controller-runtime"
@@ -103,14 +102,7 @@ func (r *TimeoutReconciler) Reconcile(ctx context.Context, req ctrl.Request) (re
103102
return err
104103
}
105104

106-
workspace.Status.Conditions = wsk8s.AddUniqueCondition(workspace.Status.Conditions, metav1.Condition{
107-
Type: string(workspacev1.WorkspaceConditionTimeout),
108-
Status: metav1.ConditionTrue,
109-
LastTransitionTime: metav1.Now(),
110-
Reason: "TimedOut",
111-
Message: timedout,
112-
})
113-
105+
workspace.Status.SetCondition(workspacev1.NewWorkspaceConditionTimeout(timedout))
114106
return r.Status().Update(ctx, &workspace)
115107
}); err != nil {
116108
log.Error(err, "Failed to update workspace status with Timeout condition")

components/ws-manager-mk2/service/manager.go

Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -356,25 +356,14 @@ func (wsm *WorkspaceManagerServer) StopWorkspace(ctx context.Context, req *wsman
356356
span.LogKV("policy", "abort")
357357
gracePeriod = stopWorkspaceImmediatelyGracePeriod
358358
if err = wsm.modifyWorkspace(ctx, req.Id, true, func(ws *workspacev1.Workspace) error {
359-
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
360-
Type: string(workspacev1.WorkspaceConditionAborted),
361-
Status: metav1.ConditionTrue,
362-
Reason: "StopWorkspaceRequest",
363-
LastTransitionTime: metav1.Now(),
364-
})
359+
ws.Status.SetCondition(workspacev1.NewWorkspaceConditionAborted("StopWorkspaceRequest"))
365360
return nil
366361
}); err != nil {
367362
log.Error(err, "failed to add Aborted condition to workspace")
368363
}
369364
}
370365
err = wsm.modifyWorkspace(ctx, req.Id, true, func(ws *workspacev1.Workspace) error {
371-
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
372-
Type: string(workspacev1.WorkspaceConditionStoppedByRequest),
373-
Status: metav1.ConditionTrue,
374-
LastTransitionTime: metav1.Now(),
375-
Message: gracePeriod.String(),
376-
Reason: "StopWorkspaceRequest",
377-
})
366+
ws.Status.SetCondition(workspacev1.NewWorkspaceConditionStoppedByRequest(gracePeriod.String()))
378367
return nil
379368
})
380369
if err != nil {
@@ -473,27 +462,17 @@ func (wsm *WorkspaceManagerServer) MarkActive(ctx context.Context, req *wsmanapi
473462
now := time.Now().UTC()
474463
wsm.activity.Store(req.Id, now)
475464

476-
// We do however maintain the the "closed" flag as annotation on the workspace. This flag should not change
465+
// We do however maintain the the "closed" flag as condition on the workspace. This flag should not change
477466
// very often and provides a better UX if it persists across ws-manager restarts.
478467
isMarkedClosed := wsk8s.ConditionPresentAndTrue(ws.Status.Conditions, string(workspacev1.WorkspaceConditionClosed))
479468
if req.Closed && !isMarkedClosed {
480469
err = wsm.modifyWorkspace(ctx, req.Id, true, func(ws *workspacev1.Workspace) error {
481-
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
482-
Type: string(workspacev1.WorkspaceConditionClosed),
483-
Status: metav1.ConditionTrue,
484-
LastTransitionTime: metav1.NewTime(now),
485-
Reason: "MarkActiveRequest",
486-
})
470+
ws.Status.SetCondition(workspacev1.NewWorkspaceConditionClosed(metav1.ConditionTrue))
487471
return nil
488472
})
489473
} else if !req.Closed && isMarkedClosed {
490474
err = wsm.modifyWorkspace(ctx, req.Id, true, func(ws *workspacev1.Workspace) error {
491-
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
492-
Type: string(workspacev1.WorkspaceConditionClosed),
493-
Status: metav1.ConditionFalse,
494-
LastTransitionTime: metav1.NewTime(now),
495-
Reason: "MarkActiveRequest",
496-
})
475+
ws.Status.SetCondition(workspacev1.NewWorkspaceConditionClosed(metav1.ConditionFalse))
497476
return nil
498477
})
499478
}
@@ -508,12 +487,7 @@ func (wsm *WorkspaceManagerServer) MarkActive(ctx context.Context, req *wsmanapi
508487
// If it's the first call: Mark the pod with FirstUserActivity condition.
509488
if firstUserActivity == nil {
510489
err := wsm.modifyWorkspace(ctx, req.Id, true, func(ws *workspacev1.Workspace) error {
511-
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
512-
Type: string(workspacev1.WorkspaceConditionFirstUserActivity),
513-
Status: metav1.ConditionTrue,
514-
LastTransitionTime: metav1.NewTime(now),
515-
Reason: "MarkActiveRequest",
516-
})
490+
ws.Status.SetUniqueCondition(workspacev1.NewWorkspaceConditionFirstUserActivity())
517491
return nil
518492
})
519493
if err != nil {

0 commit comments

Comments
 (0)