github.com/vmware/govmomi@v0.51.0/examples/examples.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 examples 6 7 import ( 8 "context" 9 "flag" 10 "fmt" 11 "log" 12 "net/url" 13 "os" 14 "strings" 15 16 "github.com/vmware/govmomi/session/cache" 17 "github.com/vmware/govmomi/simulator" 18 "github.com/vmware/govmomi/vim25" 19 "github.com/vmware/govmomi/vim25/soap" 20 ) 21 22 // getEnvString returns string from environment variable. 23 func getEnvString(v string, def string) string { 24 r := os.Getenv(v) 25 if r == "" { 26 return def 27 } 28 29 return r 30 } 31 32 // getEnvBool returns boolean from environment variable. 33 func getEnvBool(v string, def bool) bool { 34 r := os.Getenv(v) 35 if r == "" { 36 return def 37 } 38 39 switch strings.ToLower(r[0:1]) { 40 case "t", "y", "1": 41 return true 42 } 43 44 return false 45 } 46 47 const ( 48 envURL = "GOVMOMI_URL" 49 envUserName = "GOVMOMI_USERNAME" 50 envPassword = "GOVMOMI_PASSWORD" 51 envInsecure = "GOVMOMI_INSECURE" 52 ) 53 54 var urlDescription = fmt.Sprintf("ESX or vCenter URL [%s]", envURL) 55 var urlFlag = flag.String("url", getEnvString(envURL, ""), urlDescription) 56 57 var insecureDescription = fmt.Sprintf("Don't verify the server's certificate chain [%s]", envInsecure) 58 var insecureFlag = flag.Bool("insecure", getEnvBool(envInsecure, false), insecureDescription) 59 60 func processOverride(u *url.URL) { 61 envUsername := os.Getenv(envUserName) 62 envPassword := os.Getenv(envPassword) 63 64 // Override username if provided 65 if envUsername != "" { 66 var password string 67 var ok bool 68 69 if u.User != nil { 70 password, ok = u.User.Password() 71 } 72 73 if ok { 74 u.User = url.UserPassword(envUsername, password) 75 } else { 76 u.User = url.User(envUsername) 77 } 78 } 79 80 // Override password if provided 81 if envPassword != "" { 82 var username string 83 84 if u.User != nil { 85 username = u.User.Username() 86 } 87 88 u.User = url.UserPassword(username, envPassword) 89 } 90 } 91 92 // NewClient creates a vim25.Client for use in the examples 93 func NewClient(ctx context.Context) (*vim25.Client, error) { 94 // Parse URL from string 95 u, err := soap.ParseURL(*urlFlag) 96 if err != nil { 97 return nil, err 98 } 99 100 // Override username and/or password as required 101 processOverride(u) 102 103 // Share govc's session cache 104 s := &cache.Session{ 105 URL: u, 106 Insecure: *insecureFlag, 107 } 108 109 c := new(vim25.Client) 110 err = s.Login(ctx, c, nil) 111 if err != nil { 112 return nil, err 113 } 114 115 return c, nil 116 } 117 118 // Run calls f with Client create from the -url flag if provided, 119 // otherwise runs the example against vcsim. 120 func Run(f func(context.Context, *vim25.Client) error) { 121 flag.Parse() 122 123 var err error 124 var c *vim25.Client 125 126 if *urlFlag == "" { 127 err = simulator.VPX().Run(f) 128 } else { 129 ctx := context.Background() 130 c, err = NewClient(ctx) 131 if err == nil { 132 err = f(ctx, c) 133 } 134 } 135 if err != nil { 136 log.Fatal(err) 137 } 138 }