diff --git a/go.mod b/go.mod index bc62f848..540ada85 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/aws/aws-sdk-go-v2/config v1.26.6 github.com/compose-spec/compose-go/v2 v2.0.0-rc.8 github.com/containerd/console v1.0.4 - github.com/containerd/containerd v1.7.13 + github.com/containerd/containerd v1.7.14 github.com/containerd/continuity v0.4.3 github.com/containerd/log v0.1.0 github.com/containerd/typeurl/v2 v2.1.1 @@ -26,7 +26,7 @@ require ( github.com/hashicorp/go-cty-funcs v0.0.0-20230405223818-a090f58aa992 github.com/hashicorp/hcl/v2 v2.19.1 github.com/in-toto/in-toto-golang v0.5.0 - github.com/moby/buildkit v0.13.0 + github.com/moby/buildkit v0.13.0-rc3.0.20240328152707-25bec7145b39 // v0.14.0-dev github.com/moby/sys/mountinfo v0.7.1 github.com/moby/sys/signal v0.7.0 github.com/morikuni/aec v1.0.0 @@ -83,7 +83,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/containerd/ttrpc v1.2.2 // indirect + github.com/containerd/ttrpc v1.2.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/distribution v2.8.2+incompatible // indirect github.com/docker/docker-credential-helpers v0.8.0 // indirect diff --git a/go.sum b/go.sum index 24cf30f0..a95bbe55 100644 --- a/go.sum +++ b/go.sum @@ -94,8 +94,8 @@ github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaD github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= -github.com/containerd/containerd v1.7.13 h1:wPYKIeGMN8vaggSKuV1X0wZulpMz4CrgEsZdaCyB6Is= -github.com/containerd/containerd v1.7.13/go.mod h1:zT3up6yTRfEUa6+GsITYIJNgSVL9NQ4x4h1RPzk0Wu4= +github.com/containerd/containerd v1.7.14 h1:H/XLzbnGuenZEGK+v0RkwTdv2u1QFAruMe5N0GNPJwA= +github.com/containerd/containerd v1.7.14/go.mod h1:YMC9Qt5yzNqXx/fO4j/5yYVIHXSRrlB3H7sxkUTvspg= github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY= @@ -107,8 +107,8 @@ github.com/containerd/nydus-snapshotter v0.13.7/go.mod h1:VPVKQ3jmHFIcUIV2yiQ1kI github.com/containerd/stargz-snapshotter v0.15.1 h1:fpsP4kf/Z4n2EYnU0WT8ZCE3eiKDwikDhL6VwxIlgeA= github.com/containerd/stargz-snapshotter/estargz v0.15.1 h1:eXJjw9RbkLFgioVaTG+G/ZW/0kEe2oEKCdS/ZxIyoCU= github.com/containerd/stargz-snapshotter/estargz v0.15.1/go.mod h1:gr2RNwukQ/S9Nv33Lt6UC7xEx58C+LHRdoqbEKjz1Kk= -github.com/containerd/ttrpc v1.2.2 h1:9vqZr0pxwOF5koz6N0N3kJ0zDHokrcPxIR/ZR2YFtOs= -github.com/containerd/ttrpc v1.2.2/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak= +github.com/containerd/ttrpc v1.2.3 h1:4jlhbXIGvijRtNC8F/5CpuJZ7yKOBFGFOOXg1bkISz0= +github.com/containerd/ttrpc v1.2.3/go.mod h1:ieWsXucbb8Mj9PH0rXCw1i8IunRbbAiDkpXkbfflWBM= github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -214,7 +214,6 @@ github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYu github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -311,8 +310,8 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/buildkit v0.13.0 h1:reVR1Y+rbNIUQ9jf0Q1YZVH5a/nhOixZsl+HJ9qQEGI= -github.com/moby/buildkit v0.13.0/go.mod h1:aNmNQKLBFYAOFuzQjR3VA27/FijlvtBD1pjNwTSN37k= +github.com/moby/buildkit v0.13.0-rc3.0.20240328152707-25bec7145b39 h1:bROKMNZ3Sj9v7N2lRzw10+mYmG/J/9Rea3y+R+TQHeI= +github.com/moby/buildkit v0.13.0-rc3.0.20240328152707-25bec7145b39/go.mod h1:K7Ft9VUOHTwKY+xEWSIMZoj5kFA6QsLjBJymqp6S3wQ= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= @@ -396,7 +395,6 @@ github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= @@ -416,7 +414,6 @@ github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjM github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spdx/tools-golang v0.5.3 h1:ialnHeEYUC4+hkm5vJm4qz2x+oEJbS0mAMFrNXdQraY= @@ -553,7 +550,6 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -567,7 +563,6 @@ golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -605,7 +600,6 @@ google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6 google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b h1:+YaDE2r2OG8t/z5qmsh7Y+XXwCbvadxxZ0YY6mTdrVA= google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= @@ -618,7 +612,6 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= diff --git a/tests/workers/backend.go b/tests/workers/backend.go index 69fb755f..c8742b60 100644 --- a/tests/workers/backend.go +++ b/tests/workers/backend.go @@ -39,6 +39,10 @@ func (s *backend) NetNSDetached() bool { return false } +func (s *backend) ExtraEnv() []string { + return nil +} + func (s backend) Supports(feature string) bool { if enabledFeatures := os.Getenv("BUILDKIT_TEST_ENABLE_FEATURES"); enabledFeatures != "" { for _, enabledFeature := range strings.Split(enabledFeatures, ",") { diff --git a/vendor/github.com/containerd/containerd/content/helpers.go b/vendor/github.com/containerd/containerd/content/helpers.go index 14700541..d3a82cb6 100644 --- a/vendor/github.com/containerd/containerd/content/helpers.go +++ b/vendor/github.com/containerd/containerd/content/helpers.go @@ -31,9 +31,6 @@ import ( ocispec "github.com/opencontainers/image-spec/specs-go/v1" ) -// maxResets is the no.of times the Copy() method can tolerate a reset of the body -const maxResets = 5 - var ErrReset = errors.New("writer has been reset") var bufPool = sync.Pool{ @@ -160,7 +157,7 @@ func Copy(ctx context.Context, cw Writer, or io.Reader, size int64, expected dig } } - for i := 0; i < maxResets; i++ { + for i := 0; ; i++ { if i >= 1 { log.G(ctx).WithField("digest", expected).Debugf("retrying copy due to reset") } @@ -201,9 +198,6 @@ func Copy(ctx context.Context, cw Writer, or io.Reader, size int64, expected dig } return nil } - - log.G(ctx).WithField("digest", expected).Errorf("failed to copy after %d retries", maxResets) - return fmt.Errorf("failed to copy after %d retries", maxResets) } // CopyReaderAt copies to a writer from a given reader at for the given diff --git a/vendor/github.com/containerd/containerd/remotes/docker/pusher.go b/vendor/github.com/containerd/containerd/remotes/docker/pusher.go index 678e17e1..218a5dd3 100644 --- a/vendor/github.com/containerd/containerd/remotes/docker/pusher.go +++ b/vendor/github.com/containerd/containerd/remotes/docker/pusher.go @@ -284,7 +284,7 @@ func (p dockerPusher) push(ctx context.Context, desc ocispec.Descriptor, ref str req.body = func() (io.ReadCloser, error) { pr, pw := io.Pipe() pushw.setPipe(pw) - return io.NopCloser(pr), nil + return pr, nil } req.size = desc.Size @@ -292,7 +292,6 @@ func (p dockerPusher) push(ctx context.Context, desc ocispec.Descriptor, ref str resp, err := req.doWithRetries(ctx, nil) if err != nil { pushw.setError(err) - pushw.Close() return } @@ -302,7 +301,7 @@ func (p dockerPusher) push(ctx context.Context, desc ocispec.Descriptor, ref str err := remoteserrors.NewUnexpectedStatusErr(resp) log.G(ctx).WithField("resp", resp).WithField("body", string(err.(remoteserrors.ErrUnexpectedStatus).Body)).Debug("unexpected response") pushw.setError(err) - pushw.Close() + return } pushw.setResponse(resp) }() @@ -335,10 +334,12 @@ type pushWriter struct { pipe *io.PipeWriter - pipeC chan *io.PipeWriter - respC chan *http.Response + done chan struct{} closeOnce sync.Once - errC chan error + + pipeC chan *io.PipeWriter + respC chan *http.Response + errC chan error isManifest bool @@ -356,19 +357,51 @@ func newPushWriter(db *dockerBase, ref string, expected digest.Digest, tracker S pipeC: make(chan *io.PipeWriter, 1), respC: make(chan *http.Response, 1), errC: make(chan error, 1), + done: make(chan struct{}), isManifest: isManifest, } } func (pw *pushWriter) setPipe(p *io.PipeWriter) { - pw.pipeC <- p + select { + case <-pw.done: + case pw.pipeC <- p: + } } func (pw *pushWriter) setError(err error) { - pw.errC <- err + select { + case <-pw.done: + case pw.errC <- err: + } } + func (pw *pushWriter) setResponse(resp *http.Response) { - pw.respC <- resp + select { + case <-pw.done: + case pw.respC <- resp: + } +} + +func (pw *pushWriter) replacePipe(p *io.PipeWriter) error { + if pw.pipe == nil { + pw.pipe = p + return nil + } + + pw.pipe.CloseWithError(content.ErrReset) + pw.pipe = p + + // If content has already been written, the bytes + // cannot be written again and the caller must reset + status, err := pw.tracker.GetStatus(pw.ref) + if err != nil { + return err + } + status.Offset = 0 + status.UpdatedAt = time.Now() + pw.tracker.SetStatus(pw.ref, status) + return content.ErrReset } func (pw *pushWriter) Write(p []byte) (n int, err error) { @@ -378,26 +411,18 @@ func (pw *pushWriter) Write(p []byte) (n int, err error) { } if pw.pipe == nil { - p, ok := <-pw.pipeC - if !ok { + select { + case <-pw.done: return 0, io.ErrClosedPipe + case p := <-pw.pipeC: + pw.replacePipe(p) } - pw.pipe = p } else { select { - case p, ok := <-pw.pipeC: - if !ok { - return 0, io.ErrClosedPipe - } - pw.pipe.CloseWithError(content.ErrReset) - pw.pipe = p - - // If content has already been written, the bytes - // cannot be written and the caller must reset - status.Offset = 0 - status.UpdatedAt = time.Now() - pw.tracker.SetStatus(pw.ref, status) - return 0, content.ErrReset + case <-pw.done: + return 0, io.ErrClosedPipe + case p := <-pw.pipeC: + return 0, pw.replacePipe(p) default: } } @@ -407,9 +432,13 @@ func (pw *pushWriter) Write(p []byte) (n int, err error) { // if the pipe is closed, we might have the original error on the error // channel - so we should try and get it select { - case err2 := <-pw.errC: - err = err2 - default: + case <-pw.done: + case err = <-pw.errC: + pw.Close() + case p := <-pw.pipeC: + return 0, pw.replacePipe(p) + case resp := <-pw.respC: + pw.setResponse(resp) } } status.Offset += int64(n) @@ -422,7 +451,7 @@ func (pw *pushWriter) Close() error { // Ensure pipeC is closed but handle `Close()` being // called multiple times without panicking pw.closeOnce.Do(func() { - close(pw.pipeC) + close(pw.done) }) if pw.pipe != nil { status, err := pw.tracker.GetStatus(pw.ref) @@ -462,30 +491,18 @@ func (pw *pushWriter) Commit(ctx context.Context, size int64, expected digest.Di // TODO: timeout waiting for response var resp *http.Response select { + case <-pw.done: + return io.ErrClosedPipe case err := <-pw.errC: + pw.Close() return err case resp = <-pw.respC: defer resp.Body.Close() - case p, ok := <-pw.pipeC: + case p := <-pw.pipeC: // check whether the pipe has changed in the commit, because sometimes Write // can complete successfully, but the pipe may have changed. In that case, the // content needs to be reset. - if !ok { - return io.ErrClosedPipe - } - pw.pipe.CloseWithError(content.ErrReset) - pw.pipe = p - - // If content has already been written, the bytes - // cannot be written again and the caller must reset - status, err := pw.tracker.GetStatus(pw.ref) - if err != nil { - return err - } - status.Offset = 0 - status.UpdatedAt = time.Now() - pw.tracker.SetStatus(pw.ref, status) - return content.ErrReset + return pw.replacePipe(p) } // 201 is specified return status, some registries return diff --git a/vendor/github.com/containerd/containerd/version/version.go b/vendor/github.com/containerd/containerd/version/version.go index 225ddc38..a5dac0e3 100644 --- a/vendor/github.com/containerd/containerd/version/version.go +++ b/vendor/github.com/containerd/containerd/version/version.go @@ -23,7 +23,7 @@ var ( Package = "github.com/containerd/containerd" // Version holds the complete version number. Filled in at linking time. - Version = "1.7.13+unknown" + Version = "1.7.14+unknown" // Revision is filled with the VCS (e.g. git) revision being used to build // the program at linking time. diff --git a/vendor/github.com/containerd/ttrpc/client.go b/vendor/github.com/containerd/ttrpc/client.go index 4b1e1e70..482a68e3 100644 --- a/vendor/github.com/containerd/ttrpc/client.go +++ b/vendor/github.com/containerd/ttrpc/client.go @@ -71,6 +71,42 @@ func WithUnaryClientInterceptor(i UnaryClientInterceptor) ClientOpts { } } +// WithChainUnaryClientInterceptor sets the provided chain of client interceptors +func WithChainUnaryClientInterceptor(interceptors ...UnaryClientInterceptor) ClientOpts { + return func(c *Client) { + if len(interceptors) == 0 { + return + } + if c.interceptor != nil { + interceptors = append([]UnaryClientInterceptor{c.interceptor}, interceptors...) + } + c.interceptor = func( + ctx context.Context, + req *Request, + reply *Response, + info *UnaryClientInfo, + final Invoker, + ) error { + return interceptors[0](ctx, req, reply, info, + chainUnaryInterceptors(interceptors[1:], final, info)) + } + } +} + +func chainUnaryInterceptors(interceptors []UnaryClientInterceptor, final Invoker, info *UnaryClientInfo) Invoker { + if len(interceptors) == 0 { + return final + } + return func( + ctx context.Context, + req *Request, + reply *Response, + ) error { + return interceptors[0](ctx, req, reply, info, + chainUnaryInterceptors(interceptors[1:], final, info)) + } +} + // NewClient creates a new ttrpc client using the given connection func NewClient(conn net.Conn, opts ...ClientOpts) *Client { ctx, cancel := context.WithCancel(context.Background()) @@ -85,13 +121,16 @@ func NewClient(conn net.Conn, opts ...ClientOpts) *Client { ctx: ctx, userCloseFunc: func() {}, userCloseWaitCh: make(chan struct{}), - interceptor: defaultClientInterceptor, } for _, o := range opts { o(c) } + if c.interceptor == nil { + c.interceptor = defaultClientInterceptor + } + go c.run() return c } @@ -286,7 +325,7 @@ func (c *Client) Close() error { return nil } -// UserOnCloseWait is used to blocks untils the user's on-close callback +// UserOnCloseWait is used to block until the user's on-close callback // finishes. func (c *Client) UserOnCloseWait(ctx context.Context) error { select { diff --git a/vendor/github.com/containerd/ttrpc/config.go b/vendor/github.com/containerd/ttrpc/config.go index 09741963..f401f67b 100644 --- a/vendor/github.com/containerd/ttrpc/config.go +++ b/vendor/github.com/containerd/ttrpc/config.go @@ -16,7 +16,10 @@ package ttrpc -import "errors" +import ( + "context" + "errors" +) type serverConfig struct { handshaker Handshaker @@ -44,9 +47,40 @@ func WithServerHandshaker(handshaker Handshaker) ServerOpt { func WithUnaryServerInterceptor(i UnaryServerInterceptor) ServerOpt { return func(c *serverConfig) error { if c.interceptor != nil { - return errors.New("only one interceptor allowed per server") + return errors.New("only one unchained interceptor allowed per server") } c.interceptor = i return nil } } + +// WithChainUnaryServerInterceptor sets the provided chain of server interceptors +func WithChainUnaryServerInterceptor(interceptors ...UnaryServerInterceptor) ServerOpt { + return func(c *serverConfig) error { + if len(interceptors) == 0 { + return nil + } + if c.interceptor != nil { + interceptors = append([]UnaryServerInterceptor{c.interceptor}, interceptors...) + } + c.interceptor = func( + ctx context.Context, + unmarshal Unmarshaler, + info *UnaryServerInfo, + method Method) (interface{}, error) { + return interceptors[0](ctx, unmarshal, info, + chainUnaryServerInterceptors(info, method, interceptors[1:])) + } + return nil + } +} + +func chainUnaryServerInterceptors(info *UnaryServerInfo, method Method, interceptors []UnaryServerInterceptor) Method { + if len(interceptors) == 0 { + return method + } + return func(ctx context.Context, unmarshal func(interface{}) error) (interface{}, error) { + return interceptors[0](ctx, unmarshal, info, + chainUnaryServerInterceptors(info, method, interceptors[1:])) + } +} diff --git a/vendor/github.com/containerd/ttrpc/services.go b/vendor/github.com/containerd/ttrpc/services.go index 6aabfbb4..6d092bf9 100644 --- a/vendor/github.com/containerd/ttrpc/services.go +++ b/vendor/github.com/containerd/ttrpc/services.go @@ -140,7 +140,11 @@ func (s *serviceSet) handle(ctx context.Context, req *Request, respond func(*sta respond(st, p, stream.StreamingServer, true) }() - if req.Payload != nil { + // Empty proto messages serialized to 0 payloads, + // so signatures like: rpc Stream(google.protobuf.Empty) returns (stream Data); + // don't get invoked here, which causes hang on client side. + // See https://github.com/containerd/ttrpc/issues/126 + if req.Payload != nil || !info.StreamingClient { unmarshal := func(obj interface{}) error { return protoUnmarshal(req.Payload, obj) } diff --git a/vendor/github.com/moby/buildkit/client/client.go b/vendor/github.com/moby/buildkit/client/client.go index 26c91c37..414e156d 100644 --- a/vendor/github.com/moby/buildkit/client/client.go +++ b/vendor/github.com/moby/buildkit/client/client.go @@ -101,7 +101,7 @@ func New(ctx context.Context, address string, opts ...ClientOpt) (*Client, error } if tracerProvider != nil { - var propagators = propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}) + propagators := propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}) unary = append(unary, filterInterceptor(otelgrpc.UnaryClientInterceptor(otelgrpc.WithTracerProvider(tracerProvider), otelgrpc.WithPropagators(propagators)))) //nolint:staticcheck // TODO(thaJeztah): ignore SA1019 for deprecated options: see https://github.com/moby/buildkit/issues/4681 stream = append(stream, otelgrpc.StreamClientInterceptor(otelgrpc.WithTracerProvider(tracerProvider), otelgrpc.WithPropagators(propagators))) //nolint:staticcheck // TODO(thaJeztah): ignore SA1019 for deprecated options: see https://github.com/moby/buildkit/issues/4681 } @@ -111,11 +111,17 @@ func New(ctx context.Context, address string, opts ...ClientOpt) (*Client, error if err != nil { return nil, err } - gopts = append(gopts, grpc.WithContextDialer(dialFn)) + if dialFn != nil { + gopts = append(gopts, grpc.WithContextDialer(dialFn)) + } } if address == "" { address = appdefaults.Address } + uri, err := url.Parse(address) + if err != nil { + return nil, err + } // Setting :authority pseudo header // - HTTP/2 (RFC7540) defines :authority pseudo header includes @@ -130,12 +136,14 @@ func New(ctx context.Context, address string, opts ...ClientOpt) (*Client, error } if authority == "" { // authority as hostname from target address - uri, err := url.Parse(address) - if err != nil { - return nil, err - } authority = uri.Host } + if uri.Scheme == "tcp" { + // remove tcp scheme from address, since default dialer doesn't expect that + // name resolution is done by grpc according to the following spec: https://github.com/grpc/grpc/blob/master/doc/naming.md + address = uri.Host + } + gopts = append(gopts, grpc.WithAuthority(authority)) unary = append(unary, grpcerrors.UnaryClientInterceptor) @@ -375,8 +383,7 @@ func resolveDialer(address string) (func(context.Context, string) (net.Conn, err if ch != nil { return ch.ContextDialer, nil } - // basic dialer - return dialer, nil + return nil, nil } func filterInterceptor(intercept grpc.UnaryClientInterceptor) grpc.UnaryClientInterceptor { diff --git a/vendor/github.com/moby/buildkit/client/client_unix.go b/vendor/github.com/moby/buildkit/client/client_unix.go deleted file mode 100644 index dc55a4b6..00000000 --- a/vendor/github.com/moby/buildkit/client/client_unix.go +++ /dev/null @@ -1,21 +0,0 @@ -//go:build !windows -// +build !windows - -package client - -import ( - "context" - "net" - "strings" - - "github.com/pkg/errors" -) - -func dialer(ctx context.Context, address string) (net.Conn, error) { - addrParts := strings.SplitN(address, "://", 2) - if len(addrParts) != 2 { - return nil, errors.Errorf("invalid address %s", address) - } - var d net.Dialer - return d.DialContext(ctx, addrParts[0], addrParts[1]) -} diff --git a/vendor/github.com/moby/buildkit/client/client_windows.go b/vendor/github.com/moby/buildkit/client/client_windows.go deleted file mode 100644 index a9eb87f2..00000000 --- a/vendor/github.com/moby/buildkit/client/client_windows.go +++ /dev/null @@ -1,25 +0,0 @@ -package client - -import ( - "context" - "net" - "strings" - - winio "github.com/Microsoft/go-winio" - "github.com/pkg/errors" -) - -func dialer(ctx context.Context, address string) (net.Conn, error) { - addrParts := strings.SplitN(address, "://", 2) - if len(addrParts) != 2 { - return nil, errors.Errorf("invalid address %s", address) - } - switch addrParts[0] { - case "npipe": - address = strings.Replace(addrParts[1], "/", "\\", -1) - return winio.DialPipeContext(ctx, address) - default: - var d net.Dialer - return d.DialContext(ctx, addrParts[0], addrParts[1]) - } -} diff --git a/vendor/github.com/moby/buildkit/client/connhelper/npipe/npipe.go b/vendor/github.com/moby/buildkit/client/connhelper/npipe/npipe.go new file mode 100644 index 00000000..0abe81b4 --- /dev/null +++ b/vendor/github.com/moby/buildkit/client/connhelper/npipe/npipe.go @@ -0,0 +1,8 @@ +// Package npipe provides connhelper for npipe://
+package npipe + +import "github.com/moby/buildkit/client/connhelper" + +func init() { + connhelper.Register("npipe", Helper) +} diff --git a/vendor/github.com/moby/buildkit/client/connhelper/npipe/npipe_other.go b/vendor/github.com/moby/buildkit/client/connhelper/npipe/npipe_other.go new file mode 100644 index 00000000..75936f48 --- /dev/null +++ b/vendor/github.com/moby/buildkit/client/connhelper/npipe/npipe_other.go @@ -0,0 +1,14 @@ +//go:build !windows + +package npipe + +import ( + "errors" + "net/url" + + "github.com/moby/buildkit/client/connhelper" +) + +func Helper(u *url.URL) (*connhelper.ConnectionHelper, error) { + return nil, errors.New("npipe connections are only supported on windows") +} diff --git a/vendor/github.com/moby/buildkit/client/connhelper/npipe/npipe_windows.go b/vendor/github.com/moby/buildkit/client/connhelper/npipe/npipe_windows.go new file mode 100644 index 00000000..00e83225 --- /dev/null +++ b/vendor/github.com/moby/buildkit/client/connhelper/npipe/npipe_windows.go @@ -0,0 +1,28 @@ +//go:build windows + +package npipe + +import ( + "context" + "net" + "net/url" + "strings" + + "github.com/Microsoft/go-winio" + "github.com/moby/buildkit/client/connhelper" + "github.com/pkg/errors" +) + +// Helper returns helper for connecting to a url via npipes. +func Helper(u *url.URL) (*connhelper.ConnectionHelper, error) { + addrParts := strings.SplitN(u.String(), "://", 2) + if len(addrParts) != 2 { + return nil, errors.Errorf("invalid address %s", u) + } + address := strings.Replace(addrParts[1], "/", "\\", -1) + return &connhelper.ConnectionHelper{ + ContextDialer: func(ctx context.Context, addr string) (net.Conn, error) { + return winio.DialPipeContext(ctx, address) + }, + }, nil +} diff --git a/vendor/github.com/moby/buildkit/client/llb/exec.go b/vendor/github.com/moby/buildkit/client/llb/exec.go index 17d6cd75..457a9b1f 100644 --- a/vendor/github.com/moby/buildkit/client/llb/exec.go +++ b/vendor/github.com/moby/buildkit/client/llb/exec.go @@ -438,15 +438,23 @@ func (e *ExecOp) Output() Output { } func (e *ExecOp) Inputs() (inputs []Output) { - mm := map[Output]struct{}{} + // make sure mounts are sorted + // the same sort occurs in (*ExecOp).Marshal, and this + // sort must be the same + sort.Slice(e.mounts, func(i int, j int) bool { + return e.mounts[i].target < e.mounts[j].target + }) + + seen := map[Output]struct{}{} for _, m := range e.mounts { if m.source != nil { - mm[m.source] = struct{}{} + if _, ok := seen[m.source]; !ok { + inputs = append(inputs, m.source) + seen[m.source] = struct{}{} + } } } - for o := range mm { - inputs = append(inputs, o) - } + return } diff --git a/vendor/github.com/moby/buildkit/client/llb/fileop.go b/vendor/github.com/moby/buildkit/client/llb/fileop.go index 1b01113e..120183b2 100644 --- a/vendor/github.com/moby/buildkit/client/llb/fileop.go +++ b/vendor/github.com/moby/buildkit/client/llb/fileop.go @@ -96,24 +96,35 @@ func (fa *FileAction) Copy(input CopyInput, src, dest string, opt ...CopyOption) return a } -func (fa *FileAction) allOutputs(m map[Output]struct{}) { +func (fa *FileAction) allOutputs(seen map[Output]struct{}, outputs []Output) []Output { if fa == nil { - return + return outputs } - if fa.state != nil && fa.state.Output() != nil { - m[fa.state.Output()] = struct{}{} + + if fa.state != nil { + out := fa.state.Output() + if out != nil { + if _, ok := seen[out]; !ok { + outputs = append(outputs, out) + seen[out] = struct{}{} + } + } } if a, ok := fa.action.(*fileActionCopy); ok { if a.state != nil { - if out := a.state.Output(); out != nil { - m[out] = struct{}{} + out := a.state.Output() + if out != nil { + if _, ok := seen[out]; !ok { + outputs = append(outputs, out) + seen[out] = struct{}{} + } } } else if a.fas != nil { - a.fas.allOutputs(m) + outputs = a.fas.allOutputs(seen, outputs) } } - fa.prev.allOutputs(m) + return fa.prev.allOutputs(seen, outputs) } func (fa *FileAction) bind(s State) *FileAction { @@ -806,15 +817,8 @@ func (f *FileOp) Output() Output { return f.output } -func (f *FileOp) Inputs() (inputs []Output) { - mm := map[Output]struct{}{} - - f.action.allOutputs(mm) - - for o := range mm { - inputs = append(inputs, o) - } - return inputs +func (f *FileOp) Inputs() []Output { + return f.action.allOutputs(map[Output]struct{}{}, []Output{}) } func getIndex(input pb.InputIndex, len int, relative *int) pb.InputIndex { diff --git a/vendor/github.com/moby/buildkit/client/llb/source.go b/vendor/github.com/moby/buildkit/client/llb/source.go index 3139a7b4..20e7d86c 100644 --- a/vendor/github.com/moby/buildkit/client/llb/source.go +++ b/vendor/github.com/moby/buildkit/client/llb/source.go @@ -227,6 +227,11 @@ type ImageInfo struct { RecordType string } +const ( + GitAuthHeaderKey = "GIT_AUTH_HEADER" + GitAuthTokenKey = "GIT_AUTH_TOKEN" +) + // Git returns a state that represents a git repository. // Example: // @@ -267,8 +272,8 @@ func Git(url, ref string, opts ...GitOption) State { } gi := &GitInfo{ - AuthHeaderSecret: "GIT_AUTH_HEADER", - AuthTokenSecret: "GIT_AUTH_TOKEN", + AuthHeaderSecret: GitAuthHeaderKey, + AuthTokenSecret: GitAuthTokenKey, } for _, o := range opts { o.SetGitOption(gi) diff --git a/vendor/github.com/moby/buildkit/client/ociindex/ociindex.go b/vendor/github.com/moby/buildkit/client/ociindex/ociindex.go index 512a77a6..5321f773 100644 --- a/vendor/github.com/moby/buildkit/client/ociindex/ociindex.go +++ b/vendor/github.com/moby/buildkit/client/ociindex/ociindex.go @@ -102,6 +102,7 @@ func (s StoreIndex) Put(tag string, desc ocispecs.Descriptor) error { } } + setOCIIndexDefaults(&idx) if err = insertDesc(&idx, desc, tag); err != nil { return err } @@ -145,6 +146,19 @@ func (s StoreIndex) GetSingle() (*ocispecs.Descriptor, error) { return nil, nil } +// setOCIIndexDefaults updates zero values in index to their default values. +func setOCIIndexDefaults(index *ocispecs.Index) { + if index == nil { + return + } + if index.SchemaVersion == 0 { + index.SchemaVersion = 2 + } + if index.MediaType == "" { + index.MediaType = ocispecs.MediaTypeImageIndex + } +} + // insertDesc puts desc to index with tag. // Existing manifests with the same tag will be removed from the index. func insertDesc(index *ocispecs.Index, desc ocispecs.Descriptor, tag string) error { @@ -152,9 +166,6 @@ func insertDesc(index *ocispecs.Index, desc ocispecs.Descriptor, tag string) err return nil } - if index.SchemaVersion == 0 { - index.SchemaVersion = 2 - } if tag != "" { if desc.Annotations == nil { desc.Annotations = make(map[string]string) diff --git a/vendor/github.com/moby/buildkit/util/contentutil/multiprovider.go b/vendor/github.com/moby/buildkit/util/contentutil/multiprovider.go index f61f33d5..c34d9efc 100644 --- a/vendor/github.com/moby/buildkit/util/contentutil/multiprovider.go +++ b/vendor/github.com/moby/buildkit/util/contentutil/multiprovider.go @@ -51,26 +51,6 @@ func (mp *MultiProvider) SnapshotLabels(descs []ocispecs.Descriptor, index int) return nil } -func (mp *MultiProvider) CheckDescriptor(ctx context.Context, desc ocispecs.Descriptor) error { - type checkDescriptor interface { - CheckDescriptor(context.Context, ocispecs.Descriptor) error - } - - mp.mu.RLock() - if p, ok := mp.sub[desc.Digest]; ok { - mp.mu.RUnlock() - if cd, ok := p.(checkDescriptor); ok { - return cd.CheckDescriptor(ctx, desc) - } - } else { - mp.mu.RUnlock() - } - if cd, ok := mp.base.(checkDescriptor); ok { - return cd.CheckDescriptor(ctx, desc) - } - return nil -} - // ReaderAt returns a content.ReaderAt func (mp *MultiProvider) ReaderAt(ctx context.Context, desc ocispecs.Descriptor) (content.ReaderAt, error) { mp.mu.RLock() diff --git a/vendor/github.com/moby/buildkit/util/gitutil/git_ref.go b/vendor/github.com/moby/buildkit/util/gitutil/git_ref.go index 6d058f2d..8a78bc16 100644 --- a/vendor/github.com/moby/buildkit/util/gitutil/git_ref.go +++ b/vendor/github.com/moby/buildkit/util/gitutil/git_ref.go @@ -57,7 +57,9 @@ func ParseGitRef(ref string) (*GitRef, error) { err error ) - if strings.HasPrefix(ref, "github.com/") { + if strings.HasPrefix(ref, "./") || strings.HasPrefix(ref, "../") { + return nil, errdefs.ErrInvalidArgument + } else if strings.HasPrefix(ref, "github.com/") { res.IndistinguishableFromLocal = true // Deprecated remote = fromURL(&url.URL{ Scheme: "https", diff --git a/vendor/github.com/moby/buildkit/util/testutil/dockerd/daemon.go b/vendor/github.com/moby/buildkit/util/testutil/dockerd/daemon.go index 24e05db0..f4684216 100644 --- a/vendor/github.com/moby/buildkit/util/testutil/dockerd/daemon.go +++ b/vendor/github.com/moby/buildkit/util/testutil/dockerd/daemon.go @@ -25,7 +25,7 @@ func (nopLog) Logf(string, ...interface{}) {} const ( shortLen = 12 - defaultDockerdBinary = "dockerd" + DefaultDockerdBinary = "dockerd" ) type Option func(*Daemon) @@ -43,6 +43,7 @@ type Daemon struct { pidFile string sockPath string args []string + envs []string } var sockRoot = filepath.Join(os.TempDir(), "docker-integration") @@ -69,9 +70,10 @@ func NewDaemon(workingDir string, ops ...Option) (*Daemon, error) { storageDriver: os.Getenv("DOCKER_GRAPHDRIVER"), // dxr stands for docker-execroot (shortened for avoiding unix(7) path length limitation) execRoot: filepath.Join(os.TempDir(), "dxr", id), - dockerdBinary: defaultDockerdBinary, + dockerdBinary: DefaultDockerdBinary, Log: nopLog{}, sockPath: filepath.Join(sockRoot, id+".sock"), + envs: append([]string{}, os.Environ()...), } for _, op := range ops { @@ -81,6 +83,18 @@ func NewDaemon(workingDir string, ops ...Option) (*Daemon, error) { return d, nil } +func WithBinary(bin string) Option { + return func(d *Daemon) { + d.dockerdBinary = bin + } +} + +func WithExtraEnv(envs []string) Option { + return func(d *Daemon) { + d.envs = append(d.envs, envs...) + } +} + func (d *Daemon) Sock() string { return "unix://" + d.sockPath } @@ -88,7 +102,7 @@ func (d *Daemon) Sock() string { func (d *Daemon) StartWithError(daemonLogs map[string]*bytes.Buffer, providedArgs ...string) error { dockerdBinary, err := exec.LookPath(d.dockerdBinary) if err != nil { - return errors.Wrapf(err, "[%s] could not find docker binary in $PATH", d.id) + return errors.Wrapf(err, "[%s] could not find dockerd binary %q in $PATH", d.id, d.dockerdBinary) } if d.pidFile == "" { @@ -127,7 +141,7 @@ func (d *Daemon) StartWithError(daemonLogs map[string]*bytes.Buffer, providedArg d.args = append(d.args, providedArgs...) d.cmd = exec.Command(dockerdBinary, d.args...) - d.cmd.Env = append(os.Environ(), "DOCKER_SERVICE_PREFER_OFFLINE_IMAGE=1", "BUILDKIT_DEBUG_EXEC_OUTPUT=1", "BUILDKIT_DEBUG_PANIC_ON_ERROR=1") + d.cmd.Env = append(d.envs, "DOCKER_SERVICE_PREFER_OFFLINE_IMAGE=1", "BUILDKIT_DEBUG_EXEC_OUTPUT=1", "BUILDKIT_DEBUG_PANIC_ON_ERROR=1") if daemonLogs != nil { b := new(bytes.Buffer) diff --git a/vendor/github.com/moby/buildkit/util/testutil/integration/run.go b/vendor/github.com/moby/buildkit/util/testutil/integration/run.go index 4a733415..208219de 100644 --- a/vendor/github.com/moby/buildkit/util/testutil/integration/run.go +++ b/vendor/github.com/moby/buildkit/util/testutil/integration/run.go @@ -40,6 +40,7 @@ type Backend interface { Rootless() bool NetNSDetached() bool Snapshotter() string + ExtraEnv() []string Supports(feature string) bool } diff --git a/vendor/github.com/moby/buildkit/util/testutil/integration/util_windows.go b/vendor/github.com/moby/buildkit/util/testutil/integration/util_windows.go index eef0e37f..42d6f3fa 100644 --- a/vendor/github.com/moby/buildkit/util/testutil/integration/util_windows.go +++ b/vendor/github.com/moby/buildkit/util/testutil/integration/util_windows.go @@ -4,6 +4,9 @@ import ( "net" "github.com/Microsoft/go-winio" + + // include npipe connhelper for windows tests + _ "github.com/moby/buildkit/client/connhelper/npipe" ) var socketScheme = "npipe://" diff --git a/vendor/github.com/moby/buildkit/util/testutil/workers/backend.go b/vendor/github.com/moby/buildkit/util/testutil/workers/backend.go index 9340083a..07daf876 100644 --- a/vendor/github.com/moby/buildkit/util/testutil/workers/backend.go +++ b/vendor/github.com/moby/buildkit/util/testutil/workers/backend.go @@ -12,6 +12,7 @@ type backend struct { rootless bool netnsDetached bool snapshotter string + extraEnv []string unsupportedFeatures []string isDockerd bool } @@ -40,6 +41,10 @@ func (b backend) Snapshotter() string { return b.snapshotter } +func (b backend) ExtraEnv() []string { + return b.extraEnv +} + func (b backend) Supports(feature string) bool { if enabledFeatures := os.Getenv("BUILDKIT_TEST_ENABLE_FEATURES"); enabledFeatures != "" { for _, enabledFeature := range strings.Split(enabledFeatures, ",") { diff --git a/vendor/github.com/moby/buildkit/util/testutil/workers/containerd.go b/vendor/github.com/moby/buildkit/util/testutil/workers/containerd.go index c2c7c0b8..7456c3e5 100644 --- a/vendor/github.com/moby/buildkit/util/testutil/workers/containerd.go +++ b/vendor/github.com/moby/buildkit/util/testutil/workers/containerd.go @@ -244,6 +244,7 @@ disabled_plugins = ["cri"] rootless: rootless, netnsDetached: false, snapshotter: c.Snapshotter, + extraEnv: c.ExtraEnv, }, cl, nil } diff --git a/vendor/github.com/moby/buildkit/util/testutil/workers/dockerd.go b/vendor/github.com/moby/buildkit/util/testutil/workers/dockerd.go index 9c292d17..b6c1d1d5 100644 --- a/vendor/github.com/moby/buildkit/util/testutil/workers/dockerd.go +++ b/vendor/github.com/moby/buildkit/util/testutil/workers/dockerd.go @@ -55,12 +55,12 @@ func InitDockerdWorker() { } type Moby struct { - ID string - IsRootless bool - + ID string + Binary string + IsRootless bool ContainerdSnapshotter bool - - Unsupported []string + Unsupported []string + ExtraEnv []string } func (c Moby) Name() string { @@ -137,7 +137,13 @@ func (c Moby) New(ctx context.Context, cfg *integration.BackendConfig) (b integr return nil, nil, err } - d, err := dockerd.NewDaemon(workDir) + dockerdOpts := []dockerd.Option{ + dockerd.WithExtraEnv(c.ExtraEnv), + } + if c.Binary != "" { + dockerdOpts = append(dockerdOpts, dockerd.WithBinary(c.Binary)) + } + d, err := dockerd.NewDaemon(workDir, dockerdOpts...) if err != nil { return nil, nil, errors.Errorf("new daemon error: %q, %s", err, integration.FormatLogs(cfg.Logs)) } @@ -164,7 +170,7 @@ func (c Moby) New(ctx context.Context, cfg *integration.BackendConfig) (b integr deferF.Append(d.StopWithError) if err := integration.WaitSocket(d.Sock(), 5*time.Second, nil); err != nil { - return nil, nil, errors.Errorf("dockerd did not start up: %q, %s", err, integration.FormatLogs(cfg.Logs)) + return nil, nil, errors.Wrapf(err, "dockerd did not start up: %s", integration.FormatLogs(cfg.Logs)) } dockerAPI, err := client.NewClientWithOpts(client.WithHost(d.Sock())) @@ -229,6 +235,7 @@ func (c Moby) New(ctx context.Context, cfg *integration.BackendConfig) (b integr dockerAddress: d.Sock(), rootless: c.IsRootless, netnsDetached: false, + extraEnv: c.ExtraEnv, isDockerd: true, unsupportedFeatures: c.Unsupported, }, cl, nil diff --git a/vendor/github.com/moby/buildkit/util/tracing/detect/delegated/delegated.go b/vendor/github.com/moby/buildkit/util/tracing/detect/delegated/delegated.go index 4051966e..f32f1737 100644 --- a/vendor/github.com/moby/buildkit/util/tracing/detect/delegated/delegated.go +++ b/vendor/github.com/moby/buildkit/util/tracing/detect/delegated/delegated.go @@ -5,7 +5,6 @@ import ( "sync" "github.com/moby/buildkit/util/tracing/detect" - sdkmetric "go.opentelemetry.io/otel/sdk/metric" sdktrace "go.opentelemetry.io/otel/sdk/trace" ) @@ -14,9 +13,9 @@ const maxBuffer = 256 var exp = &Exporter{} func init() { - detect.Register("delegated", func() (sdktrace.SpanExporter, sdkmetric.Exporter, error) { - return exp, nil, nil - }, 100) + detect.Register("delegated", detect.TraceExporterDetector(func() (sdktrace.SpanExporter, error) { + return exp, nil + }), 100) } type Exporter struct { diff --git a/vendor/github.com/moby/buildkit/util/tracing/detect/detect.go b/vendor/github.com/moby/buildkit/util/tracing/detect/detect.go index ef698931..9be07eb6 100644 --- a/vendor/github.com/moby/buildkit/util/tracing/detect/detect.go +++ b/vendor/github.com/moby/buildkit/util/tracing/detect/detect.go @@ -21,7 +21,10 @@ import ( "go.opentelemetry.io/otel/trace/noop" ) -type ExporterDetector func() (sdktrace.SpanExporter, sdkmetric.Exporter, error) +type ExporterDetector interface { + DetectTraceExporter() (sdktrace.SpanExporter, error) + DetectMetricExporter() (sdkmetric.Exporter, error) +} type detector struct { f ExporterDetector @@ -52,17 +55,45 @@ func Register(name string, exp ExporterDetector, priority int) { } } -func detectExporter() (texp sdktrace.SpanExporter, mexp sdkmetric.Exporter, err error) { - if n := os.Getenv("OTEL_TRACES_EXPORTER"); n != "" { +type TraceExporterDetector func() (sdktrace.SpanExporter, error) + +func (fn TraceExporterDetector) DetectTraceExporter() (sdktrace.SpanExporter, error) { + return fn() +} + +func (fn TraceExporterDetector) DetectMetricExporter() (sdkmetric.Exporter, error) { + return nil, nil +} + +func detectExporters() (texp sdktrace.SpanExporter, mexp sdkmetric.Exporter, err error) { + texp, err = detectExporter("OTEL_TRACES_EXPORTER", func(d ExporterDetector) (sdktrace.SpanExporter, bool, error) { + exp, err := d.DetectTraceExporter() + return exp, exp != nil, err + }) + if err != nil { + return nil, nil, err + } + + mexp, err = detectExporter("OTEL_METRICS_EXPORTER", func(d ExporterDetector) (sdkmetric.Exporter, bool, error) { + exp, err := d.DetectMetricExporter() + return exp, exp != nil, err + }) + if err != nil { + return nil, nil, err + } + return texp, mexp, nil +} + +func detectExporter[T any](envVar string, fn func(d ExporterDetector) (T, bool, error)) (exp T, err error) { + if n := os.Getenv(envVar); n != "" { d, ok := detectors[n] if !ok { - if n == "none" { - return nil, nil, nil - } - return nil, nil, errors.Errorf("unsupported opentelemetry tracer %v", n) + return exp, errors.Errorf("unsupported opentelemetry exporter %v", n) } - return d.f() + exp, _, err = fn(d.f) + return exp, err } + arr := make([]detector, 0, len(detectors)) for _, d := range detectors { arr = append(arr, d) @@ -71,28 +102,22 @@ func detectExporter() (texp sdktrace.SpanExporter, mexp sdkmetric.Exporter, err return arr[i].priority < arr[j].priority }) + var ok bool for _, d := range arr { - t, m, err := d.f() + exp, ok, err = fn(d.f) if err != nil { - return nil, nil, err - } - if texp == nil { - texp = t - } - if mexp == nil { - mexp = m + return exp, err } - // Found a candidate for both exporters so just return now. - if texp != nil && mexp != nil { - return texp, mexp, nil + if ok { + break } } - return texp, mexp, nil + return exp, nil } func getExporters() (sdktrace.SpanExporter, sdkmetric.Exporter, error) { - texp, mexp, err := detectExporter() + texp, mexp, err := detectExporters() if err != nil { return nil, nil, err } @@ -253,3 +278,20 @@ func (serviceNameDetector) Detect(ctx context.Context) (*resource.Resource, erro }, ).Detect(ctx) } + +type noneDetector struct{} + +func (n noneDetector) DetectTraceExporter() (sdktrace.SpanExporter, error) { + return nil, nil +} + +func (n noneDetector) DetectMetricExporter() (sdkmetric.Exporter, error) { + return nil, nil +} + +func init() { + // Register a none detector. This will never be chosen if there's another suitable + // exporter that can be detected, but exists to allow telemetry to be explicitly + // disabled. + Register("none", noneDetector{}, 1000) +} diff --git a/vendor/github.com/moby/buildkit/util/tracing/detect/otlp.go b/vendor/github.com/moby/buildkit/util/tracing/detect/otlp.go index 4cb49ed8..417a70ab 100644 --- a/vendor/github.com/moby/buildkit/util/tracing/detect/otlp.go +++ b/vendor/github.com/moby/buildkit/util/tracing/detect/otlp.go @@ -15,24 +15,15 @@ import ( sdktrace "go.opentelemetry.io/otel/sdk/trace" ) +var otlpExporter = otlpExporterDetector{} + func init() { Register("otlp", otlpExporter, 10) } -func otlpExporter() (sdktrace.SpanExporter, sdkmetric.Exporter, error) { - texp, err := otlpSpanExporter() - if err != nil { - return nil, nil, err - } +type otlpExporterDetector struct{} - mexp, err := otlpMetricExporter() - if err != nil { - return nil, nil, err - } - return texp, mexp, nil -} - -func otlpSpanExporter() (sdktrace.SpanExporter, error) { +func (otlpExporterDetector) DetectTraceExporter() (sdktrace.SpanExporter, error) { set := os.Getenv("OTEL_TRACES_EXPORTER") == "otlp" || os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT") != "" || os.Getenv("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT") != "" if !set { return nil, nil @@ -61,7 +52,7 @@ func otlpSpanExporter() (sdktrace.SpanExporter, error) { return otlptrace.New(context.Background(), c) } -func otlpMetricExporter() (sdkmetric.Exporter, error) { +func (otlpExporterDetector) DetectMetricExporter() (sdkmetric.Exporter, error) { set := os.Getenv("OTEL_METRICS_EXPORTER") == "otlp" || os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT") != "" || os.Getenv("OTEL_EXPORTER_OTLP_METRICS_ENDPOINT") != "" if !set { return nil, nil diff --git a/vendor/modules.txt b/vendor/modules.txt index dc8e91a5..fc7e3e18 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -153,8 +153,8 @@ github.com/compose-spec/compose-go/v2/validation # github.com/containerd/console v1.0.4 ## explicit; go 1.13 github.com/containerd/console -# github.com/containerd/containerd v1.7.13 -## explicit; go 1.19 +# github.com/containerd/containerd v1.7.14 +## explicit; go 1.21 github.com/containerd/containerd/api/services/content/v1 github.com/containerd/containerd/archive/compression github.com/containerd/containerd/content @@ -200,8 +200,8 @@ github.com/containerd/continuity/sysx # github.com/containerd/log v0.1.0 ## explicit; go 1.20 github.com/containerd/log -# github.com/containerd/ttrpc v1.2.2 -## explicit; go 1.13 +# github.com/containerd/ttrpc v1.2.3 +## explicit; go 1.19 github.com/containerd/ttrpc # github.com/containerd/typeurl/v2 v2.1.1 ## explicit; go 1.13 @@ -512,7 +512,7 @@ github.com/mitchellh/mapstructure # github.com/mitchellh/reflectwalk v1.0.2 ## explicit github.com/mitchellh/reflectwalk -# github.com/moby/buildkit v0.13.0 +# github.com/moby/buildkit v0.13.0-rc3.0.20240328152707-25bec7145b39 ## explicit; go 1.21 github.com/moby/buildkit/api/services/control github.com/moby/buildkit/api/types @@ -521,6 +521,7 @@ github.com/moby/buildkit/client/buildid github.com/moby/buildkit/client/connhelper github.com/moby/buildkit/client/connhelper/dockercontainer github.com/moby/buildkit/client/connhelper/kubepod +github.com/moby/buildkit/client/connhelper/npipe github.com/moby/buildkit/client/connhelper/ssh github.com/moby/buildkit/client/llb github.com/moby/buildkit/client/llb/sourceresolver