This commit is contained in:
Justin Chadwell
2023-03-28 15:33:11 +09:00
committed by GitHub
7 changed files with 675 additions and 476 deletions

View File

@@ -14,14 +14,12 @@ import (
"github.com/docker/buildx/bake/hclparser" "github.com/docker/buildx/bake/hclparser"
"github.com/docker/buildx/build" "github.com/docker/buildx/build"
cbuild "github.com/docker/buildx/controller/build"
controllerapi "github.com/docker/buildx/controller/pb" controllerapi "github.com/docker/buildx/controller/pb"
"github.com/docker/buildx/util/buildflags" "github.com/docker/buildx/util/buildflags"
"github.com/docker/buildx/util/platformutil"
"github.com/docker/cli/cli/config"
"github.com/docker/docker/builder/remotecontext/urlutil" "github.com/docker/docker/builder/remotecontext/urlutil"
hcl "github.com/hashicorp/hcl/v2" hcl "github.com/hashicorp/hcl/v2"
"github.com/moby/buildkit/client/llb" "github.com/moby/buildkit/client/llb"
"github.com/moby/buildkit/session/auth/authprovider"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
@@ -769,7 +767,11 @@ func (t *Target) AddOverrides(overrides map[string]Override) error {
func TargetsToBuildOpt(m map[string]*Target, inp *Input) (map[string]build.Options, error) { func TargetsToBuildOpt(m map[string]*Target, inp *Input) (map[string]build.Options, error) {
m2 := make(map[string]build.Options, len(m)) m2 := make(map[string]build.Options, len(m))
for k, v := range m { for k, v := range m {
bo, err := toBuildOpt(v, inp) opts, err := toControllerOpt(v, inp)
if err != nil {
return nil, err
}
bo, err := cbuild.ToBuildOpts(*opts, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -778,14 +780,14 @@ func TargetsToBuildOpt(m map[string]*Target, inp *Input) (map[string]build.Optio
return m2, nil return m2, nil
} }
func updateContext(t *build.Inputs, inp *Input) { func updateContext(t *controllerapi.Inputs, inp *Input) error {
if inp == nil || inp.State == nil { if inp == nil || inp.State == nil {
return return nil
} }
for k, v := range t.NamedContexts { for k, v := range t.NamedContexts {
if v.Path == "." { if v.Path == "." {
t.NamedContexts[k] = build.NamedContext{Path: inp.URL} t.NamedContexts[k] = &controllerapi.NamedContext{Path: inp.URL}
} }
if strings.HasPrefix(v.Path, "cwd://") || strings.HasPrefix(v.Path, "target:") || strings.HasPrefix(v.Path, "docker-image:") { if strings.HasPrefix(v.Path, "cwd://") || strings.HasPrefix(v.Path, "target:") || strings.HasPrefix(v.Path, "docker-image:") {
continue continue
@@ -794,27 +796,36 @@ func updateContext(t *build.Inputs, inp *Input) {
continue continue
} }
st := llb.Scratch().File(llb.Copy(*inp.State, v.Path, "/"), llb.WithCustomNamef("set context %s to %s", k, v.Path)) st := llb.Scratch().File(llb.Copy(*inp.State, v.Path, "/"), llb.WithCustomNamef("set context %s to %s", k, v.Path))
t.NamedContexts[k] = build.NamedContext{State: &st} def, err := st.Marshal(context.TODO())
if err != nil {
return err
}
t.NamedContexts[k] = &controllerapi.NamedContext{Definition: def.ToPB()}
} }
if t.ContextPath == "." { if t.ContextPath == "." {
t.ContextPath = inp.URL t.ContextPath = inp.URL
return return nil
} }
if strings.HasPrefix(t.ContextPath, "cwd://") { if strings.HasPrefix(t.ContextPath, "cwd://") {
return return nil
} }
if IsRemoteURL(t.ContextPath) { if IsRemoteURL(t.ContextPath) {
return return nil
} }
st := llb.Scratch().File(llb.Copy(*inp.State, t.ContextPath, "/"), llb.WithCustomNamef("set context to %s", t.ContextPath)) st := llb.Scratch().File(llb.Copy(*inp.State, t.ContextPath, "/"), llb.WithCustomNamef("set context to %s", t.ContextPath))
t.ContextState = &st def, err := st.Marshal(context.TODO())
if err != nil {
return err
}
t.ContextDefinition = def.ToPB()
return nil
} }
// validateContextsEntitlements is a basic check to ensure contexts do not // validateContextsEntitlements is a basic check to ensure contexts do not
// escape local directories when loaded from remote sources. This is to be // escape local directories when loaded from remote sources. This is to be
// replaced with proper entitlements support in the future. // replaced with proper entitlements support in the future.
func validateContextsEntitlements(t build.Inputs, inp *Input) error { func validateContextsEntitlements(t controllerapi.Inputs, inp *Input) error {
if inp == nil || inp.State == nil { if inp == nil || inp.State == nil {
return nil return nil
} }
@@ -823,13 +834,13 @@ func validateContextsEntitlements(t build.Inputs, inp *Input) error {
return nil return nil
} }
} }
if t.ContextState == nil { if t.ContextDefinition == nil {
if err := checkPath(t.ContextPath); err != nil { if err := checkPath(t.ContextPath); err != nil {
return err return err
} }
} }
for _, v := range t.NamedContexts { for _, v := range t.NamedContexts {
if v.State != nil { if v.Definition != nil {
continue continue
} }
if err := checkPath(v.Path); err != nil { if err := checkPath(v.Path); err != nil {
@@ -864,7 +875,7 @@ func checkPath(p string) error {
return nil return nil
} }
func toBuildOpt(t *Target, inp *Input) (*build.Options, error) { func toControllerOpt(t *Target, inp *Input) (*controllerapi.BuildOptions, error) {
if v := t.Context; v != nil && *v == "-" { if v := t.Context; v != nil && *v == "-" {
return nil, errors.Errorf("context from stdin not allowed in bake") return nil, errors.Errorf("context from stdin not allowed in bake")
} }
@@ -917,9 +928,9 @@ func toBuildOpt(t *Target, inp *Input) (*build.Options, error) {
networkMode = *t.NetworkMode networkMode = *t.NetworkMode
} }
bi := build.Inputs{ bi := controllerapi.Inputs{
ContextPath: contextPath, ContextPath: contextPath,
DockerfilePath: dockerfilePath, DockerfileName: dockerfilePath,
NamedContexts: toNamedContexts(t.Contexts), NamedContexts: toNamedContexts(t.Contexts),
} }
if t.DockerfileInline != nil { if t.DockerfileInline != nil {
@@ -931,7 +942,7 @@ func toBuildOpt(t *Target, inp *Input) (*build.Options, error) {
} }
for k, v := range bi.NamedContexts { for k, v := range bi.NamedContexts {
if strings.HasPrefix(v.Path, "cwd://") { if strings.HasPrefix(v.Path, "cwd://") {
bi.NamedContexts[k] = build.NamedContext{Path: path.Clean(strings.TrimPrefix(v.Path, "cwd://"))} bi.NamedContexts[k] = &controllerapi.NamedContext{Path: path.Clean(strings.TrimPrefix(v.Path, "cwd://"))}
} }
} }
@@ -941,82 +952,55 @@ func toBuildOpt(t *Target, inp *Input) (*build.Options, error) {
t.Context = &bi.ContextPath t.Context = &bi.ContextPath
bo := &build.Options{ opts := &controllerapi.BuildOptions{
Inputs: bi, Inputs: &bi,
Tags: t.Tags, Tags: t.Tags,
BuildArgs: args, BuildArgs: args,
Labels: labels, Labels: labels,
NoCache: noCache,
NoCacheFilter: t.NoCacheFilter, NoCacheFilter: t.NoCacheFilter,
Pull: pull,
NetworkMode: networkMode, NetworkMode: networkMode,
Linked: t.linked, Opts: &controllerapi.CommonOptions{
NoCache: noCache,
Pull: pull,
Linked: t.linked,
},
Platforms: t.Platforms,
} }
var err error
platforms, err := platformutil.Parse(t.Platforms)
if err != nil {
return nil, err
}
bo.Platforms = platforms
dockerConfig := config.LoadDefaultConfigFile(os.Stderr)
bo.Session = append(bo.Session, authprovider.NewDockerAuthProvider(dockerConfig))
secrets, err := buildflags.ParseSecretSpecs(t.Secrets)
if err != nil {
return nil, err
}
secretAttachment, err := controllerapi.CreateSecrets(secrets)
if err != nil {
return nil, err
}
bo.Session = append(bo.Session, secretAttachment)
sshSpecs, err := buildflags.ParseSSHSpecs(t.SSH)
if err != nil {
return nil, err
}
if len(sshSpecs) == 0 && buildflags.IsGitSSH(contextPath) {
sshSpecs = append(sshSpecs, &controllerapi.SSH{ID: "default"})
}
sshAttachment, err := controllerapi.CreateSSH(sshSpecs)
if err != nil {
return nil, err
}
bo.Session = append(bo.Session, sshAttachment)
if t.Target != nil { if t.Target != nil {
bo.Target = *t.Target opts.Target = *t.Target
} }
cacheImports, err := buildflags.ParseCacheEntry(t.CacheFrom) opts.Secrets, err = buildflags.ParseSecretSpecs(t.Secrets)
if err != nil { if err != nil {
return nil, err return nil, err
} }
bo.CacheFrom = controllerapi.CreateCaches(cacheImports) opts.SSH, err = buildflags.ParseSSHSpecs(t.SSH)
cacheExports, err := buildflags.ParseCacheEntry(t.CacheTo)
if err != nil {
return nil, err
}
bo.CacheTo = controllerapi.CreateCaches(cacheExports)
outputs, err := buildflags.ParseExports(t.Outputs)
if err != nil {
return nil, err
}
bo.Exports, err = controllerapi.CreateExports(outputs)
if err != nil { if err != nil {
return nil, err return nil, err
} }
attests, err := buildflags.ParseAttests(t.Attest) opts.CacheFrom, err = buildflags.ParseCacheEntry(t.CacheFrom)
if err != nil {
return nil, err
}
opts.CacheTo, err = buildflags.ParseCacheEntry(t.CacheTo)
if err != nil { if err != nil {
return nil, err return nil, err
} }
bo.Attests = controllerapi.CreateAttestations(attests)
return bo, nil opts.Exports, err = buildflags.ParseExports(t.Outputs)
if err != nil {
return nil, err
}
opts.Attests, err = buildflags.ParseAttests(t.Attest)
if err != nil {
return nil, err
}
return opts, nil
} }
func defaultTarget() *Target { func defaultTarget() *Target {
@@ -1089,10 +1073,10 @@ func sliceEqual(s1, s2 []string) bool {
return true return true
} }
func toNamedContexts(m map[string]string) map[string]build.NamedContext { func toNamedContexts(m map[string]string) map[string]*controllerapi.NamedContext {
m2 := make(map[string]build.NamedContext, len(m)) m2 := make(map[string]*controllerapi.NamedContext, len(m))
for k, v := range m { for k, v := range m {
m2[k] = build.NamedContext{Path: v} m2[k] = &controllerapi.NamedContext{Path: v}
} }
return m2 return m2
} }

View File

@@ -81,23 +81,32 @@ type buildOptions struct {
func (o *buildOptions) toControllerOptions() (controllerapi.BuildOptions, error) { func (o *buildOptions) toControllerOptions() (controllerapi.BuildOptions, error) {
var err error var err error
opts := controllerapi.BuildOptions{
Allow: o.allow, inputs := controllerapi.Inputs{
BuildArgs: listToMap(o.buildArgs, true),
CgroupParent: o.cgroupParent,
ContextPath: o.contextPath, ContextPath: o.contextPath,
DockerfileName: o.dockerfileName, DockerfileName: o.dockerfileName,
ExtraHosts: o.extraHosts, }
Labels: listToMap(o.labels, false), inputs.NamedContexts, err = buildflags.ParseContextNames(o.contexts)
NetworkMode: o.networkMode, if err != nil {
NoCacheFilter: o.noCacheFilter, return controllerapi.BuildOptions{}, err
Platforms: o.platforms, }
PrintFunc: o.printFunc,
ShmSize: int64(o.shmSize), opts := controllerapi.BuildOptions{
Tags: o.tags, Inputs: &inputs,
Target: o.target, Allow: o.allow,
Ulimits: dockerUlimitToControllerUlimit(o.ulimits), BuildArgs: listToMap(o.buildArgs, true),
Opts: &o.CommonOptions, CgroupParent: o.cgroupParent,
ExtraHosts: o.extraHosts,
Labels: listToMap(o.labels, false),
NetworkMode: o.networkMode,
NoCacheFilter: o.noCacheFilter,
Platforms: o.platforms,
PrintFunc: o.printFunc,
ShmSize: int64(o.shmSize),
Tags: o.tags,
Target: o.target,
Ulimits: dockerUlimitToControllerUlimit(o.ulimits),
Opts: &o.CommonOptions,
} }
// TODO: extract env var parsing to a method easily usable by library consumers // TODO: extract env var parsing to a method easily usable by library consumers
@@ -119,11 +128,6 @@ func (o *buildOptions) toControllerOptions() (controllerapi.BuildOptions, error)
return controllerapi.BuildOptions{}, err return controllerapi.BuildOptions{}, err
} }
opts.NamedContexts, err = buildflags.ParseContextNames(o.contexts)
if err != nil {
return controllerapi.BuildOptions{}, err
}
opts.Exports, err = buildflags.ParseExports(o.outputs) opts.Exports, err = buildflags.ParseExports(o.outputs)
if err != nil { if err != nil {
return controllerapi.BuildOptions{}, err return controllerapi.BuildOptions{}, err
@@ -669,45 +673,6 @@ func dockerUlimitToControllerUlimit(u *dockeropts.UlimitOpt) *controllerapi.Ulim
// resolvePaths resolves all paths contained in controllerapi.BuildOptions // resolvePaths resolves all paths contained in controllerapi.BuildOptions
// and replaces them to absolute paths. // and replaces them to absolute paths.
func resolvePaths(options *controllerapi.BuildOptions) (_ *controllerapi.BuildOptions, err error) { func resolvePaths(options *controllerapi.BuildOptions) (_ *controllerapi.BuildOptions, err error) {
if options.ContextPath != "" && options.ContextPath != "-" {
options.ContextPath, err = filepath.Abs(options.ContextPath)
if err != nil {
return nil, err
}
}
if options.DockerfileName != "" && options.DockerfileName != "-" {
options.DockerfileName, err = filepath.Abs(options.DockerfileName)
if err != nil {
return nil, err
}
}
var contexts map[string]string
for k, v := range options.NamedContexts {
if urlutil.IsGitURL(v) || urlutil.IsURL(v) || strings.HasPrefix(v, "docker-image://") {
// url prefix, this is a remote path
} else if strings.HasPrefix(v, "oci-layout://") {
// oci layout prefix, this is a local path
p := strings.TrimPrefix(v, "oci-layout://")
p, err = filepath.Abs(p)
if err != nil {
return nil, err
}
v = "oci-layout://" + p
} else {
// no prefix, assume local path
v, err = filepath.Abs(v)
if err != nil {
return nil, err
}
}
if contexts == nil {
contexts = make(map[string]string)
}
contexts[k] = v
}
options.NamedContexts = contexts
var cacheFrom []*controllerapi.CacheOptionsEntry var cacheFrom []*controllerapi.CacheOptionsEntry
for _, co := range options.CacheFrom { for _, co := range options.CacheFrom {
switch co.Type { switch co.Type {
@@ -819,5 +784,50 @@ func resolvePaths(options *controllerapi.BuildOptions) (_ *controllerapi.BuildOp
} }
} }
if options.Inputs == nil {
return options, nil
}
if options.Inputs.ContextPath != "" && options.Inputs.ContextPath != "-" {
options.Inputs.ContextPath, err = filepath.Abs(options.Inputs.ContextPath)
if err != nil {
return nil, err
}
}
if options.Inputs.DockerfileName != "" && options.Inputs.DockerfileName != "-" {
options.Inputs.DockerfileName, err = filepath.Abs(options.Inputs.DockerfileName)
if err != nil {
return nil, err
}
}
var contexts map[string]*controllerapi.NamedContext
for k, v := range options.Inputs.NamedContexts {
v := *v
if v.Definition != nil {
// definition, no path
} else if urlutil.IsGitURL(v.Path) || urlutil.IsURL(v.Path) || strings.HasPrefix(v.Path, "docker-image://") {
// url prefix, this is a remote path
} else if strings.HasPrefix(v.Path, "oci-layout://") {
// oci layout prefix, this is a local path
p := strings.TrimPrefix(v.Path, "oci-layout://")
p, err = filepath.Abs(p)
if err != nil {
return nil, err
}
v.Path = "oci-layout://" + p
} else {
// no prefix, assume local path
v.Path, err = filepath.Abs(v.Path)
if err != nil {
return nil, err
}
}
if contexts == nil {
contexts = make(map[string]*controllerapi.NamedContext)
}
contexts[k] = &v
}
options.Inputs.NamedContexts = contexts
return options, nil return options, nil
} }

View File

@@ -21,36 +21,68 @@ func TestResolvePaths(t *testing.T) {
want controllerapi.BuildOptions want controllerapi.BuildOptions
}{ }{
{ {
name: "contextpath", name: "contextpath",
options: controllerapi.BuildOptions{ContextPath: "test"}, options: controllerapi.BuildOptions{
want: controllerapi.BuildOptions{ContextPath: filepath.Join(tmpwd, "test")}, Inputs: &controllerapi.Inputs{ContextPath: "test"},
},
want: controllerapi.BuildOptions{
Inputs: &controllerapi.Inputs{ContextPath: filepath.Join(tmpwd, "test")},
},
}, },
{ {
name: "contextpath-cwd", name: "contextpath-cwd",
options: controllerapi.BuildOptions{ContextPath: "."}, options: controllerapi.BuildOptions{
want: controllerapi.BuildOptions{ContextPath: tmpwd}, Inputs: &controllerapi.Inputs{ContextPath: "."},
},
want: controllerapi.BuildOptions{
Inputs: &controllerapi.Inputs{ContextPath: tmpwd},
},
}, },
{ {
name: "contextpath-dash", name: "contextpath-dash",
options: controllerapi.BuildOptions{ContextPath: "-"}, options: controllerapi.BuildOptions{
want: controllerapi.BuildOptions{ContextPath: "-"}, Inputs: &controllerapi.Inputs{ContextPath: "-"},
},
want: controllerapi.BuildOptions{
Inputs: &controllerapi.Inputs{ContextPath: "-"},
},
}, },
{ {
name: "dockerfilename", name: "dockerfilename",
options: controllerapi.BuildOptions{DockerfileName: "test"}, options: controllerapi.BuildOptions{
want: controllerapi.BuildOptions{DockerfileName: filepath.Join(tmpwd, "test")}, Inputs: &controllerapi.Inputs{DockerfileName: "test"},
},
want: controllerapi.BuildOptions{
Inputs: &controllerapi.Inputs{DockerfileName: filepath.Join(tmpwd, "test")},
},
}, },
{ {
name: "dockerfilename-dash", name: "dockerfilename-dash",
options: controllerapi.BuildOptions{DockerfileName: "-"}, options: controllerapi.BuildOptions{
want: controllerapi.BuildOptions{DockerfileName: "-"}, Inputs: &controllerapi.Inputs{DockerfileName: "-"},
},
want: controllerapi.BuildOptions{
Inputs: &controllerapi.Inputs{DockerfileName: "-"},
},
}, },
{ {
name: "contexts", name: "contexts",
options: controllerapi.BuildOptions{NamedContexts: map[string]string{"a": "test1", "b": "test2", options: controllerapi.BuildOptions{
"alpine": "docker-image://alpine@sha256:0123456789", "project": "https://github.com/myuser/project.git"}}, Inputs: &controllerapi.Inputs{NamedContexts: map[string]*controllerapi.NamedContext{
want: controllerapi.BuildOptions{NamedContexts: map[string]string{"a": filepath.Join(tmpwd, "test1"), "b": filepath.Join(tmpwd, "test2"), "a": {Path: "test1"},
"alpine": "docker-image://alpine@sha256:0123456789", "project": "https://github.com/myuser/project.git"}}, "b": {Path: "test2"},
"alpine": {Path: "docker-image://alpine@sha256:0123456789"},
"project": {Path: "https://github.com/myuser/project.git"},
},
}},
want: controllerapi.BuildOptions{
Inputs: &controllerapi.Inputs{NamedContexts: map[string]*controllerapi.NamedContext{
"a": {Path: filepath.Join(tmpwd, "test1")},
"b": {Path: filepath.Join(tmpwd, "test2")},
"alpine": {Path: "docker-image://alpine@sha256:0123456789"},
"project": {Path: "https://github.com/myuser/project.git"},
},
}},
}, },
{ {
name: "cache-from", name: "cache-from",

View File

@@ -29,6 +29,7 @@ import (
"github.com/docker/docker/pkg/ioutils" "github.com/docker/docker/pkg/ioutils"
"github.com/docker/go-units" "github.com/docker/go-units"
"github.com/moby/buildkit/client" "github.com/moby/buildkit/client"
"github.com/moby/buildkit/client/llb"
"github.com/moby/buildkit/session/auth/authprovider" "github.com/moby/buildkit/session/auth/authprovider"
"github.com/moby/buildkit/solver/errdefs" "github.com/moby/buildkit/solver/errdefs"
"github.com/moby/buildkit/util/grpcerrors" "github.com/moby/buildkit/util/grpcerrors"
@@ -42,121 +43,15 @@ import (
const defaultTargetName = "default" const defaultTargetName = "default"
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) { 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 { opts, err := ToBuildOpts(in, inStream)
return nil, nil, errors.Errorf("--no-cache and --no-cache-filter cannot currently be used together")
}
contexts := map[string]build.NamedContext{}
for name, path := range in.NamedContexts {
contexts[name] = build.NamedContext{Path: path}
}
printFunc, err := parsePrintFunc(in.PrintFunc)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
opts := build.Options{
Inputs: build.Inputs{
ContextPath: in.ContextPath,
DockerfilePath: in.DockerfileName,
InStream: inStream,
NamedContexts: contexts,
},
BuildArgs: in.BuildArgs,
ExtraHosts: in.ExtraHosts,
Labels: in.Labels,
NetworkMode: in.NetworkMode,
NoCache: in.Opts.NoCache,
NoCacheFilter: in.NoCacheFilter,
Pull: in.Opts.Pull,
ShmSize: dockeropts.MemBytes(in.ShmSize),
Tags: in.Tags,
Target: in.Target,
Ulimits: controllerUlimitOpt2DockerUlimit(in.Ulimits),
PrintFunc: printFunc,
}
platforms, err := platformutil.Parse(in.Platforms)
if err != nil {
return nil, nil, err
}
opts.Platforms = platforms
dockerConfig := config.LoadDefaultConfigFile(os.Stderr)
opts.Session = append(opts.Session, authprovider.NewDockerAuthProvider(dockerConfig))
secrets, err := controllerapi.CreateSecrets(in.Secrets)
if err != nil {
return nil, nil, err
}
opts.Session = append(opts.Session, secrets)
sshSpecs := in.SSH
if len(sshSpecs) == 0 && buildflags.IsGitSSH(in.ContextPath) {
sshSpecs = append(sshSpecs, &controllerapi.SSH{ID: "default"})
}
ssh, err := controllerapi.CreateSSH(sshSpecs)
if err != nil {
return nil, nil, err
}
opts.Session = append(opts.Session, ssh)
outputs, err := controllerapi.CreateExports(in.Exports)
if err != nil {
return nil, nil, err
}
if in.Opts.ExportPush {
if in.Opts.ExportLoad {
return nil, nil, errors.Errorf("push and load may not be set together at the moment")
}
if len(outputs) == 0 {
outputs = []client.ExportEntry{{
Type: "image",
Attrs: map[string]string{
"push": "true",
},
}}
} else {
switch outputs[0].Type {
case "image":
outputs[0].Attrs["push"] = "true"
default:
return nil, nil, errors.Errorf("push and %q output can't be used together", outputs[0].Type)
}
}
}
if in.Opts.ExportLoad {
if len(outputs) == 0 {
outputs = []client.ExportEntry{{
Type: "docker",
Attrs: map[string]string{},
}}
} else {
switch outputs[0].Type {
case "docker":
default:
return nil, nil, errors.Errorf("load and %q output can't be used together", outputs[0].Type)
}
}
}
opts.Exports = outputs
opts.CacheFrom = controllerapi.CreateCaches(in.CacheFrom)
opts.CacheTo = controllerapi.CreateCaches(in.CacheTo)
opts.Attests = controllerapi.CreateAttestations(in.Attests)
allow, err := buildflags.ParseEntitlements(in.Allow)
if err != nil {
return nil, nil, err
}
opts.Allow = allow
// key string used for kubernetes "sticky" mode // key string used for kubernetes "sticky" mode
contextPathHash, err := filepath.Abs(in.ContextPath) contextPathHash, err := filepath.Abs(in.Inputs.ContextPath)
if err != nil { if err != nil {
contextPathHash = in.ContextPath contextPathHash = in.Inputs.ContextPath
} }
b, err := builder.New(dockerCli, b, err := builder.New(dockerCli,
@@ -174,7 +69,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
return nil, nil, err return nil, nil, err
} }
resp, 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) err = wrapBuildError(err, false)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@@ -182,6 +77,142 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
return resp, res, nil return resp, res, nil
} }
func ToBuildOpts(in controllerapi.BuildOptions, inStream io.Reader) (*build.Options, error) {
if in.Opts.NoCache && len(in.NoCacheFilter) > 0 {
return nil, errors.Errorf("--no-cache and --no-cache-filter cannot currently be used together")
}
var context *llb.State
if in.Inputs.ContextDefinition != nil {
defop, err := llb.NewDefinitionOp(in.Inputs.ContextDefinition)
if err != nil {
return nil, err
}
st := llb.NewState(defop)
context = &st
}
contexts := map[string]build.NamedContext{}
for name, context := range in.Inputs.NamedContexts {
if context.Definition != nil {
defop, err := llb.NewDefinitionOp(context.Definition)
if err != nil {
return nil, err
}
st := llb.NewState(defop)
contexts[name] = build.NamedContext{State: &st}
} else {
contexts[name] = build.NamedContext{Path: context.Path}
}
}
printFunc, err := parsePrintFunc(in.PrintFunc)
if err != nil {
return nil, err
}
opts := build.Options{
Inputs: build.Inputs{
ContextPath: in.Inputs.ContextPath,
DockerfilePath: in.Inputs.DockerfileName,
DockerfileInline: in.Inputs.DockerfileInline,
ContextState: context,
InStream: inStream,
NamedContexts: contexts,
},
BuildArgs: in.BuildArgs,
ExtraHosts: in.ExtraHosts,
Labels: in.Labels,
NetworkMode: in.NetworkMode,
NoCache: in.Opts.NoCache,
NoCacheFilter: in.NoCacheFilter,
Pull: in.Opts.Pull,
ShmSize: dockeropts.MemBytes(in.ShmSize),
Tags: in.Tags,
Target: in.Target,
Ulimits: controllerUlimitOpt2DockerUlimit(in.Ulimits),
PrintFunc: printFunc,
}
platforms, err := platformutil.Parse(in.Platforms)
if err != nil {
return nil, err
}
opts.Platforms = platforms
dockerConfig := config.LoadDefaultConfigFile(os.Stderr)
opts.Session = append(opts.Session, authprovider.NewDockerAuthProvider(dockerConfig))
secrets, err := controllerapi.CreateSecrets(in.Secrets)
if err != nil {
return nil, err
}
opts.Session = append(opts.Session, secrets)
sshSpecs := in.SSH
if len(sshSpecs) == 0 && buildflags.IsGitSSH(in.Inputs.ContextPath) {
sshSpecs = append(sshSpecs, &controllerapi.SSH{ID: "default"})
}
ssh, err := controllerapi.CreateSSH(sshSpecs)
if err != nil {
return nil, err
}
opts.Session = append(opts.Session, ssh)
outputs, err := controllerapi.CreateExports(in.Exports)
if err != nil {
return 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")
}
if len(outputs) == 0 {
outputs = []client.ExportEntry{{
Type: "image",
Attrs: map[string]string{
"push": "true",
},
}}
} else {
switch outputs[0].Type {
case "image":
outputs[0].Attrs["push"] = "true"
default:
return nil, errors.Errorf("push and %q output can't be used together", outputs[0].Type)
}
}
}
if in.Opts.ExportLoad {
if len(outputs) == 0 {
outputs = []client.ExportEntry{{
Type: "docker",
Attrs: map[string]string{},
}}
} else {
switch outputs[0].Type {
case "docker":
default:
return nil, errors.Errorf("load and %q output can't be used together", outputs[0].Type)
}
}
}
opts.Exports = outputs
opts.CacheFrom = controllerapi.CreateCaches(in.CacheFrom)
opts.CacheTo = controllerapi.CreateCaches(in.CacheTo)
opts.Attests = controllerapi.CreateAttestations(in.Attests)
allow, err := buildflags.ParseEntitlements(in.Allow)
if err != nil {
return nil, err
}
opts.Allow = allow
return &opts, 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) (*client.SolveResponse, *build.ResultContext, 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()) ctx2, cancel := context.WithCancel(context.TODO())
defer cancel() defer cancel()

View File

@@ -8,6 +8,7 @@ import (
fmt "fmt" fmt "fmt"
proto "github.com/gogo/protobuf/proto" proto "github.com/gogo/protobuf/proto"
control "github.com/moby/buildkit/api/services/control" control "github.com/moby/buildkit/api/services/control"
pb "github.com/moby/buildkit/solver/pb"
grpc "google.golang.org/grpc" grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes" codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status" status "google.golang.org/grpc/status"
@@ -269,30 +270,98 @@ func (m *BuildRequest) GetOptions() *BuildOptions {
return nil return nil
} }
type Inputs struct {
ContextPath string `protobuf:"bytes,1,opt,name=ContextPath,proto3" json:"ContextPath,omitempty"`
DockerfileName string `protobuf:"bytes,2,opt,name=DockerfileName,proto3" json:"DockerfileName,omitempty"`
DockerfileInline string `protobuf:"bytes,3,opt,name=DockerfileInline,proto3" json:"DockerfileInline,omitempty"`
ContextDefinition *pb.Definition `protobuf:"bytes,4,opt,name=ContextDefinition,proto3" json:"ContextDefinition,omitempty"`
NamedContexts map[string]*NamedContext `protobuf:"bytes,5,rep,name=NamedContexts,proto3" json:"NamedContexts,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 *Inputs) Reset() { *m = Inputs{} }
func (m *Inputs) String() string { return proto.CompactTextString(m) }
func (*Inputs) ProtoMessage() {}
func (*Inputs) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{6}
}
func (m *Inputs) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Inputs.Unmarshal(m, b)
}
func (m *Inputs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Inputs.Marshal(b, m, deterministic)
}
func (m *Inputs) XXX_Merge(src proto.Message) {
xxx_messageInfo_Inputs.Merge(m, src)
}
func (m *Inputs) XXX_Size() int {
return xxx_messageInfo_Inputs.Size(m)
}
func (m *Inputs) XXX_DiscardUnknown() {
xxx_messageInfo_Inputs.DiscardUnknown(m)
}
var xxx_messageInfo_Inputs proto.InternalMessageInfo
func (m *Inputs) GetContextPath() string {
if m != nil {
return m.ContextPath
}
return ""
}
func (m *Inputs) GetDockerfileName() string {
if m != nil {
return m.DockerfileName
}
return ""
}
func (m *Inputs) GetDockerfileInline() string {
if m != nil {
return m.DockerfileInline
}
return ""
}
func (m *Inputs) GetContextDefinition() *pb.Definition {
if m != nil {
return m.ContextDefinition
}
return nil
}
func (m *Inputs) GetNamedContexts() map[string]*NamedContext {
if m != nil {
return m.NamedContexts
}
return nil
}
type BuildOptions struct { type BuildOptions struct {
ContextPath string `protobuf:"bytes,1,opt,name=ContextPath,proto3" json:"ContextPath,omitempty"` Inputs *Inputs `protobuf:"bytes,1,opt,name=inputs,proto3" json:"inputs,omitempty"`
DockerfileName string `protobuf:"bytes,2,opt,name=DockerfileName,proto3" json:"DockerfileName,omitempty"` PrintFunc string `protobuf:"bytes,2,opt,name=PrintFunc,proto3" json:"PrintFunc,omitempty"`
PrintFunc string `protobuf:"bytes,3,opt,name=PrintFunc,proto3" json:"PrintFunc,omitempty"` Allow []string `protobuf:"bytes,3,rep,name=Allow,proto3" json:"Allow,omitempty"`
NamedContexts map[string]string `protobuf:"bytes,4,rep,name=NamedContexts,proto3" json:"NamedContexts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Attests []*Attest `protobuf:"bytes,4,rep,name=Attests,proto3" json:"Attests,omitempty"`
Allow []string `protobuf:"bytes,5,rep,name=Allow,proto3" json:"Allow,omitempty"` BuildArgs map[string]string `protobuf:"bytes,5,rep,name=BuildArgs,proto3" json:"BuildArgs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
Attests []*Attest `protobuf:"bytes,6,rep,name=Attests,proto3" json:"Attests,omitempty"` CacheFrom []*CacheOptionsEntry `protobuf:"bytes,6,rep,name=CacheFrom,proto3" json:"CacheFrom,omitempty"`
BuildArgs map[string]string `protobuf:"bytes,7,rep,name=BuildArgs,proto3" json:"BuildArgs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` CacheTo []*CacheOptionsEntry `protobuf:"bytes,7,rep,name=CacheTo,proto3" json:"CacheTo,omitempty"`
CacheFrom []*CacheOptionsEntry `protobuf:"bytes,8,rep,name=CacheFrom,proto3" json:"CacheFrom,omitempty"` CgroupParent string `protobuf:"bytes,8,opt,name=CgroupParent,proto3" json:"CgroupParent,omitempty"`
CacheTo []*CacheOptionsEntry `protobuf:"bytes,9,rep,name=CacheTo,proto3" json:"CacheTo,omitempty"` Exports []*ExportEntry `protobuf:"bytes,9,rep,name=Exports,proto3" json:"Exports,omitempty"`
CgroupParent string `protobuf:"bytes,10,opt,name=CgroupParent,proto3" json:"CgroupParent,omitempty"` ExtraHosts []string `protobuf:"bytes,10,rep,name=ExtraHosts,proto3" json:"ExtraHosts,omitempty"`
Exports []*ExportEntry `protobuf:"bytes,11,rep,name=Exports,proto3" json:"Exports,omitempty"` Labels map[string]string `protobuf:"bytes,11,rep,name=Labels,proto3" json:"Labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
ExtraHosts []string `protobuf:"bytes,12,rep,name=ExtraHosts,proto3" json:"ExtraHosts,omitempty"` NetworkMode string `protobuf:"bytes,12,opt,name=NetworkMode,proto3" json:"NetworkMode,omitempty"`
Labels map[string]string `protobuf:"bytes,13,rep,name=Labels,proto3" json:"Labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` NoCacheFilter []string `protobuf:"bytes,13,rep,name=NoCacheFilter,proto3" json:"NoCacheFilter,omitempty"`
NetworkMode string `protobuf:"bytes,14,opt,name=NetworkMode,proto3" json:"NetworkMode,omitempty"` Platforms []string `protobuf:"bytes,14,rep,name=Platforms,proto3" json:"Platforms,omitempty"`
NoCacheFilter []string `protobuf:"bytes,15,rep,name=NoCacheFilter,proto3" json:"NoCacheFilter,omitempty"` Secrets []*Secret `protobuf:"bytes,15,rep,name=Secrets,proto3" json:"Secrets,omitempty"`
Platforms []string `protobuf:"bytes,16,rep,name=Platforms,proto3" json:"Platforms,omitempty"` ShmSize int64 `protobuf:"varint,16,opt,name=ShmSize,proto3" json:"ShmSize,omitempty"`
Secrets []*Secret `protobuf:"bytes,17,rep,name=Secrets,proto3" json:"Secrets,omitempty"` SSH []*SSH `protobuf:"bytes,17,rep,name=SSH,proto3" json:"SSH,omitempty"`
ShmSize int64 `protobuf:"varint,18,opt,name=ShmSize,proto3" json:"ShmSize,omitempty"` Tags []string `protobuf:"bytes,18,rep,name=Tags,proto3" json:"Tags,omitempty"`
SSH []*SSH `protobuf:"bytes,19,rep,name=SSH,proto3" json:"SSH,omitempty"` Target string `protobuf:"bytes,19,opt,name=Target,proto3" json:"Target,omitempty"`
Tags []string `protobuf:"bytes,20,rep,name=Tags,proto3" json:"Tags,omitempty"` Ulimits *UlimitOpt `protobuf:"bytes,20,opt,name=Ulimits,proto3" json:"Ulimits,omitempty"`
Target string `protobuf:"bytes,21,opt,name=Target,proto3" json:"Target,omitempty"` Opts *CommonOptions `protobuf:"bytes,21,opt,name=Opts,proto3" json:"Opts,omitempty"`
Ulimits *UlimitOpt `protobuf:"bytes,22,opt,name=Ulimits,proto3" json:"Ulimits,omitempty"`
Opts *CommonOptions `protobuf:"bytes,24,opt,name=Opts,proto3" json:"Opts,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@@ -302,7 +371,7 @@ func (m *BuildOptions) Reset() { *m = BuildOptions{} }
func (m *BuildOptions) String() string { return proto.CompactTextString(m) } func (m *BuildOptions) String() string { return proto.CompactTextString(m) }
func (*BuildOptions) ProtoMessage() {} func (*BuildOptions) ProtoMessage() {}
func (*BuildOptions) Descriptor() ([]byte, []int) { func (*BuildOptions) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{6} return fileDescriptor_ed7f10298fa1d90f, []int{7}
} }
func (m *BuildOptions) XXX_Unmarshal(b []byte) error { func (m *BuildOptions) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BuildOptions.Unmarshal(m, b) return xxx_messageInfo_BuildOptions.Unmarshal(m, b)
@@ -322,18 +391,11 @@ func (m *BuildOptions) XXX_DiscardUnknown() {
var xxx_messageInfo_BuildOptions proto.InternalMessageInfo var xxx_messageInfo_BuildOptions proto.InternalMessageInfo
func (m *BuildOptions) GetContextPath() string { func (m *BuildOptions) GetInputs() *Inputs {
if m != nil { if m != nil {
return m.ContextPath return m.Inputs
} }
return "" return nil
}
func (m *BuildOptions) GetDockerfileName() string {
if m != nil {
return m.DockerfileName
}
return ""
} }
func (m *BuildOptions) GetPrintFunc() string { func (m *BuildOptions) GetPrintFunc() string {
@@ -343,13 +405,6 @@ func (m *BuildOptions) GetPrintFunc() string {
return "" return ""
} }
func (m *BuildOptions) GetNamedContexts() map[string]string {
if m != nil {
return m.NamedContexts
}
return nil
}
func (m *BuildOptions) GetAllow() []string { func (m *BuildOptions) GetAllow() []string {
if m != nil { if m != nil {
return m.Allow return m.Allow
@@ -496,7 +551,7 @@ func (m *ExportEntry) Reset() { *m = ExportEntry{} }
func (m *ExportEntry) String() string { return proto.CompactTextString(m) } func (m *ExportEntry) String() string { return proto.CompactTextString(m) }
func (*ExportEntry) ProtoMessage() {} func (*ExportEntry) ProtoMessage() {}
func (*ExportEntry) Descriptor() ([]byte, []int) { func (*ExportEntry) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{7} return fileDescriptor_ed7f10298fa1d90f, []int{8}
} }
func (m *ExportEntry) XXX_Unmarshal(b []byte) error { func (m *ExportEntry) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExportEntry.Unmarshal(m, b) return xxx_messageInfo_ExportEntry.Unmarshal(m, b)
@@ -549,7 +604,7 @@ func (m *CacheOptionsEntry) Reset() { *m = CacheOptionsEntry{} }
func (m *CacheOptionsEntry) String() string { return proto.CompactTextString(m) } func (m *CacheOptionsEntry) String() string { return proto.CompactTextString(m) }
func (*CacheOptionsEntry) ProtoMessage() {} func (*CacheOptionsEntry) ProtoMessage() {}
func (*CacheOptionsEntry) Descriptor() ([]byte, []int) { func (*CacheOptionsEntry) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{8} return fileDescriptor_ed7f10298fa1d90f, []int{9}
} }
func (m *CacheOptionsEntry) XXX_Unmarshal(b []byte) error { func (m *CacheOptionsEntry) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CacheOptionsEntry.Unmarshal(m, b) return xxx_messageInfo_CacheOptionsEntry.Unmarshal(m, b)
@@ -596,7 +651,7 @@ func (m *Attest) Reset() { *m = Attest{} }
func (m *Attest) String() string { return proto.CompactTextString(m) } func (m *Attest) String() string { return proto.CompactTextString(m) }
func (*Attest) ProtoMessage() {} func (*Attest) ProtoMessage() {}
func (*Attest) Descriptor() ([]byte, []int) { func (*Attest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{9} return fileDescriptor_ed7f10298fa1d90f, []int{10}
} }
func (m *Attest) XXX_Unmarshal(b []byte) error { func (m *Attest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Attest.Unmarshal(m, b) return xxx_messageInfo_Attest.Unmarshal(m, b)
@@ -649,7 +704,7 @@ func (m *SSH) Reset() { *m = SSH{} }
func (m *SSH) String() string { return proto.CompactTextString(m) } func (m *SSH) String() string { return proto.CompactTextString(m) }
func (*SSH) ProtoMessage() {} func (*SSH) ProtoMessage() {}
func (*SSH) Descriptor() ([]byte, []int) { func (*SSH) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{10} return fileDescriptor_ed7f10298fa1d90f, []int{11}
} }
func (m *SSH) XXX_Unmarshal(b []byte) error { func (m *SSH) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SSH.Unmarshal(m, b) return xxx_messageInfo_SSH.Unmarshal(m, b)
@@ -696,7 +751,7 @@ func (m *Secret) Reset() { *m = Secret{} }
func (m *Secret) String() string { return proto.CompactTextString(m) } func (m *Secret) String() string { return proto.CompactTextString(m) }
func (*Secret) ProtoMessage() {} func (*Secret) ProtoMessage() {}
func (*Secret) Descriptor() ([]byte, []int) { func (*Secret) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{11} return fileDescriptor_ed7f10298fa1d90f, []int{12}
} }
func (m *Secret) XXX_Unmarshal(b []byte) error { func (m *Secret) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Secret.Unmarshal(m, b) return xxx_messageInfo_Secret.Unmarshal(m, b)
@@ -737,6 +792,52 @@ func (m *Secret) GetEnv() string {
return "" return ""
} }
type NamedContext struct {
Path string `protobuf:"bytes,1,opt,name=Path,proto3" json:"Path,omitempty"`
Definition *pb.Definition `protobuf:"bytes,2,opt,name=Definition,proto3" json:"Definition,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *NamedContext) Reset() { *m = NamedContext{} }
func (m *NamedContext) String() string { return proto.CompactTextString(m) }
func (*NamedContext) ProtoMessage() {}
func (*NamedContext) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{13}
}
func (m *NamedContext) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NamedContext.Unmarshal(m, b)
}
func (m *NamedContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_NamedContext.Marshal(b, m, deterministic)
}
func (m *NamedContext) XXX_Merge(src proto.Message) {
xxx_messageInfo_NamedContext.Merge(m, src)
}
func (m *NamedContext) XXX_Size() int {
return xxx_messageInfo_NamedContext.Size(m)
}
func (m *NamedContext) XXX_DiscardUnknown() {
xxx_messageInfo_NamedContext.DiscardUnknown(m)
}
var xxx_messageInfo_NamedContext proto.InternalMessageInfo
func (m *NamedContext) GetPath() string {
if m != nil {
return m.Path
}
return ""
}
func (m *NamedContext) GetDefinition() *pb.Definition {
if m != nil {
return m.Definition
}
return nil
}
type UlimitOpt struct { type UlimitOpt struct {
Values map[string]*Ulimit `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Values map[string]*Ulimit `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -748,7 +849,7 @@ func (m *UlimitOpt) Reset() { *m = UlimitOpt{} }
func (m *UlimitOpt) String() string { return proto.CompactTextString(m) } func (m *UlimitOpt) String() string { return proto.CompactTextString(m) }
func (*UlimitOpt) ProtoMessage() {} func (*UlimitOpt) ProtoMessage() {}
func (*UlimitOpt) Descriptor() ([]byte, []int) { func (*UlimitOpt) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{12} return fileDescriptor_ed7f10298fa1d90f, []int{14}
} }
func (m *UlimitOpt) XXX_Unmarshal(b []byte) error { func (m *UlimitOpt) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UlimitOpt.Unmarshal(m, b) return xxx_messageInfo_UlimitOpt.Unmarshal(m, b)
@@ -788,7 +889,7 @@ func (m *Ulimit) Reset() { *m = Ulimit{} }
func (m *Ulimit) String() string { return proto.CompactTextString(m) } func (m *Ulimit) String() string { return proto.CompactTextString(m) }
func (*Ulimit) ProtoMessage() {} func (*Ulimit) ProtoMessage() {}
func (*Ulimit) Descriptor() ([]byte, []int) { func (*Ulimit) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{13} return fileDescriptor_ed7f10298fa1d90f, []int{15}
} }
func (m *Ulimit) XXX_Unmarshal(b []byte) error { func (m *Ulimit) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Ulimit.Unmarshal(m, b) return xxx_messageInfo_Ulimit.Unmarshal(m, b)
@@ -834,9 +935,14 @@ type CommonOptions struct {
MetadataFile string `protobuf:"bytes,2,opt,name=MetadataFile,proto3" json:"MetadataFile,omitempty"` MetadataFile string `protobuf:"bytes,2,opt,name=MetadataFile,proto3" json:"MetadataFile,omitempty"`
NoCache bool `protobuf:"varint,3,opt,name=NoCache,proto3" json:"NoCache,omitempty"` NoCache bool `protobuf:"varint,3,opt,name=NoCache,proto3" json:"NoCache,omitempty"`
// string Progress: no progress view on server side // string Progress: no progress view on server side
Pull bool `protobuf:"varint,4,opt,name=Pull,proto3" json:"Pull,omitempty"` Pull bool `protobuf:"varint,4,opt,name=Pull,proto3" json:"Pull,omitempty"`
ExportPush bool `protobuf:"varint,5,opt,name=ExportPush,proto3" json:"ExportPush,omitempty"` ExportPush bool `protobuf:"varint,5,opt,name=ExportPush,proto3" json:"ExportPush,omitempty"`
ExportLoad bool `protobuf:"varint,6,opt,name=ExportLoad,proto3" json:"ExportLoad,omitempty"` ExportLoad bool `protobuf:"varint,6,opt,name=ExportLoad,proto3" json:"ExportLoad,omitempty"`
// TODO: we should remove Linked from the controllerapi, it's only used to
// produce a single warning. To allow this, we need to move the default
// export detection out from the controller server, as well as load the
// driver on the controller client.
Linked bool `protobuf:"varint,7,opt,name=Linked,proto3" json:"Linked,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@@ -846,7 +952,7 @@ func (m *CommonOptions) Reset() { *m = CommonOptions{} }
func (m *CommonOptions) String() string { return proto.CompactTextString(m) } func (m *CommonOptions) String() string { return proto.CompactTextString(m) }
func (*CommonOptions) ProtoMessage() {} func (*CommonOptions) ProtoMessage() {}
func (*CommonOptions) Descriptor() ([]byte, []int) { func (*CommonOptions) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{14} return fileDescriptor_ed7f10298fa1d90f, []int{16}
} }
func (m *CommonOptions) XXX_Unmarshal(b []byte) error { func (m *CommonOptions) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CommonOptions.Unmarshal(m, b) return xxx_messageInfo_CommonOptions.Unmarshal(m, b)
@@ -908,6 +1014,13 @@ func (m *CommonOptions) GetExportLoad() bool {
return false return false
} }
func (m *CommonOptions) GetLinked() bool {
if m != nil {
return m.Linked
}
return false
}
type BuildResponse struct { type BuildResponse struct {
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"` 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_NoUnkeyedLiteral struct{} `json:"-"`
@@ -919,7 +1032,7 @@ func (m *BuildResponse) Reset() { *m = BuildResponse{} }
func (m *BuildResponse) String() string { return proto.CompactTextString(m) } func (m *BuildResponse) String() string { return proto.CompactTextString(m) }
func (*BuildResponse) ProtoMessage() {} func (*BuildResponse) ProtoMessage() {}
func (*BuildResponse) Descriptor() ([]byte, []int) { func (*BuildResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{15} return fileDescriptor_ed7f10298fa1d90f, []int{17}
} }
func (m *BuildResponse) XXX_Unmarshal(b []byte) error { func (m *BuildResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BuildResponse.Unmarshal(m, b) return xxx_messageInfo_BuildResponse.Unmarshal(m, b)
@@ -957,7 +1070,7 @@ func (m *DisconnectRequest) Reset() { *m = DisconnectRequest{} }
func (m *DisconnectRequest) String() string { return proto.CompactTextString(m) } func (m *DisconnectRequest) String() string { return proto.CompactTextString(m) }
func (*DisconnectRequest) ProtoMessage() {} func (*DisconnectRequest) ProtoMessage() {}
func (*DisconnectRequest) Descriptor() ([]byte, []int) { func (*DisconnectRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{16} return fileDescriptor_ed7f10298fa1d90f, []int{18}
} }
func (m *DisconnectRequest) XXX_Unmarshal(b []byte) error { func (m *DisconnectRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DisconnectRequest.Unmarshal(m, b) return xxx_messageInfo_DisconnectRequest.Unmarshal(m, b)
@@ -994,7 +1107,7 @@ func (m *DisconnectResponse) Reset() { *m = DisconnectResponse{} }
func (m *DisconnectResponse) String() string { return proto.CompactTextString(m) } func (m *DisconnectResponse) String() string { return proto.CompactTextString(m) }
func (*DisconnectResponse) ProtoMessage() {} func (*DisconnectResponse) ProtoMessage() {}
func (*DisconnectResponse) Descriptor() ([]byte, []int) { func (*DisconnectResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{17} return fileDescriptor_ed7f10298fa1d90f, []int{19}
} }
func (m *DisconnectResponse) XXX_Unmarshal(b []byte) error { func (m *DisconnectResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DisconnectResponse.Unmarshal(m, b) return xxx_messageInfo_DisconnectResponse.Unmarshal(m, b)
@@ -1025,7 +1138,7 @@ func (m *ListRequest) Reset() { *m = ListRequest{} }
func (m *ListRequest) String() string { return proto.CompactTextString(m) } func (m *ListRequest) String() string { return proto.CompactTextString(m) }
func (*ListRequest) ProtoMessage() {} func (*ListRequest) ProtoMessage() {}
func (*ListRequest) Descriptor() ([]byte, []int) { func (*ListRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{18} return fileDescriptor_ed7f10298fa1d90f, []int{20}
} }
func (m *ListRequest) XXX_Unmarshal(b []byte) error { func (m *ListRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRequest.Unmarshal(m, b) return xxx_messageInfo_ListRequest.Unmarshal(m, b)
@@ -1063,7 +1176,7 @@ func (m *ListResponse) Reset() { *m = ListResponse{} }
func (m *ListResponse) String() string { return proto.CompactTextString(m) } func (m *ListResponse) String() string { return proto.CompactTextString(m) }
func (*ListResponse) ProtoMessage() {} func (*ListResponse) ProtoMessage() {}
func (*ListResponse) Descriptor() ([]byte, []int) { func (*ListResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{19} return fileDescriptor_ed7f10298fa1d90f, []int{21}
} }
func (m *ListResponse) XXX_Unmarshal(b []byte) error { func (m *ListResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListResponse.Unmarshal(m, b) return xxx_messageInfo_ListResponse.Unmarshal(m, b)
@@ -1104,7 +1217,7 @@ func (m *InputMessage) Reset() { *m = InputMessage{} }
func (m *InputMessage) String() string { return proto.CompactTextString(m) } func (m *InputMessage) String() string { return proto.CompactTextString(m) }
func (*InputMessage) ProtoMessage() {} func (*InputMessage) ProtoMessage() {}
func (*InputMessage) Descriptor() ([]byte, []int) { func (*InputMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{20} return fileDescriptor_ed7f10298fa1d90f, []int{22}
} }
func (m *InputMessage) XXX_Unmarshal(b []byte) error { func (m *InputMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputMessage.Unmarshal(m, b) return xxx_messageInfo_InputMessage.Unmarshal(m, b)
@@ -1178,7 +1291,7 @@ func (m *InputInitMessage) Reset() { *m = InputInitMessage{} }
func (m *InputInitMessage) String() string { return proto.CompactTextString(m) } func (m *InputInitMessage) String() string { return proto.CompactTextString(m) }
func (*InputInitMessage) ProtoMessage() {} func (*InputInitMessage) ProtoMessage() {}
func (*InputInitMessage) Descriptor() ([]byte, []int) { func (*InputInitMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{21} return fileDescriptor_ed7f10298fa1d90f, []int{23}
} }
func (m *InputInitMessage) XXX_Unmarshal(b []byte) error { func (m *InputInitMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputInitMessage.Unmarshal(m, b) return xxx_messageInfo_InputInitMessage.Unmarshal(m, b)
@@ -1217,7 +1330,7 @@ func (m *DataMessage) Reset() { *m = DataMessage{} }
func (m *DataMessage) String() string { return proto.CompactTextString(m) } func (m *DataMessage) String() string { return proto.CompactTextString(m) }
func (*DataMessage) ProtoMessage() {} func (*DataMessage) ProtoMessage() {}
func (*DataMessage) Descriptor() ([]byte, []int) { func (*DataMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{22} return fileDescriptor_ed7f10298fa1d90f, []int{24}
} }
func (m *DataMessage) XXX_Unmarshal(b []byte) error { func (m *DataMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DataMessage.Unmarshal(m, b) return xxx_messageInfo_DataMessage.Unmarshal(m, b)
@@ -1261,7 +1374,7 @@ func (m *InputResponse) Reset() { *m = InputResponse{} }
func (m *InputResponse) String() string { return proto.CompactTextString(m) } func (m *InputResponse) String() string { return proto.CompactTextString(m) }
func (*InputResponse) ProtoMessage() {} func (*InputResponse) ProtoMessage() {}
func (*InputResponse) Descriptor() ([]byte, []int) { func (*InputResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{23} return fileDescriptor_ed7f10298fa1d90f, []int{25}
} }
func (m *InputResponse) XXX_Unmarshal(b []byte) error { func (m *InputResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputResponse.Unmarshal(m, b) return xxx_messageInfo_InputResponse.Unmarshal(m, b)
@@ -1297,7 +1410,7 @@ func (m *Message) Reset() { *m = Message{} }
func (m *Message) String() string { return proto.CompactTextString(m) } func (m *Message) String() string { return proto.CompactTextString(m) }
func (*Message) ProtoMessage() {} func (*Message) ProtoMessage() {}
func (*Message) Descriptor() ([]byte, []int) { func (*Message) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{24} return fileDescriptor_ed7f10298fa1d90f, []int{26}
} }
func (m *Message) XXX_Unmarshal(b []byte) error { func (m *Message) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Message.Unmarshal(m, b) return xxx_messageInfo_Message.Unmarshal(m, b)
@@ -1399,7 +1512,7 @@ func (m *InitMessage) Reset() { *m = InitMessage{} }
func (m *InitMessage) String() string { return proto.CompactTextString(m) } func (m *InitMessage) String() string { return proto.CompactTextString(m) }
func (*InitMessage) ProtoMessage() {} func (*InitMessage) ProtoMessage() {}
func (*InitMessage) Descriptor() ([]byte, []int) { func (*InitMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{25} return fileDescriptor_ed7f10298fa1d90f, []int{27}
} }
func (m *InitMessage) XXX_Unmarshal(b []byte) error { func (m *InitMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InitMessage.Unmarshal(m, b) return xxx_messageInfo_InitMessage.Unmarshal(m, b)
@@ -1459,7 +1572,7 @@ func (m *InvokeConfig) Reset() { *m = InvokeConfig{} }
func (m *InvokeConfig) String() string { return proto.CompactTextString(m) } func (m *InvokeConfig) String() string { return proto.CompactTextString(m) }
func (*InvokeConfig) ProtoMessage() {} func (*InvokeConfig) ProtoMessage() {}
func (*InvokeConfig) Descriptor() ([]byte, []int) { func (*InvokeConfig) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{26} return fileDescriptor_ed7f10298fa1d90f, []int{28}
} }
func (m *InvokeConfig) XXX_Unmarshal(b []byte) error { func (m *InvokeConfig) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InvokeConfig.Unmarshal(m, b) return xxx_messageInfo_InvokeConfig.Unmarshal(m, b)
@@ -1555,7 +1668,7 @@ func (m *FdMessage) Reset() { *m = FdMessage{} }
func (m *FdMessage) String() string { return proto.CompactTextString(m) } func (m *FdMessage) String() string { return proto.CompactTextString(m) }
func (*FdMessage) ProtoMessage() {} func (*FdMessage) ProtoMessage() {}
func (*FdMessage) Descriptor() ([]byte, []int) { func (*FdMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{27} return fileDescriptor_ed7f10298fa1d90f, []int{29}
} }
func (m *FdMessage) XXX_Unmarshal(b []byte) error { func (m *FdMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FdMessage.Unmarshal(m, b) return xxx_messageInfo_FdMessage.Unmarshal(m, b)
@@ -1608,7 +1721,7 @@ func (m *ResizeMessage) Reset() { *m = ResizeMessage{} }
func (m *ResizeMessage) String() string { return proto.CompactTextString(m) } func (m *ResizeMessage) String() string { return proto.CompactTextString(m) }
func (*ResizeMessage) ProtoMessage() {} func (*ResizeMessage) ProtoMessage() {}
func (*ResizeMessage) Descriptor() ([]byte, []int) { func (*ResizeMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{28} return fileDescriptor_ed7f10298fa1d90f, []int{30}
} }
func (m *ResizeMessage) XXX_Unmarshal(b []byte) error { func (m *ResizeMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResizeMessage.Unmarshal(m, b) return xxx_messageInfo_ResizeMessage.Unmarshal(m, b)
@@ -1655,7 +1768,7 @@ func (m *SignalMessage) Reset() { *m = SignalMessage{} }
func (m *SignalMessage) String() string { return proto.CompactTextString(m) } func (m *SignalMessage) String() string { return proto.CompactTextString(m) }
func (*SignalMessage) ProtoMessage() {} func (*SignalMessage) ProtoMessage() {}
func (*SignalMessage) Descriptor() ([]byte, []int) { func (*SignalMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{29} return fileDescriptor_ed7f10298fa1d90f, []int{31}
} }
func (m *SignalMessage) XXX_Unmarshal(b []byte) error { func (m *SignalMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalMessage.Unmarshal(m, b) return xxx_messageInfo_SignalMessage.Unmarshal(m, b)
@@ -1693,7 +1806,7 @@ func (m *StatusRequest) Reset() { *m = StatusRequest{} }
func (m *StatusRequest) String() string { return proto.CompactTextString(m) } func (m *StatusRequest) String() string { return proto.CompactTextString(m) }
func (*StatusRequest) ProtoMessage() {} func (*StatusRequest) ProtoMessage() {}
func (*StatusRequest) Descriptor() ([]byte, []int) { func (*StatusRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{30} return fileDescriptor_ed7f10298fa1d90f, []int{32}
} }
func (m *StatusRequest) XXX_Unmarshal(b []byte) error { func (m *StatusRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StatusRequest.Unmarshal(m, b) return xxx_messageInfo_StatusRequest.Unmarshal(m, b)
@@ -1734,7 +1847,7 @@ func (m *StatusResponse) Reset() { *m = StatusResponse{} }
func (m *StatusResponse) String() string { return proto.CompactTextString(m) } func (m *StatusResponse) String() string { return proto.CompactTextString(m) }
func (*StatusResponse) ProtoMessage() {} func (*StatusResponse) ProtoMessage() {}
func (*StatusResponse) Descriptor() ([]byte, []int) { func (*StatusResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{31} return fileDescriptor_ed7f10298fa1d90f, []int{33}
} }
func (m *StatusResponse) XXX_Unmarshal(b []byte) error { func (m *StatusResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StatusResponse.Unmarshal(m, b) return xxx_messageInfo_StatusResponse.Unmarshal(m, b)
@@ -1792,7 +1905,7 @@ func (m *InfoRequest) Reset() { *m = InfoRequest{} }
func (m *InfoRequest) String() string { return proto.CompactTextString(m) } func (m *InfoRequest) String() string { return proto.CompactTextString(m) }
func (*InfoRequest) ProtoMessage() {} func (*InfoRequest) ProtoMessage() {}
func (*InfoRequest) Descriptor() ([]byte, []int) { func (*InfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{32} return fileDescriptor_ed7f10298fa1d90f, []int{34}
} }
func (m *InfoRequest) XXX_Unmarshal(b []byte) error { func (m *InfoRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InfoRequest.Unmarshal(m, b) return xxx_messageInfo_InfoRequest.Unmarshal(m, b)
@@ -1823,7 +1936,7 @@ func (m *InfoResponse) Reset() { *m = InfoResponse{} }
func (m *InfoResponse) String() string { return proto.CompactTextString(m) } func (m *InfoResponse) String() string { return proto.CompactTextString(m) }
func (*InfoResponse) ProtoMessage() {} func (*InfoResponse) ProtoMessage() {}
func (*InfoResponse) Descriptor() ([]byte, []int) { func (*InfoResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{33} return fileDescriptor_ed7f10298fa1d90f, []int{35}
} }
func (m *InfoResponse) XXX_Unmarshal(b []byte) error { func (m *InfoResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InfoResponse.Unmarshal(m, b) return xxx_messageInfo_InfoResponse.Unmarshal(m, b)
@@ -1863,7 +1976,7 @@ func (m *BuildxVersion) Reset() { *m = BuildxVersion{} }
func (m *BuildxVersion) String() string { return proto.CompactTextString(m) } func (m *BuildxVersion) String() string { return proto.CompactTextString(m) }
func (*BuildxVersion) ProtoMessage() {} func (*BuildxVersion) ProtoMessage() {}
func (*BuildxVersion) Descriptor() ([]byte, []int) { func (*BuildxVersion) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{34} return fileDescriptor_ed7f10298fa1d90f, []int{36}
} }
func (m *BuildxVersion) XXX_Unmarshal(b []byte) error { func (m *BuildxVersion) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BuildxVersion.Unmarshal(m, b) return xxx_messageInfo_BuildxVersion.Unmarshal(m, b)
@@ -1911,10 +2024,11 @@ func init() {
proto.RegisterType((*DisconnectProcessRequest)(nil), "buildx.controller.v1.DisconnectProcessRequest") proto.RegisterType((*DisconnectProcessRequest)(nil), "buildx.controller.v1.DisconnectProcessRequest")
proto.RegisterType((*DisconnectProcessResponse)(nil), "buildx.controller.v1.DisconnectProcessResponse") proto.RegisterType((*DisconnectProcessResponse)(nil), "buildx.controller.v1.DisconnectProcessResponse")
proto.RegisterType((*BuildRequest)(nil), "buildx.controller.v1.BuildRequest") proto.RegisterType((*BuildRequest)(nil), "buildx.controller.v1.BuildRequest")
proto.RegisterType((*Inputs)(nil), "buildx.controller.v1.Inputs")
proto.RegisterMapType((map[string]*NamedContext)(nil), "buildx.controller.v1.Inputs.NamedContextsEntry")
proto.RegisterType((*BuildOptions)(nil), "buildx.controller.v1.BuildOptions") proto.RegisterType((*BuildOptions)(nil), "buildx.controller.v1.BuildOptions")
proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.BuildOptions.BuildArgsEntry") proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.BuildOptions.BuildArgsEntry")
proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.BuildOptions.LabelsEntry") proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.BuildOptions.LabelsEntry")
proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.BuildOptions.NamedContextsEntry")
proto.RegisterType((*ExportEntry)(nil), "buildx.controller.v1.ExportEntry") proto.RegisterType((*ExportEntry)(nil), "buildx.controller.v1.ExportEntry")
proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.ExportEntry.AttrsEntry") proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.ExportEntry.AttrsEntry")
proto.RegisterType((*CacheOptionsEntry)(nil), "buildx.controller.v1.CacheOptionsEntry") proto.RegisterType((*CacheOptionsEntry)(nil), "buildx.controller.v1.CacheOptionsEntry")
@@ -1922,6 +2036,7 @@ func init() {
proto.RegisterType((*Attest)(nil), "buildx.controller.v1.Attest") proto.RegisterType((*Attest)(nil), "buildx.controller.v1.Attest")
proto.RegisterType((*SSH)(nil), "buildx.controller.v1.SSH") proto.RegisterType((*SSH)(nil), "buildx.controller.v1.SSH")
proto.RegisterType((*Secret)(nil), "buildx.controller.v1.Secret") proto.RegisterType((*Secret)(nil), "buildx.controller.v1.Secret")
proto.RegisterType((*NamedContext)(nil), "buildx.controller.v1.NamedContext")
proto.RegisterType((*UlimitOpt)(nil), "buildx.controller.v1.UlimitOpt") proto.RegisterType((*UlimitOpt)(nil), "buildx.controller.v1.UlimitOpt")
proto.RegisterMapType((map[string]*Ulimit)(nil), "buildx.controller.v1.UlimitOpt.ValuesEntry") proto.RegisterMapType((map[string]*Ulimit)(nil), "buildx.controller.v1.UlimitOpt.ValuesEntry")
proto.RegisterType((*Ulimit)(nil), "buildx.controller.v1.Ulimit") proto.RegisterType((*Ulimit)(nil), "buildx.controller.v1.Ulimit")
@@ -1952,119 +2067,127 @@ func init() {
func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) } func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) }
var fileDescriptor_ed7f10298fa1d90f = []byte{ var fileDescriptor_ed7f10298fa1d90f = []byte{
// 1790 bytes of a gzipped FileDescriptorProto // 1913 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xcd, 0x6e, 0x23, 0xc7, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xcd, 0x72, 0x1b, 0xb9,
0x11, 0xce, 0x90, 0x14, 0x7f, 0x8a, 0xa2, 0xac, 0xed, 0x68, 0x8d, 0x31, 0xed, 0x78, 0xb5, 0xb3, 0x11, 0xce, 0x90, 0x14, 0x7f, 0x9a, 0xa2, 0x56, 0x46, 0xe4, 0xd4, 0x2c, 0xd7, 0x59, 0xcb, 0x63,
0x1b, 0x87, 0xc8, 0x06, 0x94, 0x2d, 0xc7, 0x59, 0xaf, 0x77, 0x03, 0x44, 0xa2, 0x44, 0x48, 0xc6, 0x67, 0xa3, 0x5a, 0x6f, 0x91, 0xbb, 0xda, 0x4d, 0x6c, 0xaf, 0x9d, 0x83, 0xfe, 0x58, 0xd2, 0x96,
0xea, 0x07, 0x4d, 0xed, 0x1a, 0x49, 0x80, 0x18, 0x43, 0xb2, 0x45, 0x0d, 0x38, 0x9c, 0x66, 0xa6, 0xfe, 0x0a, 0xb2, 0xbd, 0x95, 0x1c, 0xb2, 0x35, 0x24, 0x41, 0x6a, 0x8a, 0xc3, 0xc1, 0x64, 0x00,
0x9b, 0x94, 0x98, 0x53, 0x2e, 0xbe, 0xe6, 0x3d, 0x82, 0x5c, 0x73, 0xcb, 0x29, 0xef, 0x90, 0x07, 0x52, 0x52, 0x4e, 0xb9, 0xe4, 0x9a, 0xf7, 0x48, 0xe5, 0x9a, 0x5b, 0x4e, 0x79, 0x85, 0x24, 0x0f,
0xc9, 0x23, 0x04, 0x5d, 0xdd, 0x33, 0x9c, 0x11, 0x39, 0x94, 0x14, 0x9f, 0xd8, 0x55, 0xf3, 0x55, 0x92, 0x6b, 0x6e, 0x29, 0x34, 0x30, 0xe4, 0x8c, 0xc8, 0x19, 0xc9, 0xc9, 0x89, 0x40, 0xcf, 0xf7,
0x55, 0x57, 0x75, 0xfd, 0x74, 0x13, 0x36, 0x7b, 0x3c, 0x90, 0x21, 0xf7, 0x7d, 0x16, 0x36, 0xc7, 0x35, 0xd0, 0x8d, 0x46, 0x77, 0x83, 0xb0, 0xde, 0xe3, 0x81, 0x8c, 0xb8, 0xef, 0xb3, 0xa8, 0x15,
0x21, 0x97, 0x9c, 0x6c, 0x75, 0x27, 0x9e, 0xdf, 0xbf, 0x69, 0x26, 0x3e, 0x4c, 0xbf, 0xa8, 0xbf, 0x46, 0x5c, 0x72, 0xb2, 0xd1, 0x9d, 0x78, 0x7e, 0xff, 0xba, 0x95, 0xf8, 0x30, 0xfd, 0xaa, 0xf9,
0x1e, 0x78, 0xf2, 0x6a, 0xd2, 0x6d, 0xf6, 0xf8, 0x68, 0x67, 0xc4, 0xbb, 0xb3, 0x1d, 0x44, 0x0d, 0x7a, 0xe8, 0xc9, 0xcb, 0x49, 0xb7, 0xd5, 0xe3, 0xe3, 0xf6, 0x98, 0x77, 0x6f, 0xda, 0x88, 0x1a,
0x3d, 0xb9, 0xe3, 0x8e, 0xbd, 0x1d, 0xc1, 0xc2, 0xa9, 0xd7, 0x63, 0x62, 0xc7, 0x08, 0x45, 0xbf, 0x79, 0xb2, 0xed, 0x86, 0x5e, 0x5b, 0xb0, 0x68, 0xea, 0xf5, 0x98, 0x68, 0x1b, 0x52, 0xfc, 0xab,
0x5a, 0xa5, 0xd3, 0x80, 0xad, 0xb7, 0x9e, 0x90, 0xe7, 0x21, 0xef, 0x31, 0x21, 0x98, 0xa0, 0xec, 0x55, 0x36, 0xbf, 0xc8, 0x24, 0x0b, 0xee, 0x4f, 0x59, 0xd4, 0x0e, 0xbb, 0x6d, 0x1e, 0x0a, 0x8d,
0xcf, 0x13, 0x26, 0x24, 0xd9, 0x84, 0x3c, 0x65, 0x97, 0xb6, 0xb5, 0x6d, 0x35, 0x2a, 0x54, 0x2d, 0x76, 0xb6, 0x60, 0xe3, 0xd8, 0x13, 0xf2, 0x3c, 0xe2, 0x3d, 0x26, 0x04, 0x13, 0x94, 0xfd, 0x6e,
0x9d, 0x73, 0x78, 0x7c, 0x0b, 0x29, 0xc6, 0x3c, 0x10, 0x8c, 0xbc, 0x84, 0xb5, 0xe3, 0xe0, 0x92, 0xc2, 0x84, 0x24, 0xeb, 0x50, 0xa4, 0x6c, 0x60, 0x5b, 0x9b, 0xd6, 0x56, 0x8d, 0xaa, 0xa1, 0x73,
0x0b, 0xdb, 0xda, 0xce, 0x37, 0xaa, 0xbb, 0x4f, 0x9b, 0xcb, 0x76, 0xd9, 0x34, 0x72, 0x0a, 0x49, 0x0e, 0x0f, 0x6f, 0x21, 0x45, 0xc8, 0x03, 0xc1, 0xc8, 0x0b, 0x58, 0x39, 0x0a, 0x06, 0x5c, 0xd8,
0x35, 0xde, 0x11, 0x50, 0x4d, 0x70, 0xc9, 0x27, 0x50, 0x89, 0xc8, 0x03, 0x63, 0x78, 0xce, 0x20, 0xd6, 0x66, 0x71, 0xab, 0xbe, 0xfd, 0xa4, 0xb5, 0xcc, 0xa6, 0x96, 0xe1, 0x29, 0x24, 0xd5, 0x78,
0x6d, 0x58, 0x3f, 0x0e, 0xa6, 0x7c, 0xc8, 0x5a, 0x3c, 0xb8, 0xf4, 0x06, 0x76, 0x6e, 0xdb, 0x6a, 0x47, 0x40, 0x3d, 0x21, 0x25, 0x8f, 0xa0, 0x16, 0x4f, 0xf7, 0xcd, 0xc2, 0x73, 0x01, 0xe9, 0xc0,
0x54, 0x77, 0x9d, 0xe5, 0xc6, 0x92, 0x48, 0x9a, 0x92, 0x73, 0xbe, 0x05, 0xfb, 0xc0, 0x13, 0x3d, 0xea, 0x51, 0x30, 0xe5, 0x23, 0xb6, 0xc7, 0x83, 0x81, 0x37, 0xb4, 0x0b, 0x9b, 0xd6, 0x56, 0x7d,
0x1e, 0x04, 0xac, 0x17, 0x39, 0x93, 0xe9, 0x74, 0x7a, 0x4f, 0xb9, 0x5b, 0x7b, 0x72, 0x3e, 0x86, 0xdb, 0x59, 0xbe, 0x58, 0x12, 0x49, 0x53, 0x3c, 0xe7, 0x3b, 0xb0, 0xf7, 0x3d, 0xd1, 0xe3, 0x41,
0x8f, 0x96, 0xe8, 0xd2, 0x61, 0x71, 0xfe, 0x04, 0xeb, 0xfb, 0x6a, 0x6f, 0xd9, 0xca, 0xdf, 0x40, 0xc0, 0x7a, 0xb1, 0x31, 0x99, 0x46, 0xa7, 0xf7, 0x54, 0xb8, 0xb5, 0x27, 0xe7, 0x13, 0xf8, 0x78,
0xe9, 0x6c, 0x2c, 0x3d, 0x1e, 0x88, 0xd5, 0xde, 0xa0, 0x1a, 0x83, 0xa4, 0x91, 0x88, 0xf3, 0x03, 0x89, 0x2e, 0xed, 0x16, 0xe7, 0xb7, 0xb0, 0xba, 0xab, 0xf6, 0x96, 0xad, 0xfc, 0x0d, 0x54, 0xce,
0x18, 0x03, 0x86, 0x41, 0xb6, 0xa1, 0xda, 0xe2, 0x81, 0x64, 0x37, 0xf2, 0xdc, 0x95, 0x57, 0xc6, 0x42, 0xe9, 0xf1, 0x40, 0xe4, 0x5b, 0x83, 0x6a, 0x0c, 0x92, 0xc6, 0x14, 0xe7, 0x3f, 0x05, 0x28,
0x50, 0x92, 0x45, 0x3e, 0x83, 0x8d, 0x03, 0xde, 0x1b, 0xb2, 0xf0, 0xd2, 0xf3, 0xd9, 0xa9, 0x3b, 0x1f, 0x05, 0xe1, 0x44, 0x0a, 0xb2, 0x09, 0xf5, 0x3d, 0x1e, 0x48, 0x76, 0x2d, 0xcf, 0x5d, 0x79,
0x62, 0xc6, 0xa5, 0x5b, 0x5c, 0xed, 0xb5, 0x17, 0xc8, 0xf6, 0x24, 0xe8, 0xd9, 0xf9, 0xc8, 0x6b, 0x69, 0x96, 0x48, 0x8a, 0xc8, 0x67, 0xb0, 0xb6, 0xcf, 0x7b, 0x23, 0x16, 0x0d, 0x3c, 0x9f, 0x9d,
0xc3, 0x20, 0x7f, 0x84, 0x9a, 0x42, 0xf5, 0x8d, 0x66, 0x61, 0x17, 0xf0, 0xdc, 0xbf, 0xba, 0x7b, 0xba, 0x63, 0x66, 0x8c, 0xb9, 0x25, 0x25, 0x9f, 0xc3, 0xfa, 0x5c, 0x72, 0x14, 0xf8, 0x5e, 0xc0,
0xf3, 0xcd, 0x94, 0xdc, 0x61, 0x20, 0xc3, 0x19, 0x4d, 0xeb, 0x22, 0x5b, 0xb0, 0xb6, 0xe7, 0xfb, 0xec, 0x22, 0x22, 0x17, 0xe4, 0xe4, 0x0d, 0x3c, 0x30, 0x4b, 0xec, 0xb3, 0x81, 0x17, 0x78, 0x6a,
0xfc, 0xda, 0x5e, 0xdb, 0xce, 0x37, 0x2a, 0x54, 0x13, 0xe4, 0x37, 0x50, 0xda, 0x93, 0x92, 0x09, 0x5b, 0x76, 0x09, 0x0d, 0x59, 0x6b, 0x85, 0xdd, 0xd6, 0x5c, 0x4a, 0x17, 0x81, 0xe4, 0x1d, 0x34,
0x29, 0xec, 0x22, 0x1a, 0xfb, 0x64, 0xb9, 0x31, 0x0d, 0xa2, 0x11, 0x98, 0x9c, 0x41, 0x05, 0xed, 0xd4, 0x8a, 0x7d, 0xf3, 0x45, 0xd8, 0x2b, 0x18, 0x3d, 0xed, 0xac, 0x03, 0x55, 0x86, 0xb6, 0x52,
0xef, 0x85, 0x03, 0x61, 0x97, 0x50, 0xf2, 0x8b, 0x7b, 0x6c, 0x33, 0x96, 0xd1, 0x5b, 0x9c, 0xeb, 0x8c, 0x83, 0x40, 0x46, 0x37, 0x34, 0xad, 0xa5, 0xd9, 0x07, 0xb2, 0x08, 0x52, 0xbe, 0x1f, 0xb1,
0x20, 0x87, 0x50, 0x69, 0xb9, 0xbd, 0x2b, 0xd6, 0x0e, 0xf9, 0xc8, 0x2e, 0xa3, 0xc2, 0x5f, 0x2c, 0x9b, 0xd8, 0xf7, 0x23, 0x76, 0x43, 0x5e, 0xc2, 0xca, 0xd4, 0xf5, 0x27, 0x2c, 0xdf, 0xf3, 0x49,
0x57, 0x88, 0x30, 0xa3, 0xd0, 0xa8, 0x89, 0x25, 0xc9, 0x1e, 0x94, 0x90, 0xb8, 0xe0, 0x76, 0xe5, 0x55, 0x54, 0x13, 0xbe, 0x2d, 0xbc, 0xb4, 0x9c, 0x7f, 0x54, 0xcd, 0xe1, 0x9a, 0xc3, 0x20, 0xdf,
0x61, 0x4a, 0x22, 0x39, 0xe2, 0xc0, 0x7a, 0x6b, 0x10, 0xf2, 0xc9, 0xf8, 0xdc, 0x0d, 0x59, 0x20, 0x40, 0xd9, 0xc3, 0x2d, 0xe2, 0x1a, 0xf5, 0xed, 0x47, 0x79, 0x66, 0x50, 0x83, 0xd5, 0xd1, 0xe5,
0x6d, 0xc0, 0x63, 0x4a, 0xf1, 0xc8, 0x6b, 0x28, 0x1d, 0xde, 0x8c, 0x79, 0x28, 0x85, 0x5d, 0x5d, 0x05, 0xb2, 0x33, 0x09, 0x7a, 0xf3, 0xe8, 0x32, 0x02, 0xb2, 0x01, 0x2b, 0x3b, 0xbe, 0xcf, 0xaf,
0x55, 0x9b, 0x1a, 0x64, 0x0c, 0x18, 0x09, 0xf2, 0x29, 0xc0, 0xe1, 0x8d, 0x0c, 0xdd, 0x23, 0xae, 0xec, 0xe2, 0x66, 0x71, 0xab, 0x46, 0xf5, 0x84, 0xfc, 0x12, 0x2a, 0x3b, 0x52, 0x32, 0x21, 0x85,
0xc2, 0xbe, 0x8e, 0xc7, 0x91, 0xe0, 0x90, 0x36, 0x14, 0xdf, 0xba, 0x5d, 0xe6, 0x0b, 0xbb, 0x86, 0x5d, 0x42, 0x8f, 0x65, 0x2c, 0xa5, 0x41, 0x34, 0x06, 0x93, 0x33, 0xa8, 0xe1, 0x8e, 0x77, 0xa2,
0xba, 0x9b, 0xf7, 0x08, 0xac, 0x16, 0xd0, 0x86, 0x8c, 0xb4, 0x4a, 0xdb, 0x53, 0x26, 0xaf, 0x79, 0x61, 0xec, 0xeb, 0xaf, 0xee, 0x0e, 0xb7, 0xd6, 0x8c, 0xa3, 0xbd, 0x3d, 0xd7, 0x41, 0x0e, 0xa0,
0x38, 0x3c, 0xe1, 0x7d, 0x66, 0x6f, 0xe8, 0xb4, 0x4d, 0xb0, 0xc8, 0x73, 0xa8, 0x9d, 0x72, 0x1d, 0xb6, 0xe7, 0xf6, 0x2e, 0x59, 0x27, 0xe2, 0x63, 0xbb, 0x8c, 0x0a, 0x7f, 0xbe, 0x5c, 0x21, 0xc2,
0x3c, 0xcf, 0x97, 0x2c, 0xb4, 0x3f, 0xc0, 0xcd, 0xa4, 0x99, 0x98, 0xb4, 0xbe, 0x2b, 0x2f, 0x79, 0x8c, 0x42, 0xa3, 0x66, 0xc6, 0x24, 0x3b, 0x50, 0xc1, 0xc9, 0x5b, 0x6e, 0x57, 0x3e, 0x4c, 0x49,
0x38, 0x12, 0xf6, 0x26, 0x22, 0xe6, 0x0c, 0x95, 0x41, 0x1d, 0xd6, 0x0b, 0x99, 0x14, 0xf6, 0xa3, 0xcc, 0x23, 0x0e, 0xac, 0xee, 0x0d, 0x23, 0x3e, 0x09, 0xcf, 0xdd, 0x88, 0x05, 0xd2, 0xae, 0xa2,
0x55, 0x19, 0xa4, 0x41, 0x34, 0x02, 0x13, 0x1b, 0x4a, 0x9d, 0xab, 0x51, 0xc7, 0xfb, 0x0b, 0xb3, 0x27, 0x53, 0x32, 0xf2, 0x1a, 0x2a, 0x07, 0xd7, 0x21, 0x8f, 0xa4, 0xb0, 0x6b, 0x79, 0x69, 0x4a,
0xc9, 0xb6, 0xd5, 0xc8, 0xd3, 0x88, 0x24, 0x2f, 0x20, 0xdf, 0xe9, 0x1c, 0xd9, 0x3f, 0x45, 0x6d, 0x83, 0xcc, 0x02, 0x86, 0x41, 0x3e, 0x05, 0x38, 0xb8, 0x96, 0x91, 0x7b, 0xc8, 0x95, 0xdb, 0x01,
0x1f, 0x65, 0x68, 0xeb, 0x1c, 0x51, 0x85, 0x22, 0x04, 0x0a, 0x17, 0xee, 0x40, 0xd8, 0x5b, 0xb8, 0x8f, 0x23, 0x21, 0x21, 0x1d, 0x28, 0x1f, 0xbb, 0x5d, 0xe6, 0x0b, 0xbb, 0x8e, 0xba, 0x5b, 0xf7,
0x2f, 0x5c, 0x93, 0x0f, 0xa1, 0x78, 0xe1, 0x86, 0x03, 0x26, 0xed, 0xc7, 0xe8, 0xb3, 0xa1, 0xc8, 0x70, 0xac, 0x26, 0xe8, 0x85, 0x0c, 0x5b, 0xdd, 0xe3, 0x53, 0x26, 0xaf, 0x78, 0x34, 0x3a, 0xe1,
0x2b, 0x28, 0xbd, 0xf3, 0xbd, 0x91, 0x27, 0x85, 0xfd, 0x21, 0xb6, 0x85, 0x27, 0xcb, 0x95, 0x6b, 0x7d, 0x66, 0xaf, 0xea, 0x7b, 0x9c, 0x10, 0x91, 0x67, 0xd0, 0x38, 0xe5, 0xda, 0x79, 0x9e, 0x2f,
0xd0, 0xd9, 0x58, 0xd2, 0x08, 0x4f, 0x5e, 0x42, 0xe1, 0x6c, 0x2c, 0x85, 0x6d, 0xa3, 0xdc, 0xb3, 0x59, 0x64, 0x37, 0x70, 0x33, 0x69, 0x21, 0xc6, 0x95, 0xef, 0xca, 0x01, 0x8f, 0xc6, 0xc2, 0x5e,
0x8c, 0xa4, 0xe2, 0xa3, 0x11, 0x0f, 0xa2, 0x7e, 0x82, 0x02, 0xf5, 0xdf, 0x01, 0x59, 0xac, 0x4d, 0x43, 0xc4, 0x5c, 0xa0, 0x22, 0xe8, 0x82, 0xf5, 0x22, 0x26, 0x85, 0xfd, 0x51, 0x5e, 0x04, 0x69,
0xd5, 0xb2, 0x86, 0x6c, 0x16, 0xb5, 0xac, 0x21, 0x9b, 0xa9, 0xf2, 0x9c, 0xba, 0xfe, 0x24, 0x6a, 0x10, 0x8d, 0xc1, 0xc4, 0x86, 0xca, 0xc5, 0xe5, 0xf8, 0xc2, 0xfb, 0x3d, 0xb3, 0xd7, 0x37, 0xad,
0x1c, 0x9a, 0xf8, 0x26, 0xf7, 0xb5, 0x55, 0x7f, 0x03, 0x1b, 0xe9, 0xb2, 0x79, 0x90, 0xf4, 0x2b, 0xad, 0x22, 0x8d, 0xa7, 0xe4, 0x39, 0x14, 0x2f, 0x2e, 0x0e, 0xed, 0x07, 0xa8, 0xed, 0xe3, 0x0c,
0xa8, 0x26, 0x72, 0xe3, 0x21, 0xa2, 0xce, 0xbf, 0x2d, 0xa8, 0x26, 0x12, 0x18, 0x43, 0x3d, 0x1b, 0x6d, 0x17, 0x87, 0x54, 0xa1, 0x08, 0x81, 0xd2, 0x5b, 0x77, 0x28, 0x6c, 0x82, 0xfb, 0xc2, 0x31,
0x33, 0x23, 0x8c, 0x6b, 0xb2, 0x0f, 0x6b, 0x7b, 0x52, 0x86, 0xaa, 0xcf, 0xaa, 0xd3, 0xfa, 0xd5, 0xf9, 0x09, 0x94, 0xdf, 0xba, 0xd1, 0x90, 0x49, 0xfb, 0xc7, 0x68, 0xb3, 0x99, 0x91, 0x57, 0x50,
0x9d, 0x65, 0xd0, 0x44, 0xb8, 0x4e, 0x54, 0x2d, 0xaa, 0xf2, 0xf4, 0x80, 0x09, 0xe9, 0x05, 0xae, 0x79, 0xe7, 0x7b, 0x63, 0x4f, 0x0a, 0x7b, 0x03, 0xef, 0xd5, 0xe3, 0xe5, 0xca, 0x35, 0xe8, 0x2c,
0x0a, 0x9c, 0x69, 0x8b, 0x49, 0x56, 0xfd, 0x6b, 0x80, 0xb9, 0xd8, 0x83, 0x7c, 0xf8, 0x87, 0x05, 0x94, 0x34, 0xc6, 0x93, 0x17, 0x50, 0x3a, 0x0b, 0xa5, 0xb0, 0x1f, 0x22, 0xef, 0x69, 0x46, 0x50,
0x8f, 0x16, 0x6a, 0x7d, 0xa9, 0x27, 0x47, 0x69, 0x4f, 0x76, 0xef, 0xd9, 0x37, 0x16, 0xfd, 0xf9, 0xf1, 0xf1, 0x98, 0x07, 0x71, 0x6a, 0x45, 0x42, 0xf3, 0x0d, 0xac, 0xa5, 0x83, 0x7e, 0x49, 0xf6,
0x11, 0xbb, 0x3d, 0x85, 0xa2, 0x6e, 0xb0, 0x4b, 0x77, 0x58, 0x87, 0xf2, 0x81, 0x27, 0xdc, 0xae, 0xd8, 0x48, 0x66, 0x8f, 0x5a, 0x22, 0x33, 0x34, 0x5f, 0x41, 0x3d, 0x71, 0xb2, 0x1f, 0x42, 0x75,
0xcf, 0xfa, 0x28, 0x5a, 0xa6, 0x31, 0x8d, 0xdd, 0x1d, 0x77, 0xaf, 0xa3, 0xa7, 0x09, 0x47, 0x57, 0xfe, 0x6e, 0x41, 0x3d, 0x11, 0x7e, 0xe8, 0xa8, 0x9b, 0x90, 0x19, 0x32, 0x8e, 0xc9, 0x2e, 0xac,
0x12, 0xd9, 0x80, 0x5c, 0x3c, 0xf8, 0x73, 0xc7, 0x07, 0x0a, 0xac, 0xa6, 0x96, 0x76, 0xb5, 0x42, 0xec, 0x48, 0x19, 0xa9, 0x82, 0xa1, 0x7c, 0xfd, 0xc5, 0x9d, 0x41, 0xdc, 0x42, 0xb8, 0x0e, 0x33,
0x35, 0xe1, 0xb4, 0xa1, 0xa8, 0x6b, 0x73, 0x01, 0x5f, 0x87, 0x72, 0xdb, 0xf3, 0x19, 0x0e, 0x3f, 0x4d, 0x55, 0x51, 0xb6, 0xcf, 0x84, 0xf4, 0x02, 0x17, 0x33, 0xb6, 0x4e, 0xef, 0x49, 0x51, 0xf3,
0xbd, 0xe7, 0x98, 0x56, 0xee, 0x1d, 0x06, 0x53, 0x63, 0x56, 0x2d, 0x9d, 0xbf, 0x5b, 0x50, 0x89, 0x25, 0xc0, 0x9c, 0xf6, 0x41, 0x36, 0xfc, 0xc5, 0x82, 0x07, 0x0b, 0x37, 0x75, 0xa9, 0x25, 0x87,
0x2b, 0x88, 0xb4, 0xa0, 0x88, 0xfe, 0x45, 0x97, 0x98, 0x17, 0x77, 0x94, 0x5c, 0xf3, 0x3d, 0xa2, 0x69, 0x4b, 0xb6, 0xef, 0x79, 0xeb, 0x17, 0xed, 0xf9, 0x3f, 0x76, 0x7b, 0x0a, 0x65, 0x9d, 0x1e,
0x4d, 0x27, 0xd3, 0xa2, 0xf5, 0xef, 0xa0, 0x9a, 0x60, 0x2f, 0x09, 0xe9, 0x6e, 0x32, 0xa4, 0x99, 0x97, 0xee, 0xb0, 0x09, 0xd5, 0x7d, 0x4f, 0xb8, 0x5d, 0x9f, 0xf5, 0x91, 0x5a, 0xa5, 0xb3, 0x39,
0x2d, 0x48, 0x1b, 0x49, 0x06, 0xfc, 0x00, 0x8a, 0x9a, 0xa9, 0x02, 0x8e, 0x73, 0xdb, 0x04, 0x1c, 0xe6, 0x66, 0xdc, 0xbd, 0xf6, 0x9e, 0x9e, 0x38, 0xfa, 0x1e, 0x90, 0x35, 0x28, 0xcc, 0x3a, 0x98,
0xa7, 0x35, 0x81, 0xc2, 0x91, 0x1b, 0xea, 0x60, 0xe7, 0x29, 0xae, 0x15, 0xaf, 0xc3, 0x2f, 0x25, 0xc2, 0xd1, 0xbe, 0x02, 0xab, 0x22, 0xac, 0x4d, 0xad, 0x51, 0x3d, 0x71, 0x3a, 0x50, 0xd6, 0x37,
0x3a, 0x9c, 0xa7, 0xb8, 0x76, 0xfe, 0x65, 0x41, 0x2d, 0x55, 0xfb, 0xaa, 0xb9, 0x61, 0xcd, 0xb2, 0x6b, 0x01, 0xdf, 0x84, 0x6a, 0xc7, 0xf3, 0x19, 0xd6, 0x72, 0xbd, 0xe7, 0xd9, 0x5c, 0x99, 0x77,
0xd0, 0x28, 0x8c, 0x48, 0x35, 0x5d, 0x4e, 0x98, 0x74, 0xfb, 0xae, 0x74, 0x55, 0x0c, 0x4d, 0x3c, 0x10, 0x4c, 0xcd, 0xb2, 0x6a, 0xe8, 0x50, 0x58, 0x4d, 0x96, 0x29, 0x65, 0x4a, 0xa2, 0x0b, 0xc0,
0x53, 0x3c, 0x25, 0x6d, 0x3a, 0x30, 0x9a, 0x29, 0xd3, 0x88, 0x54, 0xd6, 0xcf, 0x27, 0xbe, 0x6f, 0x31, 0x69, 0x01, 0x24, 0x6a, 0x74, 0x61, 0x69, 0x8d, 0x4e, 0x20, 0x9c, 0x3f, 0x5b, 0x50, 0x9b,
0x17, 0x90, 0x8d, 0x6b, 0x3d, 0x4e, 0x54, 0x7d, 0x9d, 0x4f, 0xc4, 0x95, 0xbd, 0x86, 0x5f, 0x12, 0xdd, 0x29, 0xb2, 0x07, 0x65, 0xf4, 0x59, 0xdc, 0xe1, 0x3d, 0xbf, 0xe3, 0x12, 0xb6, 0xde, 0x23,
0x9c, 0xf9, 0xf7, 0xb7, 0xdc, 0xed, 0xdb, 0xc5, 0xe4, 0x77, 0xc5, 0xc1, 0xdd, 0x9b, 0xfb, 0x94, 0xda, 0xe4, 0x36, 0x4d, 0x6d, 0x7e, 0x0f, 0xf5, 0x84, 0x78, 0xc9, 0x31, 0x6d, 0xa7, 0x2b, 0xf2,
0xb9, 0x77, 0x32, 0xd8, 0xd4, 0xdf, 0x59, 0x18, 0xf1, 0xcc, 0xe9, 0xbd, 0x5a, 0x31, 0x8a, 0x22, 0xa3, 0xbc, 0x45, 0x92, 0x87, 0xb8, 0x0f, 0x65, 0x2d, 0x54, 0x96, 0x63, 0x6b, 0x63, 0x2c, 0xc7,
0x68, 0xf3, 0xb6, 0xac, 0x3e, 0xcb, 0x05, 0x95, 0xf5, 0x16, 0x3c, 0x5e, 0x0a, 0x7d, 0x50, 0xc9, 0x86, 0x86, 0x40, 0xe9, 0xd0, 0x8d, 0xf4, 0x01, 0x16, 0x29, 0x8e, 0x95, 0xec, 0x82, 0x0f, 0x24,
0xfc, 0x1c, 0x1e, 0xcd, 0x6f, 0x8a, 0xd9, 0x77, 0xec, 0x2d, 0x20, 0x49, 0x98, 0xb9, 0x49, 0x3e, 0x3a, 0xb1, 0x48, 0x71, 0xec, 0xfc, 0xd3, 0x82, 0x46, 0x2a, 0x1b, 0xa8, 0x74, 0x87, 0x79, 0x80,
0x81, 0xaa, 0xba, 0x79, 0x67, 0x8b, 0x39, 0xb0, 0xae, 0x01, 0x26, 0x32, 0x04, 0x0a, 0x43, 0x36, 0x45, 0x46, 0x61, 0x3c, 0x55, 0xf5, 0xe6, 0x84, 0x49, 0xb7, 0xef, 0x4a, 0x57, 0x9d, 0x8b, 0x39,
0xd3, 0xb9, 0x5c, 0xa1, 0xb8, 0x76, 0xfe, 0x66, 0xa9, 0x0b, 0xf4, 0x78, 0x22, 0x4f, 0x98, 0x10, 0xa3, 0x94, 0x4c, 0xb1, 0x4d, 0x4e, 0xc6, 0x65, 0xaa, 0x34, 0x9e, 0xe2, 0xf9, 0x4c, 0x7c, 0x1f,
0xee, 0x80, 0x91, 0x37, 0x50, 0x38, 0x0e, 0x3c, 0x89, 0x7a, 0xaa, 0xbb, 0x9f, 0x65, 0x5d, 0xa4, 0x3b, 0xa5, 0x2a, 0xc5, 0xb1, 0x2e, 0x30, 0xea, 0xce, 0x9e, 0x4f, 0xc4, 0xa5, 0xbd, 0x82, 0x5f,
0xc7, 0x13, 0xa9, 0x60, 0x46, 0xea, 0xe8, 0x27, 0x14, 0xa5, 0xd4, 0xa4, 0x39, 0x70, 0xa5, 0x6b, 0x12, 0x92, 0xf9, 0xf7, 0x63, 0xee, 0xf6, 0xed, 0x72, 0xf2, 0xbb, 0x92, 0xa8, 0xfc, 0x79, 0xec,
0x32, 0x39, 0xe3, 0x5e, 0xa1, 0x10, 0x09, 0x41, 0x45, 0xee, 0x97, 0xd4, 0x6b, 0x61, 0x3c, 0x91, 0x05, 0x23, 0xd6, 0xb7, 0x2b, 0xf8, 0xcd, 0xcc, 0x9c, 0xbf, 0x59, 0xd0, 0x30, 0x4d, 0xa8, 0x69,
0xce, 0x73, 0xd8, 0xbc, 0xad, 0x7d, 0x89, 0x6b, 0x5f, 0x42, 0x35, 0xa1, 0x05, 0xeb, 0xf8, 0xac, 0xd6, 0x19, 0xac, 0x6b, 0x1e, 0x8b, 0x62, 0x99, 0x39, 0xd5, 0x57, 0x39, 0x45, 0x2b, 0x86, 0xb6,
0x8d, 0x80, 0x32, 0x55, 0x4b, 0xe5, 0x6b, 0xbc, 0x91, 0x75, 0x6d, 0xc3, 0xf9, 0x00, 0x6a, 0xa8, 0x6e, 0x73, 0xf5, 0x19, 0x2f, 0xa8, 0x6c, 0xee, 0xc1, 0xc3, 0xa5, 0xd0, 0x0f, 0xba, 0x9e, 0x3f,
0x3a, 0x8e, 0xe0, 0x5f, 0x73, 0x50, 0x8a, 0x54, 0xbc, 0x4c, 0xf9, 0xfd, 0x34, 0xcb, 0xef, 0x45, 0x83, 0x07, 0xf3, 0xf6, 0x3a, 0xfb, 0x61, 0xb2, 0x01, 0x24, 0x09, 0x33, 0xed, 0xf7, 0x63, 0xa8,
0x97, 0xbf, 0x82, 0x42, 0x5c, 0x0b, 0x99, 0x43, 0xb9, 0xdd, 0x4f, 0x88, 0x61, 0x99, 0xfc, 0x16, 0xab, 0xe7, 0x4a, 0x36, 0xcd, 0x81, 0x55, 0x0d, 0x30, 0x9e, 0x21, 0x50, 0x1a, 0xb1, 0x1b, 0x1d,
0x8a, 0x94, 0x09, 0x75, 0x81, 0xc8, 0xaf, 0x9a, 0xca, 0x1a, 0x33, 0x17, 0x36, 0x42, 0x4a, 0xbc, 0xe3, 0x35, 0x8a, 0x63, 0xe7, 0x4f, 0x96, 0x7a, 0x75, 0x84, 0x13, 0x79, 0xc2, 0x84, 0x70, 0x87,
0xe3, 0x0d, 0x02, 0x57, 0x57, 0x53, 0xa6, 0xb8, 0xc6, 0x24, 0xc4, 0x35, 0x63, 0x1e, 0xee, 0x1f, 0xaa, 0xe7, 0x2d, 0x1d, 0x05, 0x9e, 0x34, 0x5d, 0xde, 0x67, 0x39, 0x5d, 0x9e, 0x82, 0x19, 0xd6,
0x2c, 0xa8, 0xae, 0x0c, 0xf5, 0xea, 0xb7, 0xce, 0xc2, 0xfb, 0x2b, 0xff, 0x7f, 0xbe, 0xbf, 0xfe, 0xe1, 0x8f, 0x28, 0xb2, 0x54, 0x4d, 0xda, 0x77, 0xa5, 0x6b, 0x22, 0x3c, 0xa3, 0x03, 0x51, 0x88,
0x63, 0xa5, 0x15, 0x61, 0xe1, 0xab, 0x7a, 0x1a, 0x73, 0x2f, 0x90, 0x26, 0x65, 0x13, 0x1c, 0xb5, 0x04, 0x51, 0x4d, 0x77, 0x2b, 0xea, 0x89, 0x15, 0x4e, 0xa4, 0xf3, 0x0c, 0xd6, 0x6f, 0x6b, 0x5f,
0xd1, 0xd6, 0xa8, 0x6f, 0x86, 0x80, 0x5a, 0xce, 0x9b, 0x79, 0xde, 0x34, 0x73, 0x95, 0x04, 0xef, 0x62, 0xda, 0xd7, 0x50, 0x4f, 0x68, 0xc1, 0x9c, 0x71, 0xd6, 0x41, 0x40, 0x95, 0xaa, 0xa1, 0xb2,
0x04, 0x0b, 0x31, 0x44, 0x15, 0x8a, 0x6b, 0x75, 0xbd, 0x3a, 0xe5, 0xc8, 0xd5, 0xcd, 0xc6, 0x50, 0x75, 0xb6, 0x91, 0x55, 0xbd, 0x86, 0xf3, 0x11, 0x34, 0x50, 0xf5, 0xcc, 0x83, 0x7f, 0x28, 0x40,
0xa8, 0xef, 0x5a, 0x77, 0x18, 0xa5, 0xef, 0x1a, 0xa7, 0xd2, 0x29, 0x57, 0xbc, 0x12, 0x02, 0x35, 0x25, 0x56, 0xf1, 0x22, 0x65, 0xf7, 0x93, 0x2c, 0xbb, 0x17, 0x4d, 0xfe, 0x05, 0x94, 0x66, 0x77,
0xa1, 0x70, 0x17, 0x72, 0x66, 0x97, 0x75, 0xaa, 0x5d, 0xc8, 0x99, 0x1a, 0x30, 0x94, 0xfb, 0x7e, 0x24, 0xb3, 0x7c, 0x77, 0xfa, 0x09, 0x1a, 0x5e, 0x9f, 0x5f, 0x41, 0x99, 0x32, 0xa1, 0x5a, 0x8d,
0xd7, 0xed, 0x0d, 0xed, 0x8a, 0x9e, 0x6c, 0x11, 0xed, 0xec, 0x41, 0x25, 0x3e, 0x7a, 0x35, 0x99, 0x62, 0x5e, 0xfd, 0xd6, 0x98, 0x39, 0xd9, 0x90, 0x14, 0xfd, 0xc2, 0x1b, 0x06, 0xae, 0x6f, 0xde,
0xda, 0x7d, 0x0c, 0x6d, 0x8d, 0xe6, 0xda, 0xfd, 0x28, 0x6b, 0x73, 0x8b, 0x59, 0x9b, 0x4f, 0x64, 0x23, 0x19, 0x74, 0x8d, 0x49, 0xd0, 0xb5, 0x60, 0xee, 0xee, 0x3f, 0x5a, 0x50, 0xcf, 0x75, 0x75,
0xed, 0x4b, 0xa8, 0xa5, 0x92, 0x40, 0x81, 0x28, 0xbf, 0x16, 0x46, 0x11, 0xae, 0x15, 0xaf, 0xc5, 0xfe, 0x03, 0x71, 0xe1, 0xd1, 0x5a, 0xfc, 0x1f, 0x1f, 0xad, 0xff, 0xb2, 0xd2, 0x8a, 0x30, 0x21,
0x7d, 0xfd, 0x60, 0xac, 0x51, 0x5c, 0x3b, 0xcf, 0xa0, 0x96, 0x3a, 0xfe, 0x65, 0x53, 0xc2, 0x79, 0xa8, 0xfb, 0x14, 0x72, 0x2f, 0x90, 0x26, 0x64, 0x13, 0x12, 0xb5, 0xd1, 0xbd, 0x71, 0xdf, 0x14,
0x0a, 0xb5, 0x8e, 0x74, 0xe5, 0x64, 0xc5, 0x0b, 0xff, 0xbf, 0x16, 0x6c, 0x44, 0x18, 0xd3, 0x49, 0x1c, 0x35, 0x9c, 0x17, 0x8e, 0xa2, 0x29, 0x1c, 0x2a, 0x08, 0xde, 0x09, 0x16, 0xa1, 0x8b, 0x6a,
0x7e, 0x0d, 0xe5, 0x29, 0x0b, 0x25, 0xbb, 0x89, 0x27, 0xa3, 0xdd, 0x1c, 0xf1, 0xee, 0xac, 0x19, 0x14, 0xc7, 0x2a, 0x91, 0x9c, 0x72, 0x94, 0xea, 0x24, 0x64, 0x66, 0xa8, 0xef, 0x4a, 0x67, 0x1e,
0xfd, 0xc7, 0xa0, 0x4e, 0xfb, 0x3d, 0x22, 0x68, 0x8c, 0x24, 0xdf, 0x40, 0x59, 0xa0, 0x1e, 0x16, 0xa5, 0xef, 0x0a, 0x2b, 0xe0, 0x29, 0x57, 0x32, 0x9d, 0x71, 0xf4, 0x44, 0xe1, 0xde, 0xca, 0x1b,
0xdd, 0x53, 0x3e, 0xcd, 0x92, 0x32, 0xf6, 0x62, 0x3c, 0xd9, 0x81, 0x82, 0xcf, 0x07, 0x02, 0x4f, 0xec, 0xc0, 0xab, 0x54, 0x0d, 0x55, 0x31, 0xa3, 0xdc, 0xf7, 0xbb, 0x6e, 0x6f, 0x64, 0xd7, 0x74,
0xb7, 0xba, 0xfb, 0x71, 0x96, 0xdc, 0x5b, 0x3e, 0xa0, 0x08, 0x24, 0xaf, 0xa1, 0x7c, 0xed, 0x86, 0x15, 0x8d, 0xe7, 0xce, 0x0e, 0xd4, 0x66, 0x47, 0xaf, 0xaa, 0x60, 0xa7, 0x8f, 0xae, 0x6d, 0xd0,
0x81, 0x17, 0x0c, 0xa2, 0x97, 0xe8, 0x93, 0x2c, 0xa1, 0xef, 0x34, 0x8e, 0xc6, 0x02, 0x4e, 0x4d, 0x42, 0xa7, 0x1f, 0x47, 0x6d, 0x61, 0x31, 0x6a, 0x8b, 0x89, 0xa8, 0x7d, 0x01, 0x8d, 0x54, 0x10,
0x15, 0xc5, 0x25, 0x37, 0x31, 0x71, 0x7e, 0xaf, 0x72, 0x53, 0x91, 0xc6, 0xfd, 0x63, 0xa8, 0xe9, 0x28, 0x10, 0xe5, 0x57, 0xc2, 0x28, 0xc2, 0xb1, 0x92, 0xed, 0x71, 0x5f, 0xbf, 0xb2, 0x1b, 0x14,
0xfc, 0x7e, 0xcf, 0x42, 0xa1, 0x6e, 0x7d, 0xd6, 0xaa, 0x1a, 0xdc, 0x4f, 0x42, 0x69, 0x5a, 0xd2, 0xc7, 0xce, 0x53, 0x68, 0xa4, 0x8e, 0x7f, 0x59, 0xf5, 0x70, 0x9e, 0x40, 0xe3, 0x42, 0xba, 0x72,
0xf9, 0xde, 0x8c, 0xaf, 0x88, 0xa1, 0xc6, 0xe7, 0xd8, 0xed, 0x0d, 0xdd, 0x41, 0x74, 0x4e, 0x11, 0x92, 0xf3, 0xb7, 0xc8, 0xbf, 0x2d, 0x58, 0x8b, 0x31, 0x26, 0x93, 0x7c, 0x03, 0xd5, 0x29, 0x8b,
0xa9, 0xbe, 0x4c, 0x8d, 0x3d, 0x5d, 0x86, 0x11, 0xa9, 0x32, 0x30, 0x64, 0x53, 0x4f, 0xcc, 0x2f, 0x24, 0xbb, 0x9e, 0x55, 0x4c, 0xbb, 0x35, 0xe6, 0xdd, 0x9b, 0x56, 0xfc, 0x4f, 0x8c, 0x3a, 0xed,
0xa0, 0x31, 0xbd, 0xfb, 0xcf, 0x22, 0x40, 0x2b, 0xde, 0x0f, 0x39, 0x87, 0x35, 0xb4, 0x47, 0x9c, 0xf7, 0x88, 0xa0, 0x33, 0x24, 0xf9, 0x16, 0xaa, 0x02, 0xf5, 0xb0, 0xb8, 0x27, 0xfa, 0x34, 0x8b,
0x95, 0xc3, 0x10, 0xfd, 0xae, 0x3f, 0xbb, 0xc7, 0xc0, 0x24, 0xef, 0xa0, 0xa8, 0x4f, 0x8b, 0x64, 0x65, 0xd6, 0x9b, 0xe1, 0x49, 0x1b, 0x4a, 0x3e, 0x1f, 0x0a, 0x3c, 0xdd, 0xfa, 0xf6, 0x27, 0x59,
0xf5, 0xa0, 0x64, 0x7e, 0xd5, 0x9f, 0xaf, 0x06, 0x69, 0xa5, 0x9f, 0x5b, 0x84, 0x9a, 0x0e, 0x45, 0xbc, 0x63, 0x3e, 0xa4, 0x08, 0x24, 0xaf, 0xa1, 0x7a, 0xe5, 0x46, 0x81, 0x17, 0x0c, 0xe3, 0x67,
0x9c, 0x15, 0x23, 0xc8, 0x64, 0x76, 0xd6, 0x46, 0x53, 0xdd, 0xbe, 0x61, 0x91, 0x6f, 0xa1, 0xa8, 0xe4, 0xe3, 0x2c, 0xd2, 0xf7, 0x1a, 0x47, 0x67, 0x04, 0xa7, 0xa1, 0x2e, 0xc5, 0x80, 0x1b, 0x9f,
0x7b, 0x0c, 0xf9, 0xd9, 0x72, 0x81, 0x48, 0xdf, 0xea, 0xcf, 0x0d, 0xeb, 0x73, 0x8b, 0x9c, 0x40, 0x38, 0xbf, 0x56, 0xb1, 0xa9, 0xa6, 0xc6, 0xfc, 0x23, 0x68, 0xe8, 0xf8, 0x7e, 0xcf, 0x22, 0xa1,
0x41, 0x0d, 0x57, 0x92, 0x31, 0x29, 0x12, 0x93, 0xb9, 0xee, 0xac, 0x82, 0x98, 0x28, 0x7e, 0x0f, 0xfa, 0x0d, 0x2b, 0xef, 0x0e, 0xee, 0x26, 0xa1, 0x34, 0xcd, 0x74, 0x7e, 0x30, 0xe5, 0x2b, 0x16,
0x30, 0x1f, 0xf1, 0x24, 0xe3, 0xdd, 0xbf, 0x70, 0x57, 0xa8, 0x37, 0xee, 0x06, 0x1a, 0x03, 0x27, 0xa8, 0xb2, 0x1a, 0xba, 0xbd, 0x91, 0x3b, 0x8c, 0xcf, 0x29, 0x9e, 0xaa, 0x2f, 0x53, 0xb3, 0x9e,
0x6a, 0xbe, 0x5d, 0x72, 0x92, 0x39, 0xd9, 0xe2, 0x74, 0xaf, 0x3b, 0xab, 0x20, 0x46, 0xdd, 0x15, 0xbe, 0x86, 0xf1, 0x54, 0x45, 0x60, 0xc4, 0xa6, 0x9e, 0x98, 0x37, 0xbb, 0xb3, 0xf9, 0xf6, 0x5f,
0xd4, 0x52, 0x7f, 0xfb, 0x91, 0x5f, 0x66, 0x3b, 0x79, 0xfb, 0x5f, 0xc4, 0xfa, 0x8b, 0x7b, 0x61, 0xcb, 0x00, 0x7b, 0xb3, 0xfd, 0x90, 0x73, 0x58, 0xc1, 0xf5, 0x88, 0x93, 0x5b, 0x0c, 0xd1, 0xee,
0x8d, 0x25, 0x99, 0xbc, 0x23, 0x99, 0xcf, 0xa4, 0x79, 0x97, 0xdf, 0xe9, 0xbf, 0xf0, 0xea, 0x3b, 0xe6, 0xd3, 0x7b, 0x14, 0x4c, 0xf2, 0x0e, 0xca, 0xfa, 0xb4, 0x48, 0x56, 0x0e, 0x4a, 0xc6, 0x57,
0xf7, 0xc6, 0x6b, 0xab, 0xfb, 0x85, 0x3f, 0xe4, 0xc6, 0xdd, 0x6e, 0x11, 0xff, 0x0d, 0xfd, 0xf2, 0xf3, 0x59, 0x3e, 0x48, 0x2b, 0xfd, 0xd2, 0x22, 0xd4, 0x64, 0x28, 0xe2, 0xe4, 0x94, 0x20, 0x13,
0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x41, 0x5d, 0x93, 0xf2, 0x74, 0x15, 0x00, 0x00, 0xd9, 0x59, 0x1b, 0x4d, 0x65, 0xfb, 0x2d, 0x8b, 0x7c, 0x07, 0x65, 0x9d, 0x63, 0xc8, 0x4f, 0x97,
0x13, 0x62, 0x7d, 0xf9, 0x9f, 0xb7, 0xac, 0x2f, 0x2d, 0x72, 0x02, 0x25, 0x55, 0x5c, 0x49, 0x46,
0xa5, 0x48, 0x54, 0xe6, 0xa6, 0x93, 0x07, 0x31, 0x5e, 0xfc, 0x01, 0x60, 0x5e, 0xe2, 0x49, 0xc6,
0x3f, 0x04, 0x0b, 0xbd, 0x42, 0x73, 0xeb, 0x6e, 0xa0, 0x59, 0xe0, 0x44, 0xd5, 0xb7, 0x01, 0x27,
0x99, 0x95, 0x6d, 0x16, 0xee, 0x4d, 0x27, 0x0f, 0x62, 0xd4, 0x5d, 0x42, 0x23, 0xf5, 0x5f, 0x29,
0xf9, 0x3c, 0xdb, 0xc8, 0xdb, 0x7f, 0xbd, 0x36, 0x9f, 0xdf, 0x0b, 0x6b, 0x56, 0x92, 0xc9, 0x1e,
0xc9, 0x7c, 0x26, 0xad, 0xbb, 0xec, 0x4e, 0xff, 0xef, 0xd9, 0x6c, 0xdf, 0x1b, 0xaf, 0x57, 0xdd,
0x2d, 0xfd, 0xa6, 0x10, 0x76, 0xbb, 0x65, 0xfc, 0x0b, 0xf9, 0xeb, 0xff, 0x06, 0x00, 0x00, 0xff,
0xff, 0x6f, 0xa9, 0xd4, 0x1e, 0xd7, 0x16, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

View File

@@ -3,6 +3,7 @@ syntax = "proto3";
package buildx.controller.v1; package buildx.controller.v1;
import "github.com/moby/buildkit/api/services/control/control.proto"; import "github.com/moby/buildkit/api/services/control/control.proto";
import "github.com/moby/buildkit/solver/pb/ops.proto";
option go_package = "pb"; option go_package = "pb";
@@ -44,32 +45,39 @@ message BuildRequest {
BuildOptions Options = 2; BuildOptions Options = 2;
} }
message BuildOptions { message Inputs {
string ContextPath = 1; string ContextPath = 1;
string DockerfileName = 2; string DockerfileName = 2;
string PrintFunc = 3; string DockerfileInline = 3;
map<string, string> NamedContexts = 4; pb.Definition ContextDefinition = 4;
map<string, NamedContext> NamedContexts = 5;
// io.Reader InStream = ???;
}
repeated string Allow = 5; message BuildOptions {
repeated Attest Attests = 6; Inputs inputs = 1;
map<string, string> BuildArgs = 7; string PrintFunc = 2;
repeated CacheOptionsEntry CacheFrom = 8;
repeated CacheOptionsEntry CacheTo = 9;
string CgroupParent = 10;
repeated ExportEntry Exports = 11;
repeated string ExtraHosts = 12;
map<string, string> Labels = 13;
string NetworkMode = 14;
repeated string NoCacheFilter = 15;
repeated string Platforms = 16;
repeated Secret Secrets = 17;
int64 ShmSize = 18;
repeated SSH SSH = 19;
repeated string Tags = 20;
string Target = 21;
UlimitOpt Ulimits = 22;
CommonOptions Opts = 24; repeated string Allow = 3;
repeated Attest Attests = 4;
map<string, string> BuildArgs = 5;
repeated CacheOptionsEntry CacheFrom = 6;
repeated CacheOptionsEntry CacheTo = 7;
string CgroupParent = 8;
repeated ExportEntry Exports = 9;
repeated string ExtraHosts = 10;
map<string, string> Labels = 11;
string NetworkMode = 12;
repeated string NoCacheFilter = 13;
repeated string Platforms = 14;
repeated Secret Secrets = 15;
int64 ShmSize = 16;
repeated SSH SSH = 17;
repeated string Tags = 18;
string Target = 19;
UlimitOpt Ulimits = 20;
CommonOptions Opts = 21;
} }
message ExportEntry { message ExportEntry {
@@ -100,6 +108,11 @@ message Secret {
string Env = 3; string Env = 3;
} }
message NamedContext {
string Path = 1;
pb.Definition Definition = 2;
}
message UlimitOpt { message UlimitOpt {
map<string, Ulimit> values = 1; map<string, Ulimit> values = 1;
} }
@@ -118,6 +131,11 @@ message CommonOptions {
bool Pull = 4; bool Pull = 4;
bool ExportPush = 5; bool ExportPush = 5;
bool ExportLoad = 6; bool ExportLoad = 6;
// TODO: we should remove Linked from the controllerapi, it's only used to
// produce a single warning. To allow this, we need to move the default
// export detection out from the controller server, as well as load the
// driver on the controller client.
bool Linked = 7;
} }
message BuildResponse { message BuildResponse {

View File

@@ -3,15 +3,16 @@ package buildflags
import ( import (
"strings" "strings"
controllerapi "github.com/docker/buildx/controller/pb"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
func ParseContextNames(values []string) (map[string]string, error) { func ParseContextNames(values []string) (map[string]*controllerapi.NamedContext, error) {
if len(values) == 0 { if len(values) == 0 {
return nil, nil return nil, nil
} }
result := make(map[string]string, len(values)) result := make(map[string]*controllerapi.NamedContext, len(values))
for _, value := range values { for _, value := range values {
kv := strings.SplitN(value, "=", 2) kv := strings.SplitN(value, "=", 2)
if len(kv) != 2 { if len(kv) != 2 {
@@ -22,7 +23,7 @@ func ParseContextNames(values []string) (map[string]string, error) {
return nil, errors.Wrapf(err, "invalid context name %s", kv[0]) return nil, errors.Wrapf(err, "invalid context name %s", kv[0])
} }
name := strings.TrimSuffix(reference.FamiliarString(named), ":latest") name := strings.TrimSuffix(reference.FamiliarString(named), ":latest")
result[name] = kv[1] result[name] = &controllerapi.NamedContext{Path: kv[1]}
} }
return result, nil return result, nil
} }