func()

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
}