in pkg/awsutils/awsutils.go [500:571]
func (cache *EC2InstanceMetadataCache) RefreshSGIDs(mac string, store *datastore.DataStore) error {
ctx := context.TODO()
sgIDs, err := cache.imds.GetSecurityGroupIDs(ctx, mac)
if err != nil {
awsAPIErrInc("GetSecurityGroupIDs", err)
return err
}
newSGs := StringSet{}
newSGs.Set(sgIDs)
addedSGs := newSGs.Difference(&cache.securityGroups)
addedSGsCount := 0
deletedSGs := cache.securityGroups.Difference(&newSGs)
deletedSGsCount := 0
for _, sg := range addedSGs.SortedList() {
log.Infof("Found %s, added to ipamd cache", sg)
addedSGsCount++
}
for _, sg := range deletedSGs.SortedList() {
log.Infof("Removed %s from ipamd cache", sg)
deletedSGsCount++
}
cache.securityGroups.Set(sgIDs)
if !cache.useCustomNetworking && (addedSGsCount != 0 || deletedSGsCount != 0) {
eniInfos := store.GetENIInfos()
var eniIDs []string
for eniID := range eniInfos.ENIs {
eniIDs = append(eniIDs, eniID)
}
newENIs := StringSet{}
newENIs.Set(eniIDs)
tempfilteredENIs := newENIs.Difference(&cache.multiCardENIs)
filteredENIs := tempfilteredENIs.Difference(&cache.unmanagedENIs)
// This will update SG for managed ENIs created by EKS.
for _, eniID := range filteredENIs.SortedList() {
log.Debugf("Update ENI %s", eniID)
attributeInput := &ec2.ModifyNetworkInterfaceAttributeInput{
Groups: sgIDs,
NetworkInterfaceId: aws.String(eniID),
}
start := time.Now()
_, err = cache.ec2SVC.ModifyNetworkInterfaceAttribute(context.Background(), attributeInput)
prometheusmetrics.Ec2ApiReq.WithLabelValues("ModifyNetworkInterfaceAttribute").Inc()
prometheusmetrics.AwsAPILatency.WithLabelValues("ModifyNetworkInterfaceAttribute", fmt.Sprint(err != nil), awsReqStatus(err)).Observe(msSince(start))
if err != nil {
if errors.As(err, &awsAPIError) {
if awsAPIError.ErrorCode() == "InvalidNetworkInterfaceID.NotFound" {
awsAPIErrInc("IMDSMetaDataOutOfSync", err)
}
}
checkAPIErrorAndBroadcastEvent(err, "ec2:ModifyNetworkInterfaceAttribute")
awsAPIErrInc("ModifyNetworkInterfaceAttribute", err)
prometheusmetrics.Ec2ApiErr.WithLabelValues("ModifyNetworkInterfaceAttribute").Inc()
// No need to return error here since retry will happen in 30 seconds and also
// If update failed due to stale ENI then returning error will prevent updating SG
// for following ENIs since the list is sorted
log.Debugf("refreshSGIDs: unable to update the ENI %s SG - %v", eniID, err)
}
}
}
return nil
}