From 1fbf8b7f32beaf98a1a85f396a0e98eecfd12ca4 Mon Sep 17 00:00:00 2001 From: Clint Shryock Date: Thu, 11 Jun 2015 10:43:27 -0500 Subject: [PATCH] update create_tags for new sdk --- builder/amazon/common/step_create_tags.go | 51 ++++++++++++++++------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/builder/amazon/common/step_create_tags.go b/builder/amazon/common/step_create_tags.go index 3a31202ff..7c89e5a59 100644 --- a/builder/amazon/common/step_create_tags.go +++ b/builder/amazon/common/step_create_tags.go @@ -3,6 +3,7 @@ package common import ( "fmt" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/ec2" "github.com/mitchellh/multistep" "github.com/mitchellh/packer/packer" @@ -19,41 +20,61 @@ func (s *StepCreateTags) Run(state multistep.StateBag) multistep.StepAction { if len(s.Tags) > 0 { for region, ami := range amis { - ui.Say(fmt.Sprintf("Preparing tags for AMI (%s) and related snapshots", ami)) + ui.Say(fmt.Sprintf("Adding tags to AMI (%s)...", ami)) + + var ec2Tags []*ec2.Tag + for key, value := range s.Tags { + ui.Message(fmt.Sprintf("Adding tag: \"%s\": \"%s\"", key, value)) + ec2Tags = append(ec2Tags, &ec2.Tag{ + Key: aws.String(key), + Value: aws.String(value), + }) + } // Declare list of resources to tag - resourceIds := []string{ami} + resourceIds := []*string{&ami} // Retrieve image list for given AMI - imageResp, err := ec2conn.Images([]string{ami}, ec2.NewFilter()) + imageResp, err := ec2conn.DescribeImages(&ec2.DescribeImagesInput{ + ImageIDs: resourceIds, + }) + if err != nil { err := fmt.Errorf("Error retrieving details for AMI (%s): %s", ami, err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } - image := &imageResp.Images[0] + + if len(imageResp.Images) == 0 { + err := fmt.Errorf("Error retrieving details for AMI (%s), no images found", ami) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } + + image := imageResp.Images[0] // Add only those with a Snapshot ID, i.e. not Ephemeral - for _, device := range image.BlockDevices { - if device.SnapshotId != "" { - ui.Say(fmt.Sprintf("Tagging snapshot: %s", device.SnapshotId)) - resourceIds = append(resourceIds, device.SnapshotId) + for _, device := range image.BlockDeviceMappings { + if device.EBS != nil && device.EBS.SnapshotID != nil { + ui.Say(fmt.Sprintf("Tagging snapshot: %s", *device.EBS.SnapshotID)) + resourceIds = append(resourceIds, device.EBS.SnapshotID) } } - var ec2Tags []*ec2.Tag - for key, value := range s.Tags { - ui.Message(fmt.Sprintf("Adding tag: \"%s\": \"%s\"", key, value)) - ec2Tags = append(ec2Tags, &ec2.Tag{Key: &key, Value: &value}) - } + regionconn := ec2.New(&aws.Config{ + Credentials: ec2conn.Config.Credentials, + Region: region, + }) - _, err := regionconn.CreateTags(&ec2.CreateTagsInput{ + _, err = regionconn.CreateTags(&ec2.CreateTagsInput{ Resources: resourceIds, Tags: ec2Tags, }) + if err != nil { - err := fmt.Errorf("Error adding tags to AMI (%s): %s", ami, err) + err := fmt.Errorf("Error adding tags to Resources (%#v): %s", resourceIds, err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt