github.com/vmware/govmomi@v0.51.0/cli/device/usb/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 usb
     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 add struct {
    19  	*flags.VirtualMachineFlag
    20  
    21  	controller  string
    22  	autoConnect bool
    23  	ehciEnabled bool
    24  }
    25  
    26  func init() {
    27  	cli.Register("device.usb.add", &add{})
    28  }
    29  
    30  func (cmd *add) Register(ctx context.Context, f *flag.FlagSet) {
    31  	cmd.VirtualMachineFlag, ctx = flags.NewVirtualMachineFlag(ctx)
    32  	cmd.VirtualMachineFlag.Register(ctx, f)
    33  
    34  	ctypes := []string{"usb", "xhci"}
    35  	f.StringVar(&cmd.controller, "type", ctypes[0],
    36  		fmt.Sprintf("USB controller type (%s)", strings.Join(ctypes, "|")))
    37  
    38  	f.BoolVar(&cmd.autoConnect, "auto", true, "Enable ability to hot plug devices")
    39  	f.BoolVar(&cmd.ehciEnabled, "ehci", true, "Enable enhanced host controller interface (USB 2.0)")
    40  }
    41  
    42  func (cmd *add) Description() string {
    43  	return `Add USB device to VM.
    44  
    45  Examples:
    46    govc device.usb.add -vm $vm
    47    govc device.usb.add -type xhci -vm $vm
    48    govc device.info usb*`
    49  }
    50  
    51  func (cmd *add) Process(ctx context.Context) error {
    52  	if err := cmd.VirtualMachineFlag.Process(ctx); err != nil {
    53  		return err
    54  	}
    55  	return nil
    56  }
    57  
    58  func (cmd *add) Run(ctx context.Context, f *flag.FlagSet) error {
    59  	vm, err := cmd.VirtualMachine()
    60  	if err != nil {
    61  		return err
    62  	}
    63  
    64  	if vm == nil {
    65  		return flag.ErrHelp
    66  	}
    67  
    68  	var d types.BaseVirtualDevice
    69  
    70  	switch cmd.controller {
    71  	case "usb":
    72  		c := new(types.VirtualUSBController)
    73  		c.AutoConnectDevices = &cmd.autoConnect
    74  		c.EhciEnabled = &cmd.ehciEnabled
    75  		d = c
    76  	case "xhci":
    77  		c := new(types.VirtualUSBXHCIController)
    78  		c.AutoConnectDevices = &cmd.autoConnect
    79  		d = c
    80  	default:
    81  		return flag.ErrHelp
    82  	}
    83  
    84  	err = vm.AddDevice(ctx, d)
    85  	if err != nil {
    86  		return err
    87  	}
    88  
    89  	// output name of device we just created
    90  	devices, err := vm.Device(ctx)
    91  	if err != nil {
    92  		return err
    93  	}
    94  
    95  	devices = devices.SelectByType(d)
    96  
    97  	name := devices.Name(devices[len(devices)-1])
    98  
    99  	fmt.Println(name)
   100  
   101  	return nil
   102  }