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  }