Skip to content

Commit c14a25c

Browse files
authored
[ws-manager-mk2] Report content init/dispose failures (#17015)
1 parent 846510d commit c14a25c

File tree

6 files changed

+27
-7
lines changed

6 files changed

+27
-7
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,9 @@ func (wsc *WorkspaceController) handleWorkspaceInit(ctx context.Context, ws *wor
189189

190190
if failure != "" {
191191
log.Error(initErr, "could not initialize workspace", "name", ws.Name)
192-
ws.Status.SetCondition(workspacev1.NewWorkspaceConditionContentReady(metav1.ConditionFalse, "InitializationFailure", failure))
192+
ws.Status.SetCondition(workspacev1.NewWorkspaceConditionContentReady(metav1.ConditionFalse, workspacev1.ReasonInitializationFailure, failure))
193193
} else {
194-
ws.Status.SetCondition(workspacev1.NewWorkspaceConditionContentReady(metav1.ConditionTrue, "InitializationSuccess", ""))
194+
ws.Status.SetCondition(workspacev1.NewWorkspaceConditionContentReady(metav1.ConditionTrue, workspacev1.ReasonInitializationSuccess, ""))
195195
}
196196

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

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ import (
1313
const (
1414
// GitpodFinalizerName is the name of the finalizer we use on workspaces and their pods.
1515
GitpodFinalizerName = "gitpod.io/finalizer"
16+
17+
// ReasonInitializationSuccess is a Reason for the WorkspaceConditionContentReady condition,
18+
// incidating content init succeeded.
19+
ReasonInitializationSuccess = "InitializationSuccess"
20+
// ReasonInitializationFailure is a Reason for the WorkspaceConditionContentReady condition,
21+
// indicating that content init failed. The condition's message will contain the failure details.
22+
ReasonInitializationFailure = "InitializationFailure"
1623
)
1724

1825
// WorkspaceSpec defines the desired state of Workspace

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ func newMetricState(ws *workspacev1.Workspace) metricState {
218218
// This is to prevent these from being re-recorded after the controller restarts and clears the metric state for
219219
// each workspace.
220220
recordedStartTime: ws.Status.Phase == workspacev1.WorkspacePhaseRunning,
221-
recordedInitFailure: wsk8s.ConditionWithStatusAndReason(ws.Status.Conditions, string(workspacev1.WorkspaceConditionContentReady), false, "InitializationFailure"),
221+
recordedInitFailure: wsk8s.ConditionWithStatusAndReason(ws.Status.Conditions, string(workspacev1.WorkspaceConditionContentReady), false, workspacev1.ReasonInitializationFailure),
222222
recordedStartFailure: wsk8s.ConditionPresentAndTrue(ws.Status.Conditions, string(workspacev1.WorkspaceConditionFailed)),
223223
recordedContentReady: wsk8s.ConditionPresentAndTrue(ws.Status.Conditions, string(workspacev1.WorkspaceConditionContentReady)),
224224
recordedBackupFailed: wsk8s.ConditionPresentAndTrue(ws.Status.Conditions, string(workspacev1.WorkspaceConditionBackupFailure)),

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,20 @@ func isDisposalFinished(ws *workspacev1.Workspace) bool {
192192

193193
// extractFailure returns a pod failure reason and possibly a phase. If phase is nil then
194194
// one should extract the phase themselves. If the pod has not failed, this function returns "", nil.
195+
// This failure is then stored in the Failed condition on the workspace.
195196
func extractFailure(ws *workspacev1.Workspace, pod *corev1.Pod) (string, *workspacev1.WorkspacePhase) {
197+
// Check for content init failure.
198+
if c := wsk8s.GetCondition(ws.Status.Conditions, string(workspacev1.WorkspaceConditionContentReady)); c != nil {
199+
if c.Status == metav1.ConditionFalse && c.Reason == workspacev1.ReasonInitializationFailure {
200+
return c.Message, nil
201+
}
202+
}
203+
204+
// Check for backup failure.
205+
if c := wsk8s.GetCondition(ws.Status.Conditions, string(workspacev1.WorkspaceConditionBackupFailure)); c != nil {
206+
return c.Message, nil
207+
}
208+
196209
status := pod.Status
197210
if status.Phase == corev1.PodFailed && (status.Reason != "" || status.Message != "") {
198211
// Don't force the phase to UNKNONWN here to leave a chance that we may detect the actual phase of

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ func (r *WorkspaceReconciler) actOnStatus(ctx context.Context, workspace *worksp
252252
return r.deleteWorkspacePod(ctx, pod, "timed out")
253253

254254
// if the content initialization failed, delete the pod
255-
case wsk8s.ConditionWithStatusAndReason(workspace.Status.Conditions, string(workspacev1.WorkspaceConditionContentReady), false, "InitializationFailure") && !isPodBeingDeleted(pod):
255+
case wsk8s.ConditionWithStatusAndReason(workspace.Status.Conditions, string(workspacev1.WorkspaceConditionContentReady), false, workspacev1.ReasonInitializationFailure) && !isPodBeingDeleted(pod):
256256
return r.deleteWorkspacePod(ctx, pod, "init failed")
257257

258258
case isWorkspaceBeingDeleted(workspace) && !isPodBeingDeleted(pod):
@@ -299,7 +299,7 @@ func (r *WorkspaceReconciler) updateMetrics(ctx context.Context, workspace *work
299299
return
300300
}
301301

302-
if !lastState.recordedInitFailure && wsk8s.ConditionWithStatusAndReason(workspace.Status.Conditions, string(workspacev1.WorkspaceConditionContentReady), false, "InitializationFailure") {
302+
if !lastState.recordedInitFailure && wsk8s.ConditionWithStatusAndReason(workspace.Status.Conditions, string(workspacev1.WorkspaceConditionContentReady), false, workspacev1.ReasonInitializationFailure) {
303303
r.metrics.countTotalRestoreFailures(&log, workspace)
304304
lastState.recordedInitFailure = true
305305

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ var _ = Describe("WorkspaceController", func() {
111111
Type: string(workspacev1.WorkspaceConditionContentReady),
112112
Status: metav1.ConditionFalse,
113113
Message: "some failure",
114-
Reason: "InitializationFailure",
114+
Reason: workspacev1.ReasonInitializationFailure,
115115
LastTransitionTime: metav1.Now(),
116116
})
117117
})
@@ -443,7 +443,7 @@ func markContentReady(ws *workspacev1.Workspace) {
443443
ws.Status.Conditions = wsk8s.AddUniqueCondition(ws.Status.Conditions, metav1.Condition{
444444
Type: string(workspacev1.WorkspaceConditionContentReady),
445445
Status: metav1.ConditionTrue,
446-
Reason: "InitializationSuccess",
446+
Reason: workspacev1.ReasonInitializationSuccess,
447447
LastTransitionTime: metav1.Now(),
448448
})
449449
})

0 commit comments

Comments
 (0)