vendor: github.com/moby/buildkit 6bd81372ad6f (master)

- tests: implement NetNSDetached method

full diff: 6e200afad5...6bd81372ad

Co-authored-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2024-01-18 00:46:45 +01:00
parent 528e3ba259
commit dbaad32f49
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
32 changed files with 945 additions and 351 deletions

4
go.mod
View File

@ -24,7 +24,7 @@ require (
github.com/google/uuid v1.5.0 github.com/google/uuid v1.5.0
github.com/hashicorp/go-cty-funcs v0.0.0-20230405223818-a090f58aa992 github.com/hashicorp/go-cty-funcs v0.0.0-20230405223818-a090f58aa992
github.com/hashicorp/hcl/v2 v2.19.1 github.com/hashicorp/hcl/v2 v2.19.1
github.com/moby/buildkit v0.13.0-beta1.0.20240105171016-6e200afad512 // master (v0.13.0-dev) github.com/moby/buildkit v0.13.0-beta1.0.20240126101002-6bd81372ad6f // master (v0.13.0-dev)
github.com/moby/sys/mountinfo v0.7.1 github.com/moby/sys/mountinfo v0.7.1
github.com/moby/sys/signal v0.7.0 github.com/moby/sys/signal v0.7.0
github.com/morikuni/aec v1.0.0 github.com/morikuni/aec v1.0.0
@ -89,7 +89,7 @@ require (
github.com/emicklei/go-restful/v3 v3.10.1 // indirect github.com/emicklei/go-restful/v3 v3.10.1 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fvbommel/sortorder v1.0.1 // indirect github.com/fvbommel/sortorder v1.0.1 // indirect
github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/logr v1.3.0 // indirect
github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.20.0 // indirect github.com/go-openapi/jsonreference v0.20.0 // indirect

12
go.sum
View File

@ -168,8 +168,8 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
@ -317,8 +317,8 @@ github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZX
github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/moby/buildkit v0.13.0-beta1.0.20240105171016-6e200afad512 h1:jbAJul+OeYr9/mGeNDQc9Q4hd58Z/FXCehQ27ooD8JI= github.com/moby/buildkit v0.13.0-beta1.0.20240126101002-6bd81372ad6f h1:weCt2sfZGVAeThzpVyv4ibC0oFfvSxtbiTE7W77wXpc=
github.com/moby/buildkit v0.13.0-beta1.0.20240105171016-6e200afad512/go.mod h1:9jtsOuy5EtZ13ArTt+RqH61qZ3Ik7kly25Qy4m0zSCk= github.com/moby/buildkit v0.13.0-beta1.0.20240126101002-6bd81372ad6f/go.mod h1:vEcIVw63dZyhTgbcyQWXlZrtrKnvFoSI8LhfV+Vj0Jg=
github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg=
github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk=
@ -455,8 +455,8 @@ github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk=
github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531 h1:Y/M5lygoNPKwVNLMPXgVfsRT40CSFKXCxuU8LoHySjs= github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531 h1:Y/M5lygoNPKwVNLMPXgVfsRT40CSFKXCxuU8LoHySjs=
github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc=
github.com/vbatts/tar-split v0.11.3 h1:hLFqsOLQ1SsppQNTMpkpPXClLDfC2A3Zgy9OUU+RVck= github.com/vbatts/tar-split v0.11.5 h1:3bHCTIheBm1qFTcgh9oPu+nNBtX+XJIupG/vacinCts=
github.com/vbatts/tar-split v0.11.3/go.mod h1:9QlHN18E+fEH7RdG+QAJJcuya3rqT7eXSTY7wGrAokY= github.com/vbatts/tar-split v0.11.5/go.mod h1:yZbwRsSeGjusneWgA781EKej9HF8vme8okylkAeNKLk=
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=

View File

@ -35,6 +35,10 @@ func (s *backend) Rootless() bool {
return false return false
} }
func (s *backend) NetNSDetached() bool {
return false
}
func (s backend) Supports(feature string) bool { func (s backend) Supports(feature string) bool {
if enabledFeatures := os.Getenv("BUILDKIT_TEST_ENABLE_FEATURES"); enabledFeatures != "" { if enabledFeatures := os.Getenv("BUILDKIT_TEST_ENABLE_FEATURES"); enabledFeatures != "" {
for _, enabledFeature := range strings.Split(enabledFeatures, ",") { for _, enabledFeature := range strings.Split(enabledFeatures, ",") {

View File

@ -37,6 +37,10 @@ func (w *containerWorker) Rootless() bool {
return false return false
} }
func (w *containerWorker) NetNSDetached() bool {
return false
}
func (w *containerWorker) New(ctx context.Context, cfg *integration.BackendConfig) (integration.Backend, func() error, error) { func (w *containerWorker) New(ctx context.Context, cfg *integration.BackendConfig) (integration.Backend, func() error, error) {
w.dockerOnce.Do(func() { w.dockerOnce.Do(func() {
w.docker, w.dockerClose, w.dockerErr = dockerWorker{id: w.id}.New(ctx, cfg) w.docker, w.dockerClose, w.dockerErr = dockerWorker{id: w.id}.New(ctx, cfg)

View File

@ -35,6 +35,10 @@ func (c dockerWorker) Rootless() bool {
return false return false
} }
func (c *dockerWorker) NetNSDetached() bool {
return false
}
func (c dockerWorker) New(ctx context.Context, cfg *integration.BackendConfig) (b integration.Backend, cl func() error, err error) { func (c dockerWorker) New(ctx context.Context, cfg *integration.BackendConfig) (b integration.Backend, cl func() error, err error) {
moby := bkworkers.Moby{ moby := bkworkers.Moby{
ID: c.id, ID: c.id,

View File

@ -30,6 +30,10 @@ func (w remoteWorker) Rootless() bool {
return false return false
} }
func (w remoteWorker) NetNSDetached() bool {
return false
}
func (w remoteWorker) New(ctx context.Context, cfg *integration.BackendConfig) (b integration.Backend, cl func() error, err error) { func (w remoteWorker) New(ctx context.Context, cfg *integration.BackendConfig) (b integration.Backend, cl func() error, err error) {
oci := bkworkers.OCI{ID: w.id} oci := bkworkers.OCI{ID: w.id}
bk, bkclose, err := oci.New(ctx, cfg) bk, bkclose, err := oci.New(ctx, cfg)

View File

@ -1,6 +1,7 @@
# A minimal logging API for Go # A minimal logging API for Go
[![Go Reference](https://pkg.go.dev/badge/github.com/go-logr/logr.svg)](https://pkg.go.dev/github.com/go-logr/logr) [![Go Reference](https://pkg.go.dev/badge/github.com/go-logr/logr.svg)](https://pkg.go.dev/github.com/go-logr/logr)
[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/go-logr/logr/badge)](https://securityscorecards.dev/viewer/?platform=github.com&org=go-logr&repo=logr)
logr offers an(other) opinion on how Go programs and libraries can do logging logr offers an(other) opinion on how Go programs and libraries can do logging
without becoming coupled to a particular logging implementation. This is not without becoming coupled to a particular logging implementation. This is not
@ -73,6 +74,29 @@ received:
If the Go standard library had defined an interface for logging, this project If the Go standard library had defined an interface for logging, this project
probably would not be needed. Alas, here we are. probably would not be needed. Alas, here we are.
When the Go developers started developing such an interface with
[slog](https://github.com/golang/go/issues/56345), they adopted some of the
logr design but also left out some parts and changed others:
| Feature | logr | slog |
|---------|------|------|
| High-level API | `Logger` (passed by value) | `Logger` (passed by [pointer](https://github.com/golang/go/issues/59126)) |
| Low-level API | `LogSink` | `Handler` |
| Stack unwinding | done by `LogSink` | done by `Logger` |
| Skipping helper functions | `WithCallDepth`, `WithCallStackHelper` | [not supported by Logger](https://github.com/golang/go/issues/59145) |
| Generating a value for logging on demand | `Marshaler` | `LogValuer` |
| Log levels | >= 0, higher meaning "less important" | positive and negative, with 0 for "info" and higher meaning "more important" |
| Error log entries | always logged, don't have a verbosity level | normal log entries with level >= `LevelError` |
| Passing logger via context | `NewContext`, `FromContext` | no API |
| Adding a name to a logger | `WithName` | no API |
| Modify verbosity of log entries in a call chain | `V` | no API |
| Grouping of key/value pairs | not supported | `WithGroup`, `GroupValue` |
The high-level slog API is explicitly meant to be one of many different APIs
that can be layered on top of a shared `slog.Handler`. logr is one such
alternative API, with [interoperability](#slog-interoperability) provided by the [`slogr`](slogr)
package.
### Inspiration ### Inspiration
Before you consider this package, please read [this blog post by the Before you consider this package, please read [this blog post by the
@ -118,6 +142,91 @@ There are implementations for the following logging libraries:
- **github.com/go-kit/log**: [gokitlogr](https://github.com/tonglil/gokitlogr) (also compatible with github.com/go-kit/kit/log since v0.12.0) - **github.com/go-kit/log**: [gokitlogr](https://github.com/tonglil/gokitlogr) (also compatible with github.com/go-kit/kit/log since v0.12.0)
- **bytes.Buffer** (writing to a buffer): [bufrlogr](https://github.com/tonglil/buflogr) (useful for ensuring values were logged, like during testing) - **bytes.Buffer** (writing to a buffer): [bufrlogr](https://github.com/tonglil/buflogr) (useful for ensuring values were logged, like during testing)
## slog interoperability
Interoperability goes both ways, using the `logr.Logger` API with a `slog.Handler`
and using the `slog.Logger` API with a `logr.LogSink`. [slogr](./slogr) provides `NewLogr` and
`NewSlogHandler` API calls to convert between a `logr.Logger` and a `slog.Handler`.
As usual, `slog.New` can be used to wrap such a `slog.Handler` in the high-level
slog API. `slogr` itself leaves that to the caller.
## Using a `logr.Sink` as backend for slog
Ideally, a logr sink implementation should support both logr and slog by
implementing both the normal logr interface(s) and `slogr.SlogSink`. Because
of a conflict in the parameters of the common `Enabled` method, it is [not
possible to implement both slog.Handler and logr.Sink in the same
type](https://github.com/golang/go/issues/59110).
If both are supported, log calls can go from the high-level APIs to the backend
without the need to convert parameters. `NewLogr` and `NewSlogHandler` can
convert back and forth without adding additional wrappers, with one exception:
when `Logger.V` was used to adjust the verbosity for a `slog.Handler`, then
`NewSlogHandler` has to use a wrapper which adjusts the verbosity for future
log calls.
Such an implementation should also support values that implement specific
interfaces from both packages for logging (`logr.Marshaler`, `slog.LogValuer`,
`slog.GroupValue`). logr does not convert those.
Not supporting slog has several drawbacks:
- Recording source code locations works correctly if the handler gets called
through `slog.Logger`, but may be wrong in other cases. That's because a
`logr.Sink` does its own stack unwinding instead of using the program counter
provided by the high-level API.
- slog levels <= 0 can be mapped to logr levels by negating the level without a
loss of information. But all slog levels > 0 (e.g. `slog.LevelWarning` as
used by `slog.Logger.Warn`) must be mapped to 0 before calling the sink
because logr does not support "more important than info" levels.
- The slog group concept is supported by prefixing each key in a key/value
pair with the group names, separated by a dot. For structured output like
JSON it would be better to group the key/value pairs inside an object.
- Special slog values and interfaces don't work as expected.
- The overhead is likely to be higher.
These drawbacks are severe enough that applications using a mixture of slog and
logr should switch to a different backend.
## Using a `slog.Handler` as backend for logr
Using a plain `slog.Handler` without support for logr works better than the
other direction:
- All logr verbosity levels can be mapped 1:1 to their corresponding slog level
by negating them.
- Stack unwinding is done by the `slogr.SlogSink` and the resulting program
counter is passed to the `slog.Handler`.
- Names added via `Logger.WithName` are gathered and recorded in an additional
attribute with `logger` as key and the names separated by slash as value.
- `Logger.Error` is turned into a log record with `slog.LevelError` as level
and an additional attribute with `err` as key, if an error was provided.
The main drawback is that `logr.Marshaler` will not be supported. Types should
ideally support both `logr.Marshaler` and `slog.Valuer`. If compatibility
with logr implementations without slog support is not important, then
`slog.Valuer` is sufficient.
## Context support for slog
Storing a logger in a `context.Context` is not supported by
slog. `logr.NewContext` and `logr.FromContext` can be used with slog like this
to fill this gap:
func HandlerFromContext(ctx context.Context) slog.Handler {
logger, err := logr.FromContext(ctx)
if err == nil {
return slogr.NewSlogHandler(logger)
}
return slog.Default().Handler()
}
func ContextWithHandler(ctx context.Context, handler slog.Handler) context.Context {
return logr.NewContext(ctx, slogr.NewLogr(handler))
}
The downside is that storing and retrieving a `slog.Handler` needs more
allocations compared to using a `logr.Logger`. Therefore the recommendation is
to use the `logr.Logger` API in code which uses contextual logging.
## FAQ ## FAQ
### Conceptual ### Conceptual
@ -241,7 +350,9 @@ Otherwise, you can start out with `0` as "you always want to see this",
Then gradually choose levels in between as you need them, working your way Then gradually choose levels in between as you need them, working your way
down from 10 (for debug and trace style logs) and up from 1 (for chattier down from 10 (for debug and trace style logs) and up from 1 (for chattier
info-type logs.) info-type logs). For reference, slog pre-defines -4 for debug logs
(corresponds to 4 in logr), which matches what is
[recommended for Kubernetes](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md#what-method-to-use).
#### How do I choose my keys? #### How do I choose my keys?

18
vendor/github.com/go-logr/logr/SECURITY.md generated vendored Normal file
View File

@ -0,0 +1,18 @@
# Security Policy
If you have discovered a security vulnerability in this project, please report it
privately. **Do not disclose it as a public issue.** This gives us time to work with you
to fix the issue before public exposure, reducing the chance that the exploit will be
used before a patch is released.
You may submit the report in the following ways:
- send an email to go-logr-security@googlegroups.com
- send us a [private vulnerability report](https://github.com/go-logr/logr/security/advisories/new)
Please provide the following information in your report:
- A description of the vulnerability and its impact
- How to reproduce the issue
We ask that you give us 90 days to work on a fix before public exposure.

View File

@ -116,17 +116,17 @@ type Options struct {
// Equivalent hooks are offered for key-value pairs saved via // Equivalent hooks are offered for key-value pairs saved via
// logr.Logger.WithValues or Formatter.AddValues (see RenderValuesHook) and // logr.Logger.WithValues or Formatter.AddValues (see RenderValuesHook) and
// for user-provided pairs (see RenderArgsHook). // for user-provided pairs (see RenderArgsHook).
RenderBuiltinsHook func(kvList []interface{}) []interface{} RenderBuiltinsHook func(kvList []any) []any
// RenderValuesHook is the same as RenderBuiltinsHook, except that it is // RenderValuesHook is the same as RenderBuiltinsHook, except that it is
// only called for key-value pairs saved via logr.Logger.WithValues. See // only called for key-value pairs saved via logr.Logger.WithValues. See
// RenderBuiltinsHook for more details. // RenderBuiltinsHook for more details.
RenderValuesHook func(kvList []interface{}) []interface{} RenderValuesHook func(kvList []any) []any
// RenderArgsHook is the same as RenderBuiltinsHook, except that it is only // RenderArgsHook is the same as RenderBuiltinsHook, except that it is only
// called for key-value pairs passed directly to Info and Error. See // called for key-value pairs passed directly to Info and Error. See
// RenderBuiltinsHook for more details. // RenderBuiltinsHook for more details.
RenderArgsHook func(kvList []interface{}) []interface{} RenderArgsHook func(kvList []any) []any
// MaxLogDepth tells funcr how many levels of nested fields (e.g. a struct // MaxLogDepth tells funcr how many levels of nested fields (e.g. a struct
// that contains a struct, etc.) it may log. Every time it finds a struct, // that contains a struct, etc.) it may log. Every time it finds a struct,
@ -163,7 +163,7 @@ func (l fnlogger) WithName(name string) logr.LogSink {
return &l return &l
} }
func (l fnlogger) WithValues(kvList ...interface{}) logr.LogSink { func (l fnlogger) WithValues(kvList ...any) logr.LogSink {
l.Formatter.AddValues(kvList) l.Formatter.AddValues(kvList)
return &l return &l
} }
@ -173,12 +173,12 @@ func (l fnlogger) WithCallDepth(depth int) logr.LogSink {
return &l return &l
} }
func (l fnlogger) Info(level int, msg string, kvList ...interface{}) { func (l fnlogger) Info(level int, msg string, kvList ...any) {
prefix, args := l.FormatInfo(level, msg, kvList) prefix, args := l.FormatInfo(level, msg, kvList)
l.write(prefix, args) l.write(prefix, args)
} }
func (l fnlogger) Error(err error, msg string, kvList ...interface{}) { func (l fnlogger) Error(err error, msg string, kvList ...any) {
prefix, args := l.FormatError(err, msg, kvList) prefix, args := l.FormatError(err, msg, kvList)
l.write(prefix, args) l.write(prefix, args)
} }
@ -229,7 +229,7 @@ func newFormatter(opts Options, outfmt outputFormat) Formatter {
type Formatter struct { type Formatter struct {
outputFormat outputFormat outputFormat outputFormat
prefix string prefix string
values []interface{} values []any
valuesStr string valuesStr string
depth int depth int
opts *Options opts *Options
@ -246,10 +246,10 @@ const (
) )
// PseudoStruct is a list of key-value pairs that gets logged as a struct. // PseudoStruct is a list of key-value pairs that gets logged as a struct.
type PseudoStruct []interface{} type PseudoStruct []any
// render produces a log line, ready to use. // render produces a log line, ready to use.
func (f Formatter) render(builtins, args []interface{}) string { func (f Formatter) render(builtins, args []any) string {
// Empirically bytes.Buffer is faster than strings.Builder for this. // Empirically bytes.Buffer is faster than strings.Builder for this.
buf := bytes.NewBuffer(make([]byte, 0, 1024)) buf := bytes.NewBuffer(make([]byte, 0, 1024))
if f.outputFormat == outputJSON { if f.outputFormat == outputJSON {
@ -292,7 +292,7 @@ func (f Formatter) render(builtins, args []interface{}) string {
// This function returns a potentially modified version of kvList, which // This function returns a potentially modified version of kvList, which
// ensures that there is a value for every key (adding a value if needed) and // ensures that there is a value for every key (adding a value if needed) and
// that each key is a string (substituting a key if needed). // that each key is a string (substituting a key if needed).
func (f Formatter) flatten(buf *bytes.Buffer, kvList []interface{}, continuing bool, escapeKeys bool) []interface{} { func (f Formatter) flatten(buf *bytes.Buffer, kvList []any, continuing bool, escapeKeys bool) []any {
// This logic overlaps with sanitize() but saves one type-cast per key, // This logic overlaps with sanitize() but saves one type-cast per key,
// which can be measurable. // which can be measurable.
if len(kvList)%2 != 0 { if len(kvList)%2 != 0 {
@ -334,7 +334,7 @@ func (f Formatter) flatten(buf *bytes.Buffer, kvList []interface{}, continuing b
return kvList return kvList
} }
func (f Formatter) pretty(value interface{}) string { func (f Formatter) pretty(value any) string {
return f.prettyWithFlags(value, 0, 0) return f.prettyWithFlags(value, 0, 0)
} }
@ -343,7 +343,7 @@ const (
) )
// TODO: This is not fast. Most of the overhead goes here. // TODO: This is not fast. Most of the overhead goes here.
func (f Formatter) prettyWithFlags(value interface{}, flags uint32, depth int) string { func (f Formatter) prettyWithFlags(value any, flags uint32, depth int) string {
if depth > f.opts.MaxLogDepth { if depth > f.opts.MaxLogDepth {
return `"<max-log-depth-exceeded>"` return `"<max-log-depth-exceeded>"`
} }
@ -614,7 +614,7 @@ func isEmpty(v reflect.Value) bool {
return false return false
} }
func invokeMarshaler(m logr.Marshaler) (ret interface{}) { func invokeMarshaler(m logr.Marshaler) (ret any) {
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
ret = fmt.Sprintf("<panic: %s>", r) ret = fmt.Sprintf("<panic: %s>", r)
@ -675,12 +675,12 @@ func (f Formatter) caller() Caller {
const noValue = "<no-value>" const noValue = "<no-value>"
func (f Formatter) nonStringKey(v interface{}) string { func (f Formatter) nonStringKey(v any) string {
return fmt.Sprintf("<non-string-key: %s>", f.snippet(v)) return fmt.Sprintf("<non-string-key: %s>", f.snippet(v))
} }
// snippet produces a short snippet string of an arbitrary value. // snippet produces a short snippet string of an arbitrary value.
func (f Formatter) snippet(v interface{}) string { func (f Formatter) snippet(v any) string {
const snipLen = 16 const snipLen = 16
snip := f.pretty(v) snip := f.pretty(v)
@ -693,7 +693,7 @@ func (f Formatter) snippet(v interface{}) string {
// sanitize ensures that a list of key-value pairs has a value for every key // sanitize ensures that a list of key-value pairs has a value for every key
// (adding a value if needed) and that each key is a string (substituting a key // (adding a value if needed) and that each key is a string (substituting a key
// if needed). // if needed).
func (f Formatter) sanitize(kvList []interface{}) []interface{} { func (f Formatter) sanitize(kvList []any) []any {
if len(kvList)%2 != 0 { if len(kvList)%2 != 0 {
kvList = append(kvList, noValue) kvList = append(kvList, noValue)
} }
@ -727,8 +727,8 @@ func (f Formatter) GetDepth() int {
// FormatInfo renders an Info log message into strings. The prefix will be // FormatInfo renders an Info log message into strings. The prefix will be
// empty when no names were set (via AddNames), or when the output is // empty when no names were set (via AddNames), or when the output is
// configured for JSON. // configured for JSON.
func (f Formatter) FormatInfo(level int, msg string, kvList []interface{}) (prefix, argsStr string) { func (f Formatter) FormatInfo(level int, msg string, kvList []any) (prefix, argsStr string) {
args := make([]interface{}, 0, 64) // using a constant here impacts perf args := make([]any, 0, 64) // using a constant here impacts perf
prefix = f.prefix prefix = f.prefix
if f.outputFormat == outputJSON { if f.outputFormat == outputJSON {
args = append(args, "logger", prefix) args = append(args, "logger", prefix)
@ -745,10 +745,10 @@ func (f Formatter) FormatInfo(level int, msg string, kvList []interface{}) (pref
} }
// FormatError renders an Error log message into strings. The prefix will be // FormatError renders an Error log message into strings. The prefix will be
// empty when no names were set (via AddNames), or when the output is // empty when no names were set (via AddNames), or when the output is
// configured for JSON. // configured for JSON.
func (f Formatter) FormatError(err error, msg string, kvList []interface{}) (prefix, argsStr string) { func (f Formatter) FormatError(err error, msg string, kvList []any) (prefix, argsStr string) {
args := make([]interface{}, 0, 64) // using a constant here impacts perf args := make([]any, 0, 64) // using a constant here impacts perf
prefix = f.prefix prefix = f.prefix
if f.outputFormat == outputJSON { if f.outputFormat == outputJSON {
args = append(args, "logger", prefix) args = append(args, "logger", prefix)
@ -761,12 +761,12 @@ func (f Formatter) FormatError(err error, msg string, kvList []interface{}) (pre
args = append(args, "caller", f.caller()) args = append(args, "caller", f.caller())
} }
args = append(args, "msg", msg) args = append(args, "msg", msg)
var loggableErr interface{} var loggableErr any
if err != nil { if err != nil {
loggableErr = err.Error() loggableErr = err.Error()
} }
args = append(args, "error", loggableErr) args = append(args, "error", loggableErr)
return f.prefix, f.render(args, kvList) return prefix, f.render(args, kvList)
} }
// AddName appends the specified name. funcr uses '/' characters to separate // AddName appends the specified name. funcr uses '/' characters to separate
@ -781,7 +781,7 @@ func (f *Formatter) AddName(name string) {
// AddValues adds key-value pairs to the set of saved values to be logged with // AddValues adds key-value pairs to the set of saved values to be logged with
// each log line. // each log line.
func (f *Formatter) AddValues(kvList []interface{}) { func (f *Formatter) AddValues(kvList []any) {
// Three slice args forces a copy. // Three slice args forces a copy.
n := len(f.values) n := len(f.values)
f.values = append(f.values[:n:n], kvList...) f.values = append(f.values[:n:n], kvList...)

View File

@ -127,9 +127,9 @@ limitations under the License.
// such a value can call its methods without having to check whether the // such a value can call its methods without having to check whether the
// instance is ready for use. // instance is ready for use.
// //
// Calling methods with the null logger (Logger{}) as instance will crash // The zero logger (= Logger{}) is identical to Discard() and discards all log
// because it has no LogSink. Therefore this null logger should never be passed // entries. Code that receives a Logger by value can simply call it, the methods
// around. For cases where passing a logger is optional, a pointer to Logger // will never crash. For cases where passing a logger is optional, a pointer to Logger
// should be used. // should be used.
// //
// # Key Naming Conventions // # Key Naming Conventions
@ -258,6 +258,12 @@ type Logger struct {
// Enabled tests whether this Logger is enabled. For example, commandline // Enabled tests whether this Logger is enabled. For example, commandline
// flags might be used to set the logging verbosity and disable some info logs. // flags might be used to set the logging verbosity and disable some info logs.
func (l Logger) Enabled() bool { func (l Logger) Enabled() bool {
// Some implementations of LogSink look at the caller in Enabled (e.g.
// different verbosity levels per package or file), but we only pass one
// CallDepth in (via Init). This means that all calls from Logger to the
// LogSink's Enabled, Info, and Error methods must have the same number of
// frames. In other words, Logger methods can't call other Logger methods
// which call these LogSink methods unless we do it the same in all paths.
return l.sink != nil && l.sink.Enabled(l.level) return l.sink != nil && l.sink.Enabled(l.level)
} }
@ -267,11 +273,11 @@ func (l Logger) Enabled() bool {
// line. The key/value pairs can then be used to add additional variable // line. The key/value pairs can then be used to add additional variable
// information. The key/value pairs must alternate string keys and arbitrary // information. The key/value pairs must alternate string keys and arbitrary
// values. // values.
func (l Logger) Info(msg string, keysAndValues ...interface{}) { func (l Logger) Info(msg string, keysAndValues ...any) {
if l.sink == nil { if l.sink == nil {
return return
} }
if l.Enabled() { if l.sink.Enabled(l.level) { // see comment in Enabled
if withHelper, ok := l.sink.(CallStackHelperLogSink); ok { if withHelper, ok := l.sink.(CallStackHelperLogSink); ok {
withHelper.GetCallStackHelper()() withHelper.GetCallStackHelper()()
} }
@ -289,7 +295,7 @@ func (l Logger) Info(msg string, keysAndValues ...interface{}) {
// while the err argument should be used to attach the actual error that // while the err argument should be used to attach the actual error that
// triggered this log line, if present. The err parameter is optional // triggered this log line, if present. The err parameter is optional
// and nil may be passed instead of an error instance. // and nil may be passed instead of an error instance.
func (l Logger) Error(err error, msg string, keysAndValues ...interface{}) { func (l Logger) Error(err error, msg string, keysAndValues ...any) {
if l.sink == nil { if l.sink == nil {
return return
} }
@ -314,9 +320,16 @@ func (l Logger) V(level int) Logger {
return l return l
} }
// GetV returns the verbosity level of the logger. If the logger's LogSink is
// nil as in the Discard logger, this will always return 0.
func (l Logger) GetV() int {
// 0 if l.sink nil because of the if check in V above.
return l.level
}
// WithValues returns a new Logger instance with additional key/value pairs. // WithValues returns a new Logger instance with additional key/value pairs.
// See Info for documentation on how key/value pairs work. // See Info for documentation on how key/value pairs work.
func (l Logger) WithValues(keysAndValues ...interface{}) Logger { func (l Logger) WithValues(keysAndValues ...any) Logger {
if l.sink == nil { if l.sink == nil {
return l return l
} }
@ -467,15 +480,15 @@ type LogSink interface {
// The level argument is provided for optional logging. This method will // The level argument is provided for optional logging. This method will
// only be called when Enabled(level) is true. See Logger.Info for more // only be called when Enabled(level) is true. See Logger.Info for more
// details. // details.
Info(level int, msg string, keysAndValues ...interface{}) Info(level int, msg string, keysAndValues ...any)
// Error logs an error, with the given message and key/value pairs as // Error logs an error, with the given message and key/value pairs as
// context. See Logger.Error for more details. // context. See Logger.Error for more details.
Error(err error, msg string, keysAndValues ...interface{}) Error(err error, msg string, keysAndValues ...any)
// WithValues returns a new LogSink with additional key/value pairs. See // WithValues returns a new LogSink with additional key/value pairs. See
// Logger.WithValues for more details. // Logger.WithValues for more details.
WithValues(keysAndValues ...interface{}) LogSink WithValues(keysAndValues ...any) LogSink
// WithName returns a new LogSink with the specified name appended. See // WithName returns a new LogSink with the specified name appended. See
// Logger.WithName for more details. // Logger.WithName for more details.
@ -546,5 +559,5 @@ type Marshaler interface {
// with exported fields // with exported fields
// //
// It may return any value of any type. // It may return any value of any type.
MarshalLog() interface{} MarshalLog() any
} }

View File

@ -367,21 +367,25 @@ func (m *UsageRecord) GetParents() []string {
} }
type SolveRequest struct { type SolveRequest struct {
Ref string `protobuf:"bytes,1,opt,name=Ref,proto3" json:"Ref,omitempty"` Ref string `protobuf:"bytes,1,opt,name=Ref,proto3" json:"Ref,omitempty"`
Definition *pb.Definition `protobuf:"bytes,2,opt,name=Definition,proto3" json:"Definition,omitempty"` Definition *pb.Definition `protobuf:"bytes,2,opt,name=Definition,proto3" json:"Definition,omitempty"`
Exporter string `protobuf:"bytes,3,opt,name=Exporter,proto3" json:"Exporter,omitempty"` // ExporterDeprecated and ExporterAttrsDeprecated are deprecated in favor
ExporterAttrs map[string]string `protobuf:"bytes,4,rep,name=ExporterAttrs,proto3" json:"ExporterAttrs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // of the new Exporters. If these fields are set, then they will be
Session string `protobuf:"bytes,5,opt,name=Session,proto3" json:"Session,omitempty"` // appended to the Exporters field if Exporters was not explicitly set.
Frontend string `protobuf:"bytes,6,opt,name=Frontend,proto3" json:"Frontend,omitempty"` ExporterDeprecated string `protobuf:"bytes,3,opt,name=ExporterDeprecated,proto3" json:"ExporterDeprecated,omitempty"`
FrontendAttrs map[string]string `protobuf:"bytes,7,rep,name=FrontendAttrs,proto3" json:"FrontendAttrs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` ExporterAttrsDeprecated map[string]string `protobuf:"bytes,4,rep,name=ExporterAttrsDeprecated,proto3" json:"ExporterAttrsDeprecated,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
Cache CacheOptions `protobuf:"bytes,8,opt,name=Cache,proto3" json:"Cache"` Session string `protobuf:"bytes,5,opt,name=Session,proto3" json:"Session,omitempty"`
Entitlements []github_com_moby_buildkit_util_entitlements.Entitlement `protobuf:"bytes,9,rep,name=Entitlements,proto3,customtype=github.com/moby/buildkit/util/entitlements.Entitlement" json:"Entitlements,omitempty"` Frontend string `protobuf:"bytes,6,opt,name=Frontend,proto3" json:"Frontend,omitempty"`
FrontendInputs map[string]*pb.Definition `protobuf:"bytes,10,rep,name=FrontendInputs,proto3" json:"FrontendInputs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` FrontendAttrs map[string]string `protobuf:"bytes,7,rep,name=FrontendAttrs,proto3" json:"FrontendAttrs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
Internal bool `protobuf:"varint,11,opt,name=Internal,proto3" json:"Internal,omitempty"` Cache CacheOptions `protobuf:"bytes,8,opt,name=Cache,proto3" json:"Cache"`
SourcePolicy *pb1.Policy `protobuf:"bytes,12,opt,name=SourcePolicy,proto3" json:"SourcePolicy,omitempty"` Entitlements []github_com_moby_buildkit_util_entitlements.Entitlement `protobuf:"bytes,9,rep,name=Entitlements,proto3,customtype=github.com/moby/buildkit/util/entitlements.Entitlement" json:"Entitlements,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` FrontendInputs map[string]*pb.Definition `protobuf:"bytes,10,rep,name=FrontendInputs,proto3" json:"FrontendInputs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
XXX_unrecognized []byte `json:"-"` Internal bool `protobuf:"varint,11,opt,name=Internal,proto3" json:"Internal,omitempty"`
XXX_sizecache int32 `json:"-"` SourcePolicy *pb1.Policy `protobuf:"bytes,12,opt,name=SourcePolicy,proto3" json:"SourcePolicy,omitempty"`
Exporters []*Exporter `protobuf:"bytes,13,rep,name=Exporters,proto3" json:"Exporters,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
} }
func (m *SolveRequest) Reset() { *m = SolveRequest{} } func (m *SolveRequest) Reset() { *m = SolveRequest{} }
@ -431,16 +435,16 @@ func (m *SolveRequest) GetDefinition() *pb.Definition {
return nil return nil
} }
func (m *SolveRequest) GetExporter() string { func (m *SolveRequest) GetExporterDeprecated() string {
if m != nil { if m != nil {
return m.Exporter return m.ExporterDeprecated
} }
return "" return ""
} }
func (m *SolveRequest) GetExporterAttrs() map[string]string { func (m *SolveRequest) GetExporterAttrsDeprecated() map[string]string {
if m != nil { if m != nil {
return m.ExporterAttrs return m.ExporterAttrsDeprecated
} }
return nil return nil
} }
@ -494,6 +498,13 @@ func (m *SolveRequest) GetSourcePolicy() *pb1.Policy {
return nil return nil
} }
func (m *SolveRequest) GetExporters() []*Exporter {
if m != nil {
return m.Exporters
}
return nil
}
type CacheOptions struct { type CacheOptions struct {
// ExportRefDeprecated is deprecated in favor or the new Exports since BuildKit v0.4.0. // ExportRefDeprecated is deprecated in favor or the new Exports since BuildKit v0.4.0.
// When ExportRefDeprecated is set, the solver appends // When ExportRefDeprecated is set, the solver appends
@ -1832,11 +1843,12 @@ func (m *Descriptor) GetAnnotations() map[string]string {
} }
type BuildResultInfo struct { type BuildResultInfo struct {
Result *Descriptor `protobuf:"bytes,1,opt,name=Result,proto3" json:"Result,omitempty"` ResultDeprecated *Descriptor `protobuf:"bytes,1,opt,name=ResultDeprecated,proto3" json:"ResultDeprecated,omitempty"`
Attestations []*Descriptor `protobuf:"bytes,2,rep,name=Attestations,proto3" json:"Attestations,omitempty"` Attestations []*Descriptor `protobuf:"bytes,2,rep,name=Attestations,proto3" json:"Attestations,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` Results map[int64]*Descriptor `protobuf:"bytes,3,rep,name=Results,proto3" json:"Results,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
XXX_unrecognized []byte `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
} }
func (m *BuildResultInfo) Reset() { *m = BuildResultInfo{} } func (m *BuildResultInfo) Reset() { *m = BuildResultInfo{} }
@ -1872,9 +1884,9 @@ func (m *BuildResultInfo) XXX_DiscardUnknown() {
var xxx_messageInfo_BuildResultInfo proto.InternalMessageInfo var xxx_messageInfo_BuildResultInfo proto.InternalMessageInfo
func (m *BuildResultInfo) GetResult() *Descriptor { func (m *BuildResultInfo) GetResultDeprecated() *Descriptor {
if m != nil { if m != nil {
return m.Result return m.ResultDeprecated
} }
return nil return nil
} }
@ -1886,8 +1898,18 @@ func (m *BuildResultInfo) GetAttestations() []*Descriptor {
return nil return nil
} }
func (m *BuildResultInfo) GetResults() map[int64]*Descriptor {
if m != nil {
return m.Results
}
return nil
}
// Exporter describes the output exporter
type Exporter struct { type Exporter struct {
Type string `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"` // Type identifies the exporter
Type string `protobuf:"bytes,1,opt,name=Type,proto3" json:"Type,omitempty"`
// Attrs specifies exporter configuration
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"` 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_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
@ -1948,7 +1970,7 @@ func init() {
proto.RegisterType((*DiskUsageResponse)(nil), "moby.buildkit.v1.DiskUsageResponse") proto.RegisterType((*DiskUsageResponse)(nil), "moby.buildkit.v1.DiskUsageResponse")
proto.RegisterType((*UsageRecord)(nil), "moby.buildkit.v1.UsageRecord") proto.RegisterType((*UsageRecord)(nil), "moby.buildkit.v1.UsageRecord")
proto.RegisterType((*SolveRequest)(nil), "moby.buildkit.v1.SolveRequest") proto.RegisterType((*SolveRequest)(nil), "moby.buildkit.v1.SolveRequest")
proto.RegisterMapType((map[string]string)(nil), "moby.buildkit.v1.SolveRequest.ExporterAttrsEntry") proto.RegisterMapType((map[string]string)(nil), "moby.buildkit.v1.SolveRequest.ExporterAttrsDeprecatedEntry")
proto.RegisterMapType((map[string]string)(nil), "moby.buildkit.v1.SolveRequest.FrontendAttrsEntry") proto.RegisterMapType((map[string]string)(nil), "moby.buildkit.v1.SolveRequest.FrontendAttrsEntry")
proto.RegisterMapType((map[string]*pb.Definition)(nil), "moby.buildkit.v1.SolveRequest.FrontendInputsEntry") proto.RegisterMapType((map[string]*pb.Definition)(nil), "moby.buildkit.v1.SolveRequest.FrontendInputsEntry")
proto.RegisterType((*CacheOptions)(nil), "moby.buildkit.v1.CacheOptions") proto.RegisterType((*CacheOptions)(nil), "moby.buildkit.v1.CacheOptions")
@ -1979,6 +2001,7 @@ func init() {
proto.RegisterType((*Descriptor)(nil), "moby.buildkit.v1.Descriptor") proto.RegisterType((*Descriptor)(nil), "moby.buildkit.v1.Descriptor")
proto.RegisterMapType((map[string]string)(nil), "moby.buildkit.v1.Descriptor.AnnotationsEntry") proto.RegisterMapType((map[string]string)(nil), "moby.buildkit.v1.Descriptor.AnnotationsEntry")
proto.RegisterType((*BuildResultInfo)(nil), "moby.buildkit.v1.BuildResultInfo") proto.RegisterType((*BuildResultInfo)(nil), "moby.buildkit.v1.BuildResultInfo")
proto.RegisterMapType((map[int64]*Descriptor)(nil), "moby.buildkit.v1.BuildResultInfo.ResultsEntry")
proto.RegisterType((*Exporter)(nil), "moby.buildkit.v1.Exporter") proto.RegisterType((*Exporter)(nil), "moby.buildkit.v1.Exporter")
proto.RegisterMapType((map[string]string)(nil), "moby.buildkit.v1.Exporter.AttrsEntry") proto.RegisterMapType((map[string]string)(nil), "moby.buildkit.v1.Exporter.AttrsEntry")
} }
@ -1986,149 +2009,152 @@ func init() {
func init() { proto.RegisterFile("control.proto", fileDescriptor_0c5120591600887d) } func init() { proto.RegisterFile("control.proto", fileDescriptor_0c5120591600887d) }
var fileDescriptor_0c5120591600887d = []byte{ var fileDescriptor_0c5120591600887d = []byte{
// 2260 bytes of a gzipped FileDescriptorProto // 2315 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0xcd, 0x6e, 0x1b, 0xc9, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0x4f, 0x73, 0x1b, 0x49,
0x11, 0xde, 0x21, 0x25, 0xfe, 0x14, 0x29, 0x59, 0x6a, 0x7b, 0x8d, 0xc9, 0xc4, 0x2b, 0xc9, 0xb3, 0x15, 0xcf, 0x48, 0xb2, 0x2c, 0x3d, 0xc9, 0x8e, 0xdc, 0xc9, 0x86, 0x61, 0xc8, 0xda, 0xce, 0x6c,
0x76, 0x22, 0x38, 0xf6, 0x50, 0xcb, 0xac, 0x63, 0xaf, 0x9c, 0x38, 0x16, 0x45, 0x66, 0x2d, 0xc7, 0x02, 0xae, 0x90, 0x8c, 0xbc, 0x82, 0x90, 0xac, 0x03, 0x21, 0xb6, 0x25, 0x36, 0x0e, 0x49, 0xc5,
0x82, 0xb5, 0x2d, 0x79, 0x0d, 0x2c, 0xe0, 0x04, 0x23, 0xb2, 0x45, 0x0f, 0x34, 0x9c, 0x99, 0x74, 0xdb, 0x76, 0x36, 0xd4, 0x56, 0x05, 0x6a, 0x2c, 0xb5, 0x95, 0x29, 0x8f, 0x66, 0x86, 0xee, 0x96,
0x37, 0xb5, 0xe6, 0x3e, 0x40, 0x80, 0xcd, 0x21, 0xc8, 0x25, 0xc8, 0x25, 0xf7, 0x9c, 0x72, 0xce, 0x37, 0xde, 0x13, 0x27, 0xaa, 0xb8, 0x50, 0x5c, 0x28, 0x2e, 0xdc, 0x39, 0x71, 0xe6, 0xcc, 0x81,
0x13, 0x04, 0xf0, 0x31, 0xe7, 0x3d, 0x38, 0x81, 0x1f, 0x20, 0xc8, 0x31, 0xb9, 0x05, 0xfd, 0x33, 0xaa, 0x1c, 0x39, 0xef, 0x21, 0x50, 0xf9, 0x00, 0x14, 0x47, 0xb8, 0x6d, 0xf5, 0x9f, 0x91, 0x46,
0xe4, 0x90, 0x33, 0x94, 0x28, 0xdb, 0x27, 0x76, 0x75, 0xd7, 0x57, 0x53, 0x55, 0x5d, 0x5d, 0x5d, 0x9a, 0x91, 0x2d, 0x25, 0x39, 0xa9, 0x5f, 0xf7, 0xfb, 0xbd, 0x79, 0xef, 0xf5, 0xeb, 0xd7, 0xef,
0xd5, 0x84, 0x85, 0x76, 0x18, 0x70, 0x1a, 0xfa, 0x4e, 0x44, 0x43, 0x1e, 0xa2, 0xa5, 0x5e, 0x78, 0xb5, 0x60, 0xa1, 0x1d, 0x06, 0x9c, 0x86, 0xbe, 0x13, 0xd1, 0x90, 0x87, 0xa8, 0xd6, 0x0b, 0x0f,
0x38, 0x70, 0x0e, 0xfb, 0x9e, 0xdf, 0x39, 0xf6, 0xb8, 0x73, 0xf2, 0x89, 0x55, 0xef, 0x7a, 0xfc, 0x4e, 0x9c, 0x83, 0xbe, 0xe7, 0x77, 0x8e, 0x3c, 0xee, 0x1c, 0x7f, 0x6c, 0x35, 0xba, 0x1e, 0x7f,
0x45, 0xff, 0xd0, 0x69, 0x87, 0xbd, 0x5a, 0x37, 0xec, 0x86, 0xb5, 0x6e, 0x18, 0x76, 0x7d, 0xe2, 0xd1, 0x3f, 0x70, 0xda, 0x61, 0xaf, 0xde, 0x0d, 0xbb, 0x61, 0xbd, 0x1b, 0x86, 0x5d, 0x9f, 0xb8,
0x46, 0x1e, 0xd3, 0xc3, 0x1a, 0x8d, 0xda, 0x35, 0xc6, 0x5d, 0xde, 0x67, 0x4a, 0x8a, 0x75, 0x6b, 0x91, 0xc7, 0xf4, 0xb0, 0x4e, 0xa3, 0x76, 0x9d, 0x71, 0x97, 0xf7, 0x99, 0x92, 0x62, 0xdd, 0x1c,
0x12, 0x23, 0xa7, 0x0f, 0xfb, 0x47, 0x92, 0x92, 0x84, 0x1c, 0x69, 0xf6, 0x5a, 0x82, 0x5d, 0x7c, 0xc7, 0xc8, 0xe9, 0x83, 0xfe, 0xa1, 0xa4, 0x24, 0x21, 0x47, 0x9a, 0xbd, 0x9e, 0x60, 0x17, 0xdf,
0xbf, 0x16, 0x7f, 0xbf, 0xe6, 0x46, 0x5e, 0x8d, 0x0f, 0x22, 0xc2, 0x6a, 0x5f, 0x87, 0xf4, 0x98, 0xaf, 0xc7, 0xdf, 0xaf, 0xbb, 0x91, 0x57, 0xe7, 0x27, 0x11, 0x61, 0xf5, 0x2f, 0x43, 0x7a, 0x44,
0x50, 0x0d, 0xb8, 0x39, 0x15, 0xc0, 0x42, 0xff, 0x84, 0xd0, 0x5a, 0x74, 0x58, 0x0b, 0xa3, 0x58, 0xa8, 0x06, 0xdc, 0x98, 0x08, 0x60, 0xa1, 0x7f, 0x4c, 0x68, 0x3d, 0x3a, 0xa8, 0x87, 0x51, 0xac,
0x9b, 0xdb, 0xa7, 0x70, 0xf7, 0x69, 0x9b, 0x44, 0xa1, 0xef, 0xb5, 0x07, 0x02, 0xa3, 0x46, 0x1a, 0xcd, 0xad, 0x53, 0xb8, 0xfb, 0xb4, 0x4d, 0xa2, 0xd0, 0xf7, 0xda, 0x27, 0x02, 0xa3, 0x46, 0x1a,
0xb6, 0xaa, 0xad, 0x1b, 0xea, 0xce, 0xbd, 0x1e, 0x61, 0xdc, 0xed, 0x45, 0x8a, 0xc1, 0xfe, 0xad, 0xb6, 0xa2, 0xad, 0x1b, 0xe8, 0xce, 0xbd, 0x1e, 0x61, 0xdc, 0xed, 0x45, 0x8a, 0xc1, 0xfe, 0xad,
0x01, 0xd5, 0x3d, 0xda, 0x0f, 0x08, 0x26, 0xbf, 0xe9, 0x13, 0xc6, 0xd1, 0x65, 0x28, 0x1c, 0x79, 0x01, 0xd5, 0x5d, 0xda, 0x0f, 0x08, 0x26, 0xbf, 0xee, 0x13, 0xc6, 0xd1, 0x25, 0x28, 0x1e, 0x7a,
0x3e, 0x27, 0xd4, 0x34, 0xd6, 0xf2, 0xeb, 0x65, 0xac, 0x29, 0xb4, 0x04, 0x79, 0xd7, 0xf7, 0xcd, 0x3e, 0x27, 0xd4, 0x34, 0x56, 0xf3, 0x6b, 0x65, 0xac, 0x29, 0x54, 0x83, 0xbc, 0xeb, 0xfb, 0x66,
0xdc, 0x9a, 0xb1, 0x5e, 0xc2, 0x62, 0x88, 0xd6, 0xa1, 0x7a, 0x4c, 0x48, 0xd4, 0xec, 0x53, 0x97, 0x6e, 0xd5, 0x58, 0x2b, 0x61, 0x31, 0x44, 0x6b, 0x50, 0x3d, 0x22, 0x24, 0x6a, 0xf6, 0xa9, 0xcb,
0x7b, 0x61, 0x60, 0xe6, 0xd7, 0x8c, 0xf5, 0x7c, 0x63, 0xee, 0xd5, 0xeb, 0x55, 0x03, 0x8f, 0xad, 0xbd, 0x30, 0x30, 0xf3, 0xab, 0xc6, 0x5a, 0x7e, 0xab, 0xf0, 0xea, 0xf5, 0x8a, 0x81, 0x47, 0x56,
0x20, 0x1b, 0xca, 0x82, 0x6e, 0x0c, 0x38, 0x61, 0xe6, 0x5c, 0x82, 0x6d, 0x34, 0x6d, 0xdf, 0x80, 0x90, 0x0d, 0x65, 0x41, 0x6f, 0x9d, 0x70, 0xc2, 0xcc, 0x42, 0x82, 0x6d, 0x38, 0x6d, 0x5f, 0x87,
0xa5, 0xa6, 0xc7, 0x8e, 0x9f, 0x32, 0xb7, 0x7b, 0x96, 0x2e, 0xf6, 0x23, 0x58, 0x4e, 0xf0, 0xb2, 0x5a, 0xd3, 0x63, 0x47, 0x4f, 0x99, 0xdb, 0x3d, 0x4b, 0x17, 0xfb, 0x21, 0x2c, 0x25, 0x78, 0x59,
0x28, 0x0c, 0x18, 0x41, 0xb7, 0xa1, 0x40, 0x49, 0x3b, 0xa4, 0x1d, 0xc9, 0x5c, 0xa9, 0x7f, 0xe4, 0x14, 0x06, 0x8c, 0xa0, 0x5b, 0x50, 0xa4, 0xa4, 0x1d, 0xd2, 0x8e, 0x64, 0xae, 0x34, 0x3e, 0x74,
0x4c, 0x86, 0x81, 0xa3, 0x01, 0x82, 0x09, 0x6b, 0x66, 0xfb, 0x4f, 0x79, 0xa8, 0x24, 0xe6, 0xd1, 0xc6, 0xc3, 0xc0, 0xd1, 0x00, 0xc1, 0x84, 0x35, 0xb3, 0xfd, 0xa7, 0x3c, 0x54, 0x12, 0xf3, 0x68,
0x22, 0xe4, 0x76, 0x9a, 0xa6, 0xb1, 0x66, 0xac, 0x97, 0x71, 0x6e, 0xa7, 0x89, 0x4c, 0x28, 0xee, 0x11, 0x72, 0x3b, 0x4d, 0xd3, 0x58, 0x35, 0xd6, 0xca, 0x38, 0xb7, 0xd3, 0x44, 0x26, 0xcc, 0x3f,
0xf6, 0xb9, 0x7b, 0xe8, 0x13, 0x6d, 0x7b, 0x4c, 0xa2, 0x4b, 0x30, 0xbf, 0x13, 0x3c, 0x65, 0x44, 0xee, 0x73, 0xf7, 0xc0, 0x27, 0xda, 0xf6, 0x98, 0x44, 0x17, 0x61, 0x6e, 0x27, 0x78, 0xca, 0x88,
0x1a, 0x5e, 0xc2, 0x8a, 0x40, 0x08, 0xe6, 0xf6, 0xbd, 0x6f, 0x88, 0x32, 0x13, 0xcb, 0x31, 0xb2, 0x34, 0xbc, 0x84, 0x15, 0x81, 0x10, 0x14, 0xf6, 0xbc, 0xaf, 0x88, 0x32, 0x13, 0xcb, 0x31, 0xb2,
0xa0, 0xb0, 0xe7, 0x52, 0x12, 0x70, 0x73, 0x5e, 0xc8, 0x6d, 0xe4, 0x4c, 0x03, 0xeb, 0x19, 0xd4, 0xa0, 0xb8, 0xeb, 0x52, 0x12, 0x70, 0x73, 0x4e, 0xc8, 0xdd, 0xca, 0x99, 0x06, 0xd6, 0x33, 0x68,
0x80, 0xf2, 0x36, 0x25, 0x2e, 0x27, 0x9d, 0x2d, 0x6e, 0x16, 0xd6, 0x8c, 0xf5, 0x4a, 0xdd, 0x72, 0x0b, 0xca, 0xdb, 0x94, 0xb8, 0x9c, 0x74, 0x36, 0xb9, 0x59, 0x5c, 0x35, 0xd6, 0x2a, 0x0d, 0xcb,
0xd4, 0xae, 0x39, 0xf1, 0xae, 0x39, 0x07, 0xf1, 0xae, 0x35, 0x4a, 0xaf, 0x5e, 0xaf, 0x7e, 0xf0, 0x51, 0xbb, 0xe6, 0xc4, 0xbb, 0xe6, 0xec, 0xc7, 0xbb, 0xb6, 0x55, 0x7a, 0xf5, 0x7a, 0xe5, 0xdc,
0x87, 0x7f, 0x0a, 0xdf, 0x0d, 0x61, 0xe8, 0x01, 0xc0, 0x63, 0x97, 0xf1, 0xa7, 0x4c, 0x0a, 0x29, 0x1f, 0xfe, 0x25, 0x7c, 0x37, 0x80, 0xa1, 0xfb, 0x00, 0x8f, 0x5c, 0xc6, 0x9f, 0x32, 0x29, 0x64,
0x9e, 0x29, 0x64, 0x4e, 0x0a, 0x48, 0x60, 0xd0, 0x0a, 0x80, 0x74, 0xc2, 0x76, 0xd8, 0x0f, 0xb8, 0xfe, 0x4c, 0x21, 0x05, 0x29, 0x20, 0x81, 0x41, 0xcb, 0x00, 0xd2, 0x09, 0xdb, 0x61, 0x3f, 0xe0,
0x59, 0x92, 0xba, 0x27, 0x66, 0xd0, 0x1a, 0x54, 0x9a, 0x84, 0xb5, 0xa9, 0x17, 0xc9, 0xad, 0x2e, 0x66, 0x49, 0xea, 0x9e, 0x98, 0x41, 0xab, 0x50, 0x69, 0x12, 0xd6, 0xa6, 0x5e, 0x24, 0xb7, 0xba,
0x4b, 0xf7, 0x24, 0xa7, 0x84, 0x04, 0xe5, 0xc1, 0x83, 0x41, 0x44, 0x4c, 0x90, 0x0c, 0x89, 0x19, 0x2c, 0xdd, 0x93, 0x9c, 0x12, 0x12, 0x94, 0x07, 0xf7, 0x4f, 0x22, 0x62, 0x82, 0x64, 0x48, 0xcc,
0xb1, 0x97, 0xfb, 0x2f, 0x5c, 0x4a, 0x3a, 0x66, 0x45, 0xba, 0x4b, 0x53, 0xc2, 0xbf, 0xca, 0x13, 0x88, 0xbd, 0xdc, 0x7b, 0xe1, 0x52, 0xd2, 0x31, 0x2b, 0xd2, 0x5d, 0x9a, 0x12, 0xfe, 0x55, 0x9e,
0xcc, 0xac, 0xca, 0x4d, 0x8e, 0x49, 0xfb, 0x77, 0x45, 0xa8, 0xee, 0x8b, 0xa3, 0x10, 0x87, 0xc3, 0x60, 0x66, 0x55, 0x6e, 0x72, 0x4c, 0xda, 0xbf, 0x29, 0x41, 0x75, 0x4f, 0x1c, 0x85, 0x38, 0x1c,
0x12, 0xe4, 0x31, 0x39, 0xd2, 0x7b, 0x23, 0x86, 0xc8, 0x01, 0x68, 0x92, 0x23, 0x2f, 0xf0, 0xa4, 0x6a, 0x90, 0xc7, 0xe4, 0x50, 0xef, 0x8d, 0x18, 0x22, 0x07, 0xa0, 0x49, 0x0e, 0xbd, 0xc0, 0x93,
0x56, 0x39, 0x69, 0xf8, 0xa2, 0x13, 0x1d, 0x3a, 0xa3, 0x59, 0x9c, 0xe0, 0x40, 0x16, 0x94, 0x5a, 0x5a, 0xe5, 0xa4, 0xe1, 0x8b, 0x4e, 0x74, 0xe0, 0x0c, 0x67, 0x71, 0x82, 0x03, 0x39, 0x80, 0x5a,
0x2f, 0xa3, 0x90, 0x8a, 0x90, 0xca, 0x4b, 0x31, 0x43, 0x1a, 0x3d, 0x83, 0x85, 0x78, 0xbc, 0xc5, 0x2f, 0xa3, 0x90, 0x72, 0x42, 0x9b, 0x24, 0xa2, 0xa4, 0x2d, 0x1c, 0x28, 0xf7, 0xaf, 0x8c, 0x33,
0x39, 0x15, 0x81, 0x2a, 0xc2, 0xe8, 0x93, 0x74, 0x18, 0x25, 0x95, 0x72, 0xc6, 0x30, 0xad, 0x80, 0x56, 0x50, 0x1f, 0xbe, 0x15, 0xcf, 0x6e, 0x72, 0x4e, 0x59, 0x02, 0x54, 0x90, 0x41, 0x76, 0x37,
0xd3, 0x01, 0x1e, 0x97, 0x23, 0x2c, 0xdc, 0x27, 0x8c, 0x09, 0x0d, 0xe5, 0xf6, 0xe3, 0x98, 0x14, 0x1d, 0x64, 0x49, 0x95, 0x9d, 0x09, 0xe8, 0x56, 0xc0, 0xe9, 0x09, 0x9e, 0x24, 0x5b, 0xf8, 0x64,
0xea, 0xfc, 0x82, 0x86, 0x01, 0x27, 0x41, 0x47, 0x6e, 0x7d, 0x19, 0x0f, 0x69, 0xa1, 0x4e, 0x3c, 0x8f, 0x30, 0x26, 0x6c, 0x92, 0x01, 0x83, 0x63, 0x12, 0x59, 0x50, 0xfa, 0x19, 0x0d, 0x03, 0x4e,
0x56, 0xea, 0x14, 0x67, 0x52, 0x67, 0x0c, 0xa3, 0xd5, 0x19, 0x9b, 0x43, 0x9b, 0x30, 0xbf, 0xed, 0x82, 0x8e, 0x0c, 0x96, 0x32, 0x1e, 0xd0, 0xe8, 0x19, 0x2c, 0xc4, 0x63, 0x29, 0xd0, 0x9c, 0x97,
0xb6, 0x5f, 0x10, 0xb9, 0xcb, 0x95, 0xfa, 0x4a, 0x5a, 0xa0, 0x5c, 0x7e, 0x22, 0xb7, 0x95, 0xc9, 0x2a, 0x7e, 0x7c, 0x86, 0x8a, 0x23, 0x18, 0xa5, 0xd8, 0xa8, 0x1c, 0xb4, 0x01, 0x73, 0xdb, 0x6e,
0x83, 0xfa, 0x01, 0x56, 0x10, 0xf4, 0x2b, 0xa8, 0xb6, 0x02, 0xee, 0x71, 0x9f, 0xf4, 0xe4, 0x8e, 0xfb, 0x05, 0x91, 0x71, 0x51, 0x69, 0x2c, 0xa7, 0x05, 0xca, 0xe5, 0x27, 0x32, 0x10, 0x98, 0x3c,
0x95, 0xc5, 0x8e, 0x35, 0x36, 0xbf, 0x7b, 0xbd, 0xfa, 0x93, 0xa9, 0xf9, 0xa9, 0xcf, 0x3d, 0xbf, 0xda, 0xe7, 0xb0, 0x82, 0xa0, 0x5f, 0x42, 0xb5, 0x15, 0x70, 0x8f, 0xfb, 0xa4, 0x27, 0xf7, 0xb8,
0x46, 0x12, 0x28, 0x27, 0x21, 0x02, 0x8f, 0xc9, 0x43, 0x5f, 0xc1, 0x62, 0xac, 0xec, 0x4e, 0x10, 0x2c, 0xf6, 0x78, 0x6b, 0xe3, 0xeb, 0xd7, 0x2b, 0x3f, 0x9a, 0x98, 0xd1, 0xfa, 0xdc, 0xf3, 0xeb,
0xf5, 0x39, 0x33, 0x41, 0x5a, 0x5d, 0x9f, 0xd1, 0x6a, 0x05, 0x52, 0x66, 0x4f, 0x48, 0x12, 0xce, 0x24, 0x81, 0x72, 0x12, 0x22, 0xf0, 0x88, 0x3c, 0xf4, 0x05, 0x2c, 0xc6, 0xca, 0xee, 0x04, 0x51,
0xde, 0x09, 0x38, 0xa1, 0x81, 0xeb, 0xeb, 0x10, 0x1c, 0xd2, 0x68, 0x47, 0x44, 0x9a, 0x48, 0xa3, 0x9f, 0x33, 0x13, 0xa4, 0xd5, 0x8d, 0x29, 0xad, 0x56, 0x20, 0x65, 0xf6, 0x98, 0x24, 0xe1, 0xec,
0x7b, 0x32, 0x79, 0x9a, 0x55, 0xe9, 0x9a, 0xeb, 0xe9, 0xaf, 0x26, 0x93, 0xad, 0xa3, 0x98, 0xf1, 0x9d, 0x80, 0x13, 0x1a, 0xb8, 0xbe, 0x0e, 0xda, 0x01, 0x8d, 0x76, 0x44, 0x6c, 0x8a, 0xc4, 0xbb,
0x18, 0xd4, 0x7a, 0x00, 0x28, 0x1d, 0x12, 0x22, 0x74, 0x8f, 0xc9, 0x20, 0x0e, 0xdd, 0x63, 0x32, 0x2b, 0xd3, 0xad, 0x59, 0x95, 0xae, 0xb9, 0x96, 0xfe, 0x6a, 0x32, 0x3d, 0x3b, 0x8a, 0x19, 0x8f,
0x10, 0xd9, 0xe3, 0xc4, 0xf5, 0xfb, 0x2a, 0xab, 0x94, 0xb1, 0x22, 0x36, 0x73, 0x77, 0x0d, 0x21, 0x40, 0xd1, 0x1d, 0x28, 0xc7, 0x81, 0xc0, 0xcc, 0x05, 0xa9, 0xbd, 0x95, 0x96, 0x13, 0xb3, 0xe0,
0x21, 0xbd, 0x8b, 0xe7, 0x92, 0xf0, 0x05, 0x5c, 0xcc, 0xf0, 0x48, 0x86, 0x88, 0x6b, 0x49, 0x11, 0x21, 0xb3, 0xf5, 0x10, 0x2e, 0x9f, 0x16, 0x60, 0xe2, 0xc0, 0x1c, 0x91, 0x93, 0xf8, 0xc0, 0x1c,
0xe9, 0xa3, 0x33, 0x12, 0x69, 0xff, 0x35, 0x0f, 0xd5, 0x64, 0x5c, 0xa0, 0x0d, 0xb8, 0xa8, 0xec, 0x91, 0x13, 0x91, 0xb3, 0x8e, 0x5d, 0xbf, 0xaf, 0x72, 0x59, 0x19, 0x2b, 0x62, 0x23, 0x77, 0xc7,
0xc4, 0xe4, 0xa8, 0x49, 0x22, 0x4a, 0xda, 0x22, 0x19, 0x69, 0xe1, 0x59, 0x4b, 0xa8, 0x0e, 0x97, 0xb0, 0xee, 0x03, 0x4a, 0x47, 0xc2, 0x4c, 0x12, 0x3e, 0x83, 0x0b, 0x19, 0x5e, 0xcd, 0x10, 0x71,
0x76, 0x7a, 0x7a, 0x9a, 0x25, 0x20, 0x39, 0x79, 0xec, 0x33, 0xd7, 0x50, 0x08, 0x1f, 0x2a, 0x51, 0x35, 0x29, 0x22, 0x7d, 0x60, 0x87, 0x22, 0xed, 0xbf, 0xe6, 0xa1, 0x9a, 0x8c, 0x2d, 0xb4, 0x0e,
0xd2, 0x13, 0x09, 0x50, 0x5e, 0xc6, 0xc5, 0x67, 0xa7, 0x07, 0xaf, 0x93, 0x89, 0x55, 0xe1, 0x91, 0x17, 0x94, 0xc5, 0x98, 0x1c, 0x26, 0x0e, 0xa3, 0x12, 0x9e, 0xb5, 0x84, 0x1a, 0x70, 0x71, 0xa7,
0x2d, 0x17, 0xfd, 0x0c, 0x8a, 0x6a, 0x21, 0x3e, 0xff, 0x1f, 0x9f, 0xfe, 0x09, 0x25, 0x2c, 0xc6, 0xa7, 0xa7, 0x93, 0xe7, 0x37, 0x27, 0x93, 0x4d, 0xe6, 0x1a, 0x0a, 0xe1, 0x03, 0x25, 0x6a, 0xfc,
0x08, 0xb8, 0xb2, 0x83, 0x99, 0xf3, 0xe7, 0x80, 0x6b, 0x8c, 0xf5, 0x10, 0xac, 0xe9, 0x2a, 0x9f, 0xd0, 0xe7, 0xe5, 0xee, 0x7c, 0x72, 0xfa, 0x01, 0x70, 0x32, 0xb1, 0x2a, 0xc4, 0xb2, 0xe5, 0xa2,
0x27, 0x04, 0xec, 0xbf, 0x18, 0xb0, 0x9c, 0xfa, 0x90, 0xb8, 0x9c, 0x64, 0x7a, 0x56, 0x22, 0xe4, 0x9f, 0xc0, 0xbc, 0x5a, 0x60, 0x3a, 0xaf, 0x7c, 0x74, 0xfa, 0x27, 0x94, 0xb0, 0x18, 0x23, 0xe0,
0x18, 0x35, 0x61, 0x5e, 0x25, 0x98, 0x9c, 0x54, 0xd8, 0x99, 0x41, 0x61, 0x27, 0x91, 0x5d, 0x14, 0xca, 0x0e, 0x66, 0xce, 0xcd, 0x00, 0xd7, 0x18, 0xeb, 0x01, 0x58, 0x93, 0x55, 0x9e, 0x25, 0x04,
0xd8, 0xba, 0x0b, 0xf0, 0x76, 0xc1, 0x6a, 0xff, 0xcd, 0x80, 0x05, 0x7d, 0x98, 0xf5, 0x4d, 0xee, 0xec, 0xbf, 0x18, 0xb0, 0x94, 0xfa, 0x90, 0xb8, 0x12, 0xe5, 0xa5, 0xa0, 0x44, 0xc8, 0x31, 0x6a,
0xc2, 0x52, 0x7c, 0x84, 0xe2, 0x39, 0x7d, 0xa7, 0xdf, 0x9e, 0x9a, 0x07, 0x14, 0x9b, 0x33, 0x89, 0xc2, 0x9c, 0x4a, 0x52, 0x39, 0xa9, 0xb0, 0x33, 0x85, 0xc2, 0x4e, 0x22, 0x43, 0x29, 0xb0, 0x75,
0x53, 0x3a, 0xa6, 0xc4, 0x59, 0xdb, 0x71, 0x5c, 0x4d, 0xb0, 0x9e, 0x4b, 0xf3, 0xab, 0xb0, 0xb0, 0x07, 0xe0, 0xed, 0x82, 0xd5, 0xfe, 0x9b, 0x01, 0x0b, 0x3a, 0x21, 0xe8, 0xfa, 0xc1, 0x85, 0xda,
0x2f, 0x2b, 0xc6, 0xa9, 0x17, 0x94, 0xfd, 0x1f, 0x03, 0x16, 0x63, 0x1e, 0x6d, 0xdd, 0xa7, 0x50, 0xe0, 0x8c, 0xe9, 0x39, 0x5d, 0x49, 0xdc, 0x9a, 0x98, 0x4b, 0x14, 0x9b, 0x33, 0x8e, 0x53, 0x3a,
0x3a, 0x21, 0x94, 0x93, 0x97, 0x84, 0x69, 0xab, 0xcc, 0xb4, 0x55, 0x5f, 0x4a, 0x0e, 0x3c, 0xe4, 0xa6, 0xc4, 0x59, 0xdb, 0x71, 0x5c, 0x8d, 0xb1, 0xce, 0xa4, 0xf9, 0x15, 0x58, 0xd8, 0x93, 0x75,
0x44, 0x9b, 0x50, 0x52, 0xd5, 0x29, 0x89, 0x37, 0x6a, 0x65, 0x1a, 0x4a, 0x7f, 0x6f, 0xc8, 0x8f, 0xea, 0xc4, 0x6b, 0xd1, 0xfe, 0xaf, 0x01, 0x8b, 0x31, 0x8f, 0xb6, 0xee, 0x87, 0x50, 0x3a, 0x26,
0x6a, 0x30, 0xe7, 0x87, 0x5d, 0xa6, 0xcf, 0xcc, 0xf7, 0xa7, 0xe1, 0x1e, 0x87, 0x5d, 0x2c, 0x19, 0x94, 0x93, 0x97, 0x84, 0x69, 0xab, 0xcc, 0xb4, 0x55, 0x9f, 0x4b, 0x0e, 0x3c, 0xe0, 0x44, 0x1b,
0xd1, 0x3d, 0x28, 0x7d, 0xed, 0xd2, 0xc0, 0x0b, 0xba, 0xf1, 0x29, 0x58, 0x9d, 0x06, 0x7a, 0xa6, 0x50, 0x52, 0x35, 0x31, 0x89, 0x37, 0x6a, 0x79, 0x12, 0x4a, 0x7f, 0x6f, 0xc0, 0x8f, 0xea, 0x50,
0xf8, 0xf0, 0x10, 0x20, 0x0a, 0xaa, 0x82, 0x5a, 0x43, 0x8f, 0xa0, 0xd0, 0xf1, 0xba, 0x84, 0x71, 0xf0, 0xc3, 0x2e, 0xd3, 0x67, 0xe6, 0x3b, 0x93, 0x70, 0x8f, 0xc2, 0x2e, 0x96, 0x8c, 0xe8, 0x2e,
0xe5, 0x92, 0x46, 0x5d, 0xdc, 0x25, 0xdf, 0xbd, 0x5e, 0xbd, 0x91, 0xb8, 0x2c, 0xc2, 0x88, 0x04, 0x94, 0xbe, 0x74, 0x69, 0xe0, 0x05, 0xdd, 0xf8, 0x14, 0xac, 0x4c, 0x02, 0x3d, 0x53, 0x7c, 0x78,
0xa2, 0x7c, 0x77, 0xbd, 0x80, 0x50, 0x51, 0x8d, 0xdf, 0x52, 0x10, 0xa7, 0x29, 0x7f, 0xb0, 0x96, 0x00, 0x10, 0x65, 0x5c, 0x51, 0xad, 0xa1, 0x87, 0x50, 0xec, 0x78, 0x5d, 0xc2, 0xb8, 0x72, 0xc9,
0x20, 0x64, 0x79, 0xea, 0x4a, 0x90, 0xf9, 0xe2, 0xed, 0x64, 0x29, 0x09, 0xe2, 0x18, 0x04, 0x6e, 0x56, 0x43, 0xdc, 0x47, 0x5f, 0xbf, 0x5e, 0xb9, 0x9e, 0xb8, 0x70, 0xc2, 0x88, 0x04, 0xa2, 0x69,
0x8f, 0xe8, 0x12, 0x40, 0x8e, 0x45, 0x7d, 0xd2, 0x16, 0x71, 0xde, 0x91, 0x95, 0x5b, 0x09, 0x6b, 0x70, 0xbd, 0x80, 0x50, 0xd1, 0x03, 0xdc, 0x54, 0x10, 0xa7, 0x29, 0x7f, 0xb0, 0x96, 0x20, 0x64,
0x0a, 0x6d, 0x42, 0x91, 0x71, 0x97, 0x8a, 0x9c, 0x33, 0x3f, 0x63, 0x61, 0x15, 0x03, 0xd0, 0x7d, 0x79, 0xea, 0x5a, 0x91, 0xf9, 0xe2, 0xed, 0x64, 0x29, 0x09, 0xe2, 0x18, 0x04, 0x6e, 0x8f, 0xe8,
0x28, 0xb7, 0xc3, 0x5e, 0xe4, 0x13, 0x81, 0x2e, 0xcc, 0x88, 0x1e, 0x41, 0x44, 0xe8, 0x11, 0x4a, 0x72, 0x43, 0x8e, 0x45, 0x55, 0xd4, 0x16, 0x71, 0xde, 0x91, 0xf5, 0x62, 0x09, 0x6b, 0x0a, 0x6d,
0x43, 0x2a, 0x4b, 0xba, 0x32, 0x56, 0x04, 0xba, 0x03, 0x0b, 0x11, 0x0d, 0xbb, 0x94, 0x30, 0xf6, 0xc0, 0x3c, 0xe3, 0x2e, 0x15, 0x39, 0x67, 0x6e, 0xca, 0x72, 0x2e, 0x06, 0xa0, 0x7b, 0x50, 0x6e,
0x39, 0x0d, 0xfb, 0x91, 0xbe, 0xc8, 0x97, 0x45, 0xf2, 0xde, 0x4b, 0x2e, 0xe0, 0x71, 0x3e, 0xfb, 0x87, 0xbd, 0xc8, 0x27, 0x02, 0x5d, 0x9c, 0x12, 0x3d, 0x84, 0x88, 0xd0, 0x23, 0x94, 0x86, 0x54,
0xdf, 0x39, 0xa8, 0x26, 0x43, 0x24, 0x55, 0xeb, 0x3e, 0x82, 0x82, 0x0a, 0x38, 0x15, 0xeb, 0x6f, 0x16, 0x92, 0x65, 0xac, 0x08, 0x74, 0x1b, 0x16, 0x22, 0x1a, 0x76, 0x29, 0x61, 0xec, 0x53, 0x1a,
0xe7, 0x63, 0x25, 0x21, 0xd3, 0xc7, 0x26, 0x14, 0xdb, 0x7d, 0x2a, 0x0b, 0x61, 0x55, 0x1e, 0xc7, 0xf6, 0x23, 0x5d, 0x0c, 0x2c, 0x89, 0xe4, 0xbd, 0x9b, 0x5c, 0xc0, 0xa3, 0x7c, 0xf6, 0x7f, 0x72,
0xa4, 0xb0, 0x94, 0x87, 0xdc, 0xf5, 0xa5, 0x8f, 0xf3, 0x58, 0x11, 0xa2, 0x36, 0x1e, 0xf6, 0x2b, 0x50, 0x4d, 0x86, 0x48, 0xaa, 0xc2, 0x7e, 0x08, 0x45, 0x15, 0x70, 0x2a, 0xd6, 0xdf, 0xce, 0xc7,
0xe7, 0xab, 0x8d, 0x87, 0xb0, 0xe4, 0xfe, 0x15, 0xdf, 0x69, 0xff, 0x4a, 0xe7, 0xde, 0x3f, 0xfb, 0x4a, 0x42, 0xa6, 0x8f, 0x4d, 0x98, 0x6f, 0xf7, 0xa9, 0x2c, 0xbf, 0x55, 0x51, 0x1e, 0x93, 0xc2,
0xef, 0x06, 0x94, 0x87, 0x67, 0x2b, 0xe1, 0x5d, 0xe3, 0x9d, 0xbd, 0x3b, 0xe6, 0x99, 0xdc, 0xdb, 0x52, 0x1e, 0x72, 0xd7, 0x97, 0x3e, 0xce, 0x63, 0x45, 0x88, 0x8a, 0x7c, 0xd0, 0x25, 0xcd, 0x56,
0x79, 0xe6, 0x32, 0x14, 0x18, 0xa7, 0xc4, 0xed, 0xa9, 0xce, 0x0d, 0x6b, 0x4a, 0x64, 0xb1, 0x1e, 0x91, 0x0f, 0x60, 0xc9, 0xfd, 0x9b, 0x7f, 0xa7, 0xfd, 0x2b, 0xcd, 0xbc, 0x7f, 0xf6, 0x3f, 0x0c,
0xeb, 0xca, 0x1d, 0xaa, 0x62, 0x31, 0xb4, 0xff, 0x6b, 0xc0, 0xc2, 0xd8, 0x71, 0x7f, 0xaf, 0xb6, 0x28, 0x0f, 0xce, 0x56, 0xc2, 0xbb, 0xc6, 0x3b, 0x7b, 0x77, 0xc4, 0x33, 0xb9, 0xb7, 0xf3, 0xcc,
0x5c, 0x82, 0x79, 0x9f, 0x9c, 0x10, 0xd5, 0x5b, 0xe6, 0xb1, 0x22, 0xc4, 0x2c, 0x7b, 0x11, 0x52, 0x25, 0x28, 0x32, 0x4e, 0x89, 0xdb, 0x53, 0xfd, 0x22, 0xd6, 0x94, 0xc8, 0x62, 0x3d, 0xd6, 0x95,
0x2e, 0x95, 0xab, 0x62, 0x45, 0x08, 0x9d, 0x3b, 0x84, 0xbb, 0x9e, 0x2f, 0xf3, 0x52, 0x15, 0x6b, 0x3b, 0x54, 0xc5, 0x62, 0x68, 0xff, 0xcf, 0x80, 0x85, 0x91, 0xe3, 0xfe, 0x5e, 0x6d, 0xb9, 0x08,
0x4a, 0xe8, 0xdc, 0xa7, 0xbe, 0xae, 0xaf, 0xc5, 0x10, 0xd9, 0x30, 0xe7, 0x05, 0x47, 0xa1, 0x0e, 0x73, 0x3e, 0x39, 0x26, 0xaa, 0xa3, 0xcd, 0x63, 0x45, 0x88, 0x59, 0xf6, 0x22, 0xa4, 0x5c, 0x2a,
0x1b, 0x59, 0xd9, 0xa8, 0x3a, 0x6d, 0x27, 0x38, 0x0a, 0xb1, 0x5c, 0x43, 0x57, 0xa1, 0x40, 0xdd, 0x57, 0xc5, 0x8a, 0x10, 0x3a, 0x77, 0x08, 0x77, 0x3d, 0x5f, 0xe6, 0xa5, 0x2a, 0xd6, 0x94, 0xd0,
0xa0, 0x4b, 0xe2, 0xe2, 0xba, 0x2c, 0xb8, 0xb0, 0x98, 0xc1, 0x7a, 0xc1, 0xb6, 0xa1, 0x2a, 0xfb, 0xb9, 0x4f, 0x7d, 0x5d, 0xa3, 0x8b, 0x21, 0xb2, 0xa1, 0xe0, 0x05, 0x87, 0xa1, 0x0e, 0x1b, 0x59,
0xd3, 0x5d, 0xc2, 0x44, 0x37, 0x24, 0xc2, 0xba, 0xe3, 0x72, 0x57, 0x9a, 0x5d, 0xc5, 0x72, 0x6c, 0xd9, 0xa8, 0x5a, 0x6f, 0x27, 0x38, 0x0c, 0xb1, 0x5c, 0x43, 0x57, 0xa0, 0x48, 0xdd, 0xa0, 0x4b,
0xdf, 0x04, 0xf4, 0xd8, 0x63, 0xfc, 0x99, 0xec, 0xee, 0xd9, 0x59, 0xcd, 0xeb, 0x3e, 0x5c, 0x1c, 0xe2, 0x02, 0xbd, 0x2c, 0xb8, 0xb0, 0x98, 0xc1, 0x7a, 0xc1, 0xb6, 0xa1, 0x2a, 0xbb, 0xe2, 0xc7,
0xe3, 0xd6, 0xd7, 0xc2, 0x4f, 0x27, 0xda, 0xd7, 0x6b, 0xe9, 0x8c, 0x2b, 0x1f, 0x11, 0x1c, 0x05, 0x84, 0x89, 0x1e, 0x4c, 0x84, 0x75, 0xc7, 0xe5, 0xae, 0x34, 0xbb, 0x8a, 0xe5, 0xd8, 0xbe, 0x01,
0x9c, 0xe8, 0x62, 0x17, 0xa0, 0x22, 0xed, 0x52, 0xdf, 0xb6, 0x5d, 0xa8, 0x2a, 0x52, 0x0b, 0xff, 0xe8, 0x91, 0xc7, 0xf8, 0x33, 0xf9, 0xa6, 0xc0, 0xce, 0x6a, 0x99, 0xf7, 0xe0, 0xc2, 0x08, 0xb7,
0x02, 0x2e, 0xc4, 0x82, 0xbe, 0x24, 0x54, 0xb6, 0x22, 0x86, 0xf4, 0xcb, 0x0f, 0xa7, 0x7d, 0xa5, 0xbe, 0x16, 0x7e, 0x3c, 0xd6, 0x34, 0x5f, 0x4d, 0x67, 0x5c, 0xf9, 0x74, 0xe1, 0x28, 0xe0, 0x58,
0x31, 0xce, 0x8e, 0x27, 0xf1, 0x36, 0x81, 0x8b, 0x92, 0xe7, 0xa1, 0xc7, 0x78, 0x48, 0x07, 0xb1, 0xef, 0xbc, 0x00, 0x15, 0x69, 0x97, 0xfa, 0xb6, 0xed, 0x42, 0x55, 0x91, 0x5a, 0xf8, 0x67, 0x70,
0xd5, 0x2b, 0x00, 0x5b, 0x6d, 0xee, 0x9d, 0x90, 0x27, 0x81, 0xaf, 0xae, 0xd1, 0x12, 0x4e, 0xcc, 0x3e, 0x16, 0xf4, 0x39, 0xa1, 0xb2, 0x9d, 0x31, 0xa4, 0x5f, 0xbe, 0x37, 0xe9, 0x2b, 0x5b, 0xa3,
0xc4, 0x57, 0x64, 0x6e, 0xd4, 0xc3, 0x5d, 0x81, 0x72, 0xcb, 0xa5, 0xfe, 0xa0, 0xf5, 0xd2, 0xe3, 0xec, 0x78, 0x1c, 0x6f, 0x13, 0xb8, 0x20, 0x79, 0x1e, 0x78, 0x8c, 0x87, 0xf4, 0x24, 0xb6, 0x7a,
0xba, 0x95, 0x1e, 0x4d, 0xd8, 0xbf, 0x37, 0x60, 0x39, 0xf9, 0x9d, 0xd6, 0x89, 0x48, 0x17, 0xf7, 0x19, 0x60, 0xb3, 0xcd, 0xbd, 0x63, 0xf2, 0x24, 0xf0, 0xd5, 0x35, 0x5a, 0xc2, 0x89, 0x99, 0xf8,
0x60, 0x8e, 0xc7, 0x75, 0xcc, 0x62, 0x96, 0x11, 0x29, 0x88, 0x28, 0x75, 0xb0, 0x04, 0x25, 0x3c, 0x8a, 0xcc, 0x0d, 0x3b, 0xc7, 0xcb, 0x50, 0x6e, 0xb9, 0xd4, 0x3f, 0x69, 0xbd, 0xf4, 0xb8, 0x6e,
0xad, 0x0e, 0xce, 0xb5, 0xd3, 0xe1, 0x13, 0x9e, 0xfe, 0x5f, 0x09, 0x50, 0x7a, 0x39, 0xa3, 0x37, 0xe0, 0x87, 0x13, 0xf6, 0xef, 0x0d, 0x58, 0x4a, 0x7e, 0xa7, 0x75, 0x2c, 0xd2, 0xc5, 0x5d, 0x28,
0x4d, 0x36, 0x77, 0xb9, 0x89, 0xe6, 0xee, 0xf9, 0x64, 0x73, 0xa7, 0xae, 0xe6, 0x3b, 0xb3, 0x68, 0xf0, 0xb8, 0x8e, 0x59, 0xcc, 0x32, 0x22, 0x05, 0x11, 0xa5, 0x0e, 0x96, 0xa0, 0x84, 0xa7, 0xd5,
0x32, 0x43, 0x8b, 0x77, 0x17, 0xca, 0x71, 0x75, 0x13, 0x5f, 0xe0, 0x56, 0x5a, 0xf4, 0xb0, 0x00, 0xc1, 0xb9, 0x7a, 0x3a, 0x7c, 0xcc, 0xd3, 0xff, 0x2f, 0x01, 0x4a, 0x2f, 0x67, 0x74, 0xc4, 0xc9,
0x1a, 0x31, 0xa3, 0xf5, 0xf8, 0xc6, 0x51, 0x77, 0x1d, 0x8a, 0x73, 0x0a, 0x8d, 0xda, 0x8e, 0xae, 0x06, 0x31, 0x37, 0xd6, 0x20, 0x3e, 0x1f, 0x6f, 0x10, 0xd5, 0xd5, 0x7c, 0x7b, 0x1a, 0x4d, 0xa6,
0x2b, 0xf4, 0x2d, 0x74, 0xff, 0x7c, 0xef, 0x16, 0x73, 0x93, 0x6f, 0x16, 0x0d, 0xa8, 0x6c, 0xc7, 0x68, 0x13, 0x47, 0xfa, 0x98, 0xc2, 0x0c, 0x7d, 0x0c, 0x5a, 0x8b, 0x6f, 0x1c, 0x75, 0xd7, 0xa1,
0x89, 0xf2, 0x1c, 0x8f, 0x16, 0x49, 0x10, 0xda, 0xd0, 0x85, 0x8d, 0x4a, 0xcd, 0x57, 0xd2, 0x26, 0x38, 0xa7, 0xd0, 0xa8, 0xed, 0xe8, 0xba, 0x42, 0xdf, 0x42, 0xf7, 0x66, 0x7b, 0x2d, 0x29, 0x8c,
0xc6, 0x0f, 0x14, 0x21, 0xd5, 0x95, 0xcd, 0x51, 0x46, 0x69, 0x59, 0x96, 0x0e, 0xda, 0x9c, 0xc9, 0xbf, 0x94, 0x6c, 0x41, 0x65, 0x3b, 0x4e, 0x94, 0x33, 0x3c, 0x95, 0x24, 0x41, 0x68, 0x5d, 0x17,
0xf7, 0x33, 0xd6, 0x97, 0xe8, 0x33, 0x28, 0x60, 0xc2, 0xfa, 0x3e, 0x97, 0x2f, 0x21, 0x95, 0xfa, 0x36, 0x2a, 0x35, 0x5f, 0x4e, 0x9b, 0x18, 0x3f, 0x8b, 0x84, 0x54, 0x57, 0x36, 0x87, 0x19, 0xa5,
0xd5, 0x29, 0xd2, 0x15, 0x93, 0x3c, 0xab, 0x1a, 0x80, 0x7e, 0x09, 0x45, 0x35, 0x62, 0x66, 0x65, 0x65, 0x59, 0x3a, 0x68, 0x63, 0x2a, 0xdf, 0x4f, 0x59, 0x5f, 0xa2, 0x4f, 0xa0, 0x88, 0x09, 0xeb,
0x5a, 0xcb, 0x9f, 0xa1, 0x99, 0xc6, 0xe8, 0x86, 0x42, 0x53, 0xe2, 0x38, 0x7e, 0x4e, 0x02, 0xa2, 0xfb, 0x5c, 0xbe, 0xbf, 0x54, 0x1a, 0x57, 0x26, 0x48, 0x57, 0x4c, 0xf2, 0xac, 0x6a, 0x00, 0xfa,
0x5f, 0xe8, 0x44, 0x5b, 0x3b, 0x8f, 0x13, 0x33, 0xa8, 0x0e, 0xf3, 0x9c, 0xba, 0x6d, 0x62, 0x2e, 0x39, 0xcc, 0xab, 0x11, 0x33, 0x2b, 0x93, 0x9e, 0x0d, 0x32, 0x34, 0xd3, 0x18, 0xdd, 0x50, 0x68,
0xcc, 0xe0, 0x42, 0xc5, 0x2a, 0x12, 0x5b, 0xe4, 0x05, 0x01, 0xe9, 0x98, 0x8b, 0xaa, 0x52, 0x52, 0x4a, 0x1c, 0xc7, 0x4f, 0x49, 0x40, 0xf4, 0xbb, 0xa0, 0x68, 0x8d, 0xe7, 0x70, 0x62, 0x06, 0x35,
0x14, 0xfa, 0x01, 0x2c, 0x06, 0xfd, 0x9e, 0x6c, 0x16, 0x3a, 0xfb, 0x9c, 0x44, 0xcc, 0xbc, 0x20, 0x60, 0x8e, 0x53, 0xb7, 0x4d, 0xcc, 0x85, 0x29, 0x5c, 0xa8, 0x58, 0x45, 0x62, 0x8b, 0xbc, 0x20,
0xbf, 0x37, 0x31, 0x8b, 0xae, 0xc1, 0x42, 0xd0, 0xef, 0x1d, 0x88, 0x1b, 0x5e, 0xb1, 0x2d, 0x49, 0x20, 0x1d, 0x73, 0x51, 0x55, 0x4a, 0x8a, 0x42, 0xdf, 0x85, 0xc5, 0xa0, 0xdf, 0x93, 0xcd, 0x42,
0xb6, 0xf1, 0x49, 0x74, 0x13, 0x96, 0x05, 0x2e, 0xde, 0x6d, 0xc5, 0xb9, 0x2c, 0x39, 0xd3, 0x0b, 0x67, 0x8f, 0x93, 0x88, 0x99, 0xe7, 0xe5, 0xf7, 0xc6, 0x66, 0xd1, 0x55, 0x58, 0x08, 0xfa, 0xbd,
0xef, 0xa1, 0x67, 0x7e, 0x1f, 0x1d, 0x81, 0xf5, 0x1c, 0xaa, 0xc9, 0x7d, 0xc8, 0xc0, 0xde, 0x19, 0x7d, 0x71, 0xc3, 0x2b, 0xb6, 0x9a, 0x64, 0x1b, 0x9d, 0x44, 0x37, 0x60, 0x49, 0xe0, 0xe2, 0xdd,
0xef, 0xb8, 0x67, 0x88, 0x8b, 0x44, 0xc3, 0xf1, 0x1c, 0xbe, 0xf7, 0x34, 0xea, 0xb8, 0x9c, 0x64, 0x56, 0x9c, 0x4b, 0x92, 0x33, 0xbd, 0xf0, 0x1e, 0x7a, 0xe6, 0xf7, 0xd1, 0x11, 0x58, 0xcf, 0xa1,
0x65, 0xde, 0x74, 0x06, 0xba, 0x0c, 0x85, 0x3d, 0xb5, 0x51, 0xea, 0xe5, 0x52, 0x53, 0x62, 0xbe, 0x9a, 0xdc, 0x87, 0x0c, 0xec, 0xed, 0xd1, 0x8e, 0x7b, 0x8a, 0xb8, 0x48, 0x34, 0x1c, 0xcf, 0xe1,
0x49, 0x84, 0xf3, 0x74, 0xba, 0xd5, 0x94, 0x7d, 0x05, 0xac, 0x2c, 0xf1, 0xca, 0x19, 0xf6, 0x9f, 0xdb, 0x4f, 0xa3, 0x8e, 0xcb, 0x49, 0x56, 0xe6, 0x4d, 0x67, 0xa0, 0x4b, 0x50, 0xdc, 0x55, 0x1b,
0x73, 0x00, 0xa3, 0x60, 0x40, 0x1f, 0x01, 0xf4, 0x48, 0xc7, 0x73, 0x7f, 0xcd, 0x47, 0x0d, 0x65, 0xa5, 0xde, 0x4b, 0x35, 0x25, 0xe6, 0x9b, 0x44, 0x38, 0x4f, 0xa7, 0x5b, 0x4d, 0xd9, 0x97, 0xc1,
0x59, 0xce, 0xc8, 0xae, 0x72, 0x54, 0xfa, 0xe7, 0xde, 0xb9, 0xf4, 0x47, 0x30, 0xc7, 0xbc, 0x6f, 0xca, 0x12, 0xaf, 0x9c, 0x61, 0xff, 0x39, 0x07, 0x30, 0x0c, 0x06, 0xf4, 0x21, 0x40, 0x8f, 0x74,
0x88, 0x2e, 0x53, 0xe4, 0x18, 0x3d, 0x81, 0x8a, 0x1b, 0x04, 0x21, 0x97, 0x61, 0x1c, 0x37, 0xdb, 0x3c, 0xf7, 0x57, 0x7c, 0xd8, 0x50, 0x96, 0xe5, 0x8c, 0xec, 0x2a, 0x87, 0xa5, 0x7f, 0xee, 0x9d,
0xb7, 0x4e, 0x0b, 0x5f, 0x67, 0x6b, 0xc4, 0xaf, 0x4e, 0x49, 0x52, 0x82, 0x75, 0x1f, 0x96, 0x26, 0x4b, 0x7f, 0x04, 0x05, 0xe6, 0x7d, 0x45, 0x74, 0x99, 0x22, 0xc7, 0xe8, 0x09, 0x54, 0xdc, 0x20,
0x19, 0xce, 0xd5, 0x0c, 0x7e, 0x6b, 0xc0, 0x85, 0x89, 0xad, 0x43, 0x9f, 0x0e, 0xb3, 0x80, 0x31, 0x08, 0xb9, 0x0c, 0xe3, 0xb8, 0xd9, 0xbe, 0x79, 0x5a, 0xf8, 0x3a, 0x9b, 0x43, 0x7e, 0x75, 0x4a,
0xc3, 0xf1, 0x8a, 0x13, 0xc0, 0x03, 0xa8, 0x6e, 0x71, 0x2e, 0xb2, 0x9e, 0xb2, 0x4d, 0xb5, 0x7b, 0x92, 0x12, 0xac, 0x7b, 0x50, 0x1b, 0x67, 0x98, 0xa9, 0x19, 0xfc, 0x7b, 0x0e, 0xce, 0x8f, 0x6d,
0xa7, 0x63, 0xc7, 0x10, 0xf6, 0x1f, 0x8d, 0xd1, 0x3b, 0x67, 0x66, 0xcf, 0x7f, 0x6f, 0xbc, 0xe7, 0x1d, 0x7a, 0x00, 0x35, 0x45, 0x8d, 0x3d, 0x90, 0x9c, 0x75, 0xd0, 0x52, 0x28, 0x74, 0x1f, 0xaa,
0xbf, 0x3e, 0xfd, 0x72, 0x78, 0x9f, 0xad, 0xfe, 0x8d, 0x9f, 0xc3, 0x87, 0x99, 0x17, 0x33, 0xaa, 0x9b, 0x9c, 0x8b, 0x4c, 0xa8, 0xec, 0x55, 0x2d, 0xe0, 0xe9, 0x52, 0x46, 0x10, 0xe8, 0xc1, 0x30,
0x40, 0x71, 0xff, 0x60, 0x0b, 0x1f, 0xb4, 0x9a, 0x4b, 0x1f, 0xa0, 0x2a, 0x94, 0xb6, 0x9f, 0xec, 0xad, 0xe4, 0x27, 0x35, 0xfa, 0x63, 0xfa, 0x67, 0xe7, 0x14, 0xeb, 0x17, 0x93, 0x83, 0x3c, 0xaf,
0xee, 0x3d, 0x6e, 0x1d, 0xb4, 0x96, 0x0c, 0xb1, 0xd4, 0x6c, 0x89, 0x71, 0x73, 0x29, 0x57, 0xff, 0xbc, 0xd4, 0x18, 0x0d, 0xf2, 0x33, 0xb2, 0xca, 0xd0, 0x87, 0x7f, 0x34, 0xa0, 0x14, 0x1f, 0xc2,
0xb6, 0x00, 0xc5, 0x6d, 0xf5, 0x5f, 0x0f, 0x3a, 0x80, 0xf2, 0xf0, 0x4f, 0x00, 0x64, 0x67, 0x78, 0xcc, 0xb7, 0x8a, 0xbb, 0xa3, 0x6f, 0x15, 0xd7, 0x26, 0x5f, 0x6a, 0xef, 0xf3, 0x89, 0xe2, 0xfa,
0x67, 0xe2, 0xdf, 0x04, 0xeb, 0xe3, 0x53, 0x79, 0x74, 0xe2, 0x7e, 0x08, 0xf3, 0xf2, 0xef, 0x10, 0x4f, 0xe1, 0x83, 0xcc, 0x82, 0x02, 0x55, 0x60, 0x7e, 0x6f, 0x7f, 0x13, 0xef, 0xb7, 0x9a, 0xb5,
0x94, 0xd1, 0x5e, 0x27, 0xff, 0x27, 0xb1, 0x4e, 0xff, 0x7b, 0x61, 0xc3, 0x10, 0x92, 0xe4, 0xdb, 0x73, 0xa8, 0x0a, 0xa5, 0xed, 0x27, 0x8f, 0x77, 0x1f, 0xb5, 0xf6, 0x5b, 0x35, 0x43, 0x2c, 0x35,
0x44, 0x96, 0xa4, 0xe4, 0xe3, 0xa5, 0xb5, 0x7a, 0xc6, 0xa3, 0x06, 0xda, 0x85, 0x82, 0x6e, 0xd8, 0x5b, 0x62, 0xdc, 0xac, 0xe5, 0x1a, 0xbf, 0x2b, 0xc2, 0xfc, 0xb6, 0xfa, 0x67, 0x0c, 0xed, 0x43,
0xb2, 0x58, 0x93, 0x2f, 0x10, 0xd6, 0xda, 0x74, 0x06, 0x25, 0x6c, 0xc3, 0x40, 0xbb, 0xc3, 0xf7, 0x79, 0xf0, 0x97, 0x09, 0xb2, 0x33, 0x5c, 0x33, 0xf6, 0xdf, 0x8b, 0xf5, 0xd1, 0xa9, 0x3c, 0xfa,
0xe8, 0x2c, 0xd5, 0x92, 0xd5, 0xae, 0x75, 0xc6, 0xfa, 0xba, 0xb1, 0x61, 0xa0, 0xaf, 0xa0, 0x92, 0xc2, 0x79, 0x00, 0x73, 0xf2, 0xcf, 0x23, 0x94, 0xf1, 0x2c, 0x90, 0xfc, 0x57, 0xc9, 0x3a, 0xfd,
0xa8, 0x67, 0x51, 0x46, 0x35, 0x95, 0x2e, 0x8e, 0xad, 0xeb, 0x67, 0x70, 0x69, 0xcb, 0x5b, 0x30, 0xcf, 0x98, 0x75, 0x43, 0x48, 0x92, 0x6f, 0x2a, 0x59, 0x92, 0x92, 0x0f, 0xb7, 0xd6, 0xca, 0x19,
0x27, 0x0f, 0x52, 0x86, 0xb3, 0x13, 0xe5, 0x6e, 0x96, 0x9a, 0x63, 0xe5, 0xef, 0xa1, 0x2a, 0xd0, 0x8f, 0x31, 0xe8, 0x31, 0x14, 0x75, 0xa3, 0x99, 0xc5, 0x9a, 0x7c, 0x39, 0xb1, 0x56, 0x27, 0x33,
0x49, 0x90, 0x8c, 0x3e, 0x74, 0xfd, 0xac, 0x7b, 0x75, 0x6a, 0xd8, 0xa4, 0x82, 0x78, 0xc3, 0x40, 0x28, 0x61, 0xeb, 0x06, 0x7a, 0x3c, 0x78, 0x8b, 0xcf, 0x52, 0x2d, 0x59, 0xa5, 0x5b, 0x67, 0xac,
0x21, 0xa0, 0x74, 0xf2, 0x44, 0x3f, 0xca, 0x88, 0x92, 0x69, 0x19, 0xdc, 0xba, 0x39, 0x1b, 0xb3, 0xaf, 0x19, 0xeb, 0x06, 0xfa, 0x02, 0x2a, 0x89, 0x3a, 0x1c, 0x65, 0x54, 0x81, 0xe9, 0xa2, 0xde,
0x32, 0xaa, 0x51, 0x7d, 0xf5, 0x66, 0xc5, 0xf8, 0xc7, 0x9b, 0x15, 0xe3, 0x5f, 0x6f, 0x56, 0x8c, 0xba, 0x76, 0x06, 0x97, 0xb6, 0xbc, 0x05, 0x05, 0x99, 0x00, 0x32, 0x9c, 0x9d, 0x28, 0xd3, 0xb3,
0xc3, 0x82, 0xac, 0x98, 0x7e, 0xfc, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xf6, 0x99, 0xcf, 0xd4, 0x1c, 0x29, 0xdb, 0x0f, 0x54, 0x63, 0x41, 0x82, 0x64, 0xf4, 0xa1, 0x6b, 0x67, 0xd5, 0x03,
0x0b, 0x1d, 0x00, 0x00, 0x13, 0xc3, 0x26, 0x15, 0xc4, 0xeb, 0x06, 0x0a, 0x01, 0xa5, 0x93, 0x3e, 0xfa, 0x7e, 0x46, 0x94,
0x4c, 0xba, 0x79, 0xac, 0x1b, 0xd3, 0x31, 0x2b, 0xa3, 0xb6, 0xaa, 0xaf, 0xde, 0x2c, 0x1b, 0xff,
0x7c, 0xb3, 0x6c, 0xfc, 0xfb, 0xcd, 0xb2, 0x71, 0x50, 0x94, 0x95, 0xde, 0x0f, 0xbe, 0x09, 0x00,
0x00, 0xff, 0xff, 0x16, 0xc8, 0xe5, 0x4c, 0x39, 0x1e, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -2892,6 +2918,20 @@ func (m *SolveRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i -= len(m.XXX_unrecognized) i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized)
} }
if len(m.Exporters) > 0 {
for iNdEx := len(m.Exporters) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.Exporters[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintControl(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x6a
}
}
if m.SourcePolicy != nil { if m.SourcePolicy != nil {
{ {
size, err := m.SourcePolicy.MarshalToSizedBuffer(dAtA[:i]) size, err := m.SourcePolicy.MarshalToSizedBuffer(dAtA[:i])
@ -2992,9 +3032,9 @@ func (m *SolveRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i-- i--
dAtA[i] = 0x2a dAtA[i] = 0x2a
} }
if len(m.ExporterAttrs) > 0 { if len(m.ExporterAttrsDeprecated) > 0 {
for k := range m.ExporterAttrs { for k := range m.ExporterAttrsDeprecated {
v := m.ExporterAttrs[k] v := m.ExporterAttrsDeprecated[k]
baseI := i baseI := i
i -= len(v) i -= len(v)
copy(dAtA[i:], v) copy(dAtA[i:], v)
@ -3011,10 +3051,10 @@ func (m *SolveRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
dAtA[i] = 0x22 dAtA[i] = 0x22
} }
} }
if len(m.Exporter) > 0 { if len(m.ExporterDeprecated) > 0 {
i -= len(m.Exporter) i -= len(m.ExporterDeprecated)
copy(dAtA[i:], m.Exporter) copy(dAtA[i:], m.ExporterDeprecated)
i = encodeVarintControl(dAtA, i, uint64(len(m.Exporter))) i = encodeVarintControl(dAtA, i, uint64(len(m.ExporterDeprecated)))
i-- i--
dAtA[i] = 0x1a dAtA[i] = 0x1a
} }
@ -4339,6 +4379,30 @@ func (m *BuildResultInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i -= len(m.XXX_unrecognized) i -= len(m.XXX_unrecognized)
copy(dAtA[i:], m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized)
} }
if len(m.Results) > 0 {
for k := range m.Results {
v := m.Results[k]
baseI := i
if v != nil {
{
size, err := v.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintControl(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
}
i = encodeVarintControl(dAtA, i, uint64(k))
i--
dAtA[i] = 0x8
i = encodeVarintControl(dAtA, i, uint64(baseI-i))
i--
dAtA[i] = 0x1a
}
}
if len(m.Attestations) > 0 { if len(m.Attestations) > 0 {
for iNdEx := len(m.Attestations) - 1; iNdEx >= 0; iNdEx-- { for iNdEx := len(m.Attestations) - 1; iNdEx >= 0; iNdEx-- {
{ {
@ -4353,9 +4417,9 @@ func (m *BuildResultInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) {
dAtA[i] = 0x12 dAtA[i] = 0x12
} }
} }
if m.Result != nil { if m.ResultDeprecated != nil {
{ {
size, err := m.Result.MarshalToSizedBuffer(dAtA[:i]) size, err := m.ResultDeprecated.MarshalToSizedBuffer(dAtA[:i])
if err != nil { if err != nil {
return 0, err return 0, err
} }
@ -4564,12 +4628,12 @@ func (m *SolveRequest) Size() (n int) {
l = m.Definition.Size() l = m.Definition.Size()
n += 1 + l + sovControl(uint64(l)) n += 1 + l + sovControl(uint64(l))
} }
l = len(m.Exporter) l = len(m.ExporterDeprecated)
if l > 0 { if l > 0 {
n += 1 + l + sovControl(uint64(l)) n += 1 + l + sovControl(uint64(l))
} }
if len(m.ExporterAttrs) > 0 { if len(m.ExporterAttrsDeprecated) > 0 {
for k, v := range m.ExporterAttrs { for k, v := range m.ExporterAttrsDeprecated {
_ = k _ = k
_ = v _ = v
mapEntrySize := 1 + len(k) + sovControl(uint64(len(k))) + 1 + len(v) + sovControl(uint64(len(v))) mapEntrySize := 1 + len(k) + sovControl(uint64(len(k))) + 1 + len(v) + sovControl(uint64(len(v)))
@ -4620,6 +4684,12 @@ func (m *SolveRequest) Size() (n int) {
l = m.SourcePolicy.Size() l = m.SourcePolicy.Size()
n += 1 + l + sovControl(uint64(l)) n += 1 + l + sovControl(uint64(l))
} }
if len(m.Exporters) > 0 {
for _, e := range m.Exporters {
l = e.Size()
n += 1 + l + sovControl(uint64(l))
}
}
if m.XXX_unrecognized != nil { if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized) n += len(m.XXX_unrecognized)
} }
@ -5203,8 +5273,8 @@ func (m *BuildResultInfo) Size() (n int) {
} }
var l int var l int
_ = l _ = l
if m.Result != nil { if m.ResultDeprecated != nil {
l = m.Result.Size() l = m.ResultDeprecated.Size()
n += 1 + l + sovControl(uint64(l)) n += 1 + l + sovControl(uint64(l))
} }
if len(m.Attestations) > 0 { if len(m.Attestations) > 0 {
@ -5213,6 +5283,19 @@ func (m *BuildResultInfo) Size() (n int) {
n += 1 + l + sovControl(uint64(l)) n += 1 + l + sovControl(uint64(l))
} }
} }
if len(m.Results) > 0 {
for k, v := range m.Results {
_ = k
_ = v
l = 0
if v != nil {
l = v.Size()
l += 1 + sovControl(uint64(l))
}
mapEntrySize := 1 + sovControl(uint64(k)) + l
n += mapEntrySize + 1 + sovControl(uint64(mapEntrySize))
}
}
if m.XXX_unrecognized != nil { if m.XXX_unrecognized != nil {
n += len(m.XXX_unrecognized) n += len(m.XXX_unrecognized)
} }
@ -6035,7 +6118,7 @@ func (m *SolveRequest) Unmarshal(dAtA []byte) error {
iNdEx = postIndex iNdEx = postIndex
case 3: case 3:
if wireType != 2 { if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Exporter", wireType) return fmt.Errorf("proto: wrong wireType = %d for field ExporterDeprecated", wireType)
} }
var stringLen uint64 var stringLen uint64
for shift := uint(0); ; shift += 7 { for shift := uint(0); ; shift += 7 {
@ -6063,11 +6146,11 @@ func (m *SolveRequest) Unmarshal(dAtA []byte) error {
if postIndex > l { if postIndex > l {
return io.ErrUnexpectedEOF return io.ErrUnexpectedEOF
} }
m.Exporter = string(dAtA[iNdEx:postIndex]) m.ExporterDeprecated = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex iNdEx = postIndex
case 4: case 4:
if wireType != 2 { if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field ExporterAttrs", wireType) return fmt.Errorf("proto: wrong wireType = %d for field ExporterAttrsDeprecated", wireType)
} }
var msglen int var msglen int
for shift := uint(0); ; shift += 7 { for shift := uint(0); ; shift += 7 {
@ -6094,8 +6177,8 @@ func (m *SolveRequest) Unmarshal(dAtA []byte) error {
if postIndex > l { if postIndex > l {
return io.ErrUnexpectedEOF return io.ErrUnexpectedEOF
} }
if m.ExporterAttrs == nil { if m.ExporterAttrsDeprecated == nil {
m.ExporterAttrs = make(map[string]string) m.ExporterAttrsDeprecated = make(map[string]string)
} }
var mapkey string var mapkey string
var mapvalue string var mapvalue string
@ -6190,7 +6273,7 @@ func (m *SolveRequest) Unmarshal(dAtA []byte) error {
iNdEx += skippy iNdEx += skippy
} }
} }
m.ExporterAttrs[mapkey] = mapvalue m.ExporterAttrsDeprecated[mapkey] = mapvalue
iNdEx = postIndex iNdEx = postIndex
case 5: case 5:
if wireType != 2 { if wireType != 2 {
@ -6633,6 +6716,40 @@ func (m *SolveRequest) Unmarshal(dAtA []byte) error {
return err return err
} }
iNdEx = postIndex iNdEx = postIndex
case 13:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Exporters", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowControl
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthControl
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthControl
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Exporters = append(m.Exporters, &Exporter{})
if err := m.Exporters[len(m.Exporters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipControl(dAtA[iNdEx:]) skippy, err := skipControl(dAtA[iNdEx:])
@ -10589,7 +10706,7 @@ func (m *BuildResultInfo) Unmarshal(dAtA []byte) error {
switch fieldNum { switch fieldNum {
case 1: case 1:
if wireType != 2 { if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Result", wireType) return fmt.Errorf("proto: wrong wireType = %d for field ResultDeprecated", wireType)
} }
var msglen int var msglen int
for shift := uint(0); ; shift += 7 { for shift := uint(0); ; shift += 7 {
@ -10616,10 +10733,10 @@ func (m *BuildResultInfo) Unmarshal(dAtA []byte) error {
if postIndex > l { if postIndex > l {
return io.ErrUnexpectedEOF return io.ErrUnexpectedEOF
} }
if m.Result == nil { if m.ResultDeprecated == nil {
m.Result = &Descriptor{} m.ResultDeprecated = &Descriptor{}
} }
if err := m.Result.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { if err := m.ResultDeprecated.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err return err
} }
iNdEx = postIndex iNdEx = postIndex
@ -10657,6 +10774,121 @@ func (m *BuildResultInfo) Unmarshal(dAtA []byte) error {
return err return err
} }
iNdEx = postIndex iNdEx = postIndex
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Results", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowControl
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthControl
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthControl
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.Results == nil {
m.Results = make(map[int64]*Descriptor)
}
var mapkey int64
var mapvalue *Descriptor
for iNdEx < postIndex {
entryPreIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowControl
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
if fieldNum == 1 {
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowControl
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
mapkey |= int64(b&0x7F) << shift
if b < 0x80 {
break
}
}
} else if fieldNum == 2 {
var mapmsglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowControl
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
mapmsglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if mapmsglen < 0 {
return ErrInvalidLengthControl
}
postmsgIndex := iNdEx + mapmsglen
if postmsgIndex < 0 {
return ErrInvalidLengthControl
}
if postmsgIndex > l {
return io.ErrUnexpectedEOF
}
mapvalue = &Descriptor{}
if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil {
return err
}
iNdEx = postmsgIndex
} else {
iNdEx = entryPreIndex
skippy, err := skipControl(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthControl
}
if (iNdEx + skippy) > postIndex {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
m.Results[mapkey] = mapvalue
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipControl(dAtA[iNdEx:]) skippy, err := skipControl(dAtA[iNdEx:])

View File

@ -60,8 +60,11 @@ message UsageRecord {
message SolveRequest { message SolveRequest {
string Ref = 1; string Ref = 1;
pb.Definition Definition = 2; pb.Definition Definition = 2;
string Exporter = 3; // ExporterDeprecated and ExporterAttrsDeprecated are deprecated in favor
map<string, string> ExporterAttrs = 4; // of the new Exporters. If these fields are set, then they will be
// appended to the Exporters field if Exporters was not explicitly set.
string ExporterDeprecated = 3;
map<string, string> ExporterAttrsDeprecated = 4;
string Session = 5; string Session = 5;
string Frontend = 6; string Frontend = 6;
map<string, string> FrontendAttrs = 7; map<string, string> FrontendAttrs = 7;
@ -70,6 +73,7 @@ message SolveRequest {
map<string, pb.Definition> FrontendInputs = 10; map<string, pb.Definition> FrontendInputs = 10;
bool Internal = 11; // Internal builds are not recorded in build history bool Internal = 11; // Internal builds are not recorded in build history
moby.buildkit.v1.sourcepolicy.Policy SourcePolicy = 12; moby.buildkit.v1.sourcepolicy.Policy SourcePolicy = 12;
repeated Exporter Exporters = 13;
} }
message CacheOptions { message CacheOptions {
@ -227,11 +231,15 @@ message Descriptor {
} }
message BuildResultInfo { message BuildResultInfo {
Descriptor Result = 1; Descriptor ResultDeprecated = 1;
repeated Descriptor Attestations = 2; repeated Descriptor Attestations = 2;
map<int64, Descriptor> Results = 3;
} }
// Exporter describes the output exporter
message Exporter { message Exporter {
// Type identifies the exporter
string Type = 1; string Type = 1;
// Attrs specifies exporter configuration
map<string, string> Attrs = 2; map<string, string> Attrs = 2;
} }

View File

@ -229,7 +229,7 @@ func (s State) Output() Output {
return s.out return s.out
} }
// WithOutput creats a new state with the output set to the given output. // WithOutput creates a new state with the output set to the given output.
func (s State) WithOutput(o Output) State { func (s State) WithOutput(o Output) State {
prev := s prev := s
s = State{ s = State{

View File

@ -56,8 +56,8 @@ type SolveOpt struct {
type ExportEntry struct { type ExportEntry struct {
Type string Type string
Attrs map[string]string Attrs map[string]string
Output func(map[string]string) (io.WriteCloser, error) // for ExporterOCI and ExporterDocker Output filesync.FileOutputFunc // for ExporterOCI and ExporterDocker
OutputDir string // for ExporterLocal OutputDir string // for ExporterLocal
} }
type CacheOptionsEntry struct { type CacheOptionsEntry struct {
@ -130,14 +130,6 @@ func (c *Client) solve(ctx context.Context, def *llb.Definition, runGateway runG
return nil, err return nil, err
} }
var ex ExportEntry
if len(opt.Exports) > 1 {
return nil, errors.New("currently only single Exports can be specified")
}
if len(opt.Exports) == 1 {
ex = opt.Exports[0]
}
storesToUpdate := []string{} storesToUpdate := []string{}
if !opt.SessionPreInitialized { if !opt.SessionPreInitialized {
@ -161,51 +153,52 @@ func (c *Client) solve(ctx context.Context, def *llb.Definition, runGateway runG
contentStores[key2] = store contentStores[key2] = store
} }
var supportFile bool var syncTargets []filesync.FSSyncTarget
var supportDir bool for exID, ex := range opt.Exports {
switch ex.Type { var supportFile bool
case ExporterLocal: var supportDir bool
supportDir = true
case ExporterTar:
supportFile = true
case ExporterOCI, ExporterDocker:
supportDir = ex.OutputDir != ""
supportFile = ex.Output != nil
}
if supportFile && supportDir {
return nil, errors.Errorf("both file and directory output is not supported by %s exporter", ex.Type)
}
if !supportFile && ex.Output != nil {
return nil, errors.Errorf("output file writer is not supported by %s exporter", ex.Type)
}
if !supportDir && ex.OutputDir != "" {
return nil, errors.Errorf("output directory is not supported by %s exporter", ex.Type)
}
if supportFile {
if ex.Output == nil {
return nil, errors.Errorf("output file writer is required for %s exporter", ex.Type)
}
s.Allow(filesync.NewFSSyncTarget(ex.Output))
}
if supportDir {
if ex.OutputDir == "" {
return nil, errors.Errorf("output directory is required for %s exporter", ex.Type)
}
switch ex.Type { switch ex.Type {
case ExporterLocal:
supportDir = true
case ExporterTar:
supportFile = true
case ExporterOCI, ExporterDocker: case ExporterOCI, ExporterDocker:
if err := os.MkdirAll(ex.OutputDir, 0755); err != nil { supportDir = ex.OutputDir != ""
return nil, err supportFile = ex.Output != nil
}
if supportFile && supportDir {
return nil, errors.Errorf("both file and directory output is not supported by %s exporter", ex.Type)
}
if !supportFile && ex.Output != nil {
return nil, errors.Errorf("output file writer is not supported by %s exporter", ex.Type)
}
if !supportDir && ex.OutputDir != "" {
return nil, errors.Errorf("output directory is not supported by %s exporter", ex.Type)
}
if supportFile {
if ex.Output == nil {
return nil, errors.Errorf("output file writer is required for %s exporter", ex.Type)
} }
cs, err := contentlocal.NewStore(ex.OutputDir) syncTargets = append(syncTargets, filesync.WithFSSync(exID, ex.Output))
if err != nil { }
return nil, err if supportDir {
if ex.OutputDir == "" {
return nil, errors.Errorf("output directory is required for %s exporter", ex.Type)
}
switch ex.Type {
case ExporterOCI, ExporterDocker:
if err := os.MkdirAll(ex.OutputDir, 0755); err != nil {
return nil, err
}
cs, err := contentlocal.NewStore(ex.OutputDir)
if err != nil {
return nil, err
}
contentStores["export"] = cs
storesToUpdate = append(storesToUpdate, ex.OutputDir)
default:
syncTargets = append(syncTargets, filesync.WithFSSyncDir(exID, ex.OutputDir))
} }
contentStores["export"] = cs
storesToUpdate = append(storesToUpdate, ex.OutputDir)
default:
s.Allow(filesync.NewFSSyncTargetDir(ex.OutputDir))
} }
} }
@ -213,6 +206,10 @@ func (c *Client) solve(ctx context.Context, def *llb.Definition, runGateway runG
s.Allow(sessioncontent.NewAttachable(contentStores)) s.Allow(sessioncontent.NewAttachable(contentStores))
} }
if len(syncTargets) > 0 {
s.Allow(filesync.NewFSSyncTarget(syncTargets...))
}
eg.Go(func() error { eg.Go(func() error {
sd := c.sessionDialer sd := c.sessionDialer
if sd == nil { if sd == nil {
@ -260,19 +257,34 @@ func (c *Client) solve(ctx context.Context, def *llb.Definition, runGateway runG
frontendInputs[key] = def.ToPB() frontendInputs[key] = def.ToPB()
} }
exports := make([]*controlapi.Exporter, 0, len(opt.Exports))
exportDeprecated := ""
exportAttrDeprecated := map[string]string{}
for i, exp := range opt.Exports {
if i == 0 {
exportDeprecated = exp.Type
exportAttrDeprecated = exp.Attrs
}
exports = append(exports, &controlapi.Exporter{
Type: exp.Type,
Attrs: exp.Attrs,
})
}
resp, err := c.ControlClient().Solve(ctx, &controlapi.SolveRequest{ resp, err := c.ControlClient().Solve(ctx, &controlapi.SolveRequest{
Ref: ref, Ref: ref,
Definition: pbd, Definition: pbd,
Exporter: ex.Type, Exporters: exports,
ExporterAttrs: ex.Attrs, ExporterDeprecated: exportDeprecated,
Session: s.ID(), ExporterAttrsDeprecated: exportAttrDeprecated,
Frontend: opt.Frontend, Session: s.ID(),
FrontendAttrs: frontendAttrs, Frontend: opt.Frontend,
FrontendInputs: frontendInputs, FrontendAttrs: frontendAttrs,
Cache: cacheOpt.options, FrontendInputs: frontendInputs,
Entitlements: opt.AllowedEntitlements, Cache: cacheOpt.options,
Internal: opt.Internal, Entitlements: opt.AllowedEntitlements,
SourcePolicy: opt.SourcePolicy, Internal: opt.Internal,
SourcePolicy: opt.SourcePolicy,
}) })
if err != nil { if err != nil {
return errors.Wrap(err, "failed to solve") return errors.Wrap(err, "failed to solve")

View File

@ -71,6 +71,8 @@ type NetworkConfig struct {
CNIConfigPath string `toml:"cniConfigPath"` CNIConfigPath string `toml:"cniConfigPath"`
CNIBinaryPath string `toml:"cniBinaryPath"` CNIBinaryPath string `toml:"cniBinaryPath"`
CNIPoolSize int `toml:"cniPoolSize"` CNIPoolSize int `toml:"cniPoolSize"`
BridgeName string `toml:"bridgeName"`
BridgeSubnet string `toml:"bridgeSubnet"`
} }
type OCIConfig struct { type OCIConfig struct {

View File

@ -46,10 +46,13 @@ func ParsePlatforms(meta map[string][]byte) (Platforms, error) {
return ps, nil return ps, nil
} }
func ParseKey(meta map[string][]byte, key string, p Platform) []byte { func ParseKey(meta map[string][]byte, key string, p *Platform) []byte {
if v, ok := meta[fmt.Sprintf("%s/%s", key, p.ID)]; ok { if p != nil {
return v if v, ok := meta[fmt.Sprintf("%s/%s", key, p.ID)]; ok {
} else if v, ok := meta[key]; ok { return v
}
}
if v, ok := meta[key]; ok {
return v return v
} }
return nil return nil

View File

@ -1,6 +1,9 @@
package exptypes package exptypes
import ( import (
"context"
"github.com/moby/buildkit/solver/result"
ocispecs "github.com/opencontainers/image-spec/specs-go/v1" ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
) )
@ -10,7 +13,6 @@ const (
ExporterImageConfigKey = "containerimage.config" ExporterImageConfigKey = "containerimage.config"
ExporterImageConfigDigestKey = "containerimage.config.digest" ExporterImageConfigDigestKey = "containerimage.config.digest"
ExporterImageDescriptorKey = "containerimage.descriptor" ExporterImageDescriptorKey = "containerimage.descriptor"
ExporterInlineCache = "containerimage.inlinecache"
ExporterPlatformsKey = "refs.platforms" ExporterPlatformsKey = "refs.platforms"
) )
@ -18,7 +20,6 @@ const (
// a platform to become platform specific // a platform to become platform specific
var KnownRefMetadataKeys = []string{ var KnownRefMetadataKeys = []string{
ExporterImageConfigKey, ExporterImageConfigKey,
ExporterInlineCache,
} }
type Platforms struct { type Platforms struct {
@ -29,3 +30,8 @@ type Platform struct {
ID string ID string
Platform ocispecs.Platform Platform ocispecs.Platform
} }
type InlineCacheEntry struct {
Data []byte
}
type InlineCache func(ctx context.Context) (*result.Result[*InlineCacheEntry], error)

View File

@ -27,6 +27,8 @@ const (
keyFollowPaths = "followpaths" keyFollowPaths = "followpaths"
keyDirName = "dir-name" keyDirName = "dir-name"
keyExporterMetaPrefix = "exporter-md-" keyExporterMetaPrefix = "exporter-md-"
keyExporterID = "buildkit-attachable-exporter-id"
) )
type fsSyncProvider struct { type fsSyncProvider struct {
@ -35,6 +37,13 @@ type fsSyncProvider struct {
doneCh chan error doneCh chan error
} }
type FileOutputFunc func(map[string]string) (io.WriteCloser, error)
type SyncedDir struct {
Dir string
Map func(string, *fstypes.Stat) fsutil.MapResult
}
type DirSource interface { type DirSource interface {
LookupDir(string) (fsutil.FS, bool) LookupDir(string) (fsutil.FS, bool)
} }
@ -226,39 +235,87 @@ func FSSync(ctx context.Context, c session.Caller, opt FSSendRequestOpt) error {
return pr.recvFn(stream, opt.DestDir, opt.CacheUpdater, opt.ProgressCb, opt.Differ, opt.Filter) return pr.recvFn(stream, opt.DestDir, opt.CacheUpdater, opt.ProgressCb, opt.Differ, opt.Filter)
} }
// NewFSSyncTargetDir allows writing into a directory type FSSyncTarget interface {
func NewFSSyncTargetDir(outdir string) session.Attachable { target() *fsSyncTarget
p := &fsSyncTarget{
outdir: outdir,
}
return p
}
// NewFSSyncTarget allows writing into an io.WriteCloser
func NewFSSyncTarget(f func(map[string]string) (io.WriteCloser, error)) session.Attachable {
p := &fsSyncTarget{
f: f,
}
return p
} }
type fsSyncTarget struct { type fsSyncTarget struct {
id int
outdir string outdir string
f func(map[string]string) (io.WriteCloser, error) f FileOutputFunc
} }
func (sp *fsSyncTarget) Register(server *grpc.Server) { func (target *fsSyncTarget) target() *fsSyncTarget {
return target
}
func WithFSSync(id int, f FileOutputFunc) FSSyncTarget {
return &fsSyncTarget{
id: id,
f: f,
}
}
func WithFSSyncDir(id int, outdir string) FSSyncTarget {
return &fsSyncTarget{
id: id,
outdir: outdir,
}
}
func NewFSSyncTarget(targets ...FSSyncTarget) session.Attachable {
fs := make(map[int]FileOutputFunc)
outdirs := make(map[int]string)
for _, t := range targets {
t := t.target()
if t.f != nil {
fs[t.id] = t.f
}
if t.outdir != "" {
outdirs[t.id] = t.outdir
}
}
return &fsSyncAttachable{
fs: fs,
outdirs: outdirs,
}
}
type fsSyncAttachable struct {
fs map[int]FileOutputFunc
outdirs map[int]string
}
func (sp *fsSyncAttachable) Register(server *grpc.Server) {
RegisterFileSendServer(server, sp) RegisterFileSendServer(server, sp)
} }
func (sp *fsSyncTarget) DiffCopy(stream FileSend_DiffCopyServer) (err error) { func (sp *fsSyncAttachable) chooser(ctx context.Context) int {
if sp.outdir != "" { md, ok := metadata.FromIncomingContext(ctx)
return syncTargetDiffCopy(stream, sp.outdir) if !ok {
return 0
}
values := md[keyExporterID]
if len(values) == 0 {
return 0
}
id, err := strconv.ParseInt(values[0], 10, 64)
if err != nil {
return 0
}
return int(id)
}
func (sp *fsSyncAttachable) DiffCopy(stream FileSend_DiffCopyServer) (err error) {
id := sp.chooser(stream.Context())
if outdir, ok := sp.outdirs[id]; ok {
return syncTargetDiffCopy(stream, outdir)
}
f, ok := sp.fs[id]
if !ok {
return errors.Errorf("exporter %d not found", id)
} }
if sp.f == nil {
return errors.New("empty outfile and outdir")
}
opts, _ := metadata.FromIncomingContext(stream.Context()) // if no metadata continue with empty object opts, _ := metadata.FromIncomingContext(stream.Context()) // if no metadata continue with empty object
md := map[string]string{} md := map[string]string{}
for k, v := range opts { for k, v := range opts {
@ -266,7 +323,7 @@ func (sp *fsSyncTarget) DiffCopy(stream FileSend_DiffCopyServer) (err error) {
md[strings.TrimPrefix(k, keyExporterMetaPrefix)] = strings.Join(v, ",") md[strings.TrimPrefix(k, keyExporterMetaPrefix)] = strings.Join(v, ",")
} }
} }
wc, err := sp.f(md) wc, err := f(md)
if err != nil { if err != nil {
return err return err
} }
@ -282,7 +339,7 @@ func (sp *fsSyncTarget) DiffCopy(stream FileSend_DiffCopyServer) (err error) {
return writeTargetFile(stream, wc) return writeTargetFile(stream, wc)
} }
func CopyToCaller(ctx context.Context, fs fsutil.FS, c session.Caller, progress func(int, bool)) error { func CopyToCaller(ctx context.Context, fs fsutil.FS, id int, c session.Caller, progress func(int, bool)) error {
method := session.MethodURL(_FileSend_serviceDesc.ServiceName, "diffcopy") method := session.MethodURL(_FileSend_serviceDesc.ServiceName, "diffcopy")
if !c.Supports(method) { if !c.Supports(method) {
return errors.Errorf("method %s not supported by the client", method) return errors.Errorf("method %s not supported by the client", method)
@ -290,6 +347,16 @@ func CopyToCaller(ctx context.Context, fs fsutil.FS, c session.Caller, progress
client := NewFileSendClient(c.Conn()) client := NewFileSendClient(c.Conn())
opts, ok := metadata.FromOutgoingContext(ctx)
if !ok {
opts = make(map[string][]string)
}
if existingVal, ok := opts[keyExporterID]; ok {
bklog.G(ctx).Warnf("overwriting grpc metadata key %q from value %+v to %+v", keyExporterID, existingVal, id)
}
opts[keyExporterID] = []string{fmt.Sprint(id)}
ctx = metadata.NewOutgoingContext(ctx, opts)
cc, err := client.DiffCopy(ctx) cc, err := client.DiffCopy(ctx)
if err != nil { if err != nil {
return errors.WithStack(err) return errors.WithStack(err)
@ -298,7 +365,7 @@ func CopyToCaller(ctx context.Context, fs fsutil.FS, c session.Caller, progress
return sendDiffCopy(cc, fs, progress) return sendDiffCopy(cc, fs, progress)
} }
func CopyFileWriter(ctx context.Context, md map[string]string, c session.Caller) (io.WriteCloser, error) { func CopyFileWriter(ctx context.Context, md map[string]string, id int, c session.Caller) (io.WriteCloser, error) {
method := session.MethodURL(_FileSend_serviceDesc.ServiceName, "diffcopy") method := session.MethodURL(_FileSend_serviceDesc.ServiceName, "diffcopy")
if !c.Supports(method) { if !c.Supports(method) {
return nil, errors.Errorf("method %s not supported by the client", method) return nil, errors.Errorf("method %s not supported by the client", method)
@ -317,7 +384,10 @@ func CopyFileWriter(ctx context.Context, md map[string]string, c session.Caller)
} }
opts[k] = []string{v} opts[k] = []string{v}
} }
if existingVal, ok := opts[keyExporterID]; ok {
bklog.G(ctx).Warnf("overwriting grpc metadata key %q from value %+v to %+v", keyExporterID, existingVal, id)
}
opts[keyExporterID] = []string{fmt.Sprint(id)}
ctx = metadata.NewOutgoingContext(ctx, opts) ctx = metadata.NewOutgoingContext(ctx, opts)
cc, err := client.DiffCopy(ctx) cc, err := client.DiffCopy(ctx)

View File

@ -6,16 +6,18 @@ option go_package = "filesync";
import "github.com/tonistiigi/fsutil/types/wire.proto"; import "github.com/tonistiigi/fsutil/types/wire.proto";
// FileSync exposes local files from the client to the server.
service FileSync{ service FileSync{
rpc DiffCopy(stream fsutil.types.Packet) returns (stream fsutil.types.Packet); rpc DiffCopy(stream fsutil.types.Packet) returns (stream fsutil.types.Packet);
rpc TarStream(stream fsutil.types.Packet) returns (stream fsutil.types.Packet); rpc TarStream(stream fsutil.types.Packet) returns (stream fsutil.types.Packet);
} }
// FileSend allows sending files from the server back to the client.
service FileSend{ service FileSend{
rpc DiffCopy(stream BytesMessage) returns (stream BytesMessage); rpc DiffCopy(stream BytesMessage) returns (stream BytesMessage);
} }
// BytesMessage contains a chunk of byte data // BytesMessage contains a chunk of byte data
message BytesMessage{ message BytesMessage {
bytes data = 1; bytes data = 1;
} }

View File

@ -14,7 +14,7 @@ func IsCanceled(ctx context.Context, err error) bool {
return true return true
} }
// grpc does not set cancel correctly when stream gets cancelled and then Recv is called // grpc does not set cancel correctly when stream gets cancelled and then Recv is called
if err != nil && context.Cause(ctx) == context.Canceled { if err != nil && errors.Is(context.Cause(ctx), context.Canceled) {
// when this error comes from containerd it is not typed at all, just concatenated string // when this error comes from containerd it is not typed at all, just concatenated string
if strings.Contains(err.Error(), "EOF") { if strings.Contains(err.Error(), "EOF") {
return true return true

View File

@ -85,6 +85,8 @@ const (
// CapSourceDateEpoch is the capability to automatically handle the date epoch // CapSourceDateEpoch is the capability to automatically handle the date epoch
CapSourceDateEpoch apicaps.CapID = "exporter.sourcedateepoch" CapSourceDateEpoch apicaps.CapID = "exporter.sourcedateepoch"
CapMultipleExporters apicaps.CapID = "exporter.multiple"
CapSourcePolicy apicaps.CapID = "source.policy" CapSourcePolicy apicaps.CapID = "source.policy"
) )
@ -454,6 +456,12 @@ func init() {
Status: apicaps.CapStatusExperimental, Status: apicaps.CapStatusExperimental,
}) })
Caps.Init(apicaps.Cap{
ID: CapMultipleExporters,
Enabled: true,
Status: apicaps.CapStatusExperimental,
})
Caps.Init(apicaps.Cap{ Caps.Init(apicaps.Cap{
ID: CapSourcePolicy, ID: CapSourcePolicy,
Enabled: true, Enabled: true,

View File

@ -1,6 +1,7 @@
package result package result
import ( import (
"maps"
"sync" "sync"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -14,6 +15,15 @@ type Result[T comparable] struct {
Attestations map[string][]Attestation[T] Attestations map[string][]Attestation[T]
} }
func (r *Result[T]) Clone() *Result[T] {
return &Result[T]{
Ref: r.Ref,
Refs: maps.Clone(r.Refs),
Metadata: maps.Clone(r.Metadata),
Attestations: maps.Clone(r.Attestations),
}
}
func (r *Result[T]) AddMeta(k string, v []byte) { func (r *Result[T]) AddMeta(k string, v []byte) {
r.mu.Lock() r.mu.Lock()
if r.Metadata == nil { if r.Metadata == nil {
@ -142,6 +152,10 @@ func EachRef[U comparable, V comparable](a *Result[U], b *Result[V], fn func(U,
return err return err
} }
// ConvertResult transforms a Result[U] into a Result[V], using a transfomer
// function that converts a U to a V. Zero values of type U are converted to
// zero values of type V directly, without passing through the transformer
// function.
func ConvertResult[U comparable, V comparable](r *Result[U], fn func(U) (V, error)) (*Result[V], error) { func ConvertResult[U comparable, V comparable](r *Result[U], fn func(U) (V, error)) (*Result[V], error) {
var zero U var zero U
@ -160,6 +174,8 @@ func ConvertResult[U comparable, V comparable](r *Result[U], fn func(U) (V, erro
} }
for k, r := range r.Refs { for k, r := range r.Refs {
if r == zero { if r == zero {
var zero V
r2.Refs[k] = zero
continue continue
} }
r2.Refs[k], err = fn(r) r2.Refs[k], err = fn(r)

View File

@ -17,6 +17,10 @@ const (
DefaultCNIConfigPath = "/etc/buildkit/cni.json" DefaultCNIConfigPath = "/etc/buildkit/cni.json"
) )
var (
UserCNIConfigPath = filepath.Join(UserConfigDir(), "cni.json")
)
// UserAddress typically returns /run/user/$UID/buildkit/buildkitd.sock // UserAddress typically returns /run/user/$UID/buildkit/buildkitd.sock
func UserAddress() string { func UserAddress() string {
// pam_systemd sets XDG_RUNTIME_DIR but not other dirs. // pam_systemd sets XDG_RUNTIME_DIR but not other dirs.

View File

@ -16,6 +16,10 @@ var (
DefaultCNIConfigPath = filepath.Join(ConfigDir, "cni.json") DefaultCNIConfigPath = filepath.Join(ConfigDir, "cni.json")
) )
var (
UserCNIConfigPath = DefaultCNIConfigPath
)
func UserAddress() string { func UserAddress() string {
return Address return Address
} }

View File

@ -36,6 +36,15 @@ func (ps *MultiWriter) Add(pw Writer) {
if !ok { if !ok {
return return
} }
if pws, ok := rw.(*MultiWriter); ok {
if pws.contains(ps) {
// this would cause a deadlock, so we should panic instead
// NOTE: this can be caused by a cycle in the scheduler states,
// which is created by a series of unfortunate edge merges
panic("multiwriter loop detected")
}
}
ps.mu.Lock() ps.mu.Lock()
plist := make([]*Progress, 0, len(ps.items)) plist := make([]*Progress, 0, len(ps.items))
plist = append(plist, ps.items...) plist = append(plist, ps.items...)
@ -102,3 +111,24 @@ func (ps *MultiWriter) writeRawProgress(p *Progress) error {
func (ps *MultiWriter) Close() error { func (ps *MultiWriter) Close() error {
return nil return nil
} }
func (ps *MultiWriter) contains(pw rawProgressWriter) bool {
ps.mu.Lock()
defer ps.mu.Unlock()
_, ok := ps.writers[pw]
if ok {
return true
}
for w := range ps.writers {
w, ok := w.(*MultiWriter)
if !ok {
continue
}
if w.contains(pw) {
return true
}
}
return false
}

View File

@ -38,6 +38,7 @@ type Backend interface {
ContainerdAddress() string ContainerdAddress() string
Rootless() bool Rootless() bool
NetNSDetached() bool
Snapshotter() string Snapshotter() string
Supports(feature string) bool Supports(feature string) bool
} }
@ -66,6 +67,7 @@ type Worker interface {
Close() error Close() error
Name() string Name() string
Rootless() bool Rootless() bool
NetNSDetached() bool
} }
type ConfigUpdater interface { type ConfigUpdater interface {

View File

@ -10,6 +10,7 @@ type backend struct {
dockerAddress string dockerAddress string
containerdAddress string containerdAddress string
rootless bool rootless bool
netnsDetached bool
snapshotter string snapshotter string
unsupportedFeatures []string unsupportedFeatures []string
isDockerd bool isDockerd bool
@ -31,6 +32,10 @@ func (b backend) Rootless() bool {
return b.rootless return b.rootless
} }
func (b backend) NetNSDetached() bool {
return b.netnsDetached
}
func (b backend) Snapshotter() string { func (b backend) Snapshotter() string {
return b.snapshotter return b.snapshotter
} }

View File

@ -55,6 +55,8 @@ func InitContainerdWorker() {
GID: gid, GID: gid,
Snapshotter: "native", // TODO: test with fuse-overlayfs as well, or automatically determine snapshotter Snapshotter: "native", // TODO: test with fuse-overlayfs as well, or automatically determine snapshotter
}) })
// TODO: add RootlessKitDetachNetNS after updating containerd-rootless.sh to include https://github.com/containerd/nerdctl/pull/2723
} }
} }
@ -84,6 +86,10 @@ func (c *Containerd) Rootless() bool {
return c.UID != 0 return c.UID != 0
} }
func (c *Containerd) NetNSDetached() bool {
return false
}
func (c *Containerd) New(ctx context.Context, cfg *integration.BackendConfig) (b integration.Backend, cl func() error, err error) { func (c *Containerd) New(ctx context.Context, cfg *integration.BackendConfig) (b integration.Backend, cl func() error, err error) {
if err := integration.LookupBinary(c.Containerd); err != nil { if err := integration.LookupBinary(c.Containerd); err != nil {
return nil, nil, err return nil, nil, err
@ -236,6 +242,7 @@ disabled_plugins = ["cri"]
address: buildkitdSock, address: buildkitdSock,
containerdAddress: address, containerdAddress: address,
rootless: rootless, rootless: rootless,
netnsDetached: false,
snapshotter: c.Snapshotter, snapshotter: c.Snapshotter,
}, cl, nil }, cl, nil
} }

View File

@ -71,6 +71,10 @@ func (c Moby) Rootless() bool {
return c.IsRootless return c.IsRootless
} }
func (c Moby) NetNSDetached() bool {
return false
}
func (c Moby) New(ctx context.Context, cfg *integration.BackendConfig) (b integration.Backend, cl func() error, err error) { func (c Moby) New(ctx context.Context, cfg *integration.BackendConfig) (b integration.Backend, cl func() error, err error) {
if err := requireRoot(); err != nil { if err := requireRoot(); err != nil {
return nil, nil, err return nil, nil, err
@ -224,6 +228,7 @@ func (c Moby) New(ctx context.Context, cfg *integration.BackendConfig) (b integr
address: "unix://" + listener.Addr().String(), address: "unix://" + listener.Addr().String(),
dockerAddress: d.Sock(), dockerAddress: d.Sock(),
rootless: c.IsRootless, rootless: c.IsRootless,
netnsDetached: false,
isDockerd: true, isDockerd: true,
unsupportedFeatures: c.Unsupported, unsupportedFeatures: c.Unsupported,
}, cl, nil }, cl, nil

View File

@ -19,10 +19,12 @@ func InitOCIWorker() {
} }
type OCI struct { type OCI struct {
ID string ID string
UID int UID int
GID int GID int
Snapshotter string Snapshotter string
RootlessKitNet string // e.g., "slirp4netns"
RootlessKitDetachNetNS bool // needs RootlessKitNet to be non-host network
} }
func (s *OCI) Name() string { func (s *OCI) Name() string {
@ -33,6 +35,10 @@ func (s *OCI) Rootless() bool {
return s.UID != 0 return s.UID != 0
} }
func (s *OCI) NetNSDetached() bool {
return s.Rootless() && s.RootlessKitDetachNetNS
}
func (s *OCI) New(ctx context.Context, cfg *integration.BackendConfig) (integration.Backend, func() error, error) { func (s *OCI) New(ctx context.Context, cfg *integration.BackendConfig) (integration.Backend, func() error, error) {
if err := integration.LookupBinary("buildkitd"); err != nil { if err := integration.LookupBinary("buildkitd"); err != nil {
return nil, nil, err return nil, nil, err
@ -52,8 +58,19 @@ func (s *OCI) New(ctx context.Context, cfg *integration.BackendConfig) (integrat
if s.GID == 0 { if s.GID == 0 {
return nil, nil, errors.Errorf("unsupported id pair: uid=%d, gid=%d", s.UID, s.GID) return nil, nil, errors.Errorf("unsupported id pair: uid=%d, gid=%d", s.UID, s.GID)
} }
var rootlessKitArgs []string
switch s.RootlessKitNet {
case "", "host":
// NOP
default:
// See docs/rootless.md
rootlessKitArgs = append(rootlessKitArgs, "--net="+s.RootlessKitNet, "--copy-up=/etc", "--disable-host-loopback")
}
if s.RootlessKitDetachNetNS {
rootlessKitArgs = append(rootlessKitArgs, "--detach-netns")
}
// TODO: make sure the user exists and subuid/subgid are configured. // TODO: make sure the user exists and subuid/subgid are configured.
buildkitdArgs = append([]string{"sudo", "-u", fmt.Sprintf("#%d", s.UID), "-i", "--", "exec", "rootlesskit"}, buildkitdArgs...) buildkitdArgs = append(append([]string{"sudo", "-u", fmt.Sprintf("#%d", s.UID), "-i", "--", "exec", "rootlesskit"}, rootlessKitArgs...), buildkitdArgs...)
} }
var extraEnv []string var extraEnv []string
@ -67,9 +84,10 @@ func (s *OCI) New(ctx context.Context, cfg *integration.BackendConfig) (integrat
} }
return backend{ return backend{
address: buildkitdSock, address: buildkitdSock,
rootless: s.UID != 0, rootless: s.UID != 0,
snapshotter: s.Snapshotter, netnsDetached: s.NetNSDetached(),
snapshotter: s.Snapshotter,
}, stop, nil }, stop, nil
} }

View File

@ -22,6 +22,8 @@ func initOCIWorker() {
} }
if integration.RootlessSupported(uid) { if integration.RootlessSupported(uid) {
integration.Register(&OCI{ID: "oci-rootless", UID: uid, GID: gid}) integration.Register(&OCI{ID: "oci-rootless", UID: uid, GID: gid})
integration.Register(&OCI{ID: "oci-rootless-slirp4netns-detachnetns", UID: uid, GID: gid,
RootlessKitNet: "slirp4netns", RootlessKitDetachNetNS: true})
} }
} }

6
vendor/modules.txt vendored
View File

@ -317,8 +317,8 @@ github.com/felixge/httpsnoop
# github.com/fvbommel/sortorder v1.0.1 # github.com/fvbommel/sortorder v1.0.1
## explicit; go 1.13 ## explicit; go 1.13
github.com/fvbommel/sortorder github.com/fvbommel/sortorder
# github.com/go-logr/logr v1.2.4 # github.com/go-logr/logr v1.3.0
## explicit; go 1.16 ## explicit; go 1.18
github.com/go-logr/logr github.com/go-logr/logr
github.com/go-logr/logr/funcr github.com/go-logr/logr/funcr
# github.com/go-logr/stdr v1.2.2 # github.com/go-logr/stdr v1.2.2
@ -487,7 +487,7 @@ github.com/mitchellh/go-wordwrap
# github.com/mitchellh/mapstructure v1.5.0 # github.com/mitchellh/mapstructure v1.5.0
## explicit; go 1.14 ## explicit; go 1.14
github.com/mitchellh/mapstructure github.com/mitchellh/mapstructure
# github.com/moby/buildkit v0.13.0-beta1.0.20240105171016-6e200afad512 # github.com/moby/buildkit v0.13.0-beta1.0.20240126101002-6bd81372ad6f
## explicit; go 1.21 ## explicit; go 1.21
github.com/moby/buildkit/api/services/control github.com/moby/buildkit/api/services/control
github.com/moby/buildkit/api/types github.com/moby/buildkit/api/types