|
|
|
@ -81,21 +81,30 @@ func (factory *ClientFactory) RemoveKubeClient(endpointID portainer.EndpointID)
|
|
|
|
|
// If no client is registered, it will create a new client, register it, and returns it.
|
|
|
|
|
func (factory *ClientFactory) GetKubeClient(endpoint *portainer.Endpoint) (*KubeClient, error) {
|
|
|
|
|
factory.mu.Lock()
|
|
|
|
|
defer factory.mu.Unlock()
|
|
|
|
|
|
|
|
|
|
key := strconv.Itoa(int(endpoint.ID))
|
|
|
|
|
client, ok := factory.endpointClients[key]
|
|
|
|
|
if !ok {
|
|
|
|
|
var err error
|
|
|
|
|
if client, ok := factory.endpointClients[key]; ok {
|
|
|
|
|
factory.mu.Unlock()
|
|
|
|
|
return client, nil
|
|
|
|
|
}
|
|
|
|
|
factory.mu.Unlock()
|
|
|
|
|
|
|
|
|
|
client, err = factory.createCachedAdminKubeClient(endpoint)
|
|
|
|
|
// EE-6901: Do not lock
|
|
|
|
|
client, err := factory.createCachedAdminKubeClient(endpoint)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
factory.endpointClients[key] = client
|
|
|
|
|
factory.mu.Lock()
|
|
|
|
|
defer factory.mu.Unlock()
|
|
|
|
|
|
|
|
|
|
// The lock was released before the client was created,
|
|
|
|
|
// so we need to check again
|
|
|
|
|
if c, ok := factory.endpointClients[key]; ok {
|
|
|
|
|
return c, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
factory.endpointClients[key] = client
|
|
|
|
|
|
|
|
|
|
return client, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|