From a7521462f465ae72c8b8471e8e9d468ae3795b9a Mon Sep 17 00:00:00 2001 From: Angel Misevski Date: Wed, 14 Apr 2021 15:57:23 -0400 Subject: [PATCH] Propagate progress messages from DevWorkspaceRouting to DevWorkspace Propagate messages (where appropriate) from DevWorkspaceRouting to DevWorkspaces (e.g. "preparing services/ingresses/routes"). Note that for a typical successful startup, these messages will never be reconciled to the DevWorkspace (as the routing enters the ready state too quickly) but could help diagnose issues if a particular step occurs slowly. Also change how status for DevWorkspaceRoutings is synced to ensure that "Preparing" phase is entered while resources are being created. Signed-off-by: Angel Misevski --- .../devworkspacerouting_controller.go | 32 +++++++++++++------ .../workspace/devworkspace_controller.go | 6 +++- controllers/workspace/provision/routing.go | 6 ++-- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/controllers/controller/devworkspacerouting/devworkspacerouting_controller.go b/controllers/controller/devworkspacerouting/devworkspacerouting_controller.go index 9fca31a7b..28421567d 100644 --- a/controllers/controller/devworkspacerouting/devworkspacerouting_controller.go +++ b/controllers/controller/devworkspacerouting/devworkspacerouting_controller.go @@ -127,7 +127,7 @@ func (r *DevWorkspaceRoutingReconciler) Reconcile(req ctrl.Request) (ctrl.Result duration = 1 * time.Second } reqLogger.Info("controller not ready for devworkspace routing. Retrying", "DelayMs", duration.Milliseconds()) - return reconcile.Result{RequeueAfter: duration}, nil + return reconcile.Result{RequeueAfter: duration}, r.reconcileStatus(instance, nil, nil, false, "Waiting for DevWorkspaceRouting controller to be ready") } var invalid *solvers.RoutingInvalid @@ -172,9 +172,12 @@ func (r *DevWorkspaceRoutingReconciler) Reconcile(req ctrl.Request) (ctrl.Result } servicesInSync, clusterServices, err := r.syncServices(instance, services) - if err != nil || !servicesInSync { + if err != nil { + reqLogger.Error(err, "Error syncing services") + return reconcile.Result{Requeue: true}, r.reconcileStatus(instance, nil, nil, false, "Preparing services") + } else if !servicesInSync { reqLogger.Info("Services not in sync") - return reconcile.Result{Requeue: true}, err + return reconcile.Result{Requeue: true}, r.reconcileStatus(instance, nil, nil, false, "Preparing services") } clusterRoutingObj := solvers.RoutingObjects{ @@ -183,16 +186,22 @@ func (r *DevWorkspaceRoutingReconciler) Reconcile(req ctrl.Request) (ctrl.Result if infrastructure.IsOpenShift() { routesInSync, clusterRoutes, err := r.syncRoutes(instance, routes) - if err != nil || !routesInSync { + if err != nil { + reqLogger.Error(err, "Error syncing routes") + return reconcile.Result{Requeue: true}, r.reconcileStatus(instance, nil, nil, false, "Preparing routes") + } else if !routesInSync { reqLogger.Info("Routes not in sync") - return reconcile.Result{Requeue: true}, err + return reconcile.Result{Requeue: true}, r.reconcileStatus(instance, nil, nil, false, "Preparing routes") } clusterRoutingObj.Routes = clusterRoutes } else { ingressesInSync, clusterIngresses, err := r.syncIngresses(instance, ingresses) - if err != nil || !ingressesInSync { + if err != nil { + reqLogger.Error(err, "Error syncing ingresses") + return reconcile.Result{Requeue: true}, r.reconcileStatus(instance, nil, nil, false, "Preparing ingresses") + } else if !ingressesInSync { reqLogger.Info("Ingresses not in sync") - return reconcile.Result{Requeue: true}, err + return reconcile.Result{Requeue: true}, r.reconcileStatus(instance, nil, nil, false, "Preparing ingresses") } clusterRoutingObj.Ingresses = clusterIngresses } @@ -203,7 +212,7 @@ func (r *DevWorkspaceRoutingReconciler) Reconcile(req ctrl.Request) (ctrl.Result return reconcile.Result{}, r.markRoutingFailed(instance, fmt.Sprintf("Could not get exposed endpoints for DevWorkspace: %s", err)) } - return reconcile.Result{}, r.reconcileStatus(instance, routingObjects, exposedEndpoints, endpointsAreReady) + return reconcile.Result{}, r.reconcileStatus(instance, &routingObjects, exposedEndpoints, endpointsAreReady, "") } // setFinalizer ensures a finalizer is set on a devWorkspaceRouting instance; no-op if finalizer is already present. @@ -251,12 +260,14 @@ func (r *DevWorkspaceRoutingReconciler) markRoutingFailed(instance *controllerv1 func (r *DevWorkspaceRoutingReconciler) reconcileStatus( instance *controllerv1alpha1.DevWorkspaceRouting, - routingObjects solvers.RoutingObjects, + routingObjects *solvers.RoutingObjects, exposedEndpoints map[string]controllerv1alpha1.ExposedEndpointList, - endpointsReady bool) error { + endpointsReady bool, + message string) error { if !endpointsReady { instance.Status.Phase = controllerv1alpha1.RoutingPreparing + instance.Status.Message = message return r.Status().Update(context.TODO(), instance) } if instance.Status.Phase == controllerv1alpha1.RoutingReady && @@ -265,6 +276,7 @@ func (r *DevWorkspaceRoutingReconciler) reconcileStatus( return nil } instance.Status.Phase = controllerv1alpha1.RoutingReady + instance.Status.Message = "DevWorkspaceRouting prepared" instance.Status.PodAdditions = routingObjects.PodAdditions instance.Status.ExposedEndpoints = exposedEndpoints return r.Status().Update(context.TODO(), instance) diff --git a/controllers/workspace/devworkspace_controller.go b/controllers/workspace/devworkspace_controller.go index 9b9ca62b0..8fcfc67a3 100644 --- a/controllers/workspace/devworkspace_controller.go +++ b/controllers/workspace/devworkspace_controller.go @@ -212,7 +212,11 @@ func (r *DevWorkspaceReconciler) Reconcile(req ctrl.Request) (reconcileResult ct return r.failWorkspace(workspace, routingStatus.Message, reqLogger, &reconcileStatus) } reqLogger.Info("Waiting on routing to be ready") - reconcileStatus.setConditionFalse(dw.DevWorkspaceRoutingReady, "Preparing networking") + message := "Preparing networking" + if routingStatus.Message != "" { + message = routingStatus.Message + } + reconcileStatus.setConditionFalse(dw.DevWorkspaceRoutingReady, message) return reconcile.Result{Requeue: routingStatus.Requeue}, routingStatus.Err } reconcileStatus.setConditionTrue(dw.DevWorkspaceRoutingReady, "Networking ready") diff --git a/controllers/workspace/provision/routing.go b/controllers/workspace/provision/routing.go index 6bcfe946b..2b5da8d0e 100644 --- a/controllers/workspace/provision/routing.go +++ b/controllers/workspace/provision/routing.go @@ -98,10 +98,7 @@ func SyncRoutingToCluster( clusterRouting.Annotations = specRouting.Annotations clusterRouting.Spec = specRouting.Spec err := clusterAPI.Client.Update(context.TODO(), clusterRouting) - if err != nil { - if errors.IsConflict(err) { - return RoutingProvisioningStatus{ProvisioningStatus: ProvisioningStatus{Requeue: true}} - } + if err != nil && !errors.IsConflict(err) { return RoutingProvisioningStatus{ProvisioningStatus: ProvisioningStatus{Err: err}} } return RoutingProvisioningStatus{ @@ -119,6 +116,7 @@ func SyncRoutingToCluster( ProvisioningStatus: ProvisioningStatus{ Continue: false, Requeue: false, + Message: clusterRouting.Status.Message, }, } }