Skip to content

Commit c8af8eb

Browse files
authored
Merge pull request #47738 from vvoland/c8d-walk-image-badimagetarget
c8d/list: Ignore unexpected image target
2 parents 801fd16 + 7d95fe8 commit c8af8eb

File tree

4 files changed

+63
-5
lines changed

4 files changed

+63
-5
lines changed

daemon/containerd/image_list.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,13 @@ func (i *ImageService) imageSummary(ctx context.Context, img images.Image, platf
301301
return nil
302302
})
303303
if err != nil {
304+
if errors.Is(err, errNotManifestOrIndex) {
305+
log.G(ctx).WithFields(log.Fields{
306+
"error": err,
307+
"image": img.Name,
308+
}).Warn("unexpected image target (neither a manifest nor index)")
309+
return nil, nil, nil
310+
}
304311
return nil, nil, err
305312
}
306313

daemon/containerd/image_list_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ func TestImageList(t *testing.T) {
101101
emptyIndex, err := specialimage.EmptyIndex(blobsDir)
102102
assert.NilError(t, err)
103103

104+
configTarget, err := specialimage.ConfigTarget(blobsDir)
105+
assert.NilError(t, err)
106+
104107
cs := &blobsDirContentStore{blobs: filepath.Join(blobsDir, "blobs/sha256")}
105108

106109
for _, tc := range []struct {
@@ -150,6 +153,16 @@ func TestImageList(t *testing.T) {
150153
assert.Check(t, is.Len(all, 2))
151154
},
152155
},
156+
{
157+
// Make sure an invalid image target doesn't break the whole operation
158+
name: "one good image, second has config as a target",
159+
images: imagesFromIndex(multilayer, configTarget),
160+
check: func(t *testing.T, all []*imagetypes.Summary) {
161+
assert.Check(t, is.Len(all, 1))
162+
163+
assert.Check(t, is.Equal(all[0].ID, multilayer.Manifests[0].Digest.String()))
164+
},
165+
},
153166
} {
154167
tc := tc
155168
t.Run(tc.name, func(t *testing.T) {
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package specialimage
2+
3+
import (
4+
"github.com/containerd/containerd/platforms"
5+
"github.com/distribution/reference"
6+
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
7+
)
8+
9+
// ConfigTarget creates an image index with an image config being used as an
10+
// image target instead of a manifest or index.
11+
func ConfigTarget(dir string) (*ocispec.Index, error) {
12+
const imageRef = "config:latest"
13+
14+
ref, err := reference.ParseNormalizedNamed(imageRef)
15+
if err != nil {
16+
return nil, err
17+
}
18+
19+
desc, err := writeJsonBlob(dir, ocispec.MediaTypeImageConfig, ocispec.Image{
20+
Platform: platforms.MustParse("linux/amd64"),
21+
Config: ocispec.ImageConfig{
22+
Env: []string{"FOO=BAR"},
23+
},
24+
})
25+
if err != nil {
26+
return nil, err
27+
}
28+
desc.Annotations = map[string]string{
29+
"io.containerd.image.name": ref.String(),
30+
}
31+
32+
return ociImage(dir, ref, desc)
33+
}

internal/testutils/specialimage/multilayer.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,19 +102,24 @@ func singlePlatformImage(dir string, ref reference.Named, manifest ocispec.Manif
102102
}
103103
}
104104

105+
if err := writeJson(legacyManifests, filepath.Join(dir, "manifest.json")); err != nil {
106+
return nil, err
107+
}
108+
109+
return ociImage(dir, ref, manifestDesc)
110+
}
111+
112+
func ociImage(dir string, ref reference.Named, target ocispec.Descriptor) (*ocispec.Index, error) {
105113
idx := ocispec.Index{
106114
Versioned: specs.Versioned{SchemaVersion: 2},
107115
MediaType: ocispec.MediaTypeImageIndex,
108-
Manifests: []ocispec.Descriptor{manifestDesc},
116+
Manifests: []ocispec.Descriptor{target},
109117
}
110118
if err := writeJson(idx, filepath.Join(dir, "index.json")); err != nil {
111119
return nil, err
112120
}
113-
if err := writeJson(legacyManifests, filepath.Join(dir, "manifest.json")); err != nil {
114-
return nil, err
115-
}
116121

117-
err = os.WriteFile(filepath.Join(dir, "oci-layout"), []byte(`{"imageLayoutVersion": "1.0.0"}`), 0o644)
122+
err := os.WriteFile(filepath.Join(dir, "oci-layout"), []byte(`{"imageLayoutVersion": "1.0.0"}`), 0o644)
118123
if err != nil {
119124
return nil, err
120125
}

0 commit comments

Comments
 (0)