Skip to content

RouterInterface shows no status when Router exists but is not Available #838

Description

@mandre

What would you like to see implemented?

Description

When a Router exists but is not yet Available (or has a terminal error), the routerinterface controller returns early without updating any RouterInterface status. This leaves RouterInterfaces with .status completely missing, making it difficult to diagnose issues.

Current Behavior

In internal/controllers/routerinterface/reconcile.go:

if router.Status.ID == nil || (!orcv1alpha1.IsAvailable(router) && router.GetDeletionTimestamp().IsZero()) {
    log.V(logging.Verbose).Info("Not reconciling interfaces for not-Available router")
    return ctrl.Result{}, nil  // ← No status update on any RouterInterface
}

When the Router doesn't exist at all, the controller does update RouterInterface status with a helpful message:

if apierrors.IsNotFound(err) {
    // Updates status with WaitingOnObject("Router", req.Name, progress.WaitingOnCreation)
    ...
}

But when the Router exists and is not Available, RouterInterfaces are left with no status.

Observed Impact

In the subnet-create-full-v6 CI failure, the RouterInterface subnet-create-full-v6-subnet had no .status field at all for 4+ minutes. The only indication of the problem was the Router's terminal error condition, but without controller logs (see #N+1) and without RouterInterface status, the connection was not obvious.

Suggested Improvement

Update the RouterInterface status in the not-Available case, similar to the not-found case:

if router.Status.ID == nil || (!orcv1alpha1.IsAvailable(router) && router.GetDeletionTimestamp().IsZero()) {
    log.V(logging.Verbose).Info("Not reconciling interfaces for not-Available router")

    routerInterfaces, err := routerDependency.GetObjectsForDependency(ctx, r.client, router)
    if err != nil {
        return ctrl.Result{}, fmt.Errorf("fetching router interfaces: %w", err)
    }

    var reconcileStatus progress.ReconcileStatus
    for i := range routerInterfaces {
        routerInterface := &routerInterfaces[i]
        ifReconcileStatus := progress.WaitingOnObject("Router", req.Name, progress.WaitingOnReady)
        ifReconcileStatus = ifReconcileStatus.WithReconcileStatus(
            r.updateStatus(ctx, routerInterface, nil, ifReconcileStatus))
        reconcileStatus = reconcileStatus.WithReconcileStatus(ifReconcileStatus)
    }
    return reconcileStatus.Return(log)
}

This would give users a clear signal: "Waiting for Router subnet-create-full-v6 to be ready".

Additional information

No response

Link to reference documentation

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Fields

    No fields configured for Feature.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions