Skip to content

Commit a876ede

Browse files
committed
Use docker media type for plugin layers
This was changed as part of a refactor to use containerd dist code. The problem is the OCI media types are not compatible with older versions of Docker. Signed-off-by: Brian Goff <[email protected]>
1 parent dd14dbd commit a876ede

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

integration/plugin/common/plugin_test.go

+63
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,17 @@ import (
1515
"strings"
1616
"testing"
1717

18+
"github.com/containerd/containerd/images"
19+
"github.com/containerd/containerd/remotes/docker"
1820
"github.com/docker/docker/api/types"
21+
"github.com/docker/docker/pkg/jsonmessage"
1922
"github.com/docker/docker/testutil/daemon"
2023
"github.com/docker/docker/testutil/fixtures/plugin"
2124
"github.com/docker/docker/testutil/registry"
2225
"github.com/docker/docker/testutil/request"
26+
v1 "github.com/opencontainers/image-spec/specs-go/v1"
2327
"gotest.tools/v3/assert"
28+
"gotest.tools/v3/assert/cmp"
2429
is "gotest.tools/v3/assert/cmp"
2530
"gotest.tools/v3/skip"
2631
)
@@ -223,3 +228,61 @@ func TestPluginsWithRuntimes(t *testing.T) {
223228
assert.NilError(t, err)
224229
})
225230
}
231+
232+
func TestPluginBackCompatMediaTypes(t *testing.T) {
233+
skip.If(t, testEnv.IsRemoteDaemon, "cannot run daemon when remote daemon")
234+
skip.If(t, testEnv.OSType == "windows")
235+
skip.If(t, testEnv.IsRootless, "Rootless has a different view of localhost (needed for test registry access)")
236+
237+
defer setupTest(t)()
238+
239+
reg := registry.NewV2(t)
240+
defer reg.Close()
241+
reg.WaitReady(t)
242+
243+
repo := path.Join(registry.DefaultURL, strings.ToLower(t.Name())+":latest")
244+
245+
client := testEnv.APIClient()
246+
247+
ctx := context.Background()
248+
assert.NilError(t, plugin.Create(ctx, client, repo))
249+
250+
rdr, err := client.PluginPush(ctx, repo, "")
251+
assert.NilError(t, err)
252+
defer rdr.Close()
253+
254+
buf := &strings.Builder{}
255+
assert.NilError(t, jsonmessage.DisplayJSONMessagesStream(rdr, buf, 0, false, nil), buf)
256+
257+
// Use custom header here because older versions of the registry do not
258+
// parse the accept header correctly and does not like the accept header
259+
// that the default resolver code uses. "Older registries" here would be
260+
// like the one currently included in the test suite.
261+
headers := http.Header{}
262+
headers.Add("Accept", images.MediaTypeDockerSchema2Manifest)
263+
264+
resolver := docker.NewResolver(docker.ResolverOptions{
265+
Headers: headers,
266+
})
267+
assert.NilError(t, err)
268+
269+
n, desc, err := resolver.Resolve(ctx, repo)
270+
assert.NilError(t, err, repo)
271+
272+
fetcher, err := resolver.Fetcher(ctx, n)
273+
assert.NilError(t, err)
274+
275+
rdr, err = fetcher.Fetch(ctx, desc)
276+
assert.NilError(t, err)
277+
defer rdr.Close()
278+
279+
type manifest struct {
280+
MediaType string
281+
v1.Manifest
282+
}
283+
var m manifest
284+
assert.NilError(t, json.NewDecoder(rdr).Decode(&m))
285+
assert.Check(t, cmp.Equal(m.MediaType, images.MediaTypeDockerSchema2Manifest))
286+
assert.Check(t, cmp.Len(m.Layers, 1))
287+
assert.Check(t, cmp.Equal(m.Layers[0].MediaType, images.MediaTypeDockerSchema2LayerGzip))
288+
}

plugin/backend_linux.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ func buildManifest(ctx context.Context, s content.Manager, config digest.Digest,
492492
return m, errors.Wrapf(err, "error fetching info for content digest %s", l)
493493
}
494494
m.Layers = append(m.Layers, specs.Descriptor{
495-
MediaType: specs.MediaTypeImageLayerGzip, // TODO: This is assuming everything is a gzip compressed layer, but that may not be true.
495+
MediaType: images.MediaTypeDockerSchema2LayerGzip, // TODO: This is assuming everything is a gzip compressed layer, but that may not be true.
496496
Digest: l,
497497
Size: info.Size,
498498
})

0 commit comments

Comments
 (0)