github.com/vmware/govmomi@v0.37.1/govc/vm/disk/attach.go (about) 1 /* 2 Copyright (c) 2014-2015 VMware, Inc. All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package disk 18 19 import ( 20 "context" 21 "flag" 22 "fmt" 23 "strings" 24 25 "github.com/vmware/govmomi/govc/cli" 26 "github.com/vmware/govmomi/govc/flags" 27 "github.com/vmware/govmomi/vim25/types" 28 ) 29 30 type attach struct { 31 *flags.DatastoreFlag 32 *flags.VirtualMachineFlag 33 34 persist bool 35 link bool 36 disk string 37 controller string 38 mode string 39 sharing string 40 } 41 42 func init() { 43 cli.Register("vm.disk.attach", &attach{}) 44 } 45 46 func (cmd *attach) Register(ctx context.Context, f *flag.FlagSet) { 47 cmd.DatastoreFlag, ctx = flags.NewDatastoreFlag(ctx) 48 cmd.DatastoreFlag.Register(ctx, f) 49 cmd.VirtualMachineFlag, ctx = flags.NewVirtualMachineFlag(ctx) 50 cmd.VirtualMachineFlag.Register(ctx, f) 51 52 f.BoolVar(&cmd.persist, "persist", true, "Persist attached disk") 53 f.BoolVar(&cmd.link, "link", true, "Link specified disk") 54 f.StringVar(&cmd.controller, "controller", "", "Disk controller") 55 f.StringVar(&cmd.disk, "disk", "", "Disk path name") 56 f.StringVar(&cmd.mode, "mode", "", fmt.Sprintf("Disk mode (%s)", strings.Join(vdmTypes, "|"))) 57 f.StringVar(&cmd.sharing, "sharing", "", fmt.Sprintf("Sharing (%s)", strings.Join(sharing, "|"))) 58 } 59 60 func (cmd *attach) Process(ctx context.Context) error { 61 if err := cmd.DatastoreFlag.Process(ctx); err != nil { 62 return err 63 } 64 if err := cmd.VirtualMachineFlag.Process(ctx); err != nil { 65 return err 66 } 67 return nil 68 } 69 70 func (cmd *attach) Description() string { 71 return `Attach existing disk to VM. 72 73 A delta disk is created by default, where changes are persisted. Specifying '-link=false' will persist to the same disk. 74 75 Examples: 76 govc vm.disk.attach -vm $name -disk $name/disk1.vmdk 77 govc device.info -vm $name disk-* # 'File' field is where changes are persisted. 'Parent' field is set when '-link=true' 78 govc vm.disk.attach -vm $name -disk $name/shared.vmdk -link=false -sharing sharingMultiWriter 79 govc device.remove -vm $name -keep disk-* # detach disk(s)` 80 } 81 82 func (cmd *attach) Run(ctx context.Context, f *flag.FlagSet) error { 83 vm, err := cmd.VirtualMachine() 84 if err != nil { 85 return err 86 } 87 88 if vm == nil { 89 return flag.ErrHelp 90 } 91 92 ds, err := cmd.Datastore() 93 if err != nil { 94 return err 95 } 96 97 devices, err := vm.Device(ctx) 98 if err != nil { 99 return err 100 } 101 102 controller, err := devices.FindDiskController(cmd.controller) 103 if err != nil { 104 return err 105 } 106 107 disk := devices.CreateDisk(controller, ds.Reference(), ds.Path(cmd.disk)) 108 backing := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo) 109 backing.Sharing = cmd.sharing 110 111 if cmd.link { 112 if cmd.persist { 113 backing.DiskMode = string(types.VirtualDiskModeIndependent_persistent) 114 } else { 115 backing.DiskMode = string(types.VirtualDiskModeIndependent_nonpersistent) 116 } 117 118 disk = devices.ChildDisk(disk) 119 return vm.AddDevice(ctx, disk) 120 } else { 121 if cmd.persist { 122 backing.DiskMode = string(types.VirtualDiskModePersistent) 123 } else { 124 backing.DiskMode = string(types.VirtualDiskModeNonpersistent) 125 } 126 } 127 128 if len(cmd.mode) != 0 { 129 backing.DiskMode = cmd.mode 130 } 131 132 return vm.AddDevice(ctx, disk) 133 }