forked from tangled.org/core
Monorepo for Tangled — https://tangled.org

spindle/{db,engine}: propagate a notifier

Signed-off-by: Anirudh Oppiliappan <anirudh@tangled.sh>

anirudh.fi 55bf8204 8dbf6ee8

verified
Changed files
+12 -10
spindle
+11 -9
spindle/engine/engine.go
···
"github.com/docker/docker/pkg/stdcopy"
"golang.org/x/sync/errgroup"
"tangled.sh/tangled.sh/core/api/tangled"
"tangled.sh/tangled.sh/core/log"
"tangled.sh/tangled.sh/core/spindle/db"
)
···
docker client.APIClient
l *slog.Logger
db *db.DB
}
-
func New(ctx context.Context, db *db.DB) (*Engine, error) {
dcli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
return nil, err
···
l := log.FromContext(ctx).With("component", "spindle")
-
return &Engine{docker: dcli, l: l, db: db}, nil
}
// SetupPipeline sets up a new network for the pipeline, and possibly volumes etc.
···
return err
}
-
err = e.db.CreatePipeline(id)
return err
}
func (e *Engine) StartWorkflows(ctx context.Context, pipeline *tangled.Pipeline, id string) error {
e.l.Info("starting all workflows in parallel", "pipeline", id)
-
err := e.db.MarkPipelineRunning(id)
if err != nil {
return err
}
···
reader, err := e.docker.ImagePull(ctx, cimg, image.PullOptions{})
if err != nil {
e.l.Error("pipeline failed!", "id", id, "error", err.Error())
-
err := e.db.MarkPipelineFailed(id, -1, err.Error())
if err != nil {
return err
}
···
err = e.StartSteps(ctx, w.Steps, id, cimg)
if err != nil {
e.l.Error("pipeline failed!", "id", id, "error", err.Error())
-
return e.db.MarkPipelineFailed(id, -1, err.Error())
}
return nil
···
err = g.Wait()
if err != nil {
e.l.Error("pipeline failed!", "id", id, "error", err.Error())
-
return e.db.MarkPipelineFailed(id, -1, err.Error())
}
e.l.Info("pipeline success!", "id", id)
-
return e.db.MarkPipelineSuccess(id)
}
// StartSteps starts all steps sequentially with the same base image.
···
if state.ExitCode != 0 {
e.l.Error("pipeline failed!", "id", id, "error", state.Error, "exit_code", state.ExitCode)
-
return e.db.MarkPipelineFailed(id, state.ExitCode, state.Error)
}
}
···
"github.com/docker/docker/pkg/stdcopy"
"golang.org/x/sync/errgroup"
"tangled.sh/tangled.sh/core/api/tangled"
+
"tangled.sh/tangled.sh/core/knotserver/notifier"
"tangled.sh/tangled.sh/core/log"
"tangled.sh/tangled.sh/core/spindle/db"
)
···
docker client.APIClient
l *slog.Logger
db *db.DB
+
n *notifier.Notifier
}
+
func New(ctx context.Context, db *db.DB, n *notifier.Notifier) (*Engine, error) {
dcli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
return nil, err
···
l := log.FromContext(ctx).With("component", "spindle")
+
return &Engine{docker: dcli, l: l, db: db, n: n}, nil
}
// SetupPipeline sets up a new network for the pipeline, and possibly volumes etc.
···
return err
}
+
err = e.db.CreatePipeline(id, e.n)
return err
}
func (e *Engine) StartWorkflows(ctx context.Context, pipeline *tangled.Pipeline, id string) error {
e.l.Info("starting all workflows in parallel", "pipeline", id)
+
err := e.db.MarkPipelineRunning(id, e.n)
if err != nil {
return err
}
···
reader, err := e.docker.ImagePull(ctx, cimg, image.PullOptions{})
if err != nil {
e.l.Error("pipeline failed!", "id", id, "error", err.Error())
+
err := e.db.MarkPipelineFailed(id, -1, err.Error(), e.n)
if err != nil {
return err
}
···
err = e.StartSteps(ctx, w.Steps, id, cimg)
if err != nil {
e.l.Error("pipeline failed!", "id", id, "error", err.Error())
+
return e.db.MarkPipelineFailed(id, -1, err.Error(), e.n)
}
return nil
···
err = g.Wait()
if err != nil {
e.l.Error("pipeline failed!", "id", id, "error", err.Error())
+
return e.db.MarkPipelineFailed(id, -1, err.Error(), e.n)
}
e.l.Info("pipeline success!", "id", id)
+
return e.db.MarkPipelineSuccess(id, e.n)
}
// StartSteps starts all steps sequentially with the same base image.
···
if state.ExitCode != 0 {
e.l.Error("pipeline failed!", "id", id, "error", state.Error, "exit_code", state.ExitCode)
+
return e.db.MarkPipelineFailed(id, state.ExitCode, state.Error, e.n)
}
}
+1 -1
spindle/server.go
···
n := notifier.New()
-
eng, err := engine.New(ctx, d)
if err != nil {
return err
}
···
n := notifier.New()
+
eng, err := engine.New(ctx, d, &n)
if err != nil {
return err
}