From f7de056f234b510de3740775898f17a7dc3dddee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C5=82osz=20Sm=C3=B3=C5=82ka?= Date: Sun, 3 Feb 2019 00:24:06 +0100 Subject: [PATCH] Add proper cleanup of chroot disk Closes #3 --- builder/hyperone/step_create_vm.go | 32 ++++++++++++-------- builder/hyperone/step_create_vm_from_disk.go | 13 ++------ 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/builder/hyperone/step_create_vm.go b/builder/hyperone/step_create_vm.go index 962b78543..b156a6157 100644 --- a/builder/hyperone/step_create_vm.go +++ b/builder/hyperone/step_create_vm.go @@ -75,17 +75,13 @@ func (s *stepCreateVM) Run(ctx context.Context, state multistep.StateBag) multis return multistep.ActionHalt } - var diskIDs []string for _, hdd := range hdds { if hdd.Disk.Name == chrootDiskName { state.Put("chroot_disk_id", hdd.Disk.Id) - } else { - diskIDs = append(diskIDs, hdd.Disk.Id) + break } } - state.Put("disk_ids", diskIDs) - netadp, _, err := client.VmApi.VmListNetadp(ctx, vm.Id) if err != nil { err := fmt.Errorf("error listing netadp: %s", formatOpenAPIError(err)) @@ -169,19 +165,31 @@ func (s *stepCreateVM) Cleanup(state multistep.StateBag) { return } - client := state.Get("client").(*openapi.APIClient) ui := state.Get("ui").(packer.Ui) - ui.Say("Deleting VM...") + ui.Say(fmt.Sprintf("Deleting VM %s...", s.vmID)) + err := deleteVMWithDisks(s.vmID, state) + if err != nil { + ui.Error(err.Error()) + } +} + +func deleteVMWithDisks(vmID string, state multistep.StateBag) error { + client := state.Get("client").(*openapi.APIClient) + hdds, _, err := client.VmApi.VmListHdd(context.TODO(), vmID) + if err != nil { + return fmt.Errorf("error listing hdd: %s", formatOpenAPIError(err)) + } deleteOptions := openapi.VmDelete{} - diskIDs, ok := state.Get("disk_ids").([]string) - if ok && len(diskIDs) > 0 { - deleteOptions.RemoveDisks = diskIDs + for _, hdd := range hdds { + deleteOptions.RemoveDisks = append(deleteOptions.RemoveDisks, hdd.Disk.Id) } - _, err := client.VmApi.VmDelete(context.TODO(), s.vmID, deleteOptions) + _, err = client.VmApi.VmDelete(context.TODO(), vmID, deleteOptions) if err != nil { - ui.Error(fmt.Sprintf("Error deleting server '%s' - please delete it manually: %s", s.vmID, formatOpenAPIError(err))) + return fmt.Errorf("Error deleting server '%s' - please delete it manually: %s", vmID, formatOpenAPIError(err)) } + + return nil } diff --git a/builder/hyperone/step_create_vm_from_disk.go b/builder/hyperone/step_create_vm_from_disk.go index abc2b87dc..068ed2864 100644 --- a/builder/hyperone/step_create_vm_from_disk.go +++ b/builder/hyperone/step_create_vm_from_disk.go @@ -53,18 +53,11 @@ func (s *stepCreateVMFromDisk) Cleanup(state multistep.StateBag) { return } - client := state.Get("client").(*openapi.APIClient) ui := state.Get("ui").(packer.Ui) - chrootDiskID := state.Get("chroot_disk_id").(string) - - ui.Say("Deleting VM (from disk)...") - deleteOptions := openapi.VmDelete{ - RemoveDisks: []string{chrootDiskID}, - } - - _, err := client.VmApi.VmDelete(context.TODO(), s.vmID, deleteOptions) + ui.Say(fmt.Sprintf("Deleting VM %s (from chroot disk)...", s.vmID)) + err := deleteVMWithDisks(s.vmID, state) if err != nil { - ui.Error(fmt.Sprintf("Error deleting server '%s' - please delete it manually: %s", s.vmID, formatOpenAPIError(err))) + ui.Error(err.Error()) } }