github.com/timsutton/packer@v1.3.2/builder/amazon/common/step_deregister_ami.go (about)

     1  package common
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"github.com/aws/aws-sdk-go/aws"
     8  	"github.com/aws/aws-sdk-go/service/ec2"
     9  	"github.com/hashicorp/packer/helper/multistep"
    10  	"github.com/hashicorp/packer/packer"
    11  )
    12  
    13  type StepDeregisterAMI struct {
    14  	AccessConfig        *AccessConfig
    15  	ForceDeregister     bool
    16  	ForceDeleteSnapshot bool
    17  	AMIName             string
    18  	Regions             []string
    19  }
    20  
    21  func (s *StepDeregisterAMI) Run(_ context.Context, state multistep.StateBag) multistep.StepAction {
    22  	// Check for force deregister
    23  	if !s.ForceDeregister {
    24  		return multistep.ActionContinue
    25  	}
    26  
    27  	ui := state.Get("ui").(packer.Ui)
    28  	ec2conn := state.Get("ec2").(*ec2.EC2)
    29  	// Add the session region to list of regions will will deregister AMIs in
    30  	regions := append(s.Regions, *ec2conn.Config.Region)
    31  
    32  	for _, region := range regions {
    33  		// get new connection for each region in which we need to deregister vms
    34  		session, err := s.AccessConfig.Session()
    35  		if err != nil {
    36  			return multistep.ActionHalt
    37  		}
    38  
    39  		regionconn := ec2.New(session.Copy(&aws.Config{
    40  			Region: aws.String(region)},
    41  		))
    42  
    43  		resp, err := regionconn.DescribeImages(&ec2.DescribeImagesInput{
    44  			Owners: aws.StringSlice([]string{"self"}),
    45  			Filters: []*ec2.Filter{{
    46  				Name:   aws.String("name"),
    47  				Values: aws.StringSlice([]string{s.AMIName}),
    48  			}}})
    49  
    50  		if err != nil {
    51  			err := fmt.Errorf("Error describing AMI: %s", err)
    52  			state.Put("error", err)
    53  			ui.Error(err.Error())
    54  			return multistep.ActionHalt
    55  		}
    56  
    57  		// Deregister image(s) by name
    58  		for _, i := range resp.Images {
    59  			_, err := regionconn.DeregisterImage(&ec2.DeregisterImageInput{
    60  				ImageId: i.ImageId,
    61  			})
    62  
    63  			if err != nil {
    64  				err := fmt.Errorf("Error deregistering existing AMI: %s", err)
    65  				state.Put("error", err)
    66  				ui.Error(err.Error())
    67  				return multistep.ActionHalt
    68  			}
    69  			ui.Say(fmt.Sprintf("Deregistered AMI %s, id: %s", s.AMIName, *i.ImageId))
    70  
    71  			// Delete snapshot(s) by image
    72  			if s.ForceDeleteSnapshot {
    73  				for _, b := range i.BlockDeviceMappings {
    74  					if b.Ebs != nil && aws.StringValue(b.Ebs.SnapshotId) != "" {
    75  						_, err := regionconn.DeleteSnapshot(&ec2.DeleteSnapshotInput{
    76  							SnapshotId: b.Ebs.SnapshotId,
    77  						})
    78  
    79  						if err != nil {
    80  							err := fmt.Errorf("Error deleting existing snapshot: %s", err)
    81  							state.Put("error", err)
    82  							ui.Error(err.Error())
    83  							return multistep.ActionHalt
    84  						}
    85  						ui.Say(fmt.Sprintf("Deleted snapshot: %s", *b.Ebs.SnapshotId))
    86  					}
    87  				}
    88  			}
    89  		}
    90  	}
    91  
    92  	return multistep.ActionContinue
    93  }
    94  
    95  func (s *StepDeregisterAMI) Cleanup(state multistep.StateBag) {
    96  }