diff --git a/build/build.go b/build/build.go index a0e2974d..c42586d2 100644 --- a/build/build.go +++ b/build/build.go @@ -112,23 +112,6 @@ type NamedContext struct { State *llb.State } -func filterAvailableNodes(nodes []builder.Node) ([]builder.Node, error) { - out := make([]builder.Node, 0, len(nodes)) - err := errors.Errorf("no drivers found") - for _, n := range nodes { - if n.Err == nil && n.Driver != nil { - out = append(out, n) - } - if n.Err != nil { - err = n.Err - } - } - if len(out) > 0 { - return out, nil - } - return nil, err -} - type driverPair struct { driverIndex int platforms []specs.Platform @@ -802,11 +785,6 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s return nil, errors.Errorf("driver required for build") } - nodes, err = filterAvailableNodes(nodes) - if err != nil { - return nil, errors.Wrapf(err, "no valid drivers found") - } - var noMobyDriver driver.Driver for _, n := range nodes { if !n.Driver.IsMobyDriver() { diff --git a/builder/node.go b/builder/node.go index f565738d..3b1393e4 100644 --- a/builder/node.go +++ b/builder/node.go @@ -34,6 +34,24 @@ func (b *Builder) Nodes() []Node { return b.nodes } +// AvailableNodes returns only nodes that are available. +func (b *Builder) AvailableNodes() ([]Node, error) { + out := make([]Node, 0, len(b.nodes)) + err := errors.Errorf("no drivers found") + for _, n := range b.nodes { + if n.Err == nil && n.Driver != nil { + out = append(out, n) + } + if n.Err != nil { + err = n.Err + } + } + if len(out) > 0 { + return out, nil + } + return nil, err +} + // LoadNodes loads and returns nodes for this builder. // TODO: this should be a method on a Node object and lazy load data for each driver. func (b *Builder) LoadNodes(ctx context.Context, withData bool) (_ []Node, err error) { @@ -163,6 +181,15 @@ func (b *Builder) LoadNodes(ctx context.Context, withData bool) (_ []Node, err e return b.nodes, nil } +func (b *Builder) LoadAvailableNodes(ctx context.Context, withData bool) (_ []Node, err error) { + _, err = b.LoadNodes(ctx, withData) + if err != nil { + return nil, err + } + + return b.AvailableNodes() +} + func (n *Node) loadData(ctx context.Context) error { if n.Driver == nil { return nil diff --git a/commands/bake.go b/commands/bake.go index e36d36b9..2eccb111 100644 --- a/commands/bake.go +++ b/commands/bake.go @@ -114,7 +114,7 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions) (err error if err = updateLastActivity(dockerCli, b.NodeGroup); err != nil { return errors.Wrapf(err, "failed to update builder last activity time") } - nodes, err = b.LoadNodes(ctx, false) + nodes, err = b.LoadAvailableNodes(ctx, false) if err != nil { return err } diff --git a/commands/build.go b/commands/build.go index e8e3c231..99e820e3 100644 --- a/commands/build.go +++ b/commands/build.go @@ -266,7 +266,7 @@ func runBuild(dockerCli command.Cli, in buildOptions) (err error) { if err = updateLastActivity(dockerCli, b.NodeGroup); err != nil { return errors.Wrapf(err, "failed to update builder last activity time") } - nodes, err := b.LoadNodes(ctx, false) + nodes, err := b.LoadAvailableNodes(ctx, false) if err != nil { return err } diff --git a/commands/diskusage.go b/commands/diskusage.go index d4bd7dda..7dd8b4f1 100644 --- a/commands/diskusage.go +++ b/commands/diskusage.go @@ -38,15 +38,10 @@ func runDiskUsage(dockerCli command.Cli, opts duOptions) error { return err } - nodes, err := b.LoadNodes(ctx, false) + nodes, err := b.LoadAvailableNodes(ctx, false) if err != nil { return err } - for _, node := range nodes { - if node.Err != nil { - return node.Err - } - } out := make([][]*client.UsageInfo, len(nodes)) diff --git a/commands/prune.go b/commands/prune.go index 653ffd84..697bfbe5 100644 --- a/commands/prune.go +++ b/commands/prune.go @@ -59,15 +59,10 @@ func runPrune(dockerCli command.Cli, opts pruneOptions) error { return err } - nodes, err := b.LoadNodes(ctx, false) + nodes, err := b.LoadAvailableNodes(ctx, false) if err != nil { return err } - for _, node := range nodes { - if node.Err != nil { - return node.Err - } - } ch := make(chan client.UsageInfo) printed := make(chan struct{})