func()

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
}