diff --git a/build/build.go b/build/build.go index c3da32a9..fefcc4b3 100644 --- a/build/build.go +++ b/build/build.go @@ -1260,7 +1260,7 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s respMu.Lock() resp[k] = &client.SolveResponse{ ExporterResponse: map[string]string{ - "containerimage.digest": desc.Digest.String(), + exptypes.ExporterImageDigestKey: desc.Digest.String(), }, } respMu.Unlock() diff --git a/commands/build.go b/commands/build.go index abc78879..e686d863 100644 --- a/commands/build.go +++ b/commands/build.go @@ -5,6 +5,7 @@ import ( "encoding/base64" "encoding/csv" "encoding/json" + "fmt" "io" "os" "runtime" @@ -21,6 +22,7 @@ import ( "github.com/docker/buildx/store/storeutil" "github.com/docker/buildx/util/buildflags" "github.com/docker/buildx/util/ioset" + "github.com/docker/buildx/util/progress" "github.com/docker/buildx/util/tracing" "github.com/docker/cli-docs-tool/annotation" "github.com/docker/cli/cli" @@ -54,7 +56,6 @@ type buildOptions struct { outputs []string platforms []string printFunc string - quiet bool secrets []string shmSize dockeropts.MemBytes ssh []string @@ -62,8 +63,10 @@ type buildOptions struct { target string ulimits *dockeropts.UlimitOpt - invoke string + invoke string + progress string + quiet bool controllerapi.CommonOptions control.ControlOptions @@ -85,7 +88,6 @@ func (o *buildOptions) toControllerOptions() (controllerapi.BuildOptions, error) NoCacheFilter: o.noCacheFilter, Platforms: o.platforms, PrintFunc: o.printFunc, - Quiet: o.quiet, ShmSize: int64(o.shmSize), Tags: o.tags, Target: o.target, @@ -124,6 +126,22 @@ func (o *buildOptions) toControllerOptions() (controllerapi.BuildOptions, error) return opts, nil } +func (o *buildOptions) toProgress() (string, error) { + switch o.progress { + case progress.PrinterModeAuto, progress.PrinterModeTty, progress.PrinterModePlain, progress.PrinterModeQuiet: + default: + return "", errors.Errorf("progress=%s is not a valid progress option", o.progress) + } + + if o.quiet { + if o.progress != progress.PrinterModeAuto && o.progress != progress.PrinterModeQuiet { + return "", errors.Errorf("progress=%s and quiet cannot be used together", o.progress) + } + return progress.PrinterModeQuiet, nil + } + return o.progress, nil +} + func runBuild(dockerCli command.Cli, in buildOptions) error { ctx := appcontext.Context() @@ -139,8 +157,18 @@ func runBuild(dockerCli command.Cli, in buildOptions) error { if err != nil { return err } - _, err = cbuild.RunBuild(ctx, dockerCli, opts, os.Stdin, in.progress, nil) - return err + progress, err := in.toProgress() + if err != nil { + return err + } + resp, _, err := cbuild.RunBuild(ctx, dockerCli, opts, os.Stdin, progress, nil) + if err != nil { + return err + } + if in.quiet { + fmt.Println(resp.ExporterResponse[exptypes.ExporterImageDigestKey]) + } + return nil } func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command { @@ -403,11 +431,6 @@ func updateLastActivity(dockerCli command.Cli, ng *store.NodeGroup) error { func launchControllerAndRunBuild(dockerCli command.Cli, options buildOptions) error { ctx := context.TODO() - if options.quiet && options.progress != "auto" && options.progress != "quiet" { - return errors.Errorf("progress=%s and quiet cannot be used together", options.progress) - } else if options.quiet { - options.progress = "quiet" - } if options.invoke != "" && (options.dockerfileName == "-" || options.contextPath == "-") { // stdin must be usable for monitor return errors.Errorf("Dockerfile or context from stdin is not supported with invoke") @@ -440,12 +463,16 @@ func launchControllerAndRunBuild(dockerCli command.Cli, options buildOptions) er }) f.SetReader(os.Stdin) - // Start build opts, err := options.toControllerOptions() if err != nil { return err } - ref, err := c.Build(ctx, opts, pr, os.Stdout, os.Stderr, options.progress) + progress, err := options.toProgress() + if err != nil { + return err + } + // Start build + ref, resp, err := c.Build(ctx, opts, pr, os.Stdout, os.Stderr, progress) if err != nil { return errors.Wrapf(err, "failed to build") // TODO: allow invoke even on error } @@ -456,6 +483,10 @@ func launchControllerAndRunBuild(dockerCli command.Cli, options buildOptions) er logrus.Debug("failed to close stdin pipe reader") } + if options.quiet { + fmt.Println(resp.ExporterResponse[exptypes.ExporterImageDigestKey]) + } + // post-build operations if options.invoke != "" { pr2, pw2 := io.Pipe() diff --git a/controller/build/build.go b/controller/build/build.go index 10b28829..cfba416f 100644 --- a/controller/build/build.go +++ b/controller/build/build.go @@ -41,15 +41,9 @@ import ( const defaultTargetName = "default" -func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.BuildOptions, inStream io.Reader, progressMode string, statusChan chan *client.SolveStatus) (res *build.ResultContext, err error) { +func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.BuildOptions, inStream io.Reader, progressMode string, statusChan chan *client.SolveStatus) (*client.SolveResponse, *build.ResultContext, error) { if in.Opts.NoCache && len(in.NoCacheFilter) > 0 { - return nil, errors.Errorf("--no-cache and --no-cache-filter cannot currently be used together") - } - - if in.Quiet && progressMode != progress.PrinterModeAuto && progressMode != progress.PrinterModeQuiet { - return nil, errors.Errorf("progress=%s and quiet cannot be used together", progressMode) - } else if in.Quiet { - progressMode = "quiet" + return nil, nil, errors.Errorf("--no-cache and --no-cache-filter cannot currently be used together") } contexts := map[string]build.NamedContext{} @@ -59,7 +53,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build printFunc, err := parsePrintFunc(in.PrintFunc) if err != nil { - return nil, err + return nil, nil, err } opts := build.Options{ @@ -86,7 +80,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build platforms, err := platformutil.Parse(in.Platforms) if err != nil { - return nil, err + return nil, nil, err } opts.Platforms = platforms @@ -95,7 +89,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build secrets, err := controllerapi.CreateSecrets(in.Secrets) if err != nil { - return nil, err + return nil, nil, err } opts.Session = append(opts.Session, secrets) @@ -105,17 +99,17 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build } ssh, err := controllerapi.CreateSSH(sshSpecs) if err != nil { - return nil, err + return nil, nil, err } opts.Session = append(opts.Session, ssh) outputs, err := controllerapi.CreateExports(in.Exports) if err != nil { - return nil, err + return nil, nil, err } if in.Opts.ExportPush { if in.Opts.ExportLoad { - return nil, errors.Errorf("push and load may not be set together at the moment") + return nil, nil, errors.Errorf("push and load may not be set together at the moment") } if len(outputs) == 0 { outputs = []client.ExportEntry{{ @@ -129,7 +123,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build case "image": outputs[0].Attrs["push"] = "true" default: - return nil, errors.Errorf("push and %q output can't be used together", outputs[0].Type) + return nil, nil, errors.Errorf("push and %q output can't be used together", outputs[0].Type) } } } @@ -143,7 +137,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build switch outputs[0].Type { case "docker": default: - return nil, errors.Errorf("load and %q output can't be used together", outputs[0].Type) + return nil, nil, errors.Errorf("load and %q output can't be used together", outputs[0].Type) } } } @@ -158,7 +152,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build } opts.Attests, err = buildflags.ParseAttests(inAttests) if err != nil { - return nil, err + return nil, nil, err } opts.CacheFrom = controllerapi.CreateCaches(in.CacheFrom) @@ -166,7 +160,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build allow, err := buildflags.ParseEntitlements(in.Allow) if err != nil { - return nil, err + return nil, nil, err } opts.Allow = allow @@ -181,29 +175,25 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build builder.WithContextPathHash(contextPathHash), ) if err != nil { - return nil, err + return nil, nil, err } if err = updateLastActivity(dockerCli, b.NodeGroup); err != nil { - return nil, errors.Wrapf(err, "failed to update builder last activity time") + return nil, nil, errors.Wrapf(err, "failed to update builder last activity time") } nodes, err := b.LoadNodes(ctx, false) if err != nil { - return nil, err + return nil, nil, err } - imageID, res, err := buildTargets(ctx, dockerCli, b.NodeGroup, nodes, map[string]build.Options{defaultTargetName: opts}, progressMode, in.Opts.MetadataFile, statusChan) + resp, res, err := buildTargets(ctx, dockerCli, b.NodeGroup, nodes, map[string]build.Options{defaultTargetName: opts}, progressMode, in.Opts.MetadataFile, statusChan) err = wrapBuildError(err, false) if err != nil { - return nil, err - } - - if in.Quiet { - fmt.Println(imageID) + return nil, nil, err } - return res, nil + return resp, res, nil } -func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGroup, nodes []builder.Node, opts map[string]build.Options, progressMode string, metadataFile string, statusChan chan *client.SolveStatus) (imageID string, res *build.ResultContext, err error) { +func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGroup, nodes []builder.Node, opts map[string]build.Options, progressMode string, metadataFile string, statusChan chan *client.SolveStatus) (*client.SolveResponse, *build.ResultContext, error) { ctx2, cancel := context.WithCancel(context.TODO()) defer cancel() @@ -212,9 +202,10 @@ func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGrou fmt.Sprintf("%s:%s", ng.Driver, ng.Name), )) if err != nil { - return "", nil, err + return nil, nil, err } + var res *build.ResultContext var mu sync.Mutex var idx int resp, err := build.BuildWithResultHandler(ctx, nodes, opts, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), progress.Tee(printer, statusChan), func(driverIndex int, gotRes *build.ResultContext) { @@ -229,12 +220,12 @@ func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGrou err = err1 } if err != nil { - return "", nil, err + return nil, nil, err } if len(metadataFile) > 0 && resp != nil { if err := writeMetadataFile(metadataFile, decodeExporterResponse(resp[defaultTargetName].ExporterResponse)); err != nil { - return "", nil, err + return nil, nil, err } } @@ -243,12 +234,12 @@ func buildTargets(ctx context.Context, dockerCli command.Cli, ng *store.NodeGrou for k := range resp { if opts[k].PrintFunc != nil { if err := printResult(opts[k].PrintFunc, resp[k].ExporterResponse); err != nil { - return "", nil, err + return nil, nil, err } } } - return resp[defaultTargetName].ExporterResponse["containerimage.digest"], res, err + return resp[defaultTargetName], res, err } func printWarnings(w io.Writer, warnings []client.VertexWarning, mode string) { diff --git a/controller/control/controller.go b/controller/control/controller.go index 343f2bbf..eb9b83a9 100644 --- a/controller/control/controller.go +++ b/controller/control/controller.go @@ -6,14 +6,15 @@ import ( "github.com/containerd/console" controllerapi "github.com/docker/buildx/controller/pb" + "github.com/moby/buildkit/client" ) type BuildxController interface { - Invoke(ctx context.Context, ref string, options controllerapi.ContainerConfig, ioIn io.ReadCloser, ioOut io.WriteCloser, ioErr io.WriteCloser) error - Build(ctx context.Context, options controllerapi.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (ref string, err error) + Build(ctx context.Context, options controllerapi.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (ref string, resp *client.SolveResponse, err error) + Invoke(ctx context.Context, ref string, options controllerapi.ContainerConfig, ioIn io.ReadCloser, ioOut io.WriteCloser, ioErr io.WriteCloser) (err error) Kill(ctx context.Context) error Close() error - List(ctx context.Context) (res []string, _ error) + List(ctx context.Context) (refs []string, _ error) Disconnect(ctx context.Context, ref string) error } diff --git a/controller/local/controller.go b/controller/local/controller.go index cdcfd75a..3ec8a177 100644 --- a/controller/local/controller.go +++ b/controller/local/controller.go @@ -10,6 +10,7 @@ import ( "github.com/docker/buildx/controller/control" controllerapi "github.com/docker/buildx/controller/pb" "github.com/docker/cli/cli/command" + "github.com/moby/buildkit/client" "github.com/pkg/errors" ) @@ -26,6 +27,15 @@ type localController struct { resultCtx *build.ResultContext } +func (b *localController) Build(ctx context.Context, options controllerapi.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (string, *client.SolveResponse, error) { + resp, res, err := cbuild.RunBuild(ctx, b.dockerCli, options, in, progressMode, nil) + if err != nil { + return "", nil, err + } + b.resultCtx = res + return b.ref, resp, nil +} + func (b *localController) Invoke(ctx context.Context, ref string, cfg controllerapi.ContainerConfig, ioIn io.ReadCloser, ioOut io.WriteCloser, ioErr io.WriteCloser) error { if ref != b.ref { return errors.Errorf("unknown ref %q", ref) @@ -52,15 +62,6 @@ func (b *localController) Invoke(ctx context.Context, ref string, cfg controller return build.Invoke(ctx, ccfg) } -func (b *localController) Build(ctx context.Context, options controllerapi.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (string, error) { - res, err := cbuild.RunBuild(ctx, b.dockerCli, options, in, progressMode, nil) - if err != nil { - return "", err - } - b.resultCtx = res - return b.ref, nil -} - func (b *localController) Kill(context.Context) error { return nil // nop } diff --git a/controller/pb/controller.pb.go b/controller/pb/controller.pb.go index 252cc13f..fc60f584 100644 --- a/controller/pb/controller.pb.go +++ b/controller/pb/controller.pb.go @@ -89,13 +89,12 @@ type BuildOptions struct { NetworkMode string `protobuf:"bytes,15,opt,name=NetworkMode,proto3" json:"NetworkMode,omitempty"` NoCacheFilter []string `protobuf:"bytes,16,rep,name=NoCacheFilter,proto3" json:"NoCacheFilter,omitempty"` Platforms []string `protobuf:"bytes,17,rep,name=Platforms,proto3" json:"Platforms,omitempty"` - Quiet bool `protobuf:"varint,18,opt,name=Quiet,proto3" json:"Quiet,omitempty"` - Secrets []*Secret `protobuf:"bytes,19,rep,name=Secrets,proto3" json:"Secrets,omitempty"` - ShmSize int64 `protobuf:"varint,20,opt,name=ShmSize,proto3" json:"ShmSize,omitempty"` - SSH []*SSH `protobuf:"bytes,21,rep,name=SSH,proto3" json:"SSH,omitempty"` - Tags []string `protobuf:"bytes,22,rep,name=Tags,proto3" json:"Tags,omitempty"` - Target string `protobuf:"bytes,23,opt,name=Target,proto3" json:"Target,omitempty"` - Ulimits *UlimitOpt `protobuf:"bytes,24,opt,name=Ulimits,proto3" json:"Ulimits,omitempty"` + Secrets []*Secret `protobuf:"bytes,18,rep,name=Secrets,proto3" json:"Secrets,omitempty"` + ShmSize int64 `protobuf:"varint,19,opt,name=ShmSize,proto3" json:"ShmSize,omitempty"` + SSH []*SSH `protobuf:"bytes,20,rep,name=SSH,proto3" json:"SSH,omitempty"` + Tags []string `protobuf:"bytes,21,rep,name=Tags,proto3" json:"Tags,omitempty"` + Target string `protobuf:"bytes,22,opt,name=Target,proto3" json:"Target,omitempty"` + Ulimits *UlimitOpt `protobuf:"bytes,23,opt,name=Ulimits,proto3" json:"Ulimits,omitempty"` Opts *CommonOptions `protobuf:"bytes,25,opt,name=Opts,proto3" json:"Opts,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -245,13 +244,6 @@ func (m *BuildOptions) GetPlatforms() []string { return nil } -func (m *BuildOptions) GetQuiet() bool { - if m != nil { - return m.Quiet - } - return false -} - func (m *BuildOptions) GetSecrets() []*Secret { if m != nil { return m.Secrets @@ -689,9 +681,10 @@ func (m *CommonOptions) GetProvenance() string { } type BuildResponse struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + ExporterResponse map[string]string `protobuf:"bytes,1,rep,name=ExporterResponse,proto3" json:"ExporterResponse,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *BuildResponse) Reset() { *m = BuildResponse{} } @@ -718,6 +711,13 @@ func (m *BuildResponse) XXX_DiscardUnknown() { var xxx_messageInfo_BuildResponse proto.InternalMessageInfo +func (m *BuildResponse) GetExporterResponse() map[string]string { + if m != nil { + return m.ExporterResponse + } + return nil +} + type DisconnectRequest struct { Ref string `protobuf:"bytes,1,opt,name=Ref,proto3" json:"Ref,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -1675,6 +1675,7 @@ func init() { proto.RegisterType((*Ulimit)(nil), "buildx.controller.v1.Ulimit") proto.RegisterType((*CommonOptions)(nil), "buildx.controller.v1.CommonOptions") proto.RegisterType((*BuildResponse)(nil), "buildx.controller.v1.BuildResponse") + proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.BuildResponse.ExporterResponseEntry") proto.RegisterType((*DisconnectRequest)(nil), "buildx.controller.v1.DisconnectRequest") proto.RegisterType((*DisconnectResponse)(nil), "buildx.controller.v1.DisconnectResponse") proto.RegisterType((*ListRequest)(nil), "buildx.controller.v1.ListRequest") @@ -1699,111 +1700,112 @@ func init() { func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) } var fileDescriptor_ed7f10298fa1d90f = []byte{ - // 1653 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xef, 0x72, 0x1b, 0x49, - 0x11, 0x67, 0x25, 0x59, 0x7f, 0x5a, 0x96, 0x93, 0x0c, 0xe1, 0x98, 0x13, 0xc7, 0xc5, 0xd9, 0xe4, - 0x0e, 0x55, 0x1d, 0x25, 0xdf, 0xf9, 0x38, 0x72, 0x77, 0x09, 0x55, 0xd8, 0x92, 0x55, 0x16, 0x15, - 0xff, 0x61, 0x95, 0xe4, 0x0a, 0xa8, 0xe2, 0x6a, 0x2d, 0x8d, 0xe5, 0x2d, 0xad, 0x76, 0xc4, 0xce, - 0x48, 0xb6, 0xf9, 0xc4, 0x13, 0xf0, 0x0a, 0x7c, 0xa6, 0x78, 0x04, 0x3e, 0xf1, 0x0e, 0xbc, 0x07, - 0x3c, 0x02, 0xd5, 0x3d, 0xb3, 0xd2, 0x2a, 0xd2, 0x2a, 0x71, 0xf1, 0x49, 0xd3, 0xbd, 0xbf, 0x5f, - 0x77, 0x4f, 0x4f, 0x4f, 0xf7, 0xae, 0xe0, 0x7e, 0x5f, 0x46, 0x3a, 0x96, 0x61, 0x28, 0xe2, 0xe6, - 0x24, 0x96, 0x5a, 0xb2, 0x87, 0x17, 0xd3, 0x20, 0x1c, 0xdc, 0x34, 0x53, 0x0f, 0x66, 0x5f, 0xd4, - 0x9f, 0x0f, 0x03, 0x7d, 0x35, 0xbd, 0x68, 0xf6, 0xe5, 0x78, 0x6f, 0x2c, 0x2f, 0x6e, 0xf7, 0x08, - 0x35, 0x0a, 0xf4, 0x9e, 0x3f, 0x09, 0xf6, 0x94, 0x88, 0x67, 0x41, 0x5f, 0xa8, 0x3d, 0x4b, 0x4a, - 0x7e, 0x8d, 0x49, 0xf7, 0x8f, 0xb0, 0x7d, 0x88, 0x70, 0x4f, 0xfc, 0x69, 0x2a, 0x94, 0x66, 0xf7, - 0x21, 0xef, 0x89, 0x4b, 0xee, 0xec, 0x3a, 0x8d, 0x8a, 0x87, 0x4b, 0xf6, 0x02, 0x4a, 0x67, 0x13, - 0x1d, 0xc8, 0x48, 0xf1, 0xdc, 0xae, 0xd3, 0xa8, 0xee, 0xbb, 0xcd, 0x75, 0x61, 0x34, 0xc9, 0x8c, - 0x45, 0x7a, 0x09, 0xc5, 0xfd, 0x1b, 0x58, 0x07, 0x56, 0xc1, 0x76, 0xa1, 0xda, 0x92, 0x91, 0x16, - 0x37, 0xfa, 0xdc, 0xd7, 0x57, 0xd6, 0x51, 0x5a, 0xc5, 0x3e, 0x85, 0x9d, 0xb6, 0xec, 0x8f, 0x44, - 0x7c, 0x19, 0x84, 0xe2, 0xd4, 0x1f, 0x0b, 0xf2, 0x5b, 0xf1, 0xde, 0xd2, 0xb2, 0x8f, 0xa0, 0x72, - 0x1e, 0x07, 0x91, 0xee, 0x4c, 0xa3, 0x3e, 0xcf, 0x13, 0x64, 0xa1, 0x60, 0x7f, 0x80, 0x1a, 0xa2, - 0x06, 0xd6, 0xb2, 0xe2, 0x85, 0xdd, 0x7c, 0xa3, 0xba, 0xff, 0xd5, 0xbb, 0x83, 0x6f, 0x2e, 0xf1, - 0x8e, 0x22, 0x1d, 0xdf, 0x7a, 0xcb, 0xb6, 0xd8, 0x43, 0xd8, 0x3a, 0x08, 0x43, 0x79, 0xcd, 0xb7, - 0x76, 0xf3, 0x8d, 0x8a, 0x67, 0x04, 0xc6, 0xa1, 0x74, 0xa0, 0xb5, 0x50, 0x5a, 0xf1, 0x22, 0xe9, - 0x13, 0x91, 0x9d, 0x41, 0x85, 0x3c, 0x1c, 0xc4, 0x43, 0xc5, 0x4b, 0x14, 0xc8, 0x17, 0xef, 0x11, - 0xc8, 0x9c, 0x63, 0x82, 0x58, 0xd8, 0x60, 0x47, 0x50, 0x69, 0xf9, 0xfd, 0x2b, 0xd1, 0x89, 0xe5, - 0x98, 0x97, 0xc9, 0xe0, 0xcf, 0xd6, 0x1b, 0x24, 0x98, 0x35, 0x68, 0xcd, 0xcc, 0x99, 0xec, 0x00, - 0x4a, 0x24, 0xbc, 0x92, 0xbc, 0x72, 0x37, 0x23, 0x09, 0x8f, 0xb9, 0xb0, 0xdd, 0x1a, 0xc6, 0x72, - 0x3a, 0x39, 0xf7, 0x63, 0x11, 0x69, 0x0e, 0x74, 0x10, 0x4b, 0x3a, 0xf6, 0x1c, 0x4a, 0x47, 0x37, - 0x13, 0x19, 0x6b, 0xc5, 0xab, 0xe4, 0xe6, 0xf1, 0x7a, 0x37, 0x06, 0x64, 0x1d, 0x58, 0x06, 0xfb, - 0x18, 0xe0, 0xe8, 0x46, 0xc7, 0xfe, 0xb1, 0xc4, 0xc4, 0x6e, 0x53, 0x62, 0x53, 0x1a, 0x2c, 0xa8, - 0xee, 0xd8, 0x1f, 0x8a, 0x6e, 0xbb, 0x13, 0x84, 0x82, 0xd7, 0x4c, 0x41, 0xa5, 0x54, 0xac, 0x03, - 0xc5, 0x97, 0xfe, 0x85, 0x08, 0x15, 0xdf, 0x21, 0xef, 0xcd, 0xf7, 0x48, 0xbd, 0x21, 0x98, 0x50, - 0x2c, 0x1b, 0x3d, 0x9d, 0x0a, 0x7d, 0x2d, 0xe3, 0xd1, 0x89, 0x1c, 0x08, 0x7e, 0xcf, 0x78, 0x4a, - 0xa9, 0xd8, 0x53, 0xa8, 0x9d, 0x4a, 0x93, 0xde, 0x20, 0xd4, 0x22, 0xe6, 0xf7, 0x29, 0xdc, 0x65, - 0x25, 0x15, 0x6e, 0xe8, 0xeb, 0x4b, 0x19, 0x8f, 0x15, 0x7f, 0x40, 0x88, 0x85, 0x02, 0x6b, 0xeb, - 0xb7, 0xd3, 0x40, 0x68, 0xce, 0x76, 0x9d, 0x46, 0xd9, 0x33, 0x02, 0xfb, 0x25, 0x94, 0x7a, 0xa2, - 0x1f, 0x0b, 0xad, 0xf8, 0x0f, 0x69, 0x13, 0x1f, 0xad, 0xdf, 0x84, 0x01, 0x79, 0x09, 0x18, 0x6b, - 0xb2, 0x77, 0x35, 0xee, 0x05, 0x7f, 0x16, 0xfc, 0xe1, 0xae, 0xd3, 0xc8, 0x7b, 0x89, 0xc8, 0x3e, - 0x83, 0x7c, 0xaf, 0x77, 0xcc, 0x7f, 0x44, 0xd6, 0x3e, 0xcc, 0xb0, 0xd6, 0x3b, 0xf6, 0x10, 0xc5, - 0x18, 0x14, 0x5e, 0xf9, 0x43, 0xc5, 0x3f, 0xa0, 0x68, 0x69, 0xcd, 0x3e, 0x80, 0xe2, 0x2b, 0x3f, - 0x1e, 0x0a, 0xcd, 0x7f, 0x4c, 0x99, 0xb0, 0x12, 0xfb, 0x06, 0x4a, 0xaf, 0xc3, 0x60, 0x1c, 0x68, - 0xc5, 0x39, 0x35, 0x8c, 0x47, 0xeb, 0x8d, 0x1b, 0xd0, 0xd9, 0x44, 0x7b, 0x09, 0x9e, 0x3d, 0x83, - 0xc2, 0xd9, 0x44, 0x2b, 0xfe, 0x21, 0xf1, 0x9e, 0x64, 0x14, 0xa3, 0x1c, 0x8f, 0x65, 0x94, 0x74, - 0x1a, 0x22, 0xd4, 0x7f, 0x0d, 0x6c, 0xf5, 0xd6, 0x62, 0x33, 0x1b, 0x89, 0xdb, 0xa4, 0x99, 0x8d, - 0xc4, 0x2d, 0x26, 0x77, 0xe6, 0x87, 0xd3, 0xa4, 0xa5, 0x18, 0xe1, 0xdb, 0xdc, 0xd7, 0x4e, 0xfd, - 0x05, 0xec, 0x2c, 0x5f, 0xb7, 0x3b, 0xb1, 0xbf, 0x81, 0x6a, 0xaa, 0x62, 0xee, 0x42, 0x75, 0xff, - 0xe5, 0x40, 0x35, 0x55, 0xf8, 0x94, 0xea, 0xdb, 0x89, 0xb0, 0x64, 0x5a, 0xb3, 0x43, 0xd8, 0x3a, - 0xd0, 0x3a, 0xc6, 0x0e, 0x8c, 0xa7, 0xf5, 0xf3, 0x77, 0x5e, 0x9f, 0x26, 0xc1, 0x4d, 0xf9, 0x1a, - 0x2a, 0x56, 0x6f, 0x5b, 0x28, 0x1d, 0x44, 0x3e, 0x26, 0xce, 0x36, 0xcc, 0xb4, 0xaa, 0xfe, 0x35, - 0xc0, 0x82, 0x76, 0xa7, 0x3d, 0xfc, 0xc3, 0x81, 0x07, 0x2b, 0x3d, 0x62, 0xed, 0x4e, 0x8e, 0x97, - 0x77, 0xb2, 0xff, 0x9e, 0xfd, 0x66, 0x75, 0x3f, 0xff, 0x47, 0xb4, 0xa6, 0xf2, 0xd9, 0x0e, 0xe4, - 0xba, 0x6d, 0xcb, 0xc8, 0x75, 0xdb, 0x48, 0xc0, 0xf9, 0x63, 0x42, 0xab, 0x78, 0x46, 0x70, 0x3b, - 0x50, 0x34, 0x77, 0x69, 0x05, 0x5f, 0x87, 0x32, 0xb6, 0x17, 0x1a, 0x63, 0xc6, 0xc7, 0x5c, 0xc6, - 0x70, 0x8e, 0xa2, 0x99, 0x4d, 0x32, 0x2e, 0xdd, 0xbf, 0x3b, 0x50, 0x99, 0x57, 0x3c, 0x6b, 0x41, - 0x91, 0xe2, 0x51, 0xdc, 0xa1, 0x3c, 0x7c, 0xf6, 0x8e, 0x2b, 0xd2, 0x7c, 0x43, 0x68, 0xdb, 0x8f, - 0x0c, 0xb5, 0xfe, 0x1d, 0x54, 0x53, 0xea, 0x35, 0x29, 0xd8, 0x4f, 0xa7, 0x20, 0xb3, 0x65, 0x18, - 0x27, 0xe9, 0x04, 0xb5, 0xa1, 0x68, 0x94, 0x78, 0x84, 0x34, 0x81, 0xed, 0x11, 0xd2, 0xdc, 0x65, - 0x50, 0x38, 0xf6, 0xe3, 0x01, 0x19, 0xcd, 0x7b, 0xb4, 0x46, 0x5d, 0x4f, 0x5e, 0x6a, 0xda, 0x70, - 0xde, 0xa3, 0xb5, 0xfb, 0x1f, 0x07, 0x6a, 0x4b, 0x77, 0x15, 0x9b, 0x11, 0xdd, 0x31, 0x11, 0x5b, - 0x83, 0x89, 0x88, 0x53, 0xe4, 0x44, 0x68, 0x7f, 0xe0, 0x6b, 0x9f, 0xba, 0xb8, 0xc9, 0xe7, 0x92, - 0x0e, 0xd9, 0xb6, 0x8f, 0x92, 0x9b, 0xb2, 0x97, 0x88, 0xe8, 0xfd, 0x7c, 0x1a, 0x86, 0xbc, 0x40, - 0x6a, 0x5a, 0x9b, 0xb1, 0x81, 0xf7, 0xe1, 0x7c, 0xaa, 0xae, 0xf8, 0x16, 0x3d, 0x49, 0x69, 0x16, - 0xcf, 0x5f, 0x4a, 0x7f, 0xc0, 0x8b, 0xe9, 0xe7, 0xa8, 0xa1, 0x1d, 0x1d, 0x9e, 0x9d, 0xf0, 0x92, - 0xd9, 0x39, 0xae, 0x91, 0x73, 0x1e, 0xcb, 0x99, 0x88, 0xfc, 0xa8, 0x2f, 0x78, 0x99, 0x9e, 0xa4, - 0x34, 0xee, 0x3d, 0xa8, 0xd9, 0x97, 0x29, 0x35, 0x91, 0x91, 0x12, 0xee, 0x27, 0xf0, 0xa0, 0x1d, - 0xa8, 0xbe, 0x8c, 0x22, 0xd1, 0xd7, 0x99, 0xaf, 0x58, 0xee, 0x43, 0x60, 0x69, 0x98, 0x25, 0x3f, - 0x82, 0xea, 0xcb, 0x40, 0x6d, 0xa0, 0xb9, 0xb0, 0x6d, 0x00, 0x86, 0x80, 0x21, 0x8f, 0xc4, 0xad, - 0x29, 0xa9, 0x8a, 0x47, 0x6b, 0xf7, 0xaf, 0x0e, 0x6c, 0x77, 0xa3, 0xc9, 0x54, 0x9f, 0x08, 0xa5, - 0xfc, 0xa1, 0x60, 0x2f, 0xa0, 0xd0, 0x8d, 0x02, 0x4d, 0x76, 0xaa, 0xfb, 0x9f, 0xae, 0x2f, 0x09, - 0x62, 0x20, 0xcc, 0xb2, 0x8e, 0x7f, 0xe0, 0x11, 0x0b, 0x1b, 0x74, 0xdb, 0xd7, 0xbe, 0x2d, 0xa8, - 0x8c, 0x31, 0x8e, 0x88, 0x14, 0x11, 0xc5, 0xc3, 0x12, 0x6c, 0x91, 0x51, 0xf7, 0x29, 0xdc, 0x7f, - 0xdb, 0xfa, 0x9a, 0xad, 0x7d, 0x09, 0xd5, 0x94, 0x15, 0xba, 0x4e, 0x67, 0x1d, 0x02, 0x94, 0x3d, - 0x5c, 0xe2, 0x5e, 0xe7, 0x81, 0x6c, 0x1b, 0x1f, 0x98, 0x7e, 0x32, 0x3d, 0xcf, 0xe0, 0x5f, 0x72, - 0x50, 0x4a, 0x4c, 0x3c, 0x5b, 0xda, 0xf7, 0xe3, 0xac, 0x7d, 0xaf, 0x6e, 0xf9, 0x2b, 0x28, 0xcc, - 0x4b, 0x32, 0x73, 0x96, 0x75, 0x06, 0x29, 0x1a, 0x55, 0xeb, 0xaf, 0xa0, 0xe8, 0x09, 0x85, 0x73, - 0x37, 0xbf, 0x69, 0x98, 0x19, 0xcc, 0x82, 0x6c, 0x49, 0x48, 0xef, 0x05, 0xc3, 0xc8, 0x37, 0x45, - 0x9d, 0x49, 0x37, 0x98, 0x14, 0xdd, 0x28, 0x16, 0xe9, 0x9e, 0x40, 0x75, 0x63, 0xa6, 0xd9, 0x19, - 0xdc, 0xc3, 0xa1, 0xe9, 0x07, 0x91, 0x88, 0x5b, 0x32, 0xba, 0x0c, 0x86, 0x76, 0xa7, 0x9f, 0x64, - 0x4d, 0xdf, 0x25, 0xb0, 0xf7, 0x36, 0xdb, 0xfd, 0xa7, 0xb3, 0x62, 0x91, 0x2e, 0x1b, 0xf6, 0xa8, - 0x89, 0x0c, 0x22, 0x6d, 0xeb, 0x33, 0xa5, 0xc1, 0xb0, 0x5a, 0xe3, 0x81, 0x6d, 0xbc, 0xb8, 0x5c, - 0x34, 0xd0, 0xbc, 0x6d, 0xa0, 0x78, 0xe2, 0xaf, 0x95, 0x88, 0x29, 0x1f, 0x15, 0x8f, 0xd6, 0xf8, - 0x0a, 0x72, 0x2a, 0x49, 0x6b, 0x2e, 0xb8, 0x95, 0xc8, 0xde, 0xb5, 0xb9, 0xd5, 0x68, 0xef, 0x7a, - 0x80, 0xcd, 0xfd, 0x54, 0xa2, 0xae, 0x64, 0xde, 0xaa, 0x48, 0x40, 0xdc, 0x2b, 0x7d, 0x4b, 0x37, - 0xb9, 0xec, 0xe1, 0xd2, 0x3d, 0x80, 0xca, 0xfc, 0x2c, 0xb1, 0xe3, 0x77, 0x06, 0x94, 0xac, 0x9a, - 0x97, 0xeb, 0x0c, 0x92, 0x32, 0xcc, 0xad, 0x96, 0x61, 0x3e, 0x55, 0x86, 0xcf, 0xa0, 0xb6, 0x74, - 0xaa, 0x08, 0xf2, 0xe4, 0xb5, 0xb2, 0x86, 0x68, 0x8d, 0xba, 0x96, 0x0c, 0xcd, 0x27, 0x55, 0xcd, - 0xa3, 0xb5, 0xfb, 0x04, 0x6a, 0x4b, 0xe7, 0xb9, 0xae, 0xfb, 0xba, 0x8f, 0xa1, 0xd6, 0xd3, 0xbe, - 0x9e, 0xaa, 0xec, 0xbe, 0xf0, 0x5f, 0x07, 0x76, 0x12, 0x8c, 0x6d, 0x0d, 0xbf, 0x80, 0xf2, 0x4c, - 0xc4, 0x5a, 0xdc, 0xcc, 0x27, 0x0e, 0x6f, 0xe2, 0xb7, 0x62, 0x33, 0xf9, 0x56, 0xc4, 0xa3, 0x7d, - 0x43, 0x08, 0x6f, 0x8e, 0x64, 0xdf, 0x42, 0x59, 0x91, 0x1d, 0x91, 0xcc, 0xeb, 0x8f, 0xb3, 0x58, - 0xd6, 0xdf, 0x1c, 0xcf, 0xf6, 0xa0, 0x10, 0xca, 0xa1, 0xa2, 0x13, 0xac, 0xee, 0xff, 0x24, 0x8b, - 0xf7, 0x52, 0x0e, 0x3d, 0x02, 0xb2, 0xe7, 0x50, 0xbe, 0xf6, 0xe3, 0x28, 0x88, 0x86, 0xc9, 0xb7, - 0xda, 0xa3, 0x2c, 0xd2, 0x77, 0x06, 0xe7, 0xcd, 0x09, 0x6e, 0x0d, 0xcb, 0xfc, 0x52, 0xda, 0x9c, - 0xb8, 0xbf, 0xc3, 0xa6, 0x87, 0xa2, 0xdd, 0x7e, 0x17, 0x6a, 0xa6, 0x98, 0xdf, 0x88, 0x58, 0xe1, - 0xdb, 0x8f, 0xb3, 0xe9, 0x52, 0x1d, 0xa6, 0xa1, 0xde, 0x32, 0xd3, 0xfd, 0xde, 0xf6, 0xf8, 0x44, - 0x81, 0x63, 0x69, 0xe2, 0xf7, 0x47, 0xfe, 0x30, 0x39, 0xa7, 0x44, 0xc4, 0x27, 0x33, 0xeb, 0xcf, - 0xcc, 0xb3, 0x44, 0xc4, 0x57, 0x87, 0x58, 0xcc, 0x02, 0xb5, 0x78, 0x11, 0x9b, 0xcb, 0xfb, 0xff, - 0x2e, 0x00, 0xb4, 0xe6, 0xf1, 0xb0, 0x73, 0xd8, 0x22, 0x7f, 0x6c, 0xd3, 0x67, 0xb7, 0xdd, 0x77, - 0xfd, 0xc9, 0x46, 0x8c, 0x4d, 0xc6, 0x6b, 0x28, 0x9a, 0xd3, 0x62, 0x59, 0x4d, 0x25, 0x5d, 0x5f, - 0xf5, 0xa7, 0x9b, 0x41, 0xc6, 0xe8, 0xe7, 0x0e, 0xf3, 0x6c, 0xcb, 0xc9, 0x0a, 0x34, 0x3d, 0x85, - 0xb2, 0x02, 0x5d, 0x6a, 0xdf, 0x0d, 0x87, 0xfd, 0x06, 0x8a, 0xdd, 0x68, 0x26, 0x47, 0x82, 0xfd, - 0x74, 0x3d, 0x21, 0xb1, 0xb7, 0xf9, 0x71, 0xc3, 0xf9, 0xdc, 0x61, 0x27, 0x50, 0xc0, 0x69, 0xc9, - 0x32, 0x5a, 0x7f, 0x6a, 0xd4, 0xd6, 0xdd, 0x4d, 0x10, 0x9b, 0xc5, 0xef, 0x01, 0x16, 0x33, 0x9b, - 0x65, 0x7c, 0x37, 0xaf, 0x0c, 0xff, 0x7a, 0xe3, 0xdd, 0x40, 0xeb, 0xe0, 0x04, 0x07, 0xd6, 0xa5, - 0x64, 0x99, 0xa3, 0x6a, 0x5e, 0xee, 0x75, 0x77, 0x13, 0xc4, 0x98, 0x3b, 0x2c, 0xfc, 0x3e, 0x37, - 0xb9, 0xb8, 0x28, 0xd2, 0xbf, 0x3e, 0x5f, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x47, 0x50, 0x7d, - 0xc5, 0x5c, 0x12, 0x00, 0x00, + // 1672 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xdd, 0x6e, 0x23, 0x49, + 0x15, 0xa6, 0x6d, 0xc7, 0x3f, 0xc7, 0x71, 0x26, 0x53, 0x64, 0x97, 0x5e, 0xb3, 0xec, 0x64, 0x7a, + 0x66, 0x17, 0x4b, 0x8b, 0x9c, 0xdd, 0x2c, 0xcb, 0xec, 0xec, 0x0c, 0x12, 0x89, 0x1d, 0x2b, 0x46, + 0xf9, 0x53, 0x3b, 0x33, 0x2b, 0x40, 0x62, 0xd4, 0xb1, 0x2b, 0x4e, 0xcb, 0xed, 0x2e, 0xd3, 0x55, + 0x76, 0x12, 0xae, 0xb8, 0xe5, 0x86, 0xf7, 0x40, 0x3c, 0x02, 0x57, 0xbc, 0x03, 0xef, 0x01, 0x8f, + 0x80, 0xce, 0xa9, 0x6a, 0xbb, 0x1d, 0xbb, 0x9d, 0x44, 0x5c, 0xa5, 0xea, 0xf4, 0xf7, 0x9d, 0x73, + 0xea, 0xd4, 0xf9, 0x29, 0x07, 0x36, 0xbb, 0x22, 0x54, 0x91, 0x08, 0x02, 0x1e, 0xd5, 0x47, 0x91, + 0x50, 0x82, 0x6d, 0x5d, 0x8c, 0xfd, 0xa0, 0x77, 0x53, 0x4f, 0x7c, 0x98, 0x7c, 0x5d, 0x7d, 0xd3, + 0xf7, 0xd5, 0xd5, 0xf8, 0xa2, 0xde, 0x15, 0xc3, 0x9d, 0xa1, 0xb8, 0xb8, 0xdd, 0x21, 0xd4, 0xc0, + 0x57, 0x3b, 0xde, 0xc8, 0xdf, 0x91, 0x3c, 0x9a, 0xf8, 0x5d, 0x2e, 0x77, 0x0c, 0x29, 0xfe, 0xab, + 0x55, 0x3a, 0x7f, 0x84, 0xf5, 0x7d, 0x84, 0xbb, 0xfc, 0x4f, 0x63, 0x2e, 0x15, 0xdb, 0x84, 0xac, + 0xcb, 0x2f, 0x6d, 0x6b, 0xdb, 0xaa, 0x95, 0x5c, 0x5c, 0xb2, 0xb7, 0x50, 0x38, 0x1d, 0x29, 0x5f, + 0x84, 0xd2, 0xce, 0x6c, 0x5b, 0xb5, 0xf2, 0xae, 0x53, 0x5f, 0xe6, 0x46, 0x9d, 0xd4, 0x18, 0xa4, + 0x1b, 0x53, 0x9c, 0xbf, 0x82, 0x31, 0x60, 0x04, 0x6c, 0x1b, 0xca, 0x0d, 0x11, 0x2a, 0x7e, 0xa3, + 0xce, 0x3c, 0x75, 0x65, 0x0c, 0x25, 0x45, 0xec, 0x0b, 0xd8, 0x68, 0x8a, 0xee, 0x80, 0x47, 0x97, + 0x7e, 0xc0, 0x4f, 0xbc, 0x21, 0x27, 0xbb, 0x25, 0xf7, 0x8e, 0x94, 0x7d, 0x0a, 0xa5, 0xb3, 0xc8, + 0x0f, 0x55, 0x6b, 0x1c, 0x76, 0xed, 0x2c, 0x41, 0x66, 0x02, 0xf6, 0x07, 0xa8, 0x20, 0xaa, 0x67, + 0x34, 0x4b, 0x3b, 0xb7, 0x9d, 0xad, 0x95, 0x77, 0xbf, 0xbd, 0xdf, 0xf9, 0xfa, 0x1c, 0xef, 0x20, + 0x54, 0xd1, 0xad, 0x3b, 0xaf, 0x8b, 0x6d, 0xc1, 0xda, 0x5e, 0x10, 0x88, 0x6b, 0x7b, 0x6d, 0x3b, + 0x5b, 0x2b, 0xb9, 0x7a, 0xc3, 0x6c, 0x28, 0xec, 0x29, 0xc5, 0xa5, 0x92, 0x76, 0x9e, 0xe4, 0xf1, + 0x96, 0x9d, 0x42, 0x89, 0x2c, 0xec, 0x45, 0x7d, 0x69, 0x17, 0xc8, 0x91, 0xaf, 0x1f, 0xe0, 0xc8, + 0x94, 0xa3, 0x9d, 0x98, 0xe9, 0x60, 0x07, 0x50, 0x6a, 0x78, 0xdd, 0x2b, 0xde, 0x8a, 0xc4, 0xd0, + 0x2e, 0x92, 0xc2, 0x9f, 0x2f, 0x57, 0x48, 0x30, 0xa3, 0xd0, 0xa8, 0x99, 0x32, 0xd9, 0x1e, 0x14, + 0x68, 0x73, 0x2e, 0xec, 0xd2, 0xe3, 0x94, 0xc4, 0x3c, 0xe6, 0xc0, 0x7a, 0xa3, 0x1f, 0x89, 0xf1, + 0xe8, 0xcc, 0x8b, 0x78, 0xa8, 0x6c, 0xa0, 0x8b, 0x98, 0x93, 0xb1, 0x37, 0x50, 0x38, 0xb8, 0x19, + 0x89, 0x48, 0x49, 0xbb, 0x4c, 0x66, 0x9e, 0x2f, 0x37, 0xa3, 0x41, 0xc6, 0x80, 0x61, 0xb0, 0xcf, + 0x00, 0x0e, 0x6e, 0x54, 0xe4, 0x1d, 0x0a, 0x0c, 0xec, 0x3a, 0x05, 0x36, 0x21, 0xc1, 0x84, 0x6a, + 0x0f, 0xbd, 0x3e, 0x6f, 0x37, 0x5b, 0x7e, 0xc0, 0xed, 0x8a, 0x4e, 0xa8, 0x84, 0x88, 0xb5, 0x20, + 0x7f, 0xe4, 0x5d, 0xf0, 0x40, 0xda, 0x1b, 0x64, 0xbd, 0xfe, 0x80, 0xd0, 0x6b, 0x82, 0x76, 0xc5, + 0xb0, 0xd1, 0xd2, 0x09, 0x57, 0xd7, 0x22, 0x1a, 0x1c, 0x8b, 0x1e, 0xb7, 0x9f, 0x68, 0x4b, 0x09, + 0x11, 0x7b, 0x09, 0x95, 0x13, 0xa1, 0xc3, 0xeb, 0x07, 0x8a, 0x47, 0xf6, 0x26, 0xb9, 0x3b, 0x2f, + 0xa4, 0xc4, 0x0d, 0x3c, 0x75, 0x29, 0xa2, 0xa1, 0xb4, 0x9f, 0x12, 0x62, 0x26, 0x60, 0xbf, 0x82, + 0x42, 0x87, 0x77, 0x23, 0xae, 0xa4, 0xcd, 0xc8, 0xdd, 0x4f, 0x97, 0xbb, 0xab, 0x41, 0x6e, 0x0c, + 0xc6, 0xec, 0xeb, 0x5c, 0x0d, 0x3b, 0xfe, 0x9f, 0xb9, 0xfd, 0xe3, 0x6d, 0xab, 0x96, 0x75, 0xe3, + 0x2d, 0xfb, 0x12, 0xb2, 0x9d, 0xce, 0xa1, 0xbd, 0x45, 0xda, 0x3e, 0x49, 0xd1, 0xd6, 0x39, 0x74, + 0x11, 0xc5, 0x18, 0xe4, 0xce, 0xbd, 0xbe, 0xb4, 0x3f, 0x22, 0xbf, 0x68, 0xcd, 0x3e, 0x86, 0xfc, + 0xb9, 0x17, 0xf5, 0xb9, 0xb2, 0x3f, 0xa6, 0x33, 0x9b, 0x1d, 0x7b, 0x0d, 0x85, 0x77, 0x81, 0x3f, + 0xf4, 0x95, 0xb4, 0x7f, 0x42, 0xad, 0xe1, 0xd9, 0x72, 0xe5, 0x1a, 0x74, 0x3a, 0x52, 0x6e, 0x8c, + 0x67, 0xaf, 0x20, 0x77, 0x3a, 0x52, 0xd2, 0xfe, 0x84, 0x78, 0x2f, 0x52, 0xd2, 0x4e, 0x0c, 0x87, + 0x22, 0x8c, 0x7b, 0x0a, 0x11, 0xaa, 0xbf, 0x01, 0xb6, 0x58, 0x9f, 0xd8, 0xb6, 0x06, 0xfc, 0x36, + 0x6e, 0x5b, 0x03, 0x7e, 0x8b, 0x25, 0x3a, 0xf1, 0x82, 0x71, 0xdc, 0x3c, 0xf4, 0xe6, 0xfb, 0xcc, + 0x77, 0x56, 0xf5, 0x2d, 0x6c, 0xcc, 0x17, 0xd6, 0xa3, 0xd8, 0xaf, 0xa1, 0x9c, 0xc8, 0x8d, 0xc7, + 0x50, 0x9d, 0x7f, 0x59, 0x50, 0x4e, 0xa4, 0x38, 0x85, 0xfa, 0x76, 0xc4, 0x0d, 0x99, 0xd6, 0x6c, + 0x1f, 0xd6, 0xf6, 0x94, 0x8a, 0xb0, 0xd7, 0xe2, 0x6d, 0xfd, 0xe2, 0xde, 0x42, 0xa9, 0x13, 0x5c, + 0x27, 0xaa, 0xa6, 0x62, 0x9e, 0x36, 0xb9, 0x54, 0x7e, 0xe8, 0x61, 0xe0, 0x4c, 0x6b, 0x4c, 0x8a, + 0xaa, 0xdf, 0x01, 0xcc, 0x68, 0x8f, 0x3a, 0xc3, 0x3f, 0x2c, 0x78, 0xba, 0xd0, 0x0d, 0x96, 0x9e, + 0xe4, 0x70, 0xfe, 0x24, 0xbb, 0x0f, 0xec, 0x2c, 0x8b, 0xe7, 0xf9, 0x3f, 0xbc, 0xd5, 0x99, 0xcf, + 0x36, 0x20, 0xd3, 0x6e, 0x1a, 0x46, 0xa6, 0xdd, 0x44, 0x02, 0x4e, 0x1a, 0xed, 0x5a, 0xc9, 0xd5, + 0x1b, 0xa7, 0x05, 0x79, 0x5d, 0x4b, 0x0b, 0xf8, 0x2a, 0x14, 0xb1, 0x91, 0xd0, 0xc0, 0xd2, 0x36, + 0xa6, 0x7b, 0x74, 0xe7, 0x20, 0x9c, 0x98, 0x20, 0xe3, 0xd2, 0xf9, 0xbb, 0x05, 0xa5, 0x69, 0xc6, + 0xb3, 0x06, 0xe4, 0xc9, 0x1f, 0x69, 0x5b, 0x14, 0x87, 0x2f, 0xef, 0x29, 0x91, 0xfa, 0x7b, 0x42, + 0x9b, 0xce, 0xa3, 0xa9, 0xd5, 0x1f, 0xa0, 0x9c, 0x10, 0x2f, 0x09, 0xc1, 0x6e, 0x32, 0x04, 0xa9, + 0x2d, 0x43, 0x1b, 0x49, 0x06, 0xa8, 0x09, 0x79, 0x2d, 0xc4, 0x2b, 0xa4, 0x59, 0x6b, 0xae, 0x90, + 0x26, 0x2c, 0x83, 0xdc, 0xa1, 0x17, 0xf5, 0x48, 0x69, 0xd6, 0xa5, 0x35, 0xca, 0x3a, 0xe2, 0x52, + 0xd1, 0x81, 0xb3, 0x2e, 0xad, 0x9d, 0xff, 0x58, 0x50, 0x99, 0xab, 0x55, 0x6c, 0x46, 0x54, 0x63, + 0x3c, 0x32, 0x0a, 0xe3, 0x2d, 0xce, 0x8b, 0x63, 0xae, 0xbc, 0x9e, 0xa7, 0x3c, 0xea, 0xd7, 0x3a, + 0x9e, 0x73, 0x32, 0x64, 0x9b, 0x8e, 0x49, 0x66, 0x8a, 0x6e, 0xbc, 0x45, 0xeb, 0x67, 0xe3, 0x20, + 0xb0, 0x73, 0x24, 0xa6, 0xb5, 0x1e, 0x10, 0x58, 0x0f, 0x67, 0x63, 0x79, 0x65, 0xaf, 0xd1, 0x97, + 0x84, 0x64, 0xf6, 0xfd, 0x48, 0x78, 0x3d, 0x3b, 0x9f, 0xfc, 0x8e, 0x12, 0x3a, 0xd1, 0xfe, 0xe9, + 0xb1, 0x5d, 0xd0, 0x27, 0xc7, 0x35, 0x72, 0xce, 0x22, 0x31, 0xe1, 0xa1, 0x17, 0x76, 0xb9, 0x5d, + 0xa4, 0x2f, 0x09, 0x89, 0xf3, 0x4f, 0x0b, 0x2a, 0xe6, 0xdd, 0x24, 0x47, 0x22, 0x94, 0x9c, 0x71, + 0xd8, 0xd4, 0x3a, 0x79, 0x14, 0xcb, 0xcc, 0x8d, 0xbf, 0x5e, 0x31, 0x6e, 0x62, 0x68, 0xfd, 0x2e, + 0x57, 0xdf, 0xff, 0x82, 0xca, 0x6a, 0x03, 0x3e, 0x5a, 0x0a, 0x7d, 0x54, 0x59, 0x7c, 0x0e, 0x4f, + 0x9b, 0xbe, 0xec, 0x8a, 0x30, 0xe4, 0x5d, 0x95, 0xfa, 0xf2, 0x73, 0xb6, 0x80, 0x25, 0x61, 0xda, + 0x9a, 0xf3, 0x0c, 0xca, 0x47, 0xbe, 0x5c, 0x41, 0x73, 0x60, 0x5d, 0x03, 0x4c, 0x64, 0x18, 0xe4, + 0x06, 0xfc, 0x56, 0xe7, 0x7f, 0xc9, 0xa5, 0xb5, 0xf3, 0x37, 0x0b, 0xd6, 0xdb, 0xe1, 0x68, 0xac, + 0x8e, 0xb9, 0x94, 0x5e, 0x9f, 0xb3, 0xb7, 0x90, 0x6b, 0x87, 0xbe, 0x22, 0x3d, 0xe5, 0xdd, 0x2f, + 0x96, 0x87, 0x8c, 0x18, 0x08, 0x33, 0xac, 0xc3, 0x1f, 0xb9, 0xc4, 0xc2, 0x69, 0xd2, 0xf4, 0x94, + 0x67, 0xb2, 0x3f, 0xe5, 0x75, 0x81, 0x88, 0x04, 0x11, 0xb7, 0xfb, 0x05, 0x58, 0x23, 0xa5, 0xce, + 0x4b, 0xd8, 0xbc, 0xab, 0x7d, 0xc9, 0xd1, 0xbe, 0x81, 0x72, 0x42, 0x0b, 0xd5, 0xfe, 0x69, 0x8b, + 0x00, 0x45, 0x17, 0x97, 0x78, 0xd6, 0xa9, 0x23, 0xeb, 0xda, 0x86, 0xf3, 0x04, 0x2a, 0xa4, 0x7a, + 0x1a, 0xc1, 0xbf, 0x64, 0xa0, 0x10, 0xab, 0x78, 0x35, 0x77, 0xee, 0xe7, 0x69, 0xe7, 0x5e, 0x3c, + 0xf2, 0xb7, 0x90, 0x9b, 0xd6, 0x4f, 0xea, 0xe0, 0x6d, 0xf5, 0x12, 0x34, 0x2a, 0xad, 0x5f, 0x43, + 0xde, 0xe5, 0x12, 0x1f, 0x09, 0xd9, 0x55, 0x93, 0x57, 0x63, 0x66, 0x64, 0x43, 0x42, 0x7a, 0xc7, + 0xef, 0x87, 0x9e, 0xae, 0xc0, 0x54, 0xba, 0xc6, 0x24, 0xe8, 0x5a, 0x30, 0x0b, 0xf7, 0x08, 0xca, + 0x2b, 0x23, 0xcd, 0x4e, 0xe1, 0x09, 0x4e, 0x78, 0xcf, 0x0f, 0x79, 0xd4, 0x10, 0xe1, 0xa5, 0xdf, + 0x37, 0x27, 0xfd, 0x3c, 0xed, 0xa9, 0x30, 0x07, 0x76, 0xef, 0xb2, 0xb1, 0x62, 0xef, 0xca, 0xa8, + 0x33, 0x60, 0xf1, 0x8c, 0x84, 0x1f, 0x2a, 0x93, 0x9f, 0x09, 0x09, 0xba, 0xd5, 0x18, 0xf6, 0xcc, + 0x94, 0xc0, 0xe5, 0xac, 0xdb, 0x67, 0x4d, 0xb7, 0xc7, 0x1b, 0x7f, 0x27, 0x79, 0x44, 0xf1, 0x28, + 0xb9, 0xb4, 0xc6, 0xf7, 0xd2, 0x89, 0x20, 0xa9, 0xee, 0x46, 0x66, 0x47, 0xfa, 0xae, 0x75, 0x0b, + 0x42, 0x7d, 0xd7, 0x3d, 0xac, 0xd1, 0x13, 0x81, 0xb2, 0x02, 0x01, 0xf5, 0x06, 0x71, 0xe7, 0xea, + 0x96, 0xda, 0x4e, 0xd1, 0xc5, 0xa5, 0xb3, 0x07, 0xa5, 0xe9, 0x5d, 0xe2, 0x78, 0x6a, 0xf5, 0x28, + 0x58, 0x15, 0x37, 0xd3, 0xea, 0xc5, 0x69, 0x98, 0x59, 0x4c, 0xc3, 0x6c, 0x22, 0x0d, 0x5f, 0x41, + 0x65, 0xee, 0x56, 0x11, 0xe4, 0x8a, 0x6b, 0x69, 0x14, 0xd1, 0x1a, 0x65, 0x0d, 0x11, 0xe8, 0x5f, + 0x7a, 0x15, 0x97, 0xd6, 0xce, 0x0b, 0xa8, 0xcc, 0xdd, 0xe7, 0xb2, 0x51, 0xe1, 0x3c, 0x87, 0x4a, + 0x47, 0x79, 0x6a, 0x2c, 0xd3, 0xfb, 0xc2, 0x7f, 0x2d, 0xd8, 0x88, 0x31, 0xa6, 0x35, 0xfc, 0x12, + 0x8a, 0x13, 0x1e, 0x29, 0x7e, 0x33, 0x1d, 0x8f, 0x76, 0x1d, 0x7f, 0xc2, 0xd6, 0xe3, 0x9f, 0xb0, + 0x78, 0xb5, 0xef, 0x09, 0xe1, 0x4e, 0x91, 0xec, 0x7b, 0x28, 0x4a, 0xd2, 0xc3, 0xe3, 0xc7, 0xc5, + 0x67, 0x69, 0x2c, 0x63, 0x6f, 0x8a, 0x67, 0x3b, 0x90, 0x0b, 0x44, 0x5f, 0xd2, 0x0d, 0x96, 0x77, + 0x7f, 0x9a, 0xc6, 0x3b, 0x12, 0x7d, 0x97, 0x80, 0xec, 0x0d, 0x14, 0xaf, 0xbd, 0x28, 0xf4, 0xc3, + 0x7e, 0xfc, 0x13, 0xf2, 0x59, 0x1a, 0xe9, 0x07, 0x8d, 0x73, 0xa7, 0x04, 0xa7, 0x82, 0x69, 0x7e, + 0x29, 0x4c, 0x4c, 0x9c, 0xdf, 0x61, 0xd3, 0xc3, 0xad, 0x39, 0x7e, 0x1b, 0x2a, 0x3a, 0x99, 0xdf, + 0xf3, 0x48, 0xe2, 0x53, 0xcd, 0x5a, 0x55, 0x54, 0xfb, 0x49, 0xa8, 0x3b, 0xcf, 0x74, 0x3e, 0x98, + 0x79, 0x14, 0x0b, 0x70, 0x86, 0x8e, 0xbc, 0xee, 0xc0, 0xeb, 0xc7, 0xf7, 0x14, 0x6f, 0xf1, 0xcb, + 0xc4, 0xd8, 0xd3, 0x93, 0x21, 0xde, 0xe2, 0x3b, 0x27, 0xe2, 0x13, 0x5f, 0xce, 0x5e, 0x8d, 0xd3, + 0xfd, 0xee, 0xbf, 0x73, 0x00, 0x8d, 0xa9, 0x3f, 0xec, 0x0c, 0xd6, 0xc8, 0x1e, 0x73, 0x56, 0x4e, + 0x37, 0x3a, 0x77, 0xf5, 0xc5, 0x03, 0x26, 0x20, 0x7b, 0x07, 0x79, 0x7d, 0x5b, 0x2c, 0xad, 0xa9, + 0x24, 0xf3, 0xab, 0xfa, 0x72, 0x35, 0x48, 0x2b, 0xfd, 0xca, 0x62, 0xae, 0x69, 0x39, 0x69, 0x8e, + 0x26, 0xa7, 0x50, 0x9a, 0xa3, 0x73, 0xed, 0xbb, 0x66, 0xb1, 0xdf, 0x42, 0xbe, 0x1d, 0x4e, 0xc4, + 0x80, 0xb3, 0x9f, 0x2d, 0x27, 0xc4, 0xfa, 0x56, 0x7f, 0xae, 0x59, 0x5f, 0x59, 0xec, 0x18, 0x72, + 0x38, 0x2d, 0x59, 0x4a, 0xeb, 0x4f, 0x8c, 0xda, 0xaa, 0xb3, 0x0a, 0x62, 0xa2, 0xf8, 0x01, 0x60, + 0x36, 0xb3, 0x59, 0xca, 0xcf, 0xf9, 0x85, 0xe1, 0x5f, 0xad, 0xdd, 0x0f, 0x34, 0x06, 0x8e, 0x71, + 0x60, 0x5d, 0x0a, 0x96, 0x3a, 0xaa, 0xa6, 0xe9, 0x5e, 0x75, 0x56, 0x41, 0xb4, 0xba, 0xfd, 0xdc, + 0xef, 0x33, 0xa3, 0x8b, 0x8b, 0x3c, 0xfd, 0x33, 0xea, 0x9b, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, + 0x6e, 0x45, 0xe7, 0xe4, 0xf3, 0x12, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/controller/pb/controller.proto b/controller/pb/controller.proto index 8e19ee66..9cfd2794 100644 --- a/controller/pb/controller.proto +++ b/controller/pb/controller.proto @@ -40,13 +40,12 @@ message BuildOptions { string NetworkMode = 15; repeated string NoCacheFilter = 16; repeated string Platforms = 17; - bool Quiet = 18; - repeated Secret Secrets = 19; - int64 ShmSize = 20; - repeated SSH SSH = 21; - repeated string Tags = 22; - string Target = 23; - UlimitOpt Ulimits = 24; + repeated Secret Secrets = 18; + int64 ShmSize = 19; + repeated SSH SSH = 20; + repeated string Tags = 21; + string Target = 22; + UlimitOpt Ulimits = 23; CommonOptions Opts = 25; } @@ -95,7 +94,9 @@ message CommonOptions { string Provenance = 8; // TODO } -message BuildResponse {} +message BuildResponse { + map ExporterResponse = 1; +} message DisconnectRequest { string Ref = 1; diff --git a/controller/remote/client.go b/controller/remote/client.go index 68921fcb..8898c7f0 100644 --- a/controller/remote/client.go +++ b/controller/remote/client.go @@ -91,18 +91,21 @@ func (c *Client) Invoke(ctx context.Context, ref string, containerConfig pb.Cont }) } -func (c *Client) Build(ctx context.Context, options pb.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (string, error) { +func (c *Client) Build(ctx context.Context, options pb.BuildOptions, in io.ReadCloser, w io.Writer, out console.File, progressMode string) (string, *client.SolveResponse, error) { ref := identity.NewID() pw, err := progress.NewPrinter(context.TODO(), w, out, progressMode) if err != nil { - return "", err + return "", nil, err } statusChan := make(chan *client.SolveStatus) statusDone := make(chan struct{}) eg, egCtx := errgroup.WithContext(ctx) + var resp *client.SolveResponse eg.Go(func() error { defer close(statusChan) - return c.build(egCtx, ref, options, in, statusChan) + var err error + resp, err = c.build(egCtx, ref, options, in, statusChan) + return err }) eg.Go(func() error { defer close(statusDone) @@ -116,20 +119,27 @@ func (c *Client) Build(ctx context.Context, options pb.BuildOptions, in io.ReadC <-statusDone return pw.Wait() }) - return ref, eg.Wait() + return ref, resp, eg.Wait() } -func (c *Client) build(ctx context.Context, ref string, options pb.BuildOptions, in io.ReadCloser, statusChan chan *client.SolveStatus) error { +func (c *Client) build(ctx context.Context, ref string, options pb.BuildOptions, in io.ReadCloser, statusChan chan *client.SolveStatus) (*client.SolveResponse, error) { eg, egCtx := errgroup.WithContext(ctx) done := make(chan struct{}) + + var resp *client.SolveResponse + eg.Go(func() error { defer close(done) - if _, err := c.client().Build(egCtx, &pb.BuildRequest{ + pbResp, err := c.client().Build(egCtx, &pb.BuildRequest{ Ref: ref, Options: &options, - }); err != nil { + }) + if err != nil { return err } + resp = &client.SolveResponse{ + ExporterResponse: pbResp.ExporterResponse, + } return nil }) eg.Go(func() error { @@ -254,7 +264,7 @@ func (c *Client) build(ctx context.Context, ref string, options pb.BuildOptions, return eg2.Wait() }) } - return eg.Wait() + return resp, eg.Wait() } func (c *Client) client() pb.ControllerClient { diff --git a/controller/remote/controller.go b/controller/remote/controller.go index 3e3303a6..97508992 100644 --- a/controller/remote/controller.go +++ b/controller/remote/controller.go @@ -141,7 +141,7 @@ func serveCmd(dockerCli command.Cli) *cobra.Command { }() // prepare server - b := NewServer(func(ctx context.Context, options *controllerapi.BuildOptions, stdin io.Reader, statusChan chan *client.SolveStatus) (res *build.ResultContext, err error) { + b := NewServer(func(ctx context.Context, options *controllerapi.BuildOptions, stdin io.Reader, statusChan chan *client.SolveStatus) (*client.SolveResponse, *build.ResultContext, error) { return cbuild.RunBuild(ctx, dockerCli, *options, stdin, "quiet", statusChan) }) defer b.Close() diff --git a/controller/remote/server.go b/controller/remote/server.go index 1f27c603..072b5225 100644 --- a/controller/remote/server.go +++ b/controller/remote/server.go @@ -17,7 +17,7 @@ import ( "golang.org/x/sync/errgroup" ) -type BuildFunc func(ctx context.Context, options *pb.BuildOptions, stdin io.Reader, statusChan chan *client.SolveStatus) (res *build.ResultContext, err error) +type BuildFunc func(ctx context.Context, options *pb.BuildOptions, stdin io.Reader, statusChan chan *client.SolveStatus) (resp *client.SolveResponse, res *build.ResultContext, err error) func NewServer(buildFunc BuildFunc) *Server { return &Server{ @@ -150,7 +150,7 @@ func (m *Server) Build(ctx context.Context, req *pb.BuildRequest) (*pb.BuildResp // Build the specified request ctx, cancel := context.WithCancel(ctx) defer cancel() - res, err := m.buildFunc(ctx, req.Options, inR, statusChan) + resp, res, err := m.buildFunc(ctx, req.Options, inR, statusChan) m.sessionMu.Lock() if s, ok := m.session[ref]; ok { s.result = res @@ -162,7 +162,12 @@ func (m *Server) Build(ctx context.Context, req *pb.BuildRequest) (*pb.BuildResp } m.sessionMu.Unlock() - return &pb.BuildResponse{}, err + if resp == nil { + resp = &client.SolveResponse{} + } + return &pb.BuildResponse{ + ExporterResponse: resp.ExporterResponse, + }, err } func (m *Server) Status(req *pb.StatusRequest, stream pb.Controller_StatusServer) error { diff --git a/monitor/monitor.go b/monitor/monitor.go index da551389..0e2b62cb 100644 --- a/monitor/monitor.go +++ b/monitor/monitor.go @@ -121,7 +121,7 @@ func RunMonitor(ctx context.Context, curRef string, options controllerapi.BuildO fmt.Println("disconnect error", err) } } - ref, err := c.Build(ctx, options, nil, stdout, stderr, progressMode) // TODO: support stdin, hold build ref + ref, _, err := c.Build(ctx, options, nil, stdout, stderr, progressMode) // TODO: support stdin, hold build ref if err != nil { fmt.Printf("failed to reload: %v\n", err) } else {