Skip to content

Commit 2774b2b

Browse files
Merge pull request #29442 from openshift-cherrypick-robot/cherry-pick-29392-to-release-4.18
[release-4.18] OCPBUGS-48438: images: Fix layers test to work with manifestlisted imagestreams
2 parents 52bd297 + ab816ff commit 2774b2b

File tree

1 file changed

+63
-18
lines changed

1 file changed

+63
-18
lines changed

test/extended/images/layers.go

+63-18
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,26 @@ import (
2424
"github.com/openshift/origin/test/extended/util/image"
2525
)
2626

27+
func verifyLayerData(layers *imagev1.ImageStreamLayers, name string) imagev1.ImageBlobReferences {
28+
l, ok := layers.Images[name]
29+
o.Expect(ok).To(o.BeTrue())
30+
if l.ImageMissing {
31+
e2e.Logf("Image %s is missing, retry", name)
32+
return l
33+
}
34+
o.Expect(len(l.Layers)).To(o.BeNumerically(">", 0))
35+
o.Expect(l.Config).ToNot(o.BeNil())
36+
o.Expect(layers.Blobs[*l.Config]).ToNot(o.BeNil())
37+
o.Expect(layers.Blobs[*l.Config].MediaType).To(o.Equal("application/vnd.docker.container.image.v1+json"))
38+
for _, layerID := range l.Layers {
39+
o.Expect(layers.Blobs).To(o.HaveKey(layerID))
40+
o.Expect(layers.Blobs[layerID].MediaType).NotTo(o.BeEmpty())
41+
}
42+
o.Expect(layers.Blobs).To(o.HaveKey(name))
43+
o.Expect(layers.Blobs[name].MediaType).To(o.Equal("application/vnd.docker.distribution.manifest.v2+json"))
44+
return l
45+
}
46+
2747
var _ = g.Describe("[sig-imageregistry][Feature:ImageLayers] Image layer subresource", func() {
2848
defer g.GinkgoRecover()
2949
var oc *exutil.CLI
@@ -107,30 +127,29 @@ var _ = g.Describe("[sig-imageregistry][Feature:ImageLayers] Image layer subreso
107127

108128
// TODO: we may race here with the cache, if this is a problem, loop
109129
g.By("verifying that layers for imported images are correct")
110-
var busyboxLayers []string
130+
var busyboxImage imagev1.ImageImportStatus
111131
Retry:
112132
for i := 0; ; i++ {
113133
layers, err := client.ImageStreams(oc.Namespace()).Layers(ctx, "1", metav1.GetOptions{})
114134
o.Expect(err).NotTo(o.HaveOccurred())
135+
var l imagev1.ImageBlobReferences
115136
for i, image := range isi.Status.Images {
116-
l, ok := layers.Images[image.Image.Name]
117-
o.Expect(ok).To(o.BeTrue())
137+
// check if the image is manifestlisted - if so, verify layer data for each manifest.
138+
if len(image.Manifests) > 0 {
139+
for _, submanifest := range image.Manifests {
140+
l = verifyLayerData(layers, submanifest.Name)
141+
if l.ImageMissing {
142+
break
143+
}
144+
}
145+
} else {
146+
l = verifyLayerData(layers, image.Image.Name)
147+
}
118148
if l.ImageMissing {
119-
e2e.Logf("Image %s is missing, retry", image.Image.Name)
120149
continue
121150
}
122-
o.Expect(len(l.Layers)).To(o.BeNumerically(">", 0))
123-
o.Expect(l.Config).ToNot(o.BeNil())
124-
o.Expect(layers.Blobs[*l.Config]).ToNot(o.BeNil())
125-
o.Expect(layers.Blobs[*l.Config].MediaType).To(o.Equal("application/vnd.docker.container.image.v1+json"))
126-
for _, layerID := range l.Layers {
127-
o.Expect(layers.Blobs).To(o.HaveKey(layerID))
128-
o.Expect(layers.Blobs[layerID].MediaType).NotTo(o.BeEmpty())
129-
}
130-
o.Expect(layers.Blobs).To(o.HaveKey(image.Image.Name))
131-
o.Expect(layers.Blobs[image.Image.Name].MediaType).To(o.Equal("application/vnd.docker.distribution.manifest.v2+json"))
132151
if i == 0 {
133-
busyboxLayers = l.Layers
152+
busyboxImage = image
134153
break Retry
135154
}
136155
}
@@ -208,9 +227,35 @@ RUN mkdir -p /var/lib && echo "a" > /var/lib/file
208227
o.Expect(to).NotTo(o.BeNil())
209228
o.Expect(layers.Images).To(o.HaveKey(to.ImageDigest))
210229
builtImageLayers := layers.Images[to.ImageDigest]
211-
o.Expect(len(builtImageLayers.Layers)).To(o.Equal(len(busyboxLayers)+1), fmt.Sprintf("%#v", layers.Images))
212-
for i := range busyboxLayers {
213-
o.Expect(busyboxLayers[i]).To(o.Equal(builtImageLayers.Layers[i]))
230+
busyboxlayers, err := client.ImageStreams(oc.Namespace()).Layers(ctx, "1", metav1.GetOptions{})
231+
var isEqual bool
232+
// if the image is a manifestlist compare each individual sub manifest image to the built image to determine
233+
// which architecture image layers match
234+
if len(busyboxImage.Manifests) > 0 {
235+
for _, image := range busyboxImage.Manifests {
236+
l, ok := busyboxlayers.Images[image.Name]
237+
o.Expect(ok).To(o.BeTrue())
238+
busyboxLayers := l.Layers
239+
isEqual = true
240+
for i := range busyboxLayers {
241+
if busyboxLayers[i] == builtImageLayers.Layers[i] {
242+
continue
243+
}
244+
isEqual = false
245+
}
246+
if isEqual {
247+
break
248+
}
249+
}
250+
o.Expect(isEqual).To(o.BeTrue())
251+
} else {
252+
l, ok := busyboxlayers.Images[busyboxImage.Image.Name]
253+
o.Expect(ok).To(o.BeTrue())
254+
busyboxLayers := l.Layers
255+
o.Expect(len(builtImageLayers.Layers)).To(o.Equal(len(busyboxLayers)+1), fmt.Sprintf("%#v", layers.Images))
256+
for i := range busyboxLayers {
257+
o.Expect(busyboxLayers[i]).To(o.Equal(builtImageLayers.Layers[i]))
258+
}
214259
}
215260

216261
g.By("tagging the built image into another namespace")

0 commit comments

Comments
 (0)