github.com/vmware/govmomi@v0.51.0/cli/flags/host_system.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 HostSystemFlag struct { 17 common 18 19 *ClientFlag 20 *DatacenterFlag 21 *SearchFlag 22 23 name string 24 host *object.HostSystem 25 pool *object.ResourcePool 26 } 27 28 var hostSystemFlagKey = flagKey("hostSystem") 29 30 func NewHostSystemFlag(ctx context.Context) (*HostSystemFlag, context.Context) { 31 if v := ctx.Value(hostSystemFlagKey); v != nil { 32 return v.(*HostSystemFlag), ctx 33 } 34 35 v := &HostSystemFlag{} 36 v.ClientFlag, ctx = NewClientFlag(ctx) 37 v.DatacenterFlag, ctx = NewDatacenterFlag(ctx) 38 v.SearchFlag, ctx = NewSearchFlag(ctx, SearchHosts) 39 ctx = context.WithValue(ctx, hostSystemFlagKey, v) 40 return v, ctx 41 } 42 43 func (flag *HostSystemFlag) Register(ctx context.Context, f *flag.FlagSet) { 44 flag.RegisterOnce(func() { 45 flag.ClientFlag.Register(ctx, f) 46 flag.DatacenterFlag.Register(ctx, f) 47 flag.SearchFlag.Register(ctx, f) 48 49 env := "GOVC_HOST" 50 value := os.Getenv(env) 51 usage := fmt.Sprintf("Host system [%s]", env) 52 f.StringVar(&flag.name, "host", value, usage) 53 }) 54 } 55 56 func (flag *HostSystemFlag) Process(ctx context.Context) error { 57 return flag.ProcessOnce(func() error { 58 if err := flag.ClientFlag.Process(ctx); err != nil { 59 return err 60 } 61 if err := flag.DatacenterFlag.Process(ctx); err != nil { 62 return err 63 } 64 if err := flag.SearchFlag.Process(ctx); err != nil { 65 return err 66 } 67 return nil 68 }) 69 } 70 71 func (flag *HostSystemFlag) HostSystemIfSpecified() (*object.HostSystem, error) { 72 if flag.host != nil { 73 return flag.host, nil 74 } 75 76 // Use search flags if specified. 77 if flag.SearchFlag.IsSet() && flag.SearchFlag.t == SearchHosts { 78 host, err := flag.SearchFlag.HostSystem() 79 if err != nil { 80 return nil, err 81 } 82 83 flag.host = host 84 return flag.host, nil 85 } 86 87 // Never look for a default host system. 88 // A host system parameter is optional for vm creation. It uses a mandatory 89 // resource pool parameter to determine where the vm should be placed. 90 if flag.name == "" { 91 return nil, nil 92 } 93 94 finder, err := flag.Finder() 95 if err != nil { 96 return nil, err 97 } 98 99 flag.host, err = finder.HostSystem(context.TODO(), flag.name) 100 return flag.host, err 101 } 102 103 func (flag *HostSystemFlag) HostSystem() (*object.HostSystem, error) { 104 host, err := flag.HostSystemIfSpecified() 105 if err != nil { 106 return nil, err 107 } 108 109 if host != nil { 110 return host, nil 111 } 112 113 finder, err := flag.Finder() 114 if err != nil { 115 return nil, err 116 } 117 118 flag.host, err = finder.DefaultHostSystem(context.TODO()) 119 return flag.host, err 120 } 121 122 func (flag *HostSystemFlag) HostNetworkSystem() (*object.HostNetworkSystem, error) { 123 host, err := flag.HostSystem() 124 if err != nil { 125 return nil, err 126 } 127 128 return host.ConfigManager().NetworkSystem(context.TODO()) 129 }