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 <ktokunaga.mail@gmail.com>
pull/1656/head
Kohei Tokunaga 2 years ago
parent de693264a8
commit f72ea677f1
No known key found for this signature in database
GPG Key ID: 6CE0A04690DB3FB3

@ -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)

@ -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 {

@ -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
}

@ -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{
{

@ -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 {}

@ -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()
}

@ -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
}

Loading…
Cancel
Save