package worker
import (
"context"
nethttp "net/http"
"github.com/containerd/log"
"github.com/moby/buildkit/client"
bkexporter "github.com/moby/buildkit/exporter"
"github.com/moby/buildkit/session"
"github.com/moby/buildkit/source/http"
"github.com/moby/buildkit/worker/base"
"github.com/moby/moby/v2/daemon/internal/builder-next/exporter"
)
// ContainerdWorker is a local worker instance with dedicated snapshotter, cache, and so on.
type ContainerdWorker struct {
*base.Worker
callbacks exporter.BuildkitCallbacks
}
// NewContainerdWorker instantiates a local worker.
func NewContainerdWorker(ctx context.Context, wo base.WorkerOpt, callbacks exporter.BuildkitCallbacks, rt nethttp.RoundTripper) (*ContainerdWorker, error) {
bw, err := base.NewWorker(ctx, wo)
if err != nil {
return nil, err
}
hs, err := http.NewSource(http.Opt{
CacheAccessor: bw.CacheManager(),
Transport: rt,
})
if err == nil {
bw.SourceManager.Register(hs)
} else {
log.G(ctx).Warnf("Could not register builder http source: %s", err)
}
return &ContainerdWorker{Worker: bw, callbacks: callbacks}, nil
}
// Exporter returns exporter by name
func (w *ContainerdWorker) Exporter(name string, sm *session.Manager) (bkexporter.Exporter, error) {
switch name {
case exporter.Moby:
exp, err := w.Worker.Exporter(client.ExporterImage, sm)
if err != nil {
return nil, err
}
return exporter.NewWrapper(exp, w.ContentStore(), w.callbacks)
default:
return w.Worker.Exporter(name, sm)
}
}