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  }