P2R-02 follow-up: Run-now works on disabled schedules with confirm
Surface the Run-now button on every schedule when the host is online,
not just enabled ones. Disabled rows render the button as a non-primary
style + a HX-confirm dialog ("This schedule is paused — running it now
won't change that. Fire it once anyway?"); enabled rows keep the
zero-friction primary button.
Server-side, Run-now no longer short-circuits on !Enabled — it
dispatches the source groups inline rather than via dispatchScheduledJob
(which always bails on disabled schedules, since cron-tick semantics
are different from explicit operator intent). The audit-log entry
inside dispatchBackupForGroup still records every fire.
This commit is contained in:
@@ -301,9 +301,8 @@ func (s *Server) handleUIScheduleRun(w stdhttp.ResponseWriter, r *stdhttp.Reques
|
||||
stdhttp.Error(w, "internal", stdhttp.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
if !sc.Enabled {
|
||||
stdhttp.Error(w, "schedule is paused — enable it first or use per-group Run-now from the Sources tab",
|
||||
stdhttp.StatusConflict)
|
||||
if len(sc.SourceGroupIDs) == 0 {
|
||||
stdhttp.Error(w, "this schedule has no source groups attached", stdhttp.StatusConflict)
|
||||
return
|
||||
}
|
||||
if s.deps.Hub == nil {
|
||||
@@ -316,9 +315,24 @@ func (s *Server) handleUIScheduleRun(w stdhttp.ResponseWriter, r *stdhttp.Reques
|
||||
stdhttp.StatusConflict)
|
||||
return
|
||||
}
|
||||
|
||||
// Manual Run-now ignores Enabled. "Disabled" only suppresses
|
||||
// cron-tick firing; an ad-hoc one-off run is a separate intent
|
||||
// (and the dispatch is audit-logged inside dispatchBackupForGroup).
|
||||
// We dispatch inline rather than calling dispatchScheduledJob,
|
||||
// which short-circuits on !Enabled.
|
||||
ctx, cancel := context.WithTimeout(r.Context(), 10*time.Second)
|
||||
defer cancel()
|
||||
s.dispatchScheduledJob(ctx, host.ID, conn, sid, time.Now().UTC())
|
||||
now := time.Now().UTC()
|
||||
for _, gid := range sc.SourceGroupIDs {
|
||||
g, gerr := s.deps.Store.GetSourceGroup(ctx, host.ID, gid)
|
||||
if gerr != nil {
|
||||
slog.Warn("ui schedule run: load source group",
|
||||
"host_id", host.ID, "schedule_id", sid, "group_id", gid, "err", gerr)
|
||||
continue
|
||||
}
|
||||
s.dispatchBackupForGroup(ctx, conn, host.ID, sid, g, now)
|
||||
}
|
||||
|
||||
if wantsHTML(r) {
|
||||
// HX-Redirect would jump to a single job log, but a multi-group
|
||||
|
||||
Reference in New Issue
Block a user