@@ -15,12 +15,17 @@ import (
15
15
"strings"
16
16
"testing"
17
17
18
+ "github.com/containerd/containerd/images"
19
+ "github.com/containerd/containerd/remotes/docker"
18
20
"github.com/docker/docker/api/types"
21
+ "github.com/docker/docker/pkg/jsonmessage"
19
22
"github.com/docker/docker/testutil/daemon"
20
23
"github.com/docker/docker/testutil/fixtures/plugin"
21
24
"github.com/docker/docker/testutil/registry"
22
25
"github.com/docker/docker/testutil/request"
26
+ v1 "github.com/opencontainers/image-spec/specs-go/v1"
23
27
"gotest.tools/v3/assert"
28
+ "gotest.tools/v3/assert/cmp"
24
29
is "gotest.tools/v3/assert/cmp"
25
30
"gotest.tools/v3/skip"
26
31
)
@@ -223,3 +228,61 @@ func TestPluginsWithRuntimes(t *testing.T) {
223
228
assert .NilError (t , err )
224
229
})
225
230
}
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
+ }
0 commit comments