| 119 | } |
| 120 | |
| 121 | func runController(cfg *config.Config) error { |
| 122 | ctx := signals.SetupSignalHandler() |
| 123 | |
| 124 | level := slog.LevelInfo |
| 125 | if cfg.LogLevel != "" { |
| 126 | if err := level.UnmarshalText([]byte(cfg.LogLevel)); err != nil { |
| 127 | return fmt.Errorf("invalid log level %q: %w", cfg.LogLevel, err) |
| 128 | } |
| 129 | } |
| 130 | |
| 131 | if cfg.Debug { |
| 132 | level = slog.LevelDebug |
| 133 | } |
| 134 | |
| 135 | var handler slog.Handler |
| 136 | switch cfg.LogFormat { |
| 137 | case "json": |
| 138 | handler = slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: level}) |
| 139 | |
| 140 | case "logfmt", "": |
| 141 | handler = tint.NewHandler(os.Stdout, &tint.Options{ |
| 142 | AddSource: true, |
| 143 | Level: level, |
| 144 | NoColor: cfg.NoColor || !isatty.IsTerminal(os.Stdout.Fd()), |
| 145 | }) |
| 146 | |
| 147 | default: |
| 148 | return fmt.Errorf("unknown log format: %s", cfg.LogFormat) |
| 149 | } |
| 150 | |
| 151 | logger := slog.New(handler) |
| 152 | klog.SetLogger(logr.FromSlogHandler(handler)) |
| 153 | logger.Debug("configuration loaded", "config", cfg) |
| 154 | |
| 155 | clientConfig := restconfig.GetConfigOrDie() |
| 156 | clientConfig.QPS = float32(cfg.K8sClientRateLimiterQPS) |
| 157 | clientConfig.Burst = cfg.K8sClientRateLimiterBurst |
| 158 | |
| 159 | // Default to Protobuf encoding for API responses, support fallback to JSON |
| 160 | clientConfig.AcceptContentTypes = "application/vnd.kubernetes.protobuf,application/json" |
| 161 | clientConfig.ContentType = "application/vnd.kubernetes.protobuf" |
| 162 | |
| 163 | k8sClient, err := kubernetes.NewForConfig(clientConfig) |
| 164 | if err != nil { |
| 165 | logger.Error("failed to create clientset", "error", err) |
| 166 | return err |
| 167 | } |
| 168 | |
| 169 | controller.Run(ctx, logger, k8sClient, cfg) |
| 170 | |
| 171 | return nil |
| 172 | } |