controller: strongly type the controller api

Strongly typing the API allows us to perform all command line parsing
fully on the client-side, where we have access to the client local
directory and all the client environment variables, which may not be
available on the remote server.

Additionally, the controller api starts to look a lot like
build.Options, so at some point in the future there may be an
oppportunity to merge the two, which would allow both build and bake to
execute through the controller, instead of needing to maintain multiple
code paths.

Signed-off-by: Justin Chadwell <me@jedevc.com>
This commit is contained in:
Justin Chadwell 2023-02-09 12:03:58 +00:00
parent c4ad930e2a
commit 90d7fb5e77
15 changed files with 842 additions and 470 deletions

View File

@ -14,6 +14,7 @@ import (
"github.com/docker/buildx/bake/hclparser"
"github.com/docker/buildx/build"
controllerapi "github.com/docker/buildx/controller/pb"
"github.com/docker/buildx/util/buildflags"
"github.com/docker/buildx/util/platformutil"
"github.com/docker/cli/cli/config"
@ -978,17 +979,24 @@ func toBuildOpt(t *Target, inp *Input) (*build.Options, error) {
if err != nil {
return nil, err
}
bo.Session = append(bo.Session, secrets)
sshSpecs := t.SSH
if len(sshSpecs) == 0 && buildflags.IsGitSSH(contextPath) {
sshSpecs = []string{"default"}
}
ssh, err := buildflags.ParseSSHSpecs(sshSpecs)
secretAttachment, err := controllerapi.CreateSecrets(secrets)
if err != nil {
return nil, err
}
bo.Session = append(bo.Session, ssh)
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 {
bo.Target = *t.Target
@ -998,19 +1006,22 @@ func toBuildOpt(t *Target, inp *Input) (*build.Options, error) {
if err != nil {
return nil, err
}
bo.CacheFrom = cacheImports
bo.CacheFrom = controllerapi.CreateCaches(cacheImports)
cacheExports, err := buildflags.ParseCacheEntry(t.CacheTo)
if err != nil {
return nil, err
}
bo.CacheTo = cacheExports
bo.CacheTo = controllerapi.CreateCaches(cacheExports)
outputs, err := buildflags.ParseOutputs(t.Outputs)
outputs, err := buildflags.ParseExports(t.Outputs)
if err != nil {
return nil, err
}
bo.Exports, err = controllerapi.CreateExports(outputs)
if err != nil {
return nil, err
}
bo.Exports = outputs
attests, err := buildflags.ParseAttests(t.Attest)
if err != nil {

View File

@ -84,12 +84,13 @@ type Options struct {
NoCacheFilter []string
Platforms []specs.Platform
Pull bool
Session []session.Attachable
ShmSize opts.MemBytes
Tags []string
Target string
Ulimits *opts.UlimitOpt
Session []session.Attachable
// Linked marks this target as exclusively linked (not requested by the user).
Linked bool
PrintFunc *PrintFunc

View File

@ -19,6 +19,7 @@ import (
"github.com/docker/buildx/monitor"
"github.com/docker/buildx/store"
"github.com/docker/buildx/store/storeutil"
"github.com/docker/buildx/util/buildflags"
"github.com/docker/buildx/util/ioset"
"github.com/docker/buildx/util/tracing"
"github.com/docker/cli-docs-tool/annotation"
@ -26,7 +27,6 @@ import (
"github.com/docker/cli/cli/command"
dockeropts "github.com/docker/cli/opts"
"github.com/docker/docker/pkg/ioutils"
"github.com/docker/go-units"
"github.com/moby/buildkit/util/appcontext"
"github.com/moby/buildkit/util/grpcerrors"
"github.com/pkg/errors"
@ -37,12 +37,93 @@ import (
)
type buildOptions struct {
progress string
allow []string
attests []string
buildArgs []string
cacheFrom []string
cacheTo []string
cgroupParent string
contextPath string
contexts []string
dockerfileName string
extraHosts []string
imageIDFile string
labels []string
networkMode string
noCacheFilter []string
outputs []string
platforms []string
printFunc string
quiet bool
secrets []string
shmSize dockeropts.MemBytes
ssh []string
tags []string
target string
ulimits *dockeropts.UlimitOpt
invoke string
controllerapi.BuildOptions
progress string
controllerapi.CommonOptions
control.ControlOptions
}
func (o *buildOptions) toControllerOptions() (controllerapi.BuildOptions, error) {
var err error
opts := controllerapi.BuildOptions{
Allow: o.allow,
Attests: o.attests,
BuildArgs: listToMap(o.buildArgs, true),
CgroupParent: o.cgroupParent,
ContextPath: o.contextPath,
DockerfileName: o.dockerfileName,
ExtraHosts: o.extraHosts,
ImageIDFile: o.imageIDFile,
Labels: listToMap(o.labels, false),
NetworkMode: o.networkMode,
NoCacheFilter: o.noCacheFilter,
Platforms: o.platforms,
PrintFunc: o.printFunc,
Quiet: o.quiet,
ShmSize: int64(o.shmSize),
Tags: o.tags,
Target: o.target,
Ulimits: dockerUlimitToControllerUlimit(o.ulimits),
Opts: &o.CommonOptions,
}
opts.NamedContexts, err = buildflags.ParseContextNames(o.contexts)
if err != nil {
return controllerapi.BuildOptions{}, err
}
opts.Exports, err = buildflags.ParseExports(o.outputs)
if err != nil {
return controllerapi.BuildOptions{}, err
}
opts.CacheFrom, err = buildflags.ParseCacheEntry(o.cacheFrom)
if err != nil {
return controllerapi.BuildOptions{}, err
}
opts.CacheTo, err = buildflags.ParseCacheEntry(o.cacheTo)
if err != nil {
return controllerapi.BuildOptions{}, err
}
opts.Secrets, err = buildflags.ParseSecretSpecs(o.secrets)
if err != nil {
return controllerapi.BuildOptions{}, err
}
opts.SSH, err = buildflags.ParseSSHSpecs(o.ssh)
if err != nil {
return controllerapi.BuildOptions{}, err
}
return opts, nil
}
func runBuild(dockerCli command.Cli, in buildOptions) error {
ctx := appcontext.Context()
@ -54,12 +135,16 @@ func runBuild(dockerCli command.Cli, in buildOptions) error {
end(err)
}()
_, err = cbuild.RunBuild(ctx, dockerCli, in.BuildOptions, os.Stdin, in.progress, nil)
opts, err := in.toControllerOptions()
if err != nil {
return err
}
_, err = cbuild.RunBuild(ctx, dockerCli, opts, os.Stdin, in.progress, nil)
return err
}
func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
options := newBuildOptions()
options := buildOptions{}
cFlags := &commonFlags{}
cmd := &cobra.Command{
@ -68,16 +153,16 @@ func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
Short: "Start a build",
Args: cli.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
options.ContextPath = args[0]
options.Opts.Builder = rootOpts.builder
options.Opts.MetadataFile = cFlags.metadataFile
options.Opts.NoCache = false
options.contextPath = args[0]
options.Builder = rootOpts.builder
options.MetadataFile = cFlags.metadataFile
options.NoCache = false
if cFlags.noCache != nil {
options.Opts.NoCache = *cFlags.noCache
options.NoCache = *cFlags.noCache
}
options.Opts.Pull = false
options.Pull = false
if cFlags.pull != nil {
options.Opts.Pull = *cFlags.pull
options.Pull = *cFlags.pull
}
options.progress = cFlags.progress
cmd.Flags().VisitAll(checkWarnedFlags)
@ -95,64 +180,65 @@ func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
flags := cmd.Flags()
flags.StringSliceVar(&options.ExtraHosts, "add-host", []string{}, `Add a custom host-to-IP mapping (format: "host:ip")`)
flags.StringSliceVar(&options.extraHosts, "add-host", []string{}, `Add a custom host-to-IP mapping (format: "host:ip")`)
flags.SetAnnotation("add-host", annotation.ExternalURL, []string{"https://docs.docker.com/engine/reference/commandline/build/#add-host"})
flags.StringSliceVar(&options.Allow, "allow", []string{}, `Allow extra privileged entitlement (e.g., "network.host", "security.insecure")`)
flags.StringSliceVar(&options.allow, "allow", []string{}, `Allow extra privileged entitlement (e.g., "network.host", "security.insecure")`)
flags.StringArrayVar(&options.BuildArgs, "build-arg", []string{}, "Set build-time variables")
flags.StringArrayVar(&options.buildArgs, "build-arg", []string{}, "Set build-time variables")
flags.StringArrayVar(&options.CacheFrom, "cache-from", []string{}, `External cache sources (e.g., "user/app:cache", "type=local,src=path/to/dir")`)
flags.StringArrayVar(&options.cacheFrom, "cache-from", []string{}, `External cache sources (e.g., "user/app:cache", "type=local,src=path/to/dir")`)
flags.StringArrayVar(&options.CacheTo, "cache-to", []string{}, `Cache export destinations (e.g., "user/app:cache", "type=local,dest=path/to/dir")`)
flags.StringArrayVar(&options.cacheTo, "cache-to", []string{}, `Cache export destinations (e.g., "user/app:cache", "type=local,dest=path/to/dir")`)
flags.StringVar(&options.CgroupParent, "cgroup-parent", "", "Optional parent cgroup for the container")
flags.StringVar(&options.cgroupParent, "cgroup-parent", "", "Optional parent cgroup for the container")
flags.SetAnnotation("cgroup-parent", annotation.ExternalURL, []string{"https://docs.docker.com/engine/reference/commandline/build/#cgroup-parent"})
flags.StringArrayVar(&options.Contexts, "build-context", []string{}, "Additional build contexts (e.g., name=path)")
flags.StringArrayVar(&options.contexts, "build-context", []string{}, "Additional build contexts (e.g., name=path)")
flags.StringVarP(&options.DockerfileName, "file", "f", "", `Name of the Dockerfile (default: "PATH/Dockerfile")`)
flags.StringVarP(&options.dockerfileName, "file", "f", "", `Name of the Dockerfile (default: "PATH/Dockerfile")`)
flags.SetAnnotation("file", annotation.ExternalURL, []string{"https://docs.docker.com/engine/reference/commandline/build/#file"})
flags.StringVar(&options.ImageIDFile, "iidfile", "", "Write the image ID to the file")
flags.StringVar(&options.imageIDFile, "iidfile", "", "Write the image ID to the file")
flags.StringArrayVar(&options.Labels, "label", []string{}, "Set metadata for an image")
flags.StringArrayVar(&options.labels, "label", []string{}, "Set metadata for an image")
flags.BoolVar(&options.Opts.ExportLoad, "load", false, `Shorthand for "--output=type=docker"`)
flags.BoolVar(&options.ExportLoad, "load", false, `Shorthand for "--output=type=docker"`)
flags.StringVar(&options.NetworkMode, "network", "default", `Set the networking mode for the "RUN" instructions during build`)
flags.StringVar(&options.networkMode, "network", "default", `Set the networking mode for the "RUN" instructions during build`)
flags.StringArrayVar(&options.NoCacheFilter, "no-cache-filter", []string{}, "Do not cache specified stages")
flags.StringArrayVar(&options.noCacheFilter, "no-cache-filter", []string{}, "Do not cache specified stages")
flags.StringArrayVarP(&options.Outputs, "output", "o", []string{}, `Output destination (format: "type=local,dest=path")`)
flags.StringArrayVarP(&options.outputs, "output", "o", []string{}, `Output destination (format: "type=local,dest=path")`)
flags.StringArrayVar(&options.Platforms, "platform", platformsDefault, "Set target platform for build")
flags.StringArrayVar(&options.platforms, "platform", platformsDefault, "Set target platform for build")
if isExperimental() {
flags.StringVar(&options.PrintFunc, "print", "", "Print result of information request (e.g., outline, targets) [experimental]")
flags.StringVar(&options.printFunc, "print", "", "Print result of information request (e.g., outline, targets) [experimental]")
}
flags.BoolVar(&options.Opts.ExportPush, "push", false, `Shorthand for "--output=type=registry"`)
flags.BoolVar(&options.ExportPush, "push", false, `Shorthand for "--output=type=registry"`)
flags.BoolVarP(&options.Quiet, "quiet", "q", false, "Suppress the build output and print image ID on success")
flags.BoolVarP(&options.quiet, "quiet", "q", false, "Suppress the build output and print image ID on success")
flags.StringArrayVar(&options.Secrets, "secret", []string{}, `Secret to expose to the build (format: "id=mysecret[,src=/local/secret]")`)
flags.StringArrayVar(&options.secrets, "secret", []string{}, `Secret to expose to the build (format: "id=mysecret[,src=/local/secret]")`)
flags.Var(newShmSize(&options), "shm-size", `Size of "/dev/shm"`)
flags.Var(&options.shmSize, "shm-size", `Size of "/dev/shm"`)
flags.StringArrayVar(&options.SSH, "ssh", []string{}, `SSH agent socket or keys to expose to the build (format: "default|<id>[=<socket>|<key>[,<key>]]")`)
flags.StringArrayVar(&options.ssh, "ssh", []string{}, `SSH agent socket or keys to expose to the build (format: "default|<id>[=<socket>|<key>[,<key>]]")`)
flags.StringArrayVarP(&options.Tags, "tag", "t", []string{}, `Name and optionally a tag (format: "name:tag")`)
flags.StringArrayVarP(&options.tags, "tag", "t", []string{}, `Name and optionally a tag (format: "name:tag")`)
flags.SetAnnotation("tag", annotation.ExternalURL, []string{"https://docs.docker.com/engine/reference/commandline/build/#tag"})
flags.StringVar(&options.Target, "target", "", "Set the target build stage to build")
flags.StringVar(&options.target, "target", "", "Set the target build stage to build")
flags.SetAnnotation("target", annotation.ExternalURL, []string{"https://docs.docker.com/engine/reference/commandline/build/#target"})
flags.Var(newUlimits(&options), "ulimit", "Ulimit options")
options.ulimits = dockeropts.NewUlimitOpt(nil)
flags.Var(options.ulimits, "ulimit", "Ulimit options")
flags.StringArrayVar(&options.Attests, "attest", []string{}, `Attestation parameters (format: "type=sbom,generator=image")`)
flags.StringVar(&options.Opts.SBOM, "sbom", "", `Shorthand for "--attest=type=sbom"`)
flags.StringVar(&options.Opts.Provenance, "provenance", "", `Shortand for "--attest=type=provenance"`)
flags.StringArrayVar(&options.attests, "attest", []string{}, `Attestation parameters (format: "type=sbom,generator=image")`)
flags.StringVar(&options.SBOM, "sbom", "", `Shorthand for "--attest=type=sbom"`)
flags.StringVar(&options.Provenance, "provenance", "", `Shortand for "--attest=type=provenance"`)
if isExperimental() {
flags.StringVar(&options.invoke, "invoke", "", "Invoke a command after the build [experimental]")
@ -317,12 +403,12 @@ func updateLastActivity(dockerCli command.Cli, ng *store.NodeGroup) error {
func launchControllerAndRunBuild(dockerCli command.Cli, options buildOptions) error {
ctx := context.TODO()
if options.Quiet && options.progress != "auto" && options.progress != "quiet" {
if options.quiet && options.progress != "auto" && options.progress != "quiet" {
return errors.Errorf("progress=%s and quiet cannot be used together", options.progress)
} else if options.Quiet {
} else if options.quiet {
options.progress = "quiet"
}
if options.invoke != "" && (options.DockerfileName == "-" || options.ContextPath == "-") {
if options.invoke != "" && (options.dockerfileName == "-" || options.contextPath == "-") {
// stdin must be usable for monitor
return errors.Errorf("Dockerfile or context from stdin is not supported with invoke")
}
@ -355,7 +441,11 @@ func launchControllerAndRunBuild(dockerCli command.Cli, options buildOptions) er
f.SetReader(os.Stdin)
// Start build
ref, err := c.Build(ctx, options.BuildOptions, pr, os.Stdout, os.Stderr, options.progress)
opts, err := options.toControllerOptions()
if err != nil {
return err
}
ref, err := c.Build(ctx, opts, pr, os.Stdout, os.Stderr, options.progress)
if err != nil {
return errors.Wrapf(err, "failed to build") // TODO: allow invoke even on error
}
@ -380,7 +470,7 @@ func launchControllerAndRunBuild(dockerCli command.Cli, options buildOptions) er
}
return errors.Errorf("failed to configure terminal: %v", err)
}
err = monitor.RunMonitor(ctx, ref, options.BuildOptions, invokeConfig, c, options.progress, pr2, os.Stdout, os.Stderr)
err = monitor.RunMonitor(ctx, ref, opts, invokeConfig, c, options.progress, pr2, os.Stdout, os.Stderr)
con.Reset()
if err := pw2.Close(); err != nil {
logrus.Debug("failed to close monitor stdin pipe reader")
@ -445,75 +535,37 @@ func parseInvokeConfig(invoke string) (cfg controllerapi.ContainerConfig, err er
return cfg, nil
}
func newBuildOptions() buildOptions {
return buildOptions{
BuildOptions: controllerapi.BuildOptions{
Opts: &controllerapi.CommonOptions{},
},
}
}
func newUlimits(opt *buildOptions) *ulimits {
ul := make(map[string]*units.Ulimit)
return &ulimits{opt: opt, org: dockeropts.NewUlimitOpt(&ul)}
}
type ulimits struct {
opt *buildOptions
org *dockeropts.UlimitOpt
}
func (u *ulimits) sync() {
du := &controllerapi.UlimitOpt{
Values: make(map[string]*controllerapi.Ulimit),
}
for _, l := range u.org.GetList() {
du.Values[l.Name] = &controllerapi.Ulimit{
Name: l.Name,
Hard: l.Hard,
Soft: l.Soft,
func listToMap(values []string, defaultEnv bool) map[string]string {
result := make(map[string]string, len(values))
for _, value := range values {
kv := strings.SplitN(value, "=", 2)
if len(kv) == 1 {
if defaultEnv {
v, ok := os.LookupEnv(kv[0])
if ok {
result[kv[0]] = v
}
} else {
result[kv[0]] = ""
}
} else {
result[kv[0]] = kv[1]
}
}
u.opt.Ulimits = du
return result
}
func (u *ulimits) String() string {
return u.org.String()
}
func (u *ulimits) Set(v string) error {
err := u.org.Set(v)
u.sync()
return err
}
func (u *ulimits) Type() string {
return u.org.Type()
}
func newShmSize(opt *buildOptions) *shmSize {
return &shmSize{opt: opt}
}
type shmSize struct {
opt *buildOptions
org dockeropts.MemBytes
}
func (s *shmSize) sync() {
s.opt.ShmSize = s.org.Value()
}
func (s *shmSize) String() string {
return s.org.String()
}
func (s *shmSize) Set(v string) error {
err := s.org.Set(v)
s.sync()
return err
}
func (s *shmSize) Type() string {
return s.org.Type()
func dockerUlimitToControllerUlimit(u *dockeropts.UlimitOpt) *controllerapi.UlimitOpt {
if u == nil {
return nil
}
values := make(map[string]*controllerapi.Ulimit)
for _, u := range u.GetList() {
values[u.Name] = &controllerapi.Ulimit{
Name: u.Name,
Hard: u.Hard,
Soft: u.Soft,
}
}
return &controllerapi.UlimitOpt{Values: values}
}

View File

@ -26,7 +26,6 @@ import (
"github.com/docker/cli/cli/command"
"github.com/docker/cli/cli/config"
dockeropts "github.com/docker/cli/opts"
"github.com/docker/distribution/reference"
"github.com/docker/docker/pkg/ioutils"
"github.com/docker/go-units"
"github.com/moby/buildkit/client"
@ -53,9 +52,9 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
progressMode = "quiet"
}
contexts, err := parseContextNames(in.Contexts)
if err != nil {
return nil, err
contexts := map[string]build.NamedContext{}
for name, path := range in.NamedContexts {
contexts[name] = build.NamedContext{Path: path}
}
printFunc, err := parsePrintFunc(in.PrintFunc)
@ -70,10 +69,10 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
InStream: inStream,
NamedContexts: contexts,
},
BuildArgs: listToMap(in.BuildArgs, true),
BuildArgs: in.BuildArgs,
ExtraHosts: in.ExtraHosts,
ImageIDFile: in.ImageIDFile,
Labels: listToMap(in.Labels, false),
Labels: in.Labels,
NetworkMode: in.NetworkMode,
NoCache: in.Opts.NoCache,
NoCacheFilter: in.NoCacheFilter,
@ -94,7 +93,7 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
dockerConfig := config.LoadDefaultConfigFile(os.Stderr)
opts.Session = append(opts.Session, authprovider.NewDockerAuthProvider(dockerConfig))
secrets, err := buildflags.ParseSecretSpecs(in.Secrets)
secrets, err := controllerapi.CreateSecrets(in.Secrets)
if err != nil {
return nil, err
}
@ -102,15 +101,15 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
sshSpecs := in.SSH
if len(sshSpecs) == 0 && buildflags.IsGitSSH(in.ContextPath) {
sshSpecs = []string{"default"}
sshSpecs = append(sshSpecs, &controllerapi.SSH{ID: "default"})
}
ssh, err := buildflags.ParseSSHSpecs(sshSpecs)
ssh, err := controllerapi.CreateSSH(sshSpecs)
if err != nil {
return nil, err
}
opts.Session = append(opts.Session, ssh)
outputs, err := buildflags.ParseOutputs(in.Outputs)
outputs, err := controllerapi.CreateExports(in.Exports)
if err != nil {
return nil, err
}
@ -162,17 +161,8 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
return nil, err
}
cacheImports, err := buildflags.ParseCacheEntry(in.CacheFrom)
if err != nil {
return nil, err
}
opts.CacheFrom = cacheImports
cacheExports, err := buildflags.ParseCacheEntry(in.CacheTo)
if err != nil {
return nil, err
}
opts.CacheTo = cacheExports
opts.CacheFrom = controllerapi.CreateCaches(in.CacheFrom)
opts.CacheTo = controllerapi.CreateCaches(in.CacheTo)
allow, err := buildflags.ParseEntitlements(in.Allow)
if err != nil {
@ -301,46 +291,6 @@ func printWarnings(w io.Writer, warnings []client.VertexWarning, mode string) {
}
}
func listToMap(values []string, defaultEnv bool) map[string]string {
result := make(map[string]string, len(values))
for _, value := range values {
kv := strings.SplitN(value, "=", 2)
if len(kv) == 1 {
if defaultEnv {
v, ok := os.LookupEnv(kv[0])
if ok {
result[kv[0]] = v
}
} else {
result[kv[0]] = ""
}
} else {
result[kv[0]] = kv[1]
}
}
return result
}
func parseContextNames(values []string) (map[string]build.NamedContext, error) {
if len(values) == 0 {
return nil, nil
}
result := make(map[string]build.NamedContext, len(values))
for _, value := range values {
kv := strings.SplitN(value, "=", 2)
if len(kv) != 2 {
return nil, errors.Errorf("invalid context value: %s, expected key=value", value)
}
named, err := reference.ParseNormalizedNamed(kv[0])
if err != nil {
return nil, errors.Wrapf(err, "invalid context name %s", kv[0])
}
name := strings.TrimSuffix(reference.FamiliarString(named), ":latest")
result[name] = build.NamedContext{Path: kv[1]}
}
return result, nil
}
func parsePrintFunc(str string) (*build.PrintFunc, error) {
if str == "" {
return nil, nil

21
controller/pb/cache.go Normal file
View File

@ -0,0 +1,21 @@
package pb
import "github.com/moby/buildkit/client"
func CreateCaches(entries []*CacheOptionsEntry) []client.CacheOptionsEntry {
var outs []client.CacheOptionsEntry
if len(entries) == 0 {
return nil
}
for _, entry := range entries {
out := client.CacheOptionsEntry{
Type: entry.Type,
Attrs: map[string]string{},
}
for k, v := range entry.Attrs {
out.Attrs[k] = v
}
outs = append(outs, out)
}
return outs
}

View File

@ -72,35 +72,34 @@ func (m *BuildRequest) GetOptions() *BuildOptions {
}
type BuildOptions 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"`
PrintFunc string `protobuf:"bytes,3,opt,name=PrintFunc,proto3" json:"PrintFunc,omitempty"`
Allow []string `protobuf:"bytes,4,rep,name=Allow,proto3" json:"Allow,omitempty"`
Attests []string `protobuf:"bytes,5,rep,name=Attests,proto3" json:"Attests,omitempty"`
BuildArgs []string `protobuf:"bytes,6,rep,name=BuildArgs,proto3" json:"BuildArgs,omitempty"`
CacheFrom []string `protobuf:"bytes,7,rep,name=CacheFrom,proto3" json:"CacheFrom,omitempty"`
CacheTo []string `protobuf:"bytes,8,rep,name=CacheTo,proto3" json:"CacheTo,omitempty"`
CgroupParent string `protobuf:"bytes,9,opt,name=CgroupParent,proto3" json:"CgroupParent,omitempty"`
Contexts []string `protobuf:"bytes,10,rep,name=Contexts,proto3" json:"Contexts,omitempty"`
ExtraHosts []string `protobuf:"bytes,11,rep,name=ExtraHosts,proto3" json:"ExtraHosts,omitempty"`
ImageIDFile string `protobuf:"bytes,12,opt,name=ImageIDFile,proto3" json:"ImageIDFile,omitempty"`
Labels []string `protobuf:"bytes,13,rep,name=Labels,proto3" json:"Labels,omitempty"`
NetworkMode string `protobuf:"bytes,14,opt,name=NetworkMode,proto3" json:"NetworkMode,omitempty"`
NoCacheFilter []string `protobuf:"bytes,15,rep,name=NoCacheFilter,proto3" json:"NoCacheFilter,omitempty"`
Outputs []string `protobuf:"bytes,16,rep,name=Outputs,proto3" json:"Outputs,omitempty"`
Platforms []string `protobuf:"bytes,17,rep,name=Platforms,proto3" json:"Platforms,omitempty"`
Quiet bool `protobuf:"varint,18,opt,name=Quiet,proto3" json:"Quiet,omitempty"`
Secrets []string `protobuf:"bytes,19,rep,name=Secrets,proto3" json:"Secrets,omitempty"`
ShmSize int64 `protobuf:"varint,20,opt,name=ShmSize,proto3" json:"ShmSize,omitempty"`
SSH []string `protobuf:"bytes,21,rep,name=SSH,proto3" json:"SSH,omitempty"`
Tags []string `protobuf:"bytes,22,rep,name=Tags,proto3" json:"Tags,omitempty"`
Target string `protobuf:"bytes,23,opt,name=Target,proto3" json:"Target,omitempty"`
Ulimits *UlimitOpt `protobuf:"bytes,24,opt,name=Ulimits,proto3" json:"Ulimits,omitempty"`
// string Invoke: provided via Invoke API
Opts *CommonOptions `protobuf:"bytes,25,opt,name=Opts,proto3" json:"Opts,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
ContextPath string `protobuf:"bytes,1,opt,name=ContextPath,proto3" json:"ContextPath,omitempty"`
DockerfileName string `protobuf:"bytes,2,opt,name=DockerfileName,proto3" json:"DockerfileName,omitempty"`
PrintFunc string `protobuf:"bytes,3,opt,name=PrintFunc,proto3" json:"PrintFunc,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"`
Allow []string `protobuf:"bytes,5,rep,name=Allow,proto3" json:"Allow,omitempty"`
Attests []string `protobuf:"bytes,6,rep,name=Attests,proto3" json:"Attests,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"`
CacheFrom []*CacheOptionsEntry `protobuf:"bytes,8,rep,name=CacheFrom,proto3" json:"CacheFrom,omitempty"`
CacheTo []*CacheOptionsEntry `protobuf:"bytes,9,rep,name=CacheTo,proto3" json:"CacheTo,omitempty"`
CgroupParent string `protobuf:"bytes,10,opt,name=CgroupParent,proto3" json:"CgroupParent,omitempty"`
Exports []*ExportEntry `protobuf:"bytes,11,rep,name=Exports,proto3" json:"Exports,omitempty"`
ExtraHosts []string `protobuf:"bytes,12,rep,name=ExtraHosts,proto3" json:"ExtraHosts,omitempty"`
ImageIDFile string `protobuf:"bytes,13,opt,name=ImageIDFile,proto3" json:"ImageIDFile,omitempty"`
Labels map[string]string `protobuf:"bytes,14,rep,name=Labels,proto3" json:"Labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
NetworkMode string `protobuf:"bytes,15,opt,name=NetworkMode,proto3" json:"NetworkMode,omitempty"`
NoCacheFilter []string `protobuf:"bytes,16,rep,name=NoCacheFilter,proto3" json:"NoCacheFilter,omitempty"`
Platforms []string `protobuf:"bytes,17,rep,name=Platforms,proto3" json:"Platforms,omitempty"`
Quiet bool `protobuf:"varint,18,opt,name=Quiet,proto3" json:"Quiet,omitempty"`
Secrets []*Secret `protobuf:"bytes,19,rep,name=Secrets,proto3" json:"Secrets,omitempty"`
ShmSize int64 `protobuf:"varint,20,opt,name=ShmSize,proto3" json:"ShmSize,omitempty"`
SSH []*SSH `protobuf:"bytes,21,rep,name=SSH,proto3" json:"SSH,omitempty"`
Tags []string `protobuf:"bytes,22,rep,name=Tags,proto3" json:"Tags,omitempty"`
Target string `protobuf:"bytes,23,opt,name=Target,proto3" json:"Target,omitempty"`
Ulimits *UlimitOpt `protobuf:"bytes,24,opt,name=Ulimits,proto3" json:"Ulimits,omitempty"`
Opts *CommonOptions `protobuf:"bytes,25,opt,name=Opts,proto3" json:"Opts,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *BuildOptions) Reset() { *m = BuildOptions{} }
@ -148,6 +147,13 @@ func (m *BuildOptions) GetPrintFunc() string {
return ""
}
func (m *BuildOptions) GetNamedContexts() map[string]string {
if m != nil {
return m.NamedContexts
}
return nil
}
func (m *BuildOptions) GetAllow() []string {
if m != nil {
return m.Allow
@ -162,21 +168,21 @@ func (m *BuildOptions) GetAttests() []string {
return nil
}
func (m *BuildOptions) GetBuildArgs() []string {
func (m *BuildOptions) GetBuildArgs() map[string]string {
if m != nil {
return m.BuildArgs
}
return nil
}
func (m *BuildOptions) GetCacheFrom() []string {
func (m *BuildOptions) GetCacheFrom() []*CacheOptionsEntry {
if m != nil {
return m.CacheFrom
}
return nil
}
func (m *BuildOptions) GetCacheTo() []string {
func (m *BuildOptions) GetCacheTo() []*CacheOptionsEntry {
if m != nil {
return m.CacheTo
}
@ -190,9 +196,9 @@ func (m *BuildOptions) GetCgroupParent() string {
return ""
}
func (m *BuildOptions) GetContexts() []string {
func (m *BuildOptions) GetExports() []*ExportEntry {
if m != nil {
return m.Contexts
return m.Exports
}
return nil
}
@ -211,7 +217,7 @@ func (m *BuildOptions) GetImageIDFile() string {
return ""
}
func (m *BuildOptions) GetLabels() []string {
func (m *BuildOptions) GetLabels() map[string]string {
if m != nil {
return m.Labels
}
@ -232,13 +238,6 @@ func (m *BuildOptions) GetNoCacheFilter() []string {
return nil
}
func (m *BuildOptions) GetOutputs() []string {
if m != nil {
return m.Outputs
}
return nil
}
func (m *BuildOptions) GetPlatforms() []string {
if m != nil {
return m.Platforms
@ -253,7 +252,7 @@ func (m *BuildOptions) GetQuiet() bool {
return false
}
func (m *BuildOptions) GetSecrets() []string {
func (m *BuildOptions) GetSecrets() []*Secret {
if m != nil {
return m.Secrets
}
@ -267,7 +266,7 @@ func (m *BuildOptions) GetShmSize() int64 {
return 0
}
func (m *BuildOptions) GetSSH() []string {
func (m *BuildOptions) GetSSH() []*SSH {
if m != nil {
return m.SSH
}
@ -302,6 +301,206 @@ func (m *BuildOptions) GetOpts() *CommonOptions {
return nil
}
type ExportEntry struct {
Type string `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"`
Attrs map[string]string `protobuf:"bytes,2,rep,name=Attrs,proto3" json:"Attrs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
Destination string `protobuf:"bytes,3,opt,name=Destination,proto3" json:"Destination,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ExportEntry) Reset() { *m = ExportEntry{} }
func (m *ExportEntry) String() string { return proto.CompactTextString(m) }
func (*ExportEntry) ProtoMessage() {}
func (*ExportEntry) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{2}
}
func (m *ExportEntry) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExportEntry.Unmarshal(m, b)
}
func (m *ExportEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ExportEntry.Marshal(b, m, deterministic)
}
func (m *ExportEntry) XXX_Merge(src proto.Message) {
xxx_messageInfo_ExportEntry.Merge(m, src)
}
func (m *ExportEntry) XXX_Size() int {
return xxx_messageInfo_ExportEntry.Size(m)
}
func (m *ExportEntry) XXX_DiscardUnknown() {
xxx_messageInfo_ExportEntry.DiscardUnknown(m)
}
var xxx_messageInfo_ExportEntry proto.InternalMessageInfo
func (m *ExportEntry) GetType() string {
if m != nil {
return m.Type
}
return ""
}
func (m *ExportEntry) GetAttrs() map[string]string {
if m != nil {
return m.Attrs
}
return nil
}
func (m *ExportEntry) GetDestination() string {
if m != nil {
return m.Destination
}
return ""
}
type CacheOptionsEntry struct {
Type string `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"`
Attrs map[string]string `protobuf:"bytes,2,rep,name=Attrs,proto3" json:"Attrs,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 *CacheOptionsEntry) Reset() { *m = CacheOptionsEntry{} }
func (m *CacheOptionsEntry) String() string { return proto.CompactTextString(m) }
func (*CacheOptionsEntry) ProtoMessage() {}
func (*CacheOptionsEntry) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{3}
}
func (m *CacheOptionsEntry) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CacheOptionsEntry.Unmarshal(m, b)
}
func (m *CacheOptionsEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CacheOptionsEntry.Marshal(b, m, deterministic)
}
func (m *CacheOptionsEntry) XXX_Merge(src proto.Message) {
xxx_messageInfo_CacheOptionsEntry.Merge(m, src)
}
func (m *CacheOptionsEntry) XXX_Size() int {
return xxx_messageInfo_CacheOptionsEntry.Size(m)
}
func (m *CacheOptionsEntry) XXX_DiscardUnknown() {
xxx_messageInfo_CacheOptionsEntry.DiscardUnknown(m)
}
var xxx_messageInfo_CacheOptionsEntry proto.InternalMessageInfo
func (m *CacheOptionsEntry) GetType() string {
if m != nil {
return m.Type
}
return ""
}
func (m *CacheOptionsEntry) GetAttrs() map[string]string {
if m != nil {
return m.Attrs
}
return nil
}
type SSH struct {
ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"`
Paths []string `protobuf:"bytes,2,rep,name=Paths,proto3" json:"Paths,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *SSH) Reset() { *m = SSH{} }
func (m *SSH) String() string { return proto.CompactTextString(m) }
func (*SSH) ProtoMessage() {}
func (*SSH) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{4}
}
func (m *SSH) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SSH.Unmarshal(m, b)
}
func (m *SSH) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_SSH.Marshal(b, m, deterministic)
}
func (m *SSH) XXX_Merge(src proto.Message) {
xxx_messageInfo_SSH.Merge(m, src)
}
func (m *SSH) XXX_Size() int {
return xxx_messageInfo_SSH.Size(m)
}
func (m *SSH) XXX_DiscardUnknown() {
xxx_messageInfo_SSH.DiscardUnknown(m)
}
var xxx_messageInfo_SSH proto.InternalMessageInfo
func (m *SSH) GetID() string {
if m != nil {
return m.ID
}
return ""
}
func (m *SSH) GetPaths() []string {
if m != nil {
return m.Paths
}
return nil
}
type Secret struct {
ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"`
FilePath string `protobuf:"bytes,2,opt,name=FilePath,proto3" json:"FilePath,omitempty"`
Env string `protobuf:"bytes,3,opt,name=Env,proto3" json:"Env,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Secret) Reset() { *m = Secret{} }
func (m *Secret) String() string { return proto.CompactTextString(m) }
func (*Secret) ProtoMessage() {}
func (*Secret) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{5}
}
func (m *Secret) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Secret.Unmarshal(m, b)
}
func (m *Secret) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Secret.Marshal(b, m, deterministic)
}
func (m *Secret) XXX_Merge(src proto.Message) {
xxx_messageInfo_Secret.Merge(m, src)
}
func (m *Secret) XXX_Size() int {
return xxx_messageInfo_Secret.Size(m)
}
func (m *Secret) XXX_DiscardUnknown() {
xxx_messageInfo_Secret.DiscardUnknown(m)
}
var xxx_messageInfo_Secret proto.InternalMessageInfo
func (m *Secret) GetID() string {
if m != nil {
return m.ID
}
return ""
}
func (m *Secret) GetFilePath() string {
if m != nil {
return m.FilePath
}
return ""
}
func (m *Secret) GetEnv() string {
if m != nil {
return m.Env
}
return ""
}
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"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
@ -313,7 +512,7 @@ func (m *UlimitOpt) Reset() { *m = UlimitOpt{} }
func (m *UlimitOpt) String() string { return proto.CompactTextString(m) }
func (*UlimitOpt) ProtoMessage() {}
func (*UlimitOpt) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{2}
return fileDescriptor_ed7f10298fa1d90f, []int{6}
}
func (m *UlimitOpt) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UlimitOpt.Unmarshal(m, b)
@ -353,7 +552,7 @@ func (m *Ulimit) Reset() { *m = Ulimit{} }
func (m *Ulimit) String() string { return proto.CompactTextString(m) }
func (*Ulimit) ProtoMessage() {}
func (*Ulimit) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{3}
return fileDescriptor_ed7f10298fa1d90f, []int{7}
}
func (m *Ulimit) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Ulimit.Unmarshal(m, b)
@ -413,7 +612,7 @@ func (m *CommonOptions) Reset() { *m = CommonOptions{} }
func (m *CommonOptions) String() string { return proto.CompactTextString(m) }
func (*CommonOptions) ProtoMessage() {}
func (*CommonOptions) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{4}
return fileDescriptor_ed7f10298fa1d90f, []int{8}
}
func (m *CommonOptions) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CommonOptions.Unmarshal(m, b)
@ -499,7 +698,7 @@ func (m *BuildResponse) Reset() { *m = BuildResponse{} }
func (m *BuildResponse) String() string { return proto.CompactTextString(m) }
func (*BuildResponse) ProtoMessage() {}
func (*BuildResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{5}
return fileDescriptor_ed7f10298fa1d90f, []int{9}
}
func (m *BuildResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BuildResponse.Unmarshal(m, b)
@ -530,7 +729,7 @@ func (m *DisconnectRequest) Reset() { *m = DisconnectRequest{} }
func (m *DisconnectRequest) String() string { return proto.CompactTextString(m) }
func (*DisconnectRequest) ProtoMessage() {}
func (*DisconnectRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{6}
return fileDescriptor_ed7f10298fa1d90f, []int{10}
}
func (m *DisconnectRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DisconnectRequest.Unmarshal(m, b)
@ -567,7 +766,7 @@ func (m *DisconnectResponse) Reset() { *m = DisconnectResponse{} }
func (m *DisconnectResponse) String() string { return proto.CompactTextString(m) }
func (*DisconnectResponse) ProtoMessage() {}
func (*DisconnectResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{7}
return fileDescriptor_ed7f10298fa1d90f, []int{11}
}
func (m *DisconnectResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DisconnectResponse.Unmarshal(m, b)
@ -598,7 +797,7 @@ func (m *ListRequest) Reset() { *m = ListRequest{} }
func (m *ListRequest) String() string { return proto.CompactTextString(m) }
func (*ListRequest) ProtoMessage() {}
func (*ListRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{8}
return fileDescriptor_ed7f10298fa1d90f, []int{12}
}
func (m *ListRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRequest.Unmarshal(m, b)
@ -636,7 +835,7 @@ func (m *ListResponse) Reset() { *m = ListResponse{} }
func (m *ListResponse) String() string { return proto.CompactTextString(m) }
func (*ListResponse) ProtoMessage() {}
func (*ListResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{9}
return fileDescriptor_ed7f10298fa1d90f, []int{13}
}
func (m *ListResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListResponse.Unmarshal(m, b)
@ -677,7 +876,7 @@ func (m *InputMessage) Reset() { *m = InputMessage{} }
func (m *InputMessage) String() string { return proto.CompactTextString(m) }
func (*InputMessage) ProtoMessage() {}
func (*InputMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{10}
return fileDescriptor_ed7f10298fa1d90f, []int{14}
}
func (m *InputMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputMessage.Unmarshal(m, b)
@ -751,7 +950,7 @@ func (m *InputInitMessage) Reset() { *m = InputInitMessage{} }
func (m *InputInitMessage) String() string { return proto.CompactTextString(m) }
func (*InputInitMessage) ProtoMessage() {}
func (*InputInitMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{11}
return fileDescriptor_ed7f10298fa1d90f, []int{15}
}
func (m *InputInitMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputInitMessage.Unmarshal(m, b)
@ -790,7 +989,7 @@ func (m *DataMessage) Reset() { *m = DataMessage{} }
func (m *DataMessage) String() string { return proto.CompactTextString(m) }
func (*DataMessage) ProtoMessage() {}
func (*DataMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{12}
return fileDescriptor_ed7f10298fa1d90f, []int{16}
}
func (m *DataMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DataMessage.Unmarshal(m, b)
@ -834,7 +1033,7 @@ func (m *InputResponse) Reset() { *m = InputResponse{} }
func (m *InputResponse) String() string { return proto.CompactTextString(m) }
func (*InputResponse) ProtoMessage() {}
func (*InputResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{13}
return fileDescriptor_ed7f10298fa1d90f, []int{17}
}
func (m *InputResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InputResponse.Unmarshal(m, b)
@ -870,7 +1069,7 @@ func (m *Message) Reset() { *m = Message{} }
func (m *Message) String() string { return proto.CompactTextString(m) }
func (*Message) ProtoMessage() {}
func (*Message) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{14}
return fileDescriptor_ed7f10298fa1d90f, []int{18}
}
func (m *Message) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Message.Unmarshal(m, b)
@ -969,7 +1168,7 @@ func (m *InitMessage) Reset() { *m = InitMessage{} }
func (m *InitMessage) String() string { return proto.CompactTextString(m) }
func (*InitMessage) ProtoMessage() {}
func (*InitMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{15}
return fileDescriptor_ed7f10298fa1d90f, []int{19}
}
func (m *InitMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InitMessage.Unmarshal(m, b)
@ -1021,7 +1220,7 @@ func (m *ContainerConfig) Reset() { *m = ContainerConfig{} }
func (m *ContainerConfig) String() string { return proto.CompactTextString(m) }
func (*ContainerConfig) ProtoMessage() {}
func (*ContainerConfig) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{16}
return fileDescriptor_ed7f10298fa1d90f, []int{20}
}
func (m *ContainerConfig) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ContainerConfig.Unmarshal(m, b)
@ -1110,7 +1309,7 @@ func (m *FdMessage) Reset() { *m = FdMessage{} }
func (m *FdMessage) String() string { return proto.CompactTextString(m) }
func (*FdMessage) ProtoMessage() {}
func (*FdMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{17}
return fileDescriptor_ed7f10298fa1d90f, []int{21}
}
func (m *FdMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FdMessage.Unmarshal(m, b)
@ -1163,7 +1362,7 @@ func (m *ResizeMessage) Reset() { *m = ResizeMessage{} }
func (m *ResizeMessage) String() string { return proto.CompactTextString(m) }
func (*ResizeMessage) ProtoMessage() {}
func (*ResizeMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{18}
return fileDescriptor_ed7f10298fa1d90f, []int{22}
}
func (m *ResizeMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ResizeMessage.Unmarshal(m, b)
@ -1210,7 +1409,7 @@ func (m *SignalMessage) Reset() { *m = SignalMessage{} }
func (m *SignalMessage) String() string { return proto.CompactTextString(m) }
func (*SignalMessage) ProtoMessage() {}
func (*SignalMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{19}
return fileDescriptor_ed7f10298fa1d90f, []int{23}
}
func (m *SignalMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignalMessage.Unmarshal(m, b)
@ -1248,7 +1447,7 @@ func (m *StatusRequest) Reset() { *m = StatusRequest{} }
func (m *StatusRequest) String() string { return proto.CompactTextString(m) }
func (*StatusRequest) ProtoMessage() {}
func (*StatusRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{20}
return fileDescriptor_ed7f10298fa1d90f, []int{24}
}
func (m *StatusRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StatusRequest.Unmarshal(m, b)
@ -1289,7 +1488,7 @@ func (m *StatusResponse) Reset() { *m = StatusResponse{} }
func (m *StatusResponse) String() string { return proto.CompactTextString(m) }
func (*StatusResponse) ProtoMessage() {}
func (*StatusResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{21}
return fileDescriptor_ed7f10298fa1d90f, []int{25}
}
func (m *StatusResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StatusResponse.Unmarshal(m, b)
@ -1347,7 +1546,7 @@ func (m *InfoRequest) Reset() { *m = InfoRequest{} }
func (m *InfoRequest) String() string { return proto.CompactTextString(m) }
func (*InfoRequest) ProtoMessage() {}
func (*InfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{22}
return fileDescriptor_ed7f10298fa1d90f, []int{26}
}
func (m *InfoRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InfoRequest.Unmarshal(m, b)
@ -1378,7 +1577,7 @@ func (m *InfoResponse) Reset() { *m = InfoResponse{} }
func (m *InfoResponse) String() string { return proto.CompactTextString(m) }
func (*InfoResponse) ProtoMessage() {}
func (*InfoResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{23}
return fileDescriptor_ed7f10298fa1d90f, []int{27}
}
func (m *InfoResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InfoResponse.Unmarshal(m, b)
@ -1418,7 +1617,7 @@ func (m *BuildxVersion) Reset() { *m = BuildxVersion{} }
func (m *BuildxVersion) String() string { return proto.CompactTextString(m) }
func (*BuildxVersion) ProtoMessage() {}
func (*BuildxVersion) Descriptor() ([]byte, []int) {
return fileDescriptor_ed7f10298fa1d90f, []int{24}
return fileDescriptor_ed7f10298fa1d90f, []int{28}
}
func (m *BuildxVersion) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_BuildxVersion.Unmarshal(m, b)
@ -1462,6 +1661,15 @@ func (m *BuildxVersion) GetRevision() string {
func init() {
proto.RegisterType((*BuildRequest)(nil), "buildx.controller.v1.BuildRequest")
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.LabelsEntry")
proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.BuildOptions.NamedContextsEntry")
proto.RegisterType((*ExportEntry)(nil), "buildx.controller.v1.ExportEntry")
proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.ExportEntry.AttrsEntry")
proto.RegisterType((*CacheOptionsEntry)(nil), "buildx.controller.v1.CacheOptionsEntry")
proto.RegisterMapType((map[string]string)(nil), "buildx.controller.v1.CacheOptionsEntry.AttrsEntry")
proto.RegisterType((*SSH)(nil), "buildx.controller.v1.SSH")
proto.RegisterType((*Secret)(nil), "buildx.controller.v1.Secret")
proto.RegisterType((*UlimitOpt)(nil), "buildx.controller.v1.UlimitOpt")
proto.RegisterMapType((map[string]*Ulimit)(nil), "buildx.controller.v1.UlimitOpt.ValuesEntry")
proto.RegisterType((*Ulimit)(nil), "buildx.controller.v1.Ulimit")
@ -1491,97 +1699,111 @@ func init() {
func init() { proto.RegisterFile("controller.proto", fileDescriptor_ed7f10298fa1d90f) }
var fileDescriptor_ed7f10298fa1d90f = []byte{
// 1436 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x57, 0xdd, 0x52, 0x1b, 0xc7,
0x12, 0x3e, 0x8b, 0x84, 0x7e, 0x5a, 0x08, 0xe3, 0x39, 0x1c, 0x9f, 0x39, 0x3a, 0x8e, 0x8d, 0x17,
0xdb, 0x51, 0x55, 0xaa, 0x84, 0x83, 0x93, 0x72, 0x62, 0x3b, 0x17, 0x20, 0xa0, 0x20, 0xc5, 0x5f,
0x16, 0x6c, 0x57, 0x72, 0x11, 0xd7, 0x22, 0x0d, 0x62, 0x4b, 0xab, 0x1d, 0x65, 0x67, 0x24, 0x20,
0x57, 0x79, 0x82, 0x5c, 0xe4, 0x2d, 0xf2, 0x0c, 0x79, 0x8d, 0xbc, 0x47, 0xf2, 0x08, 0xa9, 0xee,
0x99, 0x5d, 0x56, 0x58, 0x2b, 0x5f, 0x69, 0xfa, 0x9b, 0xef, 0xeb, 0x99, 0xee, 0xe9, 0xe9, 0x59,
0xc1, 0x52, 0x47, 0x46, 0x3a, 0x96, 0x61, 0x28, 0xe2, 0xd6, 0x30, 0x96, 0x5a, 0xb2, 0xe5, 0xb3,
0x51, 0x10, 0x76, 0xaf, 0x5a, 0x99, 0x89, 0xf1, 0xe7, 0x8d, 0x57, 0xbd, 0x40, 0x5f, 0x8c, 0xce,
0x5a, 0x1d, 0x39, 0x58, 0x1b, 0xc8, 0xb3, 0xeb, 0x35, 0x62, 0xf5, 0x03, 0xbd, 0xe6, 0x0f, 0x83,
0x35, 0x25, 0xe2, 0x71, 0xd0, 0x11, 0x6a, 0xcd, 0x8a, 0x92, 0x5f, 0xe3, 0xd2, 0xfd, 0x11, 0x16,
0x36, 0x91, 0xee, 0x89, 0x9f, 0x46, 0x42, 0x69, 0xb6, 0x04, 0x05, 0x4f, 0x9c, 0x73, 0x67, 0xc5,
0x69, 0x56, 0x3d, 0x1c, 0xb2, 0xd7, 0x50, 0x3e, 0x1a, 0xea, 0x40, 0x46, 0x8a, 0xcf, 0xad, 0x38,
0xcd, 0xda, 0xba, 0xdb, 0x9a, 0xb6, 0x8d, 0x16, 0xb9, 0xb1, 0x4c, 0x2f, 0x91, 0xb8, 0xbf, 0x95,
0xec, 0x02, 0x16, 0x60, 0x2b, 0x50, 0x6b, 0xcb, 0x48, 0x8b, 0x2b, 0x7d, 0xec, 0xeb, 0x0b, 0xbb,
0x50, 0x16, 0x62, 0x4f, 0x61, 0x71, 0x4b, 0x76, 0xfa, 0x22, 0x3e, 0x0f, 0x42, 0x71, 0xe8, 0x0f,
0x04, 0xad, 0x5b, 0xf5, 0x6e, 0xa1, 0xec, 0x3e, 0x54, 0x8f, 0xe3, 0x20, 0xd2, 0x3b, 0xa3, 0xa8,
0xc3, 0x0b, 0x44, 0xb9, 0x01, 0xd8, 0x32, 0xcc, 0x6f, 0x84, 0xa1, 0xbc, 0xe4, 0xc5, 0x95, 0x42,
0xb3, 0xea, 0x19, 0x83, 0x71, 0x28, 0x6f, 0x68, 0x2d, 0x94, 0x56, 0x7c, 0x9e, 0xf0, 0xc4, 0x44,
0x6f, 0xb4, 0xcf, 0x8d, 0xb8, 0xa7, 0x78, 0x89, 0xe6, 0x6e, 0x00, 0x9c, 0x6d, 0xfb, 0x9d, 0x0b,
0xb1, 0x13, 0xcb, 0x01, 0x2f, 0x9b, 0xd9, 0x14, 0x40, 0xaf, 0x64, 0x9c, 0x4a, 0x5e, 0x31, 0x5e,
0xad, 0xc9, 0x5c, 0x58, 0x68, 0xf7, 0x62, 0x39, 0x1a, 0x1e, 0xfb, 0xb1, 0x88, 0x34, 0xaf, 0xd2,
0x36, 0x27, 0x30, 0xd6, 0x80, 0x8a, 0x0d, 0x5f, 0x71, 0x20, 0x79, 0x6a, 0xb3, 0x07, 0x00, 0xdb,
0x57, 0x3a, 0xf6, 0x77, 0x25, 0x6e, 0xb9, 0x46, 0xb3, 0x19, 0x04, 0xb3, 0xb9, 0x37, 0xf0, 0x7b,
0x62, 0x6f, 0x6b, 0x27, 0x08, 0x05, 0x5f, 0x30, 0xd9, 0xcc, 0x40, 0xec, 0x1e, 0x94, 0xf6, 0xfd,
0x33, 0x11, 0x2a, 0x5e, 0x27, 0xb5, 0xb5, 0x50, 0x79, 0x28, 0xf4, 0xa5, 0x8c, 0xfb, 0x07, 0xb2,
0x2b, 0xf8, 0xa2, 0x51, 0x66, 0x20, 0xf6, 0x18, 0xea, 0x87, 0xd2, 0x04, 0x19, 0x84, 0x5a, 0xc4,
0xfc, 0x0e, 0x39, 0x98, 0x04, 0x31, 0xf6, 0xa3, 0x91, 0x1e, 0x8e, 0xb4, 0xe2, 0x4b, 0x26, 0x76,
0x6b, 0xd2, 0xf9, 0x84, 0xbe, 0x3e, 0x97, 0xf1, 0x40, 0xf1, 0xbb, 0x26, 0x67, 0x29, 0x80, 0xe7,
0xf3, 0xdd, 0x28, 0x10, 0x9a, 0xb3, 0x15, 0xa7, 0x59, 0xf1, 0x8c, 0x81, 0xde, 0x4e, 0x44, 0x27,
0x16, 0x5a, 0xf1, 0x7f, 0x1b, 0x6f, 0xd6, 0xa4, 0x99, 0x8b, 0xc1, 0x49, 0xf0, 0xb3, 0xe0, 0xcb,
0x2b, 0x4e, 0xb3, 0xe0, 0x25, 0x26, 0x96, 0xec, 0xc9, 0xc9, 0x2e, 0xff, 0x0f, 0xf1, 0x71, 0xc8,
0x18, 0x14, 0x4f, 0xfd, 0x9e, 0xe2, 0xf7, 0x08, 0xa2, 0x31, 0xe6, 0xe1, 0xd4, 0x8f, 0x7b, 0x42,
0xf3, 0xff, 0x52, 0xa8, 0xd6, 0x62, 0x5f, 0x43, 0xf9, 0x4d, 0x18, 0x0c, 0x02, 0xad, 0x38, 0xa7,
0xf2, 0x7e, 0x38, 0xbd, 0xbc, 0x0d, 0xe9, 0x68, 0xa8, 0xbd, 0x84, 0xcf, 0x5e, 0x40, 0xf1, 0x68,
0xa8, 0x15, 0xff, 0x1f, 0xe9, 0x56, 0xa7, 0xeb, 0xda, 0x72, 0x30, 0x90, 0x51, 0x72, 0x2f, 0x48,
0xe0, 0xfe, 0xee, 0x40, 0x35, 0xf5, 0xc7, 0xda, 0x50, 0x1a, 0xfb, 0xe1, 0x48, 0x28, 0xee, 0xac,
0x14, 0x9a, 0xb5, 0xf5, 0xcf, 0x3e, 0xb2, 0x81, 0xd6, 0x5b, 0x62, 0x6f, 0x47, 0x3a, 0xbe, 0xf6,
0xac, 0xb4, 0xf1, 0x0e, 0x6a, 0x19, 0x18, 0x73, 0xd2, 0x17, 0xd7, 0xc9, 0x35, 0xee, 0x8b, 0x6b,
0xb6, 0x0e, 0xf3, 0x44, 0xb5, 0x97, 0xf8, 0xfe, 0xac, 0x45, 0x3c, 0x43, 0x7d, 0x39, 0xf7, 0x95,
0xe3, 0x6e, 0x41, 0xc9, 0x80, 0x98, 0x55, 0xba, 0x8d, 0xc6, 0x29, 0x8d, 0x11, 0xdb, 0xf5, 0xe3,
0x2e, 0x39, 0x2d, 0x78, 0x34, 0x46, 0xec, 0x44, 0x9e, 0x6b, 0xba, 0x92, 0x05, 0x8f, 0xc6, 0xee,
0x5f, 0x0e, 0xd4, 0x27, 0x32, 0x81, 0xe7, 0x49, 0xd7, 0x4b, 0xc4, 0xd6, 0x61, 0x62, 0xe2, 0x9d,
0x39, 0x10, 0xda, 0xef, 0xfa, 0xda, 0xa7, 0xa2, 0x36, 0xb7, 0x7f, 0x02, 0x43, 0xb5, 0x2d, 0x43,
0x5a, 0xa6, 0xe2, 0x25, 0x26, 0xae, 0x7e, 0x3c, 0x0a, 0x43, 0x5e, 0x24, 0x98, 0xc6, 0xe6, 0x16,
0x0d, 0x65, 0xac, 0x8f, 0x47, 0xea, 0x82, 0xcf, 0xd3, 0x4c, 0x06, 0xb9, 0x99, 0xdf, 0x97, 0x7e,
0x97, 0x97, 0xb2, 0xf3, 0x88, 0x50, 0x44, 0x9b, 0x47, 0x07, 0xbc, 0x6c, 0x22, 0xc7, 0x31, 0x6a,
0x8e, 0x63, 0x39, 0x16, 0x91, 0x1f, 0x75, 0x04, 0xaf, 0xd0, 0x4c, 0x06, 0x71, 0xef, 0x40, 0xdd,
0x36, 0x56, 0x35, 0x94, 0x91, 0x12, 0xee, 0x13, 0xb8, 0xbb, 0x15, 0xa8, 0x8e, 0x8c, 0x22, 0xd1,
0xd1, 0xb9, 0xed, 0xd6, 0x5d, 0x06, 0x96, 0xa5, 0x59, 0xf1, 0x43, 0xa8, 0xed, 0x07, 0x6a, 0x86,
0xcc, 0x85, 0x05, 0x43, 0x30, 0x02, 0xdc, 0x72, 0x5f, 0x5c, 0x9b, 0x92, 0xaa, 0x7a, 0x34, 0x76,
0x7f, 0x75, 0x60, 0x61, 0x2f, 0x1a, 0x8e, 0xf4, 0x81, 0x50, 0xca, 0xef, 0x09, 0xf6, 0x1a, 0x8a,
0x7b, 0x51, 0xa0, 0xc9, 0x4f, 0x6d, 0xfd, 0xe9, 0xf4, 0x92, 0x20, 0x05, 0xd2, 0xac, 0x6a, 0xf7,
0x5f, 0x1e, 0xa9, 0xb0, 0xfc, 0xb7, 0x7c, 0xed, 0xdb, 0x82, 0x7a, 0x34, 0x5d, 0x8d, 0x8c, 0x8c,
0x10, 0xcd, 0xcd, 0x32, 0xcc, 0x93, 0x53, 0xf7, 0x31, 0x2c, 0xdd, 0xf6, 0x3e, 0x25, 0xb4, 0xe7,
0x50, 0xcb, 0x78, 0x41, 0xc2, 0xf6, 0xd1, 0x0e, 0x11, 0x2a, 0x1e, 0x0e, 0x31, 0xd6, 0x74, 0x23,
0x0b, 0x66, 0x0d, 0x4c, 0x3f, 0xb9, 0x4e, 0x33, 0xf8, 0xcb, 0x1c, 0x94, 0x13, 0x17, 0x2f, 0x26,
0xe2, 0x7e, 0x94, 0x17, 0xf7, 0x87, 0x21, 0x7f, 0x09, 0xc5, 0xb4, 0x24, 0x73, 0x3b, 0xc5, 0x4e,
0x37, 0x23, 0xa3, 0x6a, 0xfd, 0x06, 0x4a, 0x9e, 0x50, 0xd8, 0xba, 0x0a, 0xb3, 0x5a, 0x85, 0xe1,
0xdc, 0x88, 0xad, 0x08, 0xe5, 0x27, 0x41, 0x2f, 0xf2, 0x4d, 0x51, 0xe7, 0xca, 0x0d, 0x27, 0x23,
0x37, 0xc0, 0x4d, 0xba, 0x87, 0x50, 0x9b, 0x99, 0x69, 0x76, 0x04, 0x77, 0xf0, 0xe5, 0xf1, 0x83,
0x48, 0xc4, 0x6d, 0x19, 0x9d, 0x07, 0x3d, 0x1b, 0xe9, 0x93, 0xbc, 0xde, 0x36, 0x41, 0xf6, 0x6e,
0xab, 0xdd, 0x3f, 0x9c, 0x0f, 0x3c, 0xd2, 0x65, 0xc3, 0x1e, 0x35, 0x94, 0x41, 0xa4, 0x6d, 0x7d,
0x66, 0x10, 0xdc, 0x56, 0x7b, 0x80, 0x1d, 0x85, 0xda, 0x79, 0x7b, 0xd0, 0xa5, 0x13, 0x8f, 0xc6,
0xbc, 0x60, 0x90, 0xed, 0x68, 0x8c, 0x27, 0xfe, 0x46, 0x89, 0x98, 0xf2, 0x51, 0xf5, 0x68, 0x8c,
0x0d, 0xfe, 0x50, 0x12, 0x6a, 0x2e, 0xb8, 0xb5, 0xc8, 0xdf, 0xa5, 0xb9, 0xd5, 0xe8, 0xef, 0xb2,
0x8b, 0x4f, 0xcf, 0xa1, 0x44, 0xac, 0x6c, 0x9e, 0x1e, 0x32, 0x90, 0x77, 0xaa, 0xaf, 0xe9, 0x26,
0x57, 0x3c, 0x1c, 0xba, 0x1b, 0x50, 0x4d, 0xcf, 0x92, 0x2d, 0xc2, 0xdc, 0x4e, 0x97, 0x92, 0x55,
0xf7, 0xe6, 0x76, 0xba, 0x49, 0x19, 0xce, 0x7d, 0x58, 0x86, 0x85, 0x4c, 0x19, 0xbe, 0x80, 0xfa,
0xc4, 0xa9, 0x22, 0xc9, 0x93, 0x97, 0xca, 0x3a, 0xa2, 0x31, 0x62, 0x6d, 0x19, 0x9a, 0xcf, 0xab,
0xba, 0x47, 0x63, 0x77, 0x15, 0xea, 0x13, 0xe7, 0x39, 0xad, 0xfb, 0xba, 0x8f, 0xa0, 0x7e, 0xa2,
0x7d, 0x3d, 0x52, 0xf9, 0x7d, 0xe1, 0x6f, 0x07, 0x16, 0x13, 0x8e, 0x6d, 0x0d, 0x5f, 0x40, 0x65,
0x2c, 0x62, 0x2d, 0xae, 0xd2, 0x17, 0x87, 0xb7, 0xf0, 0xbb, 0xb1, 0x95, 0x7c, 0x37, 0xe2, 0xd1,
0xbe, 0x25, 0x86, 0x97, 0x32, 0xd9, 0x4b, 0xa8, 0x28, 0xf2, 0x23, 0x14, 0x9d, 0x4d, 0x6d, 0xfd,
0x41, 0x9e, 0xca, 0xae, 0x97, 0xf2, 0xd9, 0x1a, 0x14, 0x43, 0xd9, 0x53, 0x74, 0x82, 0xb5, 0xf5,
0xff, 0xe7, 0xe9, 0xf6, 0x65, 0xcf, 0x23, 0x22, 0x7b, 0x05, 0x95, 0x4b, 0x3f, 0x8e, 0x82, 0xa8,
0xa7, 0xe8, 0xfb, 0x0d, 0xef, 0x5a, 0x8e, 0xe8, 0x9d, 0xe1, 0x79, 0xa9, 0xc0, 0xad, 0x63, 0x99,
0x9f, 0x4b, 0x9b, 0x13, 0xf7, 0x7b, 0x6c, 0x7a, 0x68, 0xda, 0xf0, 0xf7, 0xa0, 0x6e, 0x8a, 0xf9,
0xad, 0x88, 0x55, 0x20, 0x23, 0xdb, 0x05, 0x56, 0x67, 0x7c, 0xd5, 0x26, 0x54, 0x6f, 0x52, 0xe9,
0xbe, 0xb7, 0x3d, 0x3e, 0x01, 0xf0, 0x59, 0x1a, 0xfa, 0x9d, 0xbe, 0xdf, 0x4b, 0xce, 0x29, 0x31,
0x71, 0x66, 0x6c, 0xd7, 0x33, 0xef, 0x59, 0x62, 0xe2, 0xe7, 0x5f, 0x2c, 0xc6, 0x01, 0x4d, 0x99,
0xaf, 0xd8, 0xd4, 0x5e, 0xff, 0xb3, 0x08, 0xd0, 0x4e, 0xf7, 0xc3, 0x8e, 0x61, 0x9e, 0xd6, 0x63,
0xb3, 0x3e, 0xc1, 0x6d, 0xdc, 0x8d, 0xd5, 0x99, 0x1c, 0x9b, 0x8c, 0x37, 0x50, 0x32, 0xa7, 0xc5,
0xf2, 0x9a, 0x4a, 0xb6, 0xbe, 0x1a, 0x8f, 0x67, 0x93, 0x8c, 0xd3, 0x67, 0x0e, 0xf3, 0x6c, 0xcb,
0xc9, 0xdb, 0x68, 0xf6, 0x15, 0xca, 0xdb, 0xe8, 0x44, 0xfb, 0x6e, 0x3a, 0xec, 0x5b, 0x28, 0xed,
0x45, 0x63, 0xd9, 0x17, 0xec, 0x93, 0xe9, 0x82, 0xc4, 0xdf, 0xec, 0xe9, 0xa6, 0xf3, 0xcc, 0x61,
0x07, 0x50, 0xc4, 0xd7, 0x92, 0xe5, 0xb4, 0xfe, 0xcc, 0x53, 0xdb, 0x70, 0x67, 0x51, 0x6c, 0x16,
0xdf, 0x03, 0xdc, 0xbc, 0xd9, 0xec, 0xd3, 0x9c, 0x97, 0xf0, 0xf6, 0xe3, 0xdf, 0x68, 0x7e, 0x9c,
0x68, 0x17, 0x38, 0xc0, 0x07, 0xeb, 0x5c, 0xb2, 0xdc, 0xa7, 0x2a, 0x2d, 0xf7, 0x86, 0x3b, 0x8b,
0x62, 0xdc, 0x6d, 0x16, 0x7f, 0x98, 0x1b, 0x9e, 0x9d, 0x95, 0xe8, 0x1f, 0xe0, 0xf3, 0x7f, 0x02,
0x00, 0x00, 0xff, 0xff, 0x10, 0xcd, 0x98, 0x21, 0x68, 0x0e, 0x00, 0x00,
// 1653 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xef, 0x72, 0x1b, 0x49,
0x11, 0x67, 0x25, 0x59, 0x7f, 0x5a, 0x96, 0x93, 0x0c, 0xe1, 0x98, 0x13, 0xc7, 0xc5, 0xd9, 0xe4,
0x0e, 0x55, 0x1d, 0x25, 0xdf, 0xf9, 0x38, 0x72, 0x77, 0x09, 0x55, 0xd8, 0x92, 0x55, 0x16, 0x15,
0xff, 0x61, 0x95, 0xe4, 0x0a, 0xa8, 0xe2, 0x6a, 0x2d, 0x8d, 0xe5, 0x2d, 0xad, 0x76, 0xc4, 0xce,
0x48, 0xb6, 0xf9, 0xc4, 0x13, 0xf0, 0x0a, 0x7c, 0xa6, 0x78, 0x04, 0x3e, 0xf1, 0x0e, 0xbc, 0x07,
0x3c, 0x02, 0xd5, 0x3d, 0xb3, 0xd2, 0x2a, 0xd2, 0x2a, 0x71, 0xf1, 0x49, 0xd3, 0xbd, 0xbf, 0x5f,
0x77, 0x4f, 0x4f, 0x4f, 0xf7, 0xae, 0xe0, 0x7e, 0x5f, 0x46, 0x3a, 0x96, 0x61, 0x28, 0xe2, 0xe6,
0x24, 0x96, 0x5a, 0xb2, 0x87, 0x17, 0xd3, 0x20, 0x1c, 0xdc, 0x34, 0x53, 0x0f, 0x66, 0x5f, 0xd4,
0x9f, 0x0f, 0x03, 0x7d, 0x35, 0xbd, 0x68, 0xf6, 0xe5, 0x78, 0x6f, 0x2c, 0x2f, 0x6e, 0xf7, 0x08,
0x35, 0x0a, 0xf4, 0x9e, 0x3f, 0x09, 0xf6, 0x94, 0x88, 0x67, 0x41, 0x5f, 0xa8, 0x3d, 0x4b, 0x4a,
0x7e, 0x8d, 0x49, 0xf7, 0x8f, 0xb0, 0x7d, 0x88, 0x70, 0x4f, 0xfc, 0x69, 0x2a, 0x94, 0x66, 0xf7,
0x21, 0xef, 0x89, 0x4b, 0xee, 0xec, 0x3a, 0x8d, 0x8a, 0x87, 0x4b, 0xf6, 0x02, 0x4a, 0x67, 0x13,
0x1d, 0xc8, 0x48, 0xf1, 0xdc, 0xae, 0xd3, 0xa8, 0xee, 0xbb, 0xcd, 0x75, 0x61, 0x34, 0xc9, 0x8c,
0x45, 0x7a, 0x09, 0xc5, 0xfd, 0x1b, 0x58, 0x07, 0x56, 0xc1, 0x76, 0xa1, 0xda, 0x92, 0x91, 0x16,
0x37, 0xfa, 0xdc, 0xd7, 0x57, 0xd6, 0x51, 0x5a, 0xc5, 0x3e, 0x85, 0x9d, 0xb6, 0xec, 0x8f, 0x44,
0x7c, 0x19, 0x84, 0xe2, 0xd4, 0x1f, 0x0b, 0xf2, 0x5b, 0xf1, 0xde, 0xd2, 0xb2, 0x8f, 0xa0, 0x72,
0x1e, 0x07, 0x91, 0xee, 0x4c, 0xa3, 0x3e, 0xcf, 0x13, 0x64, 0xa1, 0x60, 0x7f, 0x80, 0x1a, 0xa2,
0x06, 0xd6, 0xb2, 0xe2, 0x85, 0xdd, 0x7c, 0xa3, 0xba, 0xff, 0xd5, 0xbb, 0x83, 0x6f, 0x2e, 0xf1,
0x8e, 0x22, 0x1d, 0xdf, 0x7a, 0xcb, 0xb6, 0xd8, 0x43, 0xd8, 0x3a, 0x08, 0x43, 0x79, 0xcd, 0xb7,
0x76, 0xf3, 0x8d, 0x8a, 0x67, 0x04, 0xc6, 0xa1, 0x74, 0xa0, 0xb5, 0x50, 0x5a, 0xf1, 0x22, 0xe9,
0x13, 0x91, 0x9d, 0x41, 0x85, 0x3c, 0x1c, 0xc4, 0x43, 0xc5, 0x4b, 0x14, 0xc8, 0x17, 0xef, 0x11,
0xc8, 0x9c, 0x63, 0x82, 0x58, 0xd8, 0x60, 0x47, 0x50, 0x69, 0xf9, 0xfd, 0x2b, 0xd1, 0x89, 0xe5,
0x98, 0x97, 0xc9, 0xe0, 0xcf, 0xd6, 0x1b, 0x24, 0x98, 0x35, 0x68, 0xcd, 0xcc, 0x99, 0xec, 0x00,
0x4a, 0x24, 0xbc, 0x92, 0xbc, 0x72, 0x37, 0x23, 0x09, 0x8f, 0xb9, 0xb0, 0xdd, 0x1a, 0xc6, 0x72,
0x3a, 0x39, 0xf7, 0x63, 0x11, 0x69, 0x0e, 0x74, 0x10, 0x4b, 0x3a, 0xf6, 0x1c, 0x4a, 0x47, 0x37,
0x13, 0x19, 0x6b, 0xc5, 0xab, 0xe4, 0xe6, 0xf1, 0x7a, 0x37, 0x06, 0x64, 0x1d, 0x58, 0x06, 0xfb,
0x18, 0xe0, 0xe8, 0x46, 0xc7, 0xfe, 0xb1, 0xc4, 0xc4, 0x6e, 0x53, 0x62, 0x53, 0x1a, 0x2c, 0xa8,
0xee, 0xd8, 0x1f, 0x8a, 0x6e, 0xbb, 0x13, 0x84, 0x82, 0xd7, 0x4c, 0x41, 0xa5, 0x54, 0xac, 0x03,
0xc5, 0x97, 0xfe, 0x85, 0x08, 0x15, 0xdf, 0x21, 0xef, 0xcd, 0xf7, 0x48, 0xbd, 0x21, 0x98, 0x50,
0x2c, 0x1b, 0x3d, 0x9d, 0x0a, 0x7d, 0x2d, 0xe3, 0xd1, 0x89, 0x1c, 0x08, 0x7e, 0xcf, 0x78, 0x4a,
0xa9, 0xd8, 0x53, 0xa8, 0x9d, 0x4a, 0x93, 0xde, 0x20, 0xd4, 0x22, 0xe6, 0xf7, 0x29, 0xdc, 0x65,
0x25, 0x15, 0x6e, 0xe8, 0xeb, 0x4b, 0x19, 0x8f, 0x15, 0x7f, 0x40, 0x88, 0x85, 0x02, 0x6b, 0xeb,
0xb7, 0xd3, 0x40, 0x68, 0xce, 0x76, 0x9d, 0x46, 0xd9, 0x33, 0x02, 0xfb, 0x25, 0x94, 0x7a, 0xa2,
0x1f, 0x0b, 0xad, 0xf8, 0x0f, 0x69, 0x13, 0x1f, 0xad, 0xdf, 0x84, 0x01, 0x79, 0x09, 0x18, 0x6b,
0xb2, 0x77, 0x35, 0xee, 0x05, 0x7f, 0x16, 0xfc, 0xe1, 0xae, 0xd3, 0xc8, 0x7b, 0x89, 0xc8, 0x3e,
0x83, 0x7c, 0xaf, 0x77, 0xcc, 0x7f, 0x44, 0xd6, 0x3e, 0xcc, 0xb0, 0xd6, 0x3b, 0xf6, 0x10, 0xc5,
0x18, 0x14, 0x5e, 0xf9, 0x43, 0xc5, 0x3f, 0xa0, 0x68, 0x69, 0xcd, 0x3e, 0x80, 0xe2, 0x2b, 0x3f,
0x1e, 0x0a, 0xcd, 0x7f, 0x4c, 0x99, 0xb0, 0x12, 0xfb, 0x06, 0x4a, 0xaf, 0xc3, 0x60, 0x1c, 0x68,
0xc5, 0x39, 0x35, 0x8c, 0x47, 0xeb, 0x8d, 0x1b, 0xd0, 0xd9, 0x44, 0x7b, 0x09, 0x9e, 0x3d, 0x83,
0xc2, 0xd9, 0x44, 0x2b, 0xfe, 0x21, 0xf1, 0x9e, 0x64, 0x14, 0xa3, 0x1c, 0x8f, 0x65, 0x94, 0x74,
0x1a, 0x22, 0xd4, 0x7f, 0x0d, 0x6c, 0xf5, 0xd6, 0x62, 0x33, 0x1b, 0x89, 0xdb, 0xa4, 0x99, 0x8d,
0xc4, 0x2d, 0x26, 0x77, 0xe6, 0x87, 0xd3, 0xa4, 0xa5, 0x18, 0xe1, 0xdb, 0xdc, 0xd7, 0x4e, 0xfd,
0x05, 0xec, 0x2c, 0x5f, 0xb7, 0x3b, 0xb1, 0xbf, 0x81, 0x6a, 0xaa, 0x62, 0xee, 0x42, 0x75, 0xff,
0xe5, 0x40, 0x35, 0x55, 0xf8, 0x94, 0xea, 0xdb, 0x89, 0xb0, 0x64, 0x5a, 0xb3, 0x43, 0xd8, 0x3a,
0xd0, 0x3a, 0xc6, 0x0e, 0x8c, 0xa7, 0xf5, 0xf3, 0x77, 0x5e, 0x9f, 0x26, 0xc1, 0x4d, 0xf9, 0x1a,
0x2a, 0x56, 0x6f, 0x5b, 0x28, 0x1d, 0x44, 0x3e, 0x26, 0xce, 0x36, 0xcc, 0xb4, 0xaa, 0xfe, 0x35,
0xc0, 0x82, 0x76, 0xa7, 0x3d, 0xfc, 0xc3, 0x81, 0x07, 0x2b, 0x3d, 0x62, 0xed, 0x4e, 0x8e, 0x97,
0x77, 0xb2, 0xff, 0x9e, 0xfd, 0x66, 0x75, 0x3f, 0xff, 0x47, 0xb4, 0xa6, 0xf2, 0xd9, 0x0e, 0xe4,
0xba, 0x6d, 0xcb, 0xc8, 0x75, 0xdb, 0x48, 0xc0, 0xf9, 0x63, 0x42, 0xab, 0x78, 0x46, 0x70, 0x3b,
0x50, 0x34, 0x77, 0x69, 0x05, 0x5f, 0x87, 0x32, 0xb6, 0x17, 0x1a, 0x63, 0xc6, 0xc7, 0x5c, 0xc6,
0x70, 0x8e, 0xa2, 0x99, 0x4d, 0x32, 0x2e, 0xdd, 0xbf, 0x3b, 0x50, 0x99, 0x57, 0x3c, 0x6b, 0x41,
0x91, 0xe2, 0x51, 0xdc, 0xa1, 0x3c, 0x7c, 0xf6, 0x8e, 0x2b, 0xd2, 0x7c, 0x43, 0x68, 0xdb, 0x8f,
0x0c, 0xb5, 0xfe, 0x1d, 0x54, 0x53, 0xea, 0x35, 0x29, 0xd8, 0x4f, 0xa7, 0x20, 0xb3, 0x65, 0x18,
0x27, 0xe9, 0x04, 0xb5, 0xa1, 0x68, 0x94, 0x78, 0x84, 0x34, 0x81, 0xed, 0x11, 0xd2, 0xdc, 0x65,
0x50, 0x38, 0xf6, 0xe3, 0x01, 0x19, 0xcd, 0x7b, 0xb4, 0x46, 0x5d, 0x4f, 0x5e, 0x6a, 0xda, 0x70,
0xde, 0xa3, 0xb5, 0xfb, 0x1f, 0x07, 0x6a, 0x4b, 0x77, 0x15, 0x9b, 0x11, 0xdd, 0x31, 0x11, 0x5b,
0x83, 0x89, 0x88, 0x53, 0xe4, 0x44, 0x68, 0x7f, 0xe0, 0x6b, 0x9f, 0xba, 0xb8, 0xc9, 0xe7, 0x92,
0x0e, 0xd9, 0xb6, 0x8f, 0x92, 0x9b, 0xb2, 0x97, 0x88, 0xe8, 0xfd, 0x7c, 0x1a, 0x86, 0xbc, 0x40,
0x6a, 0x5a, 0x9b, 0xb1, 0x81, 0xf7, 0xe1, 0x7c, 0xaa, 0xae, 0xf8, 0x16, 0x3d, 0x49, 0x69, 0x16,
0xcf, 0x5f, 0x4a, 0x7f, 0xc0, 0x8b, 0xe9, 0xe7, 0xa8, 0xa1, 0x1d, 0x1d, 0x9e, 0x9d, 0xf0, 0x92,
0xd9, 0x39, 0xae, 0x91, 0x73, 0x1e, 0xcb, 0x99, 0x88, 0xfc, 0xa8, 0x2f, 0x78, 0x99, 0x9e, 0xa4,
0x34, 0xee, 0x3d, 0xa8, 0xd9, 0x97, 0x29, 0x35, 0x91, 0x91, 0x12, 0xee, 0x27, 0xf0, 0xa0, 0x1d,
0xa8, 0xbe, 0x8c, 0x22, 0xd1, 0xd7, 0x99, 0xaf, 0x58, 0xee, 0x43, 0x60, 0x69, 0x98, 0x25, 0x3f,
0x82, 0xea, 0xcb, 0x40, 0x6d, 0xa0, 0xb9, 0xb0, 0x6d, 0x00, 0x86, 0x80, 0x21, 0x8f, 0xc4, 0xad,
0x29, 0xa9, 0x8a, 0x47, 0x6b, 0xf7, 0xaf, 0x0e, 0x6c, 0x77, 0xa3, 0xc9, 0x54, 0x9f, 0x08, 0xa5,
0xfc, 0xa1, 0x60, 0x2f, 0xa0, 0xd0, 0x8d, 0x02, 0x4d, 0x76, 0xaa, 0xfb, 0x9f, 0xae, 0x2f, 0x09,
0x62, 0x20, 0xcc, 0xb2, 0x8e, 0x7f, 0xe0, 0x11, 0x0b, 0x1b, 0x74, 0xdb, 0xd7, 0xbe, 0x2d, 0xa8,
0x8c, 0x31, 0x8e, 0x88, 0x14, 0x11, 0xc5, 0xc3, 0x12, 0x6c, 0x91, 0x51, 0xf7, 0x29, 0xdc, 0x7f,
0xdb, 0xfa, 0x9a, 0xad, 0x7d, 0x09, 0xd5, 0x94, 0x15, 0xba, 0x4e, 0x67, 0x1d, 0x02, 0x94, 0x3d,
0x5c, 0xe2, 0x5e, 0xe7, 0x81, 0x6c, 0x1b, 0x1f, 0x98, 0x7e, 0x32, 0x3d, 0xcf, 0xe0, 0x5f, 0x72,
0x50, 0x4a, 0x4c, 0x3c, 0x5b, 0xda, 0xf7, 0xe3, 0xac, 0x7d, 0xaf, 0x6e, 0xf9, 0x2b, 0x28, 0xcc,
0x4b, 0x32, 0x73, 0x96, 0x75, 0x06, 0x29, 0x1a, 0x55, 0xeb, 0xaf, 0xa0, 0xe8, 0x09, 0x85, 0x73,
0x37, 0xbf, 0x69, 0x98, 0x19, 0xcc, 0x82, 0x6c, 0x49, 0x48, 0xef, 0x05, 0xc3, 0xc8, 0x37, 0x45,
0x9d, 0x49, 0x37, 0x98, 0x14, 0xdd, 0x28, 0x16, 0xe9, 0x9e, 0x40, 0x75, 0x63, 0xa6, 0xd9, 0x19,
0xdc, 0xc3, 0xa1, 0xe9, 0x07, 0x91, 0x88, 0x5b, 0x32, 0xba, 0x0c, 0x86, 0x76, 0xa7, 0x9f, 0x64,
0x4d, 0xdf, 0x25, 0xb0, 0xf7, 0x36, 0xdb, 0xfd, 0xa7, 0xb3, 0x62, 0x91, 0x2e, 0x1b, 0xf6, 0xa8,
0x89, 0x0c, 0x22, 0x6d, 0xeb, 0x33, 0xa5, 0xc1, 0xb0, 0x5a, 0xe3, 0x81, 0x6d, 0xbc, 0xb8, 0x5c,
0x34, 0xd0, 0xbc, 0x6d, 0xa0, 0x78, 0xe2, 0xaf, 0x95, 0x88, 0x29, 0x1f, 0x15, 0x8f, 0xd6, 0xf8,
0x0a, 0x72, 0x2a, 0x49, 0x6b, 0x2e, 0xb8, 0x95, 0xc8, 0xde, 0xb5, 0xb9, 0xd5, 0x68, 0xef, 0x7a,
0x80, 0xcd, 0xfd, 0x54, 0xa2, 0xae, 0x64, 0xde, 0xaa, 0x48, 0x40, 0xdc, 0x2b, 0x7d, 0x4b, 0x37,
0xb9, 0xec, 0xe1, 0xd2, 0x3d, 0x80, 0xca, 0xfc, 0x2c, 0xb1, 0xe3, 0x77, 0x06, 0x94, 0xac, 0x9a,
0x97, 0xeb, 0x0c, 0x92, 0x32, 0xcc, 0xad, 0x96, 0x61, 0x3e, 0x55, 0x86, 0xcf, 0xa0, 0xb6, 0x74,
0xaa, 0x08, 0xf2, 0xe4, 0xb5, 0xb2, 0x86, 0x68, 0x8d, 0xba, 0x96, 0x0c, 0xcd, 0x27, 0x55, 0xcd,
0xa3, 0xb5, 0xfb, 0x04, 0x6a, 0x4b, 0xe7, 0xb9, 0xae, 0xfb, 0xba, 0x8f, 0xa1, 0xd6, 0xd3, 0xbe,
0x9e, 0xaa, 0xec, 0xbe, 0xf0, 0x5f, 0x07, 0x76, 0x12, 0x8c, 0x6d, 0x0d, 0xbf, 0x80, 0xf2, 0x4c,
0xc4, 0x5a, 0xdc, 0xcc, 0x27, 0x0e, 0x6f, 0xe2, 0xb7, 0x62, 0x33, 0xf9, 0x56, 0xc4, 0xa3, 0x7d,
0x43, 0x08, 0x6f, 0x8e, 0x64, 0xdf, 0x42, 0x59, 0x91, 0x1d, 0x91, 0xcc, 0xeb, 0x8f, 0xb3, 0x58,
0xd6, 0xdf, 0x1c, 0xcf, 0xf6, 0xa0, 0x10, 0xca, 0xa1, 0xa2, 0x13, 0xac, 0xee, 0xff, 0x24, 0x8b,
0xf7, 0x52, 0x0e, 0x3d, 0x02, 0xb2, 0xe7, 0x50, 0xbe, 0xf6, 0xe3, 0x28, 0x88, 0x86, 0xc9, 0xb7,
0xda, 0xa3, 0x2c, 0xd2, 0x77, 0x06, 0xe7, 0xcd, 0x09, 0x6e, 0x0d, 0xcb, 0xfc, 0x52, 0xda, 0x9c,
0xb8, 0xbf, 0xc3, 0xa6, 0x87, 0xa2, 0xdd, 0x7e, 0x17, 0x6a, 0xa6, 0x98, 0xdf, 0x88, 0x58, 0xe1,
0xdb, 0x8f, 0xb3, 0xe9, 0x52, 0x1d, 0xa6, 0xa1, 0xde, 0x32, 0xd3, 0xfd, 0xde, 0xf6, 0xf8, 0x44,
0x81, 0x63, 0x69, 0xe2, 0xf7, 0x47, 0xfe, 0x30, 0x39, 0xa7, 0x44, 0xc4, 0x27, 0x33, 0xeb, 0xcf,
0xcc, 0xb3, 0x44, 0xc4, 0x57, 0x87, 0x58, 0xcc, 0x02, 0xb5, 0x78, 0x11, 0x9b, 0xcb, 0xfb, 0xff,
0x2e, 0x00, 0xb4, 0xe6, 0xf1, 0xb0, 0x73, 0xd8, 0x22, 0x7f, 0x6c, 0xd3, 0x67, 0xb7, 0xdd, 0x77,
0xfd, 0xc9, 0x46, 0x8c, 0x4d, 0xc6, 0x6b, 0x28, 0x9a, 0xd3, 0x62, 0x59, 0x4d, 0x25, 0x5d, 0x5f,
0xf5, 0xa7, 0x9b, 0x41, 0xc6, 0xe8, 0xe7, 0x0e, 0xf3, 0x6c, 0xcb, 0xc9, 0x0a, 0x34, 0x3d, 0x85,
0xb2, 0x02, 0x5d, 0x6a, 0xdf, 0x0d, 0x87, 0xfd, 0x06, 0x8a, 0xdd, 0x68, 0x26, 0x47, 0x82, 0xfd,
0x74, 0x3d, 0x21, 0xb1, 0xb7, 0xf9, 0x71, 0xc3, 0xf9, 0xdc, 0x61, 0x27, 0x50, 0xc0, 0x69, 0xc9,
0x32, 0x5a, 0x7f, 0x6a, 0xd4, 0xd6, 0xdd, 0x4d, 0x10, 0x9b, 0xc5, 0xef, 0x01, 0x16, 0x33, 0x9b,
0x65, 0x7c, 0x37, 0xaf, 0x0c, 0xff, 0x7a, 0xe3, 0xdd, 0x40, 0xeb, 0xe0, 0x04, 0x07, 0xd6, 0xa5,
0x64, 0x99, 0xa3, 0x6a, 0x5e, 0xee, 0x75, 0x77, 0x13, 0xc4, 0x98, 0x3b, 0x2c, 0xfc, 0x3e, 0x37,
0xb9, 0xb8, 0x28, 0xd2, 0xbf, 0x3e, 0x5f, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x47, 0x50, 0x7d,
0xc5, 0x5c, 0x12, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

View File

@ -25,32 +25,54 @@ message BuildOptions {
string ContextPath = 1;
string DockerfileName = 2;
string PrintFunc = 3;
map<string, string> NamedContexts = 4;
repeated string Allow = 4;
repeated string Attests = 5; // TODO
repeated string BuildArgs = 6;
repeated string CacheFrom = 7;
repeated string CacheTo = 8;
string CgroupParent = 9;
repeated string Contexts = 10;
repeated string ExtraHosts = 11;
string ImageIDFile = 12;
repeated string Labels = 13;
string NetworkMode = 14;
repeated string NoCacheFilter = 15;
repeated string Outputs = 16;
repeated string Allow = 5;
repeated string Attests = 6; // TODO
map<string, string> BuildArgs = 7;
repeated CacheOptionsEntry CacheFrom = 8;
repeated CacheOptionsEntry CacheTo = 9;
string CgroupParent = 10;
repeated ExportEntry Exports = 11;
repeated string ExtraHosts = 12;
string ImageIDFile = 13;
map<string, string> Labels = 14;
string NetworkMode = 15;
repeated string NoCacheFilter = 16;
repeated string Platforms = 17;
bool Quiet = 18;
repeated string Secrets = 19;
repeated Secret Secrets = 19;
int64 ShmSize = 20;
repeated string SSH = 21;
repeated SSH SSH = 21;
repeated string Tags = 22;
string Target = 23;
UlimitOpt Ulimits = 24;
// string Invoke: provided via Invoke API
CommonOptions Opts = 25;
}
message ExportEntry {
string Type = 1;
map<string, string> Attrs = 2;
string Destination = 3;
}
message CacheOptionsEntry {
string Type = 1;
map<string, string> Attrs = 2;
}
message SSH {
string ID = 1;
repeated string Paths = 2;
}
message Secret {
string ID = 1;
string FilePath = 2;
string Env = 3;
}
message UlimitOpt {
map<string, Ulimit> values = 1;
}

View File

@ -1,66 +1,31 @@
package buildflags
package pb
import (
"encoding/csv"
"io"
"os"
"strconv"
"strings"
"github.com/containerd/console"
"github.com/moby/buildkit/client"
"github.com/pkg/errors"
)
func ParseOutputs(inp []string) ([]client.ExportEntry, error) {
func CreateExports(entries []*ExportEntry) ([]client.ExportEntry, error) {
var outs []client.ExportEntry
if len(inp) == 0 {
if len(entries) == 0 {
return nil, nil
}
for _, s := range inp {
csvReader := csv.NewReader(strings.NewReader(s))
fields, err := csvReader.Read()
if err != nil {
return nil, err
for _, entry := range entries {
if entry.Type == "" {
return nil, errors.Errorf("type is required for output")
}
out := client.ExportEntry{
Type: entry.Type,
Attrs: map[string]string{},
}
if len(fields) == 1 && fields[0] == s && !strings.HasPrefix(s, "type=") {
if s != "-" {
outs = append(outs, client.ExportEntry{
Type: client.ExporterLocal,
OutputDir: s,
})
continue
}
out = client.ExportEntry{
Type: client.ExporterTar,
Attrs: map[string]string{
"dest": s,
},
}
}
if out.Type == "" {
for _, field := range fields {
parts := strings.SplitN(field, "=", 2)
if len(parts) != 2 {
return nil, errors.Errorf("invalid value %s", field)
}
key := strings.TrimSpace(strings.ToLower(parts[0]))
value := parts[1]
switch key {
case "type":
out.Type = value
default:
out.Attrs[key] = value
}
}
}
if out.Type == "" {
return nil, errors.Errorf("type is required for output")
for k, v := range entry.Attrs {
out.Attrs[k] = v
}
supportFile := false
@ -79,56 +44,49 @@ func ParseOutputs(inp []string) ([]client.ExportEntry, error) {
supportDir = !tar
case "registry":
out.Type = client.ExporterImage
if _, ok := out.Attrs["push"]; !ok {
out.Attrs["push"] = "true"
}
}
dest, ok := out.Attrs["dest"]
if supportDir {
if !ok {
if entry.Destination == "" {
return nil, errors.Errorf("dest is required for %s exporter", out.Type)
}
if dest == "-" {
if entry.Destination == "-" {
return nil, errors.Errorf("dest cannot be stdout for %s exporter", out.Type)
}
fi, err := os.Stat(dest)
fi, err := os.Stat(entry.Destination)
if err != nil && !os.IsNotExist(err) {
return nil, errors.Wrapf(err, "invalid destination directory: %s", dest)
return nil, errors.Wrapf(err, "invalid destination directory: %s", entry.Destination)
}
if err == nil && !fi.IsDir() {
return nil, errors.Errorf("destination directory %s is a file", dest)
return nil, errors.Errorf("destination directory %s is a file", entry.Destination)
}
out.OutputDir = dest
out.OutputDir = entry.Destination
}
if supportFile {
if !ok && out.Type != client.ExporterDocker {
dest = "-"
if entry.Destination == "" && out.Type != client.ExporterDocker {
entry.Destination = "-"
}
if dest == "-" {
if entry.Destination == "-" {
if _, err := console.ConsoleFromFile(os.Stdout); err == nil {
return nil, errors.Errorf("dest file is required for %s exporter. refusing to write to console", out.Type)
}
out.Output = wrapWriteCloser(os.Stdout)
} else if dest != "" {
fi, err := os.Stat(dest)
} else if entry.Destination != "" {
fi, err := os.Stat(entry.Destination)
if err != nil && !os.IsNotExist(err) {
return nil, errors.Wrapf(err, "invalid destination file: %s", dest)
return nil, errors.Wrapf(err, "invalid destination file: %s", entry.Destination)
}
if err == nil && fi.IsDir() {
return nil, errors.Errorf("destination file %s is a directory", dest)
return nil, errors.Errorf("destination file %s is a directory", entry.Destination)
}
f, err := os.Create(dest)
f, err := os.Create(entry.Destination)
if err != nil {
return nil, errors.Errorf("failed to open %s", err)
}
out.Output = wrapWriteCloser(f)
}
}
if supportFile || supportDir {
delete(out.Attrs, "dest")
}
outs = append(outs, out)
}

22
controller/pb/secrets.go Normal file
View File

@ -0,0 +1,22 @@
package pb
import (
"github.com/moby/buildkit/session"
"github.com/moby/buildkit/session/secrets/secretsprovider"
)
func CreateSecrets(secrets []*Secret) (session.Attachable, error) {
fs := make([]secretsprovider.Source, 0, len(secrets))
for _, secret := range secrets {
fs = append(fs, secretsprovider.Source{
ID: secret.ID,
FilePath: secret.FilePath,
Env: secret.Env,
})
}
store, err := secretsprovider.NewStore(fs)
if err != nil {
return nil, err
}
return secretsprovider.NewSecretProvider(store), nil
}

18
controller/pb/ssh.go Normal file
View File

@ -0,0 +1,18 @@
package pb
import (
"github.com/moby/buildkit/session"
"github.com/moby/buildkit/session/sshforward/sshprovider"
)
func CreateSSH(ssh []*SSH) (session.Attachable, error) {
configs := make([]sshprovider.AgentConfig, 0, len(ssh))
for _, ssh := range ssh {
cfg := sshprovider.AgentConfig{
ID: ssh.ID,
Paths: append([]string{}, ssh.Paths...),
}
configs = append(configs, cfg)
}
return sshprovider.NewSSHAgentProvider(configs)
}

View File

@ -7,12 +7,12 @@ import (
"strings"
awsconfig "github.com/aws/aws-sdk-go-v2/config"
"github.com/moby/buildkit/client"
controllerapi "github.com/docker/buildx/controller/pb"
"github.com/pkg/errors"
)
func ParseCacheEntry(in []string) ([]client.CacheOptionsEntry, error) {
imports := make([]client.CacheOptionsEntry, 0, len(in))
func ParseCacheEntry(in []string) ([]*controllerapi.CacheOptionsEntry, error) {
outs := make([]*controllerapi.CacheOptionsEntry, 0, len(in))
for _, in := range in {
csvReader := csv.NewReader(strings.NewReader(in))
fields, err := csvReader.Read()
@ -21,14 +21,15 @@ func ParseCacheEntry(in []string) ([]client.CacheOptionsEntry, error) {
}
if isRefOnlyFormat(fields) {
for _, field := range fields {
imports = append(imports, client.CacheOptionsEntry{
outs = append(outs, &controllerapi.CacheOptionsEntry{
Type: "registry",
Attrs: map[string]string{"ref": field},
})
}
continue
}
im := client.CacheOptionsEntry{
out := controllerapi.CacheOptionsEntry{
Attrs: map[string]string{},
}
for _, field := range fields {
@ -40,21 +41,21 @@ func ParseCacheEntry(in []string) ([]client.CacheOptionsEntry, error) {
value := parts[1]
switch key {
case "type":
im.Type = value
out.Type = value
default:
im.Attrs[key] = value
out.Attrs[key] = value
}
}
if im.Type == "" {
if out.Type == "" {
return nil, errors.Errorf("type required form> %q", in)
}
if !addGithubToken(&im) {
if !addGithubToken(&out) {
continue
}
addAwsCredentials(&im)
imports = append(imports, im)
addAwsCredentials(&out)
outs = append(outs, &out)
}
return imports, nil
return outs, nil
}
func isRefOnlyFormat(in []string) bool {
@ -66,7 +67,7 @@ func isRefOnlyFormat(in []string) bool {
return true
}
func addGithubToken(ci *client.CacheOptionsEntry) bool {
func addGithubToken(ci *controllerapi.CacheOptionsEntry) bool {
if ci.Type != "gha" {
return true
}
@ -83,7 +84,7 @@ func addGithubToken(ci *client.CacheOptionsEntry) bool {
return ci.Attrs["token"] != "" && ci.Attrs["url"] != ""
}
func addAwsCredentials(ci *client.CacheOptionsEntry) {
func addAwsCredentials(ci *controllerapi.CacheOptionsEntry) {
if ci.Type != "s3" {
return
}

View File

@ -0,0 +1,28 @@
package buildflags
import (
"strings"
"github.com/docker/distribution/reference"
"github.com/pkg/errors"
)
func ParseContextNames(values []string) (map[string]string, error) {
if len(values) == 0 {
return nil, nil
}
result := make(map[string]string, len(values))
for _, value := range values {
kv := strings.SplitN(value, "=", 2)
if len(kv) != 2 {
return nil, errors.Errorf("invalid context value: %s, expected key=value", value)
}
named, err := reference.ParseNormalizedNamed(kv[0])
if err != nil {
return nil, errors.Wrapf(err, "invalid context name %s", kv[0])
}
name := strings.TrimSuffix(reference.FamiliarString(named), ":latest")
result[name] = kv[1]
}
return result, nil
}

76
util/buildflags/export.go Normal file
View File

@ -0,0 +1,76 @@
package buildflags
import (
"encoding/csv"
"strings"
controllerapi "github.com/docker/buildx/controller/pb"
"github.com/moby/buildkit/client"
"github.com/pkg/errors"
)
func ParseExports(inp []string) ([]*controllerapi.ExportEntry, error) {
var outs []*controllerapi.ExportEntry
if len(inp) == 0 {
return nil, nil
}
for _, s := range inp {
csvReader := csv.NewReader(strings.NewReader(s))
fields, err := csvReader.Read()
if err != nil {
return nil, err
}
out := controllerapi.ExportEntry{
Attrs: map[string]string{},
}
if len(fields) == 1 && fields[0] == s && !strings.HasPrefix(s, "type=") {
if s != "-" {
outs = append(outs, &controllerapi.ExportEntry{
Type: client.ExporterLocal,
Destination: s,
})
continue
}
out = controllerapi.ExportEntry{
Type: client.ExporterTar,
Destination: s,
}
}
if out.Type == "" {
for _, field := range fields {
parts := strings.SplitN(field, "=", 2)
if len(parts) != 2 {
return nil, errors.Errorf("invalid value %s", field)
}
key := strings.TrimSpace(strings.ToLower(parts[0]))
value := parts[1]
switch key {
case "type":
out.Type = value
default:
out.Attrs[key] = value
}
}
}
if out.Type == "" {
return nil, errors.Errorf("type is required for output")
}
if out.Type == "registry" {
out.Type = client.ExporterImage
if _, ok := out.Attrs["push"]; !ok {
out.Attrs["push"] = "true"
}
}
if dest, ok := out.Attrs["dest"]; ok {
out.Destination = dest
delete(out.Attrs, "dest")
}
outs = append(outs, &out)
}
return outs, nil
}

View File

@ -4,35 +4,30 @@ import (
"encoding/csv"
"strings"
"github.com/moby/buildkit/session"
"github.com/moby/buildkit/session/secrets/secretsprovider"
controllerapi "github.com/docker/buildx/controller/pb"
"github.com/pkg/errors"
)
func ParseSecretSpecs(sl []string) (session.Attachable, error) {
fs := make([]secretsprovider.Source, 0, len(sl))
func ParseSecretSpecs(sl []string) ([]*controllerapi.Secret, error) {
fs := make([]*controllerapi.Secret, 0, len(sl))
for _, v := range sl {
s, err := parseSecret(v)
if err != nil {
return nil, err
}
fs = append(fs, *s)
fs = append(fs, s)
}
store, err := secretsprovider.NewStore(fs)
if err != nil {
return nil, err
}
return secretsprovider.NewSecretProvider(store), nil
return fs, nil
}
func parseSecret(value string) (*secretsprovider.Source, error) {
func parseSecret(value string) (*controllerapi.Secret, error) {
csvReader := csv.NewReader(strings.NewReader(value))
fields, err := csvReader.Read()
if err != nil {
return nil, errors.Wrap(err, "failed to parse csv secret")
}
fs := secretsprovider.Source{}
fs := controllerapi.Secret{}
var typ string
for _, field := range fields {

View File

@ -3,32 +3,27 @@ package buildflags
import (
"strings"
"github.com/moby/buildkit/session"
"github.com/moby/buildkit/session/sshforward/sshprovider"
controllerapi "github.com/docker/buildx/controller/pb"
"github.com/moby/buildkit/util/gitutil"
)
func ParseSSHSpecs(sl []string) (session.Attachable, error) {
configs := make([]sshprovider.AgentConfig, 0, len(sl))
for _, v := range sl {
c, err := parseSSH(v)
if err != nil {
return nil, err
}
configs = append(configs, *c)
func ParseSSHSpecs(sl []string) ([]*controllerapi.SSH, error) {
var outs []*controllerapi.SSH
if len(sl) == 0 {
return nil, nil
}
return sshprovider.NewSSHAgentProvider(configs)
}
func parseSSH(value string) (*sshprovider.AgentConfig, error) {
parts := strings.SplitN(value, "=", 2)
cfg := sshprovider.AgentConfig{
ID: parts[0],
for _, s := range sl {
parts := strings.SplitN(s, "=", 2)
out := controllerapi.SSH{
ID: parts[0],
}
if len(parts) > 1 {
out.Paths = strings.Split(parts[1], ",")
}
outs = append(outs, &out)
}
if len(parts) > 1 {
cfg.Paths = strings.Split(parts[1], ",")
}
return &cfg, nil
return outs, nil
}
// IsGitSSH returns true if the given repo URL is accessed over ssh