func GetGCEPricing()

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
}