From 9c63f4cd92c91993db32172f5e1790bb8ae055a0 Mon Sep 17 00:00:00 2001 From: Marin Salinas Date: Mon, 4 Feb 2019 16:03:59 -0600 Subject: [PATCH] feature: bsusurrogate, add DeregisterOMI step --- builder/osc/bsusurrogate/builder.go | 7 ++ builder/osc/common/step_deregister_omi.go | 110 ++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 builder/osc/common/step_deregister_omi.go diff --git a/builder/osc/bsusurrogate/builder.go b/builder/osc/bsusurrogate/builder.go index 0ab42f9a5..f97fc08f8 100644 --- a/builder/osc/bsusurrogate/builder.go +++ b/builder/osc/bsusurrogate/builder.go @@ -215,6 +215,13 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe &StepSnapshotVolumes{ LaunchDevices: launchDevices, }, + &osccommon.StepDeregisterOMI{ + AccessConfig: &b.config.AccessConfig, + ForceDeregister: b.config.OMIForceDeregister, + ForceDeleteSnapshot: b.config.OMIForceDeleteSnapshot, + OMIName: b.config.OMIName, + Regions: b.config.OMIRegions, + }, } b.runner = common.NewRunner(steps, b.config.PackerConfig, ui) diff --git a/builder/osc/common/step_deregister_omi.go b/builder/osc/common/step_deregister_omi.go new file mode 100644 index 000000000..4d735ac3d --- /dev/null +++ b/builder/osc/common/step_deregister_omi.go @@ -0,0 +1,110 @@ +package common + +import ( + "context" + "crypto/tls" + "fmt" + "net/http" + + "github.com/hashicorp/packer/helper/multistep" + "github.com/hashicorp/packer/packer" + "github.com/outscale/osc-go/oapi" +) + +type StepDeregisterOMI struct { + AccessConfig *AccessConfig + ForceDeregister bool + ForceDeleteSnapshot bool + OMIName string + Regions []string +} + +func (s *StepDeregisterOMI) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { + // Check for force deregister + if !s.ForceDeregister { + return multistep.ActionContinue + } + + ui := state.Get("ui").(packer.Ui) + oapiconn := state.Get("oapi").(*oapi.Client) + // Add the session region to list of regions will will deregister OMIs in + regions := append(s.Regions, oapiconn.GetConfig().Region) + + for _, region := range regions { + // get new connection for each region in which we need to deregister vms + config, err := s.AccessConfig.Config() + if err != nil { + return multistep.ActionHalt + } + + newConfig := &oapi.Config{ + UserAgent: config.UserAgent, + SecretKey: config.SecretKey, + Service: config.Service, + Region: region, //New region + URL: config.URL, + } + + skipClient := &http.Client{ + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + }, + } + + regionconn := oapi.NewClient(newConfig, skipClient) + + resp, err := regionconn.POST_ReadImages(oapi.ReadImagesRequest{ + Filters: oapi.FiltersImage{ + ImageNames: []string{s.OMIName}, + AccountAliases: []string{"self"}, + }, + }) + + if err != nil { + err := fmt.Errorf("Error describing OMI: %s", err) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } + + // Deregister image(s) by name + for _, i := range resp.OK.Images { + //We are supposing that DeleteImage does the same action as DeregisterImage + _, err := regionconn.POST_DeleteImage(oapi.DeleteImageRequest{ + ImageId: i.ImageId, + }) + + if err != nil { + err := fmt.Errorf("Error deregistering existing OMI: %s", err) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } + ui.Say(fmt.Sprintf("Deregistered OMI %s, id: %s", s.OMIName, i.ImageId)) + + // Delete snapshot(s) by image + if s.ForceDeleteSnapshot { + for _, b := range i.BlockDeviceMappings { + if b.Bsu.SnapshotId != "" { + _, err := regionconn.POST_DeleteSnapshot(oapi.DeleteSnapshotRequest{ + SnapshotId: b.Bsu.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.Bsu.SnapshotId)) + } + } + } + } + } + + return multistep.ActionContinue +} + +func (s *StepDeregisterOMI) Cleanup(state multistep.StateBag) { +}