func drainOrCordonIfNecessary()

in cmd/node-termination-handler.go [317:360]


func drainOrCordonIfNecessary(interruptionEventStore *interruptioneventstore.Store, drainEvent *monitor.InterruptionEvent, node node.Node, nthConfig config.Config, nodeMetadata ec2metadata.NodeMetadata, metrics observability.Metrics, recorder observability.K8sEventRecorder, wg *sync.WaitGroup) {
	defer wg.Done()
	nodeName := drainEvent.NodeName
	nodeLabels, err := node.GetNodeLabels(nodeName)
	if err != nil {
		log.Err(err).Msgf("Unable to fetch node labels for node '%s' ", nodeName)
	}
	drainEvent.NodeLabels = nodeLabels
	if drainEvent.PreDrainTask != nil {
		runPreDrainTask(node, nodeName, drainEvent, metrics, recorder)
	}

	podNameList, err := node.FetchPodNameList(nodeName)
	if err != nil {
		log.Err(err).Msgf("Unable to fetch running pods for node '%s' ", nodeName)
	}
	drainEvent.Pods = podNameList
	err = node.LogPods(podNameList, nodeName)
	if err != nil {
		log.Err(err).Msg("There was a problem while trying to log all pod names on the node")
	}

	if nthConfig.CordonOnly || (!nthConfig.EnableSQSTerminationDraining && drainEvent.IsRebalanceRecommendation() && !nthConfig.EnableRebalanceDraining) {
		err = cordonNode(node, nodeName, drainEvent, metrics, recorder)
	} else {
		err = cordonAndDrainNode(node, nodeName, drainEvent, metrics, recorder, nthConfig.EnableSQSTerminationDraining)
	}

	if nthConfig.WebhookURL != "" {
		webhook.Post(nodeMetadata, drainEvent, nthConfig)
	}

	if err != nil {
		interruptionEventStore.CancelInterruptionEvent(drainEvent.EventID)
		<-interruptionEventStore.Workers
	} else {
		interruptionEventStore.MarkAllAsProcessed(nodeName)
		if drainEvent.PostDrainTask != nil {
			runPostDrainTask(node, nodeName, drainEvent, metrics, recorder)
		}
		<-interruptionEventStore.Workers
	}

}