Switch to using ec2.DescribeInstanceTypes for building the MachineType list

This commit is contained in:
Peter Rifel 2020-04-03 14:35:06 -05:00
parent c4d8fcf34a
commit 1b29afb45d
4 changed files with 160 additions and 759 deletions

View File

@ -2,18 +2,14 @@ load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = ["machine_types.go"],
"machine_types.go",
"vpc_ip_resource_limit.go",
],
importpath = "k8s.io/kops/hack/machine_types", importpath = "k8s.io/kops/hack/machine_types",
visibility = ["//visibility:private"], visibility = ["//visibility:private"],
deps = [ deps = [
"//upup/pkg/fi/cloudup/awsup:go_default_library", "//upup/pkg/fi/cloudup/awsup:go_default_library",
"//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library",
"//vendor/github.com/aws/aws-sdk-go/aws/awserr:go_default_library",
"//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws/session:go_default_library",
"//vendor/github.com/aws/aws-sdk-go/service/pricing:go_default_library", "//vendor/github.com/aws/aws-sdk-go/service/ec2:go_default_library",
"//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/klog:go_default_library",
], ],
) )

View File

@ -22,15 +22,14 @@ import (
"flag" "flag"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"math"
"os" "os"
"sort" "sort"
"strconv"
"strings" "strings"
"github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/pricing" "github.com/aws/aws-sdk-go/service/ec2"
"k8s.io/klog" "k8s.io/klog"
"k8s.io/kops/upup/pkg/fi/cloudup/awsup" "k8s.io/kops/upup/pkg/fi/cloudup/awsup"
) )
@ -55,10 +54,104 @@ func run() error {
klog.Info("Beginning AWS Machine Refresh") klog.Info("Beginning AWS Machine Refresh")
machines := []awsup.AWSMachineTypeInfo{} // These are instance types not available in every account
families := make(map[string]struct{}) // If they're not available, they wont be in the ec2.DescribeInstanceTypes response
// so they are hardcoded here for reference.
// Note that the m6g instances do not have ENI or IP information
machines := []awsup.AWSMachineTypeInfo{
{
Name: "cr1.8xlarge",
MemoryGB: 244,
Cores: 32,
InstanceENIs: 8,
InstanceIPsPerENI: 30,
EphemeralDisks: []int{120, 120},
},
{
Name: "hs1.8xlarge",
MemoryGB: 117,
Cores: 16,
InstanceENIs: 8,
InstanceIPsPerENI: 30,
EphemeralDisks: []int{2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000},
},
{
Name: "m6g.medium",
MemoryGB: 4,
Cores: 1,
InstanceENIs: 0,
InstanceIPsPerENI: 0,
EphemeralDisks: nil,
},
prices := []aws.JSONValue{} {
Name: "m6g.large",
MemoryGB: 8,
Cores: 2,
InstanceENIs: 0,
InstanceIPsPerENI: 0,
EphemeralDisks: nil,
},
{
Name: "m6g.xlarge",
MemoryGB: 16,
Cores: 4,
InstanceENIs: 0,
InstanceIPsPerENI: 0,
EphemeralDisks: nil,
},
{
Name: "m6g.2xlarge",
MemoryGB: 32,
Cores: 8,
InstanceENIs: 0,
InstanceIPsPerENI: 0,
EphemeralDisks: nil,
},
{
Name: "m6g.4xlarge",
MemoryGB: 64,
Cores: 16,
InstanceENIs: 0,
InstanceIPsPerENI: 0,
EphemeralDisks: nil,
},
{
Name: "m6g.8xlarge",
MemoryGB: 128,
Cores: 32,
InstanceENIs: 0,
InstanceIPsPerENI: 0,
EphemeralDisks: nil,
},
{
Name: "m6g.12xlarge",
MemoryGB: 192,
Cores: 48,
InstanceENIs: 0,
InstanceIPsPerENI: 0,
EphemeralDisks: nil,
},
{
Name: "m6g.16xlarge",
MemoryGB: 256,
Cores: 64,
InstanceENIs: 0,
InstanceIPsPerENI: 0,
EphemeralDisks: nil,
},
}
families := map[string]struct{}{
"cr1": {},
"hs1": {},
"m6g": {},
}
config := aws.NewConfig() config := aws.NewConfig()
// Give verbose errors on auth problems // Give verbose errors on auth problems
@ -70,144 +163,54 @@ func run() error {
if err != nil { if err != nil {
return err return err
} }
svc := pricing.New(sess, config) client := ec2.New(sess, config)
typeTerm := pricing.FilterTypeTermMatch instanceTypes := make([]*ec2.InstanceTypeInfo, 0)
input := &pricing.GetProductsInput{ err = client.DescribeInstanceTypesPages(&ec2.DescribeInstanceTypesInput{},
Filters: []*pricing.Filter{ func(page *ec2.DescribeInstanceTypesOutput, lastPage bool) bool {
{ instanceTypes = append(instanceTypes, page.InstanceTypes...)
Field: aws.String("operatingSystem"), return true
Type: &typeTerm, })
Value: aws.String("Linux"), if err != nil {
}, return err
{
Field: aws.String("tenancy"),
Type: &typeTerm,
Value: aws.String("shared"),
},
{
Field: aws.String("location"),
Type: &typeTerm,
Value: aws.String("US East (N. Virginia)"),
},
{
Field: aws.String("preInstalledSw"),
Type: &typeTerm,
Value: aws.String("NA"),
},
},
FormatVersion: aws.String("aws_v1"),
ServiceCode: aws.String("AmazonEC2"),
}
for {
result, err := svc.GetProducts(input)
if err != nil {
if aerr, ok := err.(awserr.Error); ok {
switch aerr.Code() {
case pricing.ErrCodeInternalErrorException:
return fmt.Errorf("%s: %v", pricing.ErrCodeInternalErrorException, aerr)
case pricing.ErrCodeInvalidParameterException:
return fmt.Errorf("%s: %v", pricing.ErrCodeInvalidParameterException, aerr)
case pricing.ErrCodeNotFoundException:
return fmt.Errorf("%s: %v", pricing.ErrCodeNotFoundException, aerr)
case pricing.ErrCodeInvalidNextTokenException:
return fmt.Errorf("%s: %v", pricing.ErrCodeInvalidNextTokenException, aerr)
case pricing.ErrCodeExpiredNextTokenException:
return fmt.Errorf("%s: %v", pricing.ErrCodeExpiredNextTokenException, aerr)
default:
return aerr
}
} else {
// Print the error, cast err to awserr.Error to get the Code and
// Message from an error.
return err
}
}
prices = append(prices, result.PriceList...)
if result.NextToken != nil {
input.NextToken = result.NextToken
} else {
break
}
} }
var warnings []string var warnings []string
seen := map[string]bool{} seen := map[string]bool{}
for _, item := range prices { for _, typeInfo := range instanceTypes {
for k, v := range item { instanceType := *typeInfo.InstanceType
if k == "product" {
product := v.(map[string]interface{})
attributes := map[string]string{}
for k, v := range product["attributes"].(map[string]interface{}) {
attributes[k] = v.(string)
}
instanceType := attributes["instanceType"] if _, ok := seen[instanceType]; ok {
continue
if _, ok := seen[instanceType]; ok {
continue
}
seen[instanceType] = true
machine := awsup.AWSMachineTypeInfo{
Name: instanceType,
Cores: stringToInt(attributes["vcpu"]),
}
memory := strings.TrimSuffix(attributes["memory"], " GiB")
machine.MemoryGB = stringToFloat32(memory)
if attributes["storage"] != "EBS only" {
storage := strings.Split(attributes["storage"], " ")
var size int
var count int
if len(storage) > 1 {
count = stringToInt(storage[0])
if storage[2] == "NVMe" {
count = 1
size = stringToInt(storage[0])
} else {
size = stringToInt(storage[2])
}
} else {
count = 0
}
ephemeralDisks := []int{}
for i := 0; i < count; i++ {
ephemeralDisks = append(ephemeralDisks, size)
}
machine.EphemeralDisks = ephemeralDisks
}
if attributes["instanceFamily"] == "GPU instance" {
machine.GPU = true
}
if enis, enisOK := InstanceENIsAvailable[instanceType]; enisOK {
machine.InstanceENIs = enis
} else {
warnings = append(warnings, fmt.Sprintf("ENIs not known for %s", instanceType))
}
if ipsPerENI, ipsOK := InstanceIPsAvailable[instanceType]; ipsOK {
machine.InstanceIPsPerENI = int(ipsPerENI)
} else {
warnings = append(warnings, fmt.Sprintf("IPs per ENI not known for %s", instanceType))
}
machines = append(machines, machine)
family := strings.Split(instanceType, ".")[0]
families[family] = struct{}{}
}
} }
seen[instanceType] = true
machine := awsup.AWSMachineTypeInfo{
Name: instanceType,
GPU: typeInfo.GpuInfo != nil,
InstanceENIs: intValue(typeInfo.NetworkInfo.MaximumNetworkInterfaces),
InstanceIPsPerENI: intValue(typeInfo.NetworkInfo.Ipv4AddressesPerInterface),
}
memoryGB := float64(intValue(typeInfo.MemoryInfo.SizeInMiB)) / 1024
machine.MemoryGB = float32(math.Round(memoryGB*100) / 100)
if typeInfo.VCpuInfo != nil && typeInfo.VCpuInfo.DefaultVCpus != nil {
machine.Cores = intValue(typeInfo.VCpuInfo.DefaultVCpus)
}
if typeInfo.InstanceStorageInfo != nil && len(typeInfo.InstanceStorageInfo.Disks) > 0 {
disks := make([]int, 0)
for _, disk := range typeInfo.InstanceStorageInfo.Disks {
for i := 0; i < intValue(disk.Count); i++ {
disks = append(disks, intValue(disk.SizeInGB))
}
}
machine.EphemeralDisks = disks
}
machines = append(machines, machine)
family := strings.Split(instanceType, ".")[0]
families[family] = struct{}{}
} }
sortedFamilies := []string{} sortedFamilies := []string{}
@ -248,6 +251,7 @@ func run() error {
output = output + fmt.Sprintf("\n// %s family", f) output = output + fmt.Sprintf("\n// %s family", f)
for _, m := range machines { for _, m := range machines {
if family := strings.Split(m.Name, ".")[0]; family == f { if family := strings.Split(m.Name, ".")[0]; family == f {
body := fmt.Sprintf(` body := fmt.Sprintf(`
{ {
Name: "%s", Name: "%s",
@ -319,22 +323,6 @@ func run() error {
return nil return nil
} }
func stringToFloat32(s string) float32 { func intValue(v *int64) int {
// For 1,000 case return int(aws.Int64Value(v))
clean := strings.Replace(s, ",", "", -1)
value, err := strconv.ParseFloat(clean, 32)
if err != nil {
klog.Errorf("error converting string to float32: %v", err)
}
return float32(value)
}
func stringToInt(s string) int {
// For 1,000 case
clean := strings.Replace(s, ",", "", -1)
value, err := strconv.Atoi(clean)
if err != nil {
klog.Error(err)
}
return value
} }

View File

@ -1,566 +0,0 @@
/*
Copyright 2019 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Copyright 2017-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may
// not use this file except in compliance with the License. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0/
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing
// permissions and limitations under the License.
package main
// InstanceENIsAvailable contains a mapping of instance types to the number of ENIs available which is described at
// https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI
var InstanceENIsAvailable = map[string]int{
"a1.2xlarge": 4,
"a1.4xlarge": 8,
"a1.large": 3,
"a1.medium": 2,
"a1.metal": 8,
"a1.xlarge": 4,
"c1.medium": 2,
"c1.xlarge": 4,
"c3.2xlarge": 4,
"c3.4xlarge": 8,
"c3.8xlarge": 8,
"c3.large": 3,
"c3.xlarge": 4,
"c4.2xlarge": 4,
"c4.4xlarge": 8,
"c4.8xlarge": 8,
"c4.large": 3,
"c4.xlarge": 4,
"c5.12xlarge": 8,
"c5.18xlarge": 15,
"c5.24xlarge": 15,
"c5.2xlarge": 4,
"c5.4xlarge": 8,
"c5.9xlarge": 8,
"c5.large": 3,
"c5.metal": 15,
"c5.xlarge": 4,
"c5d.12xlarge": 8,
"c5d.18xlarge": 15,
"c5d.24xlarge": 15,
"c5d.2xlarge": 4,
"c5d.4xlarge": 8,
"c5d.9xlarge": 8,
"c5d.large": 3,
"c5d.metal": 15,
"c5d.xlarge": 4,
"c5n.18xlarge": 15,
"c5n.2xlarge": 4,
"c5n.4xlarge": 8,
"c5n.9xlarge": 8,
"c5n.large": 3,
"c5n.metal": 15,
"c5n.xlarge": 4,
"cc2.8xlarge": 8,
"cr1.8xlarge": 8,
"d2.2xlarge": 4,
"d2.4xlarge": 8,
"d2.8xlarge": 8,
"d2.xlarge": 4,
"f1.16xlarge": 8,
"f1.2xlarge": 4,
"f1.4xlarge": 8,
"g2.2xlarge": 4,
"g2.8xlarge": 8,
"g3.16xlarge": 15,
"g3.4xlarge": 8,
"g3.8xlarge": 8,
"g3s.xlarge": 4,
"g4dn.12xlarge": 8,
"g4dn.16xlarge": 15,
"g4dn.2xlarge": 3,
"g4dn.4xlarge": 3,
"g4dn.8xlarge": 4,
"g4dn.xlarge": 3,
"h1.16xlarge": 15,
"h1.2xlarge": 4,
"h1.4xlarge": 8,
"h1.8xlarge": 8,
"hs1.8xlarge": 8,
"i2.2xlarge": 4,
"i2.4xlarge": 8,
"i2.8xlarge": 8,
"i2.xlarge": 4,
"i3.16xlarge": 15,
"i3.2xlarge": 4,
"i3.4xlarge": 8,
"i3.8xlarge": 8,
"i3.large": 3,
"i3.metal": 15,
"i3.xlarge": 4,
"i3en.12xlarge": 8,
"i3en.24xlarge": 15,
"i3en.2xlarge": 4,
"i3en.3xlarge": 4,
"i3en.6xlarge": 8,
"i3en.large": 3,
"i3en.metal": 15,
"i3en.xlarge": 4,
"inf1.xlarge": 4,
"inf1.2xlarge": 4,
"inf1.6xlarge": 8,
"inf1.24xlarge": 15,
"m1.large": 3,
"m1.medium": 2,
"m1.small": 2,
"m1.xlarge": 4,
"m2.2xlarge": 4,
"m2.4xlarge": 8,
"m2.xlarge": 4,
"m3.2xlarge": 4,
"m3.large": 3,
"m3.medium": 2,
"m3.xlarge": 4,
"m4.10xlarge": 8,
"m4.16xlarge": 8,
"m4.2xlarge": 4,
"m4.4xlarge": 8,
"m4.large": 2,
"m4.xlarge": 4,
"m5.12xlarge": 8,
"m5.16xlarge": 15,
"m5.24xlarge": 15,
"m5.2xlarge": 4,
"m5.4xlarge": 8,
"m5.8xlarge": 8,
"m5.large": 3,
"m5.metal": 15,
"m5.xlarge": 4,
"m5a.12xlarge": 8,
"m5a.16xlarge": 15,
"m5a.24xlarge": 15,
"m5a.2xlarge": 4,
"m5a.4xlarge": 8,
"m5a.8xlarge": 8,
"m5a.large": 3,
"m5a.xlarge": 4,
"m5ad.12xlarge": 8,
"m5ad.24xlarge": 15,
"m5ad.2xlarge": 4,
"m5ad.4xlarge": 8,
"m5ad.large": 3,
"m5ad.xlarge": 4,
"m5d.12xlarge": 8,
"m5d.16xlarge": 15,
"m5d.24xlarge": 15,
"m5d.2xlarge": 4,
"m5d.4xlarge": 8,
"m5d.8xlarge": 8,
"m5d.large": 3,
"m5d.metal": 15,
"m5d.xlarge": 4,
"m5dn.12xlarge": 8,
"m5dn.16xlarge": 15,
"m5dn.24xlarge": 15,
"m5dn.2xlarge": 4,
"m5dn.4xlarge": 8,
"m5dn.8xlarge": 8,
"m5dn.large": 3,
"m5dn.xlarge": 4,
"m5n.12xlarge": 8,
"m5n.16xlarge": 15,
"m5n.24xlarge": 15,
"m5n.2xlarge": 4,
"m5n.4xlarge": 8,
"m5n.8xlarge": 8,
"m5n.large": 3,
"m5n.xlarge": 4,
"p2.16xlarge": 8,
"p2.8xlarge": 8,
"p2.xlarge": 4,
"p3.16xlarge": 8,
"p3.2xlarge": 4,
"p3.8xlarge": 8,
"p3dn.24xlarge": 15,
"r3.2xlarge": 4,
"r3.4xlarge": 8,
"r3.8xlarge": 8,
"r3.large": 3,
"r3.xlarge": 4,
"r4.16xlarge": 15,
"r4.2xlarge": 4,
"r4.4xlarge": 8,
"r4.8xlarge": 8,
"r4.large": 3,
"r4.xlarge": 4,
"r5.12xlarge": 8,
"r5.16xlarge": 15,
"r5.24xlarge": 15,
"r5.2xlarge": 4,
"r5.4xlarge": 8,
"r5.8xlarge": 8,
"r5.large": 3,
"r5.metal": 15,
"r5.xlarge": 4,
"r5a.12xlarge": 8,
"r5a.16xlarge": 15,
"r5a.24xlarge": 15,
"r5a.2xlarge": 4,
"r5a.4xlarge": 8,
"r5a.8xlarge": 8,
"r5a.large": 3,
"r5a.xlarge": 4,
"r5ad.12xlarge": 8,
"r5ad.24xlarge": 15,
"r5ad.2xlarge": 4,
"r5ad.4xlarge": 8,
"r5ad.large": 3,
"r5ad.xlarge": 4,
"r5d.12xlarge": 8,
"r5d.16xlarge": 15,
"r5d.24xlarge": 15,
"r5d.2xlarge": 4,
"r5d.4xlarge": 8,
"r5d.8xlarge": 8,
"r5d.large": 3,
"r5d.metal": 15,
"r5d.xlarge": 4,
"r5dn.12xlarge": 8,
"r5dn.16xlarge": 15,
"r5dn.24xlarge": 15,
"r5dn.2xlarge": 4,
"r5dn.4xlarge": 8,
"r5dn.8xlarge": 8,
"r5dn.large": 3,
"r5dn.xlarge": 4,
"r5n.12xlarge": 8,
"r5n.16xlarge": 15,
"r5n.24xlarge": 15,
"r5n.2xlarge": 4,
"r5n.4xlarge": 8,
"r5n.8xlarge": 8,
"r5n.large": 3,
"r5n.xlarge": 4,
"t1.micro": 2,
"t2.2xlarge": 3,
"t2.large": 3,
"t2.medium": 3,
"t2.micro": 2,
"t2.nano": 2,
"t2.small": 3,
"t2.xlarge": 3,
"t3.2xlarge": 4,
"t3.large": 3,
"t3.medium": 3,
"t3.micro": 2,
"t3.nano": 2,
"t3.small": 3,
"t3.xlarge": 4,
"t3a.2xlarge": 4,
"t3a.large": 3,
"t3a.medium": 3,
"t3a.micro": 2,
"t3a.nano": 2,
"t3a.small": 3,
"t3a.xlarge": 4,
"u-12tb1.metal": 5,
"u-6tb1.metal": 5,
"u-9tb1.metal": 5,
"x1.16xlarge": 8,
"x1.32xlarge": 8,
"x1e.16xlarge": 8,
"x1e.2xlarge": 4,
"x1e.32xlarge": 8,
"x1e.4xlarge": 4,
"x1e.8xlarge": 4,
"x1e.xlarge": 3,
"z1d.12xlarge": 15,
"z1d.2xlarge": 4,
"z1d.3xlarge": 8,
"z1d.6xlarge": 8,
"z1d.large": 3,
"z1d.metal": 15,
"z1d.xlarge": 4,
}
// InstanceIPsAvailable contains a mapping of instance types to the number of IPs per ENI
// https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI
var InstanceIPsAvailable = map[string]int64{
"a1.2xlarge": 15,
"a1.4xlarge": 30,
"a1.large": 10,
"a1.medium": 4,
"a1.metal": 30,
"a1.xlarge": 15,
"c1.medium": 6,
"c1.xlarge": 15,
"c3.2xlarge": 15,
"c3.4xlarge": 30,
"c3.8xlarge": 30,
"c3.large": 10,
"c3.xlarge": 15,
"c4.2xlarge": 15,
"c4.4xlarge": 30,
"c4.8xlarge": 30,
"c4.large": 10,
"c4.xlarge": 15,
"c5.12xlarge": 30,
"c5.18xlarge": 50,
"c5.24xlarge": 50,
"c5.2xlarge": 15,
"c5.4xlarge": 30,
"c5.9xlarge": 30,
"c5.large": 10,
"c5.metal": 50,
"c5.xlarge": 15,
"c5d.12xlarge": 30,
"c5d.18xlarge": 50,
"c5d.24xlarge": 50,
"c5d.2xlarge": 15,
"c5d.4xlarge": 30,
"c5d.9xlarge": 30,
"c5d.large": 10,
"c5d.metal": 50,
"c5d.xlarge": 15,
"c5n.18xlarge": 50,
"c5n.2xlarge": 15,
"c5n.4xlarge": 30,
"c5n.9xlarge": 30,
"c5n.large": 10,
"c5n.metal": 50,
"c5n.xlarge": 15,
"cc2.8xlarge": 30,
"cr1.8xlarge": 30,
"d2.2xlarge": 15,
"d2.4xlarge": 30,
"d2.8xlarge": 30,
"d2.xlarge": 15,
"f1.16xlarge": 50,
"f1.2xlarge": 15,
"f1.4xlarge": 30,
"g2.2xlarge": 15,
"g2.8xlarge": 30,
"g3.16xlarge": 50,
"g3.4xlarge": 30,
"g3.8xlarge": 30,
"g3s.xlarge": 15,
"g4dn.12xlarge": 30,
"g4dn.16xlarge": 50,
"g4dn.2xlarge": 10,
"g4dn.4xlarge": 10,
"g4dn.8xlarge": 15,
"g4dn.xlarge": 10,
"h1.16xlarge": 50,
"h1.2xlarge": 15,
"h1.4xlarge": 30,
"h1.8xlarge": 30,
"hs1.8xlarge": 30,
"i2.2xlarge": 15,
"i2.4xlarge": 30,
"i2.8xlarge": 30,
"i2.xlarge": 15,
"i3.16xlarge": 50,
"i3.2xlarge": 15,
"i3.4xlarge": 30,
"i3.8xlarge": 30,
"i3.large": 10,
"i3.metal": 50,
"i3.xlarge": 15,
"i3en.12xlarge": 30,
"i3en.24xlarge": 50,
"i3en.2xlarge": 15,
"i3en.3xlarge": 15,
"i3en.6xlarge": 30,
"i3en.large": 10,
"i3en.metal": 50,
"i3en.xlarge": 15,
"inf1.xlarge": 10,
"inf1.2xlarge": 10,
"inf1.6xlarge": 30,
"inf1.24xlarge": 50,
"m1.large": 10,
"m1.medium": 6,
"m1.small": 4,
"m1.xlarge": 15,
"m2.2xlarge": 30,
"m2.4xlarge": 30,
"m2.xlarge": 15,
"m3.2xlarge": 30,
"m3.large": 10,
"m3.medium": 6,
"m3.xlarge": 15,
"m4.10xlarge": 30,
"m4.16xlarge": 30,
"m4.2xlarge": 15,
"m4.4xlarge": 30,
"m4.large": 10,
"m4.xlarge": 15,
"m5.12xlarge": 30,
"m5.16xlarge": 30,
"m5.24xlarge": 50,
"m5.2xlarge": 15,
"m5.4xlarge": 30,
"m5.8xlarge": 30,
"m5.large": 10,
"m5.metal": 50,
"m5.xlarge": 15,
"m5a.12xlarge": 30,
"m5a.16xlarge": 30,
"m5a.24xlarge": 50,
"m5a.2xlarge": 15,
"m5a.4xlarge": 30,
"m5a.8xlarge": 30,
"m5a.large": 10,
"m5a.xlarge": 15,
"m5ad.12xlarge": 30,
"m5ad.24xlarge": 50,
"m5ad.2xlarge": 15,
"m5ad.4xlarge": 30,
"m5ad.large": 10,
"m5ad.xlarge": 15,
"m5d.12xlarge": 30,
"m5d.16xlarge": 30,
"m5d.24xlarge": 50,
"m5d.2xlarge": 15,
"m5d.4xlarge": 30,
"m5d.8xlarge": 30,
"m5d.large": 10,
"m5d.metal": 50,
"m5d.xlarge": 15,
"m5dn.12xlarge": 30,
"m5dn.16xlarge": 50,
"m5dn.24xlarge": 50,
"m5dn.2xlarge": 15,
"m5dn.4xlarge": 30,
"m5dn.8xlarge": 30,
"m5dn.large": 10,
"m5dn.xlarge": 15,
"m5n.12xlarge": 30,
"m5n.16xlarge": 50,
"m5n.24xlarge": 50,
"m5n.2xlarge": 15,
"m5n.4xlarge": 30,
"m5n.8xlarge": 30,
"m5n.large": 10,
"m5n.xlarge": 15,
"p2.16xlarge": 30,
"p2.8xlarge": 30,
"p2.xlarge": 15,
"p3.16xlarge": 30,
"p3.2xlarge": 15,
"p3.8xlarge": 30,
"p3dn.24xlarge": 50,
"r3.2xlarge": 15,
"r3.4xlarge": 30,
"r3.8xlarge": 30,
"r3.large": 10,
"r3.xlarge": 15,
"r4.16xlarge": 50,
"r4.2xlarge": 15,
"r4.4xlarge": 30,
"r4.8xlarge": 30,
"r4.large": 10,
"r4.xlarge": 15,
"r5.12xlarge": 30,
"r5.16xlarge": 50,
"r5.24xlarge": 50,
"r5.2xlarge": 15,
"r5.4xlarge": 30,
"r5.8xlarge": 30,
"r5.large": 10,
"r5.metal": 50,
"r5.xlarge": 15,
"r5a.12xlarge": 30,
"r5a.16xlarge": 50,
"r5a.24xlarge": 50,
"r5a.2xlarge": 15,
"r5a.4xlarge": 30,
"r5a.8xlarge": 30,
"r5a.large": 10,
"r5a.xlarge": 15,
"r5ad.12xlarge": 30,
"r5ad.24xlarge": 50,
"r5ad.2xlarge": 15,
"r5ad.4xlarge": 30,
"r5ad.large": 10,
"r5ad.xlarge": 15,
"r5d.12xlarge": 30,
"r5d.16xlarge": 50,
"r5d.24xlarge": 50,
"r5d.2xlarge": 15,
"r5d.4xlarge": 30,
"r5d.8xlarge": 30,
"r5d.large": 10,
"r5d.metal": 50,
"r5d.xlarge": 15,
"r5dn.12xlarge": 30,
"r5dn.16xlarge": 50,
"r5dn.24xlarge": 50,
"r5dn.2xlarge": 15,
"r5dn.4xlarge": 30,
"r5dn.8xlarge": 30,
"r5dn.large": 10,
"r5dn.xlarge": 15,
"r5n.12xlarge": 30,
"r5n.16xlarge": 50,
"r5n.24xlarge": 50,
"r5n.2xlarge": 15,
"r5n.4xlarge": 30,
"r5n.8xlarge": 30,
"r5n.large": 10,
"r5n.xlarge": 15,
"t1.micro": 2,
"t2.2xlarge": 15,
"t2.large": 12,
"t2.medium": 6,
"t2.micro": 2,
"t2.nano": 2,
"t2.small": 4,
"t2.xlarge": 15,
"t3.2xlarge": 15,
"t3.large": 12,
"t3.medium": 6,
"t3.micro": 2,
"t3.nano": 2,
"t3.small": 4,
"t3.xlarge": 15,
"t3a.2xlarge": 15,
"t3a.large": 12,
"t3a.medium": 6,
"t3a.micro": 2,
"t3a.nano": 2,
"t3a.small": 4,
"t3a.xlarge": 15,
"u-12tb1.metal": 30,
"u-6tb1.metal": 30,
"u-9tb1.metal": 30,
"x1.16xlarge": 30,
"x1.32xlarge": 30,
"x1e.16xlarge": 30,
"x1e.2xlarge": 15,
"x1e.32xlarge": 30,
"x1e.4xlarge": 15,
"x1e.8xlarge": 15,
"x1e.xlarge": 10,
"z1d.12xlarge": 50,
"z1d.2xlarge": 15,
"z1d.3xlarge": 30,
"z1d.6xlarge": 30,
"z1d.large": 10,
"z1d.metal": 50,
"z1d.xlarge": 15,
}

View File

@ -75,23 +75,6 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
// NOTE: Content below is auto generated by `make update-machine-types` // NOTE: Content below is auto generated by `make update-machine-types`
// BEGIN GENERATED CONTENT // BEGIN GENERATED CONTENT
// WARNING: ENIs not known for m6g.medium
// WARNING: IPs per ENI not known for m6g.medium
// WARNING: ENIs not known for m6g.8xlarge
// WARNING: IPs per ENI not known for m6g.8xlarge
// WARNING: ENIs not known for m6g.16xlarge
// WARNING: IPs per ENI not known for m6g.16xlarge
// WARNING: ENIs not known for m6g.2xlarge
// WARNING: IPs per ENI not known for m6g.2xlarge
// WARNING: ENIs not known for m6g.xlarge
// WARNING: IPs per ENI not known for m6g.xlarge
// WARNING: ENIs not known for m6g.4xlarge
// WARNING: IPs per ENI not known for m6g.4xlarge
// WARNING: ENIs not known for m6g.12xlarge
// WARNING: IPs per ENI not known for m6g.12xlarge
// WARNING: ENIs not known for m6g.large
// WARNING: IPs per ENI not known for m6g.large
// a1 family // a1 family
{ {
Name: "a1.medium", Name: "a1.medium",
@ -513,7 +496,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
Cores: 4, Cores: 4,
InstanceENIs: 4, InstanceENIs: 4,
InstanceIPsPerENI: 15, InstanceIPsPerENI: 15,
EphemeralDisks: []int{2000, 2000, 2000}, EphemeralDisks: []int{2048, 2048, 2048},
}, },
{ {
@ -522,7 +505,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
Cores: 8, Cores: 8,
InstanceENIs: 4, InstanceENIs: 4,
InstanceIPsPerENI: 15, InstanceIPsPerENI: 15,
EphemeralDisks: []int{2000, 2000, 2000, 2000, 2000, 2000}, EphemeralDisks: []int{2048, 2048, 2048, 2048, 2048, 2048},
}, },
{ {
@ -531,7 +514,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
Cores: 16, Cores: 16,
InstanceENIs: 8, InstanceENIs: 8,
InstanceIPsPerENI: 30, InstanceIPsPerENI: 30,
EphemeralDisks: []int{2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000}, EphemeralDisks: []int{2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048},
}, },
{ {
@ -540,7 +523,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
Cores: 36, Cores: 36,
InstanceENIs: 8, InstanceENIs: 8,
InstanceIPsPerENI: 30, InstanceIPsPerENI: 30,
EphemeralDisks: []int{2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000}, EphemeralDisks: []int{2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048},
}, },
// f1 family // f1 family
@ -689,8 +672,8 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
Name: "g4dn.16xlarge", Name: "g4dn.16xlarge",
MemoryGB: 256, MemoryGB: 256,
Cores: 64, Cores: 64,
InstanceENIs: 15, InstanceENIs: 4,
InstanceIPsPerENI: 50, InstanceIPsPerENI: 15,
EphemeralDisks: []int{900}, EphemeralDisks: []int{900},
GPU: true, GPU: true,
}, },
@ -837,7 +820,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
{ {
Name: "i3.metal", Name: "i3.metal",
MemoryGB: 512, MemoryGB: 512,
Cores: 64, Cores: 72,
InstanceENIs: 15, InstanceENIs: 15,
InstanceIPsPerENI: 50, InstanceIPsPerENI: 50,
EphemeralDisks: []int{1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900}, EphemeralDisks: []int{1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900},
@ -949,7 +932,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
MemoryGB: 192, MemoryGB: 192,
Cores: 96, Cores: 96,
InstanceENIs: 15, InstanceENIs: 15,
InstanceIPsPerENI: 50, InstanceIPsPerENI: 30,
EphemeralDisks: nil, EphemeralDisks: nil,
}, },
@ -965,7 +948,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
{ {
Name: "m1.medium", Name: "m1.medium",
MemoryGB: 3.75, MemoryGB: 3.7,
Cores: 1, Cores: 1,
InstanceENIs: 2, InstanceENIs: 2,
InstanceIPsPerENI: 6, InstanceIPsPerENI: 6,
@ -1170,7 +1153,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
MemoryGB: 256, MemoryGB: 256,
Cores: 64, Cores: 64,
InstanceENIs: 15, InstanceENIs: 15,
InstanceIPsPerENI: 30, InstanceIPsPerENI: 50,
EphemeralDisks: nil, EphemeralDisks: nil,
}, },
@ -1252,7 +1235,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
MemoryGB: 256, MemoryGB: 256,
Cores: 64, Cores: 64,
InstanceENIs: 15, InstanceENIs: 15,
InstanceIPsPerENI: 30, InstanceIPsPerENI: 50,
EphemeralDisks: nil, EphemeralDisks: nil,
}, },
@ -1380,7 +1363,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
MemoryGB: 256, MemoryGB: 256,
Cores: 64, Cores: 64,
InstanceENIs: 15, InstanceENIs: 15,
InstanceIPsPerENI: 30, InstanceIPsPerENI: 50,
EphemeralDisks: []int{600, 600, 600, 600}, EphemeralDisks: []int{600, 600, 600, 600},
}, },
@ -1697,7 +1680,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
// r3 family // r3 family
{ {
Name: "r3.large", Name: "r3.large",
MemoryGB: 15.25, MemoryGB: 15,
Cores: 2, Cores: 2,
InstanceENIs: 3, InstanceENIs: 3,
InstanceIPsPerENI: 10, InstanceIPsPerENI: 10,
@ -2236,7 +2219,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
// t1 family // t1 family
{ {
Name: "t1.micro", Name: "t1.micro",
MemoryGB: 0.613, MemoryGB: 0.61,
Cores: 1, Cores: 1,
InstanceENIs: 2, InstanceENIs: 2,
InstanceIPsPerENI: 2, InstanceIPsPerENI: 2,
@ -2394,7 +2377,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
Name: "t3a.small", Name: "t3a.small",
MemoryGB: 2, MemoryGB: 2,
Cores: 2, Cores: 2,
InstanceENIs: 3, InstanceENIs: 2,
InstanceIPsPerENI: 4, InstanceIPsPerENI: 4,
EphemeralDisks: nil, EphemeralDisks: nil,
}, },