Handle additional error cases in the manifest schema 1 implementation
This commit is contained in:
parent
82897a2bba
commit
097311f360
2 changed files with 22 additions and 2 deletions
|
@ -377,7 +377,11 @@ class DockerSchema1Manifest(ManifestInterface):
|
||||||
|
|
||||||
metadata_string = history_obj[DOCKER_SCHEMA1_V1_COMPAT_KEY]
|
metadata_string = history_obj[DOCKER_SCHEMA1_V1_COMPAT_KEY]
|
||||||
|
|
||||||
v1_metadata = json.loads(metadata_string)
|
try:
|
||||||
|
v1_metadata = json.loads(metadata_string)
|
||||||
|
except (ValueError, TypeError):
|
||||||
|
raise MalformedSchema1Manifest('Could not parse metadata string: %s' % metadata_string)
|
||||||
|
|
||||||
command_list = v1_metadata.get('container_config', {}).get('Cmd', None)
|
command_list = v1_metadata.get('container_config', {}).get('Cmd', None)
|
||||||
command = to_canonical_json(command_list) if command_list else None
|
command = to_canonical_json(command_list) if command_list else None
|
||||||
|
|
||||||
|
@ -536,7 +540,7 @@ class DockerSchema1ManifestBuilder(object):
|
||||||
DOCKER_SCHEMA1_BLOB_SUM_KEY: layer_digest,
|
DOCKER_SCHEMA1_BLOB_SUM_KEY: layer_digest,
|
||||||
})
|
})
|
||||||
self._history.append({
|
self._history.append({
|
||||||
DOCKER_SCHEMA1_V1_COMPAT_KEY: v1_json_metadata,
|
DOCKER_SCHEMA1_V1_COMPAT_KEY: v1_json_metadata or '{}',
|
||||||
})
|
})
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
|
|
@ -197,3 +197,19 @@ def test_validate_manifest_with_emoji(with_key):
|
||||||
# Ensure the manifest can be reloaded.
|
# Ensure the manifest can be reloaded.
|
||||||
built_bytes = built.bytes.as_encoded_str()
|
built_bytes = built.bytes.as_encoded_str()
|
||||||
DockerSchema1Manifest(Bytes.for_string_or_unicode(built_bytes))
|
DockerSchema1Manifest(Bytes.for_string_or_unicode(built_bytes))
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('with_key', [
|
||||||
|
None,
|
||||||
|
docker_v2_signing_key,
|
||||||
|
])
|
||||||
|
def test_validate_manifest_with_none_metadata_layer(with_key):
|
||||||
|
builder = DockerSchema1ManifestBuilder('somenamespace', 'somerepo', 'sometag')
|
||||||
|
builder.add_layer('sha256:abcde', None)
|
||||||
|
|
||||||
|
built = builder.build(with_key, ensure_ascii=False)
|
||||||
|
built._validate()
|
||||||
|
|
||||||
|
# Ensure the manifest can be reloaded.
|
||||||
|
built_bytes = built.bytes.as_encoded_str()
|
||||||
|
DockerSchema1Manifest(Bytes.for_string_or_unicode(built_bytes))
|
||||||
|
|
Reference in a new issue