github.com/vmware/govmomi@v0.51.0/cli/vm/destroy.go (about) 1 // © Broadcom. All Rights Reserved. 2 // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. 3 // SPDX-License-Identifier: Apache-2.0 4 5 package vm 6 7 import ( 8 "context" 9 "flag" 10 11 "github.com/vmware/govmomi/cli" 12 "github.com/vmware/govmomi/cli/flags" 13 "github.com/vmware/govmomi/object" 14 "github.com/vmware/govmomi/vim25/types" 15 ) 16 17 type destroy struct { 18 *flags.ClientFlag 19 *flags.SearchFlag 20 } 21 22 func init() { 23 cli.Register("vm.destroy", &destroy{}) 24 } 25 26 func (cmd *destroy) Register(ctx context.Context, f *flag.FlagSet) { 27 cmd.ClientFlag, ctx = flags.NewClientFlag(ctx) 28 cmd.ClientFlag.Register(ctx, f) 29 30 cmd.SearchFlag, ctx = flags.NewSearchFlag(ctx, flags.SearchVirtualMachines) 31 cmd.SearchFlag.Register(ctx, f) 32 } 33 34 func (cmd *destroy) Process(ctx context.Context) error { 35 if err := cmd.ClientFlag.Process(ctx); err != nil { 36 return err 37 } 38 if err := cmd.SearchFlag.Process(ctx); err != nil { 39 return err 40 } 41 return nil 42 } 43 44 func (cmd *destroy) Usage() string { 45 return "VM..." 46 } 47 48 func (cmd *destroy) Description() string { 49 return `Power off and delete VM. 50 51 When a VM is destroyed, any attached virtual disks are also deleted. 52 Use the 'device.remove -vm VM -keep disk-*' command to detach and 53 keep disks if needed, prior to calling vm.destroy. 54 55 Examples: 56 govc vm.destroy my-vm` 57 } 58 59 func (cmd *destroy) Run(ctx context.Context, f *flag.FlagSet) error { 60 vms, err := cmd.VirtualMachines(f.Args()) 61 if err != nil { 62 return err 63 } 64 65 for _, vm := range vms { 66 var ( 67 task *object.Task 68 state types.VirtualMachinePowerState 69 ) 70 71 state, err = vm.PowerState(ctx) 72 if err != nil { 73 return err 74 } 75 76 if state == types.VirtualMachinePowerStatePoweredOn { 77 task, err = vm.PowerOff(ctx) 78 if err != nil { 79 return err 80 } 81 82 // Ignore error since the VM may already been in powered off state. 83 // vm.Destroy will fail if the VM is still powered on. 84 _ = task.Wait(ctx) 85 } 86 87 task, err = vm.Destroy(ctx) 88 if err != nil { 89 return err 90 } 91 92 if err = task.Wait(ctx); err != nil { 93 return err 94 } 95 } 96 97 return nil 98 }