From 32ed441fbb477d1495fed1a1058c6ee3e63fb572 Mon Sep 17 00:00:00 2001 From: Evan Hazlett Date: Fri, 27 Feb 2015 16:51:48 -0500 Subject: [PATCH] ec2: use filters for GetSubnets; check subnetId in PreCreate for driver Signed-off-by: Evan Hazlett --- drivers/amazonec2/amazonec2.go | 70 ++++++++++++++++------- drivers/amazonec2/amz/describe_subnets.go | 1 + drivers/amazonec2/amz/ec2.go | 15 +++-- drivers/amazonec2/amz/filter.go | 6 ++ 4 files changed, 67 insertions(+), 25 deletions(-) create mode 100644 drivers/amazonec2/amz/filter.go diff --git a/drivers/amazonec2/amazonec2.go b/drivers/amazonec2/amazonec2.go index e7ae12825e..8c978ee15b 100644 --- a/drivers/amazonec2/amazonec2.go +++ b/drivers/amazonec2/amazonec2.go @@ -210,6 +210,42 @@ func (d *Driver) checkPrereqs() error { if key != nil { return fmt.Errorf("There is already a keypair with the name %s. Please either remove that keypair or use a different machine name.", d.MachineName) } + + regionZone := d.Region + d.Zone + if d.SubnetId == "" { + filters := []amz.Filter{ + { + Name: "availabilityZone", + Value: regionZone, + }, + { + Name: "vpc-id", + Value: d.VpcId, + }, + } + + subnets, err := d.getClient().GetSubnets(filters) + if err != nil { + return err + } + + if len(subnets) == 0 { + return fmt.Errorf("unable to find a subnet in the zone: %s", regionZone) + } + + d.SubnetId = subnets[0].SubnetId + + // try to find default + if len(subnets) > 1 { + for _, subnet := range subnets { + if subnet.DefaultForAz { + d.SubnetId = subnet.SubnetId + break + } + } + } + } + return nil } @@ -240,28 +276,8 @@ func (d *Driver) Create() error { } // get the subnet id - regionZone := d.Region + d.Zone subnetId := d.SubnetId - if d.SubnetId == "" { - subnets, err := d.getClient().GetSubnets() - if err != nil { - return err - } - - for _, s := range subnets { - if s.AvailabilityZone == regionZone && s.VpcId == d.VpcId { - subnetId = s.SubnetId - break - } - } - - } - - if subnetId == "" { - return fmt.Errorf("unable to find a subnet in the zone: %s", regionZone) - } - log.Debugf("launching instance in subnet %s", subnetId) instance, err := d.getClient().RunInstance(d.AMI, d.InstanceType, d.Zone, 1, 1, d.SecurityGroupId, d.KeyName, subnetId, bdm) @@ -270,7 +286,19 @@ func (d *Driver) Create() error { } d.InstanceId = instance.InstanceId - d.IPAddress = instance.IpAddress + log.Debug("waiting for ip address to become available") + for { + ip, err := d.GetIP() + if err != nil { + return err + } + if ip != "" { + + d.IPAddress = instance.IpAddress + break + } + time.Sleep(5 * time.Second) + } if len(instance.NetworkInterfaceSet) > 0 { d.PrivateIPAddress = instance.NetworkInterfaceSet[0].PrivateIpAddress diff --git a/drivers/amazonec2/amz/describe_subnets.go b/drivers/amazonec2/amz/describe_subnets.go index 1fabdc5c05..1378be0aa8 100644 --- a/drivers/amazonec2/amz/describe_subnets.go +++ b/drivers/amazonec2/amz/describe_subnets.go @@ -11,4 +11,5 @@ type Subnet struct { VpcId string `xml:"vpcId"` CidrBlock string `xml:"cidrBlock"` AvailabilityZone string `xml:"availabilityZone"` + DefaultForAz bool `xml:"defaultForAz"` } diff --git a/drivers/amazonec2/amz/ec2.go b/drivers/amazonec2/amz/ec2.go index f191882bd9..ea8af3c44b 100644 --- a/drivers/amazonec2/amz/ec2.go +++ b/drivers/amazonec2/amz/ec2.go @@ -417,13 +417,20 @@ func (e *EC2) GetSecurityGroupById(id string) (*SecurityGroup, error) { return nil, nil } -func (e *EC2) GetSubnets() ([]Subnet, error) { +func (e *EC2) GetSubnets(filters []Filter) ([]Subnet, error) { subnets := []Subnet{} - resp, err := e.performStandardAction("DescribeSubnets") - if err != nil { - return subnets, err + v := url.Values{} + v.Set("Action", "DescribeSubnets") + + for idx, filter := range filters { + n := idx + 1 // amazon starts counting from 1 not 0 + v.Set(fmt.Sprintf("Filter.%d.Name", n), filter.Name) + v.Set(fmt.Sprintf("Filter.%d.Value", n), filter.Value) } + + resp, err := e.awsApiCall(v) defer resp.Body.Close() + contents, err := ioutil.ReadAll(resp.Body) if err != nil { return subnets, fmt.Errorf("Error reading AWS response body: %s", err) diff --git a/drivers/amazonec2/amz/filter.go b/drivers/amazonec2/amz/filter.go new file mode 100644 index 0000000000..96c4f4db55 --- /dev/null +++ b/drivers/amazonec2/amz/filter.go @@ -0,0 +1,6 @@ +package amz + +type Filter struct { + Name string + Value string +}