open-nomad/tools/ec2info/main.go
Seth Hoenig e693d15a5b env_aws: get ec2 cpu perf data from AWS API
Previously, Nomad was using a hand-made lookup table for looking
up EC2 CPU performance characteristics (core count + speed = ticks).

This data was incomplete and incorrect depending on region. The AWS
API has the correct data but requires API keys to use (i.e. should not
be queried directly from Nomad).

This change introduces a lookup table generated by a small command line
tool in Nomad's tools module which uses the Amazon AWS API.

Running the tool requires AWS_* environment variables set.
  $ # in nomad/tools/cpuinfo
  $ go run .

Going forward, Nomad can incorporate regeneration of the lookup table
somewhere in the CI pipeline so that we remain up-to-date on the latest
offerings from EC2.

Fixes #7830
2020-10-08 12:01:09 -05:00

62 lines
1.5 KiB
Go

// Command ec2info provides a tool for generating a CPU performance lookup
// table indexed by EC2 instance types.
//
// By default the generated file will overwrite `env_aws_cpu.go` in Nomad's
// client/fingerprint package, when run from this directory.
//
// Requires AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN.
//
// Options
// --package : configure package name of generated output file
// --region : configure initial region from which to lookup all regions
// --outfile : configure filepath of generated output file
// --verbose : print log messages while running
//
// Usage
// $ go run .
package main
import (
"flag"
"log"
)
func args() (string, string, string, bool) {
pkg := flag.String("package", "fingerprint", "generate package name")
region := flag.String("region", "us-west-1", "initial region for listing regions")
outfile := flag.String("output", "../../client/fingerprint/env_aws_cpu.go", "output filepath")
verbose := flag.Bool("verbose", true, "print extra information while running")
flag.Parse()
return *pkg, *region, *outfile, *verbose
}
func check(err error) {
if err != nil {
log.Fatal(err)
}
}
func main() {
pkg, region, output, verbose := args()
client, err := clientForRegion(region)
check(err)
regions, err := getRegions(client)
check(err)
data, err := getData(regions, verbose)
check(err)
flat := flatten(data)
f, err := open(output)
check(err)
defer func() {
check(f.Close())
}()
check(write(f, flat, pkg))
check(format(output))
}