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

@ -7,6 +7,7 @@ from jsonschema import validate as validate_schema, ValidationError
from digest import digest_tools
from image.docker import ManifestException
from image.docker.interfaces import ManifestInterface
from image.docker.schema2 import (DOCKER_SCHEMA2_MANIFEST_CONTENT_TYPE,
DOCKER_SCHEMA2_CONFIG_CONTENT_TYPE,
DOCKER_SCHEMA2_LAYER_CONTENT_TYPE,
@ -39,7 +40,7 @@ class MalformedSchema2Manifest(ManifestException):
pass
class DockerSchema2Manifest(object):
class DockerSchema2Manifest(ManifestInterface):
METASCHEMA = {
'type': 'object',
'properties': {
@ -121,6 +122,7 @@ class DockerSchema2Manifest(object):
def __init__(self, manifest_bytes):
self._layers = None
self._payload = manifest_bytes
try:
self._parsed = json.loads(manifest_bytes)
@ -136,6 +138,18 @@ class DockerSchema2Manifest(object):
def schema_version(self):
return 2
@property
def manifest_dict(self):
return self._parsed
@property
def media_type(self):
return self._parsed[DOCKER_SCHEMA2_MANIFEST_MEDIATYPE_KEY]
@property
def digest(self):
return digest_tools.sha256_digest(self._payload)
@property
def config(self):
config = self._parsed[DOCKER_SCHEMA2_MANIFEST_CONFIG_KEY]
@ -153,6 +167,18 @@ class DockerSchema2Manifest(object):
def leaf_layer(self):
return self.layers[-1]
@property
def leaf_layer_v1_image_id(self):
return list(self.layers_with_v1_ids)[-1].v1_id
@property
def blob_digests(self):
return [str(layer.digest) for layer in self.layers]
@property
def bytes(self):
return self._payload
def _generate_layers(self):
for index, layer in enumerate(self._parsed[DOCKER_SCHEMA2_MANIFEST_LAYERS_KEY]):
content_type = layer[DOCKER_SCHEMA2_MANIFEST_MEDIATYPE_KEY]