github.com/vmware/govmomi@v0.51.0/cli/vm/disk/attach.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 disk 6 7 import ( 8 "context" 9 "flag" 10 "fmt" 11 "strings" 12 13 "github.com/vmware/govmomi/cli" 14 "github.com/vmware/govmomi/cli/flags" 15 "github.com/vmware/govmomi/vim25/types" 16 ) 17 18 type attach struct { 19 *flags.DatastoreFlag 20 *flags.VirtualMachineFlag 21 *flags.StorageProfileFlag 22 23 persist bool 24 link bool 25 disk string 26 controller string 27 mode string 28 sharing string 29 } 30 31 func init() { 32 cli.Register("vm.disk.attach", &attach{}) 33 } 34 35 func (cmd *attach) Register(ctx context.Context, f *flag.FlagSet) { 36 cmd.DatastoreFlag, ctx = flags.NewDatastoreFlag(ctx) 37 cmd.DatastoreFlag.Register(ctx, f) 38 cmd.VirtualMachineFlag, ctx = flags.NewVirtualMachineFlag(ctx) 39 cmd.VirtualMachineFlag.Register(ctx, f) 40 cmd.StorageProfileFlag, ctx = flags.NewStorageProfileFlag(ctx) 41 cmd.StorageProfileFlag.Register(ctx, f) 42 43 f.BoolVar(&cmd.persist, "persist", true, "Persist attached disk") 44 f.BoolVar(&cmd.link, "link", true, "Link specified disk") 45 f.StringVar(&cmd.controller, "controller", "", "Disk controller") 46 f.StringVar(&cmd.disk, "disk", "", "Disk path name") 47 f.StringVar(&cmd.mode, "mode", "", fmt.Sprintf("Disk mode (%s)", strings.Join(vdmTypes, "|"))) 48 f.StringVar(&cmd.sharing, "sharing", "", fmt.Sprintf("Sharing (%s)", strings.Join(sharing, "|"))) 49 } 50 51 func (cmd *attach) Process(ctx context.Context) error { 52 if err := cmd.DatastoreFlag.Process(ctx); err != nil { 53 return err 54 } 55 if err := cmd.VirtualMachineFlag.Process(ctx); err != nil { 56 return err 57 } 58 if err := cmd.StorageProfileFlag.Process(ctx); err != nil { 59 return err 60 } 61 return nil 62 } 63 64 func (cmd *attach) Description() string { 65 return `Attach existing disk to VM. 66 67 A delta disk is created by default, where changes are persisted. Specifying '-link=false' will persist to the same disk. 68 69 Examples: 70 govc vm.disk.attach -vm $name -disk $name/disk1.vmdk 71 govc device.info -vm $name disk-* # 'File' field is where changes are persisted. 'Parent' field is set when '-link=true' 72 govc vm.disk.attach -vm $name -disk $name/shared.vmdk -link=false -sharing sharingMultiWriter 73 govc device.remove -vm $name -keep disk-* # detach disk(s)` 74 } 75 76 func (cmd *attach) Run(ctx context.Context, f *flag.FlagSet) error { 77 vm, err := cmd.VirtualMachine() 78 if err != nil { 79 return err 80 } 81 82 if vm == nil { 83 return flag.ErrHelp 84 } 85 86 ds, err := cmd.Datastore() 87 if err != nil { 88 return err 89 } 90 91 devices, err := vm.Device(ctx) 92 if err != nil { 93 return err 94 } 95 96 controller, err := devices.FindDiskController(cmd.controller) 97 if err != nil { 98 return err 99 } 100 101 disk := devices.CreateDisk(controller, ds.Reference(), ds.Path(cmd.disk)) 102 backing := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo) 103 backing.Sharing = cmd.sharing 104 105 if cmd.link { 106 if cmd.persist { 107 backing.DiskMode = string(types.VirtualDiskModeIndependent_persistent) 108 } else { 109 backing.DiskMode = string(types.VirtualDiskModeIndependent_nonpersistent) 110 } 111 112 disk = devices.ChildDisk(disk) 113 return vm.AddDevice(ctx, disk) 114 } else { 115 if cmd.persist { 116 backing.DiskMode = string(types.VirtualDiskModePersistent) 117 } else { 118 backing.DiskMode = string(types.VirtualDiskModeNonpersistent) 119 } 120 } 121 122 if len(cmd.mode) != 0 { 123 backing.DiskMode = cmd.mode 124 } 125 126 profile, err := cmd.StorageProfileSpec(ctx) 127 if err != nil { 128 return err 129 } 130 131 return vm.AddDeviceWithProfile(ctx, profile, disk) 132 }