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  }