github.com/rahart/packer@v0.12.2-0.20161229105310-282bb6ad370f/builder/amazon/common/step_deregister_ami.go (about) 1 package common 2 3 import ( 4 "fmt" 5 6 "github.com/aws/aws-sdk-go/aws" 7 "github.com/aws/aws-sdk-go/service/ec2" 8 "github.com/mitchellh/multistep" 9 "github.com/mitchellh/packer/packer" 10 ) 11 12 type StepDeregisterAMI struct { 13 ForceDeregister bool 14 ForceDeleteSnapshot bool 15 AMIName string 16 } 17 18 func (s *StepDeregisterAMI) Run(state multistep.StateBag) multistep.StepAction { 19 ec2conn := state.Get("ec2").(*ec2.EC2) 20 ui := state.Get("ui").(packer.Ui) 21 22 // Check for force deregister 23 if s.ForceDeregister { 24 resp, err := ec2conn.DescribeImages(&ec2.DescribeImagesInput{ 25 Filters: []*ec2.Filter{{ 26 Name: aws.String("name"), 27 Values: []*string{aws.String(s.AMIName)}, 28 }}}) 29 30 if err != nil { 31 err := fmt.Errorf("Error describing AMI: %s", err) 32 state.Put("error", err) 33 ui.Error(err.Error()) 34 return multistep.ActionHalt 35 } 36 37 // Deregister image(s) by name 38 for _, i := range resp.Images { 39 _, err := ec2conn.DeregisterImage(&ec2.DeregisterImageInput{ 40 ImageId: i.ImageId, 41 }) 42 43 if err != nil { 44 err := fmt.Errorf("Error deregistering existing AMI: %s", err) 45 state.Put("error", err) 46 ui.Error(err.Error()) 47 return multistep.ActionHalt 48 } 49 ui.Say(fmt.Sprintf("Deregistered AMI %s, id: %s", s.AMIName, *i.ImageId)) 50 51 // Delete snapshot(s) by image 52 if s.ForceDeleteSnapshot { 53 for _, b := range i.BlockDeviceMappings { 54 if b.Ebs != nil { 55 _, err := ec2conn.DeleteSnapshot(&ec2.DeleteSnapshotInput{ 56 SnapshotId: b.Ebs.SnapshotId, 57 }) 58 59 if err != nil { 60 err := fmt.Errorf("Error deleting existing snapshot: %s", err) 61 state.Put("error", err) 62 ui.Error(err.Error()) 63 return multistep.ActionHalt 64 } 65 ui.Say(fmt.Sprintf("Deleted snapshot: %s", *b.Ebs.SnapshotId)) 66 } 67 } 68 } 69 } 70 } 71 72 return multistep.ActionContinue 73 } 74 75 func (s *StepDeregisterAMI) Cleanup(state multistep.StateBag) { 76 }