1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
package agent
import (
"fmt"
"net/url"
"gitlab.com/gitlab-org/cluster-integration/gitlab-agent/v16/internal/module/kubernetes_api"
"gitlab.com/gitlab-org/cluster-integration/gitlab-agent/v16/internal/module/kubernetes_api/rpc"
"gitlab.com/gitlab-org/cluster-integration/gitlab-agent/v16/internal/module/modagent"
"gitlab.com/gitlab-org/cluster-integration/gitlab-agent/v16/internal/module/modshared"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/rest"
)
type Factory struct {
}
func (f *Factory) IsProducingLeaderModules() bool {
return false
}
func (f *Factory) New(config *modagent.Config) (modagent.Module, error) {
restConfig, err := config.K8sUtilFactory.ToRESTConfig()
if err != nil {
return nil, err
}
restConfig = rest.CopyConfig(restConfig)
// Clients and the server already do rate limiting. agentk doesn't need to add an extra layer.
// See https://kubernetes.io/docs/concepts/cluster-administration/flow-control/
restConfig.QPS = -1
baseURL, _, err := defaultServerURLFor(restConfig)
if err != nil {
return nil, err
}
userAgent := fmt.Sprintf("%s/%s/%s", config.AgentName, config.AgentMeta.Version, config.AgentMeta.CommitId)
s := newServer(restConfig, baseURL, userAgent)
rpc.RegisterKubernetesApiServer(config.Server, s)
return nil, nil
}
func (f *Factory) Name() string {
return kubernetes_api.ModuleName
}
func (f *Factory) StartStopPhase() modshared.ModuleStartStopPhase {
// This module exposes an API endpoint on the internal server, but it does not make requests to it.
return modshared.ModuleStartBeforeServers
}
// This is a copy from k8s.io/client-go/rest/url_utils.go
// defaultServerURLFor is shared between IsConfigTransportTLS and RESTClientFor. It
// requires Host and Version to be set prior to being called.
func defaultServerURLFor(config *rest.Config) (*url.URL, string, error) {
// TODO: move the default to secure when the apiserver supports TLS by default
// config.Insecure is taken to mean "I want HTTPS but don't bother checking the certs against a CA."
hasCA := len(config.CAFile) != 0 || len(config.CAData) != 0
hasCert := len(config.CertFile) != 0 || len(config.CertData) != 0
defaultTLS := hasCA || hasCert || config.Insecure
host := config.Host
if host == "" {
host = "localhost"
}
if config.GroupVersion != nil {
return rest.DefaultServerURL(host, config.APIPath, *config.GroupVersion, defaultTLS)
}
return rest.DefaultServerURL(host, config.APIPath, schema.GroupVersion{}, defaultTLS)
}
|