in pkg/aws/ec2/instance.go [96:167]
func (i *ec2Instance) LoadDetails(ec2APIHelper api.EC2APIHelper) error {
i.lock.Lock()
defer i.lock.Unlock()
instance, err := ec2APIHelper.GetInstanceDetails(&i.instanceID)
if err != nil {
return err
}
if instance == nil || instance.SubnetId == nil {
return fmt.Errorf("failed to find instance %s details from EC2 API", i.instanceID)
}
// Set instance subnet and cidr during node initialization
i.instanceSubnetID = *instance.SubnetId
instanceSubnet, err := ec2APIHelper.GetSubnet(&i.instanceSubnetID)
if err != nil {
return err
}
if instanceSubnet == nil || instanceSubnet.CidrBlock == nil {
return fmt.Errorf("failed to find subnet or CIDR block for subnet %s for instance %s",
i.instanceSubnetID, i.instanceID)
}
i.instanceSubnetCidrBlock = *instanceSubnet.CidrBlock
i.subnetMask = strings.Split(i.instanceSubnetCidrBlock, "/")[1]
// Cache IPv6 CIDR block if one is present
for _, v6CidrBlock := range instanceSubnet.Ipv6CidrBlockAssociationSet {
if v6CidrBlock.Ipv6CidrBlock != nil {
i.instanceSubnetV6CidrBlock = *v6CidrBlock.Ipv6CidrBlock
i.subnetV6Mask = strings.Split(i.instanceSubnetV6CidrBlock, "/")[1]
break
}
}
i.instanceType = string(instance.InstanceType)
limits, ok := vpc.Limits[i.instanceType]
if !ok {
return fmt.Errorf("unsupported instance type, couldn't find ENI Limit for instance %s, error: %w", i.instanceType, utils.ErrNotFound)
}
defaultCardIdx := limits.DefaultNetworkCardIndex
var defaultNetworkCardLimit int64
for _, card := range limits.NetworkCards {
if card.NetworkCardIndex == int64(defaultCardIdx) {
defaultNetworkCardLimit = card.MaximumNetworkInterfaces
break
}
}
if defaultNetworkCardLimit == 0 {
return fmt.Errorf("didn't find valid network card with max interface limit from limit file for instance type %s", i.instanceType)
}
// currently CNI and this controller both only support single network card
// we want to make sure to use the smaller number between instance max supported interfaces and the default card max supported interfaces
maxInterfaces := utils.Minimum(int64(limits.Interface), defaultNetworkCardLimit)
i.deviceIndexes = make([]bool, int(maxInterfaces))
for _, nwInterface := range instance.NetworkInterfaces {
index := nwInterface.Attachment.DeviceIndex
i.deviceIndexes[*index] = true
// Load the Security group of the primary network interface
if i.primaryENISecurityGroups == nil && (nwInterface.PrivateIpAddress != nil && instance.PrivateIpAddress != nil && *nwInterface.PrivateIpAddress == *instance.PrivateIpAddress) {
i.primaryENIID = *nwInterface.NetworkInterfaceId
// TODO: Group can change, should be refreshed each time we want to use this
for _, group := range nwInterface.Groups {
i.primaryENISecurityGroups = append(i.primaryENISecurityGroups, *group.GroupId)
}
}
}
return i.updateCurrentSubnetAndCidrBlock(ec2APIHelper)
}