Notification Troubleshooting¶
Symptoms: Notifications are not delivered to Slack, Telegram, or Webhook endpoints.
Check:
- Verify the
HibernateNotificationselector matches your plan labels: - Check the Secret for the sink exists and is valid:
- Check controller logs for notification errors:
- For webhooks, check the HTTP status code and response body in the logs.
- Check notification metrics for error counts:
Troubleshooting¶
Common issues and their solutions.
Schedule Not Triggering¶
Symptoms: Plan stays in Active phase past the expected hibernation time.
Check:
-
Verify timezone configuration:
-
Verify off-hours windows are correct:
-
Check if a
suspendexception is active: -
Ensure
spec.suspendis nottrue: -
Check controller logs:
Runner Job Failing¶
Symptoms: Plan transitions to Error or targets show Failed state.
Check:
-
Find the failed Job:
-
View pod logs:
-
Check executor-specific parameters:
-
Verify connector credentials:
Restore Data Missing¶
Symptoms: Wakeup fails because restore metadata is not found.
Check:
-
Verify the ConfigMap exists:
-
Check the ConfigMap content:
-
Ensure the ConfigMap was not garbage-collected (check runner pod logs from the shutdown cycle)
Authentication Errors¶
Symptoms: Runner fails with AccessDenied or Unauthorized.
Check:
-
Verify ServiceAccount exists and has IRSA annotation:
-
Test IAM role assumption:
-
Check the CloudProvider assume role ARN:
-
Verify RBAC permissions:
Plan Stuck in Hibernating/WakingUp¶
Symptoms: Plan doesn't transition to Hibernated or Active after Jobs complete.
Check:
-
Look for zombie Jobs:
-
Check if any targets are still in
Runningstate: -
Check controller logs for errors during status update:
Plan Failed But Schedule Window Has Changed¶
Symptoms: Plan is in Error phase, but the current time is in the opposite schedule window (e.g., failed during hibernation but it's now wakeup time).
Root cause: retry-now retries the original operation stored in .status.currentOperation, not the current schedule. This is intentional for safety — a recovery attempt must resume from the point of failure to avoid corrupting resource state.
Check:
-
Verify the current schedule window:
-
Check the controller logs for the warning:
Solutions:
-
Suspend until the next schedule (safest): Use the CLI or
suspend-untilannotation to suspend the plan with a deadline. When the deadline is reached, the controller automatically resumes the plan and evaluates the current schedule. -
Resubmit the plan: Delete and re-create the plan to reset all status fields. This is fast but loses execution history.
For detailed steps, see the Error Recovery guide.
Revert Wins Over Retry¶
Symptoms: Plan is in Error phase with both revert and retry-now annotations set, but only the revert operation executes.
Root cause: revert is evaluated as a pre-phase gate that runs before the normal PhaseError → recoveryState dispatch. Because the gate fires first, the plan transitions to WakingUp and the retry-now annotation is never inspected by the recovery handler.
Gate priority order:
deletionGate(deletion in progress)suspensionGate(spec.suspendorsuspend-until)revertGate(revert=trueonPhaseError)- Phase dispatch →
recoveryState(handlesretry-now)
Check:
-
Verify which annotations are present:
-
Check the controller logs to see which gate fired:
Solutions:
-
Remove the revert annotation if you actually want a retry:
-
Remove the retry annotation if you actually want a revert:
-
Wait for revert to finish, then retry if still needed. Revert transitions the plan to
ActiveorSuspended; once stable, a freshretry-nowwill be handled by the normal recovery flow if the plan is still inError.
Getting Help¶
If the issue persists:
- Collect plan status:
kubectl get hibernateplan <name> -o yaml - Collect controller logs:
kubectl logs -l app=hibernator-controller --tail=500 - Collect runner logs (if applicable)
- Open a GitHub issue with the collected information