From f2b42f2b4b7ae8e4d828fcf78c285f0a6782c381 Mon Sep 17 00:00:00 2001 From: josepand Date: Mon, 11 Mar 2019 18:39:47 +0000 Subject: [PATCH] Expose force_delete for openstack builder Very similar to how its exposed in terraform adds an optional force_delete config entry on the openstack builder. --- builder/openstack/builder.go | 1 + builder/openstack/run_config.go | 1 + builder/openstack/step_run_source_server.go | 14 +++++++++++--- website/source/docs/builders/openstack.html.md | 4 ++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/builder/openstack/builder.go b/builder/openstack/builder.go index 23f2448f1..e7953990c 100644 --- a/builder/openstack/builder.go +++ b/builder/openstack/builder.go @@ -115,6 +115,7 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ConfigDrive: b.config.ConfigDrive, InstanceMetadata: b.config.InstanceMetadata, UseBlockStorageVolume: b.config.UseBlockStorageVolume, + ForceDelete: b.config.ForceDelete, }, &StepGetPassword{ Debug: b.config.PackerDebug, diff --git a/builder/openstack/run_config.go b/builder/openstack/run_config.go index 5a2efd023..9077a5e7d 100644 --- a/builder/openstack/run_config.go +++ b/builder/openstack/run_config.go @@ -31,6 +31,7 @@ type RunConfig struct { UserDataFile string `mapstructure:"user_data_file"` InstanceName string `mapstructure:"instance_name"` InstanceMetadata map[string]string `mapstructure:"instance_metadata"` + ForceDelete bool `mapstructure:"force_delete"` ConfigDrive bool `mapstructure:"config_drive"` diff --git a/builder/openstack/step_run_source_server.go b/builder/openstack/step_run_source_server.go index fdcfbc080..00c5420a0 100644 --- a/builder/openstack/step_run_source_server.go +++ b/builder/openstack/step_run_source_server.go @@ -24,6 +24,7 @@ type StepRunSourceServer struct { ConfigDrive bool InstanceMetadata map[string]string UseBlockStorageVolume bool + ForceDelete bool server *servers.Server } @@ -157,9 +158,16 @@ func (s *StepRunSourceServer) Cleanup(state multistep.StateBag) { } ui.Say(fmt.Sprintf("Terminating the source server: %s ...", s.server.ID)) - if err := servers.Delete(computeClient, s.server.ID).ExtractErr(); err != nil { - ui.Error(fmt.Sprintf("Error terminating server, may still be around: %s", err)) - return + if config.ForceDelete { + if err := servers.ForceDelete(computeClient, s.server.ID).ExtractErr(); err != nil { + ui.Error(fmt.Sprintf("Error terminating server, may still be around: %s", err)) + return + } + } else { + if err := servers.Delete(computeClient, s.server.ID).ExtractErr(); err != nil { + ui.Error(fmt.Sprintf("Error terminating server, may still be around: %s", err)) + return + } } stateChange := StateChangeConf{ diff --git a/website/source/docs/builders/openstack.html.md b/website/source/docs/builders/openstack.html.md index 17bffb820..58f2e8433 100644 --- a/website/source/docs/builders/openstack.html.md +++ b/website/source/docs/builders/openstack.html.md @@ -136,6 +136,10 @@ builder. - `floating_ip_pool` (string) - *Deprecated* use `floating_ip_network` instead. +- `force_delete` (boolean) - Whether to force the OpenStack instance to be + forcefully deleted. This is useful for environments that have + reclaim / soft deletion enabled. By default this is false. + - `image_members` (array of strings) - List of members to add to the image after creation. An image member is usually a project (also called the "tenant") with whom the image is shared.