in hack/code/prices_gen/main.go [96:170]
func generatePricing(filePath string) {
f, err := os.Create("pricing.heapprofile")
if err != nil {
log.Fatal("could not create memory profile: ", err)
}
defer f.Close() // error handling omitted for example
ctx := context.Background()
updateStarted := time.Now()
src := &bytes.Buffer{}
fmt.Fprintln(src, "//go:build !ignore_autogenerated")
license := lo.Must(os.ReadFile("hack/boilerplate.go.txt"))
fmt.Fprintln(src, string(license))
fmt.Fprintln(src, "package pricing")
fmt.Fprintln(src, `import "time"`)
now := time.Now().UTC().Format(time.RFC3339)
fmt.Fprintf(src, "// generated at %s\n\n\n", now)
fmt.Fprintf(src, "var initialPriceUpdate, _ = time.Parse(time.RFC3339, \"%s\")\n", now)
fmt.Fprintln(src, "var initialOnDemandPrices = map[string]map[string]float64{}")
fmt.Fprintln(src, "func init() {")
// record prices for each region
var pricingProviderByRegion = map[string]chan *pricing.Provider{}
for _, region := range regions {
resultsChan := make(chan *pricing.Provider)
log.Println("fetching pricing data in region", region)
go func(region string, resultsChan chan *pricing.Provider) {
pricingProvider := pricing.NewProvider(ctx, pricing.NewAPI(), region, make(chan struct{}))
attempts := 0
for {
if pricingProvider.OnDemandLastUpdated().After(updateStarted) {
break
}
if attempts == 0 {
log.Println("started wait loop for pricing update on region", region)
} else if attempts%10 == 0 {
log.Printf("waiting on pricing update on region %s...\n", region)
} else if time.Now().Sub(updateStarted) >= time.Minute*2 {
log.Fatalf("failed to update region %s within 2 minutes", region)
}
time.Sleep(1 * time.Second)
attempts += 1
}
log.Printf("fetched pricing for region %s\n", region)
resultsChan <- pricingProvider
}(region, resultsChan)
pricingProviderByRegion[region] = resultsChan
}
for _, region := range regions {
pricingProviderChan := pricingProviderByRegion[region]
var pricingProvider *pricing.Provider = <-pricingProviderChan
log.Println("writing output for", region)
instanceTypes := pricingProvider.InstanceTypes()
sort.Strings(instanceTypes)
writePricing(src, instanceTypes, region, pricingProvider.OnDemandPrice)
}
fmt.Fprintln(src, "}")
formatted, err := format.Source(src.Bytes())
if err != nil {
if err := os.WriteFile(filePath, src.Bytes(), 0644); err != nil {
log.Fatalf("writing output, %s", err)
}
log.Fatalf("formatting generated source, %s", err)
}
if err := os.WriteFile(filePath, formatted, 0644); err != nil {
log.Fatalf("writing output, %s", err)
}
runtime.GC()
if err := pprof.WriteHeapProfile(f); err != nil {
log.Fatal("could not write memory profile: ", err)
}
log.Printf("successfully generated pricing file: \"%s\"\n", filePath)
}