diff --git a/drivers/amazonec2/amazonec2.go b/drivers/amazonec2/amazonec2.go index 2d539df4bf..d7c15b88c0 100644 --- a/drivers/amazonec2/amazonec2.go +++ b/drivers/amazonec2/amazonec2.go @@ -21,7 +21,6 @@ import ( const ( driverName = "amazonec2" defaultRegion = "us-east-1" - defaultAMI = "ami-4ae27e22" defaultInstanceType = "t2.micro" defaultRootSize = 16 ipRange = "0.0.0.0/0" @@ -96,7 +95,6 @@ func GetCreateFlags() []cli.Flag { cli.StringFlag{ Name: "amazonec2-ami", Usage: "AWS machine image", - Value: defaultAMI, EnvVar: "AWS_AMI", }, cli.StringFlag{ @@ -150,11 +148,21 @@ func NewDriver(machineName string, storePath string, caCert string, privateKey s } func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error { + region, err := validateAwsRegion(flags.String("amazonec2-region")) + if err != nil { + return nil + } + + image := flags.String("amazonec2-ami") + if len(image) == 0 { + image = regionDetails[region].AmiId + } + d.AccessKey = flags.String("amazonec2-access-key") d.SecretKey = flags.String("amazonec2-secret-key") d.SessionToken = flags.String("amazonec2-session-token") - d.AMI = flags.String("amazonec2-ami") - d.Region = flags.String("amazonec2-region") + d.Region = region + d.AMI = image d.InstanceType = flags.String("amazonec2-instance-type") d.VpcId = flags.String("amazonec2-vpc-id") d.SubnetId = flags.String("amazonec2-subnet-id") diff --git a/drivers/amazonec2/amazonec2_test.go b/drivers/amazonec2/amazonec2_test.go index 225ddcd6c4..f26d2bbb13 100644 --- a/drivers/amazonec2/amazonec2_test.go +++ b/drivers/amazonec2/amazonec2_test.go @@ -92,3 +92,36 @@ func TestConfigureSecurityGroupPermissionsDockerAndSsh(t *testing.T) { t.Fatalf("expected 0 permissions; received %d", len(perms)) } } + +func TestAwsRegionList(t *testing.T) { +} + +func TestValidateAwsRegionValid(t *testing.T) { + regions := []string{"eu-west-1", "eu-central-1"} + + for _, v := range regions { + r, err := validateAwsRegion(v) + if err != nil { + t.Fatal(err) + } + + if v != r { + t.Fatal("Wrong region returned") + } + } +} + +func TestValidateAwsRegionInvalid(t *testing.T) { + regions := []string{"eu-west-2", "eu-central-2"} + + for _, v := range regions { + r, err := validateAwsRegion(v) + if err == nil { + t.Fatal("No error returned") + } + + if v == r { + t.Fatal("Wrong region returned") + } + } +} diff --git a/drivers/amazonec2/utils.go b/drivers/amazonec2/utils.go new file mode 100644 index 0000000000..153f64e773 --- /dev/null +++ b/drivers/amazonec2/utils.go @@ -0,0 +1,51 @@ +package amazonec2 + +import ( + "errors" +) + +var ( + errInvalidRegion = errors.New("invalid region specified") + errNoVpcs = errors.New("No VPCs found in region") + errMachineFailure = errors.New("Machine failed to start") + errNoIP = errors.New("No IP Address associated with the instance") + errComplete = errors.New("Complete") +) + +type region struct { + AmiId string +} + +var regionDetails map[string]*region = map[string]*region{ + "ap-northeast-1": {"ami-44f1e245"}, + "ap-southeast-1": {"ami-f95875ab"}, + "ap-southeast-2": {"ami-890b62b3"}, + "cn-north-1": {"ami-fe7ae8c7"}, + "eu-west-1": {"ami-823686f5"}, + "eu-central-1": {"ami-ac1524b1"}, + "sa-east-1": {"ami-c770c1da"}, + "us-east-1": {"ami-4ae27e22"}, + "us-west-1": {"ami-d1180894"}, + "us-west-2": {"ami-898dd9b9"}, + "us-gov-west-1": {"ami-cf5630ec"}, +} + +func awsRegionsList() []string { + var list []string + + for k := range regionDetails { + list = append(list, k) + } + + return list +} + +func validateAwsRegion(region string) (string, error) { + for _, v := range awsRegionsList() { + if v == region { + return region, nil + } + } + + return "", errInvalidRegion +}