github.com/vmware/govmomi@v0.51.0/cli/flags/virtual_machine.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 flags
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"fmt"
    11  	"os"
    12  
    13  	"github.com/vmware/govmomi/object"
    14  )
    15  
    16  type VirtualMachineFlag struct {
    17  	common
    18  
    19  	*ClientFlag
    20  	*DatacenterFlag
    21  	*SearchFlag
    22  
    23  	name string
    24  	vm   *object.VirtualMachine
    25  }
    26  
    27  var virtualMachineFlagKey = flagKey("virtualMachine")
    28  
    29  func NewVirtualMachineFlag(ctx context.Context) (*VirtualMachineFlag, context.Context) {
    30  	if v := ctx.Value(virtualMachineFlagKey); v != nil {
    31  		return v.(*VirtualMachineFlag), ctx
    32  	}
    33  
    34  	v := &VirtualMachineFlag{}
    35  	v.ClientFlag, ctx = NewClientFlag(ctx)
    36  	v.DatacenterFlag, ctx = NewDatacenterFlag(ctx)
    37  	v.SearchFlag, ctx = NewSearchFlag(ctx, SearchVirtualMachines)
    38  	ctx = context.WithValue(ctx, virtualMachineFlagKey, v)
    39  	return v, ctx
    40  }
    41  
    42  func (flag *VirtualMachineFlag) Register(ctx context.Context, f *flag.FlagSet) {
    43  	flag.RegisterOnce(func() {
    44  		flag.ClientFlag.Register(ctx, f)
    45  		flag.DatacenterFlag.Register(ctx, f)
    46  		flag.SearchFlag.Register(ctx, f)
    47  
    48  		env := "GOVC_VM"
    49  		value := os.Getenv(env)
    50  		usage := fmt.Sprintf("Virtual machine [%s]", env)
    51  		f.StringVar(&flag.name, "vm", value, usage)
    52  	})
    53  }
    54  
    55  func (flag *VirtualMachineFlag) Process(ctx context.Context) error {
    56  	return flag.ProcessOnce(func() error {
    57  		if err := flag.ClientFlag.Process(ctx); err != nil {
    58  			return err
    59  		}
    60  		if err := flag.DatacenterFlag.Process(ctx); err != nil {
    61  			return err
    62  		}
    63  		if err := flag.SearchFlag.Process(ctx); err != nil {
    64  			return err
    65  		}
    66  		return nil
    67  	})
    68  }
    69  
    70  func (flag *VirtualMachineFlag) VirtualMachine() (*object.VirtualMachine, error) {
    71  	ctx := context.TODO()
    72  
    73  	if flag.vm != nil {
    74  		return flag.vm, nil
    75  	}
    76  
    77  	// Use search flags if specified.
    78  	if flag.SearchFlag.IsSet() {
    79  		vm, err := flag.SearchFlag.VirtualMachine()
    80  		if err != nil {
    81  			return nil, err
    82  		}
    83  
    84  		flag.vm = vm
    85  		return flag.vm, nil
    86  	}
    87  
    88  	// Never look for a default virtual machine.
    89  	if flag.name == "" {
    90  		return nil, nil
    91  	}
    92  
    93  	finder, err := flag.Finder()
    94  	if err != nil {
    95  		return nil, err
    96  	}
    97  
    98  	flag.vm, err = finder.VirtualMachine(ctx, flag.name)
    99  	return flag.vm, err
   100  }