github.com/vmware/govmomi@v0.51.0/cli/vm/network/change.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 network
     6  
     7  import (
     8  	"context"
     9  	"errors"
    10  	"flag"
    11  	"fmt"
    12  
    13  	"github.com/vmware/govmomi/cli"
    14  	"github.com/vmware/govmomi/cli/flags"
    15  )
    16  
    17  type change struct {
    18  	*flags.VirtualMachineFlag
    19  	*flags.NetworkFlag
    20  }
    21  
    22  func init() {
    23  	cli.Register("vm.network.change", &change{})
    24  }
    25  
    26  func (cmd *change) Register(ctx context.Context, f *flag.FlagSet) {
    27  	cmd.VirtualMachineFlag, ctx = flags.NewVirtualMachineFlag(ctx)
    28  	cmd.VirtualMachineFlag.Register(ctx, f)
    29  	cmd.NetworkFlag, ctx = flags.NewNetworkFlag(ctx)
    30  	cmd.NetworkFlag.Register(ctx, f)
    31  }
    32  
    33  func (cmd *change) Process(ctx context.Context) error {
    34  	if err := cmd.VirtualMachineFlag.Process(ctx); err != nil {
    35  		return err
    36  	}
    37  	if err := cmd.NetworkFlag.Process(ctx); err != nil {
    38  		return err
    39  	}
    40  	return nil
    41  }
    42  
    43  func (cmd *change) Usage() string {
    44  	return "DEVICE"
    45  }
    46  
    47  func (cmd *change) Description() string {
    48  	return `Change network DEVICE configuration.
    49  
    50  Note that '-net' is currently required with '-net.address', even when not changing the VM network.
    51  
    52  Examples:
    53    govc vm.network.change -vm $vm -net PG2 ethernet-0
    54    govc vm.network.change -vm $vm -net PG2 -net.address 00:00:0f:2e:5d:69 ethernet-0 # set to manual MAC address
    55    govc vm.network.change -vm $vm -net PG2 -net.address - ethernet-0 # set to generated MAC address
    56    govc device.info -vm $vm ethernet-*`
    57  }
    58  
    59  func (cmd *change) Run(ctx context.Context, f *flag.FlagSet) error {
    60  	vm, err := cmd.VirtualMachineFlag.VirtualMachine()
    61  	if err != nil {
    62  		return err
    63  	}
    64  
    65  	if vm == nil {
    66  		return errors.New("please specify a vm")
    67  	}
    68  
    69  	name := f.Arg(0)
    70  
    71  	if name == "" {
    72  		return errors.New("please specify a device name")
    73  	}
    74  
    75  	// Set network if specified as extra argument.
    76  	if f.NArg() > 1 {
    77  		err = cmd.NetworkFlag.Set(f.Arg(1))
    78  		if err != nil {
    79  			return fmt.Errorf("couldn't set specified network %v",
    80  				err)
    81  		}
    82  	}
    83  
    84  	devices, err := vm.Device(ctx)
    85  	if err != nil {
    86  		return err
    87  	}
    88  
    89  	net := devices.Find(name)
    90  
    91  	if net == nil {
    92  		return fmt.Errorf("device '%s' not found", name)
    93  	}
    94  
    95  	dev, err := cmd.NetworkFlag.Device()
    96  	if err != nil {
    97  		return err
    98  	}
    99  
   100  	cmd.NetworkFlag.Change(net, dev)
   101  
   102  	return vm.EditDevice(ctx, net)
   103  }