From 63d5573a38bdfd694a3f852827804a9d60017cb0 Mon Sep 17 00:00:00 2001 From: Kohei Tokunaga Date: Wed, 3 Apr 2024 00:02:30 +0900 Subject: [PATCH] remote: Fix HTTPFallback fails when pushing manifest Signed-off-by: Kohei Tokunaga --- core/remotes/docker/pusher_test.go | 52 ++++++++++++++++++++++++++++-- core/remotes/docker/resolver.go | 8 +++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/core/remotes/docker/pusher_test.go b/core/remotes/docker/pusher_test.go index 8db32922c..3cfd856e9 100644 --- a/core/remotes/docker/pusher_test.go +++ b/core/remotes/docker/pusher_test.go @@ -17,7 +17,9 @@ package docker import ( + "bytes" "context" + "encoding/json" "errors" "fmt" "io" @@ -35,6 +37,7 @@ import ( "github.com/containerd/errdefs" "github.com/containerd/log/logtest" "github.com/opencontainers/go-digest" + ocispecv "github.com/opencontainers/image-spec/specs-go" ocispec "github.com/opencontainers/image-spec/specs-go/v1" "github.com/stretchr/testify/assert" ) @@ -181,10 +184,55 @@ func tryUpload(ctx context.Context, t *testing.T, p dockerPusher, layerContent [ return err } defer cw.Close() - if _, err := cw.Write(layerContent); err != nil { + if err := content.Copy(ctx, cw, bytes.NewReader(layerContent), int64(len(layerContent)), desc.Digest); err != nil { return err } - return cw.Commit(ctx, 0, "") + + cContent, err := json.Marshal(ocispec.Image{}) + if err != nil { + return err + } + cdesc := ocispec.Descriptor{ + MediaType: ocispec.MediaTypeImageConfig, + Digest: digest.FromBytes(cContent), + Size: int64(len(cContent)), + } + cwc, err := p.Writer(ctx, content.WithRef("test-1-c"), content.WithDescriptor(cdesc)) + if err != nil { + return err + } + defer cwc.Close() + if _, err := cwc.Write(cContent); err != nil { + return err + } + if err := content.Copy(ctx, cwc, bytes.NewReader(cContent), int64(len(cContent)), cdesc.Digest); err != nil { + return err + } + + m := ocispec.Manifest{ + Versioned: ocispecv.Versioned{SchemaVersion: 1}, + MediaType: ocispec.MediaTypeImageManifest, + Config: cdesc, + Layers: []ocispec.Descriptor{desc}, + } + mContent, err := json.Marshal(m) + if err != nil { + return err + } + mdesc := ocispec.Descriptor{ + MediaType: ocispec.MediaTypeImageManifest, + Digest: digest.FromBytes(mContent), + Size: int64(len(mContent)), + } + cwm, err := p.Writer(ctx, content.WithRef("test-1-m"), content.WithDescriptor(mdesc)) + if err != nil { + return err + } + defer cwm.Close() + if err := content.Copy(ctx, cwm, bytes.NewReader(mContent), int64(len(mContent)), mdesc.Digest); err != nil { + return err + } + return nil } func samplePusher(t *testing.T) (dockerPusher, *uploadableMockRegistry, StatusTrackLocker, func()) { diff --git a/core/remotes/docker/resolver.go b/core/remotes/docker/resolver.go index 962faf39a..0337ac133 100644 --- a/core/remotes/docker/resolver.go +++ b/core/remotes/docker/resolver.go @@ -732,6 +732,14 @@ func (f HTTPFallback) RoundTrip(r *http.Request) (*http.Response, error) { plainHTTPRequest := *r plainHTTPRequest.URL = &plainHTTPUrl + if r.Body != nil && r.GetBody != nil { + body, err := r.GetBody() + if err != nil { + return nil, err + } + plainHTTPRequest.Body = body + } + return f.RoundTripper.RoundTrip(&plainHTTPRequest) }