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) } }