in pkg/providers/subnet/subnet.go [135:181]
func (p *DefaultProvider) ZonalSubnetsForLaunch(ctx context.Context, nodeClass *v1.EC2NodeClass, instanceTypes []*cloudprovider.InstanceType, capacityType string) (map[string]*Subnet, error) {
if len(nodeClass.Status.Subnets) == 0 {
return nil, fmt.Errorf("no subnets matched selector %v", nodeClass.Spec.SubnetSelectorTerms)
}
p.Lock()
defer p.Unlock()
zonalSubnets := map[string]*Subnet{}
availableIPAddressCount := map[string]int32{}
for _, subnet := range nodeClass.Status.Subnets {
if subnetAvailableIP, ok := p.availableIPAddressCache.Get(subnet.ID); ok {
availableIPAddressCount[subnet.ID] = subnetAvailableIP.(int32)
}
}
for _, subnet := range nodeClass.Status.Subnets {
if v, ok := zonalSubnets[subnet.Zone]; ok {
currentZonalSubnetIPAddressCount := v.AvailableIPAddressCount
newZonalSubnetIPAddressCount := availableIPAddressCount[subnet.ID]
if ips, ok := p.inflightIPs[v.ID]; ok {
currentZonalSubnetIPAddressCount = ips
}
if ips, ok := p.inflightIPs[subnet.ID]; ok {
newZonalSubnetIPAddressCount = ips
}
if currentZonalSubnetIPAddressCount >= newZonalSubnetIPAddressCount {
continue
}
}
zonalSubnets[subnet.Zone] = &Subnet{ID: subnet.ID, Zone: subnet.Zone, ZoneID: subnet.ZoneID, AvailableIPAddressCount: availableIPAddressCount[subnet.ID]}
}
for _, subnet := range zonalSubnets {
predictedIPsUsed := p.minPods(instanceTypes, scheduling.NewRequirements(
scheduling.NewRequirement(karpv1.CapacityTypeLabelKey, corev1.NodeSelectorOpIn, capacityType),
scheduling.NewRequirement(corev1.LabelTopologyZone, corev1.NodeSelectorOpIn, subnet.Zone),
))
prevIPs := subnet.AvailableIPAddressCount
if trackedIPs, ok := p.inflightIPs[subnet.ID]; ok {
prevIPs = trackedIPs
}
p.inflightIPs[subnet.ID] = prevIPs - predictedIPsUsed
}
return zonalSubnets, nil
}