in pkg/ipamd/ipamd.go [1089:1139]
func (c *IPAMContext) setupENI(eni string, eniMetadata awsutils.ENIMetadata, isTrunkENI, isEFAENI bool) error {
primaryENI := c.awsClient.GetPrimaryENI()
// Add the ENI to the datastore
err := c.dataStore.AddENI(eni, eniMetadata.DeviceNumber, eni == primaryENI, isTrunkENI, isEFAENI)
if err != nil && err.Error() != datastore.DuplicatedENIError {
return errors.Wrapf(err, "failed to add ENI %s to data store", eni)
}
// Store the addressable IP for the ENI
if c.enableIPv6 {
c.primaryIP[eni] = eniMetadata.PrimaryIPv6Address()
} else {
c.primaryIP[eni] = eniMetadata.PrimaryIPv4Address()
}
if c.enableIPv6 && eni == primaryENI {
// In v6 PD mode, VPC CNI will only manage the primary ENI and trunk ENI. Once we start supporting secondary
// IP and custom networking modes for IPv6, this restriction can be relaxed.
err := c.assignIPv6Prefix(eni)
if err != nil {
return errors.Wrapf(err, "Failed to allocate IPv6 Prefixes to Primary ENI")
}
} else {
// For other ENIs, set up the network
if eni != primaryENI {
subnetCidr := eniMetadata.SubnetIPv4CIDR
if c.enableIPv6 {
subnetCidr = eniMetadata.SubnetIPv6CIDR
}
err = c.networkClient.SetupENINetwork(c.primaryIP[eni], eniMetadata.MAC, eniMetadata.DeviceNumber, subnetCidr)
if err != nil {
// Failed to set up the ENI
errRemove := c.dataStore.RemoveENIFromDataStore(eni, true)
if errRemove != nil {
log.Warnf("failed to remove ENI %s: %v", eni, errRemove)
}
delete(c.primaryIP, eni)
return errors.Wrapf(err, "failed to set up ENI %s network", eni)
}
}
if !c.enableIPv6 {
log.Infof("Found ENIs having %d secondary IPs and %d Prefixes", len(eniMetadata.IPv4Addresses), len(eniMetadata.IPv4Prefixes))
// Either case add the IPs and prefixes to datastore.
c.addENIsecondaryIPsToDataStore(eniMetadata.IPv4Addresses, eni)
c.addENIv4prefixesToDataStore(eniMetadata.IPv4Prefixes, eni)
} else {
// This is a trunk ENI in IPv6 PD mode, so do not add IPs or prefixes to datastore
log.Infof("Found IPv6 trunk ENI having %d secondary IPs and %d Prefixes", len(eniMetadata.IPv6Addresses), len(eniMetadata.IPv6Prefixes))
}
}
return nil
}