cleanup: split dagger into sub-packages
Signed-off-by: Andrea Luzzardi <aluzzardi@gmail.com>
This commit is contained in:
parent
93d7bb08e5
commit
e13153a284
@ -3,7 +3,9 @@ package common
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"dagger.io/go/dagger"
|
"dagger.io/go/dagger/client"
|
||||||
|
"dagger.io/go/dagger/environment"
|
||||||
|
"dagger.io/go/dagger/solver"
|
||||||
"dagger.io/go/dagger/state"
|
"dagger.io/go/dagger/state"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
@ -79,14 +81,14 @@ func CurrentEnvironmentState(ctx context.Context, workspace *state.Workspace) *s
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Re-compute an environment (equivalent to `dagger up`).
|
// Re-compute an environment (equivalent to `dagger up`).
|
||||||
func EnvironmentUp(ctx context.Context, state *state.State, noCache bool) *dagger.Environment {
|
func EnvironmentUp(ctx context.Context, state *state.State, noCache bool) *environment.Environment {
|
||||||
lg := log.Ctx(ctx)
|
lg := log.Ctx(ctx)
|
||||||
|
|
||||||
c, err := dagger.NewClient(ctx, "", noCache)
|
c, err := client.New(ctx, "", noCache)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
lg.Fatal().Err(err).Msg("unable to create client")
|
lg.Fatal().Err(err).Msg("unable to create client")
|
||||||
}
|
}
|
||||||
result, err := c.Do(ctx, state, func(ctx context.Context, environment *dagger.Environment, s dagger.Solver) error {
|
result, err := c.Do(ctx, state, func(ctx context.Context, environment *environment.Environment, s solver.Solver) error {
|
||||||
log.Ctx(ctx).Debug().Msg("bringing environment up")
|
log.Ctx(ctx).Debug().Msg("bringing environment up")
|
||||||
return environment.Up(ctx, s)
|
return environment.Up(ctx, s)
|
||||||
})
|
})
|
||||||
|
@ -8,8 +8,10 @@ import (
|
|||||||
|
|
||||||
"dagger.io/go/cmd/dagger/cmd/common"
|
"dagger.io/go/cmd/dagger/cmd/common"
|
||||||
"dagger.io/go/cmd/dagger/logger"
|
"dagger.io/go/cmd/dagger/logger"
|
||||||
"dagger.io/go/dagger"
|
"dagger.io/go/dagger/client"
|
||||||
"dagger.io/go/dagger/compiler"
|
"dagger.io/go/dagger/compiler"
|
||||||
|
"dagger.io/go/dagger/environment"
|
||||||
|
"dagger.io/go/dagger/solver"
|
||||||
"dagger.io/go/dagger/state"
|
"dagger.io/go/dagger/state"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -32,19 +34,19 @@ var listCmd = &cobra.Command{
|
|||||||
ctx := lg.WithContext(cmd.Context())
|
ctx := lg.WithContext(cmd.Context())
|
||||||
|
|
||||||
workspace := common.CurrentWorkspace(ctx)
|
workspace := common.CurrentWorkspace(ctx)
|
||||||
environment := common.CurrentEnvironmentState(ctx, workspace)
|
st := common.CurrentEnvironmentState(ctx, workspace)
|
||||||
|
|
||||||
lg = lg.With().
|
lg = lg.With().
|
||||||
Str("environment", environment.Name).
|
Str("environment", st.Name).
|
||||||
Logger()
|
Logger()
|
||||||
|
|
||||||
c, err := dagger.NewClient(ctx, "", false)
|
c, err := client.New(ctx, "", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
lg.Fatal().Err(err).Msg("unable to create client")
|
lg.Fatal().Err(err).Msg("unable to create client")
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = c.Do(ctx, environment, func(lCtx context.Context, lDeploy *dagger.Environment, lSolver dagger.Solver) error {
|
_, err = c.Do(ctx, st, func(ctx context.Context, env *environment.Environment, s solver.Solver) error {
|
||||||
inputs := lDeploy.ScanInputs(ctx)
|
inputs := env.ScanInputs(ctx)
|
||||||
|
|
||||||
w := tabwriter.NewWriter(os.Stdout, 0, 4, 2, ' ', 0)
|
w := tabwriter.NewWriter(os.Stdout, 0, 4, 2, ' ', 0)
|
||||||
fmt.Fprintln(w, "Input\tType\tValue\tSet by user")
|
fmt.Fprintln(w, "Input\tType\tValue\tSet by user")
|
||||||
@ -71,7 +73,7 @@ var listCmd = &cobra.Command{
|
|||||||
inp.Path(),
|
inp.Path(),
|
||||||
getType(inp),
|
getType(inp),
|
||||||
valStr,
|
valStr,
|
||||||
isUserSet(environment, inp),
|
isUserSet(st, inp),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ import (
|
|||||||
"cuelang.org/go/cue"
|
"cuelang.org/go/cue"
|
||||||
"dagger.io/go/cmd/dagger/cmd/common"
|
"dagger.io/go/cmd/dagger/cmd/common"
|
||||||
"dagger.io/go/cmd/dagger/logger"
|
"dagger.io/go/cmd/dagger/logger"
|
||||||
"dagger.io/go/dagger"
|
"dagger.io/go/dagger/client"
|
||||||
"dagger.io/go/dagger/compiler"
|
"dagger.io/go/dagger/compiler"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@ -42,7 +42,7 @@ var queryCmd = &cobra.Command{
|
|||||||
cuePath = cue.ParsePath(args[0])
|
cuePath = cue.ParsePath(args[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
c, err := dagger.NewClient(ctx, "", false)
|
c, err := client.New(ctx, "", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
lg.Fatal().Err(err).Msg("unable to create client")
|
lg.Fatal().Err(err).Msg("unable to create client")
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
package dagger
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -26,6 +27,8 @@ import (
|
|||||||
"dagger.io/go/pkg/progressui"
|
"dagger.io/go/pkg/progressui"
|
||||||
|
|
||||||
"dagger.io/go/dagger/compiler"
|
"dagger.io/go/dagger/compiler"
|
||||||
|
"dagger.io/go/dagger/environment"
|
||||||
|
"dagger.io/go/dagger/solver"
|
||||||
"dagger.io/go/dagger/state"
|
"dagger.io/go/dagger/state"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -35,7 +38,7 @@ type Client struct {
|
|||||||
noCache bool
|
noCache bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewClient(ctx context.Context, host string, noCache bool) (*Client, error) {
|
func New(ctx context.Context, host string, noCache bool) (*Client, error) {
|
||||||
if host == "" {
|
if host == "" {
|
||||||
host = os.Getenv("BUILDKIT_HOST")
|
host = os.Getenv("BUILDKIT_HOST")
|
||||||
}
|
}
|
||||||
@ -61,14 +64,14 @@ func NewClient(ctx context.Context, host string, noCache bool) (*Client, error)
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type ClientDoFunc func(context.Context, *Environment, Solver) error
|
type ClientDoFunc func(context.Context, *environment.Environment, solver.Solver) error
|
||||||
|
|
||||||
// FIXME: return completed *Route, instead of *compiler.Value
|
// FIXME: return completed *Route, instead of *compiler.Value
|
||||||
func (c *Client) Do(ctx context.Context, state *state.State, fn ClientDoFunc) (*Environment, error) {
|
func (c *Client) Do(ctx context.Context, state *state.State, fn ClientDoFunc) (*environment.Environment, error) {
|
||||||
lg := log.Ctx(ctx)
|
lg := log.Ctx(ctx)
|
||||||
eg, gctx := errgroup.WithContext(ctx)
|
eg, gctx := errgroup.WithContext(ctx)
|
||||||
|
|
||||||
environment, err := NewEnvironment(state)
|
environment, err := environment.New(state)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -90,11 +93,11 @@ func (c *Client) Do(ctx context.Context, state *state.State, fn ClientDoFunc) (*
|
|||||||
return environment, eg.Wait()
|
return environment, eg.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) buildfn(ctx context.Context, environment *Environment, fn ClientDoFunc, ch chan *bk.SolveStatus) error {
|
func (c *Client) buildfn(ctx context.Context, env *environment.Environment, fn ClientDoFunc, ch chan *bk.SolveStatus) error {
|
||||||
lg := log.Ctx(ctx)
|
lg := log.Ctx(ctx)
|
||||||
|
|
||||||
// Scan local dirs to grant access
|
// Scan local dirs to grant access
|
||||||
localdirs := environment.LocalDirs()
|
localdirs := env.LocalDirs()
|
||||||
for label, dir := range localdirs {
|
for label, dir := range localdirs {
|
||||||
abs, err := filepath.Abs(dir)
|
abs, err := filepath.Abs(dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -104,7 +107,7 @@ func (c *Client) buildfn(ctx context.Context, environment *Environment, fn Clien
|
|||||||
}
|
}
|
||||||
|
|
||||||
// buildkit auth provider (registry)
|
// buildkit auth provider (registry)
|
||||||
auth := newRegistryAuthProvider()
|
auth := solver.NewRegistryAuthProvider()
|
||||||
|
|
||||||
// Setup solve options
|
// Setup solve options
|
||||||
opts := bk.SolveOpt{
|
opts := bk.SolveOpt{
|
||||||
@ -119,16 +122,22 @@ func (c *Client) buildfn(ctx context.Context, environment *Environment, fn Clien
|
|||||||
Msg("spawning buildkit job")
|
Msg("spawning buildkit job")
|
||||||
|
|
||||||
resp, err := c.c.Build(ctx, opts, "", func(ctx context.Context, gw bkgw.Client) (*bkgw.Result, error) {
|
resp, err := c.c.Build(ctx, opts, "", func(ctx context.Context, gw bkgw.Client) (*bkgw.Result, error) {
|
||||||
s := NewSolver(c.c, gw, ch, auth, c.noCache)
|
s := solver.New(solver.Opts{
|
||||||
|
Control: c.c,
|
||||||
|
Gateway: gw,
|
||||||
|
Events: ch,
|
||||||
|
Auth: auth,
|
||||||
|
NoCache: c.noCache,
|
||||||
|
})
|
||||||
|
|
||||||
lg.Debug().Msg("loading configuration")
|
lg.Debug().Msg("loading configuration")
|
||||||
if err := environment.LoadPlan(ctx, s); err != nil {
|
if err := env.LoadPlan(ctx, s); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute output overlay
|
// Compute output overlay
|
||||||
if fn != nil {
|
if fn != nil {
|
||||||
if err := fn(ctx, environment, s); err != nil {
|
if err := fn(ctx, env, s); err != nil {
|
||||||
return nil, compiler.Err(err)
|
return nil, compiler.Err(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -139,7 +148,7 @@ func (c *Client) buildfn(ctx context.Context, environment *Environment, fn Clien
|
|||||||
span, _ := opentracing.StartSpanFromContext(ctx, "Environment.Export")
|
span, _ := opentracing.StartSpanFromContext(ctx, "Environment.Export")
|
||||||
defer span.Finish()
|
defer span.Finish()
|
||||||
|
|
||||||
computed := environment.Computed().JSON().PrettyString()
|
computed := env.Computed().JSON().PrettyString()
|
||||||
st := llb.
|
st := llb.
|
||||||
Scratch().
|
Scratch().
|
||||||
File(
|
File(
|
||||||
@ -234,3 +243,22 @@ func (c *Client) logSolveStatus(ctx context.Context, ch chan *bk.SolveStatus) er
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A helper to remove noise from buildkit error messages.
|
||||||
|
// FIXME: Obviously a cleaner solution would be nice.
|
||||||
|
func bkCleanError(err error) error {
|
||||||
|
noise := []string{
|
||||||
|
"executor failed running ",
|
||||||
|
"buildkit-runc did not terminate successfully",
|
||||||
|
"rpc error: code = Unknown desc = ",
|
||||||
|
"failed to solve: ",
|
||||||
|
}
|
||||||
|
|
||||||
|
msg := err.Error()
|
||||||
|
|
||||||
|
for _, s := range noise {
|
||||||
|
msg = strings.ReplaceAll(msg, s, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
return errors.New(msg)
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package dagger
|
package environment
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -10,6 +10,7 @@ import (
|
|||||||
"cuelang.org/go/cue"
|
"cuelang.org/go/cue"
|
||||||
cueflow "cuelang.org/go/tools/flow"
|
cueflow "cuelang.org/go/tools/flow"
|
||||||
"dagger.io/go/dagger/compiler"
|
"dagger.io/go/dagger/compiler"
|
||||||
|
"dagger.io/go/dagger/solver"
|
||||||
"dagger.io/go/dagger/state"
|
"dagger.io/go/dagger/state"
|
||||||
"dagger.io/go/stdlib"
|
"dagger.io/go/stdlib"
|
||||||
|
|
||||||
@ -32,7 +33,7 @@ type Environment struct {
|
|||||||
computed *compiler.Value
|
computed *compiler.Value
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewEnvironment(st *state.State) (*Environment, error) {
|
func New(st *state.State) (*Environment, error) {
|
||||||
e := &Environment{
|
e := &Environment{
|
||||||
state: st,
|
state: st,
|
||||||
|
|
||||||
@ -81,7 +82,7 @@ func (e *Environment) Computed() *compiler.Value {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// LoadPlan loads the plan
|
// LoadPlan loads the plan
|
||||||
func (e *Environment) LoadPlan(ctx context.Context, s Solver) error {
|
func (e *Environment) LoadPlan(ctx context.Context, s solver.Solver) error {
|
||||||
span, ctx := opentracing.StartSpanFromContext(ctx, "environment.LoadPlan")
|
span, ctx := opentracing.StartSpanFromContext(ctx, "environment.LoadPlan")
|
||||||
defer span.Finish()
|
defer span.Finish()
|
||||||
|
|
||||||
@ -165,7 +166,7 @@ func (e *Environment) LocalDirs() map[string]string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Up missing values in environment configuration, and write them to state.
|
// Up missing values in environment configuration, and write them to state.
|
||||||
func (e *Environment) Up(ctx context.Context, s Solver) error {
|
func (e *Environment) Up(ctx context.Context, s solver.Solver) error {
|
||||||
span, ctx := opentracing.StartSpanFromContext(ctx, "environment.Up")
|
span, ctx := opentracing.StartSpanFromContext(ctx, "environment.Up")
|
||||||
defer span.Finish()
|
defer span.Finish()
|
||||||
|
|
||||||
@ -216,7 +217,7 @@ func noOpRunner(t *cueflow.Task) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func newPipelineRunner(computed *compiler.Value, s Solver) cueflow.RunnerFunc {
|
func newPipelineRunner(computed *compiler.Value, s solver.Solver) cueflow.RunnerFunc {
|
||||||
return cueflow.RunnerFunc(func(t *cueflow.Task) error {
|
return cueflow.RunnerFunc(func(t *cueflow.Task) error {
|
||||||
ctx := t.Context()
|
ctx := t.Context()
|
||||||
lg := log.
|
lg := log.
|
||||||
@ -294,5 +295,5 @@ func newPipelineRunner(computed *compiler.Value, s Solver) cueflow.RunnerFunc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (e *Environment) ScanInputs(ctx context.Context) []*compiler.Value {
|
func (e *Environment) ScanInputs(ctx context.Context) []*compiler.Value {
|
||||||
return ScanInputs(ctx, e.plan)
|
return scanInputs(ctx, e.plan)
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package dagger
|
package environment
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
@ -14,7 +14,7 @@ func TestLocalDirs(t *testing.T) {
|
|||||||
}
|
}
|
||||||
require.NoError(t, st.SetInput("www.source", state.DirInput("/", []string{})))
|
require.NoError(t, st.SetInput("www.source", state.DirInput("/", []string{})))
|
||||||
|
|
||||||
environment, err := NewEnvironment(st)
|
environment, err := New(st)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
localdirs := environment.LocalDirs()
|
localdirs := environment.LocalDirs()
|
@ -1,4 +1,4 @@
|
|||||||
package dagger
|
package environment
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -42,7 +42,7 @@ func isReference(val cue.Value) bool {
|
|||||||
return isRef(val)
|
return isRef(val)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ScanInputs(ctx context.Context, value *compiler.Value) []*compiler.Value {
|
func scanInputs(ctx context.Context, value *compiler.Value) []*compiler.Value {
|
||||||
lg := log.Ctx(ctx)
|
lg := log.Ctx(ctx)
|
||||||
inputs := []*compiler.Value{}
|
inputs := []*compiler.Value{}
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package dagger
|
package environment
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@ -26,6 +26,7 @@ import (
|
|||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
|
|
||||||
"dagger.io/go/dagger/compiler"
|
"dagger.io/go/dagger/compiler"
|
||||||
|
"dagger.io/go/dagger/solver"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -36,14 +37,14 @@ const (
|
|||||||
type Pipeline struct {
|
type Pipeline struct {
|
||||||
code *compiler.Value
|
code *compiler.Value
|
||||||
name string
|
name string
|
||||||
s Solver
|
s solver.Solver
|
||||||
state llb.State
|
state llb.State
|
||||||
result bkgw.Reference
|
result bkgw.Reference
|
||||||
image dockerfile2llb.Image
|
image dockerfile2llb.Image
|
||||||
computed *compiler.Value
|
computed *compiler.Value
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPipeline(code *compiler.Value, s Solver) *Pipeline {
|
func NewPipeline(code *compiler.Value, s solver.Solver) *Pipeline {
|
||||||
return &Pipeline{
|
return &Pipeline{
|
||||||
code: code,
|
code: code,
|
||||||
name: code.Path().String(),
|
name: code.Path().String(),
|
||||||
@ -70,7 +71,7 @@ func (p *Pipeline) Result() (llb.State, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *Pipeline) FS() fs.FS {
|
func (p *Pipeline) FS() fs.FS {
|
||||||
return NewBuildkitFS(p.result)
|
return solver.NewBuildkitFS(p.result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Pipeline) ImageConfig() dockerfile2llb.Image {
|
func (p *Pipeline) ImageConfig() dockerfile2llb.Image {
|
||||||
@ -641,7 +642,7 @@ func (p *Pipeline) DockerLogin(ctx context.Context, op *compiler.Value, st llb.S
|
|||||||
return st, err
|
return st, err
|
||||||
}
|
}
|
||||||
|
|
||||||
p.s.auth.AddCredentials(target, username, secret)
|
p.s.AddCredentials(target, username, secret)
|
||||||
log.
|
log.
|
||||||
Ctx(ctx).
|
Ctx(ctx).
|
||||||
Debug().
|
Debug().
|
||||||
@ -862,7 +863,7 @@ func (p *Pipeline) DockerBuild(ctx context.Context, op *compiler.Value, st llb.S
|
|||||||
return st, err
|
return st, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if p.s.noCache {
|
if p.s.NoCache() {
|
||||||
opts["no-cache"] = ""
|
opts["no-cache"] = ""
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
|||||||
package dagger
|
package solver
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
@ -1,4 +1,4 @@
|
|||||||
package dagger
|
package solver
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -12,20 +12,20 @@ import (
|
|||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
// registryAuthProvider is a buildkit provider for registry authentication
|
// RegistryAuthProvider is a buildkit provider for registry authentication
|
||||||
// Adapted from: https://github.com/moby/buildkit/blob/master/session/auth/authprovider/authprovider.go
|
// Adapted from: https://github.com/moby/buildkit/blob/master/session/auth/authprovider/authprovider.go
|
||||||
type registryAuthProvider struct {
|
type RegistryAuthProvider struct {
|
||||||
credentials map[string]*bkauth.CredentialsResponse
|
credentials map[string]*bkauth.CredentialsResponse
|
||||||
m sync.RWMutex
|
m sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func newRegistryAuthProvider() *registryAuthProvider {
|
func NewRegistryAuthProvider() *RegistryAuthProvider {
|
||||||
return ®istryAuthProvider{
|
return &RegistryAuthProvider{
|
||||||
credentials: map[string]*bkauth.CredentialsResponse{},
|
credentials: map[string]*bkauth.CredentialsResponse{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *registryAuthProvider) AddCredentials(target, username, secret string) {
|
func (a *RegistryAuthProvider) AddCredentials(target, username, secret string) {
|
||||||
a.m.Lock()
|
a.m.Lock()
|
||||||
defer a.m.Unlock()
|
defer a.m.Unlock()
|
||||||
|
|
||||||
@ -35,11 +35,11 @@ func (a *registryAuthProvider) AddCredentials(target, username, secret string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *registryAuthProvider) Register(server *grpc.Server) {
|
func (a *RegistryAuthProvider) Register(server *grpc.Server) {
|
||||||
bkauth.RegisterAuthServer(server, a)
|
bkauth.RegisterAuthServer(server, a)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *registryAuthProvider) Credentials(ctx context.Context, req *bkauth.CredentialsRequest) (*bkauth.CredentialsResponse, error) {
|
func (a *RegistryAuthProvider) Credentials(ctx context.Context, req *bkauth.CredentialsRequest) (*bkauth.CredentialsResponse, error) {
|
||||||
reqURL, err := parseAuthHost(req.Host)
|
reqURL, err := parseAuthHost(req.Host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -73,14 +73,14 @@ func parseAuthHost(host string) (*url.URL, error) {
|
|||||||
return url.Parse(host)
|
return url.Parse(host)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *registryAuthProvider) FetchToken(ctx context.Context, req *bkauth.FetchTokenRequest) (rr *bkauth.FetchTokenResponse, err error) {
|
func (a *RegistryAuthProvider) FetchToken(ctx context.Context, req *bkauth.FetchTokenRequest) (rr *bkauth.FetchTokenResponse, err error) {
|
||||||
return nil, status.Errorf(codes.Unavailable, "client side tokens not implemented")
|
return nil, status.Errorf(codes.Unavailable, "client side tokens not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *registryAuthProvider) GetTokenAuthority(ctx context.Context, req *bkauth.GetTokenAuthorityRequest) (*bkauth.GetTokenAuthorityResponse, error) {
|
func (a *RegistryAuthProvider) GetTokenAuthority(ctx context.Context, req *bkauth.GetTokenAuthorityRequest) (*bkauth.GetTokenAuthorityResponse, error) {
|
||||||
return nil, status.Errorf(codes.Unavailable, "client side tokens not implemented")
|
return nil, status.Errorf(codes.Unavailable, "client side tokens not implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *registryAuthProvider) VerifyTokenAuthority(ctx context.Context, req *bkauth.VerifyTokenAuthorityRequest) (*bkauth.VerifyTokenAuthorityResponse, error) {
|
func (a *RegistryAuthProvider) VerifyTokenAuthority(ctx context.Context, req *bkauth.VerifyTokenAuthorityRequest) (*bkauth.VerifyTokenAuthorityResponse, error) {
|
||||||
return nil, status.Errorf(codes.Unavailable, "client side tokens not implemented")
|
return nil, status.Errorf(codes.Unavailable, "client side tokens not implemented")
|
||||||
}
|
}
|
@ -1,11 +1,9 @@
|
|||||||
package dagger
|
package solver
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
|
|
||||||
bk "github.com/moby/buildkit/client"
|
bk "github.com/moby/buildkit/client"
|
||||||
"github.com/moby/buildkit/client/llb"
|
"github.com/moby/buildkit/client/llb"
|
||||||
@ -19,20 +17,20 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Solver struct {
|
type Solver struct {
|
||||||
events chan *bk.SolveStatus
|
opts Opts
|
||||||
control *bk.Client
|
|
||||||
gw bkgw.Client
|
|
||||||
auth *registryAuthProvider
|
|
||||||
noCache bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSolver(control *bk.Client, gw bkgw.Client, events chan *bk.SolveStatus, auth *registryAuthProvider, noCache bool) Solver {
|
type Opts struct {
|
||||||
|
Control *bk.Client
|
||||||
|
Gateway bkgw.Client
|
||||||
|
Events chan *bk.SolveStatus
|
||||||
|
Auth *RegistryAuthProvider
|
||||||
|
NoCache bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(opts Opts) Solver {
|
||||||
return Solver{
|
return Solver{
|
||||||
events: events,
|
opts: opts,
|
||||||
control: control,
|
|
||||||
gw: gw,
|
|
||||||
auth: auth,
|
|
||||||
noCache: noCache,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,6 +53,14 @@ func invalidateCache(def *llb.Definition) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s Solver) NoCache() bool {
|
||||||
|
return s.opts.NoCache
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s Solver) AddCredentials(target, username, secret string) {
|
||||||
|
s.opts.Auth.AddCredentials(target, username, secret)
|
||||||
|
}
|
||||||
|
|
||||||
func (s Solver) Marshal(ctx context.Context, st llb.State) (*bkpb.Definition, error) {
|
func (s Solver) Marshal(ctx context.Context, st llb.State) (*bkpb.Definition, error) {
|
||||||
// FIXME: do not hardcode the platform
|
// FIXME: do not hardcode the platform
|
||||||
def, err := st.Marshal(ctx, llb.LinuxAmd64)
|
def, err := st.Marshal(ctx, llb.LinuxAmd64)
|
||||||
@ -62,7 +68,7 @@ func (s Solver) Marshal(ctx context.Context, st llb.State) (*bkpb.Definition, er
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if s.noCache {
|
if s.opts.NoCache {
|
||||||
if err := invalidateCache(def); err != nil {
|
if err := invalidateCache(def); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -72,7 +78,7 @@ func (s Solver) Marshal(ctx context.Context, st llb.State) (*bkpb.Definition, er
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s Solver) SessionID() string {
|
func (s Solver) SessionID() string {
|
||||||
return s.gw.BuildOpts().SessionID
|
return s.opts.Gateway.BuildOpts().SessionID
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s Solver) ResolveImageConfig(ctx context.Context, ref string, opts llb.ResolveImageConfigOpt) (dockerfile2llb.Image, error) {
|
func (s Solver) ResolveImageConfig(ctx context.Context, ref string, opts llb.ResolveImageConfigOpt) (dockerfile2llb.Image, error) {
|
||||||
@ -81,7 +87,7 @@ func (s Solver) ResolveImageConfig(ctx context.Context, ref string, opts llb.Res
|
|||||||
// Load image metadata and convert to to LLB.
|
// Load image metadata and convert to to LLB.
|
||||||
// Inspired by https://github.com/moby/buildkit/blob/master/frontend/dockerfile/dockerfile2llb/convert.go
|
// Inspired by https://github.com/moby/buildkit/blob/master/frontend/dockerfile/dockerfile2llb/convert.go
|
||||||
// FIXME: this needs to handle platform
|
// FIXME: this needs to handle platform
|
||||||
_, meta, err := s.gw.ResolveImageConfig(ctx, ref, opts)
|
_, meta, err := s.opts.Gateway.ResolveImageConfig(ctx, ref, opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return image, err
|
return image, err
|
||||||
}
|
}
|
||||||
@ -94,12 +100,7 @@ func (s Solver) ResolveImageConfig(ctx context.Context, ref string, opts llb.Res
|
|||||||
|
|
||||||
// Solve will block until the state is solved and returns a Reference.
|
// Solve will block until the state is solved and returns a Reference.
|
||||||
func (s Solver) SolveRequest(ctx context.Context, req bkgw.SolveRequest) (*bkgw.Result, error) {
|
func (s Solver) SolveRequest(ctx context.Context, req bkgw.SolveRequest) (*bkgw.Result, error) {
|
||||||
// call solve
|
return s.opts.Gateway.Solve(ctx, req)
|
||||||
res, err := s.gw.Solve(ctx, req)
|
|
||||||
if err != nil {
|
|
||||||
return nil, bkCleanError(err)
|
|
||||||
}
|
|
||||||
return res, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Solve will block until the state is solved and returns a Reference.
|
// Solve will block until the state is solved and returns a Reference.
|
||||||
@ -149,7 +150,7 @@ func (s Solver) Export(ctx context.Context, st llb.State, img *dockerfile2llb.Im
|
|||||||
|
|
||||||
opts := bk.SolveOpt{
|
opts := bk.SolveOpt{
|
||||||
Exports: []bk.ExportEntry{output},
|
Exports: []bk.ExportEntry{output},
|
||||||
Session: []session.Attachable{s.auth},
|
Session: []session.Attachable{s.opts.Auth},
|
||||||
}
|
}
|
||||||
|
|
||||||
ch := make(chan *bk.SolveStatus)
|
ch := make(chan *bk.SolveStatus)
|
||||||
@ -158,11 +159,11 @@ func (s Solver) Export(ctx context.Context, st llb.State, img *dockerfile2llb.Im
|
|||||||
// purposes.
|
// purposes.
|
||||||
go func() {
|
go func() {
|
||||||
for event := range ch {
|
for event := range ch {
|
||||||
s.events <- event
|
s.opts.Events <- event
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
return s.control.Build(ctx, opts, "", func(ctx context.Context, c bkgw.Client) (*bkgw.Result, error) {
|
return s.opts.Control.Build(ctx, opts, "", func(ctx context.Context, c bkgw.Client) (*bkgw.Result, error) {
|
||||||
res, err := c.Solve(ctx, bkgw.SolveRequest{
|
res, err := c.Solve(ctx, bkgw.SolveRequest{
|
||||||
Definition: def,
|
Definition: def,
|
||||||
})
|
})
|
||||||
@ -203,22 +204,3 @@ func dumpLLB(def *bkpb.Definition) ([]byte, error) {
|
|||||||
}
|
}
|
||||||
return json.Marshal(ops)
|
return json.Marshal(ops)
|
||||||
}
|
}
|
||||||
|
|
||||||
// A helper to remove noise from buildkit error messages.
|
|
||||||
// FIXME: Obviously a cleaner solution would be nice.
|
|
||||||
func bkCleanError(err error) error {
|
|
||||||
noise := []string{
|
|
||||||
"executor failed running ",
|
|
||||||
"buildkit-runc did not terminate successfully",
|
|
||||||
"rpc error: code = Unknown desc = ",
|
|
||||||
"failed to solve: ",
|
|
||||||
}
|
|
||||||
|
|
||||||
msg := err.Error()
|
|
||||||
|
|
||||||
for _, s := range noise {
|
|
||||||
msg = strings.ReplaceAll(msg, s, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
return errors.New(msg)
|
|
||||||
}
|
|
Reference in New Issue
Block a user