in scripts/gen_vpc_ip_limits.go [52:143]
func main() {
log := logger.DefaultLogger()
// Get session
sess := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
_, err := sess.Config.Credentials.Get()
if err != nil {
log.Fatalf("Failed to get session credentials: %v", err)
}
svc := ec2.New(sess)
describeInstanceTypesInput := &ec2.DescribeInstanceTypesInput{}
eniLimitMap := make(map[string]awsutils.InstanceTypeLimits)
for {
output, err := svc.DescribeInstanceTypes(describeInstanceTypesInput)
if err != nil {
log.Fatalf("Failed to call EC2 DescribeInstanceTypes: %v", err)
}
// We just want the type name, ENI and IP limits
for _, info := range output.InstanceTypes {
// Ignore any missing values
instanceType := aws.StringValue(info.InstanceType)
eniLimit := int(aws.Int64Value(info.NetworkInfo.MaximumNetworkInterfaces))
ipv4Limit := int(aws.Int64Value(info.NetworkInfo.Ipv4AddressesPerInterface))
hypervisorType := aws.StringValue(info.Hypervisor)
if instanceType != "" && eniLimit > 0 && ipv4Limit > 0 {
eniLimitMap[instanceType] = awsutils.InstanceTypeLimits{ENILimit: eniLimit, IPv4Limit: ipv4Limit, HypervisorType: hypervisorType}
}
}
// Paginate to the next request
if output.NextToken == nil {
break
}
describeInstanceTypesInput = &ec2.DescribeInstanceTypesInput{
NextToken: output.NextToken,
}
}
// Override faulty values and add missing instance types
eniLimitMap = addManualLimits(eniLimitMap)
// Sort the keys
instanceTypes := make([]string, 0)
for k := range eniLimitMap {
instanceTypes = append(instanceTypes, k)
}
sort.Strings(instanceTypes)
// Generate instance ENI limits
eniLimits := make([]string, 0)
for _, it := range instanceTypes {
eniLimits = append(eniLimits, printMapLine(it, eniLimitMap[it]))
}
f, err := os.Create(ipLimitFileName)
if err != nil {
log.Fatalf("Failed to create file: %v\n", err)
}
err = limitsTemplate.Execute(f, struct {
Timestamp string
ENILimits []string
}{
Timestamp: time.Now().Format(time.RFC3339),
ENILimits: eniLimits,
})
if err != nil {
log.Fatalf("Failed to generate template: %v\n", err)
}
log.Infof("Generated %s", ipLimitFileName)
// Generate --max-pods file for awslabs/amazon-eks-ami
eniPods := make([]string, 0)
for _, it := range instanceTypes {
eniPods = append(eniPods, printPodLimit(it, eniLimitMap[it]))
}
f, err = os.Create(eniMaxPodsFileName)
if err != nil {
log.Fatalf("Failed to create file: %s\n", err)
}
err = eksMaxPodsTemplate.Execute(f, struct {
Timestamp string
ENIPods []string
}{
Timestamp: time.Now().Format(time.RFC3339),
ENIPods: eniPods,
})
if err != nil {
log.Fatalf("Failed to generate template: %v\n", err)
}
log.Infof("Generated %s", eniMaxPodsFileName)
}