@@ -92,14 +92,44 @@ func validate(w walker, refs []string, out *log.Logger) error {
9292 return err
9393 }
9494
95- m , err := findManifest (w , d )
96- if err != nil {
97- return err
95+ if d .MediaType == validRefMediaTypes [0 ] {
96+ m , err := findManifest (w , d )
97+ if err != nil {
98+ return err
99+ }
100+
101+ if err := m .validate (w ); err != nil {
102+ return err
103+ }
98104 }
99105
100- if err := m .validate (w ); err != nil {
101- return err
106+ if d .MediaType == validRefMediaTypes [1 ] {
107+ index , err := findIndex (w , d )
108+ if err != nil {
109+ return err
110+ }
111+
112+ if err := validateIndex (index , w ); err != nil {
113+ return err
114+ }
115+
116+ if len (index .Manifests ) == 0 {
117+ fmt .Println ("warning: no manifests found" )
118+ return nil
119+ }
120+
121+ for _ , manifest := range index .Manifests {
122+ m , err := findManifest (w , & (manifest .Descriptor ))
123+ if err != nil {
124+ return err
125+ }
126+
127+ if err := m .validate (w ); err != nil {
128+ return err
129+ }
130+ }
102131 }
132+
103133 if out != nil {
104134 out .Printf ("reference %q: OK" , ref )
105135 }
@@ -147,16 +177,51 @@ func unpack(w walker, dest, refName string) error {
147177 return err
148178 }
149179
150- m , err := findManifest (w , ref )
151- if err != nil {
152- return err
180+ if ref .MediaType == validRefMediaTypes [0 ] {
181+ m , err := findManifest (w , ref )
182+ if err != nil {
183+ return err
184+ }
185+
186+ if err := m .validate (w ); err != nil {
187+ return err
188+ }
189+
190+ return m .unpack (w , dest )
153191 }
154192
155- if err = m .validate (w ); err != nil {
156- return err
193+ if ref .MediaType == validRefMediaTypes [1 ] {
194+ index , err := findIndex (w , ref )
195+ if err != nil {
196+ return err
197+ }
198+
199+ if err := validateIndex (index , w ); err != nil {
200+ return err
201+ }
202+
203+ if len (index .Manifests ) == 0 {
204+ fmt .Println ("warning: no manifests found" )
205+ return nil
206+ }
207+
208+ for _ , manifest := range index .Manifests {
209+ m , err := findManifest (w , & (manifest .Descriptor ))
210+ if err != nil {
211+ return err
212+ }
213+
214+ if err := m .validate (w ); err != nil {
215+ return err
216+ }
217+
218+ if err := m .unpack (w , dest ); err != nil {
219+ return err
220+ }
221+ }
157222 }
158223
159- return m . unpack ( w , dest )
224+ return nil
160225}
161226
162227// CreateRuntimeBundleLayout walks through the file tree given by src and
@@ -199,15 +264,54 @@ func createRuntimeBundle(w walker, dest, refName, rootfs string) error {
199264 return err
200265 }
201266
202- m , err := findManifest (w , ref )
203- if err != nil {
204- return err
267+ if ref .MediaType == validRefMediaTypes [0 ] {
268+ m , err := findManifest (w , ref )
269+ if err != nil {
270+ return err
271+ }
272+
273+ if err := m .validate (w ); err != nil {
274+ return err
275+ }
276+
277+ return createRuntimebundle (w , m , dest , rootfs )
205278 }
206279
207- if err = m .validate (w ); err != nil {
208- return err
280+ if ref .MediaType == validRefMediaTypes [1 ] {
281+ index , err := findIndex (w , ref )
282+ if err != nil {
283+ return err
284+ }
285+
286+ if err := validateIndex (index , w ); err != nil {
287+ return err
288+ }
289+
290+ if len (index .Manifests ) == 0 {
291+ fmt .Println ("warning: no manifests found" )
292+ return nil
293+ }
294+
295+ for _ , manifest := range index .Manifests {
296+ m , err := findManifest (w , & (manifest .Descriptor ))
297+ if err != nil {
298+ return err
299+ }
300+
301+ if err := m .validate (w ); err != nil {
302+ return err
303+ }
304+
305+ if err := createRuntimebundle (w , m , dest , rootfs ); err != nil {
306+ return err
307+ }
308+ }
209309 }
210310
311+ return nil
312+ }
313+
314+ func createRuntimebundle (w walker , m * manifest , dest , rootfs string ) error {
211315 c , err := findConfig (w , & m .Config )
212316 if err != nil {
213317 return err
0 commit comments