@@ -24,6 +24,26 @@ import (
24
24
"github.com/openshift/origin/test/extended/util/image"
25
25
)
26
26
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
+
27
47
var _ = g .Describe ("[sig-imageregistry][Feature:ImageLayers] Image layer subresource" , func () {
28
48
defer g .GinkgoRecover ()
29
49
var oc * exutil.CLI
@@ -107,30 +127,29 @@ var _ = g.Describe("[sig-imageregistry][Feature:ImageLayers] Image layer subreso
107
127
108
128
// TODO: we may race here with the cache, if this is a problem, loop
109
129
g .By ("verifying that layers for imported images are correct" )
110
- var busyboxLayers [] string
130
+ var busyboxImage imagev1. ImageImportStatus
111
131
Retry:
112
132
for i := 0 ; ; i ++ {
113
133
layers , err := client .ImageStreams (oc .Namespace ()).Layers (ctx , "1" , metav1.GetOptions {})
114
134
o .Expect (err ).NotTo (o .HaveOccurred ())
135
+ var l imagev1.ImageBlobReferences
115
136
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
+ }
118
148
if l .ImageMissing {
119
- e2e .Logf ("Image %s is missing, retry" , image .Image .Name )
120
149
continue
121
150
}
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" ))
132
151
if i == 0 {
133
- busyboxLayers = l . Layers
152
+ busyboxImage = image
134
153
break Retry
135
154
}
136
155
}
@@ -208,9 +227,35 @@ RUN mkdir -p /var/lib && echo "a" > /var/lib/file
208
227
o .Expect (to ).NotTo (o .BeNil ())
209
228
o .Expect (layers .Images ).To (o .HaveKey (to .ImageDigest ))
210
229
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
+ }
214
259
}
215
260
216
261
g .By ("tagging the built image into another namespace" )
0 commit comments