package main import ( "context" "log" "net/http" "os" "os/signal" "strings" "syscall" "time" "evobgp/internal/config" "evobgp/internal/httpapi" "evobgp/internal/scheduler" ) func main() { cfg := config.Load() name := cfg.ServiceName if name == "" { name = "evobgp-scheduler" } log.Printf("%s starting (reference profile worker)", name) ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() bctx, bcancel := context.WithTimeout(context.Background(), 90*time.Second) defer bcancel() opts := httpapi.Options{ DatabaseURL: strings.TrimSpace(os.Getenv("EVOBGP_DATABASE_URL")), SeedDemo: os.Getenv("EVOBGP_SEED_DEMO") != "0", } st, reg, pool, err := httpapi.BootstrapWorkers(bctx, opts) if err != nil { log.Fatal(err) } if pool != nil { defer pool.Close() } apiBase := strings.TrimSpace(os.Getenv("EVOBGP_CONTROL_PLANE_URL")) apiTok := strings.TrimSpace(os.Getenv("EVOBGP_SCHEDULER_BEARER")) if os.Getenv("EVOBGP_SCHEDULER_STANDALONE") == "1" && apiBase == "" { log.Fatal("evobgp-scheduler: EVOBGP_SCHEDULER_STANDALONE=1 requires EVOBGP_CONTROL_PLANE_URL and EVOBGP_SCHEDULER_BEARER (split deploy must not use in-process jobs.Registry)") } deps := &scheduler.Deps{ Store: st, HTTP: &http.Client{Timeout: 45 * time.Second}, } if (apiBase != "") != (apiTok != "") { log.Fatal("evobgp-scheduler: set both EVOBGP_CONTROL_PLANE_URL and EVOBGP_SCHEDULER_BEARER for HTTP mode, or leave both empty for in-process job registry") } if apiBase != "" { deps.APIBase = apiBase deps.APIToken = apiTok log.Printf("evobgp-scheduler: control plane HTTP mode (%s)", apiBase) } else { deps.Jobs = reg log.Printf("evobgp-scheduler: in-process job registry mode (use EVOBGP_CONTROL_PLANE_URL + EVOBGP_SCHEDULER_BEARER for split containers)") } scheduler.Run(ctx, deps) }