in pkg/providers/instancetype/instancetypes.go [103:161]
func (p *DefaultProvider) List(
ctx context.Context, nodeClass *v1alpha2.AKSNodeClass) ([]*cloudprovider.InstanceType, error) {
kc := nodeClass.Spec.Kubelet
// Get SKUs from Azure
skus, err := p.getInstanceTypes(ctx)
if err != nil {
return nil, err
}
// Compute fully initialized instance types hash key
kcHash, _ := hashstructure.Hash(kc, hashstructure.FormatV2, &hashstructure.HashOptions{SlicesAsSets: true})
key := fmt.Sprintf("%d-%d-%016x-%s-%d-%d",
p.instanceTypesSeqNum,
p.unavailableOfferings.SeqNum,
kcHash,
to.String(nodeClass.Spec.ImageFamily),
to.Int32(nodeClass.Spec.OSDiskSizeGB),
utils.GetMaxPods(nodeClass, options.FromContext(ctx).NetworkPlugin, options.FromContext(ctx).NetworkPluginMode),
)
if item, ok := p.instanceTypesCache.Get(key); ok {
// Ensure what's returned from this function is a shallow-copy of the slice (not a deep-copy of the data itself)
// so that modifications to the ordering of the data don't affect the original
return append([]*cloudprovider.InstanceType{}, item.([]*cloudprovider.InstanceType)...), nil
}
// Get Viable offerings
/// Azure has zones availability directly from SKU info
var result []*cloudprovider.InstanceType
for _, sku := range skus {
vmsize, err := sku.GetVMSize()
if err != nil {
log.FromContext(ctx).Error(err, fmt.Sprintf("parsing VM size %s", *sku.Size))
continue
}
architecture, err := sku.GetCPUArchitectureType()
if err != nil {
log.FromContext(ctx).Error(err, fmt.Sprintf("parsing SKU architecture %s", *sku.Size))
continue
}
instanceTypeZones := instanceTypeZones(sku, p.region)
// !!! Important !!!
// Any changes to the values passed into the NewInstanceType method will require making updates to the cache key
// so that Karpenter is able to cache the set of InstanceTypes based on values that alter the set of instance types
// !!! Important !!!
instanceType := NewInstanceType(ctx, sku, vmsize, kc, p.region, p.createOfferings(sku, instanceTypeZones), nodeClass, architecture)
if len(instanceType.Offerings) == 0 {
continue
}
if !p.isInstanceTypeSupportedByImageFamily(sku.GetName(), lo.FromPtr(nodeClass.Spec.ImageFamily)) {
continue
}
result = append(result, instanceType)
}
p.instanceTypesCache.SetDefault(key, result)
return result, nil
}