Add support for pushing and pulling schema 2 manifests with remote layers

This is required for windows image support
This commit is contained in:
Joseph Schorr 2018-11-14 13:21:50 +02:00
parent d97055e2ba
commit 37b20010aa
19 changed files with 339 additions and 29 deletions

View file

@ -209,13 +209,15 @@ class V2Protocol(RegistryProtocol):
builder = DockerSchema2ManifestBuilder()
for image in images:
checksum = 'sha256:' + hashlib.sha256(image.bytes).hexdigest()
blobs[checksum] = image.bytes
if image.urls is None:
blobs[checksum] = image.bytes
# If invalid blob references were requested, just make it up.
if options.manifest_invalid_blob_references:
checksum = 'sha256:' + hashlib.sha256('notarealthing').hexdigest()
builder.add_layer(checksum, len(image.bytes))
builder.add_layer(checksum, len(image.bytes), urls=image.urls)
config = {
"os": "linux",
@ -245,6 +247,8 @@ class V2Protocol(RegistryProtocol):
builder = DockerSchema1ManifestBuilder(namespace, repo_name, tag_name)
for image in reversed(images):
assert image.urls is None
checksum = 'sha256:' + hashlib.sha256(image.bytes).hexdigest()
blobs[checksum] = image.bytes
@ -498,12 +502,16 @@ class V2Protocol(RegistryProtocol):
# Verify the layers.
for index, layer in enumerate(manifest.layers):
# If the layer is remote, then we expect the blob to *not* exist in the system.
expected_status = 404 if images[index].urls else 200
result = self.conduct(session, 'GET',
'/v2/%s/blobs/%s' % (self.repo_name(namespace, repo_name),
layer.digest),
expected_status=200,
expected_status=expected_status,
headers=headers)
assert result.content == images[index].bytes
if expected_status == 200:
assert result.content == images[index].bytes
return PullResult(manifests=manifests, image_ids=image_ids)