DoH через DoWithRetry; CDN preview через UpstreamHTTPDo; частичный fail CDN (EVOBGP_CDN_PARTIAL_OK); безопасный доступ к Job.Meta; drain jobs при SIGTERM; ValidateProductionEnforce при EVOBGP_PRODUCTION=1. Co-authored-by: Cursor <[email protected]>
63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
package jobs
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
|
|
"evobgp/internal/maintenance"
|
|
"evobgp/internal/pgmonitor"
|
|
"evobgp/internal/store"
|
|
)
|
|
|
|
func (w *Worker) maintenanceExecutor() *maintenance.PolicyExecutor {
|
|
if w == nil {
|
|
return nil
|
|
}
|
|
return &maintenance.PolicyExecutor{Store: w.Store, Pool: w.PgPool}
|
|
}
|
|
|
|
func (w *Worker) runMaintenancePolicy(j *Job) {
|
|
if w == nil || w.PgPool == nil {
|
|
j.Fail("postgresql not configured")
|
|
return
|
|
}
|
|
policyID := strings.TrimSpace(j.metaString("policy_id"))
|
|
if policyID == "" {
|
|
j.Fail("missing policy_id in job meta")
|
|
return
|
|
}
|
|
dryRun := j.metaBool("dry_run")
|
|
actor := j.metaString("actor_prefix")
|
|
ctx, cancel := j.workContext()
|
|
defer cancel()
|
|
|
|
pol, err := w.Store.GetMaintenancePolicy(policyID)
|
|
if err != nil {
|
|
if errors.Is(err, store.ErrNotFound) {
|
|
j.Fail("maintenance policy not found")
|
|
return
|
|
}
|
|
j.Fail(err.Error())
|
|
return
|
|
}
|
|
|
|
auditID, _ := pgmonitor.InsertMaintenanceAuditWithPolicy(ctx, w.PgPool, j.TenantID, actor, "maintenance_policy_run", pol.TableName, policyID, dryRun)
|
|
exec := w.maintenanceExecutor()
|
|
detail, err := exec.Execute(ctx, pol, dryRun)
|
|
var errMsg *string
|
|
status := StatusSucceeded
|
|
if err != nil {
|
|
s := err.Error()
|
|
errMsg = &s
|
|
status = StatusFailed
|
|
_ = w.Store.TouchMaintenancePolicyRun(policyID, status, s)
|
|
j.Fail(s)
|
|
} else {
|
|
j.mergeMeta(map[string]any{"maintenance": detail, "audit_id": auditID, "policy_id": policyID})
|
|
j.Succeed()
|
|
}
|
|
if auditID != "" {
|
|
_ = pgmonitor.FinishMaintenanceAudit(ctx, w.PgPool, auditID, status, detail, errMsg)
|
|
}
|
|
}
|