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