mirror of https://github.com/portainer/portainer
fix(api): list docker volume performance [EE-6896] (#11540)
parent
92c8692bbe
commit
1fce2b83d7
|
@ -462,7 +462,7 @@ func buildServer(flags *portainer.CLIFlags) portainer.Server {
|
||||||
|
|
||||||
kubeClusterAccessService := kubernetes.NewKubeClusterAccessService(*flags.BaseURL, *flags.AddrHTTPS, sslSettings.CertPath)
|
kubeClusterAccessService := kubernetes.NewKubeClusterAccessService(*flags.BaseURL, *flags.AddrHTTPS, sslSettings.CertPath)
|
||||||
|
|
||||||
proxyManager := proxy.NewManager(dataStore, digitalSignatureService, reverseTunnelService, dockerClientFactory, kubernetesClientFactory, kubernetesTokenCacheManager, gitService)
|
proxyManager := proxy.NewManager(kubernetesClientFactory)
|
||||||
|
|
||||||
reverseTunnelService.ProxyManager = proxyManager
|
reverseTunnelService.ProxyManager = proxyManager
|
||||||
|
|
||||||
|
@ -490,6 +490,8 @@ func buildServer(flags *portainer.CLIFlags) portainer.Server {
|
||||||
}
|
}
|
||||||
snapshotService.Start()
|
snapshotService.Start()
|
||||||
|
|
||||||
|
proxyManager.NewProxyFactory(dataStore, digitalSignatureService, reverseTunnelService, dockerClientFactory, kubernetesClientFactory, kubernetesTokenCacheManager, gitService, snapshotService)
|
||||||
|
|
||||||
helmPackageManager, err := initHelmPackageManager(*flags.Assets)
|
helmPackageManager, err := initHelmPackageManager(*flags.Assets)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal().Err(err).Msg("failed initializing helm package manager")
|
log.Fatal().Err(err).Msg("failed initializing helm package manager")
|
||||||
|
|
|
@ -21,7 +21,8 @@ func TestEndpointDeleteEdgeGroupsConcurrently(t *testing.T) {
|
||||||
|
|
||||||
handler := NewHandler(testhelpers.NewTestRequestBouncer(), demo.NewService())
|
handler := NewHandler(testhelpers.NewTestRequestBouncer(), demo.NewService())
|
||||||
handler.DataStore = store
|
handler.DataStore = store
|
||||||
handler.ProxyManager = proxy.NewManager(nil, nil, nil, nil, nil, nil, nil)
|
handler.ProxyManager = proxy.NewManager(nil)
|
||||||
|
handler.ProxyManager.NewProxyFactory(nil, nil, nil, nil, nil, nil, nil, nil)
|
||||||
|
|
||||||
// Create all the environments and add them to the same edge group
|
// Create all the environments and add them to the same edge group
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ func (factory *ProxyFactory) newDockerHTTPProxy(endpoint *portainer.Endpoint) (h
|
||||||
DockerClientFactory: factory.dockerClientFactory,
|
DockerClientFactory: factory.dockerClientFactory,
|
||||||
}
|
}
|
||||||
|
|
||||||
dockerTransport, err := docker.NewTransport(transportParameters, httpTransport, factory.gitService)
|
dockerTransport, err := docker.NewTransport(transportParameters, httpTransport, factory.gitService, factory.snapshotService)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ type (
|
||||||
reverseTunnelService portainer.ReverseTunnelService
|
reverseTunnelService portainer.ReverseTunnelService
|
||||||
dockerClientFactory *dockerclient.ClientFactory
|
dockerClientFactory *dockerclient.ClientFactory
|
||||||
gitService portainer.GitService
|
gitService portainer.GitService
|
||||||
|
snapshotService portainer.SnapshotService
|
||||||
}
|
}
|
||||||
|
|
||||||
// TransportParameters is used to create a new Transport
|
// TransportParameters is used to create a new Transport
|
||||||
|
@ -63,7 +64,7 @@ type (
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewTransport returns a pointer to a new Transport instance.
|
// NewTransport returns a pointer to a new Transport instance.
|
||||||
func NewTransport(parameters *TransportParameters, httpTransport *http.Transport, gitService portainer.GitService) (*Transport, error) {
|
func NewTransport(parameters *TransportParameters, httpTransport *http.Transport, gitService portainer.GitService, snapshotService portainer.SnapshotService) (*Transport, error) {
|
||||||
transport := &Transport{
|
transport := &Transport{
|
||||||
endpoint: parameters.Endpoint,
|
endpoint: parameters.Endpoint,
|
||||||
dataStore: parameters.DataStore,
|
dataStore: parameters.DataStore,
|
||||||
|
@ -72,6 +73,7 @@ func NewTransport(parameters *TransportParameters, httpTransport *http.Transport
|
||||||
dockerClientFactory: parameters.DockerClientFactory,
|
dockerClientFactory: parameters.DockerClientFactory,
|
||||||
HTTPTransport: httpTransport,
|
HTTPTransport: httpTransport,
|
||||||
gitService: gitService,
|
gitService: gitService,
|
||||||
|
snapshotService: snapshotService,
|
||||||
}
|
}
|
||||||
|
|
||||||
return transport, nil
|
return transport, nil
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
"path"
|
"path"
|
||||||
|
|
||||||
"github.com/docker/docker/client"
|
"github.com/docker/docker/client"
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
|
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/http/proxy/factory/utils"
|
"github.com/portainer/portainer/api/http/proxy/factory/utils"
|
||||||
|
@ -48,6 +49,14 @@ func (transport *Transport) volumeListOperation(response *http.Response, executo
|
||||||
if responseObject["Volumes"] != nil {
|
if responseObject["Volumes"] != nil {
|
||||||
volumeData := responseObject["Volumes"].([]interface{})
|
volumeData := responseObject["Volumes"].([]interface{})
|
||||||
|
|
||||||
|
if transport.snapshotService != nil {
|
||||||
|
// Filling snapshot data can improve the performance of getVolumeResourceID
|
||||||
|
if err = transport.snapshotService.FillSnapshotData(transport.endpoint); err != nil {
|
||||||
|
log.Info().Err(err).
|
||||||
|
Int("endpoint id", int(transport.endpoint.ID)).
|
||||||
|
Msg("snapshot is not filled into the endpoint.")
|
||||||
|
}
|
||||||
|
}
|
||||||
for _, volumeObject := range volumeData {
|
for _, volumeObject := range volumeData {
|
||||||
volume := volumeObject.(map[string]interface{})
|
volume := volumeObject.(map[string]interface{})
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ func (factory ProxyFactory) newOSBasedLocalProxy(path string, endpoint *portaine
|
||||||
|
|
||||||
proxy := &dockerLocalProxy{}
|
proxy := &dockerLocalProxy{}
|
||||||
|
|
||||||
dockerTransport, err := docker.NewTransport(transportParameters, newSocketTransport(path), factory.gitService)
|
dockerTransport, err := docker.NewTransport(transportParameters, newSocketTransport(path), factory.gitService, factory.snapshotService)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ func (factory ProxyFactory) newOSBasedLocalProxy(path string, endpoint *portaine
|
||||||
|
|
||||||
proxy := &dockerLocalProxy{}
|
proxy := &dockerLocalProxy{}
|
||||||
|
|
||||||
dockerTransport, err := docker.NewTransport(transportParameters, newNamedPipeTransport(path), factory.gitService)
|
dockerTransport, err := docker.NewTransport(transportParameters, newNamedPipeTransport(path), factory.gitService, factory.snapshotService)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,11 +23,12 @@ type (
|
||||||
kubernetesClientFactory *cli.ClientFactory
|
kubernetesClientFactory *cli.ClientFactory
|
||||||
kubernetesTokenCacheManager *kubernetes.TokenCacheManager
|
kubernetesTokenCacheManager *kubernetes.TokenCacheManager
|
||||||
gitService portainer.GitService
|
gitService portainer.GitService
|
||||||
|
snapshotService portainer.SnapshotService
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewProxyFactory returns a pointer to a new instance of a ProxyFactory
|
// NewProxyFactory returns a pointer to a new instance of a ProxyFactory
|
||||||
func NewProxyFactory(dataStore dataservices.DataStore, signatureService portainer.DigitalSignatureService, tunnelService portainer.ReverseTunnelService, clientFactory *dockerclient.ClientFactory, kubernetesClientFactory *cli.ClientFactory, kubernetesTokenCacheManager *kubernetes.TokenCacheManager, gitService portainer.GitService) *ProxyFactory {
|
func NewProxyFactory(dataStore dataservices.DataStore, signatureService portainer.DigitalSignatureService, tunnelService portainer.ReverseTunnelService, clientFactory *dockerclient.ClientFactory, kubernetesClientFactory *cli.ClientFactory, kubernetesTokenCacheManager *kubernetes.TokenCacheManager, gitService portainer.GitService, snapshotService portainer.SnapshotService) *ProxyFactory {
|
||||||
return &ProxyFactory{
|
return &ProxyFactory{
|
||||||
dataStore: dataStore,
|
dataStore: dataStore,
|
||||||
signatureService: signatureService,
|
signatureService: signatureService,
|
||||||
|
@ -36,6 +37,7 @@ func NewProxyFactory(dataStore dataservices.DataStore, signatureService portaine
|
||||||
kubernetesClientFactory: kubernetesClientFactory,
|
kubernetesClientFactory: kubernetesClientFactory,
|
||||||
kubernetesTokenCacheManager: kubernetesTokenCacheManager,
|
kubernetesTokenCacheManager: kubernetesTokenCacheManager,
|
||||||
gitService: gitService,
|
gitService: gitService,
|
||||||
|
snapshotService: snapshotService,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,17 +25,24 @@ type (
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewManager initializes a new proxy Service
|
// NewManager initializes a new proxy Service
|
||||||
func NewManager(dataStore dataservices.DataStore, signatureService portainer.DigitalSignatureService, tunnelService portainer.ReverseTunnelService, clientFactory *dockerclient.ClientFactory, kubernetesClientFactory *cli.ClientFactory, kubernetesTokenCacheManager *kubernetes.TokenCacheManager, gitService portainer.GitService) *Manager {
|
func NewManager(kubernetesClientFactory *cli.ClientFactory) *Manager {
|
||||||
return &Manager{
|
return &Manager{
|
||||||
endpointProxies: cmap.New(),
|
endpointProxies: cmap.New(),
|
||||||
k8sClientFactory: kubernetesClientFactory,
|
k8sClientFactory: kubernetesClientFactory,
|
||||||
proxyFactory: factory.NewProxyFactory(dataStore, signatureService, tunnelService, clientFactory, kubernetesClientFactory, kubernetesTokenCacheManager, gitService),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (manager *Manager) NewProxyFactory(dataStore dataservices.DataStore, signatureService portainer.DigitalSignatureService, tunnelService portainer.ReverseTunnelService, clientFactory *dockerclient.ClientFactory, kubernetesClientFactory *cli.ClientFactory, kubernetesTokenCacheManager *kubernetes.TokenCacheManager, gitService portainer.GitService, snapshotService portainer.SnapshotService) {
|
||||||
|
manager.proxyFactory = factory.NewProxyFactory(dataStore, signatureService, tunnelService, clientFactory, kubernetesClientFactory, kubernetesTokenCacheManager, gitService, snapshotService)
|
||||||
|
}
|
||||||
|
|
||||||
// CreateAndRegisterEndpointProxy creates a new HTTP reverse proxy based on environment(endpoint) properties and and adds it to the registered proxies.
|
// CreateAndRegisterEndpointProxy creates a new HTTP reverse proxy based on environment(endpoint) properties and and adds it to the registered proxies.
|
||||||
// It can also be used to create a new HTTP reverse proxy and replace an already registered proxy.
|
// It can also be used to create a new HTTP reverse proxy and replace an already registered proxy.
|
||||||
func (manager *Manager) CreateAndRegisterEndpointProxy(endpoint *portainer.Endpoint) (http.Handler, error) {
|
func (manager *Manager) CreateAndRegisterEndpointProxy(endpoint *portainer.Endpoint) (http.Handler, error) {
|
||||||
|
if manager.proxyFactory == nil {
|
||||||
|
return nil, fmt.Errorf("proxy factory not init")
|
||||||
|
}
|
||||||
|
|
||||||
proxy, err := manager.proxyFactory.NewEndpointProxy(endpoint)
|
proxy, err := manager.proxyFactory.NewEndpointProxy(endpoint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -48,6 +55,9 @@ func (manager *Manager) CreateAndRegisterEndpointProxy(endpoint *portainer.Endpo
|
||||||
// CreateAgentProxyServer creates a new HTTP reverse proxy based on environment(endpoint) properties and and adds it to the registered proxies.
|
// CreateAgentProxyServer creates a new HTTP reverse proxy based on environment(endpoint) properties and and adds it to the registered proxies.
|
||||||
// It can also be used to create a new HTTP reverse proxy and replace an already registered proxy.
|
// It can also be used to create a new HTTP reverse proxy and replace an already registered proxy.
|
||||||
func (manager *Manager) CreateAgentProxyServer(endpoint *portainer.Endpoint) (*factory.ProxyServer, error) {
|
func (manager *Manager) CreateAgentProxyServer(endpoint *portainer.Endpoint) (*factory.ProxyServer, error) {
|
||||||
|
if manager.proxyFactory == nil {
|
||||||
|
return nil, fmt.Errorf("proxy factory not init")
|
||||||
|
}
|
||||||
return manager.proxyFactory.NewAgentProxy(endpoint)
|
return manager.proxyFactory.NewAgentProxy(endpoint)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,5 +84,8 @@ func (manager *Manager) DeleteEndpointProxy(endpointID portainer.EndpointID) {
|
||||||
|
|
||||||
// CreateGitlabProxy creates a new HTTP reverse proxy that can be used to send requests to the Gitlab API
|
// CreateGitlabProxy creates a new HTTP reverse proxy that can be used to send requests to the Gitlab API
|
||||||
func (manager *Manager) CreateGitlabProxy(url string) (http.Handler, error) {
|
func (manager *Manager) CreateGitlabProxy(url string) (http.Handler, error) {
|
||||||
|
if manager.proxyFactory == nil {
|
||||||
|
return nil, fmt.Errorf("proxy factory not init")
|
||||||
|
}
|
||||||
return manager.proxyFactory.NewGitlabProxy(url)
|
return manager.proxyFactory.NewGitlabProxy(url)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue