in pkg/provider/branch/provider.go [132:186]
func (b *branchENIProvider) InitResource(instance ec2.EC2Instance) error {
nodeName := instance.Name()
log := b.log.WithValues("node name", 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
}
err = trunkENI.InitTrunk(instance, podList)
if err != nil {
// If it's an AWS Error, get the exit code without the error message to avoid
// broadcasting multiple different messaged events
if awsErr, ok := err.(awserr.Error); ok {
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)
}
var eventMessage = fmt.Sprintf("Failed to create trunk interface: "+
"Error Code: %s", awsErr.Code())
if awsErr.Code() == "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)
}
log.Error(err, "failed to init resource")
branchProviderOperationsErrCount.WithLabelValues("init").Inc()
return err
}
branchProviderOperationLatency.WithLabelValues(operationInitTrunk, "1").Observe(timeSinceMs(start))
// Add the Trunk ENI to cache
err = b.addTrunkToCache(nodeName, trunkENI)
if err != nil {
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.SubmitAsyncJob(worker.NewOnDemandReconcileNodeJob(nodeName))
b.log.Info("initialized the resource provider successfully")
return nil
}