| 
									
										
										
										
											2022-11-23 05:16:33 -08:00
										 |  |  | import hashlib | 
					
						
							|  |  |  | import random | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-16 10:22:43 -08:00
										 |  |  | # Manifests Spec: https://docs.docker.com/registry/spec/manifest-v2-2/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-23 05:16:33 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | def _generate_random_sha(): | 
					
						
							| 
									
										
										
										
											2022-12-16 10:22:43 -08:00
										 |  |  |     random_sha = hashlib.sha256(f"{random.randint(0,100)}".encode("utf-8")).hexdigest() | 
					
						
							|  |  |  |     return f"sha256:{random_sha}" | 
					
						
							| 
									
										
										
										
											2022-11-23 05:16:33 -08: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 10:22:43 -08:00
										 |  |  |                 "digest": _generate_random_sha(), | 
					
						
							| 
									
										
										
										
											2022-11-23 05:16:33 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     return layers | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def _create_image_digest(layers): | 
					
						
							|  |  |  |     layer_digests = "".join([layer["digest"] for layer in layers]) | 
					
						
							| 
									
										
										
										
											2022-12-16 10:22:43 -08:00
										 |  |  |     summed_digest = hashlib.sha256(f"{layer_digests}".encode("utf-8")).hexdigest() | 
					
						
							|  |  |  |     return f"sha256:{summed_digest}" | 
					
						
							| 
									
										
										
										
											2022-11-23 05:16:33 -08: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 10:22:43 -08: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, | 
					
						
							|  |  |  |     } |