mirror of https://github.com/portainer/portainer
70 lines
2.6 KiB
Go
70 lines
2.6 KiB
Go
package factory
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httputil"
|
|
"net/url"
|
|
|
|
portainer "github.com/portainer/portainer/api"
|
|
"github.com/portainer/portainer/api/http/proxy/factory/kubernetes"
|
|
|
|
"github.com/portainer/portainer/api/kubernetes/cli"
|
|
|
|
"github.com/portainer/portainer/api/docker"
|
|
)
|
|
|
|
const azureAPIBaseURL = "https://management.azure.com"
|
|
|
|
type (
|
|
// ProxyFactory is a factory to create reverse proxies
|
|
ProxyFactory struct {
|
|
dataStore portainer.DataStore
|
|
signatureService portainer.DigitalSignatureService
|
|
reverseTunnelService portainer.ReverseTunnelService
|
|
dockerClientFactory *docker.ClientFactory
|
|
kubernetesClientFactory *cli.ClientFactory
|
|
kubernetesTokenCacheManager *kubernetes.TokenCacheManager
|
|
}
|
|
)
|
|
|
|
// NewProxyFactory returns a pointer to a new instance of a ProxyFactory
|
|
func NewProxyFactory(dataStore portainer.DataStore, signatureService portainer.DigitalSignatureService, tunnelService portainer.ReverseTunnelService, clientFactory *docker.ClientFactory, kubernetesClientFactory *cli.ClientFactory, kubernetesTokenCacheManager *kubernetes.TokenCacheManager) *ProxyFactory {
|
|
return &ProxyFactory{
|
|
dataStore: dataStore,
|
|
signatureService: signatureService,
|
|
reverseTunnelService: tunnelService,
|
|
dockerClientFactory: clientFactory,
|
|
kubernetesClientFactory: kubernetesClientFactory,
|
|
kubernetesTokenCacheManager: kubernetesTokenCacheManager,
|
|
}
|
|
}
|
|
|
|
// NewLegacyExtensionProxy returns a new HTTP proxy to a legacy extension server (Storidge)
|
|
func (factory *ProxyFactory) NewLegacyExtensionProxy(extensionAPIURL string) (http.Handler, error) {
|
|
extensionURL, err := url.Parse(extensionAPIURL)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
extensionURL.Scheme = "http"
|
|
proxy := httputil.NewSingleHostReverseProxy(extensionURL)
|
|
return proxy, nil
|
|
}
|
|
|
|
// NewEndpointProxy returns a new reverse proxy (filesystem based or HTTP) to an environment(endpoint) API server
|
|
func (factory *ProxyFactory) NewEndpointProxy(endpoint *portainer.Endpoint) (http.Handler, error) {
|
|
switch endpoint.Type {
|
|
case portainer.AzureEnvironment:
|
|
return newAzureProxy(endpoint, factory.dataStore)
|
|
case portainer.EdgeAgentOnKubernetesEnvironment, portainer.AgentOnKubernetesEnvironment, portainer.KubernetesLocalEnvironment:
|
|
return factory.newKubernetesProxy(endpoint)
|
|
}
|
|
|
|
return factory.newDockerProxy(endpoint)
|
|
}
|
|
|
|
// NewGitlabProxy returns a new HTTP proxy to a Gitlab API server
|
|
func (factory *ProxyFactory) NewGitlabProxy(gitlabAPIUri string) (http.Handler, error) {
|
|
return newGitlabProxy(gitlabAPIUri)
|
|
}
|