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(
name = "go_default_library",
srcs = [
"machine_types.go",
"vpc_ip_resource_limit.go",
],
srcs = ["machine_types.go"],
importpath = "k8s.io/kops/hack/machine_types",
visibility = ["//visibility:private"],
deps = [
"//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/awserr: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",
],
)

View File

@ -22,15 +22,14 @@ import (
"flag"
"fmt"
"io/ioutil"
"math"
"os"
"sort"
"strconv"
"strings"
"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/service/pricing"
"github.com/aws/aws-sdk-go/service/ec2"
"k8s.io/klog"
"k8s.io/kops/upup/pkg/fi/cloudup/awsup"
)
@ -55,10 +54,104 @@ func run() error {
klog.Info("Beginning AWS Machine Refresh")
machines := []awsup.AWSMachineTypeInfo{}
families := make(map[string]struct{})
// These are instance types not available in every account
// 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()
// Give verbose errors on auth problems
@ -70,144 +163,54 @@ func run() error {
if err != nil {
return err
}
svc := pricing.New(sess, config)
typeTerm := pricing.FilterTypeTermMatch
input := &pricing.GetProductsInput{
Filters: []*pricing.Filter{
{
Field: aws.String("operatingSystem"),
Type: &typeTerm,
Value: aws.String("Linux"),
},
{
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
}
client := ec2.New(sess, config)
instanceTypes := make([]*ec2.InstanceTypeInfo, 0)
err = client.DescribeInstanceTypesPages(&ec2.DescribeInstanceTypesInput{},
func(page *ec2.DescribeInstanceTypesOutput, lastPage bool) bool {
instanceTypes = append(instanceTypes, page.InstanceTypes...)
return true
})
if err != nil {
return err
}
var warnings []string
seen := map[string]bool{}
for _, item := range prices {
for k, v := range item {
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)
}
for _, typeInfo := range instanceTypes {
instanceType := *typeInfo.InstanceType
instanceType := attributes["instanceType"]
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{}{}
}
if _, ok := seen[instanceType]; ok {
continue
}
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{}
@ -248,6 +251,7 @@ func run() error {
output = output + fmt.Sprintf("\n// %s family", f)
for _, m := range machines {
if family := strings.Split(m.Name, ".")[0]; family == f {
body := fmt.Sprintf(`
{
Name: "%s",
@ -319,22 +323,6 @@ func run() error {
return nil
}
func stringToFloat32(s string) float32 {
// For 1,000 case
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
func intValue(v *int64) int {
return int(aws.Int64Value(v))
}

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`
// 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
{
Name: "a1.medium",
@ -513,7 +496,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
Cores: 4,
InstanceENIs: 4,
InstanceIPsPerENI: 15,
EphemeralDisks: []int{2000, 2000, 2000},
EphemeralDisks: []int{2048, 2048, 2048},
},
{
@ -522,7 +505,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
Cores: 8,
InstanceENIs: 4,
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,
InstanceENIs: 8,
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,
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},
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
@ -689,8 +672,8 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
Name: "g4dn.16xlarge",
MemoryGB: 256,
Cores: 64,
InstanceENIs: 15,
InstanceIPsPerENI: 50,
InstanceENIs: 4,
InstanceIPsPerENI: 15,
EphemeralDisks: []int{900},
GPU: true,
},
@ -837,7 +820,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
{
Name: "i3.metal",
MemoryGB: 512,
Cores: 64,
Cores: 72,
InstanceENIs: 15,
InstanceIPsPerENI: 50,
EphemeralDisks: []int{1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900},
@ -949,7 +932,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
MemoryGB: 192,
Cores: 96,
InstanceENIs: 15,
InstanceIPsPerENI: 50,
InstanceIPsPerENI: 30,
EphemeralDisks: nil,
},
@ -965,7 +948,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
{
Name: "m1.medium",
MemoryGB: 3.75,
MemoryGB: 3.7,
Cores: 1,
InstanceENIs: 2,
InstanceIPsPerENI: 6,
@ -1170,7 +1153,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
MemoryGB: 256,
Cores: 64,
InstanceENIs: 15,
InstanceIPsPerENI: 30,
InstanceIPsPerENI: 50,
EphemeralDisks: nil,
},
@ -1252,7 +1235,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
MemoryGB: 256,
Cores: 64,
InstanceENIs: 15,
InstanceIPsPerENI: 30,
InstanceIPsPerENI: 50,
EphemeralDisks: nil,
},
@ -1380,7 +1363,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
MemoryGB: 256,
Cores: 64,
InstanceENIs: 15,
InstanceIPsPerENI: 30,
InstanceIPsPerENI: 50,
EphemeralDisks: []int{600, 600, 600, 600},
},
@ -1697,7 +1680,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
// r3 family
{
Name: "r3.large",
MemoryGB: 15.25,
MemoryGB: 15,
Cores: 2,
InstanceENIs: 3,
InstanceIPsPerENI: 10,
@ -2236,7 +2219,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
// t1 family
{
Name: "t1.micro",
MemoryGB: 0.613,
MemoryGB: 0.61,
Cores: 1,
InstanceENIs: 2,
InstanceIPsPerENI: 2,
@ -2394,7 +2377,7 @@ var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{
Name: "t3a.small",
MemoryGB: 2,
Cores: 2,
InstanceENIs: 3,
InstanceENIs: 2,
InstanceIPsPerENI: 4,
EphemeralDisks: nil,
},