diff --git a/builder/nutanix/builder.go b/builder/nutanix/builder.go index d3663a8..4b228d7 100644 --- a/builder/nutanix/builder.go +++ b/builder/nutanix/builder.go @@ -72,9 +72,6 @@ func (b *Builder) Run(ctx context.Context, ui packersdk.Ui, hook packersdk.Hook) &stepCopyImage{ Config: &b.config, }, - &stepDestroyVM{ - Config: &b.config, - }, } b.runner = &multistep.BasicRunner{Steps: steps} diff --git a/builder/nutanix/step_build_vm.go b/builder/nutanix/step_build_vm.go index 085b047..5e125ea 100644 --- a/builder/nutanix/step_build_vm.go +++ b/builder/nutanix/step_build_vm.go @@ -32,8 +32,8 @@ func (s *stepBuildVM) Run(ctx context.Context, state multistep.StateBag) multist state.Put("error", err) return multistep.ActionHalt } - ui.Say("CD disk uploaded") - state.Put("imageUUID", *cdfilesImage.image.Metadata.UUID) + ui.Message("CD disk uploaded " + *cdfilesImage.image.Metadata.Name) + state.Put("cd_uuid", *cdfilesImage.image.Metadata.UUID) temp_cd := VmDisk{ ImageType: "ISO_IMAGE", SourceImageUUID: *cdfilesImage.image.Metadata.UUID, @@ -59,10 +59,11 @@ func (s *stepBuildVM) Run(ctx context.Context, state multistep.StateBag) multist return multistep.ActionHalt } - ui.Message(fmt.Sprintf("virtual machine %s created", config.VMName)) + ui.Message(fmt.Sprintf("Virtual machine %s created", config.VMName)) log.Printf("Nutanix VM UUID: %s", *vmInstance.nutanix.Metadata.UUID) - state.Put("vmUUID", *vmInstance.nutanix.Metadata.UUID) + state.Put("vm_uuid", *vmInstance.nutanix.Metadata.UUID) state.Put("ip", vmInstance.Addresses()[0]) + state.Put("destroy_vm", true) ui.Message("Found IP for virtual machine: " + vmInstance.Addresses()[0]) return multistep.ActionContinue @@ -70,18 +71,40 @@ func (s *stepBuildVM) Run(ctx context.Context, state multistep.StateBag) multist // Cleanup will tear down the VM once the build is complete func (s *stepBuildVM) Cleanup(state multistep.StateBag) { - _, cancelled := state.GetOk(multistep.StateCancelled) - _, halted := state.GetOk(multistep.StateHalted) - if !cancelled && !halted { + vmUUID := state.Get("vm_uuid") + if vmUUID == nil { return } + _, cancelled := state.GetOk(multistep.StateCancelled) + _, halted := state.GetOk(multistep.StateHalted) + + d := state.Get("driver").(Driver) ui := state.Get("ui").(packer.Ui) - if vmUUID, ok := state.GetOk("vmUUID"); ok { - if vmUUID != "" { - ui.Say("Cleaning up Nutanix VM.") + if cancelled || halted { + ui.Say("Task cancelled, virtual machine is not deleted") + return + } + + ui.Say("Deleting virtual machine...") + if cdUUID, ok := state.GetOk("cd_uuid"); ok { + err := d.DeleteImage(cdUUID.(string)) + if err != nil { + ui.Error("An error occurred while deleting CD disk") + return + } else { + ui.Message("CD disk successfully deleted") } } + + err := d.Delete(vmUUID.(string)) + if err != nil { + ui.Error("An error occurred while deleting the Virtual machine") + return + } else { + ui.Message("Virtual machine successfully deleted") + } + } diff --git a/builder/nutanix/step_copy_image.go b/builder/nutanix/step_copy_image.go index 6e2f0f0..afc3414 100644 --- a/builder/nutanix/step_copy_image.go +++ b/builder/nutanix/step_copy_image.go @@ -15,7 +15,7 @@ type stepCopyImage struct { func (s *stepCopyImage) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction { ui := state.Get("ui").(packer.Ui) - vmUUID := state.Get("vmUUID").(string) + vmUUID := state.Get("vm_uuid").(string) d := state.Get("driver").(Driver) vm, _ := d.GetVM(vmUUID) diff --git a/builder/nutanix/step_destroy_vm.go b/builder/nutanix/step_destroy_vm.go deleted file mode 100644 index b8d86cd..0000000 --- a/builder/nutanix/step_destroy_vm.go +++ /dev/null @@ -1,40 +0,0 @@ -package nutanix - -import ( - "context" - - "github.com/hashicorp/packer-plugin-sdk/multistep" - "github.com/hashicorp/packer-plugin-sdk/packer" -) - -type stepDestroyVM struct { - Config *Config -} - -func (s *stepDestroyVM) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction { - ui := state.Get("ui").(packer.Ui) - vmUUID := state.Get("vmUUID").(string) - d := state.Get("driver").(Driver) - - if imageUUID, ok := state.GetOk("imageUUID"); ok { - err := d.DeleteImage(imageUUID.(string)) - if err != nil { - ui.Error("An error occurred while deleting CD disk") - return multistep.ActionHalt - } else { - ui.Say("CD disk successfully deleted.") - } - } - - err := d.Delete(vmUUID) - if err != nil { - ui.Error("An error occurred while deleting the VM.") - return multistep.ActionHalt - } else { - ui.Say("Nutanix VM successfully deleted.") - } - return multistep.ActionContinue -} - -func (s *stepDestroyVM) Cleanup(state multistep.StateBag) { -} diff --git a/builder/nutanix/step_shutdown_vm.go b/builder/nutanix/step_shutdown_vm.go index 7d4f267..a6204d6 100644 --- a/builder/nutanix/step_shutdown_vm.go +++ b/builder/nutanix/step_shutdown_vm.go @@ -34,7 +34,7 @@ func (s *StepShutdown) Run(ctx context.Context, state multistep.StateBag) multis driver := state.Get("driver").(Driver) ui := state.Get("ui").(packersdk.Ui) config := state.Get("config").(*Config) - vmUUID := state.Get("vmUUID").(string) + vmUUID := state.Get("vm_uuid").(string) if config.CommConfig.Type == "none" { ui.Say("No Communicator configured, halting the virtual machine...")