Fix conversion of schema 2 manifests to schema 1 manifests
Also adds a number of conversion tests and clarify the interfaces a bit more
This commit is contained in:
parent
bd79eaa38f
commit
c233760007
11 changed files with 457 additions and 183 deletions
65
image/docker/schema2/test/test_conversion.py
Normal file
65
image/docker/schema2/test/test_conversion.py
Normal file
|
@ -0,0 +1,65 @@
|
|||
import json
|
||||
|
||||
from image.docker.schema1 import DockerSchema1Manifest
|
||||
from image.docker.schema2.manifest import DockerSchema2Manifest
|
||||
from image.docker.schema2.test.conversion_data import (SCHEMA1_BYTES, SCHEMA2_MANIFEST_BYTES,
|
||||
SCHEMA2_CONFIG_BYTES)
|
||||
from image.docker.schemautil import ContentRetrieverForTesting
|
||||
|
||||
def test_legacy_layers():
|
||||
retriever = ContentRetrieverForTesting({
|
||||
'sha256:e7a06c2e5b7afb1bbfa9124812e87f1138c4c10d77e0a217f0b8c8c9694dc5cf': SCHEMA2_CONFIG_BYTES,
|
||||
})
|
||||
|
||||
schema2 = DockerSchema2Manifest(SCHEMA2_MANIFEST_BYTES)
|
||||
schema1 = DockerSchema1Manifest(SCHEMA1_BYTES, validate=False)
|
||||
|
||||
# Check legacy layers
|
||||
schema2_legacy_layers = list(schema2.generate_legacy_layers({}, retriever))
|
||||
schema1_legacy_layers = list(schema1.generate_legacy_layers({}, retriever))
|
||||
assert len(schema1_legacy_layers) == len(schema2_legacy_layers)
|
||||
|
||||
for index in range(0, len(schema1_legacy_layers)):
|
||||
schema1_legacy_layer = schema1_legacy_layers[index]
|
||||
schema2_legacy_layer = schema2_legacy_layers[index]
|
||||
assert schema1_legacy_layer.content_checksum == schema2_legacy_layer.content_checksum
|
||||
assert schema1_legacy_layer.comment == schema2_legacy_layer.comment
|
||||
assert schema1_legacy_layer.command == schema2_legacy_layer.command
|
||||
|
||||
|
||||
def test_conversion():
|
||||
retriever = ContentRetrieverForTesting({
|
||||
'sha256:e7a06c2e5b7afb1bbfa9124812e87f1138c4c10d77e0a217f0b8c8c9694dc5cf': SCHEMA2_CONFIG_BYTES,
|
||||
})
|
||||
|
||||
schema2 = DockerSchema2Manifest(SCHEMA2_MANIFEST_BYTES)
|
||||
schema1 = DockerSchema1Manifest(SCHEMA1_BYTES, validate=False)
|
||||
|
||||
converted = schema2.get_schema1_manifest('devtable', 'somerepo', 'latest', retriever)
|
||||
assert len(converted.layers) == len(schema1.layers)
|
||||
|
||||
image_id_map = {}
|
||||
for index in range(0, len(converted.layers)):
|
||||
converted_layer = converted.layers[index]
|
||||
schema1_layer = schema1.layers[index]
|
||||
|
||||
image_id_map[schema1_layer.v1_metadata.image_id] = converted_layer.v1_metadata.image_id
|
||||
|
||||
assert str(schema1_layer.digest) == str(converted_layer.digest)
|
||||
|
||||
schema1_parent_id = schema1_layer.v1_metadata.parent_image_id
|
||||
converted_parent_id = converted_layer.v1_metadata.parent_image_id
|
||||
assert (schema1_parent_id is None) == (converted_parent_id is None)
|
||||
|
||||
if schema1_parent_id is not None:
|
||||
assert image_id_map[schema1_parent_id] == converted_parent_id
|
||||
|
||||
assert schema1_layer.v1_metadata.created == converted_layer.v1_metadata.created
|
||||
assert schema1_layer.v1_metadata.comment == converted_layer.v1_metadata.comment
|
||||
assert schema1_layer.v1_metadata.command == converted_layer.v1_metadata.command
|
||||
assert schema1_layer.v1_metadata.labels == converted_layer.v1_metadata.labels
|
||||
|
||||
schema1_container_config = json.loads(schema1_layer.raw_v1_metadata)['container_config']
|
||||
converted_container_config = json.loads(converted_layer.raw_v1_metadata)['container_config']
|
||||
|
||||
assert schema1_container_config == converted_container_config
|
Reference in a new issue