in pkg/providers/pricing/pricing.go [324:366]
func (p *DefaultProvider) onDemandPage(ctx context.Context, output *pricing.GetProductsOutput) map[ec2types.InstanceType]float64 {
// this isn't the full pricing struct, just the portions we care about
type priceItem struct {
Product struct {
Attributes struct {
InstanceType string
}
}
Terms struct {
OnDemand map[string]struct {
PriceDimensions map[string]struct {
PricePerUnit map[string]string
}
}
}
}
result := map[ec2types.InstanceType]float64{}
currency := "USD"
if strings.HasPrefix(p.region, "cn-") {
currency = "CNY"
}
for _, outer := range output.PriceList {
pItem := &priceItem{}
if err := json.Unmarshal([]byte(outer), pItem); err != nil {
log.FromContext(ctx).Error(err, "failed unmarshaling pricing data")
}
if pItem.Product.Attributes.InstanceType == "" {
continue
}
for _, term := range pItem.Terms.OnDemand {
for _, v := range term.PriceDimensions {
price, err := strconv.ParseFloat(v.PricePerUnit[currency], 64)
if err != nil || price == 0 {
continue
}
result[ec2types.InstanceType(pItem.Product.Attributes.InstanceType)] = price
}
}
}
return result
}