spindle: improve status reporting around failures #255

merged
opened by oppi.li targeting master from push-mwkwusmyymno
Changed files
+48 -17
knotserver
spindle
db
engine
models
+5
knotserver/internal.go
···
return err
}
+
// do not run empty pipelines
+
if cp.Workflows == nil {
+
return nil
+
}
+
event := db.Event{
Rkey: TID(),
Nsid: tangled.PipelineNSID,
+5 -16
spindle/db/events.go
···
return d.InsertEvent(event, n)
}
-
type StatusKind string
-
-
var (
-
StatusKindPending StatusKind = "pending"
-
StatusKindRunning StatusKind = "running"
-
StatusKindFailed StatusKind = "failed"
-
StatusKindTimeout StatusKind = "timeout"
-
StatusKindCancelled StatusKind = "cancelled"
-
StatusKindSuccess StatusKind = "success"
-
)
-
func (d *DB) createStatusEvent(
workflowId models.WorkflowId,
-
statusKind StatusKind,
+
statusKind models.StatusKind,
workflowError *string,
exitCode *int64,
n *notifier.Notifier,
···
}
func (d *DB) StatusPending(workflowId models.WorkflowId, n *notifier.Notifier) error {
-
return d.createStatusEvent(workflowId, StatusKindPending, nil, nil, n)
+
return d.createStatusEvent(workflowId, models.StatusKindPending, nil, nil, n)
}
func (d *DB) StatusRunning(workflowId models.WorkflowId, n *notifier.Notifier) error {
-
return d.createStatusEvent(workflowId, StatusKindRunning, nil, nil, n)
+
return d.createStatusEvent(workflowId, models.StatusKindRunning, nil, nil, n)
}
func (d *DB) StatusFailed(workflowId models.WorkflowId, workflowError string, exitCode int64, n *notifier.Notifier) error {
-
return d.createStatusEvent(workflowId, StatusKindFailed, &workflowError, &exitCode, n)
+
return d.createStatusEvent(workflowId, models.StatusKindFailed, &workflowError, &exitCode, n)
}
func (d *DB) StatusSuccess(workflowId models.WorkflowId, n *notifier.Notifier) error {
-
return d.createStatusEvent(workflowId, StatusKindSuccess, nil, nil, n)
+
return d.createStatusEvent(workflowId, models.StatusKindSuccess, nil, nil, n)
}
+3 -1
spindle/engine/engine.go
···
if err != nil {
return err
}
+
+
return fmt.Errorf("starting steps image: %w", err)
}
err = e.db.StatusSuccess(wid, e.n)
···
if state.ExitCode != 0 {
e.l.Error("workflow failed!", "workflow_id", wid.String(), "error", state.Error, "exit_code", state.ExitCode)
-
// return e.db.MarkPipelineFailed(id, state.ExitCode, state.Error, e.n)
+
return fmt.Errorf("%s", state.Error)
}
}
+35
spindle/models/models.go
···
import (
"fmt"
"regexp"
+
"slices"
"tangled.sh/tangled.sh/core/api/tangled"
···
normalized := re.ReplaceAllString(name, "-")
return normalized
}
+
+
type StatusKind string
+
+
var (
+
StatusKindPending StatusKind = "pending"
+
StatusKindRunning StatusKind = "running"
+
StatusKindFailed StatusKind = "failed"
+
StatusKindTimeout StatusKind = "timeout"
+
StatusKindCancelled StatusKind = "cancelled"
+
StatusKindSuccess StatusKind = "success"
+
+
StartStates [2]StatusKind = [2]StatusKind{
+
StatusKindPending,
+
StatusKindRunning,
+
}
+
FinishStates [4]StatusKind = [4]StatusKind{
+
StatusKindCancelled,
+
StatusKindFailed,
+
StatusKindSuccess,
+
StatusKindTimeout,
+
}
+
)
+
+
func (s StatusKind) String() string {
+
return string(s)
+
}
+
+
func (s StatusKind) IsStart() bool {
+
return slices.Contains(StartStates[:], s)
+
}
+
+
func (s StatusKind) IsFinish() bool {
+
return slices.Contains(FinishStates[:], s)
+
}