package main import ( "context" "log/slog" "os" "os/signal" "syscall" "github.com/go-logr/logr" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log/zap" keav1alpha1 "git.unkin.net/unkin/kea-operator/api/v1alpha1" "git.unkin.net/unkin/kea-operator/internal/keaapi" ) var scheme = runtime.NewScheme() func init() { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) utilruntime.Must(keav1alpha1.AddToScheme(scheme)) } func getenv(key, def string) string { if v := os.Getenv(key); v != "" { return v } return def } func main() { slog.SetDefault(slog.New(slog.NewJSONHandler(os.Stdout, nil))) logger := zap.New(zap.UseDevMode(false)) addr := getenv("LISTEN_ADDR", ":8080") namespace := getenv("TARGET_NAMESPACE", "dhcp-system") token := os.Getenv("KEA_API_TOKEN") if token == "" { slog.Warn("KEA_API_TOKEN not set; all API endpoints will return 503") } c, err := client.New(ctrl.GetConfigOrDie(), client.Options{Scheme: scheme}) if err != nil { slog.Error("build k8s client", "err", err) os.Exit(1) } srv := &keaapi.Server{ Store: &keaapi.K8sStore{Client: c, Namespace: namespace}, Token: token, Log: logr.Logger(logger), } ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() slog.Info("starting kea-api", "addr", addr, "namespace", namespace) if err := srv.ListenAndServe(ctx, addr); err != nil { slog.Error("server exited", "err", err) os.Exit(1) } }