in pkg/providers/instancetype/instancetype.go [232:281]
func (p *DefaultProvider) UpdateInstanceTypeOfferings(ctx context.Context) error {
// DO NOT REMOVE THIS LOCK ----------------------------------------------------------------------------
// We lock here so that multiple callers to GetInstanceTypes do not result in cache misses and multiple
// calls to EC2 when we could have just made one call. This lock is here because multiple callers to EC2 result
// in A LOT of extra memory generated from the response for simultaneous callers.
// TODO @joinnis: This can be made more efficient by holding a Read lock and only obtaining the Write if not in cache
p.muInstanceTypesOfferings.Lock()
defer p.muInstanceTypesOfferings.Unlock()
// Get offerings from EC2
instanceTypeOfferings := map[string]sets.Set[string]{}
paginator := ec2.NewDescribeInstanceTypeOfferingsPaginator(p.ec2api, &ec2.DescribeInstanceTypeOfferingsInput{
LocationType: ec2types.LocationTypeAvailabilityZone,
})
for paginator.HasMorePages() {
page, err := paginator.NextPage(ctx)
if err != nil {
return fmt.Errorf("describing instance type zone offerings, %w", err)
}
for _, offering := range page.InstanceTypeOfferings {
if _, ok := instanceTypeOfferings[string(offering.InstanceType)]; !ok {
instanceTypeOfferings[string(offering.InstanceType)] = sets.New[string]()
}
instanceTypeOfferings[string(offering.InstanceType)].Insert(lo.FromPtr(offering.Location))
}
}
if p.cm.HasChanged("instance-type-offering", instanceTypeOfferings) {
// Only update instanceTypesSeqNun with the instance type offerings have been changed
// This is to not create new keys with duplicate instance type offerings option
atomic.AddUint64(&p.instanceTypesOfferingsSeqNum, 1)
log.FromContext(ctx).WithValues("instance-type-count", len(instanceTypeOfferings)).V(1).Info("discovered offerings for instance types")
}
p.instanceTypesOfferings = instanceTypeOfferings
allZones := sets.New[string]()
for _, offeringZones := range instanceTypeOfferings {
for zone := range offeringZones {
allZones.Insert(zone)
}
}
if p.cm.HasChanged("zones", allZones) {
log.FromContext(ctx).WithValues("zones", allZones.UnsortedList()).V(1).Info("discovered zones")
}
p.allZones = allZones
return nil
}