Skip to content

Commit cd5af67

Browse files
committed
cache/remotecache: normalize cache layer media types
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
1 parent f6b91b2 commit cd5af67

2 files changed

Lines changed: 59 additions & 0 deletions

File tree

cache/remotecache/v1/chains_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"testing"
77
"time"
88

9+
"github.com/containerd/containerd/v2/core/images"
910
"github.com/moby/buildkit/solver"
1011
digest "github.com/opencontainers/go-digest"
1112
ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
@@ -105,6 +106,60 @@ func TestSimpleMarshal(t *testing.T) {
105106
require.Equal(t, 4, len(cfg.Records))
106107
}
107108

109+
func TestMarshalLayerMediaTypes(t *testing.T) {
110+
for _, tc := range []struct {
111+
name string
112+
descs []ocispecs.Descriptor
113+
expected map[digest.Digest]string
114+
}{
115+
{
116+
name: "docker",
117+
descs: []ocispecs.Descriptor{
118+
{Digest: dgst("d0"), MediaType: images.MediaTypeDockerSchema2Layer},
119+
{Digest: dgst("d1"), MediaType: images.MediaTypeDockerSchema2LayerGzip},
120+
{Digest: dgst("d2"), MediaType: images.MediaTypeDockerSchema2LayerZstd},
121+
},
122+
expected: map[digest.Digest]string{
123+
dgst("d0"): ocispecs.MediaTypeImageLayer,
124+
dgst("d1"): ocispecs.MediaTypeImageLayerGzip,
125+
dgst("d2"): ocispecs.MediaTypeImageLayerZstd,
126+
},
127+
},
128+
{
129+
name: "oci",
130+
descs: []ocispecs.Descriptor{
131+
{Digest: dgst("d0"), MediaType: ocispecs.MediaTypeImageLayer},
132+
{Digest: dgst("d1"), MediaType: ocispecs.MediaTypeImageLayerGzip},
133+
{Digest: dgst("d2"), MediaType: ocispecs.MediaTypeImageLayerZstd},
134+
},
135+
expected: map[digest.Digest]string{
136+
dgst("d0"): ocispecs.MediaTypeImageLayer,
137+
dgst("d1"): ocispecs.MediaTypeImageLayerGzip,
138+
dgst("d2"): ocispecs.MediaTypeImageLayerZstd,
139+
},
140+
},
141+
} {
142+
t.Run(tc.name, func(t *testing.T) {
143+
cc := NewCacheChains()
144+
_, ok, err := cc.Add(outputKey(dgst("foo"), 0), nil, []solver.CacheExportResult{{
145+
CreatedAt: time.Now(),
146+
Result: &solver.Remote{
147+
Descriptors: tc.descs,
148+
},
149+
}})
150+
require.NoError(t, err)
151+
require.True(t, ok)
152+
153+
_, descPairs, err := cc.Marshal(t.Context())
154+
require.NoError(t, err)
155+
156+
for dgst, mediaType := range tc.expected {
157+
require.Equal(t, mediaType, descPairs[dgst].Descriptor.MediaType)
158+
}
159+
})
160+
}
161+
}
162+
108163
func dgst(s string) digest.Digest {
109164
return digest.FromBytes([]byte(s))
110165
}

cache/remotecache/v1/utils.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
cerrdefs "github.com/containerd/errdefs"
1111
cacheimporttypes "github.com/moby/buildkit/cache/remotecache/v1/types"
1212
"github.com/moby/buildkit/solver"
13+
"github.com/moby/buildkit/util/compression"
1314
digest "github.com/opencontainers/go-digest"
1415
"github.com/pkg/errors"
1516
)
@@ -152,6 +153,9 @@ func marshalRemote(ctx context.Context, r *solver.Remote, state *marshalState) s
152153
parentID = marshalRemote(ctx, r2, state)
153154
}
154155
desc := r.Descriptors[len(r.Descriptors)-1]
156+
if desc.MediaType != "" {
157+
desc = compression.ConvertAllLayerMediaTypes(ctx, true, desc)[0]
158+
}
155159

156160
state.descriptors[desc.Digest] = DescriptorProviderPair{
157161
Descriptor: desc,

0 commit comments

Comments
 (0)