import json import pytest from image.docker.schema1 import DockerSchema1Manifest from image.docker.schema2.manifest import DockerSchema2Manifest from image.docker.schema2.list import MalformedSchema2ManifestList, DockerSchema2ManifestList from image.docker.schema2.test.test_manifest import MANIFEST_BYTES as v22_bytes from image.docker.test.test_schema1 import MANIFEST_BYTES as v21_bytes @pytest.mark.parametrize('json_data', [ '', '{}', """ { "unknown": "key" } """, ]) def test_malformed_manifest_lists(json_data): with pytest.raises(MalformedSchema2ManifestList): DockerSchema2ManifestList(json_data) MANIFESTLIST_BYTES = json.dumps({ "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 983, "digest": "sha256:e6", "platform": { "architecture": "ppc64le", "os": "linux", } }, { "mediaType": "application/vnd.docker.distribution.manifest.v1+json", "size": 878, "digest": "sha256:5b", "platform": { "architecture": "amd64", "os": "linux", "features": [ "sse4" ] } } ] }) def test_valid_manifestlist(): def _get_manifest(digest): if digest == 'sha256:e6': return v22_bytes else: return v21_bytes manifestlist = DockerSchema2ManifestList(MANIFESTLIST_BYTES) assert len(manifestlist.manifests(_get_manifest)) == 2 for index, manifest in enumerate(manifestlist.manifests(_get_manifest)): if index == 0: assert isinstance(manifest.manifest_obj, DockerSchema2Manifest) assert manifest.manifest_obj.schema_version == 2 else: assert isinstance(manifest.manifest_obj, DockerSchema1Manifest) assert manifest.manifest_obj.schema_version == 1 assert manifestlist.get_v1_compatible_manifest(_get_manifest).manifest_obj.schema_version == 1