in pkg/providers/instancetype/instancetypes.go [253:295]
func (p *DefaultProvider) getInstanceTypes(ctx context.Context) (map[string]*skewer.SKU, 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 Resource API when we could have just made one call. This lock is here because multiple callers result
// in A LOT of extra memory generated from the response for simultaneous callers.
// (This can be made more efficient by holding a Read lock and only obtaining the Write if not in cache)
p.mu.Lock()
defer p.mu.Unlock()
if cached, ok := p.instanceTypesCache.Get(InstanceTypesCacheKey); ok {
return cached.(map[string]*skewer.SKU), nil
}
instanceTypes := map[string]*skewer.SKU{}
cache, err := skewer.NewCache(ctx, skewer.WithLocation(p.region), skewer.WithResourceClient(p.skuClient.GetInstance()))
if err != nil {
return nil, fmt.Errorf("fetching SKUs using skewer, %w", err)
}
skus := cache.List(ctx, skewer.ResourceTypeFilter(skewer.VirtualMachines))
log.FromContext(ctx).V(1).Info(fmt.Sprintf("Discovered %d SKUs", len(skus)))
for i := range skus {
vmsize, err := skus[i].GetVMSize()
if err != nil {
log.FromContext(ctx).Error(err, fmt.Sprintf("parsing VM size %s", *skus[i].Size))
continue
}
useSIG := options.FromContext(ctx).UseSIG
if !skus[i].HasLocationRestriction(p.region) && p.isSupported(&skus[i], vmsize, useSIG) {
instanceTypes[skus[i].GetName()] = &skus[i]
}
}
if p.cm.HasChanged("instance-types", instanceTypes) {
// Only update instanceTypesSeqNun with the instance types have been changed
// This is to not create new keys with duplicate instance types option
atomic.AddUint64(&p.instanceTypesSeqNum, 1)
log.FromContext(ctx).WithValues(
"count", len(instanceTypes)).V(1).Info("discovered instance types")
}
p.instanceTypesCache.SetDefault(InstanceTypesCacheKey, instanceTypes)
return instanceTypes, nil
}