moto/tests/test_ecr/test_ecr_helpers.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

77 lines
2.3 KiB
Python
Raw Normal View History

import hashlib
import random
2022-12-16 18:22:43 +00:00
# Manifests Spec: https://docs.docker.com/registry/spec/manifest-v2-2/
def _generate_random_sha():
2022-12-16 18:22:43 +00:00
random_sha = hashlib.sha256(f"{random.randint(0,100)}".encode("utf-8")).hexdigest()
return f"sha256:{random_sha}"
def _create_image_layers(n):
layers = []
for _ in range(n):
layers.append(
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": random.randint(100, 1000),
2022-12-16 18:22:43 +00:00
"digest": _generate_random_sha(),
}
)
return layers
def _create_image_digest(layers):
layer_digests = "".join([layer["digest"] for layer in layers])
2022-12-16 18:22:43 +00:00
summed_digest = hashlib.sha256(f"{layer_digests}".encode("utf-8")).hexdigest()
return f"sha256:{summed_digest}"
def _create_image_manifest(image_digest=None):
layers = _create_image_layers(5)
if image_digest is None:
image_digest = _create_image_digest(layers)
return {
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": sum([layer["size"] for layer in layers]),
"digest": image_digest,
},
"layers": layers,
}
2022-12-16 18:22:43 +00:00
def _create_manifest_list_distribution(
image_manifest: dict, architecture: str = "amd64", os: str = "linux"
):
return {
"mediaType": image_manifest["config"]["mediaType"],
"digest": image_manifest["config"]["digest"],
"size": image_manifest["config"]["size"],
"platform": {"architecture": architecture, "os": os},
}
def _create_image_manifest_list():
arm_image_manifest = _create_image_manifest()
amd_image_manifest = _create_image_manifest()
arm_distribution = _create_manifest_list_distribution(
arm_image_manifest, architecture="arm64"
)
amd_distribution = _create_manifest_list_distribution(
amd_image_manifest, architecture="amd64"
)
manifest_list = {
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"schemaVersion": 2,
"manifests": [arm_distribution, amd_distribution],
}
return {
"image_manifests": [arm_image_manifest, amd_image_manifest],
"manifest_list": manifest_list,
}