make force_deregister work in all regions, not just original region.

This commit is contained in:
Megan Marsh 2017-08-14 09:20:08 -07:00
parent d733be711a
commit 14b2d04332
5 changed files with 57 additions and 32 deletions

View File

@ -245,9 +245,11 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
&StepEarlyCleanup{}, &StepEarlyCleanup{},
&StepSnapshot{}, &StepSnapshot{},
&awscommon.StepDeregisterAMI{ &awscommon.StepDeregisterAMI{
AccessConfig: &b.config.AccessConfig,
ForceDeregister: b.config.AMIForceDeregister, ForceDeregister: b.config.AMIForceDeregister,
ForceDeleteSnapshot: b.config.AMIForceDeleteSnapshot, ForceDeleteSnapshot: b.config.AMIForceDeleteSnapshot,
AMIName: b.config.AMIName, AMIName: b.config.AMIName,
Regions: b.config.AMIRegions,
}, },
&StepRegisterAMI{ &StepRegisterAMI{
RootVolumeSize: b.config.RootVolumeSize, RootVolumeSize: b.config.RootVolumeSize,

View File

@ -10,59 +10,76 @@ import (
) )
type StepDeregisterAMI struct { type StepDeregisterAMI struct {
AccessConfig *AccessConfig
ForceDeregister bool ForceDeregister bool
ForceDeleteSnapshot bool ForceDeleteSnapshot bool
AMIName string AMIName string
Regions []string
} }
func (s *StepDeregisterAMI) Run(state multistep.StateBag) multistep.StepAction { func (s *StepDeregisterAMI) Run(state multistep.StateBag) multistep.StepAction {
ec2conn := state.Get("ec2").(*ec2.EC2)
ui := state.Get("ui").(packer.Ui) ui := state.Get("ui").(packer.Ui)
regions := s.Regions
if len(regions) == 0 {
regions = append(regions, s.AccessConfig.RawRegion)
}
// Check for force deregister // Check for force deregister
if s.ForceDeregister { if s.ForceDeregister {
resp, err := ec2conn.DescribeImages(&ec2.DescribeImagesInput{ for _, region := range regions {
Filters: []*ec2.Filter{{ // get new connection for each region in which we need to deregister vms
Name: aws.String("name"), session, err := s.AccessConfig.Session()
Values: []*string{aws.String(s.AMIName)}, if err != nil {
}}}) return multistep.ActionHalt
}
if err != nil { regionconn := ec2.New(session.Copy(&aws.Config{
err := fmt.Errorf("Error describing AMI: %s", err) Region: aws.String(region)},
state.Put("error", err) ))
ui.Error(err.Error())
return multistep.ActionHalt
}
// Deregister image(s) by name resp, err := regionconn.DescribeImages(&ec2.DescribeImagesInput{
for _, i := range resp.Images { Filters: []*ec2.Filter{{
_, err := ec2conn.DeregisterImage(&ec2.DeregisterImageInput{ Name: aws.String("name"),
ImageId: i.ImageId, Values: []*string{aws.String(s.AMIName)},
}) }}})
if err != nil { if err != nil {
err := fmt.Errorf("Error deregistering existing AMI: %s", err) err := fmt.Errorf("Error describing AMI: %s", err)
state.Put("error", err) state.Put("error", err)
ui.Error(err.Error()) ui.Error(err.Error())
return multistep.ActionHalt return multistep.ActionHalt
} }
ui.Say(fmt.Sprintf("Deregistered AMI %s, id: %s", s.AMIName, *i.ImageId))
// Delete snapshot(s) by image // Deregister image(s) by name
if s.ForceDeleteSnapshot { for _, i := range resp.Images {
for _, b := range i.BlockDeviceMappings { _, err := regionconn.DeregisterImage(&ec2.DeregisterImageInput{
if b.Ebs != nil && aws.StringValue(b.Ebs.SnapshotId) != "" { ImageId: i.ImageId,
_, err := ec2conn.DeleteSnapshot(&ec2.DeleteSnapshotInput{ })
SnapshotId: b.Ebs.SnapshotId,
})
if err != nil { if err != nil {
err := fmt.Errorf("Error deleting existing snapshot: %s", err) err := fmt.Errorf("Error deregistering existing AMI: %s", err)
state.Put("error", err) state.Put("error", err)
ui.Error(err.Error()) ui.Error(err.Error())
return multistep.ActionHalt return multistep.ActionHalt
}
ui.Say(fmt.Sprintf("Deregistered AMI %s, id: %s", s.AMIName, *i.ImageId))
// Delete snapshot(s) by image
if s.ForceDeleteSnapshot {
for _, b := range i.BlockDeviceMappings {
if b.Ebs != nil && aws.StringValue(b.Ebs.SnapshotId) != "" {
_, err := regionconn.DeleteSnapshot(&ec2.DeleteSnapshotInput{
SnapshotId: b.Ebs.SnapshotId,
})
if err != nil {
err := fmt.Errorf("Error deleting existing snapshot: %s", err)
state.Put("error", err)
ui.Error(err.Error())
return multistep.ActionHalt
}
ui.Say(fmt.Sprintf("Deleted snapshot: %s", *b.Ebs.SnapshotId))
} }
ui.Say(fmt.Sprintf("Deleted snapshot: %s", *b.Ebs.SnapshotId))
} }
} }
} }

View File

@ -182,9 +182,11 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
EnableEnhancedNetworking: b.config.AMIEnhancedNetworking, EnableEnhancedNetworking: b.config.AMIEnhancedNetworking,
}, },
&awscommon.StepDeregisterAMI{ &awscommon.StepDeregisterAMI{
AccessConfig: &b.config.AccessConfig,
ForceDeregister: b.config.AMIForceDeregister, ForceDeregister: b.config.AMIForceDeregister,
ForceDeleteSnapshot: b.config.AMIForceDeleteSnapshot, ForceDeleteSnapshot: b.config.AMIForceDeleteSnapshot,
AMIName: b.config.AMIName, AMIName: b.config.AMIName,
Regions: b.config.AMIRegions,
}, },
&stepCreateAMI{}, &stepCreateAMI{},
&awscommon.StepCreateEncryptedAMICopy{ &awscommon.StepCreateEncryptedAMICopy{

View File

@ -195,9 +195,11 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
NewRootMountPoint: b.config.RootDevice.SourceDeviceName, NewRootMountPoint: b.config.RootDevice.SourceDeviceName,
}, },
&awscommon.StepDeregisterAMI{ &awscommon.StepDeregisterAMI{
AccessConfig: &b.config.AccessConfig,
ForceDeregister: b.config.AMIForceDeregister, ForceDeregister: b.config.AMIForceDeregister,
ForceDeleteSnapshot: b.config.AMIForceDeleteSnapshot, ForceDeleteSnapshot: b.config.AMIForceDeleteSnapshot,
AMIName: b.config.AMIName, AMIName: b.config.AMIName,
Regions: b.config.AMIRegions,
}, },
&StepRegisterAMI{ &StepRegisterAMI{
RootDevice: b.config.RootDevice, RootDevice: b.config.RootDevice,

View File

@ -258,9 +258,11 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
Debug: b.config.PackerDebug, Debug: b.config.PackerDebug,
}, },
&awscommon.StepDeregisterAMI{ &awscommon.StepDeregisterAMI{
AccessConfig: &b.config.AccessConfig,
ForceDeregister: b.config.AMIForceDeregister, ForceDeregister: b.config.AMIForceDeregister,
ForceDeleteSnapshot: b.config.AMIForceDeleteSnapshot, ForceDeleteSnapshot: b.config.AMIForceDeleteSnapshot,
AMIName: b.config.AMIName, AMIName: b.config.AMIName,
Regions: b.config.AMIRegions,
}, },
&StepRegisterAMI{}, &StepRegisterAMI{},
&awscommon.StepAMIRegionCopy{ &awscommon.StepAMIRegionCopy{