Define a formal manifest interface and implement in the schema1 and schema2 manifests

This will allow us to pass arbitrary manifests to the model
This commit is contained in:
Joseph Schorr 2018-07-31 15:41:30 -04:00
parent cf5a6e1adc
commit 36c7482385
4 changed files with 94 additions and 5 deletions

View file

@ -18,9 +18,9 @@ from jwt.utils import base64url_encode, base64url_decode
from digest import digest_tools
from image.docker import ManifestException
from image.docker.interfaces import ManifestInterface
from image.docker.v1 import DockerV1Metadata
logger = logging.getLogger(__name__)
@ -85,7 +85,7 @@ class Schema1V1Metadata(namedtuple('Schema1V1Metadata', ['image_id', 'parent_ima
"""
class DockerSchema1Manifest(object):
class DockerSchema1Manifest(ManifestInterface):
METASCHEMA = {
'type': 'object',
'properties': {
@ -235,6 +235,10 @@ class DockerSchema1Manifest(object):
def manifest_json(self):
return self._parsed
@property
def manifest_dict(self):
return self._parsed
@property
def digest(self):
return digest_tools.sha256_digest(self.payload)
@ -252,6 +256,10 @@ class DockerSchema1Manifest(object):
def checksums(self):
return list({str(mdata.digest) for mdata in self.layers})
@property
def leaf_layer_v1_image_id(self):
return self.layers[-1].v1_metadata.image_id
@property
def leaf_layer(self):
return self.layers[-1]
@ -262,6 +270,10 @@ class DockerSchema1Manifest(object):
self._layers = list(self._generate_layers())
return self._layers
@property
def blob_digests(self):
return [str(layer.digest) for layer in self.layers]
def _generate_layers(self):
"""
Returns a generator of objects that have the blobSum and v1Compatibility keys in them,