in pkg/controllers/metrics/controller.go [52:99]
func (c *Controller) Reconcile(ctx context.Context) (reconcile.Result, error) {
nodePools := &karpv1.NodePoolList{}
if err := c.kubeClient.List(ctx, nodePools); err != nil {
return reconcile.Result{}, err
}
availability := map[metricDimensions]bool{}
price := map[metricDimensions]float64{}
for _, nodePool := range nodePools.Items {
instanceTypes, err := c.cloudProvider.GetInstanceTypes(ctx, &nodePool)
if err != nil {
return reconcile.Result{}, err
}
for _, instanceType := range instanceTypes {
zones := sets.New[string]()
for _, offering := range instanceType.Offerings {
dimensions := metricDimensions{instanceType: instanceType.Name, capacityType: offering.CapacityType(), zone: offering.Zone()}
availability[dimensions] = availability[dimensions] || offering.Available
price[dimensions] = offering.Price
zones.Insert(offering.Zone())
}
if coreoptions.FromContext(ctx).FeatureGates.ReservedCapacity {
for zone := range zones {
dimensions := metricDimensions{instanceType: instanceType.Name, capacityType: karpv1.CapacityTypeReserved, zone: zone}
if _, ok := availability[dimensions]; !ok {
availability[dimensions] = false
price[dimensions] = 0
}
}
}
}
}
for dimensions, available := range availability {
InstanceTypeOfferingAvailable.Set(float64(lo.Ternary(available, 1, 0)), map[string]string{
instanceTypeLabel: dimensions.instanceType,
capacityTypeLabel: dimensions.capacityType,
zoneLabel: dimensions.zone,
})
}
for dimensions, p := range price {
InstanceTypeOfferingPriceEstimate.Set(p, map[string]string{
instanceTypeLabel: dimensions.instanceType,
capacityTypeLabel: dimensions.capacityType,
zoneLabel: dimensions.zone,
})
}
return reconcile.Result{RequeueAfter: time.Minute}, nil
}