From 297d96084199812b618cfa941fb231aaa9c5c390 Mon Sep 17 00:00:00 2001
From: Denis Moiseev <dmoiseev@redhat.com>
Date: Tue, 7 Sep 2021 19:08:29 +0200
Subject: [PATCH] Fix user-agent in vCenter sessions list

For some reason vCenter using user-agent from first
login request and does not respect it's change after.
Moved login step into our code with setting user-agent
for soap client beforehand.
Info log message for new vCenter session creation added
by the way.
---
 pkg/controller/vsphere/session/session.go | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/pkg/controller/vsphere/session/session.go b/pkg/controller/vsphere/session/session.go
index 69584e3f9..497e2cf98 100644
--- a/pkg/controller/vsphere/session/session.go
+++ b/pkg/controller/vsphere/session/session.go
@@ -67,6 +67,7 @@ func GetOrCreate(
 			return &session, nil
 		}
 	}
+	klog.Infof("No existing vCenter session found, creating new session")
 
 	soapURL, err := soap.ParseURL(server)
 	if err != nil {
@@ -76,20 +77,26 @@ func GetOrCreate(
 		return nil, fmt.Errorf("error parsing vSphere URL %q", server)
 	}
 
-	soapURL.User = url.UserPassword(username, password)
-
+	// Set user to nil there for prevent login during client creation.
+	// See https://github.com/vmware/govmomi/blob/master/client.go#L91
+	soapURL.User = nil
 	client, err := govmomi.NewClient(ctx, soapURL, insecure)
 	if err != nil {
 		return nil, fmt.Errorf("error setting up new vSphere SOAP client: %w", err)
 	}
 
+	// Set up user agent before login for being able to track mapi component in vcenter sessions list
+	client.UserAgent = "machineAPIvSphereProvider"
+	if err := client.Login(ctx, url.UserPassword(username, password)); err != nil {
+		return nil, fmt.Errorf("unable to login to vCenter: %w", err)
+	}
+
 	session := Session{
 		Client:   client,
 		username: username,
 		password: password,
 	}
 
-	session.UserAgent = "machineAPIvSphereProvider"
 	session.Finder = find.NewFinder(session.Client.Client, false)
 
 	dc, err := session.Finder.DatacenterOrDefault(ctx, datacenter)
-- 
GitLab