in pkg/interruptionevent/draincordon/handler.go [60:132]
func (h *Handler) HandleEvent(drainEvent *monitor.InterruptionEvent) error {
if !common.IsAllowedKind(drainEvent.Kind, allowedKinds...) {
return nil
}
nodeFound := true
nodeName, err := h.commonHandler.GetNodeName(drainEvent)
if err != nil {
return fmt.Errorf("get node name for instanceID=%s: %w", drainEvent.InstanceID, err)
}
nodeLabels, err := h.commonHandler.Node.GetNodeLabels(nodeName)
if err != nil {
log.Warn().
Err(err).
Interface("fallbackNodeLabels", drainEvent.NodeLabels).
Str("nodeName", nodeName).
Msg("Failed to get node labels. Proceeding with fallback labels")
nodeFound = false
} else {
drainEvent.NodeLabels = nodeLabels
}
if drainEvent.PreDrainTask != nil {
h.commonHandler.RunPreDrainTask(nodeName, drainEvent)
}
podNameList, err := h.commonHandler.Node.FetchPodNameList(nodeName)
if err != nil {
log.Warn().
Err(err).
Strs("fallbackPodNames", podNameList).
Str("nodeName", nodeName).
Msg("Failed to fetch pod names. Proceeding with fallback pod names")
} else {
drainEvent.Pods = podNameList
}
err = h.commonHandler.Node.LogPods(podNameList, nodeName)
if err != nil {
log.Warn().Err(err).Str("nodeName", nodeName).Msg("Failed to log pods")
}
if h.commonHandler.NthConfig.CordonOnly || (!h.commonHandler.NthConfig.EnableSQSTerminationDraining && drainEvent.IsRebalanceRecommendation() && !h.commonHandler.NthConfig.EnableRebalanceDraining) {
err = h.cordonNode(nodeName, drainEvent)
} else {
err = h.cordonAndDrainNode(nodeName, drainEvent)
}
if h.commonHandler.NthConfig.WebhookURL != "" {
webhook.Post(h.nodeMetadata, drainEvent, h.commonHandler.NthConfig)
}
if err != nil {
h.commonHandler.InterruptionEventStore.CancelInterruptionEvent(drainEvent.EventID)
} else {
h.commonHandler.InterruptionEventStore.MarkAllAsProcessed(nodeName)
}
if (err == nil || (!nodeFound && h.commonHandler.NthConfig.DeleteSqsMsgIfNodeNotFound)) && drainEvent.PostDrainTask != nil {
h.commonHandler.RunPostDrainTask(nodeName, drainEvent)
}
// Only add out-of-service taint if ENABLE_OUT_OF_SERVICE_TAINT flag is true, and CORDON_ONLY flag is false
if err == nil && h.commonHandler.NthConfig.EnableOutOfServiceTaint && !h.commonHandler.NthConfig.CordonOnly {
err = h.commonHandler.Node.TaintOutOfService(nodeName)
if err != nil {
return fmt.Errorf("cannot add out-of-service taint on node %s: %w", nodeName, err)
}
}
return nil
}