pkg/config/runtime_config.go (60 lines of code) (raw):

package config import ( "time" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" ctrl "sigs.k8s.io/controller-runtime" metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server" "github.com/spf13/pflag" ) const ( flagKubeconfig = "kubeconfig" flagMetricsBindAddr = "metrics-bind-addr" flagHealthProbeBindAddr = "health-probe-bind-addr" defaultKubeconfig = "" defaultWatchNamespace = corev1.NamespaceAll defaultMetricsAddr = ":8162" defaultHealthProbeBindAddress = ":8163" defaultQPS = 20 defaultBurst = 100 ) // RuntimeConfig stores the configuration for the controller-runtime type RuntimeConfig struct { APIServer string KubeConfig string MetricsBindAddress string HealthProbeBindAddress string SyncPeriod time.Duration } func (c *RuntimeConfig) BindFlags(fs *pflag.FlagSet) { fs.StringVar(&c.KubeConfig, flagKubeconfig, defaultKubeconfig, "Path to the kubeconfig file containing authorization and API server information.") fs.StringVar(&c.MetricsBindAddress, flagMetricsBindAddr, defaultMetricsAddr, "The address the metric endpoint binds to.") fs.StringVar(&c.HealthProbeBindAddress, flagHealthProbeBindAddr, defaultHealthProbeBindAddress, "The address the health probes binds to.") } // BuildRestConfig builds the REST config for the controller runtime func BuildRestConfig(rtCfg RuntimeConfig) (*rest.Config, error) { var restCFG *rest.Config var err error if rtCfg.KubeConfig == "" { restCFG, err = rest.InClusterConfig() } else { restCFG, err = clientcmd.NewNonInteractiveDeferredLoadingClientConfig( &clientcmd.ClientConfigLoadingRules{ExplicitPath: rtCfg.KubeConfig}, &clientcmd.ConfigOverrides{}).ClientConfig() } if err != nil { return nil, err } restCFG.QPS = defaultQPS restCFG.Burst = defaultBurst return restCFG, nil } // BuildRuntimeOptions builds the options for the controller runtime based on config func BuildRuntimeOptions(rtCfg RuntimeConfig, scheme *runtime.Scheme) ctrl.Options { return ctrl.Options{ Scheme: scheme, Metrics: metricsserver.Options{BindAddress: rtCfg.MetricsBindAddress}, HealthProbeBindAddress: rtCfg.HealthProbeBindAddress, } }