in calculator/pricing.go [133:259]
func GetGCEPricing(sku string, region string) (GCEPriceList, error) {
pricing := GCEPriceList{
Region: region,
H3CpuPrice: 0,
H3MemoryPrice: 0,
C2CpuPrice: 0,
C2MemoryPrice: 0,
C2DCpuPrice: 0,
C2DMemoryPrice: 0,
G2CpuPrice: 0,
G2MemoryPrice: 0,
A2CpuPrice: 0,
A2MemoryPrice: 0,
A3CpuPrice: 0,
A3MemoryPrice: 0,
SpotC2CpuPrice: 0,
SpotC2MemoryPrice: 0,
SpotC2DCpuPrice: 0,
SpotC2DMemoryPrice: 0,
SpotG2DCpuPrice: 0,
SpotG2DMemoryPrice: 0,
SpotA2CpuPrice: 0,
SpotA2MemoryPrice: 0,
SpotA3CpuPrice: 0,
SpotA3MemoryPrice: 0,
}
// If the "region" is actual "zone", we need to remove the zone to get the pricing for the whole region.
if len(strings.Split(region, "-")) > 2 {
region = strings.Join(
strings.Split(region, "-")[:len(
strings.Split(
region,
"-",
),
)-1],
"-",
)
}
ctx := context.Background()
cloudbillingService, err := cloudbilling.NewService(ctx, option.WithScopes(cloudbilling.CloudPlatformScope))
if err != nil {
err = fmt.Errorf("unable to initialize cloud billing service: %v", err)
return GCEPriceList{}, err
}
err = cloudbillingService.Services.Skus.List("services/"+sku).CurrencyCode("USD").Pages(ctx, func(pricingInfo *cloudbilling.ListSkusResponse) error {
for _, sku := range pricingInfo.Skus {
if !slices.Contains(sku.ServiceRegions, region) {
continue
}
decimal := sku.PricingInfo[0].PricingExpression.TieredRates[0].UnitPrice.Units * 1000000000
mantissa := sku.PricingInfo[0].PricingExpression.TieredRates[0].UnitPrice.Nanos * int64(sku.PricingInfo[0].PricingExpression.DisplayQuantity)
price := float64(decimal+mantissa) / 1000000000
switch {
case strings.HasPrefix(sku.Description, "H3 Instance Core"):
pricing.H3CpuPrice = price
case strings.HasPrefix(sku.Description, "H3 Instance Ram"):
pricing.H3MemoryPrice = price
case strings.HasPrefix(sku.Description, "Compute optimized Instance Core"):
pricing.C2CpuPrice = price
case strings.HasPrefix(sku.Description, "Compute optimized Instance Ram"):
pricing.C2MemoryPrice = price
case strings.HasPrefix(sku.Description, "Spot Preemptible Compute optimized Instance Core"):
pricing.SpotC2CpuPrice = price
case strings.HasPrefix(sku.Description, "Spot Preemptible Compute optimized Instance Ram"):
pricing.SpotC2MemoryPrice = price
case strings.HasPrefix(sku.Description, "C2D AMD Instance Core"):
pricing.C2DCpuPrice = price
case strings.HasPrefix(sku.Description, "C2D AMD Instance Ram"):
pricing.C2DMemoryPrice = price
case strings.HasPrefix(sku.Description, "Spot Preemptible C2D AMD Instance Core"):
pricing.SpotC2DCpuPrice = price
case strings.HasPrefix(sku.Description, "Spot Preemptible C2D AMD Instance Ram"):
pricing.SpotC2DMemoryPrice = price
case strings.HasPrefix(sku.Description, "G2 Instance Core"):
pricing.G2CpuPrice = price
case strings.HasPrefix(sku.Description, "G2 Instance Ram"):
pricing.G2MemoryPrice = price
case strings.HasPrefix(sku.Description, "Spot Preemptible G2 Instance Core"):
pricing.SpotG2DCpuPrice = price
case strings.HasPrefix(sku.Description, "Spot Preemptible G2 Instance Ram"):
pricing.SpotG2DMemoryPrice = price
case strings.HasPrefix(sku.Description, "A2 Instance Core"):
pricing.A2CpuPrice = price
case strings.HasPrefix(sku.Description, "A2 Instance Ram"):
pricing.A2MemoryPrice = price
case strings.HasPrefix(sku.Description, "Spot Preemptible A2 Instance Core"):
pricing.SpotA2CpuPrice = price
case strings.HasPrefix(sku.Description, "Spot Preemptible A2 Instance Ram"):
pricing.SpotA2MemoryPrice = price
case strings.HasPrefix(sku.Description, "A3 Instance Core"):
pricing.A3CpuPrice = price
case strings.HasPrefix(sku.Description, "A3 Instance Ram"):
pricing.A3MemoryPrice = price
case strings.HasPrefix(sku.Description, "Spot Preemptible A3 Instance Core"):
pricing.SpotA3CpuPrice = price
case strings.HasPrefix(sku.Description, "Spot Preemptible A3 Instance Ram"):
pricing.SpotA3MemoryPrice = price
}
}
return nil
})
if err != nil {
err = fmt.Errorf("unable to fetch gce cloud billing information: %v", err)
return GCEPriceList{}, err
}
return pricing, nil
}