Browse code

Remember image with matching config reference

Make sure to match image having config name equal to the wanted blob
digest. Remember the image and allow access to its layers.

Signed-off-by: Michal Minář <miminar@redhat.com>

Michal Minář authored on 2016/09/01 20:50:40
Showing 2 changed files
... ...
@@ -203,5 +203,12 @@ func imageHasBlob(
203 203
 		}
204 204
 	}
205 205
 
206
+	// only manifest V2 schema2 has docker image config filled where dockerImage.Metadata.id is its digest
207
+	if len(image.DockerImageConfig) > 0 && image.DockerImageMetadata.ID == blobDigest {
208
+		// remember manifest config reference of schema 2 as well
209
+		r.rememberLayersOfImage(image, cacheName)
210
+		return true
211
+	}
212
+
206 213
 	return false
207 214
 }
... ...
@@ -544,7 +544,7 @@ func (r *repository) getImageStreamImage(dgst digest.Digest) (*imageapi.ImageStr
544 544
 
545 545
 // rememberLayersOfImage caches the layer digests of given image
546 546
 func (r *repository) rememberLayersOfImage(image *imageapi.Image, cacheName string) {
547
-	if len(image.DockerImageLayers) == 0 && len(image.DockerImageManifestMediaType) > 0 {
547
+	if len(image.DockerImageLayers) == 0 && len(image.DockerImageManifestMediaType) > 0 && len(image.DockerImageConfig) == 0 {
548 548
 		// image has no layers
549 549
 		return
550 550
 	}
... ...
@@ -553,6 +553,10 @@ func (r *repository) rememberLayersOfImage(image *imageapi.Image, cacheName stri
553 553
 		for _, layer := range image.DockerImageLayers {
554 554
 			r.cachedLayers.RememberDigest(digest.Digest(layer.Name), r.blobrepositorycachettl, cacheName)
555 555
 		}
556
+		// remember reference to manifest config as well for schema 2
557
+		if image.DockerImageManifestMediaType == schema2.MediaTypeManifest && len(image.DockerImageMetadata.ID) > 0 {
558
+			r.cachedLayers.RememberDigest(digest.Digest(image.DockerImageMetadata.ID), r.blobrepositorycachettl, cacheName)
559
+		}
556 560
 		return
557 561
 	}
558 562