in pkg/providers/pricing/pricing.go [171:239]
func (p *DefaultProvider) UpdateOnDemandPricing(ctx context.Context) error {
// standard on-demand instances
var wg sync.WaitGroup
var onDemandPrices, onDemandMetalPrices map[ec2types.InstanceType]float64
var onDemandErr, onDemandMetalErr error
// if we are in isolated vpc, skip updating on demand pricing
// as pricing api may not be available
if options.FromContext(ctx).IsolatedVPC {
if p.cm.HasChanged("on-demand-prices", nil) {
log.FromContext(ctx).V(1).Info("running in an isolated VPC, on-demand pricing information will not be updated")
}
return nil
}
p.muOnDemand.Lock()
defer p.muOnDemand.Unlock()
wg.Add(1)
go func() {
defer wg.Done()
onDemandPrices, onDemandErr = p.fetchOnDemandPricing(ctx,
pricingtypes.Filter{
Field: aws.String("tenancy"),
Type: "TERM_MATCH",
Value: aws.String("Shared"),
},
pricingtypes.Filter{
Field: aws.String("productFamily"),
Type: "TERM_MATCH",
Value: aws.String("Compute Instance"),
})
}()
// bare metal on-demand prices
wg.Add(1)
go func() {
defer wg.Done()
onDemandMetalPrices, onDemandMetalErr = p.fetchOnDemandPricing(ctx,
pricingtypes.Filter{
Field: aws.String("tenancy"),
Type: "TERM_MATCH",
Value: aws.String("Dedicated"),
},
pricingtypes.Filter{
Field: aws.String("productFamily"),
Type: "TERM_MATCH",
Value: aws.String("Compute Instance (bare metal)"),
})
}()
wg.Wait()
err := multierr.Append(onDemandErr, onDemandMetalErr)
if err != nil {
return fmt.Errorf("retreiving on-demand pricing data, %w", err)
}
if len(onDemandPrices) == 0 || len(onDemandMetalPrices) == 0 {
return fmt.Errorf("no on-demand pricing found")
}
// Maintain previously retrieved pricing data
p.onDemandPrices = lo.Assign(p.onDemandPrices, onDemandPrices, onDemandMetalPrices)
if p.cm.HasChanged("on-demand-prices", p.onDemandPrices) {
log.FromContext(ctx).WithValues("instance-type-count", len(p.onDemandPrices)).V(1).Info("updated on-demand pricing")
}
return nil
}