Skip to content

Commit

Permalink
Propagate progress messages from DevWorkspaceRouting to DevWorkspace
Browse files Browse the repository at this point in the history
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 <amisevsk@redhat.com>
  • Loading branch information
amisevsk committed Apr 16, 2021
1 parent d018e6e commit a752146
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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{
Expand All @@ -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
}
Expand All @@ -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.
Expand Down Expand Up @@ -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 &&
Expand All @@ -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)
Expand Down
6 changes: 5 additions & 1 deletion controllers/workspace/devworkspace_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
6 changes: 2 additions & 4 deletions controllers/workspace/provision/routing.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand All @@ -119,6 +116,7 @@ func SyncRoutingToCluster(
ProvisioningStatus: ProvisioningStatus{
Continue: false,
Requeue: false,
Message: clusterRouting.Status.Message,
},
}
}
Expand Down

0 comments on commit a752146

Please sign in to comment.