code: func (c *Config) LoadVimClient() (*govmomi.Client, error) {
  	client := new(vim25.Client)
  	ok, err := c.restoreVimClient(client)
  	if err != nil {
  		return nil, err
  	}
  
  	if !ok || !client.Valid() {
  		log.Println("[DEBUG] Cached SOAP client session data not valid or persistence not enabled, new session necessary")
  		return nil, nil
  	}
  
  	m := session.NewManager(client)
  	u, err := m.UserSession(context.TODO())
  	if err != nil {
  		if soap.IsSoapFault(err) {
  			fault := soap.ToSoapFault(err).VimFault()
  			// If the PropertyCollector is not found, the saved session for this URL is not valid
  			if _, ok := fault.(types.ManagedObjectNotFound); ok {
  				log.Println("[DEBUG] Cached SOAP client session missing property collector, new session necessary")
  				return nil, nil
  			}
  		}
  
  		return nil, err
  	}
  
  	// If the session is nil, the client is not authenticated
  	if u == nil {
  		log.Println("[DEBUG] Unauthenticated session, new session necessary")
  		return nil, nil
  	}
  
  	log.Println("[DEBUG] Cached SOAP client session loaded successfully")
  	return &govmomi.Client{
  		Client:         client,
  		SessionManager: m,
  	}, nil
  }
docs: // LoadVimClient loads a saved vSphere SOAP API session from disk, previously
  // saved by SaveVimClient, checking it for validity before returning it. A nil
  // client means that the session is no longer valid and should be created from
  // scratch.
  //
  // Note the logic in this function has been largely adapted from govc and is
  // designed to be compatible with it - if a session has already been saved with
  // govc, Terraform will attempt to use that session first.