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  }