Skip to content

Commit 1590cd9

Browse files
committed
feat: Show ignoredUnrecoerableEvents if timeout occurs
Fix #1041 Signed-off-by: Andrew Obuchowicz <aobuchow@redhat.com>
1 parent 22d18a5 commit 1590cd9

3 files changed

Lines changed: 30 additions & 8 deletions

File tree

controllers/workspace/devworkspace_controller.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"github.com/devfile/devworkspace-operator/pkg/library/flatten"
3737
kubesync "github.com/devfile/devworkspace-operator/pkg/library/kubernetes"
3838
"github.com/devfile/devworkspace-operator/pkg/library/projects"
39+
"github.com/devfile/devworkspace-operator/pkg/library/status"
3940
"github.com/devfile/devworkspace-operator/pkg/provision/automount"
4041
"github.com/devfile/devworkspace-operator/pkg/provision/metadata"
4142
"github.com/devfile/devworkspace-operator/pkg/provision/storage"
@@ -221,7 +222,14 @@ func (r *DevWorkspaceReconciler) Reconcile(ctx context.Context, req ctrl.Request
221222
// encountered in main reconcile loop.
222223
if err == nil {
223224
if timeoutErr := checkForStartTimeout(clusterWorkspace); timeoutErr != nil {
224-
reconcileResult, err = r.failWorkspace(workspace, timeoutErr.Error(), metrics.ReasonInfrastructureFailure, reqLogger, &reconcileStatus)
225+
// Check if an ignoredUnrecoverableEvent occured and report it alongside the timeout notice
226+
errMsg := status.CheckForIgnoredWorkspacePodEvents(workspace, clusterAPI)
227+
if errMsg != "" {
228+
failureMsg := fmt.Sprintf("%s. Reason: %s", timeoutErr.Error(), errMsg)
229+
reconcileResult, err = r.failWorkspace(workspace, failureMsg, metrics.DetermineProvisioningFailureReason(errMsg), reqLogger, &reconcileStatus)
230+
} else {
231+
reconcileResult, err = r.failWorkspace(workspace, timeoutErr.Error(), metrics.ReasonInfrastructureFailure, reqLogger, &reconcileStatus)
232+
}
225233
}
226234
}
227235
if reconcileStatus.phase == dw.DevWorkspaceStatusRunning {
@@ -480,7 +488,7 @@ func (r *DevWorkspaceReconciler) Reconcile(ctx context.Context, req ctrl.Request
480488
deploymentStatus := wsprovision.SyncDeploymentToCluster(workspace, allPodAdditions, serviceAcctName, clusterAPI)
481489
if !deploymentStatus.Continue {
482490
if deploymentStatus.FailStartup {
483-
failureReason := metrics.DetermineProvisioningFailureReason(deploymentStatus)
491+
failureReason := metrics.DetermineProvisioningFailureReason(deploymentStatus.Info())
484492
return r.failWorkspace(workspace, deploymentStatus.Info(), failureReason, reqLogger, &reconcileStatus)
485493
}
486494
reqLogger.Info("Waiting on deployment to be ready")

controllers/workspace/metrics/deployment_provisioning.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ package metrics
1717

1818
import (
1919
"strings"
20-
21-
"github.com/devfile/devworkspace-operator/pkg/provision/workspace"
2220
)
2321

2422
var badRequestFailures = []string{
@@ -37,15 +35,14 @@ var infrastructureFailures = []string{
3735
// DetermineProvisioningFailureReason scans a deployment provisioning status info message
3836
// and returns the corresponding failure reason.
3937
// If a failure reason cannot be found, an Unknown reason is returned.
40-
func DetermineProvisioningFailureReason(status workspace.DeploymentProvisioningStatus) FailureReason {
41-
failStartupMsg := status.Info()
38+
func DetermineProvisioningFailureReason(statusMessage string) FailureReason {
4239
for _, failure := range badRequestFailures {
43-
if strings.Contains(failStartupMsg, failure) {
40+
if strings.Contains(statusMessage, failure) {
4441
return ReasonBadRequest
4542
}
4643
}
4744
for _, failure := range infrastructureFailures {
48-
if strings.Contains(failStartupMsg, failure) {
45+
if strings.Contains(statusMessage, failure) {
4946
return ReasonInfrastructureFailure
5047
}
5148
}

pkg/library/status/check.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"strings"
2222

2323
"github.com/devfile/devworkspace-operator/pkg/common"
24+
"github.com/devfile/devworkspace-operator/pkg/constants"
2425
"github.com/devfile/devworkspace-operator/pkg/infrastructure"
2526
"github.com/devfile/devworkspace-operator/pkg/provision/sync"
2627
appsv1 "k8s.io/api/apps/v1"
@@ -156,6 +157,22 @@ func CheckContainerStatusForFailure(containerStatus *corev1.ContainerStatus, ign
156157
return true, ""
157158
}
158159

160+
// Returns an error message if the workspace related pods are in an unrecoverable state, which may
161+
// have been caused by an ignoredUnrecoverableEvent.
162+
// Otherwise, en empty string is returned.
163+
func CheckForIgnoredWorkspacePodEvents(workspace *common.DevWorkspaceWithConfig, clusterAPI sync.ClusterAPI) (errMsg string) {
164+
workspaceIDLabel := k8sclient.MatchingLabels{constants.DevWorkspaceIDLabel: workspace.Status.DevWorkspaceId}
165+
// CheckPodsState returns either a message or error, not both.
166+
errMsg, checkErr := CheckPodsState(workspace.Status.DevWorkspaceId, workspace.Namespace, workspaceIDLabel, []string{}, clusterAPI)
167+
if checkErr != nil {
168+
return checkErr.Error()
169+
}
170+
if errMsg != "" {
171+
return errMsg
172+
}
173+
return ""
174+
}
175+
159176
func checkIfUnrecoverableEventIgnored(reason string, ignoredEvents []string) (ignored bool) {
160177
for _, ignoredReason := range ignoredEvents {
161178
if ignoredReason == reason {

0 commit comments

Comments
 (0)