github.com/vmware/govmomi@v0.37.1/examples/examples.go (about) 1 /* 2 Copyright (c) 2017 VMware, Inc. All Rights Reserved. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package examples 18 19 import ( 20 "context" 21 "flag" 22 "fmt" 23 "log" 24 "net/url" 25 "os" 26 "strings" 27 28 "github.com/vmware/govmomi/session/cache" 29 "github.com/vmware/govmomi/simulator" 30 "github.com/vmware/govmomi/vim25" 31 "github.com/vmware/govmomi/vim25/soap" 32 ) 33 34 // getEnvString returns string from environment variable. 35 func getEnvString(v string, def string) string { 36 r := os.Getenv(v) 37 if r == "" { 38 return def 39 } 40 41 return r 42 } 43 44 // getEnvBool returns boolean from environment variable. 45 func getEnvBool(v string, def bool) bool { 46 r := os.Getenv(v) 47 if r == "" { 48 return def 49 } 50 51 switch strings.ToLower(r[0:1]) { 52 case "t", "y", "1": 53 return true 54 } 55 56 return false 57 } 58 59 const ( 60 envURL = "GOVMOMI_URL" 61 envUserName = "GOVMOMI_USERNAME" 62 envPassword = "GOVMOMI_PASSWORD" 63 envInsecure = "GOVMOMI_INSECURE" 64 ) 65 66 var urlDescription = fmt.Sprintf("ESX or vCenter URL [%s]", envURL) 67 var urlFlag = flag.String("url", getEnvString(envURL, ""), urlDescription) 68 69 var insecureDescription = fmt.Sprintf("Don't verify the server's certificate chain [%s]", envInsecure) 70 var insecureFlag = flag.Bool("insecure", getEnvBool(envInsecure, false), insecureDescription) 71 72 func processOverride(u *url.URL) { 73 envUsername := os.Getenv(envUserName) 74 envPassword := os.Getenv(envPassword) 75 76 // Override username if provided 77 if envUsername != "" { 78 var password string 79 var ok bool 80 81 if u.User != nil { 82 password, ok = u.User.Password() 83 } 84 85 if ok { 86 u.User = url.UserPassword(envUsername, password) 87 } else { 88 u.User = url.User(envUsername) 89 } 90 } 91 92 // Override password if provided 93 if envPassword != "" { 94 var username string 95 96 if u.User != nil { 97 username = u.User.Username() 98 } 99 100 u.User = url.UserPassword(username, envPassword) 101 } 102 } 103 104 // NewClient creates a vim25.Client for use in the examples 105 func NewClient(ctx context.Context) (*vim25.Client, error) { 106 // Parse URL from string 107 u, err := soap.ParseURL(*urlFlag) 108 if err != nil { 109 return nil, err 110 } 111 112 // Override username and/or password as required 113 processOverride(u) 114 115 // Share govc's session cache 116 s := &cache.Session{ 117 URL: u, 118 Insecure: *insecureFlag, 119 } 120 121 c := new(vim25.Client) 122 err = s.Login(ctx, c, nil) 123 if err != nil { 124 return nil, err 125 } 126 127 return c, nil 128 } 129 130 // Run calls f with Client create from the -url flag if provided, 131 // otherwise runs the example against vcsim. 132 func Run(f func(context.Context, *vim25.Client) error) { 133 flag.Parse() 134 135 var err error 136 var c *vim25.Client 137 138 if *urlFlag == "" { 139 err = simulator.VPX().Run(f) 140 } else { 141 ctx := context.Background() 142 c, err = NewClient(ctx) 143 if err == nil { 144 err = f(ctx, c) 145 } 146 } 147 if err != nil { 148 log.Fatal(err) 149 } 150 }