1
0
mirror of https://github.com/quay/quay.git synced 2026-01-29 08:42:15 +03:00
Files
quay/image/shared/schemas.py
Kenny Lee Sin Cheong e91b9e4543 registry: allow pushing manifests with artifactType and subject fields (PROJQUAY-6673) (#2659)
Allow manifests to be pushed with a artifactType and subject fields.
2024-02-12 13:32:43 -05:00

56 lines
2.1 KiB
Python

from image.docker.schema1 import DOCKER_SCHEMA1_CONTENT_TYPES, DockerSchema1Manifest
from image.docker.schema2 import (
DOCKER_SCHEMA2_MANIFEST_CONTENT_TYPE,
DOCKER_SCHEMA2_MANIFESTLIST_CONTENT_TYPE,
)
from image.docker.schema2.list import DockerSchema2ManifestList
from image.docker.schema2.manifest import DockerSchema2Manifest
from image.oci import OCI_IMAGE_INDEX_CONTENT_TYPE, OCI_IMAGE_MANIFEST_CONTENT_TYPE
from image.oci.index import OCIIndex
from image.oci.manifest import OCIManifest
from image.shared import ManifestException
from image.shared.types import SparseManifestList
from util.bytes import Bytes
MANIFEST_LIST_TYPES = [DOCKER_SCHEMA2_MANIFESTLIST_CONTENT_TYPE, OCI_IMAGE_INDEX_CONTENT_TYPE]
def is_manifest_list_type(content_type):
"""Returns True if the given content type refers to a manifest list of some kind."""
return content_type in MANIFEST_LIST_TYPES
def parse_manifest_from_bytes(
manifest_bytes,
media_type,
validate=True,
sparse_manifest_support=False,
ignore_unknown_mediatypes=False,
):
"""
Parses and returns a manifest from the given bytes, for the given media type.
Raises a ManifestException if the parse fails for some reason.
"""
assert isinstance(manifest_bytes, Bytes)
if is_manifest_list_type(media_type) and sparse_manifest_support:
return SparseManifestList(manifest_bytes, media_type)
if media_type == DOCKER_SCHEMA2_MANIFEST_CONTENT_TYPE:
return DockerSchema2Manifest(manifest_bytes)
if media_type == DOCKER_SCHEMA2_MANIFESTLIST_CONTENT_TYPE:
return DockerSchema2ManifestList(manifest_bytes)
if media_type == OCI_IMAGE_MANIFEST_CONTENT_TYPE:
return OCIManifest(manifest_bytes, ignore_unknown_mediatypes=ignore_unknown_mediatypes)
if media_type == OCI_IMAGE_INDEX_CONTENT_TYPE:
return OCIIndex(manifest_bytes, ignore_unknown_mediatypes=ignore_unknown_mediatypes)
if media_type in DOCKER_SCHEMA1_CONTENT_TYPES:
return DockerSchema1Manifest(manifest_bytes, validate=validate)
raise ManifestException("Unknown or unsupported manifest media type `%s`" % media_type)