diff --git a/bake/bake.go b/bake/bake.go index c3cf8ee5..2887297b 100644 --- a/bake/bake.go +++ b/bake/bake.go @@ -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) + secretAttachment, err := controllerapi.CreateSecrets(secrets) + if err != nil { + return nil, err + } + bo.Session = append(bo.Session, secretAttachment) - sshSpecs := t.SSH + sshSpecs, err := buildflags.ParseSSHSpecs(t.SSH) + if err != nil { + return nil, err + } if len(sshSpecs) == 0 && buildflags.IsGitSSH(contextPath) { - sshSpecs = []string{"default"} + sshSpecs = append(sshSpecs, &controllerapi.SSH{ID: "default"}) } - ssh, err := buildflags.ParseSSHSpecs(sshSpecs) + sshAttachment, err := controllerapi.CreateSSH(sshSpecs) if err != nil { return nil, err } - bo.Session = append(bo.Session, ssh) + 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 { diff --git a/build/build.go b/build/build.go index 1e2df04c..c3da32a9 100644 --- a/build/build.go +++ b/build/build.go @@ -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 diff --git a/commands/build.go b/commands/build.go index 9cf8334b..abc78879 100644 --- a/commands/build.go +++ b/commands/build.go @@ -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|[=|[,]]")`) + flags.StringArrayVar(&options.ssh, "ssh", []string{}, `SSH agent socket or keys to expose to the build (format: "default|[=|[,]]")`) - 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 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 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), +func dockerUlimitToControllerUlimit(u *dockeropts.UlimitOpt) *controllerapi.UlimitOpt { + if u == nil { + return nil } - for _, l := range u.org.GetList() { - du.Values[l.Name] = &controllerapi.Ulimit{ - Name: l.Name, - Hard: l.Hard, - Soft: l.Soft, + 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, } } - u.opt.Ulimits = du -} - -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() + return &controllerapi.UlimitOpt{Values: values} } diff --git a/controller/build/build.go b/controller/build/build.go index f9c659cc..10b28829 100644 --- a/controller/build/build.go +++ b/controller/build/build.go @@ -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 diff --git a/controller/pb/cache.go b/controller/pb/cache.go new file mode 100644 index 00000000..4b7c2b75 --- /dev/null +++ b/controller/pb/cache.go @@ -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 +} diff --git a/controller/pb/controller.pb.go b/controller/pb/controller.pb.go index 7641cfb1..252cc13f 100644 --- a/controller/pb/controller.pb.go +++ b/controller/pb/controller.pb.go @@ -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. diff --git a/controller/pb/controller.proto b/controller/pb/controller.proto index c8498125..8e19ee66 100644 --- a/controller/pb/controller.proto +++ b/controller/pb/controller.proto @@ -25,32 +25,54 @@ message BuildOptions { string ContextPath = 1; string DockerfileName = 2; string PrintFunc = 3; - - 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; + map NamedContexts = 4; + + repeated string Allow = 5; + repeated string Attests = 6; // TODO + map 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 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 Attrs = 2; + string Destination = 3; +} + +message CacheOptionsEntry { + string Type = 1; + map 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 values = 1; } diff --git a/util/buildflags/output.go b/controller/pb/export.go similarity index 56% rename from util/buildflags/output.go rename to controller/pb/export.go index fa1adfaa..93392a43 100644 --- a/util/buildflags/output.go +++ b/controller/pb/export.go @@ -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) } diff --git a/controller/pb/secrets.go b/controller/pb/secrets.go new file mode 100644 index 00000000..c85b55d1 --- /dev/null +++ b/controller/pb/secrets.go @@ -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 +} diff --git a/controller/pb/ssh.go b/controller/pb/ssh.go new file mode 100644 index 00000000..3d026ebb --- /dev/null +++ b/controller/pb/ssh.go @@ -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) +} diff --git a/util/buildflags/cache.go b/util/buildflags/cache.go index 9b44f66f..061614db 100644 --- a/util/buildflags/cache.go +++ b/util/buildflags/cache.go @@ -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 } diff --git a/util/buildflags/context.go b/util/buildflags/context.go new file mode 100644 index 00000000..e67fb97c --- /dev/null +++ b/util/buildflags/context.go @@ -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 +} diff --git a/util/buildflags/export.go b/util/buildflags/export.go new file mode 100644 index 00000000..8f1b73cf --- /dev/null +++ b/util/buildflags/export.go @@ -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 +} diff --git a/util/buildflags/secrets.go b/util/buildflags/secrets.go index 390f1476..25112085 100644 --- a/util/buildflags/secrets.go +++ b/util/buildflags/secrets.go @@ -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 { diff --git a/util/buildflags/ssh.go b/util/buildflags/ssh.go index bb9e1152..255f1117 100644 --- a/util/buildflags/ssh.go +++ b/util/buildflags/ssh.go @@ -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], - } - if len(parts) > 1 { - cfg.Paths = strings.Split(parts[1], ",") + 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) } - return &cfg, nil + return outs, nil } // IsGitSSH returns true if the given repo URL is accessed over ssh