feat(httpapi): harden control plane and speed up prefix refresh
Очередь job получила lease и fencing, телеметрия и прогресс deploy сохраняются, ревизия пишет manifest входов. Обновление префиксов не переписывает неизменённый снимок, большие наборы идут через COPY, а устаревшая ревизия не попадает в deploy. Бандл ноды кэшируется, prune и постановка job больше не держат горячий путь. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
924f111e48
commit
f8e0520817
197 files changed
+18655
-1416
No files matched your search
@@ -41,23 +41,41 @@ func main() {
|
||||
|
||||
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)")
|
||||
mode := strings.ToLower(strings.TrimSpace(os.Getenv("EVOBGP_SCHEDULER_MODE")))
|
||||
if mode == "" {
|
||||
switch {
|
||||
case apiBase != "" || apiTok != "":
|
||||
mode = "http"
|
||||
case pool != nil:
|
||||
mode = "db"
|
||||
default:
|
||||
mode = "local"
|
||||
}
|
||||
}
|
||||
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 := &scheduler.Deps{Store: st, HTTP: &http.Client{Timeout: 45 * time.Second}}
|
||||
switch mode {
|
||||
case "db":
|
||||
if pool == nil {
|
||||
log.Fatal("evobgp-scheduler: db mode requires EVOBGP_DATABASE_URL")
|
||||
}
|
||||
deps.Jobs = reg
|
||||
log.Printf("evobgp-scheduler: in-process job registry mode (use EVOBGP_CONTROL_PLANE_URL + EVOBGP_SCHEDULER_BEARER for split containers)")
|
||||
log.Print("evobgp-scheduler: trusted DB enqueue mode; API workers consume the shared durable queue")
|
||||
case "http":
|
||||
tenant := strings.TrimSpace(os.Getenv("EVOBGP_SCHEDULER_TENANT_ID"))
|
||||
if apiBase == "" || apiTok == "" || tenant == "" {
|
||||
log.Fatal("evobgp-scheduler: http mode requires EVOBGP_CONTROL_PLANE_URL, EVOBGP_SCHEDULER_BEARER and EVOBGP_SCHEDULER_TENANT_ID")
|
||||
}
|
||||
deps.APIBase, deps.APIToken, deps.APITenantID = apiBase, apiTok, tenant
|
||||
log.Print("evobgp-scheduler: single-tenant HTTP enqueue mode")
|
||||
case "local":
|
||||
if os.Getenv("EVOBGP_SCHEDULER_STANDALONE") == "1" || pool != nil {
|
||||
log.Fatal("evobgp-scheduler: local mode is for in-process development only; use db for a shared PostgreSQL queue")
|
||||
}
|
||||
deps.Jobs = reg
|
||||
defer func() { reg.RequestCancelAll(); _ = reg.Drain(context.Background()) }()
|
||||
log.Print("evobgp-scheduler: local development mode")
|
||||
default:
|
||||
log.Fatal("evobgp-scheduler: EVOBGP_SCHEDULER_MODE must be db, http or local")
|
||||
}
|
||||
scheduler.Run(ctx, deps)
|
||||
}
|
||||
Reference in new issue
Block a user