2022-11-23 13:16:33 +00:00
|
|
|
import hashlib
|
|
|
|
import random
|
|
|
|
|
2022-12-16 18:22:43 +00:00
|
|
|
# Manifests Spec: https://docs.docker.com/registry/spec/manifest-v2-2/
|
|
|
|
|
2022-11-23 13:16:33 +00:00
|
|
|
|
|
|
|
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}"
|
2022-11-23 13:16:33 +00:00
|
|
|
|
|
|
|
|
|
|
|
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(),
|
2022-11-23 13:16:33 +00:00
|
|
|
}
|
|
|
|
)
|
|
|
|
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}"
|
2022-11-23 13:16:33 +00:00
|
|
|
|
|
|
|
|
|
|
|
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,
|
|
|
|
}
|