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 }