github.com/netdata/go.d.plugin@v0.58.1/modules/vsphere/client/keepalive.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package client 4 5 import ( 6 "context" 7 "net/url" 8 "time" 9 10 "github.com/vmware/govmomi" 11 "github.com/vmware/govmomi/session" 12 "github.com/vmware/govmomi/vim25/methods" 13 "github.com/vmware/govmomi/vim25/soap" 14 "github.com/vmware/govmomi/vim25/types" 15 ) 16 17 const ( 18 keepAliveEvery = time.Second * 15 19 ) 20 21 // TODO: survive vCenter reboot, it looks like we need to re New() 22 func addKeepAlive(client *govmomi.Client, userinfo *url.Userinfo) { 23 f := func(rt soap.RoundTripper) error { 24 _, err := methods.GetCurrentTime(context.Background(), rt) 25 if err == nil { 26 return nil 27 } 28 29 if !isNotAuthenticated(err) { 30 return nil 31 } 32 33 _ = client.Login(context.Background(), userinfo) 34 return nil 35 } 36 client.Client.RoundTripper = session.KeepAliveHandler(client.Client.RoundTripper, keepAliveEvery, f) 37 } 38 39 func isNotAuthenticated(err error) bool { 40 if !soap.IsSoapFault(err) { 41 return false 42 } 43 _, ok := soap.ToSoapFault(err).VimFault().(*types.NotAuthenticated) 44 return ok 45 }