diff --git a/pkg/mcclient/auth/auth.go b/pkg/mcclient/auth/auth.go index 25aeb1cb71..604284862a 100644 --- a/pkg/mcclient/auth/auth.go +++ b/pkg/mcclient/auth/auth.go @@ -20,6 +20,7 @@ import ( "net" "net/http" "strings" + "sync" "time" "yunion.io/x/jsonutils" @@ -161,16 +162,29 @@ type authManager struct { accessKeyCache *sAccessKeyCache } +var ( + authManagerInstane *authManager + authManagerLock *sync.Mutex = &sync.Mutex{} +) + func newAuthManager(cli *mcclient.Client, info *AuthInfo) *authManager { - authm := &authManager{ + authManagerLock.Lock() + defer authManagerLock.Unlock() + + if authManagerInstane != nil { + authManagerInstane.client = cli + authManagerInstane.info = info + return authManagerInstane + } + authManagerInstane = &authManager{ client: cli, info: info, tokenCacheVerify: NewTokenCacheVerify(), accessKeyCache: newAccessKeyCache(), } - authm.InitSync(authm) - go authm.startRefreshRevokeTokens() - return authm + authManagerInstane.InitSync(authManagerInstane) + go authManagerInstane.startRefreshRevokeTokens() + return authManagerInstane } func (a *authManager) startRefreshRevokeTokens() {