github.com/vmware/govmomi@v0.51.0/cli/device/scsi/add.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 scsi 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/object" 16 "github.com/vmware/govmomi/vim25/types" 17 ) 18 19 type add struct { 20 *flags.VirtualMachineFlag 21 22 controller string 23 sharedBus string 24 hotAddRemove bool 25 } 26 27 func init() { 28 cli.Register("device.scsi.add", &add{}) 29 } 30 31 func (cmd *add) Register(ctx context.Context, f *flag.FlagSet) { 32 cmd.VirtualMachineFlag, ctx = flags.NewVirtualMachineFlag(ctx) 33 cmd.VirtualMachineFlag.Register(ctx, f) 34 35 var ctypes []string 36 ct := object.SCSIControllerTypes() 37 for _, t := range ct { 38 ctypes = append(ctypes, ct.Type(t)) 39 } 40 f.StringVar(&cmd.controller, "type", ct.Type(ct[0]), 41 fmt.Sprintf("SCSI controller type (%s)", strings.Join(ctypes, "|"))) 42 f.StringVar(&cmd.sharedBus, "sharing", string(types.VirtualSCSISharingNoSharing), "SCSI sharing") 43 f.BoolVar(&cmd.hotAddRemove, "hot", false, "Enable hot-add/remove") 44 } 45 46 func (cmd *add) Description() string { 47 return `Add SCSI controller to VM. 48 49 Examples: 50 govc device.scsi.add -vm $vm 51 govc device.scsi.add -vm $vm -type pvscsi 52 govc device.info -vm $vm {lsi,pv}*` 53 } 54 55 func (cmd *add) Process(ctx context.Context) error { 56 if err := cmd.VirtualMachineFlag.Process(ctx); err != nil { 57 return err 58 } 59 return nil 60 } 61 62 func (cmd *add) Run(ctx context.Context, f *flag.FlagSet) error { 63 vm, err := cmd.VirtualMachine() 64 if err != nil { 65 return err 66 } 67 68 if vm == nil { 69 return flag.ErrHelp 70 } 71 72 devices, err := vm.Device(ctx) 73 if err != nil { 74 return err 75 } 76 77 d, err := devices.CreateSCSIController(cmd.controller) 78 if err != nil { 79 return err 80 } 81 82 c := d.(types.BaseVirtualSCSIController).GetVirtualSCSIController() 83 c.HotAddRemove = &cmd.hotAddRemove 84 c.SharedBus = types.VirtualSCSISharing(cmd.sharedBus) 85 86 err = vm.AddDevice(ctx, d) 87 if err != nil { 88 return err 89 } 90 91 // output name of device we just created 92 devices, err = vm.Device(ctx) 93 if err != nil { 94 return err 95 } 96 97 devices = devices.SelectByType(d) 98 99 name := devices.Name(devices[len(devices)-1]) 100 101 fmt.Println(name) 102 103 return nil 104 }