in pkg/provider/branch/provider.go [146:204]
func (b *branchENIProvider) InitResource(instance ec2.EC2Instance) error {
nodeName := instance.Name()
log := b.log.WithValues("nodeName", nodeName)
trunkENI := trunk.NewTrunkENI(log, instance, b.apiWrapper.EC2API)
// Initialize the Trunk ENI
start := time.Now()
podList, err := b.apiWrapper.PodAPI.GetRunningPodsOnNode(nodeName)
if err != nil {
log.Error(err, "failed to get list of pod on node")
return err
}
if err := trunkENI.InitTrunk(instance, podList); err != nil {
// If it's an AWS Error, get the exit code without the error message to avoid
// broadcasting multiple different messaged events
var apiErr smithy.APIError
if errors.As(err, &apiErr) {
node, errGetNode := b.apiWrapper.K8sAPI.GetNode(instance.Name())
if errGetNode != nil {
return fmt.Errorf("failed to get node for event advertisment: %v: %v", errGetNode, err)
}
eventMessage := fmt.Sprintf("Failed to create trunk interface: "+
"Error Code: %s", apiErr.ErrorCode())
if apiErr.ErrorCode() == "UnauthorizedOperation" {
// Append resolution to the event message for users for common error
eventMessage = fmt.Sprintf("%s: %s", eventMessage,
"Please verify the cluster IAM role has AmazonEKSVPCResourceController policy")
}
b.apiWrapper.K8sAPI.BroadcastEvent(node, ReasonTrunkENICreationFailed, eventMessage, v1.EventTypeWarning)
}
utils.SendNodeEventWithNodeName(b.apiWrapper.K8sAPI, nodeName, utils.NodeTrunkFailedInitializationReason, "The node failed initializing trunk interface", v1.EventTypeNormal, b.log)
branchProviderOperationsErrCount.WithLabelValues("init").Inc()
return fmt.Errorf("initializing trunk, %w", err)
}
branchProviderOperationLatency.WithLabelValues(operationInitTrunk, "1").Observe(timeSinceSeconds(start))
// Add the Trunk ENI to cache if it does not already exist
if err := b.addTrunkToCache(nodeName, trunkENI); err != nil && err != ErrTrunkExistInCache {
branchProviderOperationsErrCount.WithLabelValues("add_trunk_to_cache").Inc()
return err
}
// TODO: For efficiency submit the process delete queue job only when the delete queue has items.
// Submit periodic jobs for the given node name
b.SubmitAsyncJob(worker.NewOnDemandProcessDeleteQueueJob(nodeName))
b.log.Info("initialized the resource provider successfully")
// send an event to notify user this node has trunk interface initialized
utils.SendNodeEventWithNodeName(b.apiWrapper.K8sAPI, nodeName, utils.NodeTrunkInitiatedReason, "The node has trunk interface initialized successfully", v1.EventTypeNormal, b.log)
return nil
}