Fetching the default vpc id from account

Signed-off-by: Jean-Laurent de Morlhon <jeanlaurent@morlhon.net>
This commit is contained in:
Jean-Laurent de Morlhon 2016-01-14 11:07:28 +01:00
parent 0d2bc08d6e
commit 04fd9e7741
2 changed files with 89 additions and 1 deletions

View File

@ -289,8 +289,15 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
return fmt.Errorf("amazonec2 driver requires the --amazonec2-secret-key option")
}
if d.VpcId == "" {
d.VpcId, err = d.getDefaultVPCId()
if err != nil {
log.Errorf("couldn't determine your account Default VPC ID : %q", err)
}
}
if d.SubnetId == "" && d.VpcId == "" {
return fmt.Errorf("amazonec2 driver requires either the --amazonec2-subnet-id or --amazonec2-vpc-id option")
return fmt.Errorf("amazonec2 driver requires either the --amazonec2-subnet-id or --amazonec2-vpc-id option or an AWS Account with a default vpc-id")
}
if d.SubnetId != "" && d.VpcId != "" {
@ -952,6 +959,21 @@ func (d *Driver) deleteKeyPair() error {
return nil
}
func (d *Driver) getDefaultVPCId() (string, error) {
output, err := d.getClient().DescribeAccountAttributes(&ec2.DescribeAccountAttributesInput{})
if err != nil {
return "", err
}
for _, attribute := range output.AccountAttributes {
if *attribute.AttributeName == "default-vpc" {
return *attribute.AttributeValues[0].AttributeValue, nil
}
}
return "", errors.New("No default-vpc attribute")
}
func generateId() string {
rb := make([]byte, 10)
_, err := rand.Read(rb)

View File

@ -239,3 +239,69 @@ func TestSetConfigFromFlags(t *testing.T) {
assert.NoError(t, err)
assert.Empty(t, checkFlags.InvalidFlags)
}
type fakeEC2WithDescribe struct {
*ec2.EC2
output *ec2.DescribeAccountAttributesOutput
err error
}
func (f *fakeEC2WithDescribe) DescribeAccountAttributes(input *ec2.DescribeAccountAttributesInput) (*ec2.DescribeAccountAttributesOutput, error) {
return f.output, f.err
}
func TestFindDefaultVPC(t *testing.T) {
defaultVpc := "default-vpc"
vpcName := "vpc-9999"
driver := NewDriver("machineFoo", "path")
driver.clientFactory = func() Ec2Client {
return &fakeEC2WithDescribe{
output: &ec2.DescribeAccountAttributesOutput{
AccountAttributes: []*ec2.AccountAttribute{
{
AttributeName: &defaultVpc,
AttributeValues: []*ec2.AccountAttributeValue{
{AttributeValue: &vpcName},
},
},
},
},
}
}
vpc, err := driver.getDefaultVPCId()
assert.Equal(t, "vpc-9999", vpc)
assert.NoError(t, err)
}
func TestDefaultVPCIsMissing(t *testing.T) {
driver := NewDriver("machineFoo", "path")
driver.clientFactory = func() Ec2Client {
return &fakeEC2WithDescribe{
output: &ec2.DescribeAccountAttributesOutput{
AccountAttributes: []*ec2.AccountAttribute{},
},
}
}
vpc, err := driver.getDefaultVPCId()
assert.EqualError(t, err, "No default-vpc attribute")
assert.Empty(t, vpc)
}
func TestDescribeAccountAttributeFails(t *testing.T) {
driver := NewDriver("machineFoo", "path")
driver.clientFactory = func() Ec2Client {
return &fakeEC2WithDescribe{
err: errors.New("Not Found"),
}
}
vpc, err := driver.getDefaultVPCId()
assert.EqualError(t, err, "Not Found")
assert.Empty(t, vpc)
}