2018-11-12 21:27:01 +00:00
|
|
|
from abc import ABCMeta, abstractproperty, abstractmethod
|
2018-07-31 19:41:30 +00:00
|
|
|
from six import add_metaclass
|
|
|
|
|
|
|
|
@add_metaclass(ABCMeta)
|
|
|
|
class ManifestInterface(object):
|
|
|
|
""" Defines the interface for the various manifests types supported. """
|
|
|
|
@abstractproperty
|
|
|
|
def digest(self):
|
|
|
|
""" The digest of the manifest, including type prefix. """
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractproperty
|
|
|
|
def media_type(self):
|
|
|
|
""" The media type of the schema. """
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractproperty
|
|
|
|
def manifest_dict(self):
|
|
|
|
""" Returns the manifest as a dictionary ready to be serialized to JSON. """
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractproperty
|
|
|
|
def bytes(self):
|
|
|
|
""" Returns the bytes of the manifest. """
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractproperty
|
|
|
|
def layers(self):
|
2018-11-12 21:27:01 +00:00
|
|
|
""" Returns the layers of this manifest, from base to leaf or None if none. """
|
2018-07-31 19:41:30 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractproperty
|
|
|
|
def leaf_layer_v1_image_id(self):
|
|
|
|
""" Returns the Docker V1 image ID for the leaf (top) layer, if any, or None if none. """
|
|
|
|
pass
|
|
|
|
|
2018-09-20 21:49:00 +00:00
|
|
|
@abstractproperty
|
|
|
|
def legacy_image_ids(self):
|
|
|
|
""" Returns the Docker V1 image IDs for the layers of this manifest or None if not applicable.
|
|
|
|
"""
|
|
|
|
pass
|
|
|
|
|
2018-07-31 19:41:30 +00:00
|
|
|
@abstractproperty
|
|
|
|
def blob_digests(self):
|
|
|
|
""" Returns an iterator over all the blob digests referenced by this manifest,
|
2018-11-12 21:27:01 +00:00
|
|
|
from base to leaf. The blob digests are strings with prefixes. For manifests that reference
|
|
|
|
config as a blob, the blob will be included here.
|
|
|
|
"""
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def child_manifests(self, lookup_manifest_fn):
|
|
|
|
""" Returns an iterator of all manifests that live under this manifest, if any or None if none.
|
|
|
|
The lookup_manifest_fn is a function that, when given a blob content SHA, returns the
|
|
|
|
contents of that blob in storage if any or None if none.
|
|
|
|
"""
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def get_manifest_labels(self, lookup_config_fn):
|
|
|
|
""" Returns a dictionary of all the labels defined inside this manifest or None if none. """
|
|
|
|
pass
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def unsigned(self):
|
|
|
|
""" Returns an unsigned version of this manifest. """
|
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def generate_legacy_layers(self, images_map, lookup_config_fn):
|
|
|
|
"""
|
|
|
|
Rewrites Docker v1 image IDs and returns a generator of DockerV1Metadata.
|
|
|
|
|
|
|
|
If Docker gives us a layer with a v1 image ID that already points to existing
|
|
|
|
content, but the checksums don't match, then we need to rewrite the image ID
|
|
|
|
to something new in order to ensure consistency.
|
|
|
|
|
|
|
|
Returns None if there are no legacy images associated with the manifest.
|
2018-07-31 19:41:30 +00:00
|
|
|
"""
|
2018-11-13 08:40:57 +00:00
|
|
|
|
|
|
|
@abstractmethod
|
|
|
|
def get_v1_compatible_manifest(self, namespace_name, repo_name, tag_name, lookup_fn):
|
|
|
|
""" Returns the manifest that is compatible with V1, by virtue of being `amd64` and `linux`.
|
|
|
|
If none, returns None.
|
|
|
|
"""
|