mirror of https://github.com/docker/buildx.git
63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
package build
|
|
|
|
import (
|
|
"context"
|
|
stderrors "errors"
|
|
"net"
|
|
|
|
"github.com/containerd/containerd/platforms"
|
|
"github.com/docker/buildx/builder"
|
|
"github.com/docker/buildx/util/progress"
|
|
v1 "github.com/opencontainers/image-spec/specs-go/v1"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
func Dial(ctx context.Context, nodes []builder.Node, pw progress.Writer, platform *v1.Platform) (net.Conn, error) {
|
|
nodes, err := filterAvailableNodes(nodes)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(nodes) == 0 {
|
|
return nil, errors.New("no nodes available")
|
|
}
|
|
|
|
var pls []v1.Platform
|
|
if platform != nil {
|
|
pls = []v1.Platform{*platform}
|
|
}
|
|
|
|
opts := map[string]Options{"default": {Platforms: pls}}
|
|
resolved, err := resolveDrivers(ctx, nodes, opts, pw)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var dialError error
|
|
for _, ls := range resolved {
|
|
for _, rn := range ls {
|
|
if platform != nil {
|
|
p := *platform
|
|
var found bool
|
|
for _, pp := range rn.platforms {
|
|
if platforms.Only(p).Match(pp) {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
continue
|
|
}
|
|
}
|
|
|
|
conn, err := nodes[rn.driverIndex].Driver.Dial(ctx)
|
|
if err == nil {
|
|
return conn, nil
|
|
}
|
|
dialError = stderrors.Join(err)
|
|
}
|
|
}
|
|
|
|
return nil, errors.Wrap(dialError, "no nodes available")
|
|
}
|