From f72ea677f17634d84be8249c26bfa7aae62ad4b4 Mon Sep 17 00:00:00 2001 From: Kohei Tokunaga Date: Fri, 30 Jun 2023 20:13:10 +0900 Subject: [PATCH] Add Solve API for performing a build on a build definition This commit adds Solve API to the controller. This receives a build definition, performs that build using ResultHandler held by that session. After Solve completes, the client can debug the result using other APIs including Invoke. Note that the ResultHandle provided by Solve overwrites the ResultHandle previously stored in that session (possibly generated by the past Build or Solve API call). Using this API, user can perform build-and-debugging loop on the same session. Signed-off-by: Kohei Tokunaga --- build/result.go | 30 +++ controller/control/controller.go | 2 + controller/local/controller.go | 21 ++ controller/pb/controller.pb.go | 359 ++++++++++++++++++++----------- controller/pb/controller.proto | 9 + controller/remote/client.go | 50 +++++ controller/remote/server.go | 64 ++++++ 7 files changed, 415 insertions(+), 120 deletions(-) diff --git a/build/result.go b/build/result.go index 3cf531de..3bef7e18 100644 --- a/build/result.go +++ b/build/result.go @@ -8,6 +8,7 @@ import ( "sync" controllerapi "github.com/docker/buildx/controller/pb" + "github.com/docker/buildx/util/progress" "github.com/moby/buildkit/client" "github.com/moby/buildkit/exporter/containerimage/exptypes" gateway "github.com/moby/buildkit/frontend/gateway/client" @@ -93,6 +94,8 @@ func NewResultHandle(ctx context.Context, cc *client.Client, opt client.SolveOpt if res != nil && err == nil { if noEval { respHandle = &ResultHandle{ + client: cc, + solveOpt: opt, done: make(chan struct{}), gwClient: c, gwCtx: ctx, @@ -127,6 +130,8 @@ func NewResultHandle(ctx context.Context, cc *client.Client, opt client.SolveOpt var se *errdefs.SolveError if errors.As(err, &se) { respHandle = &ResultHandle{ + client: cc, + solveOpt: opt, done: make(chan struct{}), solveErr: se, gwClient: c, @@ -183,6 +188,8 @@ func NewResultHandle(ctx context.Context, cc *client.Client, opt client.SolveOpt return nil, errors.Wrap(err, "inconsistent solve result") } respHandle = &ResultHandle{ + client: cc, + solveOpt: opt, done: make(chan struct{}), res: res, gwClient: c, @@ -265,8 +272,27 @@ func evalDefinition(ctx context.Context, c gateway.Client, defs *result.Result[* return res, nil } +func SolveWithResultHandler(ctx context.Context, product string, resultCtx *ResultHandle, target *pb.Definition, pw progress.Writer) (*ResultHandle, error) { + opt := resultCtx.solveOpt + opt.Ref = "" + opt.Exports = nil + opt.CacheExports = nil + ch, done := progress.NewChannel(pw) + defer func() { <-done }() + h, _, err := NewResultHandle(ctx, resultCtx.client, opt, product, func(ctx context.Context, c gateway.Client) (*gateway.Result, error) { + return c.Solve(ctx, gateway.SolveRequest{ + Evaluate: true, + Definition: target, + }) + }, ch, false) + return h, err +} + // ResultHandle is a build result with the client that built it. type ResultHandle struct { + client *client.Client + solveOpt client.SolveOpt + res *gateway.Result solveErr *errdefs.SolveError @@ -295,6 +321,10 @@ func (r *ResultHandle) Done() { }) } +func (r *ResultHandle) SolveError() *errdefs.SolveError { + return r.solveErr +} + func (r *ResultHandle) registerCleanup(f func()) { r.cleanupsMu.Lock() r.cleanups = append(r.cleanups, f) diff --git a/controller/control/controller.go b/controller/control/controller.go index bdc5b7f8..ebb49ad4 100644 --- a/controller/control/controller.go +++ b/controller/control/controller.go @@ -7,6 +7,7 @@ import ( controllerapi "github.com/docker/buildx/controller/pb" "github.com/docker/buildx/util/progress" "github.com/moby/buildkit/client" + solverpb "github.com/moby/buildkit/solver/pb" ) type BuildxController interface { @@ -23,6 +24,7 @@ type BuildxController interface { ListProcesses(ctx context.Context, ref string) (infos []*controllerapi.ProcessInfo, retErr error) DisconnectProcess(ctx context.Context, ref, pid string) error Inspect(ctx context.Context, ref string) (*controllerapi.InspectResponse, error) + Solve(ctx context.Context, ref string, def *solverpb.Definition, progress progress.Writer) error } type ControlOptions struct { diff --git a/controller/local/controller.go b/controller/local/controller.go index fb1cd282..fea60068 100644 --- a/controller/local/controller.go +++ b/controller/local/controller.go @@ -15,6 +15,7 @@ import ( "github.com/docker/buildx/util/progress" "github.com/docker/cli/cli/command" "github.com/moby/buildkit/client" + solverpb "github.com/moby/buildkit/solver/pb" "github.com/pkg/errors" ) @@ -40,6 +41,8 @@ type localController struct { processes *processes.Manager buildOnGoing atomic.Bool + + originalResult *build.ResultHandle } func (b *localController) Build(ctx context.Context, options controllerapi.BuildOptions, in io.ReadCloser, progress progress.Writer) (string, *client.SolveResponse, error) { @@ -55,6 +58,7 @@ func (b *localController) Build(ctx context.Context, options controllerapi.Build resultCtx: res, buildOptions: &options, } + b.originalResult = res if buildErr != nil { buildErr = controllererrors.WrapBuild(buildErr, b.ref) } @@ -144,3 +148,20 @@ func (b *localController) Inspect(ctx context.Context, ref string) (*controllera } return &controllerapi.InspectResponse{Options: b.buildConfig.buildOptions}, nil } + +func (b *localController) Solve(ctx context.Context, ref string, target *solverpb.Definition, progress progress.Writer) error { + if ref != b.ref { + return errors.Errorf("unknown ref %q", ref) + } + if b.originalResult == nil { + return errors.Errorf("no build has been called") + } + res, err := build.SolveWithResultHandler(ctx, "buildx", b.originalResult, target, progress) + if err == nil { + b.buildConfig.resultCtx = res + if se := res.SolveError(); se != nil { + err = errors.Errorf("failed solve: %v", se) + } + } + return err +} diff --git a/controller/pb/controller.pb.go b/controller/pb/controller.pb.go index da8df559..74c450ee 100644 --- a/controller/pb/controller.pb.go +++ b/controller/pb/controller.pb.go @@ -8,6 +8,7 @@ import ( fmt "fmt" proto "github.com/gogo/protobuf/proto" control "github.com/moby/buildkit/api/services/control" + pb1 "github.com/moby/buildkit/solver/pb" pb "github.com/moby/buildkit/sourcepolicy/pb" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -2004,6 +2005,82 @@ func (m *BuildxVersion) GetRevision() string { return "" } +type SolveRequest struct { + Ref string `protobuf:"bytes,1,opt,name=Ref,proto3" json:"Ref,omitempty"` + Target *pb1.Definition `protobuf:"bytes,2,opt,name=Target,proto3" json:"Target,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SolveRequest) Reset() { *m = SolveRequest{} } +func (m *SolveRequest) String() string { return proto.CompactTextString(m) } +func (*SolveRequest) ProtoMessage() {} +func (*SolveRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_ed7f10298fa1d90f, []int{37} +} +func (m *SolveRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SolveRequest.Unmarshal(m, b) +} +func (m *SolveRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SolveRequest.Marshal(b, m, deterministic) +} +func (m *SolveRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SolveRequest.Merge(m, src) +} +func (m *SolveRequest) XXX_Size() int { + return xxx_messageInfo_SolveRequest.Size(m) +} +func (m *SolveRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SolveRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SolveRequest proto.InternalMessageInfo + +func (m *SolveRequest) GetRef() string { + if m != nil { + return m.Ref + } + return "" +} + +func (m *SolveRequest) GetTarget() *pb1.Definition { + if m != nil { + return m.Target + } + return nil +} + +type SolveResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SolveResponse) Reset() { *m = SolveResponse{} } +func (m *SolveResponse) String() string { return proto.CompactTextString(m) } +func (*SolveResponse) ProtoMessage() {} +func (*SolveResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_ed7f10298fa1d90f, []int{38} +} +func (m *SolveResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SolveResponse.Unmarshal(m, b) +} +func (m *SolveResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SolveResponse.Marshal(b, m, deterministic) +} +func (m *SolveResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_SolveResponse.Merge(m, src) +} +func (m *SolveResponse) XXX_Size() int { + return xxx_messageInfo_SolveResponse.Size(m) +} +func (m *SolveResponse) XXX_DiscardUnknown() { + xxx_messageInfo_SolveResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_SolveResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*ListProcessesRequest)(nil), "buildx.controller.v1.ListProcessesRequest") proto.RegisterType((*ListProcessesResponse)(nil), "buildx.controller.v1.ListProcessesResponse") @@ -2049,131 +2126,137 @@ func init() { proto.RegisterType((*InfoRequest)(nil), "buildx.controller.v1.InfoRequest") proto.RegisterType((*InfoResponse)(nil), "buildx.controller.v1.InfoResponse") proto.RegisterType((*BuildxVersion)(nil), "buildx.controller.v1.BuildxVersion") + proto.RegisterType((*SolveRequest)(nil), "buildx.controller.v1.SolveRequest") + proto.RegisterType((*SolveResponse)(nil), "buildx.controller.v1.SolveResponse") } func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) } var fileDescriptor_ed7f10298fa1d90f = []byte{ - // 1895 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xef, 0x6e, 0x1b, 0xc7, - 0x11, 0xef, 0x89, 0x14, 0xff, 0x0c, 0x45, 0x59, 0xde, 0xca, 0xee, 0xfa, 0xec, 0xc4, 0xf2, 0xd9, - 0x4e, 0x89, 0xba, 0xa0, 0x12, 0xa5, 0xae, 0xe2, 0x38, 0x01, 0x2a, 0x51, 0x22, 0xa4, 0xc0, 0x96, - 0x84, 0xa5, 0xec, 0xa0, 0x2d, 0xd0, 0xe0, 0x48, 0xae, 0xa8, 0x83, 0x8e, 0xb7, 0xec, 0xed, 0x52, - 0x7f, 0xfa, 0xa9, 0x5f, 0xfa, 0xad, 0xe8, 0x7b, 0x14, 0x7d, 0x84, 0x7e, 0xea, 0x4b, 0xf4, 0x31, - 0x8a, 0x3e, 0x42, 0xb1, 0xb3, 0x7b, 0xe4, 0x51, 0xe4, 0x51, 0x52, 0xf3, 0x89, 0x3b, 0x73, 0xbf, - 0xdf, 0xec, 0xce, 0xdc, 0xec, 0xcc, 0x1c, 0x61, 0xa5, 0x23, 0x22, 0x15, 0x8b, 0x30, 0xe4, 0x71, - 0x7d, 0x10, 0x0b, 0x25, 0xc8, 0x6a, 0x7b, 0x18, 0x84, 0xdd, 0xcb, 0x7a, 0xea, 0xc1, 0xf9, 0x17, - 0xee, 0xdb, 0x5e, 0xa0, 0x4e, 0x87, 0xed, 0x7a, 0x47, 0xf4, 0xd7, 0xfb, 0xa2, 0x7d, 0xb5, 0x8e, - 0xa8, 0xb3, 0x40, 0xad, 0xfb, 0x83, 0x60, 0x5d, 0xf2, 0xf8, 0x3c, 0xe8, 0x70, 0xb9, 0x6e, 0x49, - 0xc9, 0xaf, 0x31, 0xe9, 0xbe, 0xce, 0x24, 0x4b, 0x31, 0x8c, 0x3b, 0x7c, 0x20, 0xc2, 0xa0, 0x73, - 0xb5, 0x3e, 0x68, 0xaf, 0x9b, 0x95, 0xa1, 0x79, 0x35, 0x58, 0x7d, 0x17, 0x48, 0x75, 0x14, 0x8b, - 0x0e, 0x97, 0x92, 0x4b, 0xc6, 0xff, 0x38, 0xe4, 0x52, 0x91, 0x15, 0xc8, 0x31, 0x7e, 0x42, 0x9d, - 0x35, 0xa7, 0x56, 0x66, 0x7a, 0xe9, 0x1d, 0xc1, 0x83, 0x6b, 0x48, 0x39, 0x10, 0x91, 0xe4, 0x64, - 0x13, 0x16, 0xf7, 0xa3, 0x13, 0x21, 0xa9, 0xb3, 0x96, 0xab, 0x55, 0x36, 0x9e, 0xd5, 0x67, 0x39, - 0x57, 0xb7, 0x3c, 0x8d, 0x64, 0x06, 0xef, 0x49, 0xa8, 0xa4, 0xb4, 0xe4, 0x09, 0x94, 0x13, 0x71, - 0xc7, 0x6e, 0x3c, 0x56, 0x90, 0x26, 0x2c, 0xed, 0x47, 0xe7, 0xe2, 0x8c, 0x37, 0x44, 0x74, 0x12, - 0xf4, 0xe8, 0xc2, 0x9a, 0x53, 0xab, 0x6c, 0x78, 0xb3, 0x37, 0x4b, 0x23, 0xd9, 0x04, 0xcf, 0xfb, - 0x0e, 0xe8, 0x4e, 0x20, 0x3b, 0x22, 0x8a, 0x78, 0x27, 0x71, 0x26, 0xd3, 0xe9, 0xc9, 0x33, 0x2d, - 0x5c, 0x3b, 0x93, 0xf7, 0x18, 0x1e, 0xcd, 0xb0, 0x65, 0xc2, 0xe2, 0xfd, 0x01, 0x96, 0xb6, 0xf5, - 0xd9, 0xb2, 0x8d, 0x7f, 0x03, 0xc5, 0xc3, 0x81, 0x0a, 0x44, 0x24, 0xe7, 0x7b, 0x83, 0x66, 0x2c, - 0x92, 0x25, 0x14, 0xef, 0xdf, 0x15, 0xbb, 0x81, 0x55, 0x90, 0x35, 0xa8, 0x34, 0x44, 0xa4, 0xf8, - 0xa5, 0x3a, 0xf2, 0xd5, 0xa9, 0xdd, 0x28, 0xad, 0x22, 0x9f, 0xc1, 0xf2, 0x8e, 0xe8, 0x9c, 0xf1, - 0xf8, 0x24, 0x08, 0xf9, 0x81, 0xdf, 0xe7, 0xd6, 0xa5, 0x6b, 0x5a, 0xf2, 0xad, 0xf6, 0x3a, 0x88, - 0x54, 0x73, 0x18, 0x75, 0x68, 0x0e, 0x8f, 0xf6, 0x34, 0xeb, 0xad, 0x5a, 0x18, 0x1b, 0x33, 0xc8, - 0xef, 0xa1, 0xaa, 0xcd, 0x74, 0xed, 0xd6, 0x92, 0xe6, 0x31, 0x31, 0x5e, 0xdf, 0xec, 0x5d, 0x7d, - 0x82, 0xb7, 0x1b, 0xa9, 0xf8, 0x8a, 0x4d, 0xda, 0x22, 0xab, 0xb0, 0xb8, 0x15, 0x86, 0xe2, 0x82, - 0x2e, 0xae, 0xe5, 0x6a, 0x65, 0x66, 0x04, 0xf2, 0x6b, 0x28, 0x6e, 0x29, 0xc5, 0xa5, 0x92, 0xb4, - 0x80, 0x9b, 0x3d, 0x99, 0xbd, 0x99, 0x01, 0xb1, 0x04, 0x4c, 0x0e, 0xa1, 0x8c, 0xfb, 0x6f, 0xc5, - 0x3d, 0x49, 0x8b, 0xc8, 0xfc, 0xe2, 0x16, 0xc7, 0x1c, 0x71, 0xcc, 0x11, 0xc7, 0x36, 0xc8, 0x2e, - 0x94, 0x1b, 0x7e, 0xe7, 0x94, 0x37, 0x63, 0xd1, 0xa7, 0x25, 0x34, 0xf8, 0xf3, 0xd9, 0x06, 0x11, - 0x66, 0x0d, 0x5a, 0x33, 0x23, 0x26, 0xd9, 0x82, 0x22, 0x0a, 0xc7, 0x82, 0x96, 0xef, 0x66, 0x24, - 0xe1, 0x11, 0x0f, 0x96, 0x1a, 0xbd, 0x58, 0x0c, 0x07, 0x47, 0x7e, 0xcc, 0x23, 0x45, 0x01, 0x5f, - 0xf5, 0x84, 0x8e, 0xbc, 0x85, 0xe2, 0xee, 0xe5, 0x40, 0xc4, 0x4a, 0xd2, 0xca, 0xbc, 0xcb, 0x6b, - 0x40, 0x76, 0x03, 0xcb, 0x20, 0x9f, 0x02, 0xec, 0x5e, 0xaa, 0xd8, 0xdf, 0x13, 0x3a, 0xec, 0x4b, - 0xf8, 0x3a, 0x52, 0x1a, 0xd2, 0x84, 0xc2, 0x3b, 0xbf, 0xcd, 0x43, 0x49, 0xab, 0x68, 0xbb, 0x7e, - 0x8b, 0xc0, 0x1a, 0x82, 0xd9, 0xc8, 0xb2, 0x75, 0x5e, 0x1f, 0x70, 0x75, 0x21, 0xe2, 0xb3, 0xf7, - 0xa2, 0xcb, 0xe9, 0xb2, 0xc9, 0xeb, 0x94, 0x8a, 0xbc, 0x80, 0xea, 0x81, 0x30, 0xc1, 0x0b, 0x42, - 0xc5, 0x63, 0x7a, 0x0f, 0x0f, 0x33, 0xa9, 0xc4, 0xbb, 0x1c, 0xfa, 0xea, 0x44, 0xc4, 0x7d, 0x49, - 0x57, 0x10, 0x31, 0x56, 0xe8, 0x0c, 0x6a, 0xf1, 0x4e, 0xcc, 0x95, 0xa4, 0xf7, 0xe7, 0x65, 0x90, - 0x01, 0xb1, 0x04, 0x4c, 0x28, 0x14, 0x5b, 0xa7, 0xfd, 0x56, 0xf0, 0x27, 0x4e, 0xc9, 0x9a, 0x53, - 0xcb, 0xb1, 0x44, 0x24, 0xaf, 0x20, 0xd7, 0x6a, 0xed, 0xd1, 0x9f, 0xa2, 0xb5, 0x47, 0x19, 0xd6, - 0x5a, 0x7b, 0x4c, 0xa3, 0x08, 0x81, 0xfc, 0xb1, 0xdf, 0x93, 0x74, 0x15, 0xcf, 0x85, 0x6b, 0xf2, - 0x10, 0x0a, 0xc7, 0x7e, 0xdc, 0xe3, 0x8a, 0x3e, 0x40, 0x9f, 0xad, 0x44, 0xde, 0x40, 0xf1, 0x43, - 0x18, 0xf4, 0x03, 0x25, 0xe9, 0xc3, 0x79, 0x97, 0xd3, 0x80, 0x0e, 0x07, 0x8a, 0x25, 0x78, 0x7d, - 0x5a, 0x8c, 0x37, 0x8f, 0xe9, 0xcf, 0xd0, 0x66, 0x22, 0xea, 0x27, 0x36, 0x5c, 0x94, 0xae, 0x39, - 0xb5, 0x12, 0x4b, 0x44, 0x7d, 0xb4, 0xa3, 0x61, 0x18, 0xd2, 0x47, 0xa8, 0xc6, 0xb5, 0x79, 0xf7, - 0x3a, 0x0d, 0x8e, 0x86, 0xf2, 0x94, 0xba, 0xf8, 0x24, 0xa5, 0x19, 0x3f, 0x7f, 0x27, 0xfc, 0x2e, - 0x7d, 0x9c, 0x7e, 0xae, 0x35, 0x64, 0x1f, 0x96, 0x5a, 0xd8, 0x96, 0x8e, 0xb0, 0x19, 0xd1, 0x27, - 0xe8, 0xc7, 0xcb, 0xba, 0xee, 0x5c, 0xf5, 0xa4, 0x73, 0x69, 0x1f, 0xd2, 0xcd, 0xab, 0x6e, 0xc0, - 0x6c, 0x82, 0xaa, 0x0b, 0xc2, 0x0e, 0x6f, 0x0f, 0x7b, 0xf4, 0x13, 0xdc, 0xc5, 0x08, 0xee, 0x6f, - 0x80, 0x4c, 0xd7, 0x12, 0x5d, 0x83, 0xcf, 0xf8, 0x55, 0x52, 0x83, 0xcf, 0x38, 0xb2, 0xcf, 0xfd, - 0x70, 0x98, 0x54, 0x42, 0x23, 0x7c, 0xbd, 0xf0, 0x95, 0xe3, 0x7e, 0x03, 0xcb, 0x93, 0xd7, 0xfc, - 0x4e, 0xec, 0x37, 0x50, 0x49, 0xe5, 0xf2, 0x5d, 0xa8, 0xde, 0xbf, 0x1c, 0xa8, 0xa4, 0x2e, 0x1c, - 0xa6, 0xc6, 0xd5, 0x80, 0x5b, 0x32, 0xae, 0xc9, 0x36, 0x2c, 0x6e, 0x29, 0x15, 0xeb, 0xc6, 0xa1, - 0xb3, 0xeb, 0x97, 0x37, 0x5e, 0xdb, 0x3a, 0xc2, 0xcd, 0xc5, 0x32, 0x54, 0x7d, 0xaf, 0x76, 0xb8, - 0x54, 0x41, 0xe4, 0xeb, 0xbb, 0x87, 0x75, 0xbe, 0xcc, 0xd2, 0x2a, 0xf7, 0x2b, 0x80, 0x31, 0xed, - 0x4e, 0x3e, 0xfc, 0xc3, 0x81, 0xfb, 0x53, 0xb5, 0x69, 0xa6, 0x27, 0x7b, 0x93, 0x9e, 0x6c, 0xdc, - 0xb2, 0xce, 0x4d, 0xfb, 0xf3, 0x23, 0x4e, 0x7b, 0x00, 0x05, 0xd3, 0x10, 0x66, 0x9e, 0xd0, 0x85, - 0xd2, 0x4e, 0x20, 0xfd, 0x76, 0xc8, 0xbb, 0x48, 0x2d, 0xb1, 0x91, 0x8c, 0xdd, 0x08, 0x4f, 0x6f, - 0xa2, 0x67, 0x04, 0xcf, 0xdc, 0x7c, 0xb2, 0x0c, 0x0b, 0xa3, 0x49, 0x66, 0x61, 0x7f, 0x47, 0x83, - 0x75, 0x1b, 0x36, 0xae, 0x96, 0x99, 0x11, 0xbc, 0x26, 0x14, 0x4c, 0x2d, 0x99, 0xc2, 0xbb, 0x50, - 0x6a, 0x06, 0x21, 0xc7, 0x6e, 0x6e, 0xce, 0x3c, 0x92, 0xb5, 0x7b, 0xbb, 0xd1, 0xb9, 0xdd, 0x56, - 0x2f, 0xbd, 0xcd, 0x54, 0xd3, 0xd6, 0x7e, 0x60, 0x7f, 0xb7, 0x7e, 0x60, 0x57, 0x7f, 0x08, 0x85, - 0xa6, 0x88, 0xfb, 0xbe, 0xb2, 0xc6, 0xac, 0xe4, 0x79, 0xb0, 0xbc, 0x1f, 0xc9, 0x01, 0xef, 0xa8, - 0xec, 0xe1, 0xef, 0x10, 0xee, 0x8d, 0x30, 0x76, 0xec, 0x4b, 0x4d, 0x2f, 0xce, 0xdd, 0xa7, 0x97, - 0xbf, 0x3b, 0x50, 0x1e, 0xd5, 0x27, 0xd2, 0x80, 0x02, 0xbe, 0x8d, 0x64, 0x86, 0x7c, 0x75, 0x43, - 0x41, 0xab, 0x7f, 0x44, 0xb4, 0xed, 0x13, 0x86, 0xea, 0x7e, 0x0f, 0x95, 0x94, 0x7a, 0x46, 0x02, - 0x6c, 0xa4, 0x13, 0x20, 0xb3, 0xc0, 0x9b, 0x4d, 0xd2, 0xe9, 0xb1, 0x03, 0x05, 0xa3, 0x9c, 0x19, - 0x56, 0x02, 0xf9, 0x3d, 0x3f, 0x36, 0xa9, 0x91, 0x63, 0xb8, 0xd6, 0xba, 0x96, 0x38, 0x51, 0xf8, - 0x7a, 0x72, 0x0c, 0xd7, 0xde, 0x3f, 0x1d, 0xa8, 0xda, 0x81, 0xd0, 0x46, 0x90, 0xc3, 0x8a, 0xb9, - 0xa1, 0x3c, 0x4e, 0x74, 0xd6, 0xff, 0x37, 0x73, 0x42, 0x99, 0x40, 0xeb, 0xd7, 0xb9, 0x26, 0x1a, - 0x53, 0x26, 0xdd, 0x06, 0x3c, 0x98, 0x09, 0xbd, 0xd3, 0x15, 0x79, 0x09, 0xf7, 0xc7, 0xa3, 0x6e, - 0x76, 0x9e, 0xac, 0x02, 0x49, 0xc3, 0xec, 0x28, 0xfc, 0x14, 0x2a, 0xfa, 0xd3, 0x21, 0x9b, 0xe6, - 0xc1, 0x92, 0x01, 0xd8, 0xc8, 0x10, 0xc8, 0x9f, 0xf1, 0x2b, 0x93, 0x0d, 0x65, 0x86, 0x6b, 0xef, - 0x6f, 0x8e, 0xfe, 0x02, 0x18, 0x0c, 0xd5, 0x7b, 0x2e, 0xa5, 0xdf, 0xd3, 0x09, 0x98, 0xdf, 0x8f, - 0x02, 0x65, 0xb3, 0xef, 0xb3, 0xac, 0x2f, 0x81, 0xc1, 0x50, 0x69, 0x98, 0x65, 0xed, 0xfd, 0x84, - 0x21, 0x8b, 0x6c, 0x42, 0x7e, 0xc7, 0x57, 0xbe, 0xcd, 0x85, 0x8c, 0xb9, 0x47, 0x23, 0x52, 0x44, - 0x2d, 0x6e, 0x17, 0xf5, 0xe7, 0xce, 0x60, 0xa8, 0xbc, 0x17, 0xb0, 0x72, 0xdd, 0xfa, 0x0c, 0xd7, - 0xbe, 0x84, 0x4a, 0xca, 0x0a, 0xde, 0xdb, 0xc3, 0x26, 0x02, 0x4a, 0x4c, 0x2f, 0xb5, 0xaf, 0xa3, - 0x83, 0x2c, 0x99, 0x3d, 0xbc, 0x7b, 0x50, 0x45, 0xd3, 0xa3, 0x08, 0xfe, 0x79, 0x01, 0x8a, 0x89, - 0x89, 0xcd, 0x09, 0xbf, 0x9f, 0x65, 0xf9, 0x3d, 0xed, 0xf2, 0x6b, 0xc8, 0xeb, 0xfa, 0x61, 0x5d, - 0xce, 0x18, 0x1a, 0x9a, 0xdd, 0x14, 0x4d, 0xc3, 0xc9, 0xb7, 0x50, 0x60, 0x5c, 0xea, 0x01, 0xc7, - 0x7c, 0x0a, 0x3c, 0x9f, 0x4d, 0x34, 0x98, 0x31, 0xd9, 0x92, 0x34, 0xbd, 0x15, 0xf4, 0x22, 0x3f, - 0xa4, 0xf9, 0x79, 0x74, 0x83, 0x49, 0xd1, 0x8d, 0x62, 0x1c, 0xee, 0xbf, 0x38, 0x50, 0x99, 0x1b, - 0xea, 0xf9, 0x1f, 0x6b, 0x53, 0x1f, 0x90, 0xb9, 0xff, 0xf3, 0x03, 0xf2, 0x3f, 0xce, 0xa4, 0x21, - 0x9c, 0x75, 0xf4, 0x7d, 0x1a, 0x88, 0x20, 0x52, 0x36, 0x65, 0x53, 0x1a, 0x7d, 0xd0, 0x46, 0xbf, - 0x6b, 0x8b, 0xbe, 0x5e, 0x8e, 0x8b, 0x77, 0xce, 0x16, 0x6f, 0x9d, 0x04, 0x1f, 0x24, 0x8f, 0x31, - 0x44, 0x65, 0x86, 0x6b, 0x5d, 0xaf, 0x0f, 0x04, 0x6a, 0x17, 0x31, 0x5b, 0xac, 0x84, 0xf6, 0x2e, - 0xba, 0xb4, 0x60, 0x1c, 0x6f, 0x5c, 0x60, 0x17, 0x3a, 0x10, 0x5a, 0x57, 0x34, 0x23, 0x10, 0x0a, - 0x1a, 0x77, 0xac, 0xae, 0x68, 0xc9, 0xa4, 0xda, 0xb1, 0xba, 0xd2, 0x0d, 0x85, 0x89, 0x30, 0x6c, - 0xfb, 0x9d, 0x33, 0x5a, 0x36, 0x9d, 0x2c, 0x91, 0xf5, 0xfc, 0xa7, 0xa3, 0x1b, 0xf8, 0x21, 0x7e, - 0x29, 0x94, 0x58, 0x22, 0x7a, 0x5b, 0x50, 0x1e, 0x25, 0x85, 0xee, 0x51, 0xcd, 0x2e, 0x06, 0xbd, - 0xca, 0x16, 0x9a, 0xdd, 0x24, 0x9f, 0x17, 0xa6, 0xf3, 0x39, 0x97, 0xca, 0xe7, 0x4d, 0xa8, 0x4e, - 0xa4, 0x87, 0x06, 0x31, 0x71, 0x21, 0xad, 0x21, 0x5c, 0x6b, 0x5d, 0x43, 0x84, 0xe6, 0x5b, 0xb8, - 0xca, 0x70, 0xed, 0x3d, 0x87, 0xea, 0x44, 0x62, 0xcc, 0xaa, 0xc0, 0xde, 0x33, 0xa8, 0xb6, 0x94, - 0xaf, 0x86, 0x73, 0xfe, 0xbc, 0xf8, 0xaf, 0x03, 0xcb, 0x09, 0xc6, 0xd6, 0x98, 0x5f, 0x41, 0xe9, - 0x9c, 0xc7, 0x8a, 0x5f, 0x8e, 0xba, 0x0e, 0x9d, 0x1e, 0x3f, 0x3f, 0x22, 0x82, 0x8d, 0x90, 0xe4, - 0x6b, 0x28, 0x49, 0xb4, 0xc3, 0x93, 0x89, 0xe5, 0xd3, 0x2c, 0x96, 0xdd, 0x6f, 0x84, 0x27, 0xeb, - 0x90, 0x0f, 0x45, 0x4f, 0xe2, 0x7b, 0xaf, 0x6c, 0x3c, 0xce, 0xe2, 0xbd, 0x13, 0x3d, 0x86, 0x40, - 0xf2, 0x16, 0x4a, 0x17, 0x7e, 0x1c, 0x05, 0x51, 0x2f, 0xf9, 0x86, 0x7e, 0x9a, 0x45, 0xfa, 0xde, - 0xe0, 0xd8, 0x88, 0xe0, 0x55, 0xf5, 0x75, 0x39, 0x11, 0x36, 0x26, 0xde, 0x6f, 0x75, 0xd6, 0x6a, - 0xd1, 0xba, 0xbf, 0x0f, 0x55, 0x93, 0xf9, 0x1f, 0x79, 0x2c, 0xf5, 0xfc, 0xe7, 0xcc, 0xbb, 0x9d, - 0xdb, 0x69, 0x28, 0x9b, 0x64, 0x7a, 0x3f, 0xd8, 0xc6, 0x96, 0x28, 0x74, 0x2e, 0x0d, 0xfc, 0xce, - 0x99, 0xdf, 0x4b, 0xde, 0x53, 0x22, 0xea, 0x27, 0xe7, 0x76, 0x3f, 0x73, 0x41, 0x13, 0x51, 0xe7, - 0x66, 0xcc, 0xcf, 0x03, 0x39, 0x1e, 0x45, 0x47, 0xf2, 0xc6, 0x5f, 0x8b, 0x00, 0x8d, 0xd1, 0x79, - 0xc8, 0x11, 0x2c, 0xe2, 0x7e, 0xc4, 0x9b, 0xdb, 0x26, 0xd1, 0x6f, 0xf7, 0xf9, 0x2d, 0x5a, 0x29, - 0xf9, 0xa8, 0x93, 0x1f, 0xc7, 0x1b, 0xf2, 0x22, 0xab, 0x20, 0xa4, 0x27, 0x24, 0xf7, 0xe5, 0x0d, - 0x28, 0x6b, 0xf7, 0x03, 0x14, 0x4c, 0x16, 0x90, 0xac, 0xaa, 0x97, 0xce, 0x5b, 0xf7, 0xc5, 0x7c, - 0x90, 0x31, 0xfa, 0xb9, 0x43, 0x98, 0xad, 0x89, 0xc4, 0x9b, 0xd3, 0xf4, 0xec, 0x8d, 0xc9, 0x0a, - 0xc0, 0x44, 0x7f, 0xa9, 0x39, 0xe4, 0x3b, 0x28, 0x98, 0xaa, 0x46, 0x3e, 0x99, 0x4d, 0x48, 0xec, - 0xcd, 0x7f, 0x5c, 0x73, 0x3e, 0x77, 0xc8, 0x7b, 0xc8, 0xeb, 0x76, 0x4e, 0x32, 0x7a, 0x53, 0x6a, - 0x16, 0x70, 0xbd, 0x79, 0x10, 0x1b, 0xc5, 0x1f, 0x00, 0xc6, 0x43, 0x05, 0xc9, 0xf8, 0x27, 0x64, - 0x6a, 0x3a, 0x71, 0x6b, 0x37, 0x03, 0xed, 0x06, 0xef, 0x75, 0x47, 0x3d, 0x11, 0x24, 0xb3, 0x97, - 0x8e, 0xae, 0x91, 0xeb, 0xcd, 0x83, 0x58, 0x73, 0xa7, 0x50, 0x9d, 0xf8, 0xa7, 0x94, 0xfc, 0x22, - 0xdb, 0xc9, 0xeb, 0x7f, 0xbc, 0xba, 0xaf, 0x6e, 0x85, 0xb5, 0x3b, 0xa9, 0xf4, 0x54, 0x66, 0x1f, - 0x93, 0xfa, 0x4d, 0x7e, 0x4f, 0xfe, 0xeb, 0xe9, 0xae, 0xdf, 0x1a, 0x6f, 0x76, 0xdd, 0xce, 0xff, - 0x6e, 0x61, 0xd0, 0x6e, 0x17, 0xf0, 0x0f, 0xe4, 0x2f, 0xff, 0x17, 0x00, 0x00, 0xff, 0xff, 0xec, - 0xbb, 0xeb, 0x3f, 0xde, 0x16, 0x00, 0x00, + // 1957 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xdd, 0x6e, 0xdb, 0xc8, + 0x15, 0x2e, 0x2d, 0x59, 0x3f, 0x47, 0x96, 0xd7, 0x99, 0x3a, 0xe9, 0x84, 0xc9, 0x6e, 0x1c, 0xe6, + 0xa7, 0x42, 0xb3, 0x90, 0x77, 0xbd, 0x4d, 0xbd, 0xd9, 0xec, 0x02, 0xb5, 0x25, 0x0b, 0xf6, 0x22, + 0xb1, 0x8d, 0x91, 0x93, 0x45, 0x5b, 0xa0, 0x0b, 0x4a, 0x1a, 0xcb, 0x84, 0x29, 0x0e, 0xcb, 0x19, + 0xc9, 0x76, 0xaf, 0x7a, 0xd3, 0xdb, 0xbe, 0x47, 0xd1, 0x47, 0xe8, 0x55, 0x5f, 0xa2, 0x97, 0x7d, + 0x84, 0xa2, 0x8f, 0x50, 0xcc, 0x0f, 0x29, 0xd2, 0x12, 0x65, 0xbb, 0xbd, 0xd2, 0x9c, 0xc3, 0xef, + 0x9c, 0x99, 0x73, 0xe6, 0xfc, 0x8d, 0x60, 0xad, 0xcf, 0x02, 0x11, 0x31, 0xdf, 0xa7, 0x51, 0x33, + 0x8c, 0x98, 0x60, 0x68, 0xbd, 0x37, 0xf6, 0xfc, 0xc1, 0x65, 0x33, 0xf5, 0x61, 0xf2, 0xa5, 0xfd, + 0x76, 0xe8, 0x89, 0xb3, 0x71, 0xaf, 0xd9, 0x67, 0xa3, 0xcd, 0x11, 0xeb, 0x5d, 0x6d, 0x2a, 0xd4, + 0xb9, 0x27, 0x36, 0xdd, 0xd0, 0xdb, 0xe4, 0x34, 0x9a, 0x78, 0x7d, 0xca, 0x37, 0x8d, 0x50, 0xfc, + 0xab, 0x55, 0xda, 0xaf, 0x73, 0x85, 0x39, 0x1b, 0x47, 0x7d, 0x1a, 0x32, 0xdf, 0xeb, 0x5f, 0x6d, + 0x86, 0xbd, 0x4d, 0xbd, 0x32, 0x62, 0x9f, 0x2f, 0x10, 0xf3, 0x27, 0x34, 0x92, 0x02, 0x2c, 0xe4, + 0x1a, 0xed, 0x34, 0x60, 0xfd, 0x9d, 0xc7, 0xc5, 0x71, 0xc4, 0xfa, 0x94, 0x73, 0xca, 0x09, 0xfd, + 0xc3, 0x98, 0x72, 0x81, 0xd6, 0xa0, 0x40, 0xe8, 0x29, 0xb6, 0x36, 0xac, 0x46, 0x95, 0xc8, 0xa5, + 0x73, 0x0c, 0xf7, 0xaf, 0x21, 0x79, 0xc8, 0x02, 0x4e, 0xd1, 0x36, 0x2c, 0x1f, 0x04, 0xa7, 0x8c, + 0x63, 0x6b, 0xa3, 0xd0, 0xa8, 0x6d, 0x3d, 0x6d, 0xce, 0x73, 0x45, 0xd3, 0xc8, 0x49, 0x24, 0xd1, + 0x78, 0x87, 0x43, 0x2d, 0xc5, 0x45, 0x8f, 0xa1, 0x1a, 0x93, 0x6d, 0xb3, 0xf1, 0x94, 0x81, 0x3a, + 0xb0, 0x72, 0x10, 0x4c, 0xd8, 0x39, 0x6d, 0xb1, 0xe0, 0xd4, 0x1b, 0xe2, 0xa5, 0x0d, 0xab, 0x51, + 0xdb, 0x72, 0xe6, 0x6f, 0x96, 0x46, 0x92, 0x8c, 0x9c, 0xf3, 0x3d, 0xe0, 0xb6, 0xc7, 0xfb, 0x2c, + 0x08, 0x68, 0x3f, 0x36, 0x26, 0xd7, 0xe8, 0xec, 0x99, 0x96, 0xae, 0x9d, 0xc9, 0x79, 0x04, 0x0f, + 0xe7, 0xe8, 0xd2, 0x6e, 0x71, 0x7e, 0x0f, 0x2b, 0xbb, 0xf2, 0x6c, 0xf9, 0xca, 0xbf, 0x85, 0xf2, + 0x51, 0x28, 0x3c, 0x16, 0xf0, 0xc5, 0xd6, 0x28, 0x35, 0x06, 0x49, 0x62, 0x11, 0xe7, 0x9f, 0x35, + 0xb3, 0x81, 0x61, 0xa0, 0x0d, 0xa8, 0xb5, 0x58, 0x20, 0xe8, 0xa5, 0x38, 0x76, 0xc5, 0x99, 0xd9, + 0x28, 0xcd, 0x42, 0x2f, 0x61, 0xb5, 0xcd, 0xfa, 0xe7, 0x34, 0x3a, 0xf5, 0x7c, 0x7a, 0xe8, 0x8e, + 0xa8, 0x31, 0xe9, 0x1a, 0x17, 0x7d, 0x27, 0xad, 0xf6, 0x02, 0xd1, 0x19, 0x07, 0x7d, 0x5c, 0x50, + 0x47, 0x7b, 0x92, 0x77, 0xab, 0x06, 0x46, 0xa6, 0x12, 0xe8, 0x77, 0x50, 0x97, 0x6a, 0x06, 0x66, + 0x6b, 0x8e, 0x8b, 0x2a, 0x30, 0x5e, 0xdf, 0x6c, 0x5d, 0x33, 0x23, 0xb7, 0x17, 0x88, 0xe8, 0x8a, + 0x64, 0x75, 0xa1, 0x75, 0x58, 0xde, 0xf1, 0x7d, 0x76, 0x81, 0x97, 0x37, 0x0a, 0x8d, 0x2a, 0xd1, + 0x04, 0xfa, 0x15, 0x94, 0x77, 0x84, 0xa0, 0x5c, 0x70, 0x5c, 0x52, 0x9b, 0x3d, 0x9e, 0xbf, 0x99, + 0x06, 0x91, 0x18, 0x8c, 0x8e, 0xa0, 0xaa, 0xf6, 0xdf, 0x89, 0x86, 0x1c, 0x97, 0x95, 0xe4, 0x97, + 0xb7, 0x38, 0x66, 0x22, 0xa3, 0x8f, 0x38, 0xd5, 0x81, 0xf6, 0xa0, 0xda, 0x72, 0xfb, 0x67, 0xb4, + 0x13, 0xb1, 0x11, 0xae, 0x28, 0x85, 0x3f, 0x9f, 0xaf, 0x50, 0xc1, 0x8c, 0x42, 0xa3, 0x26, 0x91, + 0x44, 0x3b, 0x50, 0x56, 0xc4, 0x09, 0xc3, 0xd5, 0xbb, 0x29, 0x89, 0xe5, 0x90, 0x03, 0x2b, 0xad, + 0x61, 0xc4, 0xc6, 0xe1, 0xb1, 0x1b, 0xd1, 0x40, 0x60, 0x50, 0x57, 0x9d, 0xe1, 0xa1, 0xb7, 0x50, + 0xde, 0xbb, 0x0c, 0x59, 0x24, 0x38, 0xae, 0x2d, 0x4a, 0x5e, 0x0d, 0x32, 0x1b, 0x18, 0x09, 0xf4, + 0x19, 0xc0, 0xde, 0xa5, 0x88, 0xdc, 0x7d, 0x26, 0xdd, 0xbe, 0xa2, 0xae, 0x23, 0xc5, 0x41, 0x1d, + 0x28, 0xbd, 0x73, 0x7b, 0xd4, 0xe7, 0xb8, 0xae, 0x74, 0x37, 0x6f, 0xe1, 0x58, 0x2d, 0xa0, 0x37, + 0x32, 0xd2, 0x32, 0xae, 0x0f, 0xa9, 0xb8, 0x60, 0xd1, 0xf9, 0x7b, 0x36, 0xa0, 0x78, 0x55, 0xc7, + 0x75, 0x8a, 0x85, 0x9e, 0x43, 0xfd, 0x90, 0x69, 0xe7, 0x79, 0xbe, 0xa0, 0x11, 0xfe, 0x44, 0x1d, + 0x26, 0xcb, 0x54, 0xb9, 0xec, 0xbb, 0xe2, 0x94, 0x45, 0x23, 0x8e, 0xd7, 0x14, 0x62, 0xca, 0x90, + 0x11, 0xd4, 0xa5, 0xfd, 0x88, 0x0a, 0x8e, 0xef, 0x2d, 0x8a, 0x20, 0x0d, 0x22, 0x31, 0x18, 0x61, + 0x28, 0x77, 0xcf, 0x46, 0x5d, 0xef, 0x8f, 0x14, 0xa3, 0x0d, 0xab, 0x51, 0x20, 0x31, 0x89, 0x5e, + 0x41, 0xa1, 0xdb, 0xdd, 0xc7, 0x3f, 0x55, 0xda, 0x1e, 0xe6, 0x68, 0xeb, 0xee, 0x13, 0x89, 0x42, + 0x08, 0x8a, 0x27, 0xee, 0x90, 0xe3, 0x75, 0x75, 0x2e, 0xb5, 0x46, 0x0f, 0xa0, 0x74, 0xe2, 0x46, + 0x43, 0x2a, 0xf0, 0x7d, 0x65, 0xb3, 0xa1, 0xd0, 0x1b, 0x28, 0x7f, 0xf0, 0xbd, 0x91, 0x27, 0x38, + 0x7e, 0xb0, 0x28, 0x39, 0x35, 0xe8, 0x28, 0x14, 0x24, 0xc6, 0xcb, 0xd3, 0x2a, 0x7f, 0xd3, 0x08, + 0xff, 0x4c, 0xe9, 0x8c, 0x49, 0xf9, 0xc5, 0xb8, 0x0b, 0xe3, 0x0d, 0xab, 0x51, 0x21, 0x31, 0x29, + 0x8f, 0x76, 0x3c, 0xf6, 0x7d, 0xfc, 0x50, 0xb1, 0xd5, 0x5a, 0xdf, 0xbd, 0x0c, 0x83, 0xe3, 0x31, + 0x3f, 0xc3, 0xb6, 0xfa, 0x92, 0xe2, 0x4c, 0xbf, 0xbf, 0x63, 0xee, 0x00, 0x3f, 0x4a, 0x7f, 0x97, + 0x1c, 0x74, 0x00, 0x2b, 0x5d, 0xd5, 0xc4, 0x8e, 0x55, 0xeb, 0xc2, 0x8f, 0x95, 0x1d, 0x2f, 0x9a, + 0xb2, 0x61, 0x35, 0xe3, 0x86, 0x25, 0x6d, 0x48, 0xb7, 0xba, 0xa6, 0x06, 0x93, 0x8c, 0xa8, 0x2c, + 0x08, 0x6d, 0xda, 0x1b, 0x0f, 0xf1, 0xa7, 0x6a, 0x17, 0x4d, 0xd8, 0xbf, 0x06, 0x34, 0x5b, 0x4b, + 0x64, 0x0d, 0x3e, 0xa7, 0x57, 0x71, 0x0d, 0x3e, 0xa7, 0x4a, 0x7a, 0xe2, 0xfa, 0xe3, 0xb8, 0x12, + 0x6a, 0xe2, 0x9b, 0xa5, 0xaf, 0x2d, 0xfb, 0x5b, 0x58, 0xcd, 0xa6, 0xf9, 0x9d, 0xa4, 0xdf, 0x40, + 0x2d, 0x15, 0xcb, 0x77, 0x11, 0x75, 0xfe, 0x61, 0x41, 0x2d, 0x95, 0x70, 0x2a, 0x34, 0xae, 0x42, + 0x6a, 0x84, 0xd5, 0x1a, 0xed, 0xc2, 0xf2, 0x8e, 0x10, 0x91, 0x6c, 0x1c, 0x32, 0xba, 0x3e, 0xbf, + 0x31, 0x6d, 0x9b, 0x0a, 0xae, 0x13, 0x4b, 0x8b, 0xca, 0xbc, 0x6a, 0x53, 0x2e, 0xbc, 0xc0, 0x95, + 0xb9, 0xa7, 0xea, 0x7c, 0x95, 0xa4, 0x59, 0xf6, 0xd7, 0x00, 0x53, 0xb1, 0x3b, 0xd9, 0xf0, 0x37, + 0x0b, 0xee, 0xcd, 0xd4, 0xa6, 0xb9, 0x96, 0xec, 0x67, 0x2d, 0xd9, 0xba, 0x65, 0x9d, 0x9b, 0xb5, + 0xe7, 0xff, 0x38, 0xed, 0x21, 0x94, 0x74, 0x43, 0x98, 0x7b, 0x42, 0x1b, 0x2a, 0x6d, 0x8f, 0xbb, + 0x3d, 0x9f, 0x0e, 0x94, 0x68, 0x85, 0x24, 0xb4, 0xea, 0x46, 0xea, 0xf4, 0xda, 0x7b, 0x9a, 0x70, + 0x74, 0xe6, 0xa3, 0x55, 0x58, 0x4a, 0x26, 0x99, 0xa5, 0x83, 0xb6, 0x04, 0xcb, 0x36, 0xac, 0x4d, + 0xad, 0x12, 0x4d, 0x38, 0x1d, 0x28, 0xe9, 0x5a, 0x32, 0x83, 0xb7, 0xa1, 0xd2, 0xf1, 0x7c, 0xaa, + 0xba, 0xb9, 0x3e, 0x73, 0x42, 0x4b, 0xf3, 0xf6, 0x82, 0x89, 0xd9, 0x56, 0x2e, 0x9d, 0xed, 0x54, + 0xd3, 0x96, 0x76, 0xa8, 0xfe, 0x6e, 0xec, 0x50, 0x5d, 0xfd, 0x01, 0x94, 0x3a, 0x2c, 0x1a, 0xb9, + 0xc2, 0x28, 0x33, 0x94, 0xe3, 0xc0, 0xea, 0x41, 0xc0, 0x43, 0xda, 0x17, 0xf9, 0xc3, 0xdf, 0x11, + 0x7c, 0x92, 0x60, 0xcc, 0xd8, 0x97, 0x9a, 0x5e, 0xac, 0xbb, 0x4f, 0x2f, 0x7f, 0xb5, 0xa0, 0x9a, + 0xd4, 0x27, 0xd4, 0x82, 0x92, 0xba, 0x8d, 0x78, 0x86, 0x7c, 0x75, 0x43, 0x41, 0x6b, 0x7e, 0x54, + 0x68, 0xd3, 0x27, 0xb4, 0xa8, 0xfd, 0x03, 0xd4, 0x52, 0xec, 0x39, 0x01, 0xb0, 0x95, 0x0e, 0x80, + 0xdc, 0x02, 0xaf, 0x37, 0x49, 0x87, 0x47, 0x1b, 0x4a, 0x9a, 0x39, 0xd7, 0xad, 0x08, 0x8a, 0xfb, + 0x6e, 0xa4, 0x43, 0xa3, 0x40, 0xd4, 0x5a, 0xf2, 0xba, 0xec, 0x54, 0xa8, 0xeb, 0x29, 0x10, 0xb5, + 0x76, 0xfe, 0x6e, 0x41, 0xdd, 0x0c, 0x84, 0xc6, 0x83, 0x14, 0xd6, 0x74, 0x86, 0xd2, 0x28, 0xe6, + 0x19, 0xfb, 0xdf, 0x2c, 0x70, 0x65, 0x0c, 0x6d, 0x5e, 0x97, 0xd5, 0xde, 0x98, 0x51, 0x69, 0xb7, + 0xe0, 0xfe, 0x5c, 0xe8, 0x9d, 0x52, 0xe4, 0x05, 0xdc, 0x9b, 0x8e, 0xba, 0xf9, 0x71, 0xb2, 0x0e, + 0x28, 0x0d, 0x33, 0xa3, 0xf0, 0x13, 0xa8, 0xc9, 0xa7, 0x43, 0xbe, 0x98, 0x03, 0x2b, 0x1a, 0x60, + 0x3c, 0x83, 0xa0, 0x78, 0x4e, 0xaf, 0x74, 0x34, 0x54, 0x89, 0x5a, 0x3b, 0x7f, 0xb1, 0xe4, 0x0b, + 0x20, 0x1c, 0x8b, 0xf7, 0x94, 0x73, 0x77, 0x28, 0x03, 0xb0, 0x78, 0x10, 0x78, 0xc2, 0x44, 0xdf, + 0xcb, 0xbc, 0x97, 0x40, 0x38, 0x16, 0x12, 0x66, 0xa4, 0xf6, 0x7f, 0x42, 0x94, 0x14, 0xda, 0x86, + 0x62, 0xdb, 0x15, 0xae, 0x89, 0x85, 0x9c, 0xb9, 0x47, 0x22, 0x52, 0x82, 0x92, 0xdc, 0x2d, 0xcb, + 0xe7, 0x4e, 0x38, 0x16, 0xce, 0x73, 0x58, 0xbb, 0xae, 0x7d, 0x8e, 0x69, 0x5f, 0x41, 0x2d, 0xa5, + 0x45, 0xe5, 0xed, 0x51, 0x47, 0x01, 0x2a, 0x44, 0x2e, 0xa5, 0xad, 0xc9, 0x41, 0x56, 0xf4, 0x1e, + 0xce, 0x27, 0x50, 0x57, 0xaa, 0x13, 0x0f, 0xfe, 0x69, 0x09, 0xca, 0xb1, 0x8a, 0xed, 0x8c, 0xdd, + 0x4f, 0xf3, 0xec, 0x9e, 0x35, 0xf9, 0x35, 0x14, 0x65, 0xfd, 0x30, 0x26, 0xe7, 0x0c, 0x0d, 0x9d, + 0x41, 0x4a, 0x4c, 0xc2, 0xd1, 0x77, 0x50, 0x22, 0x94, 0xcb, 0x01, 0x47, 0x3f, 0x05, 0x9e, 0xcd, + 0x17, 0xd4, 0x98, 0xa9, 0xb0, 0x11, 0x92, 0xe2, 0x5d, 0x6f, 0x18, 0xb8, 0x3e, 0x2e, 0x2e, 0x12, + 0xd7, 0x98, 0x94, 0xb8, 0x66, 0x4c, 0xdd, 0xfd, 0x67, 0x0b, 0x6a, 0x0b, 0x5d, 0xbd, 0xf8, 0xb1, + 0x36, 0xf3, 0x80, 0x2c, 0xfc, 0x8f, 0x0f, 0xc8, 0x7f, 0x5b, 0x59, 0x45, 0x6a, 0xd6, 0x91, 0xf9, + 0x14, 0x32, 0x2f, 0x10, 0x26, 0x64, 0x53, 0x1c, 0x79, 0xd0, 0xd6, 0x68, 0x60, 0x8a, 0xbe, 0x5c, + 0x4e, 0x8b, 0x77, 0xc1, 0x14, 0x6f, 0x19, 0x04, 0x1f, 0x38, 0x8d, 0x94, 0x8b, 0xaa, 0x44, 0xad, + 0x65, 0xbd, 0x3e, 0x64, 0x8a, 0xbb, 0xac, 0xa2, 0xc5, 0x50, 0x4a, 0xdf, 0xc5, 0x00, 0x97, 0xb4, + 0xe1, 0xad, 0x0b, 0xd5, 0x85, 0x0e, 0x99, 0xe4, 0x95, 0xf5, 0x08, 0xa4, 0x08, 0x89, 0x3b, 0x11, + 0x57, 0xb8, 0xa2, 0x43, 0xed, 0x44, 0x5c, 0xc9, 0x86, 0x42, 0x98, 0xef, 0xf7, 0xdc, 0xfe, 0x39, + 0xae, 0xea, 0x4e, 0x16, 0xd3, 0x72, 0xfe, 0x93, 0xde, 0xf5, 0x5c, 0x5f, 0xbd, 0x14, 0x2a, 0x24, + 0x26, 0x9d, 0x1d, 0xa8, 0x26, 0x41, 0x21, 0x7b, 0x54, 0x67, 0xa0, 0x9c, 0x5e, 0x27, 0x4b, 0x9d, + 0x41, 0x1c, 0xcf, 0x4b, 0xb3, 0xf1, 0x5c, 0x48, 0xc5, 0xf3, 0x36, 0xd4, 0x33, 0xe1, 0x21, 0x41, + 0x84, 0x5d, 0x70, 0xa3, 0x48, 0xad, 0x25, 0xaf, 0xc5, 0x7c, 0xfd, 0x16, 0xae, 0x13, 0xb5, 0x76, + 0x9e, 0x41, 0x3d, 0x13, 0x18, 0xf3, 0x2a, 0xb0, 0xf3, 0x14, 0xea, 0x5d, 0xe1, 0x8a, 0xf1, 0x82, + 0x3f, 0x2f, 0xfe, 0x63, 0xc1, 0x6a, 0x8c, 0x31, 0x35, 0xe6, 0x97, 0x50, 0x99, 0xd0, 0x48, 0xd0, + 0xcb, 0xa4, 0xeb, 0xe0, 0xd9, 0xf1, 0xf3, 0xa3, 0x42, 0x90, 0x04, 0x89, 0xbe, 0x81, 0x0a, 0x57, + 0x7a, 0x68, 0x3c, 0xb1, 0x7c, 0x96, 0x27, 0x65, 0xf6, 0x4b, 0xf0, 0x68, 0x13, 0x8a, 0x3e, 0x1b, + 0x72, 0x75, 0xef, 0xb5, 0xad, 0x47, 0x79, 0x72, 0xef, 0xd8, 0x90, 0x28, 0x20, 0x7a, 0x0b, 0x95, + 0x0b, 0x37, 0x0a, 0xbc, 0x60, 0x18, 0xbf, 0xa1, 0x9f, 0xe4, 0x09, 0xfd, 0xa0, 0x71, 0x24, 0x11, + 0x70, 0xea, 0x32, 0x5d, 0x4e, 0x99, 0xf1, 0x89, 0xf3, 0x1b, 0x19, 0xb5, 0x92, 0x34, 0xe6, 0x1f, + 0x40, 0x5d, 0x47, 0xfe, 0x47, 0x1a, 0x71, 0x39, 0xff, 0x59, 0x8b, 0xb2, 0x73, 0x37, 0x0d, 0x25, + 0x59, 0x49, 0xe7, 0x47, 0xd3, 0xd8, 0x62, 0x86, 0x8c, 0xa5, 0xd0, 0xed, 0x9f, 0xbb, 0xc3, 0xf8, + 0x9e, 0x62, 0x52, 0x7e, 0x99, 0x98, 0xfd, 0x74, 0x82, 0xc6, 0xa4, 0x8c, 0xcd, 0x88, 0x4e, 0x3c, + 0x3e, 0x1d, 0x45, 0x13, 0xda, 0xd9, 0x97, 0xaf, 0x05, 0x7f, 0x42, 0xf3, 0xff, 0x4a, 0x79, 0x99, + 0x3c, 0x95, 0x74, 0x71, 0x5b, 0x6d, 0x86, 0xbd, 0x66, 0x9b, 0x9e, 0x7a, 0x32, 0x86, 0x59, 0x10, + 0x3f, 0x9d, 0x64, 0x61, 0x35, 0x9a, 0xb4, 0x1b, 0xb6, 0xfe, 0x55, 0x06, 0x68, 0x25, 0xa6, 0xa2, + 0x63, 0x58, 0x56, 0xa6, 0x20, 0x67, 0x61, 0x07, 0x56, 0xc7, 0xb0, 0x9f, 0xdd, 0xa2, 0x4b, 0xa3, + 0x8f, 0x32, 0xaf, 0xd4, 0xe4, 0x84, 0x9e, 0xe7, 0xd5, 0x9a, 0xf4, 0xf0, 0x65, 0xbf, 0xb8, 0x01, + 0x65, 0xf4, 0x7e, 0x80, 0x92, 0x0e, 0x30, 0x94, 0x57, 0x50, 0xd3, 0x29, 0x61, 0x3f, 0x5f, 0x0c, + 0xd2, 0x4a, 0xbf, 0xb0, 0x10, 0x31, 0xe5, 0x16, 0x39, 0x0b, 0xfa, 0xa9, 0x49, 0xc6, 0x3c, 0x07, + 0x64, 0x5a, 0x57, 0xc3, 0x42, 0xdf, 0x43, 0x49, 0x17, 0x4c, 0xf4, 0xe9, 0x7c, 0x81, 0x58, 0xdf, + 0xe2, 0xcf, 0x0d, 0xeb, 0x0b, 0x0b, 0xbd, 0x87, 0xa2, 0x9c, 0x14, 0x50, 0x4e, 0xdb, 0x4b, 0x8d, + 0x19, 0xb6, 0xb3, 0x08, 0x62, 0xbc, 0xf8, 0x23, 0xc0, 0x74, 0x5e, 0x41, 0x39, 0x7f, 0xb2, 0xcc, + 0x0c, 0x3e, 0x76, 0xe3, 0x66, 0xa0, 0xd9, 0xe0, 0xbd, 0x6c, 0xd6, 0xa7, 0x0c, 0xe5, 0xb6, 0xe9, + 0x24, 0x43, 0x6d, 0x67, 0x11, 0xc4, 0xa8, 0x3b, 0x83, 0x7a, 0xe6, 0x4f, 0x58, 0xf4, 0x8b, 0x7c, + 0x23, 0xaf, 0xff, 0xa7, 0x6b, 0xbf, 0xba, 0x15, 0xd6, 0xec, 0x24, 0xd2, 0x03, 0x9f, 0xf9, 0x8c, + 0x9a, 0x37, 0xd9, 0x9d, 0xfd, 0x43, 0xd5, 0xde, 0xbc, 0x35, 0xde, 0xec, 0x7a, 0x0c, 0xcb, 0x2a, + 0x3f, 0xf3, 0xc2, 0x2f, 0x5d, 0x06, 0xf2, 0xc2, 0x2f, 0x93, 0xe0, 0xbb, 0xc5, 0xdf, 0x2e, 0x85, + 0xbd, 0x5e, 0x49, 0xfd, 0xdb, 0xfd, 0xd5, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xdf, 0x67, 0x70, + 0x17, 0xb9, 0x17, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -2198,6 +2281,7 @@ type ControllerClient interface { Info(ctx context.Context, in *InfoRequest, opts ...grpc.CallOption) (*InfoResponse, error) ListProcesses(ctx context.Context, in *ListProcessesRequest, opts ...grpc.CallOption) (*ListProcessesResponse, error) DisconnectProcess(ctx context.Context, in *DisconnectProcessRequest, opts ...grpc.CallOption) (*DisconnectProcessResponse, error) + Solve(ctx context.Context, in *SolveRequest, opts ...grpc.CallOption) (*SolveResponse, error) } type controllerClient struct { @@ -2368,6 +2452,15 @@ func (c *controllerClient) DisconnectProcess(ctx context.Context, in *Disconnect return out, nil } +func (c *controllerClient) Solve(ctx context.Context, in *SolveRequest, opts ...grpc.CallOption) (*SolveResponse, error) { + out := new(SolveResponse) + err := c.cc.Invoke(ctx, "/buildx.controller.v1.Controller/Solve", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ControllerServer is the server API for Controller service. type ControllerServer interface { Build(context.Context, *BuildRequest) (*BuildResponse, error) @@ -2380,6 +2473,7 @@ type ControllerServer interface { Info(context.Context, *InfoRequest) (*InfoResponse, error) ListProcesses(context.Context, *ListProcessesRequest) (*ListProcessesResponse, error) DisconnectProcess(context.Context, *DisconnectProcessRequest) (*DisconnectProcessResponse, error) + Solve(context.Context, *SolveRequest) (*SolveResponse, error) } // UnimplementedControllerServer can be embedded to have forward compatible implementations. @@ -2416,6 +2510,9 @@ func (*UnimplementedControllerServer) ListProcesses(ctx context.Context, req *Li func (*UnimplementedControllerServer) DisconnectProcess(ctx context.Context, req *DisconnectProcessRequest) (*DisconnectProcessResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DisconnectProcess not implemented") } +func (*UnimplementedControllerServer) Solve(ctx context.Context, req *SolveRequest) (*SolveResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Solve not implemented") +} func RegisterControllerServer(s *grpc.Server, srv ControllerServer) { s.RegisterService(&_Controller_serviceDesc, srv) @@ -2620,6 +2717,24 @@ func _Controller_DisconnectProcess_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _Controller_Solve_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SolveRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControllerServer).Solve(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/buildx.controller.v1.Controller/Solve", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControllerServer).Solve(ctx, req.(*SolveRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Controller_serviceDesc = grpc.ServiceDesc{ ServiceName: "buildx.controller.v1.Controller", HandlerType: (*ControllerServer)(nil), @@ -2652,6 +2767,10 @@ var _Controller_serviceDesc = grpc.ServiceDesc{ MethodName: "DisconnectProcess", Handler: _Controller_DisconnectProcess_Handler, }, + { + MethodName: "Solve", + Handler: _Controller_Solve_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/controller/pb/controller.proto b/controller/pb/controller.proto index 054d2b53..6ba91a77 100644 --- a/controller/pb/controller.proto +++ b/controller/pb/controller.proto @@ -4,6 +4,7 @@ package buildx.controller.v1; import "github.com/moby/buildkit/api/services/control/control.proto"; import "github.com/moby/buildkit/sourcepolicy/pb/policy.proto"; +import "github.com/moby/buildkit/solver/pb/ops.proto"; option go_package = "pb"; @@ -18,6 +19,7 @@ service Controller { rpc Info(InfoRequest) returns (InfoResponse); rpc ListProcesses(ListProcessesRequest) returns (ListProcessesResponse); rpc DisconnectProcess(DisconnectProcessRequest) returns (DisconnectProcessResponse); + rpc Solve(SolveRequest) returns (SolveResponse); } message ListProcessesRequest { @@ -244,3 +246,10 @@ message BuildxVersion { string version = 2; string revision = 3; } + +message SolveRequest { + string Ref = 1; + pb.Definition Target = 2; +} + +message SolveResponse {} diff --git a/controller/remote/client.go b/controller/remote/client.go index b3b6c12b..2a37d5a1 100644 --- a/controller/remote/client.go +++ b/controller/remote/client.go @@ -12,6 +12,7 @@ import ( "github.com/docker/buildx/util/progress" "github.com/moby/buildkit/client" "github.com/moby/buildkit/identity" + solverpb "github.com/moby/buildkit/solver/pb" "github.com/moby/buildkit/util/grpcerrors" "github.com/pkg/errors" "golang.org/x/sync/errgroup" @@ -238,3 +239,52 @@ func (c *Client) build(ctx context.Context, ref string, options pb.BuildOptions, func (c *Client) client() pb.ControllerClient { return pb.NewControllerClient(c.conn) } + +func (c *Client) Solve(ctx context.Context, ref string, def *solverpb.Definition, progress progress.Writer) error { + statusChan := make(chan *client.SolveStatus) + eg, egCtx := errgroup.WithContext(ctx) + eg.Go(func() error { + defer close(statusChan) + return c.doSolve(egCtx, ref, def, statusChan) + }) + eg.Go(func() error { + for s := range statusChan { + st := s + progress.Write(st) + } + return nil + }) + return eg.Wait() +} + +func (c *Client) doSolve(ctx context.Context, ref string, def *solverpb.Definition, statusChan chan *client.SolveStatus) error { + eg, egCtx := errgroup.WithContext(ctx) + eg.Go(func() error { + if _, err := c.client().Solve(egCtx, &pb.SolveRequest{ + Ref: ref, + Target: def, + }); err != nil { + return err + } + return nil + }) + eg.Go(func() error { + stream, err := c.client().Status(egCtx, &pb.StatusRequest{ + Ref: ref, + }) + if err != nil { + return err + } + for { + resp, err := stream.Recv() + if err != nil { + if err == io.EOF { + return nil + } + return errors.Wrap(err, "failed to receive status") + } + statusChan <- pb.FromControlStatus(resp) + } + }) + return eg.Wait() +} diff --git a/controller/remote/server.go b/controller/remote/server.go index a39fea51..d6bb3ba6 100644 --- a/controller/remote/server.go +++ b/controller/remote/server.go @@ -43,6 +43,8 @@ type session struct { result *build.ResultHandle processes *processes.Manager + + originalResult *build.ResultHandle } func (s *session) cancelRunningProcesses() { @@ -208,6 +210,7 @@ func (m *Server) Build(ctx context.Context, req *pb.BuildRequest) (*pb.BuildResp // NOTE: buildFunc can return *build.ResultHandle even on error (e.g. when it's implemented using (github.com/docker/buildx/controller/build).RunBuild). if res != nil { s.result = res + s.originalResult = res s.cancelBuild = cancel s.buildOptions = req.Options m.session[ref] = s @@ -439,3 +442,64 @@ func (m *Server) Invoke(srv pb.Controller_InvokeServer) error { return eg.Wait() } + +func (m *Server) Solve(ctx context.Context, req *pb.SolveRequest) (*pb.SolveResponse, error) { + ref := req.Ref + if ref == "" { + return nil, errors.New("solve: empty key") + } + + m.sessionMu.Lock() + if _, ok := m.session[ref]; !ok || m.session[ref].result == nil { + m.sessionMu.Unlock() + return &pb.SolveResponse{}, errors.Errorf("solve: unknown reference: %q", ref) + } + s := m.session[ref] + s.cancelRunningProcesses() + if s.originalResult == nil { + return &pb.SolveResponse{}, errors.Errorf("no build has been called") + } + resultCtx := s.originalResult + if s.statusChan != nil { + m.sessionMu.Unlock() + return &pb.SolveResponse{}, errors.New("solve: build or status ongoing or status didn't call") + } + statusChan := make(chan *pb.StatusResponse) + s.statusChan = statusChan + m.session[ref] = s + m.sessionMu.Unlock() + + defer func() { + close(statusChan) + m.sessionMu.Lock() + s, ok := m.session[ref] + if ok { + s.statusChan = nil + m.session[ref] = s + } + m.sessionMu.Unlock() + }() + + // Get the target result context + ctx, cancel := context.WithCancel(ctx) + defer cancel() + pw := pb.NewProgressWriter(statusChan) + res, err := build.SolveWithResultHandler(ctx, "buildx", resultCtx, req.Target, pw) + if err == nil { + m.sessionMu.Lock() + if s, ok := m.session[ref]; ok { + s.result = res + s.cancelBuild = cancel + m.session[ref] = s + if se := res.SolveError(); se != nil { + err = errors.Errorf("failed solve: %v", se) + } + } else { + m.sessionMu.Unlock() + return nil, errors.Errorf("build: unknown key %v", ref) + } + m.sessionMu.Unlock() + } + + return &pb.SolveResponse{}, err +}