Skip to content
Snippets Groups Projects
Commit 63fafc2c authored by Romuald Atchadé's avatar Romuald Atchadé
Browse files

Merge branch 'tags-for-spot-instance'

parents 77bd8f58 030b9eff
Branches
No related tags found
No related merge requests found
...@@ -8,6 +8,7 @@ import ( ...@@ -8,6 +8,7 @@ import (
"fmt" "fmt"
"io" "io"
"io/ioutil" "io/ioutil"
"math"
"net" "net"
"net/url" "net/url"
"strconv" "strconv"
...@@ -629,9 +630,6 @@ func (d *Driver) Create() error { ...@@ -629,9 +630,6 @@ func (d *Driver) Create() error {
func (d *Driver) innerCreate() error { func (d *Driver) innerCreate() error {
log.Infof("Launching instance...") log.Infof("Launching instance...")
tagSpecifications := d.createTagSpecifications()
if err := d.createKeyPair(); err != nil { if err := d.createKeyPair(); err != nil {
return fmt.Errorf("unable to create key pair: %s", err) return fmt.Errorf("unable to create key pair: %s", err)
} }
...@@ -671,8 +669,12 @@ func (d *Driver) innerCreate() error { ...@@ -671,8 +669,12 @@ func (d *Driver) innerCreate() error {
var instance *ec2.Instance var instance *ec2.Instance
// As mentioned in
// https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-requests.html#concepts-spot-instances-request-tags,
// when you tag a Spot Instance request, the instances and volumes that are launched by the Spot Instance request
// are not automatically tagged. We must explicitly tag the instances and volumes
// launched by the Spot Instance request once they are available
req := ec2.RunInstancesInput{ req := ec2.RunInstancesInput{
TagSpecifications: tagSpecifications,
ImageId: &d.AMI, ImageId: &d.AMI,
MinCount: aws.Int64(1), MinCount: aws.Int64(1),
MaxCount: aws.Int64(1), MaxCount: aws.Int64(1),
...@@ -704,7 +706,10 @@ func (d *Driver) innerCreate() error { ...@@ -704,7 +706,10 @@ func (d *Driver) innerCreate() error {
if d.BlockDurationMinutes != 0 { if d.BlockDurationMinutes != 0 {
req.InstanceMarketOptions.SpotOptions.BlockDurationMinutes = &d.BlockDurationMinutes req.InstanceMarketOptions.SpotOptions.BlockDurationMinutes = &d.BlockDurationMinutes
} }
} else {
req.TagSpecifications = d.createTagSpecifications()
} }
inst, err := d.getClient().RunInstances(&req) inst, err := d.getClient().RunInstances(&req)
if err != nil { if err != nil {
...@@ -717,6 +722,32 @@ func (d *Driver) innerCreate() error { ...@@ -717,6 +722,32 @@ func (d *Driver) innerCreate() error {
d.InstanceId = *instance.InstanceId d.InstanceId = *instance.InstanceId
if d.RequestSpotInstance && d.InstanceId != "" {
// According to this AWS Example,
// https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/ec2-example-create-images.html
// You can add up to 10 tags to an instance in a single CreateTags operation
tags := d.createTags()
for {
end := int(math.Min(float64(10), float64(len(tags))))
t := tags[:end]
req := ec2.CreateTagsInput{
Resources: []*string{instance.InstanceId},
Tags: t,
}
_, err := d.getClient().CreateTags(&req)
if err != nil {
return fmt.Errorf("Error setting tags for the spot instance: %v", err)
}
tags = tags[end:]
if len(tags) == 0 {
break
}
}
}
log.Debug("waiting for ip address to become available") log.Debug("waiting for ip address to become available")
if err := mcnutils.WaitFor(d.instanceIpAvailable); err != nil { if err := mcnutils.WaitFor(d.instanceIpAvailable); err != nil {
return err return err
...@@ -1018,6 +1049,24 @@ func (d *Driver) securityGroupAvailableFunc(id string) func() bool { ...@@ -1018,6 +1049,24 @@ func (d *Driver) securityGroupAvailableFunc(id string) func() bool {
} }
func (d *Driver) createTagSpecifications() []*ec2.TagSpecification { func (d *Driver) createTagSpecifications() []*ec2.TagSpecification {
tags := d.createTags()
return []*ec2.TagSpecification{
{
ResourceType: aws.String("instance"),
Tags: tags,
},
{
ResourceType: aws.String("volume"),
Tags: tags,
},
{
ResourceType: aws.String("network-interface"),
Tags: tags,
},
}
}
func (d *Driver) createTags() []*ec2.Tag {
var tags []*ec2.Tag var tags []*ec2.Tag
tags = append(tags, &ec2.Tag{ tags = append(tags, &ec2.Tag{
Key: aws.String("Name"), Key: aws.String("Name"),
...@@ -1037,29 +1086,7 @@ func (d *Driver) createTagSpecifications() []*ec2.TagSpecification { ...@@ -1037,29 +1086,7 @@ func (d *Driver) createTagSpecifications() []*ec2.TagSpecification {
} }
} }
if d.RequestSpotInstance { return tags
return []*ec2.TagSpecification{
{
ResourceType: aws.String("spot-instances-request"),
Tags: tags,
},
}
} else {
return []*ec2.TagSpecification{
{
ResourceType: aws.String("instance"),
Tags: tags,
},
{
ResourceType: aws.String("volume"),
Tags: tags,
},
{
ResourceType: aws.String("network-interface"),
Tags: tags,
},
}
}
} }
func (d *Driver) getTagResources() []*string { func (d *Driver) getTagResources() []*string {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment