Skip to content

Commit 6a0f561

Browse files
committed
controller: remove the controller interface
The controller interface is removed and the local controller is used for only the initial build, invoke, and rebuilds. Process control has been moved to the monitor. Signed-off-by: Jonathan A. Sternberg <[email protected]>
1 parent e78aa98 commit 6a0f561

File tree

7 files changed

+94
-121
lines changed

7 files changed

+94
-121
lines changed

commands/build.go

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,9 @@ import (
2121
"github.com/docker/buildx/build"
2222
"github.com/docker/buildx/builder"
2323
"github.com/docker/buildx/commands/debug"
24-
"github.com/docker/buildx/controller"
2524
cbuild "github.com/docker/buildx/controller/build"
26-
"github.com/docker/buildx/controller/control"
2725
controllererrors "github.com/docker/buildx/controller/errdefs"
26+
"github.com/docker/buildx/controller/local"
2827
controllerapi "github.com/docker/buildx/controller/pb"
2928
"github.com/docker/buildx/monitor"
3029
"github.com/docker/buildx/store"
@@ -431,28 +430,19 @@ func runControllerBuild(ctx context.Context, dockerCli command.Cli, opts *cbuild
431430
// stdin must be usable for monitor
432431
return nil, nil, errors.Errorf("Dockerfile or context from stdin is not supported with invoke")
433432
}
434-
c := controller.NewController(ctx, dockerCli)
435-
defer func() {
436-
if err := c.Close(); err != nil {
437-
logrus.Warnf("failed to close server connection %v", err)
438-
}
439-
}()
440433

441-
// NOTE: buildx server has the current working directory different from the client
442-
// so we need to resolve paths to abosolute ones in the client.
443-
opts, err := cbuild.ResolveOptionPaths(opts)
444-
if err != nil {
445-
return nil, nil, err
446-
}
434+
c := local.NewController(ctx, dockerCli)
435+
defer c.Close()
447436

448-
var ref string
449-
var retErr error
450-
var resp *client.SolveResponse
451-
var inputs *build.Inputs
437+
var (
438+
ref string
439+
retErr error
440+
441+
f *ioset.SingleForwarder
442+
pr io.ReadCloser
443+
pw io.WriteCloser
444+
)
452445

453-
var f *ioset.SingleForwarder
454-
var pr io.ReadCloser
455-
var pw io.WriteCloser
456446
if options.invokeConfig == nil {
457447
pr = dockerCli.In()
458448
} else {
@@ -466,7 +456,7 @@ func runControllerBuild(ctx context.Context, dockerCli command.Cli, opts *cbuild
466456
})
467457
}
468458

469-
resp, inputs, err = c.Build(ctx, opts, pr, printer)
459+
resp, inputs, err := c.Build(ctx, opts, pr, printer)
470460
if err != nil {
471461
var be *controllererrors.BuildError
472462
if errors.As(err, &be) {
@@ -508,10 +498,6 @@ func runControllerBuild(ctx context.Context, dockerCli command.Cli, opts *cbuild
508498
// Update return values with the last build result from monitor
509499
resp, retErr = monitorBuildResult.Resp, monitorBuildResult.Err
510500
}
511-
} else {
512-
if err := c.Close(); err != nil {
513-
logrus.Warnf("close error: %v", err)
514-
}
515501
}
516502

517503
return resp, inputs, retErr
@@ -1003,13 +989,9 @@ func (cfg *invokeConfig) needsDebug(retErr error) bool {
1003989
}
1004990
}
1005991

1006-
func (cfg *invokeConfig) runDebug(ctx context.Context, ref string, options *cbuild.Options, c control.BuildxController, stdin io.ReadCloser, stdout io.WriteCloser, stderr console.File, progress *progress.Printer) (*monitor.MonitorBuildResult, error) {
992+
func (cfg *invokeConfig) runDebug(ctx context.Context, ref string, options *cbuild.Options, c *local.Controller, stdin io.ReadCloser, stdout io.WriteCloser, stderr console.File, progress *progress.Printer) (*monitor.MonitorBuildResult, error) {
1007993
con := console.Current()
1008994
if err := con.SetRaw(); err != nil {
1009-
// TODO: run disconnect in build command (on error case)
1010-
if err := c.Close(); err != nil {
1011-
logrus.Warnf("close error: %v", err)
1012-
}
1013995
return nil, errors.Errorf("failed to configure terminal: %v", err)
1014996
}
1015997
defer con.Reset()

commands/debug/root.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,14 @@ import (
55
"os"
66

77
"github.com/containerd/console"
8-
"github.com/docker/buildx/controller"
8+
"github.com/docker/buildx/controller/local"
99
controllerapi "github.com/docker/buildx/controller/pb"
1010
"github.com/docker/buildx/monitor"
1111
"github.com/docker/buildx/util/cobrautil"
1212
"github.com/docker/buildx/util/progress"
1313
"github.com/docker/cli/cli/command"
1414
"github.com/moby/buildkit/util/progress/progressui"
1515
"github.com/pkg/errors"
16-
"github.com/sirupsen/logrus"
1716
"github.com/spf13/cobra"
1817
)
1918

@@ -47,12 +46,8 @@ func RootCmd(dockerCli command.Cli, children ...DebuggableCmd) *cobra.Command {
4746
}
4847

4948
ctx := context.TODO()
50-
c := controller.NewController(ctx, dockerCli)
51-
defer func() {
52-
if err := c.Close(); err != nil {
53-
logrus.Warnf("failed to close server connection %v", err)
54-
}
55-
}()
49+
c := local.NewController(ctx, dockerCli)
50+
5651
con := console.Current()
5752
if err := con.SetRaw(); err != nil {
5853
return errors.Errorf("failed to configure terminal: %v", err)

controller/control/controller.go

Lines changed: 0 additions & 26 deletions
This file was deleted.

controller/controller.go

Lines changed: 0 additions & 13 deletions
This file was deleted.

controller/local/controller.go

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77

88
"github.com/docker/buildx/build"
99
cbuild "github.com/docker/buildx/controller/build"
10-
"github.com/docker/buildx/controller/control"
1110
controllererrors "github.com/docker/buildx/controller/errdefs"
1211
controllerapi "github.com/docker/buildx/controller/pb"
1312
"github.com/docker/buildx/controller/processes"
@@ -18,10 +17,9 @@ import (
1817
"github.com/pkg/errors"
1918
)
2019

21-
func NewLocalBuildxController(ctx context.Context, dockerCli command.Cli) control.BuildxController {
22-
return &localController{
20+
func NewController(ctx context.Context, dockerCli command.Cli) *Controller {
21+
return &Controller{
2322
dockerCli: dockerCli,
24-
processes: processes.NewManager(),
2523
}
2624
}
2725

@@ -32,15 +30,14 @@ type buildConfig struct {
3230
buildOptions *cbuild.Options
3331
}
3432

35-
type localController struct {
33+
type Controller struct {
3634
dockerCli command.Cli
3735
buildConfig buildConfig
38-
processes *processes.Manager
3936

4037
buildOnGoing atomic.Bool
4138
}
4239

43-
func (b *localController) Build(ctx context.Context, options *cbuild.Options, in io.ReadCloser, progress progress.Writer) (*client.SolveResponse, *build.Inputs, error) {
40+
func (b *Controller) Build(ctx context.Context, options *cbuild.Options, in io.ReadCloser, progress progress.Writer) (*client.SolveResponse, *build.Inputs, error) {
4441
if !b.buildOnGoing.CompareAndSwap(false, true) {
4542
return nil, nil, errors.New("build ongoing")
4643
}
@@ -63,27 +60,15 @@ func (b *localController) Build(ctx context.Context, options *cbuild.Options, in
6360
return resp, dockerfileMappings, nil
6461
}
6562

66-
func (b *localController) ListProcesses(ctx context.Context) (infos []*processes.ProcessInfo, retErr error) {
67-
return b.processes.ListProcesses(), nil
68-
}
69-
70-
func (b *localController) DisconnectProcess(ctx context.Context, pid string) error {
71-
return b.processes.DeleteProcess(pid)
72-
}
73-
74-
func (b *localController) cancelRunningProcesses() {
75-
b.processes.CancelRunningProcesses()
76-
}
77-
78-
func (b *localController) Invoke(ctx context.Context, pid string, cfg *controllerapi.InvokeConfig, ioIn io.ReadCloser, ioOut io.WriteCloser, ioErr io.WriteCloser) error {
79-
proc, ok := b.processes.Get(pid)
63+
func (b *Controller) Invoke(ctx context.Context, processes *processes.Manager, pid string, cfg *controllerapi.InvokeConfig, ioIn io.ReadCloser, ioOut io.WriteCloser, ioErr io.WriteCloser) error {
64+
proc, ok := processes.Get(pid)
8065
if !ok {
8166
// Start a new process.
8267
if b.buildConfig.resultCtx == nil {
8368
return errors.New("no build result is registered")
8469
}
8570
var err error
86-
proc, err = b.processes.StartProcess(pid, b.buildConfig.resultCtx, cfg)
71+
proc, err = processes.StartProcess(pid, b.buildConfig.resultCtx, cfg)
8772
if err != nil {
8873
return err
8974
}
@@ -103,15 +88,13 @@ func (b *localController) Invoke(ctx context.Context, pid string, cfg *controlle
10388
}
10489
}
10590

106-
func (b *localController) Close() error {
107-
b.cancelRunningProcesses()
91+
func (b *Controller) Inspect(ctx context.Context) *cbuild.Options {
92+
return b.buildConfig.buildOptions
93+
}
94+
95+
func (b *Controller) Close() error {
10896
if b.buildConfig.resultCtx != nil {
10997
b.buildConfig.resultCtx.Done()
11098
}
111-
// TODO: cancel ongoing builds?
11299
return nil
113100
}
114-
115-
func (b *localController) Inspect(ctx context.Context) *cbuild.Options {
116-
return b.buildConfig.buildOptions
117-
}

monitor/monitor.go

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ import (
1212
"github.com/containerd/console"
1313
"github.com/docker/buildx/build"
1414
cbuild "github.com/docker/buildx/controller/build"
15-
"github.com/docker/buildx/controller/control"
15+
"github.com/docker/buildx/controller/local"
1616
controllerapi "github.com/docker/buildx/controller/pb"
17+
"github.com/docker/buildx/controller/processes"
1718
"github.com/docker/buildx/monitor/commands"
1819
"github.com/docker/buildx/monitor/types"
1920
"github.com/docker/buildx/util/ioset"
@@ -32,13 +33,7 @@ type MonitorBuildResult struct {
3233
}
3334

3435
// RunMonitor provides an interactive session for running and managing containers via specified IO.
35-
func RunMonitor(ctx context.Context, curRef string, options *cbuild.Options, invokeConfig *controllerapi.InvokeConfig, c control.BuildxController, stdin io.ReadCloser, stdout io.WriteCloser, stderr console.File, progress *progress.Printer) (*MonitorBuildResult, error) {
36-
defer func() {
37-
if err := c.Close(); err != nil {
38-
logrus.Warnf("close error: %v", err)
39-
}
40-
}()
41-
36+
func RunMonitor(ctx context.Context, curRef string, options *cbuild.Options, invokeConfig *controllerapi.InvokeConfig, c *local.Controller, stdin io.ReadCloser, stdout io.WriteCloser, stderr console.File, progress *progress.Printer) (*MonitorBuildResult, error) {
4237
if err := progress.Pause(); err != nil {
4338
return nil, err
4439
}
@@ -70,8 +65,9 @@ func RunMonitor(ctx context.Context, curRef string, options *cbuild.Options, inv
7065
invokeForwarder := ioset.NewForwarder()
7166
invokeForwarder.SetIn(&containerIn)
7267
m := &monitor{
73-
BuildxController: c,
74-
invokeIO: invokeForwarder,
68+
c: c,
69+
processes: processes.NewManager(),
70+
invokeIO: invokeForwarder,
7571
muxIO: ioset.NewMuxIO(ioset.In{
7672
Stdin: io.NopCloser(stdin),
7773
Stdout: nopCloser{stdout},
@@ -84,6 +80,12 @@ func RunMonitor(ctx context.Context, curRef string, options *cbuild.Options, inv
8480
return "Switched IO\n"
8581
}),
8682
}
83+
84+
defer func() {
85+
if err := m.Close(); err != nil {
86+
logrus.Warnf("close error: %v", err)
87+
}
88+
}()
8789
m.ref.Store(curRef)
8890

8991
// Start container automatically
@@ -231,7 +233,7 @@ type readWriter struct {
231233
}
232234

233235
type monitor struct {
234-
control.BuildxController
236+
c *local.Controller
235237
ref atomic.Value
236238

237239
muxIO *ioset.MuxIO
@@ -240,14 +242,24 @@ type monitor struct {
240242
attachedPid atomic.Value
241243

242244
lastBuildResult *MonitorBuildResult
245+
246+
processes *processes.Manager
243247
}
244248

245249
func (m *monitor) Build(ctx context.Context, options *cbuild.Options, in io.ReadCloser, progress progress.Writer) (resp *client.SolveResponse, input *build.Inputs, err error) {
246-
resp, _, err = m.BuildxController.Build(ctx, options, in, progress)
250+
resp, _, err = m.c.Build(ctx, options, in, progress)
247251
m.lastBuildResult = &MonitorBuildResult{Resp: resp, Err: err} // Record build result
248252
return
249253
}
250254

255+
func (m *monitor) Invoke(ctx context.Context, pid string, cfg *controllerapi.InvokeConfig, ioIn io.ReadCloser, ioOut io.WriteCloser, ioErr io.WriteCloser) error {
256+
return m.c.Invoke(ctx, m.processes, pid, cfg, ioIn, ioOut, ioErr)
257+
}
258+
259+
func (m *monitor) Inspect(ctx context.Context) *cbuild.Options {
260+
return m.c.Inspect(ctx)
261+
}
262+
251263
func (m *monitor) Rollback(ctx context.Context, cfg *controllerapi.InvokeConfig) string {
252264
pid := identity.NewID()
253265
cfg1 := cfg
@@ -332,6 +344,27 @@ func (m *monitor) invoke(ctx context.Context, pid string, cfg *controllerapi.Inv
332344
return err
333345
}
334346

347+
func (m *monitor) Close() error {
348+
m.cancelRunningProcesses()
349+
// if m.buildConfig.resultCtx != nil {
350+
// b.buildConfig.resultCtx.Done()
351+
// }
352+
// TODO: cancel ongoing builds?
353+
return nil
354+
}
355+
356+
func (m *monitor) ListProcesses(ctx context.Context) (infos []*processes.ProcessInfo, retErr error) {
357+
return m.processes.ListProcesses(), nil
358+
}
359+
360+
func (m *monitor) DisconnectProcess(ctx context.Context, pid string) error {
361+
return m.processes.DeleteProcess(pid)
362+
}
363+
364+
func (m *monitor) cancelRunningProcesses() {
365+
m.processes.CancelRunningProcesses()
366+
}
367+
335368
type nopCloser struct {
336369
io.Writer
337370
}

0 commit comments

Comments
 (0)