From 9d8ac1ce2d2b2258d0c494b2c818f745902d462b Mon Sep 17 00:00:00 2001 From: CrazyMax <1951866+crazy-max@users.noreply.github.com> Date: Mon, 4 Dec 2023 11:27:59 +0100 Subject: [PATCH] build: move solveOpt to local struct type *client.SolveOpt in driver code is only used by build code. For a clear separation of concerns, move it to an internal struct type only accessible by BuildWithResultHandler func. Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com> --- build/build.go | 31 +++++++++++++++++++++---------- build/driver.go | 2 -- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/build/build.go b/build/build.go index 74fe0571..624ceb84 100644 --- a/build/build.go +++ b/build/build.go @@ -118,6 +118,11 @@ type NamedContext struct { State *llb.State } +type reqForNode struct { + *resolvedNode + so *client.SolveOpt +} + func filterAvailableNodes(nodes []builder.Node) ([]builder.Node, error) { out := make([]builder.Node, 0, len(nodes)) err := errors.Errorf("no drivers found") @@ -519,6 +524,7 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s } }() + reqForNodes := make(map[string][]*reqForNode) eg, ctx := errgroup.WithContext(ctx) for k, opt := range opt { @@ -528,6 +534,7 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s if err != nil { logrus.WithError(err).Warn("current commit information was not captured by the build") } + var reqn []*reqForNode for _, np := range drivers[k] { if np.Node().Driver.IsMobyDriver() { hasMobyDriver = true @@ -548,8 +555,12 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s so.FrontendAttrs[k] = v } defers = append(defers, release) - np.SolveOpt = so + reqn = append(reqn, &reqForNode{ + resolvedNode: np, + so: so, + }) } + reqForNodes[k] = reqn for _, at := range opt.Session { if s, ok := at.(interface { SetLogger(progresswriter.Logger) @@ -562,8 +573,8 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s // validate for multi-node push if hasMobyDriver && multiDriver { - for _, np := range drivers[k] { - for _, e := range np.SolveOpt.Exports { + for _, np := range reqForNodes[k] { + for _, e := range np.so.Exports { if e.Type == "moby" { if ok, _ := strconv.ParseBool(e.Attrs["push"]); ok { return nil, errors.Errorf("multi-node push can't currently be performed with the docker driver, please switch to a different driver") @@ -576,9 +587,9 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s // validate that all links between targets use same drivers for name := range opt { - dps := drivers[name] + dps := reqForNodes[name] for i, dp := range dps { - so := drivers[name][i].SolveOpt + so := reqForNodes[name][i].so for k, v := range so.FrontendAttrs { if strings.HasPrefix(k, "context:") && strings.HasPrefix(v, "target:") { k2 := strings.TrimPrefix(v, "target:") @@ -606,7 +617,7 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s results := waitmap.New() multiTarget := len(opt) > 1 - childTargets := calculateChildTargets(drivers, opt) + childTargets := calculateChildTargets(reqForNodes, opt) for k, opt := range opt { err := func(k string) error { @@ -630,7 +641,7 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s for i, dp := range dps { i, dp := i, dp node := dp.Node() - so := drivers[k][i].SolveOpt + so := reqForNodes[k][i].so if multiDriver { for i, e := range so.Exports { switch e.Type { @@ -1299,12 +1310,12 @@ func resultKey(index int, name string) string { } // calculateChildTargets returns all the targets that depend on current target for reverse index -func calculateChildTargets(drivers map[string][]*resolvedNode, opt map[string]Options) map[string][]string { +func calculateChildTargets(reqs map[string][]*reqForNode, opt map[string]Options) map[string][]string { out := make(map[string][]string) for name := range opt { - dps := drivers[name] + dps := reqs[name] for i, dp := range dps { - so := drivers[name][i].SolveOpt + so := reqs[name][i].so for k, v := range so.FrontendAttrs { if strings.HasPrefix(k, "context:") && strings.HasPrefix(v, "target:") { target := resultKey(dp.driverIndex, strings.TrimPrefix(v, "target:")) diff --git a/build/driver.go b/build/driver.go index ef0a4e1e..07f4560b 100644 --- a/build/driver.go +++ b/build/driver.go @@ -19,8 +19,6 @@ import ( ) type resolvedNode struct { - SolveOpt *client.SolveOpt - resolver *nodeResolver driverIndex int platforms []specs.Platform