|
|
|
|
@ -2,7 +2,6 @@ package common
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"log"
|
|
|
|
|
|
|
|
|
|
"github.com/aws/aws-sdk-go/aws"
|
|
|
|
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
|
|
|
|
@ -11,11 +10,13 @@ import (
|
|
|
|
|
"github.com/mitchellh/multistep"
|
|
|
|
|
retry "github.com/mitchellh/packer/common"
|
|
|
|
|
"github.com/mitchellh/packer/packer"
|
|
|
|
|
"github.com/mitchellh/packer/template/interpolate"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type StepCreateTags struct {
|
|
|
|
|
Tags map[string]string
|
|
|
|
|
SnapshotTags map[string]string
|
|
|
|
|
Ctx interpolate.Context
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *StepCreateTags) Run(state multistep.StateBag) multistep.StepAction {
|
|
|
|
|
@ -23,6 +24,13 @@ func (s *StepCreateTags) Run(state multistep.StateBag) multistep.StepAction {
|
|
|
|
|
ui := state.Get("ui").(packer.Ui)
|
|
|
|
|
amis := state.Get("amis").(map[string]string)
|
|
|
|
|
|
|
|
|
|
var sourceAMI string
|
|
|
|
|
if rawSourceAMI, hasSourceAMI := state.GetOk("source_image"); hasSourceAMI {
|
|
|
|
|
sourceAMI = *rawSourceAMI.(*ec2.Image).ImageId
|
|
|
|
|
} else {
|
|
|
|
|
sourceAMI = ""
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(s.Tags) == 0 && len(s.SnapshotTags) == 0 {
|
|
|
|
|
return multistep.ActionContinue
|
|
|
|
|
}
|
|
|
|
|
@ -31,6 +39,22 @@ func (s *StepCreateTags) Run(state multistep.StateBag) multistep.StepAction {
|
|
|
|
|
for region, ami := range amis {
|
|
|
|
|
ui.Say(fmt.Sprintf("Adding tags to AMI (%s)...", ami))
|
|
|
|
|
|
|
|
|
|
// Convert tags to ec2.Tag format
|
|
|
|
|
amiTags, err := ConvertToEC2Tags(s.Tags, *ec2conn.Config.Region, sourceAMI, s.Ctx, ui)
|
|
|
|
|
if err != nil {
|
|
|
|
|
state.Put("error", err)
|
|
|
|
|
ui.Error(err.Error())
|
|
|
|
|
return multistep.ActionHalt
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ui.Say(fmt.Sprintf("Snapshot tags:"))
|
|
|
|
|
snapshotTags, err := ConvertToEC2Tags(s.SnapshotTags, *ec2conn.Config.Region, sourceAMI, s.Ctx, ui)
|
|
|
|
|
if err != nil {
|
|
|
|
|
state.Put("error", err)
|
|
|
|
|
ui.Error(err.Error())
|
|
|
|
|
return multistep.ActionHalt
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Declare list of resources to tag
|
|
|
|
|
awsConfig := aws.Config{
|
|
|
|
|
Credentials: ec2conn.Config.Credentials,
|
|
|
|
|
@ -79,9 +103,20 @@ func (s *StepCreateTags) Run(state multistep.StateBag) multistep.StepAction {
|
|
|
|
|
|
|
|
|
|
// Convert tags to ec2.Tag format
|
|
|
|
|
ui.Say("Creating AMI tags")
|
|
|
|
|
amiTags := ConvertToEC2Tags(s.Tags)
|
|
|
|
|
amiTags, err = ConvertToEC2Tags(s.Tags, *ec2conn.Config.Region, sourceAMI, s.Ctx, ui)
|
|
|
|
|
if err != nil {
|
|
|
|
|
state.Put("error", err)
|
|
|
|
|
ui.Error(err.Error())
|
|
|
|
|
return multistep.ActionHalt
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ui.Say("Creating snapshot tags")
|
|
|
|
|
snapshotTags := ConvertToEC2Tags(s.SnapshotTags)
|
|
|
|
|
snapshotTags, err = ConvertToEC2Tags(s.SnapshotTags, *ec2conn.Config.Region, sourceAMI, s.Ctx, ui)
|
|
|
|
|
if err != nil {
|
|
|
|
|
state.Put("error", err)
|
|
|
|
|
ui.Error(err.Error())
|
|
|
|
|
return multistep.ActionHalt
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Retry creating tags for about 2.5 minutes
|
|
|
|
|
err = retry.Retry(0.2, 30, 11, func() (bool, error) {
|
|
|
|
|
@ -130,14 +165,25 @@ func (s *StepCreateTags) Cleanup(state multistep.StateBag) {
|
|
|
|
|
// No cleanup...
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func ConvertToEC2Tags(tags map[string]string) []*ec2.Tag {
|
|
|
|
|
var ec2tags []*ec2.Tag
|
|
|
|
|
func ConvertToEC2Tags(tags map[string]string, region, sourceAmiId string, ctx interpolate.Context, ui packer.Ui) ([]*ec2.Tag, error) {
|
|
|
|
|
var amiTags []*ec2.Tag
|
|
|
|
|
for key, value := range tags {
|
|
|
|
|
log.Printf("[DEBUG] Creating tag %s=%s", key, value)
|
|
|
|
|
ec2tags = append(ec2tags, &ec2.Tag{
|
|
|
|
|
|
|
|
|
|
ctx.Data = &BuildInfoTemplate{
|
|
|
|
|
SourceAMI: sourceAmiId,
|
|
|
|
|
BuildRegion: region,
|
|
|
|
|
}
|
|
|
|
|
interpolatedValue, err := interpolate.Render(value, &ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return amiTags, fmt.Errorf("Error processing tag: %s:%s - %s", key, value, err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ui.Message(fmt.Sprintf("Adding tag: \"%s\": \"%s\"", key, interpolatedValue))
|
|
|
|
|
amiTags = append(amiTags, &ec2.Tag{
|
|
|
|
|
Key: aws.String(key),
|
|
|
|
|
Value: aws.String(value),
|
|
|
|
|
Value: aws.String(interpolatedValue),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
return ec2tags
|
|
|
|
|
|
|
|
|
|
return amiTags, nil
|
|
|
|
|
}
|
|
|
|
|
|