diff --git a/.github/workflows/update-images.yml b/.github/workflows/update-images.yml index 26619083..6f815867 100644 --- a/.github/workflows/update-images.yml +++ b/.github/workflows/update-images.yml @@ -31,7 +31,7 @@ jobs: run: pip3 install tox - name: Update images - run: tox -e update -- --dry-run --name ${{ matrix.image }} + run: tox -e update -- --name ${{ matrix.image }} - name: Create pull request uses: peter-evans/create-pull-request@v8 diff --git a/contrib/__init__.py b/contrib/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/contrib/update.py b/contrib/update.py index 9c6a8e8a..20232464 100644 --- a/contrib/update.py +++ b/contrib/update.py @@ -2,198 +2,148 @@ # source of latest URLs: https://gitlab.com/libosinfo/osinfo-db +from dataclasses import dataclass from datetime import datetime import os import re -import shutil import sys from urllib.error import HTTPError from urllib.parse import urlparse from urllib.request import urlopen from loguru import logger -from minio import Minio -from minio.error import S3Error from natsort import natsorted -import patoolib import requests import ruamel.yaml import typer app = typer.Typer() DEBUBU_REGEX = r'(?:release-)?([0-9]+)(\-[0-9]+)?/' +HTTP_TIMEOUT = 30 +MIRROR_BASE_URL = os.environ.get( + "MIRROR_BASE_URL", + "https://nbg1.your-objectstorage.com/osism/openstack-images", +).rstrip("/") + + +@dataclass +class MirrorDirConfig: + # "plain" -> ` ` ; "bsd" -> `SHA256 () = ` + checksum_style: str = "plain" + # resolve newest build from the manifest via the HEREBE/DRAGONS placeholder pattern + resolve_latest: bool = False + # for bsd: "filename" keys on the parenthesised name; "target" maps every + # SHA256 line onto the known latest filename (last line wins) + bsd_key: str = "filename" + + +DEFAULT_MIRROR_CONFIG = MirrorDirConfig() +MIRROR_DIR_CONFIG = { + "centos-7": MirrorDirConfig(checksum_style="plain", resolve_latest=True), + "centos-stream-8": MirrorDirConfig(checksum_style="bsd", resolve_latest=True), + "centos-stream-9": MirrorDirConfig(checksum_style="bsd", resolve_latest=True), + "rocky-8": MirrorDirConfig(checksum_style="bsd", bsd_key="target"), + "rocky-9": MirrorDirConfig(checksum_style="bsd", bsd_key="target"), +} -def get_latest_default( - shortname, latest_checksum_url, latest_url, checksum_type="sha256" -): - result = requests.get(latest_checksum_url) - result.raise_for_status() - - latest_filename = os.path.basename(urlparse(latest_url).path) - filename_pattern = None - if shortname in ["centos-stream-8", "centos-stream-9", "centos-7"]: - filename_pattern = latest_filename.replace("HEREBE", "") - filename_pattern = filename_pattern.replace("DRAGONS", "") - - checksums = {} - for line in result.text.split("\n"): - cs = re.split(r"\s+", line) - if shortname in ["rocky-8", "rocky-9"]: - if len(cs) == 4 and cs[0] == "SHA256": - checksums[latest_filename] = cs[3] - elif shortname in ["centos-7"]: - if len(cs) == 2 and re.search(filename_pattern, cs[1]): - checksums[cs[1]] = cs[0] - elif shortname in ["centos-stream-8", "centos-stream-9"]: - if ( - len(cs) == 4 - and cs[0] == "SHA256" - and re.search(filename_pattern, cs[1][1:-1]) - ): - checksums[cs[1][1:-1]] = cs[3] - else: - if len(cs) == 2: - checksums[cs[1]] = cs[0] - - if filename_pattern: - new_latest_filename = natsorted(checksums.keys())[-1] - new_latest_url = latest_url.replace(latest_filename, new_latest_filename) - - logger.info(f"Latest URL is now {new_latest_url}") - logger.info(f"Latest filename is now {new_latest_filename}") - - latest_filename = new_latest_filename - latest_url = new_latest_url - - current_checksum = f"{checksum_type}:{checksums[latest_filename]}" - return current_checksum, latest_url, None - - -def resolve_debubu(base_url, rex=re.compile(DEBUBU_REGEX)): - result = requests.get(base_url) - result.raise_for_status() - latest_folder, latest_date, latest_build = sorted(rex.findall(result.text))[-1] - return latest_folder, latest_date, latest_build - - -def get_latest_debubu(shortname, latest_checksum_url, latest_url, checksum_type=None): - base_url, _, filename = latest_url.rsplit("/", 2) - latest_folder, latest_date, latest_build = resolve_debubu(base_url) - current_base_url = f"{base_url}/{latest_folder}" - current_checksum_url = ( - f"{current_base_url}/{latest_checksum_url.rsplit('/', 1)[-1]}" - ) - result = requests.get(current_checksum_url) - result.raise_for_status() - current_checksum = None - current_filename = filename - if latest_build: # Debian includes date-build in file name - fn_pre, fn_suf = filename.rsplit(".", 1) - current_filename = f"{fn_pre}-{latest_date}{latest_build}.{fn_suf}" - for line in result.text.splitlines(): - cs = line.split() - if len(cs) != 2: - continue - if cs[1].startswith("*"): # Ubuntu has the asterisk in front of the name - cs[1] = cs[1][1:] - if cs[1] != current_filename: - continue - if checksum_type is None: # use heuristics to distinguish sha256/sha512 +class MirrorDirHandler: + def resolve(self, image: dict) -> tuple[str, str, str | None]: + shortname = image["shortname"] + latest_url = image["latest_url"] + cfg = MIRROR_DIR_CONFIG.get(shortname, DEFAULT_MIRROR_CONFIG) + + result = requests.get(image["latest_checksum_url"], timeout=HTTP_TIMEOUT) + result.raise_for_status() + + original_filename = os.path.basename(urlparse(latest_url).path) + pattern = None + if cfg.resolve_latest: + pattern = original_filename.replace("HEREBE", "").replace("DRAGONS", "") + + checksums = {} + for line in result.text.split("\n"): + cs = re.split(r"\s+", line) + if cfg.checksum_style == "bsd": + if len(cs) == 4 and cs[0] == "SHA256": + if cfg.bsd_key == "target": + checksums[original_filename] = cs[3] + else: + name = cs[1][1:-1] + if pattern is None or re.search(pattern, name): + checksums[name] = cs[3] + else: + if len(cs) == 2: + if pattern is None or re.search(pattern, cs[1]): + checksums[cs[1]] = cs[0] + + target_filename = original_filename + if pattern: + target_filename = natsorted(checksums.keys())[-1] + latest_url = latest_url.replace(original_filename, target_filename) + + return f"sha256:{checksums[target_filename]}", latest_url, None + + +class DirListingHandler: + def resolve(self, image: dict) -> tuple[str, str, str | None]: + latest_url = image["latest_url"] + latest_checksum_url = image["latest_checksum_url"] + base_url, _, filename = latest_url.rsplit("/", 2) + + listing = requests.get(base_url, timeout=HTTP_TIMEOUT) + listing.raise_for_status() + latest_folder, latest_date, latest_build = sorted( + re.compile(DEBUBU_REGEX).findall(listing.text) + )[-1] + + current_base_url = f"{base_url}/{latest_folder}" + current_checksum_url = ( + f"{current_base_url}/{latest_checksum_url.rsplit('/', 1)[-1]}" + ) + result = requests.get(current_checksum_url, timeout=HTTP_TIMEOUT) + result.raise_for_status() + + current_filename = filename + if latest_build: + fn_pre, fn_suf = filename.rsplit(".", 1) + current_filename = f"{fn_pre}-{latest_date}{latest_build}.{fn_suf}" + + for line in result.text.splitlines(): + cs = line.split() + if len(cs) != 2: + continue + if cs[1].startswith("*"): + cs[1] = cs[1][1:] + if cs[1] != current_filename: + continue checksum_type = "sha256" if len(cs[0]) == 64 else "sha512" - current_checksum = f"{checksum_type}:{cs[0]}" - break - if current_checksum is None: + return ( + f"{checksum_type}:{cs[0]}", + f"{current_base_url}/{current_filename}", + latest_date, + ) + raise RuntimeError( f"{current_checksum_url} does not contain {current_filename}" ) - current_url = f"{current_base_url}/{current_filename}" - return current_checksum, current_url, latest_date -IMAGES = { - "almalinux": get_latest_default, - "centos": get_latest_default, - "debian": get_latest_debubu, - "rockylinux": get_latest_default, - "ubuntu": get_latest_debubu, +HANDLERS = { + "almalinux": MirrorDirHandler(), + "centos": MirrorDirHandler(), + "debian": DirListingHandler(), + "rockylinux": MirrorDirHandler(), + "ubuntu": DirListingHandler(), } -def mirror_image( - image, latest_url, minio_server, minio_bucket, minio_access_key, minio_secret_key -): - client = Minio( - minio_server, - access_key=minio_access_key, - secret_key=minio_secret_key, - ) - - result = client.bucket_exists(minio_bucket) - if not result: - logger.error(f"Create bucket '{minio_bucket}' first") - return - - version = image["versions"][0] - - path = urlparse(version["url"]) - dirname = image["shortname"] - filename, fileextension = os.path.splitext(os.path.basename(path.path)) - - if fileextension not in [".bz2", ".zip", ".xz", ".gz"]: - filename += fileextension - - shortname = image["shortname"] - format = image["format"] - new_version = version["version"] - new_filename = f"{new_version}-{shortname}.{format}" - - try: - client.stat_object(minio_bucket, os.path.join(dirname, new_filename)) - logger.info(f"'{new_filename}' available in '{dirname}'") - except S3Error: - logger.info(f"'{new_filename}' not yet available in '{dirname}'") - logger.info(f"Downloading '{latest_url}'") - - response = requests.get(latest_url, stream=True) - with open(os.path.basename(path.path), "wb") as fp: - shutil.copyfileobj(response.raw, fp) - del response - - if fileextension in [".bz2", ".zip", ".xz", ".gz"]: - logger.info(f"Decompressing '{os.path.basename(path.path)}'") - patoolib.extract_archive(os.path.basename(path.path), outdir=".") - os.remove(os.path.basename(path.path)) - - logger.info(f"Uploading '{filename}' to '{dirname}' as '{new_filename}'") - - client.fput_object(minio_bucket, os.path.join(dirname, new_filename), filename) - os.remove(filename) - - -def update_image( - image, - getter, - minio_server, - minio_bucket, - minio_access_key, - minio_secret_key, - dry_run=False, -): +def update_image(image, handler): name = image["name"] - logger.info(f"Checking image {name}") - - latest_url = image["latest_url"] - logger.info(f"Latest download URL is {latest_url}") - - latest_checksum_url = image["latest_checksum_url"] - logger.info(f"Getting checksums from {latest_checksum_url}") - shortname = image["shortname"] - current_checksum, current_url, current_version = getter( - shortname, latest_checksum_url, latest_url - ) + logger.info(f"Checking image {name}") + current_checksum, current_url, current_version = handler.resolve(image) logger.info( f"Checksum of current {current_url.rsplit('/', 1)[-1]} is {current_checksum}" ) @@ -201,77 +151,41 @@ def update_image( if not image["versions"]: logger.info("No image available so far") image["versions"].append( - { - "build_date": None, - "checksum": None, - "url": None, - "version": None, - } + {"build_date": None, "checksum": None, "url": None, "version": None} ) - latest_checksum = image["versions"][0]["checksum"] - logger.info(f"Our checksum is {latest_checksum}") - - if latest_checksum == current_checksum: + if image["versions"][0]["checksum"] == current_checksum: logger.info(f"Image {name} is up-to-date, nothing to do") return 0 if current_version is None: logger.info(f"Checking {current_url}") - try: - conn = urlopen(current_url, timeout=30) + conn = urlopen(current_url, timeout=HTTP_TIMEOUT) except HTTPError as e: logger.warning(f"Image {name} cannot be processed, skipping: {e}") return 0 - dt = datetime.strptime( conn.headers["last-modified"], "%a, %d %b %Y %H:%M:%S %Z" ) current_version = dt.strftime("%Y%m%d") - new_values = { - "version": current_version, - "build_date": datetime.strptime(current_version, "%Y%m%d").date(), - "checksum": current_checksum, - "url": current_url, - } - logger.info(f"New values are {new_values}") - image["versions"][0].update(new_values) - - shortname = image["shortname"] - format = image["format"] - - minio_server = str(minio_server) - minio_bucket = str(minio_bucket) - mirror_url = f"https://{minio_server}/{minio_bucket}/{shortname}/{current_version}-{shortname}.{format}" # noqa E501 + image_format = image["format"] + mirror_url = ( + f"{MIRROR_BASE_URL}/{shortname}/" + f"{current_version}-{shortname}.{image_format}" + ) logger.info(f"New URL is {mirror_url}") - # If `mirror_url` is given, the manage.py script will - # use `mirror_url` for the download and will use `url` - # to set the `image_source` property. This way we keep - # track of the original source of the image. - - image["versions"][0]["mirror_url"] = mirror_url - - # We use `current_url` here and not `latest_url` to keep track - # of the original source of the image. Even if we know that `current_url` - # will not be available in the future. The `latest_url` will always - # be part of the image definition itself. - - image["versions"][0]["url"] = current_url - - if dry_run: - logger.info(f"Not mirroring {mirror_url}, dry-run enabled") - else: - mirror_image( - image, - current_url, - minio_server, - minio_bucket, - minio_access_key, - minio_secret_key, - ) + image["versions"][0].update( + { + "version": current_version, + "build_date": datetime.strptime(current_version, "%Y%m%d").date(), + "checksum": current_checksum, + "url": current_url, + "mirror_url": mirror_url, + } + ) return 1 @@ -281,18 +195,11 @@ def main( None, "--name", help="Only update the image with this name" ), debug: bool = typer.Option(False, "--debug", help="Enable debug logging"), - dry_run: bool = typer.Option(False, "--dry-run", help="Do not perform any changes"), - minio_access_key: str = typer.Option( - None, help="Minio access key", envvar="MINIO_ACCESS_KEY" - ), - minio_secret_key: str = typer.Option( - None, help="Minio secret key", envvar="MINIO_SECRET_KEY" + dry_run: bool = typer.Option( + False, "--dry-run", help="Compute updates but do not write the YAML files" ), - minio_server: str = typer.Option( - "nbg1.your-objectstorage.com", help="Minio server", envvar="MINIO_SERVER" - ), - minio_bucket: str = typer.Option( - "osism/openstack-images", help="Minio bucket", envvar="MINIO_BUCKET" + images_dir: str = typer.Option( + "etc/images", "--images-dir", help="Directory with the image definition files" ), ): if debug: @@ -300,19 +207,19 @@ def main( else: level = "INFO" - logger.remove() # remove the default sink + logger.remove() log_fmt = ( "{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | " "{function}:{line} - {message}" ) logger.add(sys.stderr, format=log_fmt, level=level, colorize=True) - for image, getter in IMAGES.items(): - if name and image != name: - logger.info(f"Skipping {image}") + for image_name, handler in HANDLERS.items(): + if name and image_name != name: + logger.info(f"Skipping {image_name}") continue - p = f"etc/images/{image}.yml" + p = os.path.join(images_dir, f"{image_name}.yml") logger.info(f"Processing file {p}") ryaml = ruamel.yaml.YAML() @@ -320,23 +227,18 @@ def main( data = ryaml.load(fp) updates = 0 - for index, image in enumerate(data["images"]): + for image in data["images"]: if "latest_url" not in image: continue - - updates += update_image( - image, - getter, - minio_server, - minio_bucket, - minio_access_key, - minio_secret_key, - dry_run, - ) + updates += update_image(image, handler) if not updates: continue + if dry_run: + logger.info(f"Dry-run enabled, not writing {p}") + continue + with open(p, "w+") as fp: ryaml.explicit_start = True ryaml.indent(sequence=4, offset=2) diff --git a/test/unit/fixtures/update/almalinux9/CHECKSUM b/test/unit/fixtures/update/almalinux9/CHECKSUM new file mode 100644 index 00000000..d752f6ed --- /dev/null +++ b/test/unit/fixtures/update/almalinux9/CHECKSUM @@ -0,0 +1,6 @@ +c397eed7023e92c841155831b1f47e26300e5bef0f0256c129322307c897a251 AlmaLinux-9-GenericCloud-9.8-20260526.x86_64.qcow2 +53a20d1d73d739f437b45e34fcbda48b7b9856c648fcc9730ce9653e27712092 AlmaLinux-9-GenericCloud-ext4-9.8-20260526.x86_64.qcow2 +53a20d1d73d739f437b45e34fcbda48b7b9856c648fcc9730ce9653e27712092 AlmaLinux-9-GenericCloud-ext4-latest.x86_64.qcow2 +c397eed7023e92c841155831b1f47e26300e5bef0f0256c129322307c897a251 AlmaLinux-9-GenericCloud-latest.x86_64.qcow2 +a15a6fb775f3b39c82efe1498daf31016729eb78864c45ff82584f3ed5e9fbe9 AlmaLinux-9-OpenNebula-9.8-20260526.x86_64.qcow2 +a15a6fb775f3b39c82efe1498daf31016729eb78864c45ff82584f3ed5e9fbe9 AlmaLinux-9-OpenNebula-latest.x86_64.qcow2 diff --git a/test/unit/fixtures/update/centos7/sha256sum.txt b/test/unit/fixtures/update/centos7/sha256sum.txt new file mode 100644 index 00000000..a4b6855e --- /dev/null +++ b/test/unit/fixtures/update/centos7/sha256sum.txt @@ -0,0 +1,180 @@ +9c315cf14987e191c9149a020da332931d0a36f215f9c62c3d42866fd0f4c7c9 CentOS-7-aarch64-GenericCloud-1606.qcow2.xz +90d0bc68eb901ba7d7178714837bed62afd414cc0d083cd08cb781a6831cba36 CentOS-7-aarch64-GenericCloud-1610.qcow2.xz +131d99de0b6bfc1da6e76a660cc6378de8f347bb9785478ef4e8624ec536025b CentOS-7-aarch64-GenericCloud-1701.qcow2.xz +567ba2655047281ce466acd2148962d6040c61227aa5d4a092123c026964ca89 CentOS-7-aarch64-GenericCloud-1708.qcow2.xz +fb566f76c7d107cabb21f852dd6183f165c6aa870ef311fe11b1697774565af4 CentOS-7-aarch64-GenericCloud-2003.qcow2.xz +e80fe82b6dafa02a4d58ff4acdb06c354dd0b9e0ab51bd41fd460de6b583b0ed CentOS-7-ppc64le-GenericCloud-2003.qcow2.xz +e324e3ab1d24a1bbf035ddb365e7f9058c0b454acf48d7aa15c5519fae5998ab CentOS-7-x86_64-GenericCloud-1503.qcow2 +1465fd924f6978467a5e4bd98ced42979d6ecd7161eaa0a2757060e907039b0f CentOS-7-x86_64-GenericCloud-1503.qcow2c +8230e6bec9373d2f26819797985f1b47b8d7214a2cb82c058fe7955014ecaf04 CentOS-7-x86_64-GenericCloud-1503.qcow2.xz +3ac3e852f68cc4ce61e6c226b5c9ca0508eed83105767b5240c3309894b8ed22 CentOS-7-x86_64-GenericCloud-1503.raw.xz +0952b651a6248998380aef73d9961ccb45af9b1823579bc2b72d28fa5fe5dea7 CentOS-7-x86_64-GenericCloud-1508.qcow2 +8bb46b6619f05d5e58a6fbf929a45abe61b58e87c9a02ae44a0f65e859f3c1b9 CentOS-7-x86_64-GenericCloud-1508.qcow2c +a8f9e24ad80901cbd6894662c1a20c0173892c002b4f66ec9a935650b34d6461 CentOS-7-x86_64-GenericCloud-1508.qcow2.xz +1ed60e89401fcd4fe1b7387452ff41afd617c30e10dd5623438a0231b5694be9 CentOS-7-x86_64-GenericCloud-1509.qcow2 +7747e2e4cbac0259e9c6bf0be749ab43778414010d918f56107776b2c3b2e955 CentOS-7-x86_64-GenericCloud-1509.qcow2c +fbada05b9d8067f16138a645376e188c19d0c3cbf93401ba1c5a899ac1eaac81 CentOS-7-x86_64-GenericCloud-1509.qcow2.xz +8a40e21cdab9feb57c06d7b77d3c43bd56229b445fa9c1868fda29dea066dc6c CentOS-7-x86_64-GenericCloud-1510.qcow2 +32f4dc21d8e596eb13aa698f983442f46f1396068cc9008eaa66ff10fa3fc25f CentOS-7-x86_64-GenericCloud-1510.qcow2c +9461006300d65172f5668d8875f2aad7b54f7ba4e9c5435d65a84a5a2d66e39b CentOS-7-x86_64-GenericCloud-1510.qcow2.xz +0ef6f432a0b032b2dfac958e4fb0fcabce456af35807993d00cc82f30d60df8e CentOS-7-x86_64-GenericCloud-1511.qcow2 +45cfe2fe6a4c552e6cbe487c3195c6b0ba04d1f2c281bd696cf43cb72f1429c6 CentOS-7-x86_64-GenericCloud-1511.qcow2c +e2bf8d292d3a50b988b082c2929b46836b8c2d9eb804bbb79eb0cc20fc8e7907 CentOS-7-x86_64-GenericCloud-1511.qcow2c.xz +c2e16bab8b5283cae77deb5bb0aad0a494cd4aabcb5dc5c71363056e88b93c0f CentOS-7-x86_64-GenericCloud-1511.qcow2.xz +e639a99ce866175a756e0a9fc9ef48b7b741a9c3fd2d1999d381ecf76ad73e94 CentOS-7-x86_64-GenericCloud-1511.raw.tar.gz +9db4d4d9037adad1d8b3a7ed8e77e79f52c9203873c9eca02df6f94c57f9a3d0 CentOS-7-x86_64-GenericCloud-1601.qcow2 +a51e4ec10b3a3ce28b4fbcef9ecf0a29b8d580d1931414f1d8869b2c0cfb681c CentOS-7-x86_64-GenericCloud-1601.qcow2c +b5be6844cde2b5520f9b566935af8abc69517e74cc8344d45280ba30fb29814b CentOS-7-x86_64-GenericCloud-1601.qcow2.xz +354cf1f5a594edc1cef6578cd736a5a998f816b5a1ff3553eac42151b6708de4 CentOS-7-x86_64-GenericCloud-1601.raw.tar.gz +1b777fa1ea2b2cf0be7ed6ecce54ef18ece5c6551fb291549b887e33b78d7c78 CentOS-7-x86_64-GenericCloud-1602.qcow2 +bc0f51d9376001f8973595b71105b9d53c8c27b3e0969676aab2ab036cc4d835 CentOS-7-x86_64-GenericCloud-1602.qcow2c +dd0f5e610e7c5ffacaca35ed7a78a19142a588f4543da77b61c1fb0d74400471 CentOS-7-x86_64-GenericCloud-1602.qcow2.xz +87421b6559d2572ef4070d7fcd382331662e61421def808172c16ad005f5c50f CentOS-7-x86_64-GenericCloud-1602.raw.tar.gz +c88230cde563ca29b065d53819586262f79a64769736e014bf6dabaa61a20968 CentOS-7-x86_64-GenericCloud-1603.qcow2 +6d17808cf208bee3243f51b84e9bfb10b06f0cd04e2930505d9ea4fba2583bc5 CentOS-7-x86_64-GenericCloud-1603.qcow2c +f91e602120a728f144da605baf0d5f4ad59293921bee99cc4aa3a1ab65e6d445 CentOS-7-x86_64-GenericCloud-1603.qcow2.xz +5c5cacfc1f0700cc7d48d667933cd730f7443e866caeda94d8e205a8bc8ce511 CentOS-7-x86_64-GenericCloud-1603.raw.tar.gz +2e93aad140cd9fe72a731c486814c3defacf16bfbf4368610ea5ed1bcbda8450 CentOS-7-x86_64-GenericCloud-20140929_01.qcow2 +7710ffdd497cf00fc72c22a3fa7cc7adb3424d3542521ca8fbe19eba9ded403f CentOS-7-x86_64-GenericCloud-20141129_01.qcow2 +db42e4fb9565e75f0acbe6b54a5b8822f3f1e9783fb1a553e1552c72ceaff8df CentOS-7-x86_64-GenericCloud-20141129_01.qcow2c +9b0b38c48a24164c15c33625972b87835501b6994c3ee894f6b79ce40e7d5e54 CentOS-7-x86_64-GenericCloud-20141129_01.qcow2.xz +30b0459d3cf82a83952991124e253a6c09d70ac509707349bf1813fe730dbfb4 CentOS-7-x86_64-GenericCloud-20150628_01.qcow2 +55a69b843cd451321d0729dd4c83e41e87540702e195dd30f94714452081640b CentOS-7-x86_64-GenericCloud-20150628_01.qcow2c +3e0dc21ed970ba001be30c917b5ed831da43ac0b56fbdb7bf217f9836ff455ca CentOS-7-x86_64-GenericCloud-20150628_01.qcow2.xz +6232c175cc9a75a59fa07bafa4ad90676af71c4280b4c541294591a1e8e26ff3 CentOS-7-x86_64-GenericCloud-1604.qcow2 +74939ab27ee2c653d7385f5718c820d12168cd4a9267edbaf1e22b3dba57e4d0 CentOS-7-x86_64-GenericCloud-1604.qcow2c +ac832790bee379fe28f814e22f607f01111fff366fe08f81e14f35dd19bcec53 CentOS-7-x86_64-GenericCloud-1604.qcow2.xz +0a314a54be173b75e0c3c54dcd404ee29966a9b045a7dc6e13bda40bc194ab3f CentOS-7-x86_64-GenericCloud-1604.raw.tar.gz +97848cb9fc941a59d901454093d3edececbaa002f853a784de6bcac4189bb861 CentOS-7-x86_64-GenericCloud-1605.qcow2 +7c34eb035f9a95fd4e6a0d833d65841b0467d1617ead2fe32c9394fb7215e1a7 CentOS-7-x86_64-GenericCloud-1605.qcow2c +5c6a56a30041e69fa77810abbc8299b390db08724de56e005136d8895e70ab0f CentOS-7-x86_64-GenericCloud-1605.qcow2.xz +4ac077fcaf51332991b9939cc9a4aaa15776d72f9c9ee592fe416c2a5c4836ab CentOS-7-x86_64-GenericCloud-1605.raw.tar.gz +13c81e28cfa60c8c05cb513caaa48fea62609a0f16abb1af3aebeee38bd0da9a CentOS-7-x86_64-GenericCloud-1606.qcow2 +1ecd1e5f09c530ecc13574f54b05e6a612c450da03ab4bc884804be068b0a06f CentOS-7-x86_64-GenericCloud-1606.qcow2c +2a7450ff9bb100fbfd56dcf6e7cf20a72376c1d8d1e9a619bdac17d843395a96 CentOS-7-x86_64-GenericCloud-1606.qcow2.xz +03a29cbc53f0f5a2cf927c372c4c8d5a7f286b44d0d66a20157da3c0f44e95e8 CentOS-7-x86_64-GenericCloud-1606.raw.tar.gz +9a7002826a916521908c26e913092fe772356cdb5b81e7e73bf60a53c106417c CentOS-7-x86_64-GenericCloud-1607.qcow2 +1b79ff669b74aaededc1ebccef8586016dffd26a62f5e8078a737c0f712e4bc7 CentOS-7-x86_64-GenericCloud-1607.qcow2c +b916fce7d38ad7f837486816cd0885cb965dd78e3645e316a57c2ae6d631d2ab CentOS-7-x86_64-GenericCloud-1607.qcow2.xz +fa2a8bd6813b89aedcab53d3c969f01c1af3889dd49fa843b03422632f5d0d86 CentOS-7-x86_64-GenericCloud-1607.raw.tar.gz +b56ed1a3a489733d3ff91aca2011f8720c0540b9aa27e46dd0b4f575318dd1fa CentOS-7-x86_64-GenericCloud-1608.qcow2 +927b342dde7bd4cc78418d70d4a3f5e8c08af1b4f134100450bdfbd9054b9e21 CentOS-7-x86_64-GenericCloud-1608.qcow2c +bef3975a0ddde9a0ada9e36e80c172c674cb43bfac0977a268a3a7a98d14798d CentOS-7-x86_64-GenericCloud-1608.qcow2.xz +2d0fe07b6b47a5e4faa3cfc508f4e8602e870688364f7601c10001084da51849 CentOS-7-x86_64-GenericCloud-1608.raw.tar.gz +cae2602c81b714d36afbe825e3c02dc6d338843af3af18613ff91779bc50b770 CentOS-7-x86_64-GenericCloud-1611.qcow2 +3bb25432335e289fc900722fb71b0d88bc9d01f4a40b547f90c36846a0937371 CentOS-7-x86_64-GenericCloud-1611.qcow2c +4c1dda1c6b493eb609413cfbc4f1a0306d8e569fe3064e84684b7f941f126412 CentOS-7-x86_64-GenericCloud-1611.qcow2.xz +dfb42dd125325ed6110c6c9b7dbe52368ebc3bf8cd458b635e2c0df0f2f417a3 CentOS-7-x86_64-GenericCloud-1611.raw.tar.gz +559bebb4abb2fdf3bd88c917cc11efb1975bfe4494e666d133a3148ec4e6225d CentOS-7-x86_64-GenericCloud-1612.qcow2 +e12a547bb234fa10f2214270cef85dd2fdf61ef3f48271c4257c17b1c96f6647 CentOS-7-x86_64-GenericCloud-1612.qcow2c +06b1a5982e9efe205803d7e78f25a29875e0704fbffd1530daa5c0626be13905 CentOS-7-x86_64-GenericCloud-1612.qcow2.xz +0b79324e10202ac5516035aff880940acc2a72d4d3a8b34607a83621688d3a81 CentOS-7-x86_64-GenericCloud-1612.raw.tar.gz +62fe56489b7c9cef341f80865b2d6f2a520ebad3fa1e5f486fb0d23d63a69eb4 CentOS-7-x86_64-GenericCloud-1701.qcow2 +8131b4eefa15779f2a8ef3544212e1e5421d03ba0392e9642c8a1190411182ac CentOS-7-x86_64-GenericCloud-1701.qcow2c +e9012a611750b9539f3fbeff20a4d0514798dccc9a15054814ffff5d8aa8a247 CentOS-7-x86_64-GenericCloud-1701.qcow2.xz +c5225a18e479604105ea9390a1486111cf30ed44fdb5b09e15bfed6911d2381b CentOS-7-x86_64-GenericCloud-1701.raw.tar.gz +0cfd71bfbb4dba3097999dcbe1e611d6c3407f1b30936e9a6e437f320dfb7be9 CentOS-7-x86_64-GenericCloud-1702.qcow2 +49c4a308a928b4d80ff8907081d530ef458ba9579bd524f18de1b07eade7fdd2 CentOS-7-x86_64-GenericCloud-1702.qcow2c +94d55e10b8e51bea8efbc8f084e3718a0c0e9e5ebcab6caee203ed76ad412c76 CentOS-7-x86_64-GenericCloud-1702.qcow2.xz +d04910d2c98c2264a5594f4fd410e0ecf587d857c383d5807bc4d61f538e7c10 CentOS-7-x86_64-GenericCloud-1702.raw.tar.gz +36207cdc6663b4688bee49e8e9668cde187ad28f75fdfa88dedd37a69aa6275e CentOS-7-x86_64-Azure-1703.qcow2 +588f897c32fd360a9c1837962bd5efc22332acfeef9b4c4fd398e93d9ab1599a CentOS-7-x86_64-GenericCloud-1703.qcow2 +c3d9283b99ef80a0a4a9ae84dab9123538eadb73397ad6bf0f58f6f61700772a CentOS-7-x86_64-GenericCloud-1703.qcow2c +5fd2096843e368945dd4b97efafed52f4936155ad9bf8d6a97d6448657829540 CentOS-7-x86_64-GenericCloud-1703.qcow2.xz +6f97733d3a8da96db03c4b25dff31dd279db6654d22d75a18fec48e99055aaa4 CentOS-7-x86_64-GenericCloud-1703.raw.tar.gz +4eccdfb24db5cf101f9da4a377803ddb6a6fafa1a34524fe87a118a689e7d3de CentOS-7-x86_64-Azure-1704.qcow2 +5bf5940555350c6cec0d4ec1b7b83b5eaef14849a255676e0ab0514f11674dbd CentOS-7-x86_64-Azure-1704.raw.tar.gz +c4d808e02d716698678385d1a73b02ee0c082f65e94d26e1046e9a303e893b3e CentOS-7-x86_64-GenericCloud-1704.qcow2 +270232aced35fec4b12c0ace8b18c8358959bea58f3eaa04cc638995102da07e CentOS-7-x86_64-GenericCloud-1704.qcow2c +7ddc89f3413215abbe224798ebc04a293ed12b436eed5280c831270eacdf48ce CentOS-7-x86_64-GenericCloud-1704.raw.tar.gz +0c9f67fa2e09b54c388b1f6fed39a388cfd1909a463bab14d6c9be941b9adde3 CentOS-7-x86_64-GenericCloud-1704.qcow2.xz +457172f9e61311e0e4e7a9d697698bf7f7247b4c6ebab508b9a9398914e8812e CentOS-7-x86_64-Azure-1705.qcow2 +fabea65fb2848e34be875dee248cece32cf05a9bdb0f29a6e0583535e82e5e91 CentOS-7-x86_64-GenericCloud-1705.qcow2 +bfca7614fddd14de3658384eaad1f08eae6f06dd4532ea9cae1f0072b8abede7 CentOS-7-x86_64-GenericCloud-1705.qcow2c +eceacf144a3f4e5d0c510120ed76875e61abdaf97e226e94be6e5623bc026a41 CentOS-7-x86_64-GenericCloud-1705.qcow2.xz +b2643300b900c1a1922793248f6477e5009c0846c3305b072f5080fe6326199f CentOS-7-x86_64-GenericCloud-1705.raw.tar.gz +a32675f42775bc077d45c97caa12cf8312cbe1c632c188f56266ecdf0db001ca CentOS-7-x86_64-Azure-1706.qcow2 +8b473bc476bb263ecefea9befd2f9f12a9593bdffb7122872f719c76568fdfb8 CentOS-7-x86_64-GenericCloud-1706.qcow2 +85a0311401f358437601d62e29ee7327b999f27dbfde054f85072efcf3e24763 CentOS-7-x86_64-GenericCloud-1706.qcow2c +ac20b6dd568210dc5a369745ad139397e19a92299db4acb44b595d779618c92e CentOS-7-x86_64-GenericCloud-1706.qcow2.xz +0be942c330744c8844e81b64f1938d0bc96fd1c38989d4035d89b451f88aff76 CentOS-7-x86_64-GenericCloud-1706.raw.tar.gz +c0984328aba0aac9270cf7b11b20dbe54f953bbfe465e678555c0516c042051b CentOS-7-x86_64-Azure-1707.qcow2 +52d358bcbcd7b1c467bccfdb29535241e9121441f26ca3a6befe035b7b5987f1 CentOS-7-x86_64-GenericCloud-1707.qcow2 +8c185ab0dffa5afb26045f2b6d92e6d07abbb057b2ecea79b12e65ff9c3da86f CentOS-7-x86_64-GenericCloud-1707.qcow2c +e139c5b7a799f3f1d48aa897f1b8165c18ef6eeb212cadf138d32537600c6005 CentOS-7-x86_64-GenericCloud-1707.qcow2.xz +2e6977a97bf27178efd0c969745422cd29a2707213af0b78c950e73b93de0389 CentOS-7-x86_64-GenericCloud-1707.raw.tar.gz +a4436a3d0dc52d3492c69c3df29f6e74044a804d631de00ec5127de2b90e9f0c CentOS-7-x86_64-GenericCloud-1708.qcow2 +97ea5a1f8468b1ae1cbded3a88dd69ad1572a2f3765e8ef54bca7ddcdcd9deee CentOS-7-x86_64-GenericCloud-1708.qcow2c +0df197d7d41e83afd676867ca97ac7f9d96d42d338eff67ec18d75f932850f3b CentOS-7-x86_64-GenericCloud-1708.qcow2.xz +a9a6de2ff1598fccd5848ffe53c73e0c86f4350dc3fd096712243049ee5b983a CentOS-7-x86_64-GenericCloud-1708.raw.tar.gz +c19d6fd4bccc9b88f69b2b8dab25e16ef122181908479d75671117ff663787e9 CentOS-7-x86_64-Azure-1710.qcow2 +4b68e18390cf01a4db94cb1ef31ba8bad76a3887c5c7b29a66f0fa36447de866 CentOS-7-x86_64-GenericCloud-1710.qcow2 +76e28dc790c85bd6066753e2570c1b58e42b4cbebfd62c4eb24bb1098357d2b3 CentOS-7-x86_64-GenericCloud-1710.qcow2c +216a7117c7284b70e717ef151b5358f4efbdaf3fa6cfe4c68f23eccb3f1edf58 CentOS-7-x86_64-GenericCloud-1710.qcow2.xz +ba4fadf6728a8a7c8f5ac7252e7174f5ed01c46c9a448732d21f2c66e21e13a0 CentOS-7-x86_64-GenericCloud-1710.raw.tar.gz +ab59cec353e6c2dbb790a62814333d42ccc32b00ed35667a02dd35444574e2ec CentOS-7-x86_64-Azure-1711.qcow2 +d4adbe66209821b510f09ce63a29abbe37e69684678472ff16334103e9bd9e88 CentOS-7-x86_64-GenericCloud-1711.qcow2 +780eeaa1d2c867443ea46155a0a030414ff7cd064879b49e7655ec1858534e58 CentOS-7-x86_64-GenericCloud-1711.qcow2c +9d07d46131da28d326378b30ef3858837a7f3df4c0b82a5cd12c3825eb43594b CentOS-7-x86_64-GenericCloud-1711.qcow2.xz +e84b34d912d38e66fbd09533a72b556b3498a1ba9eb1e852cab4a2a25af177b6 CentOS-7-x86_64-GenericCloud-1711.raw.tar.gz +fb0f10fe4a2e9eaaf2d55153289dcb5ddd08e21bc080f92f2138588731df29d6 CentOS-7-x86_64-GenericCloud-1801-01.qcow2 +268c9ecfede5dac58306035bc69613743247a7f895d9f98de835634511e901a1 CentOS-7-x86_64-GenericCloud-1801-01.qcow2c +b5dc04249b9f1c0ea849b968efe748cf5f3df44c13b70c68308075d9efca3cbd CentOS-7-x86_64-GenericCloud-1801-01.qcow2.xz +4288a7c038066d4686b7d829b30b662b8cc76dd3f380db452e6ac4358d6cbd45 CentOS-7-x86_64-GenericCloud-1801-01.raw.tar.gz +93613cd4fce8a4e5de793e49357853d96ee695f6842eca379d333ed3bc593cbb CentOS-7-x86_64-GenericCloud-1802.qcow2 +701f98e2cdb3d6c5420a9f3a7cbb67e4c501cc0f1b77d7ecf10fdb98f7420cb8 CentOS-7-x86_64-GenericCloud-1802.qcow2c +72fca65f5359fa28d8b214e2bc1dedf7290935817efccc4308002320cc8bce97 CentOS-7-x86_64-GenericCloud-1802.qcow2.xz +6b22f3b61c0ad73d6b1bbb140822c3b976779611e9fc7a0fde0f3774ac8539b1 CentOS-7-x86_64-GenericCloud-1802.raw.tar.gz +d7d720e4c2970a4dade749bf504bf8afe8b638a30c614efc43a6c769c1b5bc46 CentOS-7-x86_64-GenericCloud-1804_02.qcow2 +93fbb78b5b9fa801d7276d9ed2abb382f847e7c4438b495ead65115d8a5b1db3 CentOS-7-x86_64-GenericCloud-1804_02.qcow2c +e6c577e74289158bf87811c83b45c4f0614bd874142ac7721586daf8e809f0fa CentOS-7-x86_64-GenericCloud-1804_02.qcow2.xz +06ddd93b05577565af85ab2b3dabcf7d42f3af1f3fa32a53e3582afc2c995180 CentOS-7-x86_64-GenericCloud-1804_02.raw.tar.gz +ac0a6709f9ce047111d13d51c21ca3d4961b5943ffb7d7479fdddc1fb9608d7a CentOS-7-x86_64-GenericCloud-1805.qcow2 +3b69be275448bcfd443796fb508ca154ea71b29acbbe11f25848d2ece146c78f CentOS-7-x86_64-GenericCloud-1805.qcow2c +b34859272e29ddcc3a1f27a214cef75ba661ec2a28d956cad46cd132b54b00c2 CentOS-7-x86_64-GenericCloud-1805.qcow2.xz +4e0decf64b7a2f95ec27841defc92563e64e7df5e9404f2974dbe49ea8572a63 CentOS-7-x86_64-GenericCloud-1805.raw.tar.gz +0c203efef32602f0dea0f4e06fba4d2100c0ecdde0aa57db2faf41d7567af65c CentOS-7-x86_64-GenericCloud-1808.qcow2 +76459a96945642cfd0ce9948e3e389055496d79c7c2c5194275ee2665a7ce652 CentOS-7-x86_64-GenericCloud-1808.qcow2c +9cc2e9fefb7d8ac8e8a6973c20edb00f12c96614086b1fea5c4f02576be875f6 CentOS-7-x86_64-GenericCloud-1808.qcow2.xz +e366d8f0e52ef7caf8e591dc5ca4e1ad450ca02da5dd92eb8052abdf29e24ed5 CentOS-7-x86_64-GenericCloud-1808.raw.tar.gz +42c062df8a8c36991ec0282009dd52ac488461a3f7ee114fc21a765bfc2671c2 CentOS-7-x86_64-GenericCloud-1809.qcow2 +c1c71ffe8fd1ec45a77033f1fd035ca0c806ed4b89534a52855220cd3c670e4c CentOS-7-x86_64-GenericCloud-1809.qcow2c +f0ea5dd0e9204528e14bebaeff46d1e63fc5232e62d9116d5eab04a533c95479 CentOS-7-x86_64-GenericCloud-1809.qcow2.xz +d7b4debec1edbdda0e5e68d18daf47800fd77a9e3775e43496dbb9e53ff6cbe3 CentOS-7-x86_64-GenericCloud-1809.raw.tar.gz +f80b039d13a5e1ab55f592d27faf806d997bdb4c522611a37f66e6285e99b28c CentOS-7-x86_64-GenericCloud-1811.qcow2 +b9b65baf1178b563cbf9c953ee94afd2145686c8de48fb0cbdffc780bfd71042 CentOS-7-x86_64-GenericCloud-1811.qcow2c +3773d8c53bed6b10a2245dbe804dc86ae38f0c49616f558f77c886b2c91eb66e CentOS-7-x86_64-GenericCloud-1811.qcow2.xz +745b4d99ba5527655a1ec6166bfe4b715ab210955279fcaa14b8dc0a2e2b0e72 CentOS-7-x86_64-GenericCloud-1811.raw.tar.gz +76050d4624210954929d9d7a97a98611619a5fd02067fd7737e26f5a3a5e5333 CentOS-7-x86_64-GenericCloud-1901.qcow2 +4cf51d96c4ff52d63d0465e3871b6b58b58a9733e6d9d6f6917a582123d123b6 CentOS-7-x86_64-GenericCloud-1901.qcow2c +462d2a5b23d78e92b553d67edb77b77755b75cb184babe281228fb3c567be518 CentOS-7-x86_64-GenericCloud-1901.qcow2.xz +244703a4c5c6a6aa72a8f51742cddb2c3d46ee37aaca2481eb9cfc1ba08927ad CentOS-7-x86_64-GenericCloud-1901.raw.tar.gz +b376afdc0150601f15e53516327d9832216e01a300fecfc302066e36e2ac2b39 CentOS-7-x86_64-GenericCloud-1905.qcow2 +59a0f89d1bb48f9ac3aaf1f0a6aefd3eb05f9e345da5ee9f62afe8bad83b0074 CentOS-7-x86_64-GenericCloud-1905.qcow2c +6738c731a723f03b8880d7c4613e75dbe33736145ea89a7d4595450f06507ec2 CentOS-7-x86_64-GenericCloud-1905.qcow2.xz +954f68b517f6b9866a20d5b34630f51f648493631ac24747d3027c5a15b34a7d CentOS-7-x86_64-GenericCloud-1905.raw.tar.gz +ec2b59d62f0bc2b87a5fe01c5cc543cb393180da1f12d4372216ba1f371db2e1 CentOS-7-x86_64-Azure-1907.qcow2 +f0ae12d4ed950cb8ec1260fcec348d319cc522d21bbf0630312005a49bcfd0ef CentOS-7-x86_64-Azure-1907.vhd +520d01c2f2e1ed24cb2f15a4325aa30773930a2961b5484a68cf11b4a415c512 CentOS-7-x86_64-GenericCloud-1907.qcow2 +2e4317beb18262af6b5f283a9b6de75700e35cfdb322ae0e6865f355bc599327 CentOS-7-x86_64-GenericCloud-1907.qcow2c +24d4c4f20f48611f43c1fa420b66e2e552b2e341c318e8e39442df57021e9e7d CentOS-7-x86_64-GenericCloud-1907.qcow2.xz +6cdb62a5f429470df1392df0c09901b05bc45785db70ffcf05a13827430d61ef CentOS-7-x86_64-GenericCloud-1907.raw.tar.gz +1db30c9c272fb37b00111b93dcebff16c278384755bdbe158559e9c240b73b80 CentOS-7-x86_64-GenericCloud-2003.qcow2 +b7555ecf90b24111f2efbc03c1e80f7b38f1e1fc7e1b15d8fee277d1a4575e87 CentOS-7-x86_64-GenericCloud-2003.qcow2c +963866edac9150db8b5c04df9ae80273a11eec6218f114cbb96cb4b53e33803c CentOS-7-x86_64-GenericCloud-2003.qcow2.xz +100e0fd9ffde6259fa9156090bf11258124a6ade8c91ea6f43cb47cca07f7b0e CentOS-7-x86_64-GenericCloud-2003.raw.tar.gz +51c0222aa4bc7d966fc044eb6ce9182993a1dc398eaa595e58abd0d361439baf CentOS-7-aarch64-GenericCloud-2009.qcow2 +f08fde34542218e8750a8655001a31489b0e9fe7ecd15aca28cb121e4e9d7121 CentOS-7-aarch64-GenericCloud-2009.qcow2c +4e8c53386406efea88c3c5d2b0b6df123a3a4cd37dc868921c706a003cc2ae34 CentOS-7-ppc64le-GenericCloud-2009.qcow2 +ec97bb60d0c962a78730ea55f4dbb930a1e3d4a9eb880c4177d0ebd99aa70c18 CentOS-7-ppc64le-GenericCloud-2009.qcow2c +e38bab0475cc6d004d2e17015969c659e5a308111851b0e2715e84646035bdd3 CentOS-7-x86_64-GenericCloud-2009.qcow2 +7ba4513d96591496213a07bbe25e3eb643d61491924c8548a91815b420fd9827 CentOS-7-x86_64-GenericCloud-2009.qcow2c +4c34278cd7ba51e47d864a5cb34301a2ec7853786cb73877f3fe61bb1040edd4 CentOS-7-x86_64-GenericCloud-2111.qcow2 +43a18b9487a28b583c3a034954aaa792b360f0be5556bf758d68e11eb8e2235b CentOS-7-x86_64-GenericCloud-2111.qcow2c +284aab2b23d91318f169ff464bce4d53404a15a0618ceb34562838c59af4adea CentOS-7-x86_64-GenericCloud-2211.qcow2 +8540fcfb73b41d2322644b7c4301b52cb1753c6daf9539866214d725870db673 CentOS-7-x86_64-GenericCloud-2211.qcow2c +284aab2b23d91318f169ff464bce4d53404a15a0618ceb34562838c59af4adea CentOS-7-x86_64-GenericCloud.qcow2 +8540fcfb73b41d2322644b7c4301b52cb1753c6daf9539866214d725870db673 CentOS-7-x86_64-GenericCloud.qcow2c +963866edac9150db8b5c04df9ae80273a11eec6218f114cbb96cb4b53e33803c CentOS-7-x86_64-GenericCloud.qcow2.xz +100e0fd9ffde6259fa9156090bf11258124a6ade8c91ea6f43cb47cca07f7b0e CentOS-7-x86_64-GenericCloud.raw.tar.gz +100e0fd9ffde6259fa9156090bf11258124a6ade8c91ea6f43cb47cca07f7b0e CentOS-7-x86_64-OracleCloud.raw.tar.gz diff --git a/test/unit/fixtures/update/centos_stream9/CHECKSUM b/test/unit/fixtures/update/centos_stream9/CHECKSUM new file mode 100644 index 00000000..c68e054a --- /dev/null +++ b/test/unit/fixtures/update/centos_stream9/CHECKSUM @@ -0,0 +1,192 @@ +# CentOS-Stream-Container-Base-9-20250812.1.x86_64.tar.xz: 40113448 bytes +SHA256 (CentOS-Stream-Container-Base-9-20250812.1.x86_64.tar.xz) = b2cb2219540cac6dc01c03b3b32fab274dc8afd48313b905fc58b3131f8d5b7c +# CentOS-Stream-Container-Base-9-20250930.0.x86_64.tar.xz: 40303796 bytes +SHA256 (CentOS-Stream-Container-Base-9-20250930.0.x86_64.tar.xz) = 39754a19956c705377c65e7644690314278c616a2675f3cb37fd3e40bb30794a +# CentOS-Stream-Container-Base-9-20251027.0.x86_64.tar.xz: 40943336 bytes +SHA256 (CentOS-Stream-Container-Base-9-20251027.0.x86_64.tar.xz) = 041c6de4acb1d5f43a7aa03e2523f6aa8632d729c28e7559204fe87f7c576ad1 +# CentOS-Stream-Container-Base-9-20251124.0.x86_64.tar.xz: 40560552 bytes +SHA256 (CentOS-Stream-Container-Base-9-20251124.0.x86_64.tar.xz) = 46aba0a1a40c205dc8c29b069dd6cff1845462997290684f30aa7e55e8375336 +# CentOS-Stream-Container-Base-9-20260105.0.x86_64.tar.xz: 40519412 bytes +SHA256 (CentOS-Stream-Container-Base-9-20260105.0.x86_64.tar.xz) = b62e38d6f3c5e3b64aea2bbddb8486a73fedf2a299429977c62283c1b3bca85c +# CentOS-Stream-Container-Base-9-20260302.0.x86_64.tar.xz: 40538388 bytes +SHA256 (CentOS-Stream-Container-Base-9-20260302.0.x86_64.tar.xz) = 5f6c31a0c0705e34ff6e3434213829b34bebf597a67e8a8ceacde5dbf1124743 +# CentOS-Stream-Container-Base-9-20260427.0.x86_64.tar.xz: 40530072 bytes +SHA256 (CentOS-Stream-Container-Base-9-20260427.0.x86_64.tar.xz) = 0da85c28bd506fa2556996cc9f11ed9538fdfeafea04fadec659369e4d47b197 +# CentOS-Stream-Container-Base-9-20260526.0.x86_64.tar.xz: 40538640 bytes +SHA256 (CentOS-Stream-Container-Base-9-20260526.0.x86_64.tar.xz) = 29ea172f68ac1ad867db72ff4864c0fef0bab267715b055cb7b43f4bff10b0e8 +# CentOS-Stream-Container-Base-9-20260615.0.x86_64.tar.xz: 40802636 bytes +SHA256 (CentOS-Stream-Container-Base-9-20260615.0.x86_64.tar.xz) = af83c6fa45374ba8ce251f797c932e57ea653d6c1e4b679d4dccd3a4d7199e9c +# CentOS-Stream-Container-Base-9-20260622.0.x86_64.tar.xz: 40447876 bytes +SHA256 (CentOS-Stream-Container-Base-9-20260622.0.x86_64.tar.xz) = 400d715728a695a1a00194e5477b26ef1f9f2567bcde9f6165b24fbf1fe34f52 +# CentOS-Stream-Container-Base-9-20260630.2.x86_64.tar.xz: 40771872 bytes +SHA256 (CentOS-Stream-Container-Base-9-20260630.2.x86_64.tar.xz) = 9775f5e69e3ff8e002c7dd933d54d03586e1ac215fa5e6a146ac4e95417f107c +# CentOS-Stream-Container-Base-9-20260706.0.x86_64.tar.xz: 40356944 bytes +SHA256 (CentOS-Stream-Container-Base-9-20260706.0.x86_64.tar.xz) = dac7f88598e2cc13ef30a224fc16de2ed2a3573169c20272d1849f491437719d +# CentOS-Stream-Container-Base-9-20260714.1.x86_64.tar.xz: 40912424 bytes +SHA256 (CentOS-Stream-Container-Base-9-20260714.1.x86_64.tar.xz) = 6679da0b09581e26bcf023c529892c181aaf0a2d5d30cae82fb87acadbcd064c +# CentOS-Stream-Container-Base-9-latest.x86_64.tar.xz: 40912424 bytes +SHA256 (CentOS-Stream-Container-Base-9-latest.x86_64.tar.xz) = 6679da0b09581e26bcf023c529892c181aaf0a2d5d30cae82fb87acadbcd064c +# CentOS-Stream-Container-Minimal-9-20250812.1.x86_64.tar.xz: 26901388 bytes +SHA256 (CentOS-Stream-Container-Minimal-9-20250812.1.x86_64.tar.xz) = b4642e4df85104290f7b58ab87cb8017aabaaee8521d0a7de76ee5833cbe8b4f +# CentOS-Stream-Container-Minimal-9-20250930.0.x86_64.tar.xz: 27292376 bytes +SHA256 (CentOS-Stream-Container-Minimal-9-20250930.0.x86_64.tar.xz) = 832819bc21432287abd6f3211677711a8f95e5ccdd6195d8259ea16b67149ce2 +# CentOS-Stream-Container-Minimal-9-20251027.0.x86_64.tar.xz: 27009304 bytes +SHA256 (CentOS-Stream-Container-Minimal-9-20251027.0.x86_64.tar.xz) = 436692bfa58cf1774fc287b0a20fb5673dd56965c485ac05196a9e95b106a172 +# CentOS-Stream-Container-Minimal-9-20251124.0.x86_64.tar.xz: 26840384 bytes +SHA256 (CentOS-Stream-Container-Minimal-9-20251124.0.x86_64.tar.xz) = 98e68fc5dcf485340e9f7275fed96f820f48c14c3707f8d06d3b18d454784d11 +# CentOS-Stream-Container-Minimal-9-20260105.0.x86_64.tar.xz: 27376292 bytes +SHA256 (CentOS-Stream-Container-Minimal-9-20260105.0.x86_64.tar.xz) = 092510014ecb983db75c9fe1d8398cac3c0115e2a2a7ec77ab509d597eacbc7e +# CentOS-Stream-Container-Minimal-9-20260302.0.x86_64.tar.xz: 27356924 bytes +SHA256 (CentOS-Stream-Container-Minimal-9-20260302.0.x86_64.tar.xz) = 9bad512c1bfe09366adbfad029d248f6d024bc98b8a52b8f853737fab18bbf76 +# CentOS-Stream-Container-Minimal-9-20260427.0.x86_64.tar.xz: 27224180 bytes +SHA256 (CentOS-Stream-Container-Minimal-9-20260427.0.x86_64.tar.xz) = e115936f5d1de1d46b3ad714ef73585f33f6bd32184490e933d93149f6026c84 +# CentOS-Stream-Container-Minimal-9-20260526.0.x86_64.tar.xz: 26950368 bytes +SHA256 (CentOS-Stream-Container-Minimal-9-20260526.0.x86_64.tar.xz) = b8f29decd764d878f62ce9a90f940fb8e93af60b338d2baeaf23f54cf9f1edc8 +# CentOS-Stream-Container-Minimal-9-20260615.0.x86_64.tar.xz: 27073120 bytes +SHA256 (CentOS-Stream-Container-Minimal-9-20260615.0.x86_64.tar.xz) = 27d14b29892c3bc0fd39d4866ea0b58037ca918236a6c4fb85e61803131ecf5e +# CentOS-Stream-Container-Minimal-9-20260622.0.x86_64.tar.xz: 27364124 bytes +SHA256 (CentOS-Stream-Container-Minimal-9-20260622.0.x86_64.tar.xz) = ed3c217a7d0150c65059046ac7a77975bc5d45947e571d60cfa6df63b008a031 +# CentOS-Stream-Container-Minimal-9-20260630.2.x86_64.tar.xz: 27471744 bytes +SHA256 (CentOS-Stream-Container-Minimal-9-20260630.2.x86_64.tar.xz) = 5604b4cc305482ca4a7b1bc8acd75a559e58e3c1c94da870558e9129a4626ec6 +# CentOS-Stream-Container-Minimal-9-20260706.0.x86_64.tar.xz: 27225848 bytes +SHA256 (CentOS-Stream-Container-Minimal-9-20260706.0.x86_64.tar.xz) = 70ed750fd746b94fc4fc56cfa4c65197f444c9912ed0309c0b7f0cb083b9e6db +# CentOS-Stream-Container-Minimal-9-20260714.1.x86_64.tar.xz: 26972240 bytes +SHA256 (CentOS-Stream-Container-Minimal-9-20260714.1.x86_64.tar.xz) = f9f37af59e1dfb1ea611c173684b8ff12b3580ffe5105d8585eb95e6bbde3e29 +# CentOS-Stream-Container-Minimal-9-latest.x86_64.tar.xz: 26972240 bytes +SHA256 (CentOS-Stream-Container-Minimal-9-latest.x86_64.tar.xz) = f9f37af59e1dfb1ea611c173684b8ff12b3580ffe5105d8585eb95e6bbde3e29 +# CentOS-Stream-ec2-9-20250812.1.x86_64.raw.xz: 1245424252 bytes +SHA256 (CentOS-Stream-ec2-9-20250812.1.x86_64.raw.xz) = 97fbf17e9e4c4ba520465ef409abcb8dc51877527f80b3dac21e9cec04304279 +# CentOS-Stream-ec2-9-20250930.0.x86_64.raw.xz: 1315147568 bytes +SHA256 (CentOS-Stream-ec2-9-20250930.0.x86_64.raw.xz) = 2c450d0beefa7bcdd564798d351539332653dac279406ffcd4961d25c83e1698 +# CentOS-Stream-ec2-9-20251027.0.x86_64.raw.xz: 1236767576 bytes +SHA256 (CentOS-Stream-ec2-9-20251027.0.x86_64.raw.xz) = 2252ae4f2fc492166ebd1ba48873e5fa9198583c9e203827792bf77dd6074ec0 +# CentOS-Stream-ec2-9-20251124.0.x86_64.raw.xz: 1259605072 bytes +SHA256 (CentOS-Stream-ec2-9-20251124.0.x86_64.raw.xz) = c3603622b9acc41229aecebab692453f1c451f15b0daf52c25fe5d78c67ff693 +# CentOS-Stream-ec2-9-20260105.0.x86_64.raw.xz: 1251928988 bytes +SHA256 (CentOS-Stream-ec2-9-20260105.0.x86_64.raw.xz) = 62be7b9e1e386271c9a4ea67a7171bcfe9195b82fe97683ef2b493460e8aab61 +# CentOS-Stream-ec2-9-20260302.0.x86_64.raw.xz: 1940716504 bytes +SHA256 (CentOS-Stream-ec2-9-20260302.0.x86_64.raw.xz) = f6bb53495e4a392a5e687dcc86cbbc98538a6a334b93b46c9c2e5fdb94e74c5e +# CentOS-Stream-ec2-9-20260427.0.x86_64.raw.xz: 1731323500 bytes +SHA256 (CentOS-Stream-ec2-9-20260427.0.x86_64.raw.xz) = e5ae16a2a4bee902ee3cc98d85ae673290d79abaaa2282b5a3ae3b2f2ee3c512 +# CentOS-Stream-ec2-9-20260526.0.x86_64.raw.xz: 1757373124 bytes +SHA256 (CentOS-Stream-ec2-9-20260526.0.x86_64.raw.xz) = 64520f53603c522eb010376d8af676a21e1860649ef32e60479ce4b9a882ec0d +# CentOS-Stream-ec2-9-20260615.0.x86_64.raw.xz: 1976153856 bytes +SHA256 (CentOS-Stream-ec2-9-20260615.0.x86_64.raw.xz) = 2e648c669e161268052de4c7aee4392b9f329e1562db1c47ea8e75211a6bca99 +# CentOS-Stream-ec2-9-20260622.0.x86_64.raw.xz: 1980854844 bytes +SHA256 (CentOS-Stream-ec2-9-20260622.0.x86_64.raw.xz) = 64d4390c7955033f30e9d5f5dfe2952dc70c20be4244ab750dbfa594bb49cf5f +# CentOS-Stream-ec2-9-20260630.2.x86_64.raw.xz: 1772105604 bytes +SHA256 (CentOS-Stream-ec2-9-20260630.2.x86_64.raw.xz) = d84e66cc8181861bbb0c584283a10f58e20e7f30606868eedcf6635c55c7f132 +# CentOS-Stream-ec2-9-20260706.0.x86_64.raw.xz: 1416249912 bytes +SHA256 (CentOS-Stream-ec2-9-20260706.0.x86_64.raw.xz) = 06f9c0da614b37933b356012b7764fadbbbeb1d3a1351fc15e4ec549442a62fc +# CentOS-Stream-ec2-9-20260714.1.x86_64.raw.xz: 1364325820 bytes +SHA256 (CentOS-Stream-ec2-9-20260714.1.x86_64.raw.xz) = 6cb636c264442fb2444c499fd76d1f0339831f8b63848b89fd920c026a88b266 +# CentOS-Stream-ec2-9-latest.x86_64.raw.xz: 1364325820 bytes +SHA256 (CentOS-Stream-ec2-9-latest.x86_64.raw.xz) = 6cb636c264442fb2444c499fd76d1f0339831f8b63848b89fd920c026a88b266 +# CentOS-Stream-GenericCloud-9-20250812.1.x86_64.qcow2: 1426973184 bytes +SHA256 (CentOS-Stream-GenericCloud-9-20250812.1.x86_64.qcow2) = c84a00cfbb580c357ac085a619f9d40d2428944776f55c80063acb80096ab558 +# CentOS-Stream-GenericCloud-9-20250930.0.x86_64.qcow2: 1446111232 bytes +SHA256 (CentOS-Stream-GenericCloud-9-20250930.0.x86_64.qcow2) = 4f6a47fbdf9094573543f05e0b44f58dc89e028c3c987b34690b7b9469294eeb +# CentOS-Stream-GenericCloud-9-20251027.0.x86_64.qcow2: 1436050432 bytes +SHA256 (CentOS-Stream-GenericCloud-9-20251027.0.x86_64.qcow2) = 0b9044a0f13222da5cba65d62f6648e9d4d73b5b129d7326038e1e423c10313a +# CentOS-Stream-GenericCloud-9-20251124.0.x86_64.qcow2: 1460797440 bytes +SHA256 (CentOS-Stream-GenericCloud-9-20251124.0.x86_64.qcow2) = cf709981b10dfe242e60e940dc223ead527b393197ffd08c62633d570f7ab7d0 +# CentOS-Stream-GenericCloud-9-20260105.0.x86_64.qcow2: 1465074688 bytes +SHA256 (CentOS-Stream-GenericCloud-9-20260105.0.x86_64.qcow2) = ab489d7f66d846f65f72250ef91579867264620d90cef9fc137c63e2a782a063 +# CentOS-Stream-GenericCloud-9-20260302.0.x86_64.qcow2: 1882250240 bytes +SHA256 (CentOS-Stream-GenericCloud-9-20260302.0.x86_64.qcow2) = 56fa82a2bb7782398ec1365fe50c2d15d669884eccb0cd44ab9e62e1af8ac06d +# CentOS-Stream-GenericCloud-9-20260526.0.x86_64.qcow2: 1906058240 bytes +SHA256 (CentOS-Stream-GenericCloud-9-20260526.0.x86_64.qcow2) = 0f9f542051447aa428cf9cce9aeba68e345376d761c51cd6b0d644f5fa449830 +# CentOS-Stream-GenericCloud-9-20260615.0.x86_64.qcow2: 1916501504 bytes +SHA256 (CentOS-Stream-GenericCloud-9-20260615.0.x86_64.qcow2) = 13baa70caebd7d5dc6cebe816f3bc8fbe357ce330af4155255c7648c2798ff1c +# CentOS-Stream-GenericCloud-9-20260622.0.x86_64.qcow2: 1898238976 bytes +SHA256 (CentOS-Stream-GenericCloud-9-20260622.0.x86_64.qcow2) = ed8421c7ce25d0e21cbeb561c906f52b2eed2a99aa3df88ec7616773ae1ebd1a +# CentOS-Stream-GenericCloud-9-20260630.2.x86_64.qcow2: 1919638528 bytes +SHA256 (CentOS-Stream-GenericCloud-9-20260630.2.x86_64.qcow2) = 12d7f3dc64a4c5f7739f91e984de3629d143b758da242ae6cf4bb19945cfb347 +# CentOS-Stream-GenericCloud-9-20260706.0.x86_64.qcow2: 1505803776 bytes +SHA256 (CentOS-Stream-GenericCloud-9-20260706.0.x86_64.qcow2) = cf44b19ebac90e66bdcc8084798aa4f114b83ea9f7f4a9454cec8c806ec0e7b3 +# CentOS-Stream-GenericCloud-9-20260714.1.x86_64.qcow2: 1517945856 bytes +SHA256 (CentOS-Stream-GenericCloud-9-20260714.1.x86_64.qcow2) = 2aa1716dc75fc5485df1b221d3d930f276024d70024f68f9ee047dad0e03d85d +# CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2: 1517945856 bytes +SHA256 (CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2) = 2aa1716dc75fc5485df1b221d3d930f276024d70024f68f9ee047dad0e03d85d +# CentOS-Stream-GenericCloud-x86_64-9-20250812.1.x86_64.qcow2: 1571815424 bytes +SHA256 (CentOS-Stream-GenericCloud-x86_64-9-20250812.1.x86_64.qcow2) = 1358744bd5df473eaf38defc80b039add9cf9306f35c14a97e7b122cea925777 +# CentOS-Stream-GenericCloud-x86_64-9-20250930.0.x86_64.qcow2: 1543241728 bytes +SHA256 (CentOS-Stream-GenericCloud-x86_64-9-20250930.0.x86_64.qcow2) = 0653754d2af8079f7c677f47fa5006beb1f727ca036526ac8bf07bf53cd43e47 +# CentOS-Stream-GenericCloud-x86_64-9-20251027.0.x86_64.qcow2: 1568014336 bytes +SHA256 (CentOS-Stream-GenericCloud-x86_64-9-20251027.0.x86_64.qcow2) = eace6f44929907192b05a4370781579461f3b5365795aceb8086f8cf64166586 +# CentOS-Stream-GenericCloud-x86_64-9-20251124.0.x86_64.qcow2: 1673592832 bytes +SHA256 (CentOS-Stream-GenericCloud-x86_64-9-20251124.0.x86_64.qcow2) = 3d2a436a0df5351181b7317f9f3757c0b7246457cb43a7b01791ce51be976093 +# CentOS-Stream-GenericCloud-x86_64-9-20260105.0.x86_64.qcow2: 1564737536 bytes +SHA256 (CentOS-Stream-GenericCloud-x86_64-9-20260105.0.x86_64.qcow2) = 30f7f2075f5fdccf89f38b0df75fa607c1973cc58490e6e68da725d3d52dc0ed +# CentOS-Stream-GenericCloud-x86_64-9-20260302.0.x86_64.qcow2: 2279800832 bytes +SHA256 (CentOS-Stream-GenericCloud-x86_64-9-20260302.0.x86_64.qcow2) = 3a25853e3c88228d4eeab3119c9de9a953cce6abd4b3733b5a246b41020c956f +# CentOS-Stream-GenericCloud-x86_64-9-20260427.0.x86_64.qcow2: 2010710016 bytes +SHA256 (CentOS-Stream-GenericCloud-x86_64-9-20260427.0.x86_64.qcow2) = 7f7800b4943f0887dc0982ebf748b6b9466758b2082e8cf740ca2a33f7c1a865 +# CentOS-Stream-GenericCloud-x86_64-9-20260526.0.x86_64.qcow2: 2002386944 bytes +SHA256 (CentOS-Stream-GenericCloud-x86_64-9-20260526.0.x86_64.qcow2) = 98bdde2291452e428db3b6a344bb4f1534e1e19a692c1c8e827eb1c149a17ae0 +# CentOS-Stream-GenericCloud-x86_64-9-20260615.0.x86_64.qcow2: 1990066176 bytes +SHA256 (CentOS-Stream-GenericCloud-x86_64-9-20260615.0.x86_64.qcow2) = 06f7387f935948335fdf42ba9830484c45607ed6cd0c8b63217d2170b5fdd98e +# CentOS-Stream-GenericCloud-x86_64-9-20260622.0.x86_64.qcow2: 1975975936 bytes +SHA256 (CentOS-Stream-GenericCloud-x86_64-9-20260622.0.x86_64.qcow2) = ead693dbe36589fbc5649c3ad10bd67cde434f4f9a94b4e296f7cd138ab8426c +# CentOS-Stream-GenericCloud-x86_64-9-20260630.2.x86_64.qcow2: 2009924096 bytes +SHA256 (CentOS-Stream-GenericCloud-x86_64-9-20260630.2.x86_64.qcow2) = 742c6e8129dfc05c10392b3474466ba2aa7845acf17962bee2caffc693ffa3da +# CentOS-Stream-GenericCloud-x86_64-9-20260706.0.x86_64.qcow2: 1621884928 bytes +SHA256 (CentOS-Stream-GenericCloud-x86_64-9-20260706.0.x86_64.qcow2) = 4e1d96eb8d54ab4e87513dab696b5766cef3f3eb1249141119e73f9846629bd5 +# CentOS-Stream-GenericCloud-x86_64-9-20260714.1.x86_64.qcow2: 1647575040 bytes +SHA256 (CentOS-Stream-GenericCloud-x86_64-9-20260714.1.x86_64.qcow2) = f3c37dab11b0d4addbddc5a77d4e8906167bcc0cb2c3e0ed9199af6050617bc7 +# CentOS-Stream-GenericCloud-x86_64-9-latest.x86_64.qcow2: 1647575040 bytes +SHA256 (CentOS-Stream-GenericCloud-x86_64-9-latest.x86_64.qcow2) = f3c37dab11b0d4addbddc5a77d4e8906167bcc0cb2c3e0ed9199af6050617bc7 +# CentOS-Stream-Vagrant-9-20250812.1.x86_64.vagrant-libvirt.box: 1090585338 bytes +SHA256 (CentOS-Stream-Vagrant-9-20250812.1.x86_64.vagrant-libvirt.box) = 779771a52a0943a58716eb1e7369330188b9ac6d24753e3651e2c3e4b45e79e0 +# CentOS-Stream-Vagrant-9-20250930.0.x86_64.vagrant-libvirt.box: 1131020080 bytes +SHA256 (CentOS-Stream-Vagrant-9-20250930.0.x86_64.vagrant-libvirt.box) = badd4ad60011b1bf795f3f2d0a636e85b4632b7c1b4b47b0dc53b5e83ae8fd10 +# CentOS-Stream-Vagrant-9-20250930.0.x86_64.vagrant-virtualbox.box: 1147924480 bytes +SHA256 (CentOS-Stream-Vagrant-9-20250930.0.x86_64.vagrant-virtualbox.box) = 3b89d6076891435eafb9aa65ec60e8c9f5c0d69957658d6f0a6edefd4930d8f4 +# CentOS-Stream-Vagrant-9-20251027.0.x86_64.vagrant-libvirt.box: 1138754939 bytes +SHA256 (CentOS-Stream-Vagrant-9-20251027.0.x86_64.vagrant-libvirt.box) = 781344e52cbcd9159cd652502469b992b2123fe593f53bdff8f3212997ac6a3e +# CentOS-Stream-Vagrant-9-20251027.0.x86_64.vagrant-virtualbox.box: 1155891200 bytes +SHA256 (CentOS-Stream-Vagrant-9-20251027.0.x86_64.vagrant-virtualbox.box) = 5ec4499a31927ce3f7b77277ba7eec1f2b92e90d49191e7dd1346e0e22a15539 +# CentOS-Stream-Vagrant-9-20251124.0.x86_64.vagrant-libvirt.box: 1175002248 bytes +SHA256 (CentOS-Stream-Vagrant-9-20251124.0.x86_64.vagrant-libvirt.box) = af3b99ac6404686dcd6876d3bb705c1cb05662e4204a066ae583377faa1da1c9 +# CentOS-Stream-Vagrant-9-20251124.0.x86_64.vagrant-virtualbox.box: 1192366080 bytes +SHA256 (CentOS-Stream-Vagrant-9-20251124.0.x86_64.vagrant-virtualbox.box) = d1aea92e53478592122c1b4d2d740900a973d628bf7220a9ebf6dbdd3842d5b7 +# CentOS-Stream-Vagrant-9-20260105.0.x86_64.vagrant-libvirt.box: 1170825293 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260105.0.x86_64.vagrant-libvirt.box) = 3c43d7c2fc3eb0f3e66f4adf237d04c7e15768645ac6dc93a37e8121b36ffe6a +# CentOS-Stream-Vagrant-9-20260105.0.x86_64.vagrant-virtualbox.box: 1188259840 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260105.0.x86_64.vagrant-virtualbox.box) = d57286a7c1e661ec48373a69f548ea5fe2f03b13deb0ffa45e024b5472ab8ea2 +# CentOS-Stream-Vagrant-9-20260302.0.x86_64.vagrant-libvirt.box: 1186775982 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260302.0.x86_64.vagrant-libvirt.box) = 4db4f898b36377dc1bf25f3fcaec4cfa4bbe2e8cb43b256f23b67725ab04bdbf +# CentOS-Stream-Vagrant-9-20260302.0.x86_64.vagrant-virtualbox.box: 1204326400 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260302.0.x86_64.vagrant-virtualbox.box) = 72f03a93b7f1d8225988fc86c6b81a5cfdaa43a0c4e0f15684230521e84fd9e4 +# CentOS-Stream-Vagrant-9-20260427.0.x86_64.vagrant-libvirt.box: 1177208448 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260427.0.x86_64.vagrant-libvirt.box) = 641d7cfb4c389593aaeabb57d1580b28b93c1a463ef2136f83bee556e5c345a9 +# CentOS-Stream-Vagrant-9-20260427.0.x86_64.vagrant-virtualbox.box: 1194475520 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260427.0.x86_64.vagrant-virtualbox.box) = 915bc1f533a36f42528db8ad61e460ac3e996f9a26429de6dd2b74a97dd17a29 +# CentOS-Stream-Vagrant-9-20260526.0.x86_64.vagrant-libvirt.box: 1202209431 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260526.0.x86_64.vagrant-libvirt.box) = 7f1639d70712079d6c3ddbe899b7deeccb9799e3f8f73f8a19b8a58b726b51e9 +# CentOS-Stream-Vagrant-9-20260526.0.x86_64.vagrant-virtualbox.box: 1219911680 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260526.0.x86_64.vagrant-virtualbox.box) = 5057e63f44a6629c42138c2ef681fdf15ce970f02bf9003bf72c9e4a325bcf1e +# CentOS-Stream-Vagrant-9-20260615.0.x86_64.vagrant-libvirt.box: 1215890518 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260615.0.x86_64.vagrant-libvirt.box) = 991ee927bece39440eeb6f258bc4469e3a9948af431acf489ba4bd7939deb905 +# CentOS-Stream-Vagrant-9-20260615.0.x86_64.vagrant-virtualbox.box: 1233909760 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260615.0.x86_64.vagrant-virtualbox.box) = c7ff718f01e61c9bea5dd7e1b609344b99a6de5b99ae18d0a231c12a99922463 +# CentOS-Stream-Vagrant-9-20260622.0.x86_64.vagrant-libvirt.box: 1199342040 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260622.0.x86_64.vagrant-libvirt.box) = 5d74a5d5d8ac72028e1579b3dccb43ab4b0fbe415ce9e5f288d968c273a8c4ca +# CentOS-Stream-Vagrant-9-20260622.0.x86_64.vagrant-virtualbox.box: 1217167360 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260622.0.x86_64.vagrant-virtualbox.box) = 2a7af9090b3b514ab92c82ecafa34cd7018d46abdc1b5144b512fca63a326109 +# CentOS-Stream-Vagrant-9-20260630.2.x86_64.vagrant-libvirt.box: 1206830142 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260630.2.x86_64.vagrant-libvirt.box) = 1263e5139ed47c6483eef03adc2eeacdd6456ebb39dc18bb8dc7c6ed0ec08553 +# CentOS-Stream-Vagrant-9-20260630.2.x86_64.vagrant-virtualbox.box: 1224192000 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260630.2.x86_64.vagrant-virtualbox.box) = e68c2a0d62f11015beb31f1ccec4d8e071c32d7c735cf64100e3f9a6f7f122c3 +# CentOS-Stream-Vagrant-9-20260706.0.x86_64.vagrant-libvirt.box: 1200675240 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260706.0.x86_64.vagrant-libvirt.box) = ff5145b3137975a27c660c373a26ffb36899f1be339051ca498dbaba2cf17186 +# CentOS-Stream-Vagrant-9-20260706.0.x86_64.vagrant-virtualbox.box: 1218211840 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260706.0.x86_64.vagrant-virtualbox.box) = f13d5211180675277765c493ed0d41ecd7cfc52818277f368c32299892980b5a +# CentOS-Stream-Vagrant-9-20260714.1.x86_64.vagrant-libvirt.box: 1210733603 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260714.1.x86_64.vagrant-libvirt.box) = 6d7d0dce5a1c584644baec8d39c74cac7dc7a2822599c722f00226dbe92f596e +# CentOS-Stream-Vagrant-9-20260714.1.x86_64.vagrant-virtualbox.box: 1228380160 bytes +SHA256 (CentOS-Stream-Vagrant-9-20260714.1.x86_64.vagrant-virtualbox.box) = 8c9192afb9da9390437daa3c4843363c4a7311c55f4b57254860ddb53a96297c +# CentOS-Stream-Vagrant-9-latest.x86_64.vagrant-libvirt.box: 1210733603 bytes +SHA256 (CentOS-Stream-Vagrant-9-latest.x86_64.vagrant-libvirt.box) = 6d7d0dce5a1c584644baec8d39c74cac7dc7a2822599c722f00226dbe92f596e +# CentOS-Stream-Vagrant-9-latest.x86_64.vagrant-virtualbox.box: 1228380160 bytes +SHA256 (CentOS-Stream-Vagrant-9-latest.x86_64.vagrant-virtualbox.box) = 8c9192afb9da9390437daa3c4843363c4a7311c55f4b57254860ddb53a96297c diff --git a/test/unit/fixtures/update/debian13/SHA512SUMS b/test/unit/fixtures/update/debian13/SHA512SUMS new file mode 100644 index 00000000..99bdecd4 --- /dev/null +++ b/test/unit/fixtures/update/debian13/SHA512SUMS @@ -0,0 +1,50 @@ +2e9acba26b23ef40463975a27ae8778e51977bdaa0307faa1f1b649ff4cf89f345730ca01f656362083e5fb50b6f90cba698faa3ba783a37ee0714ea26038f73 debian-13-azure-amd64-daily-20260717-2542.json +0e9f0ca8b307d0fd5860c5ceb084f16af85971bb91d287f68b1e3ded9e07a6c6c6a56bb2b3338098acfa3510baee4376ab05dd940e0dbc8d1465087ad2c6f3a3 debian-13-azure-amd64-daily-20260717-2542.tar.xz +92c8282563dd8ec07d7a0206bbd956f8ddc86f30e87ae71c4961184cbd9b1cacc037939f128353a4d51509c008981e2bf35ba682c776f1995c1578b23289d8b2 debian-13-azure-arm64-daily-20260717-2542.json +3f439cc293ba77d88aacd4d70c7709c4448b57d06128a5a6b75d0ac36cb398f7c51802ef94efde7691d3d357105f7857033896d8bb57838e239f473bc1fa2569 debian-13-azure-arm64-daily-20260717-2542.tar.xz +59799cdf1b4128d410a3cb574e287a3acf44a406af03e856b3bf62a2f49f6311e505888c1361acbea3a9404f0731655745172a54a1170c3771eb86a2caab4978 debian-13-ec2-amd64-daily-20260717-2542.json +5e5f1aec7bd911d6084f8e27204bca75fcfa55f7a5d563083fbb85ecfaf4e816ea696aef92cf322ace42be65a828ac35ef1409fa90ebdf2faa1b696723727333 debian-13-ec2-amd64-daily-20260717-2542.tar.xz +ef7b5b333a3ed58523fa6a107a9e4a545cc2474b7c9960c8b8078861e83d7cff877d637b7284f686b8f201f476742d85043ea33a4d6aecba32664d0efbb4db02 debian-13-ec2-arm64-daily-20260717-2542.json +7fb1c646d4dd3b1670f09cc984868b42f0cd6923bafe2d4541a15867da4f876bc02e0952f73e1f5fed1cbcf44bcd98907a0cf4053d9ef95585afe7e898a9a640 debian-13-ec2-arm64-daily-20260717-2542.tar.xz +2fb74486817134cb3e40aba5819a3819f1347edb9b6c596e5623136662b5a261f3db92f69edd11211a884696d00dcd17db63d041628ab81040a267172af79a2e debian-13-generic-amd64-daily-20260717-2542.json +173a4616cc243dad4208a4f0452396ca02322f96c8589c3a1544a90f845515c781c5800841e436627c669ce917c645d1b0e717c24960bcb9aaaac7adfbe1291f debian-13-generic-amd64-daily-20260717-2542.qcow2 +cd4eb05e757600c382871406685eb32919d789051815fe3a6f449d8578b65108f577dd4abdb1ef1d98ab13464784958d1bfd9ac681b231c8e5d498cde3dedb06 debian-13-generic-amd64-daily-20260717-2542.raw +84ede834769954219289afcf1fbf8487b6d8ff97174bdccb8a835b31452a82c8800f8253494d35a04c048685ce93d9f96f12e162865ffe5d6731a9b75c3b8722 debian-13-generic-amd64-daily-20260717-2542.tar.xz +7d37f059b70caa2775f897365b97cb60175761876d62dffebd0502770567daefec0cf1bd59c29ff24f71eb7c977ca14e7f76dd257f0ef21d7b34fde293848e01 debian-13-generic-arm64-daily-20260717-2542.json +3d50a6e108d69fea05bb8b0d22450e5c1797fd644b1661c0d3b0fe63afd95d309b0eec2ad0586f7f51e945314c92fd6e2140aa14697822ef09dccd8325ef87d1 debian-13-generic-arm64-daily-20260717-2542.qcow2 +d5c00a53ed39c5fe03ad61bb8a1359e1de0bac0fb857be9ff4d3acd9fbcc5e3f3e93ef1b0116d9bc8abea0a7f3b0b6d08991586e662685b06a59fababe7f7e20 debian-13-generic-arm64-daily-20260717-2542.raw +f2077e0f9d5ab7216b7757440f3ba1b34c6807a8e45997fb107c19e6ac21b42a92890a3badf60547c437cc4343dfa3457e985c1d8549a39cbb4befeb84c5e0a9 debian-13-generic-arm64-daily-20260717-2542.tar.xz +4990cbcb2f7990b25de4c67a3d66d193af18e12450d69a1460de599eb8845d581c786c3ab275247872f09d500e38560d0f84e1d110299bbae2756a0433a01cbe debian-13-generic-ppc64el-daily-20260717-2542.json +2ecc3c5aa0ae5a5774a9ba90f90d433771a1c4b813d1505f06db30c93816b2254e17f1f8f45b517acd31bdf98b13552ecb2ae7a9384e9d5afd824c23e738a13c debian-13-generic-ppc64el-daily-20260717-2542.qcow2 +a3059895092b2ffda11050b8a16dcc22e5a9a4edc510168df64d322852d9b8991c88dba4c1026bfbf86dc6ba973d1768014b37f967508f1f9cf6ef81f5bfe4ce debian-13-generic-ppc64el-daily-20260717-2542.raw +c3f17585447ece974c59e050229da5042043ea4e5193e7fd9939c3f3e57b39c794724a33c063704bbd5ca44edca3777e1c964f35180ff54a7f029cd7bf29206c debian-13-generic-ppc64el-daily-20260717-2542.tar.xz +5b66eb134c4317324e8e8b779e0af97ddf7af4453f8a74b44c15e9fe991472a5b09c0da5eda682277c9cf8fef9fc20f93986f6eeda7bfbf7d504a3ebd330eb07 debian-13-generic-riscv64-daily-20260717-2542.json +2632bc6db29e8fdd84595178aa208d2d1e946dd72a8556d0b900ebf1a4080ad41f4124e61c573239189382a08d67279c685e307ce3d25ae75e70b01ae73b13fa debian-13-generic-riscv64-daily-20260717-2542.qcow2 +b431eea9a8ad82a649848e3b06350e11bcf408b943b90cb5d65e88fd65e5a2565becdaa29da6fc4ce32941a784fdbc1dc3e2f6c60c47baeb8f73cd36acb470aa debian-13-generic-riscv64-daily-20260717-2542.raw +ea391457ca4b2109448b8182a9e85fcd4d863d45f29371727050400acf072ee1dfcd911d403a161db29fa98aff34386035b5a80fdce290e8316300b5c374cfea debian-13-generic-riscv64-daily-20260717-2542.tar.xz +91fb969f4d18c6e8c011c9103d18250517686aede9d091508df011388f5b4b7b7f07b4f6c9c7c041db1a674c9aefd5b5469c2c7001d5e1c6b8510f610f0d61ce debian-13-genericcloud-amd64-daily-20260717-2542.json +fcc52bdff35697583f9331b64c688db6681fea98c024a1db185d8857b167f4e1838ead7037f18c12e432229354b1253f29e881a040ce0f5636801576e715b4b8 debian-13-genericcloud-amd64-daily-20260717-2542.qcow2 +b3bfb13e64270edf354e39ea2f849cf4ccefc060f9f1e364ae752394a27c01cd81737758eccdbb2cd2ade0062754363b66a33701ed94e2f0150501045e0ecacc debian-13-genericcloud-amd64-daily-20260717-2542.raw +3e94a2c94e1cb68a8f818a99fc222efd5a723fa9d55b028b730900851e3bb7588934729dbc90745ec384dc6247a00816f2fff1b8cc0c2af8b13a6c7ec6fc5c2a debian-13-genericcloud-amd64-daily-20260717-2542.tar.xz +eb9d8dc866c51a10c1edc3150f28f05a60375cdf34e60ac253c5bdb4a51d55a7295840c5dcbe3fe16014b596735b8f1fc28e05ca508999f48b722a5f175b4b4b debian-13-genericcloud-arm64-daily-20260717-2542.json +d8db63dd8e7c1e70452d4367411e5025d48276926000978604ca8db31dd58c20f3500ce91e4436c96fdc35b3e0c3547a32cd36ca5eddd1244b330bfdf8180723 debian-13-genericcloud-arm64-daily-20260717-2542.qcow2 +974e444a48614b74897252acf1839227c868d11f1e540ac7903df7fb513556211886971a90e913fdd5044334d84f64ba43dbcb632233cc508f01fd6fa7d084f7 debian-13-genericcloud-arm64-daily-20260717-2542.raw +a60d70fc1cb5fe2407de67f1028f88ece8179fbfa847987044e4c3cea3002ca1cdeb18cf3c21ee6bccbeeb65f2c59fe788c74d59dfb2b3b3118874839adcacbb debian-13-genericcloud-arm64-daily-20260717-2542.tar.xz +30909e4087c95275349a88e8ab6d080f54c9e6ff03d3605213580f4a0bad4466c22d68380c0aa6fed1d2ecfb0209ac96f6c116c47adc64adacb75e49f91f3c63 debian-13-nocloud-amd64-daily-20260717-2542.json +d86c887c810fe77c3025528cf9efd8e3419cd60140fda8d60cc1700812c90b024b8be9695ffbbc94c05802f42b85e53c4109f2cf5c7ad6d25e2f6e5022805c87 debian-13-nocloud-amd64-daily-20260717-2542.qcow2 +5f2d45f3de8f57d03d686f4498fe57412fb74d84569d684ec6fe5fcd134788078c1df5d9803280fe0845bc58466813578a7cb73360bc9f45536d287c3924f7b8 debian-13-nocloud-amd64-daily-20260717-2542.raw +45e4d9e9e9fdee2c8764ec714f29522daf11ff6388d39b711efaa914e1cd44942ac1e31ac2f4b9479e4993f3612ac7e2069b3153add0ac8fc126ad6fff4ca984 debian-13-nocloud-amd64-daily-20260717-2542.tar.xz +ad806a3e9f323e1b5b9b1dbff3a177b629dfba70bc5c8bab86ec83abf455d8d71b0f4273d201d5c121abc92827e901f1a4a742b1be8451c860d5a13aa6f2bc83 debian-13-nocloud-arm64-daily-20260717-2542.json +870a9cef6ee56b3321f69cafe990b5677490812e343b49347c87614b06a6f2acb7052ae8467fb0a29c112be2b13ccfbd0615bb9d538f1fb6931934d8fba0552d debian-13-nocloud-arm64-daily-20260717-2542.qcow2 +54e537cc57033da67d70ccfdb572f9413aaebc145325d5d3deaac501ca8d4a44d0b6e7f89591e564fcda7c8f371a8318017e53cc192d7294a78b82bd6279170b debian-13-nocloud-arm64-daily-20260717-2542.raw +92b325483f1d40432feabf8e989e5774b55ca671ab8edbca1fd00972cf5b8c1e624fd7bcf2f4d5cb678354c1eb1f046d00a6ca71c64304793ceea6807ce7e5fd debian-13-nocloud-arm64-daily-20260717-2542.tar.xz +89682a057561e922e4154bfe4fc6e391f4d51d4137c0c341bed7944f3afe012641e4e5a1c4f6defec4dbe09914317c7a839f0951bc6ce4071a6aeab3f16f2114 debian-13-nocloud-ppc64el-daily-20260717-2542.json +9246e151424d49955ff00b3c6104fc7841c9fbee980f1f8a046d9b192bcf050a0da2e90993c9fffec8a8be1dac96c14c38ca6bb1cf15ec19e6eb7d1d145abdd1 debian-13-nocloud-ppc64el-daily-20260717-2542.qcow2 +9825da19add622a9b1698913836bcc54d221191a891453c9c7c18d8c7df880603c9fa0eb0989060e6e99594c2aec32264cc7edf297d3a313b8f8ac72cfba5b93 debian-13-nocloud-ppc64el-daily-20260717-2542.raw +a6d5cba0c9bc5bbf37dcd7568de0112341cdd016fe3e47ab808321e9f45176fbd4dd32ea7237f032c13f8dc3a54d160fc2792f1a01346e8ab1b697fe1551e6dd debian-13-nocloud-ppc64el-daily-20260717-2542.tar.xz +ee544fc41f141be73f997f11bb9d10a02dca0d4b22046420d1dec0c5a91bdf0881a9dee939a3c84832c16f454149d3b44270a6a22f7906dc5cf26c1dd646af8c debian-13-nocloud-riscv64-daily-20260717-2542.json +a978bf7ac955a5b65e0fa5b0d22ab8211ef3bd8b4fcfaa00beb86eb322a20931e1cd08d56e924c56a88a5b0d8b0690db92cbac32da56eb25ed0fcd78c3929075 debian-13-nocloud-riscv64-daily-20260717-2542.qcow2 +db56e9973ca22d973319868758de1f662d9b789d9978a9ee8445cd53e7073d52ec15718e6dd313ebf649fc006698c2094b853b61e6af69698249ee19f2abe07c debian-13-nocloud-riscv64-daily-20260717-2542.raw +0292be398ef876736e564e09cfb769ccd6a03907ebc747a42ebeae933c4e07e3dfeafef379d4a5b9ff2e39d5e7014c42cc7549a73bd0beaae4b462c2c1375720 debian-13-nocloud-riscv64-daily-20260717-2542.tar.xz +7285089cb251898c2bf08384b43648f2b2eff0629f771db2427b10a4b72372fdd25ee5afa0c57b2c32127b73527e0011fde2a958aa6b37b599dbe558b63f6567 debian-13-raspi-arm64-daily-20260717-2542.json +1fd6f3025c7223eb6c067e2c049a351e0370af84e8217ae65f1e56dfb60d83945d3dda56815c7b9f1acaea0417553e3b3e463142345f5d5fc2dfa9465c2499b6 debian-13-raspi-arm64-daily-20260717-2542.tar.xz diff --git a/test/unit/fixtures/update/debian13/index.html b/test/unit/fixtures/update/debian13/index.html new file mode 100644 index 00000000..31b9741c --- /dev/null +++ b/test/unit/fixtures/update/debian13/index.html @@ -0,0 +1,129 @@ + + + + Index of /cdimage/cloud/trixie/daily + + + +

Index of /cdimage/cloud/trixie/daily

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[ICO]NameLast modifiedSize

[PARENTDIR]Parent Directory  -
[DIR]20260319-2421/2026-03-19 08:51 -
[DIR]20260320-2422/2026-03-20 07:53 -
[DIR]20260321-2423/2026-03-21 08:17 -
[DIR]20260322-2424/2026-03-22 07:55 -
[DIR]20260323-2425/2026-03-23 08:38 -
[DIR]20260324-2426/2026-03-24 08:21 -
[DIR]20260325-2427/2026-03-25 07:59 -
[DIR]20260326-2428/2026-03-26 08:38 -
[DIR]20260327-2429/2026-03-27 07:58 -
[DIR]20260328-2430/2026-03-28 08:22 -
[DIR]20260329-2431/2026-03-29 09:21 -
[DIR]20260330-2432/2026-03-30 08:56 -
[DIR]20260331-2433/2026-03-31 09:42 -
[DIR]20260401-2434/2026-04-01 09:35 -
[DIR]20260402-2435/2026-04-02 09:01 -
[DIR]20260403-2436/2026-04-03 09:06 -
[DIR]20260404-2437/2026-04-04 15:33 -
[DIR]20260405-2438/2026-04-05 08:59 -
[DIR]20260406-2439/2026-04-06 09:06 -
[DIR]20260407-2440/2026-04-07 09:18 -
[DIR]20260408-2441/2026-04-08 09:18 -
[DIR]20260409-2442/2026-04-09 08:53 -
[DIR]20260412-2446/2026-04-13 01:18 -
[DIR]20260413-2447/2026-04-13 09:05 -
[DIR]20260414-2448/2026-04-14 09:23 -
[DIR]20260415-2449/2026-04-15 08:59 -
[DIR]20260416-2450/2026-04-16 09:21 -
[DIR]20260417-2451/2026-04-17 09:22 -
[DIR]20260418-2452/2026-04-18 08:56 -
[DIR]20260419-2453/2026-04-19 09:21 -
[DIR]20260420-2454/2026-04-20 09:00 -
[DIR]20260421-2455/2026-04-21 08:56 -
[DIR]20260422-2456/2026-04-22 09:17 -
[DIR]20260423-2457/2026-04-23 09:37 -
[DIR]20260424-2458/2026-04-24 08:52 -
[DIR]20260426-2460/2026-04-26 09:16 -
[DIR]20260427-2461/2026-04-27 08:58 -
[DIR]20260428-2462/2026-04-28 15:59 -
[DIR]20260429-2463/2026-04-29 09:00 -
[DIR]20260430-2464/2026-04-30 09:25 -
[DIR]20260501-2465/2026-05-01 15:06 -
[DIR]20260502-2466/2026-05-02 09:21 -
[DIR]20260503-2467/2026-05-03 08:54 -
[DIR]20260504-2468/2026-05-04 09:17 -
[DIR]20260505-2469/2026-05-05 16:05 -
[DIR]20260506-2470/2026-05-06 08:57 -
[DIR]20260507-2471/2026-05-07 09:37 -
[DIR]20260508-2472/2026-05-08 09:48 -
[DIR]20260509-2473/2026-05-09 15:20 -
[DIR]20260510-2474/2026-05-10 08:59 -
[DIR]20260512-2476/2026-05-12 16:44 -
[DIR]20260513-2477/2026-05-13 20:10 -
[DIR]20260514-2478/2026-05-14 09:00 -
[DIR]20260515-2479/2026-05-15 09:23 -
[DIR]20260516-2480/2026-05-16 09:02 -
[DIR]20260518-2482/2026-05-18 09:03 -
[DIR]20260519-2483/2026-05-19 09:37 -
[DIR]20260520-2484/2026-05-20 08:54 -
[DIR]20260521-2485/2026-05-21 08:51 -
[DIR]20260522-2486/2026-05-22 09:37 -
[DIR]20260524-2488/2026-05-24 08:56 -
[DIR]20260525-2489/2026-05-25 09:41 -
[DIR]20260526-2490/2026-05-26 08:53 -
[DIR]20260527-2491/2026-05-27 15:39 -
[DIR]20260528-2492/2026-05-28 08:56 -
[DIR]20260529-2493/2026-05-29 09:47 -
[DIR]20260530-2494/2026-05-30 09:06 -
[DIR]20260601-2496/2026-06-01 08:56 -
[DIR]20260602-2497/2026-06-02 09:19 -
[DIR]20260603-2498/2026-06-03 09:22 -
[DIR]20260604-2499/2026-06-04 09:25 -
[DIR]20260605-2500/2026-06-05 08:44 -
[DIR]20260606-2501/2026-06-06 09:01 -
[DIR]20260607-2502/2026-06-07 08:54 -
[DIR]20260608-2503/2026-06-08 09:31 -
[DIR]20260609-2504/2026-06-09 09:19 -
[DIR]20260611-2506/2026-06-11 09:28 -
[DIR]20260612-2507/2026-06-12 09:24 -
[DIR]20260613-2508/2026-06-13 09:11 -
[DIR]20260614-2509/2026-06-14 09:13 -
[DIR]20260615-2510/2026-06-15 09:13 -
[DIR]20260616-2511/2026-06-16 09:26 -
[DIR]20260617-2512/2026-06-17 08:50 -
[DIR]20260618-2513/2026-06-18 09:27 -
[DIR]20260619-2514/2026-06-19 09:26 -
[DIR]20260620-2515/2026-06-20 09:31 -
[DIR]20260621-2516/2026-06-21 09:24 -
[DIR]20260622-2517/2026-06-22 09:40 -
[DIR]20260623-2518/2026-06-23 09:24 -
[DIR]20260624-2519/2026-06-24 09:10 -
[DIR]20260625-2520/2026-06-25 09:16 -
[DIR]20260626-2521/2026-06-26 08:42 -
[DIR]20260627-2522/2026-06-27 09:21 -
[DIR]20260628-2523/2026-06-28 08:47 -
[DIR]20260629-2524/2026-06-29 09:17 -
[DIR]20260630-2525/2026-06-30 10:24 -
[DIR]20260701-2526/2026-07-01 09:00 -
[DIR]20260702-2527/2026-07-02 09:00 -
[DIR]20260703-2528/2026-07-03 09:01 -
[DIR]20260704-2529/2026-07-04 15:04 -
[DIR]20260705-2530/2026-07-05 09:02 -
[DIR]20260706-2531/2026-07-06 08:46 -
[DIR]20260707-2532/2026-07-07 08:57 -
[DIR]20260709-2534/2026-07-09 09:26 -
[DIR]20260710-2535/2026-07-10 08:45 -
[DIR]20260711-2536/2026-07-11 09:21 -
[DIR]20260712-2537/2026-07-12 08:47 -
[DIR]20260713-2538/2026-07-13 09:17 -
[DIR]20260714-2539/2026-07-14 15:27 -
[DIR]20260715-2540/2026-07-15 09:19 -
[DIR]20260716-2541/2026-07-16 09:14 -
[DIR]20260717-2542/2026-07-17 08:42 -
[TXT]latest/2026-07-17 08:42 -

+
Apache/2.4.68 (Unix) Server at cdimage.debian.org Port 443
+ diff --git a/test/unit/fixtures/update/rocky9/CHECKSUM b/test/unit/fixtures/update/rocky9/CHECKSUM new file mode 100644 index 00000000..f0652920 --- /dev/null +++ b/test/unit/fixtures/update/rocky9/CHECKSUM @@ -0,0 +1,2 @@ +# Rocky-9-GenericCloud.latest.x86_64.qcow2: 645988352 bytes +SHA256 (Rocky-9-GenericCloud.latest.x86_64.qcow2) = 92c206cc6f790c61583247eefe87890f8828420662c17cacf247cec78ab4eec8 diff --git a/test/unit/fixtures/update/ubuntu2404/SHA256SUMS b/test/unit/fixtures/update/ubuntu2404/SHA256SUMS new file mode 100644 index 00000000..30b0c4d5 --- /dev/null +++ b/test/unit/fixtures/update/ubuntu2404/SHA256SUMS @@ -0,0 +1,66 @@ +040fcfc55b599c6757d20da92dc65e24481bbcdfd568fe9c6043b5e378540a1c *noble-server-cloudimg-ppc64el.squashfs +05b7b5bb6172e5b0dd1248d5598c1bc27927c4625ba4c09c0442d4751725c43f *noble-server-cloudimg-amd64-azure.vhd.tar.gz +0bc3597f234955049afeeb0a6d33bfed057a6e24dcbd16dc50302ec13c388837 *noble-server-cloudimg-riscv64.daily.20260615.20260705.image_changelog.json +128d931b5f656754bade9db1716e2063fbf51e2027739c74fb9c219842844570 *noble-server-cloudimg-riscv64.squashfs +1ccb9b8a50538fe43661c46405e971efbba0c59d4d36578ab1ba65b9783e8b09 *noble-server-cloudimg-amd64-root.tar.xz +1f7692f0588933ac2b4067da6d8f1bdd04378f6bbb4a7986bc713cdf6f2cf501 *noble-server-cloudimg-armhf-root.tar.xz +238863b7e08fa8543b063a5ac15dafd1fc94bfaac36feca35e9b4198de064662 *noble-server-cloudimg-arm64-azure.vhd.tar.gz +2be087ba1bb2aabf46097533c0b89d86a6297a08180ec6fb89c40f8c352662ac *noble-server-cloudimg-s390x.squashfs +2d9b9d235f92958d0d5602096ca1acacb9414e9480b78dd1cde3c74cde2fa096 *noble-server-cloudimg-s390x.tar.gz +2fc6ee84f265838d4a4120c3f4f643b008bf0db0e9a59b8671f8b2bc90567683 *noble-server-cloudimg-amd64.tar.gz +3c9f15e559a0be7d3ce8adf61b1b2d44b8ec31a04d44dca4bf89e60d8cae54ab *noble-server-cloudimg-riscv64-root.manifest +3c9f15e559a0be7d3ce8adf61b1b2d44b8ec31a04d44dca4bf89e60d8cae54ab *noble-server-cloudimg-riscv64.squashfs.manifest +3ed9d649ae7f79e7efd73f5c5f13e1e2bf3355dfa1a9b2106f468dce08b35b10 *noble-server-cloudimg-ppc64el.release.20260615.20260705.image_changelog.json +3ee4ccaec38fc95a5fbafe09c7532fa2f0fcab2e0ce3bcd56114bcfa6b58a45a *noble-server-cloudimg-riscv64.release.20260615.20260705.image_changelog.json +3fd73a3cde12636b59cf0aa3485f05452ef6a068d91a03268b04f3f614e453ae *noble-server-cloudimg-arm64.tar.gz +4357287a2b8959a2424d63186f998006ade29c230e76760cbd46e2a1f02dfff1 *noble-server-cloudimg-ppc64el.manifest +48f423cdbda0fc72d554b15f981f548ca4dbb3896cdc89db9afe709b9b4a9a34 *noble-server-cloudimg-ppc64el.img +4b32f662a5446dd8ae03ff9b432cd1942c9b5817baa70c18ef5de1b1529e8ecb *noble-server-cloudimg-ppc64el-root.manifest +4b32f662a5446dd8ae03ff9b432cd1942c9b5817baa70c18ef5de1b1529e8ecb *noble-server-cloudimg-ppc64el.squashfs.manifest +4fa02fa278554315b03e02c8295cebcd3d662baa165745e3c4fa053ff93541f2 *noble-server-cloudimg-ppc64el-root.tar.xz +5139cc343e1f9673b13991bfd7836d9b24b9b3d8fcc9cf13ea171cf994efc670 *noble-server-cloudimg-ppc64el.daily.20260615.20260705.image_changelog.json +519b5b213270d78375361ec9d3cb9aeb8ce0002499918677ac9758f4a3432ac5 *noble-server-cloudimg-amd64.release.20260615.20260705.image_changelog.json +519b5b213270d78375361ec9d3cb9aeb8ce0002499918677ac9758f4a3432ac5 *noble-server-cloudimg-arm64.release.20260615.20260705.image_changelog.json +53173a68c120a87f4e957218c76b48bb88e85dfa04096a6a260ef70cf231bf60 *noble-server-cloudimg-riscv64.manifest +543973b1e306051ca81fb1220a009a96672843d785f9e02905d104e812c4d5b6 *noble-server-cloudimg-s390x.manifest +5885b12a078958d4cdd705ff47b9710c77c63087f43d691c8ffad85706dfc850 *noble-server-cloudimg-s390x.release.20260615.20260705.image_changelog.json +589fe9ae397168965fa2d2fb7cd8736f5caabe83e184b1e1c00c4c0ae03f7dc5 *noble-server-cloudimg-amd64.manifest +5de5f476bd7f244896adaa399d735d625f9a49365d206e8fdf81affde1e67154 *noble-server-cloudimg-amd64.vmdk +61caa0b525f17e70006dfd864bd4bdea296373a7e98e6da2b5acea1969e3f888 *noble-server-cloudimg-amd64-lxd.tar.xz +6644957bc19a3f5f90e3e58782a39519ad0e502c98fe51ac10ef50a5d78188f7 *noble-server-cloudimg-ppc64el.tar.gz +679dd5e3df555d3d7f4ac68c4430cb319c811c8d63bdae090b4f2e5ed568ef42 *noble-server-cloudimg-amd64-azure.vhd.manifest +68aaf3db24cb3dbace0ad2365430b72f3a1fe0f10f57046cd508a84fcf2d0e33 *noble-server-cloudimg-s390x-lxd.tar.xz +6ab9a971f855155a466b267c1ec3ebdd0d93ee198fb115c00f9dd78a2ac10dea *noble-server-cloudimg-arm64-root.tar.xz +75b910819a1ba679afdf0f7878d7722d49a918286308687280785a850fa68bd5 *noble-server-cloudimg-armhf.img +77563226fcd9a33043e9752b95ae176e37e56c6edec569064c337bac31636a0a *noble-server-cloudimg-riscv64-lxd.tar.xz +7bbb922d9a87ef0dfe592dff72bfbfb64b07a74288794b79319688210968712d *noble-server-cloudimg-armhf.daily.20260615.20260705.image_changelog.json +7df0201546f75b8bcc1044594c806c35749421ad3c9bc1be2a3ab806cfae39cc *noble-server-cloudimg-arm64.img +7ed8005503e0bf1c225371866faae56e6b7e0d5c12471961042ab1cc2a1ffb4b *noble-server-cloudimg-armhf-root.manifest +7ed8005503e0bf1c225371866faae56e6b7e0d5c12471961042ab1cc2a1ffb4b *noble-server-cloudimg-armhf.squashfs.manifest +8802b456a099a29828bc33335e2468db49dad25f4ffe68ba622fa8019bccde9b *noble-server-cloudimg-s390x-root.tar.xz +8d97e6d76f4c5869d718e199bea4efacb65aff9855c83bdd333e9d5979f6449c *noble-server-cloudimg-riscv64-root.tar.xz +9200b3353161ede79540dbad1c863a92579af455572942a28b2598dd48043f89 *noble-server-cloudimg-armhf-lxd.tar.xz +93dfa9b2b3b3cd51686af977609623d5b69ca8893cddfe7de7e58b53f426103b *noble-server-cloudimg-arm64.squashfs +a1ca4b8b436763053a5300dd47856fd00905abc2919eaa4581ce209180a87fd4 *noble-server-cloudimg-arm64-lxd.tar.xz +a8b4ef57feedc7b2dffc83bd5869aff8218005020b9d22893b7a0cd0dd55a1f2 *noble-server-cloudimg-arm64-azure.vhd.manifest +a9fe49af328c9ec1340cd4e5a68b9fb8d0e279eaea1032404a0b6b4e8df69343 *noble-server-cloudimg-amd64.squashfs +aa3064f9ee1c1b56feebb679367ebc00f3dab2152666ebf0d856240b0ed25577 *noble-server-cloudimg-arm64.manifest +ac72c576d097fec769a2cb1b5371169fe60060536257869e229717d7092c01c6 *noble-server-cloudimg-riscv64.tar.gz +aebe59fb4b993f9042c535b1720d630287f2edf9da57cee22e7c17f46f54f508 *noble-server-cloudimg-s390x-root.manifest +aebe59fb4b993f9042c535b1720d630287f2edf9da57cee22e7c17f46f54f508 *noble-server-cloudimg-s390x.squashfs.manifest +b3820f0ea2d1bbe7c0ca18af19da25faa49ad4e45872bdc8631a95dec17a806c *noble-server-cloudimg-riscv64.img +c38443ae965878c25fec3652d1b285a33e618e862d2f958059de2799299727ee *noble-server-cloudimg-armhf.manifest +d35cceec0d95a4003dcd191a861784fe68978e9c7f5040d6aa45cf0e6bbbcee6 *noble-server-cloudimg-s390x.img +d5af5b4371e40f6dcf004f6a5ba3b63f9744c96d4c7a128930fe64d85c06fcbc *noble-server-cloudimg-armhf.squashfs +d651ac8166762afeba69560651f9d10a867418f3ecf8cb2d9059ca899ba83c19 *noble-server-cloudimg-s390x.daily.20260615.20260705.image_changelog.json +d788e5c564a9641fe048b1728fc5065181c99defe76491069b8f9c43b5c6a97c *noble-server-cloudimg-armhf.release.20260615.20260705.image_changelog.json +e0011ee1e40a97448ab03dd18f39ac1407cd95cdeae986ee39481b6f17fe691d *noble-server-cloudimg-amd64.daily.20260615.20260705.image_changelog.json +e0011ee1e40a97448ab03dd18f39ac1407cd95cdeae986ee39481b6f17fe691d *noble-server-cloudimg-arm64.daily.20260615.20260705.image_changelog.json +e2f4f8e72584375e10ab63b853aa9bf9f2ad840eb6cabff72bbdea03c614f5a6 *noble-server-cloudimg-amd64.ova +e6c74fa8c6ba72a2abdb219e661c6806effb65c50b460e4a1c6c344d08c05c7b *noble-server-cloudimg-ppc64el-lxd.tar.xz +f12228de23625baf65b18b88a8144f78875fdc630d473d87ad0916cf02ae7c31 *noble-server-cloudimg-arm64-root.manifest +f12228de23625baf65b18b88a8144f78875fdc630d473d87ad0916cf02ae7c31 *noble-server-cloudimg-arm64.squashfs.manifest +f1e770f1ecb32421db3c6c61bfeba4e019d160fa894a6d1dd997694044ab9542 *noble-server-cloudimg-armhf.tar.gz +f3a7043b938e99f163e362d1db5c659323430fc51e945387febb5fc790fe7ea6 *noble-server-cloudimg-amd64-root.manifest +f3a7043b938e99f163e362d1db5c659323430fc51e945387febb5fc790fe7ea6 *noble-server-cloudimg-amd64.squashfs.manifest +ffe6203da54deeb6db5d2a98a83f9ec8e55f149d3f7ba622e1abe5fa966ee3d6 *noble-server-cloudimg-amd64.img diff --git a/test/unit/fixtures/update/ubuntu2404/index.html b/test/unit/fixtures/update/ubuntu2404/index.html new file mode 100644 index 00000000..f8be1634 --- /dev/null +++ b/test/unit/fixtures/update/ubuntu2404/index.html @@ -0,0 +1,55 @@ + + + + Ubuntu Cloud Images + + + + +
+ + + +
+

Ubuntu Cloud Images 24.04 LTS Daily Build

+ +

Ubuntu Cloud Images are the official Ubuntu images and are pre-installed +disk images that have been customized by Ubuntu engineering to run on +public clouds that provide Ubuntu Certified Images, Openstack, LXD, and more.

+ +

For more information, please see the following:

+ +Cloud image specific bugs should be filed in the cloud-images project on Launchpad.net. + +

Ubuntu Server 24.04 LTS (Noble Numbat) Daily Builds

+
Icon  Name                    Last modified      Size  Description
[PARENTDIR] Parent Directory - +[DIR] 20260307/ 2026-03-11 02:26 - +[DIR] 20260321/ 2026-03-23 18:27 - +[DIR] 20260323/ 2026-03-23 20:27 - +[DIR] 20260518/ 2026-05-22 02:27 - +[DIR] 20260615/ 2026-06-19 18:26 - +[DIR] 20260705/ 2026-07-13 16:27 - +[DIR] current/ 2026-07-13 16:27 - +
+
diff --git a/test/unit/test_update.py b/test/unit/test_update.py new file mode 100644 index 00000000..0623978e --- /dev/null +++ b/test/unit/test_update.py @@ -0,0 +1,274 @@ +# SPDX-License-Identifier: Apache-2.0 + +import os +import shutil +import tempfile +import unittest +from unittest import mock + +import contrib.update as update + +# A minimal single-image YAML using the same shape update.py expects. +SAMPLE_YML = """\ +--- +images: + - name: Example 1.0 + enable: true + shortname: example-1.0 + format: qcow2 + latest_checksum_url: https://example.test/SHA256SUMS + latest_url: https://example.test/example.qcow2 + versions: + - version: '20200101' + url: https://example.test/example.qcow2 + mirror_url: https://old.example/openstack-images/example-1.0/20200101-example-1.0.qcow2 + checksum: sha256:0000000000000000000000000000000000000000000000000000000000000000 + build_date: 2020-01-01 +""" + + +class _FakeHandler: + def __init__(self, result): + self._result = result + + def resolve(self, image): + return self._result + + +class WriteContractTest(unittest.TestCase): + def setUp(self): + self.dir = tempfile.mkdtemp() + self.path = os.path.join(self.dir, "example.yml") + with open(self.path, "w") as fp: + fp.write(SAMPLE_YML) + + def tearDown(self): + shutil.rmtree(self.dir) + + def _read(self): + with open(self.path) as fp: + return fp.read() + + def _run(self, dry_run): + fake = _FakeHandler( + ("sha256:" + "1" * 64, "https://example.test/example.qcow2", "20260101") + ) + with mock.patch.dict(update.HANDLERS, {"example": fake}, clear=True): + update.main( + name="example", debug=False, dry_run=dry_run, images_dir=self.dir + ) + + def test_normal_mode_writes_changed_yaml(self): + before = self._read() + self._run(dry_run=False) + after = self._read() + self.assertNotEqual(before, after) + self.assertIn("1" * 64, after) + + def test_dry_run_leaves_file_unchanged(self): + before = self._read() + self._run(dry_run=True) + after = self._read() + self.assertEqual(before, after) + + def test_noop_writes_nothing(self): + before = self._read() + fake = _FakeHandler( + ("sha256:" + "0" * 64, "https://example.test/example.qcow2", "20200101") + ) + with mock.patch.dict(update.HANDLERS, {"example": fake}, clear=True): + update.main(name="example", debug=False, dry_run=False, images_dir=self.dir) + after = self._read() + self.assertEqual(before, after) + + +FIXTURES = os.path.join(os.path.dirname(__file__), "fixtures", "update") +DATED_UBUNTU = "20260705" +DATED_DEBIAN = "20260717-2542" + + +def _fx(*parts): + with open(os.path.join(FIXTURES, *parts)) as fp: + return fp.read() + + +class _FakeResponse: + def __init__(self, text): + self.text = text + + def raise_for_status(self): + pass + + +# Map every URL the handlers fetch to fixture content. +_URL_MAP = { + "https://repo.almalinux.org/almalinux/9/cloud/x86_64/images/CHECKSUM": ( + "almalinux9", + "CHECKSUM", + ), + "https://cloud.centos.org/centos/7/images/sha256sum.txt": ( + "centos7", + "sha256sum.txt", + ), + "https://cloud.centos.org/centos/9-stream/x86_64/images/CHECKSUM": ( + "centos_stream9", + "CHECKSUM", + ), + "https://download.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud.latest.x86_64.qcow2.CHECKSUM": ( + "rocky9", + "CHECKSUM", + ), + "https://cloud-images.ubuntu.com/noble": ("ubuntu2404", "index.html"), + f"https://cloud-images.ubuntu.com/noble/{DATED_UBUNTU}/SHA256SUMS": ( + "ubuntu2404", + "SHA256SUMS", + ), + "https://cdimage.debian.org/cdimage/cloud/trixie/daily": ( + "debian13", + "index.html", + ), + f"https://cdimage.debian.org/cdimage/cloud/trixie/daily/{DATED_DEBIAN}/SHA512SUMS": ( + "debian13", + "SHA512SUMS", + ), +} + + +def _fake_get(url, *args, **kwargs): + assert "timeout" in kwargs, f"requests.get({url}) called without timeout" + return _FakeResponse(_fx(*_URL_MAP[url])) + + +class GoldenTest(unittest.TestCase): + @mock.patch("contrib.update.requests.get", side_effect=_fake_get) + def test_almalinux9(self, _): + alma9_base = "https://repo.almalinux.org/almalinux/9/cloud/x86_64/images/" + checksum, url, version = update.MirrorDirHandler().resolve( + { + "shortname": "almalinux-9", + "latest_checksum_url": alma9_base + "CHECKSUM", + "latest_url": alma9_base + + "AlmaLinux-9-GenericCloud-latest.x86_64.qcow2", + } + ) + self.assertEqual( + checksum, + "sha256:c397eed7023e92c841155831b1f47e26300e5bef0f0256c129322307c897a251", + ) + self.assertTrue(url.endswith("AlmaLinux-9-GenericCloud-latest.x86_64.qcow2")) + self.assertIsNone(version) + + @mock.patch("contrib.update.requests.get", side_effect=_fake_get) + def test_centos7(self, _): + centos7_url = ( + r"https://cloud.centos.org/centos/7/images/" + r"CentOS-7-x86_64-GenericCloud-HEREBE\d+\.qcow2$DRAGONS" + ) + checksum, url, version = update.MirrorDirHandler().resolve( + { + "shortname": "centos-7", + "latest_checksum_url": "https://cloud.centos.org/centos/7/images/sha256sum.txt", + "latest_url": centos7_url, + } + ) + self.assertEqual( + checksum, + "sha256:284aab2b23d91318f169ff464bce4d53404a15a0618ceb34562838c59af4adea", + ) + self.assertEqual( + url, + "https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-2211.qcow2", + ) + self.assertIsNone(version) + + @mock.patch("contrib.update.requests.get", side_effect=_fake_get) + def test_centos_stream9(self, _): + stream9_url = ( + "https://cloud.centos.org/centos/9-stream/x86_64/images/" + r"CentOS-Stream-GenericCloud-9-HEREBE\d+\.\dDRAGONS.x86_64.qcow2" + ) + checksum, url, version = update.MirrorDirHandler().resolve( + { + "shortname": "centos-stream-9", + "latest_checksum_url": "https://cloud.centos.org/centos/9-stream/x86_64/images/CHECKSUM", + "latest_url": stream9_url, + } + ) + self.assertEqual( + checksum, + "sha256:2aa1716dc75fc5485df1b221d3d930f276024d70024f68f9ee047dad0e03d85d", + ) + self.assertEqual( + url, + "https://cloud.centos.org/centos/9-stream/x86_64/images/" + "CentOS-Stream-GenericCloud-9-20260714.1.x86_64.qcow2", + ) + self.assertIsNone(version) + + @mock.patch("contrib.update.requests.get", side_effect=_fake_get) + def test_rocky9(self, _): + rocky9_base = "https://download.rockylinux.org/pub/rocky/9/images/x86_64/" + checksum, url, version = update.MirrorDirHandler().resolve( + { + "shortname": "rocky-9", + "latest_checksum_url": rocky9_base + + "Rocky-9-GenericCloud.latest.x86_64.qcow2.CHECKSUM", + "latest_url": rocky9_base + "Rocky-9-GenericCloud.latest.x86_64.qcow2", + } + ) + self.assertEqual( + checksum, + "sha256:92c206cc6f790c61583247eefe87890f8828420662c17cacf247cec78ab4eec8", + ) + self.assertEqual( + url, + rocky9_base + "Rocky-9-GenericCloud.latest.x86_64.qcow2", + ) + self.assertIsNone(version) + + @mock.patch("contrib.update.requests.get", side_effect=_fake_get) + def test_ubuntu(self, _): + checksum, url, version = update.DirListingHandler().resolve( + { + "shortname": "ubuntu-24.04", + "latest_checksum_url": "https://cloud-images.ubuntu.com/noble/current/SHA256SUMS", + "latest_url": "https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img", + } + ) + self.assertEqual( + checksum, + "sha256:ffe6203da54deeb6db5d2a98a83f9ec8e55f149d3f7ba622e1abe5fa966ee3d6", + ) + self.assertEqual( + url, + "https://cloud-images.ubuntu.com/noble/20260705/noble-server-cloudimg-amd64.img", + ) + self.assertEqual(version, "20260705") + + @mock.patch("contrib.update.requests.get", side_effect=_fake_get) + def test_debian(self, _): + debian13_base = "https://cdimage.debian.org/cdimage/cloud/trixie/daily/latest/" + checksum, url, version = update.DirListingHandler().resolve( + { + "shortname": "debian-13", + "latest_checksum_url": debian13_base + "SHA512SUMS", + "latest_url": debian13_base + + "debian-13-genericcloud-amd64-daily.qcow2", + } + ) + self.assertEqual( + checksum, + "sha512:" + "fcc52bdff35697583f9331b64c688db6681fea98c024a1db185d8857b167f4e" + "1838ead7037f18c12e432229354b1253f29e881a040ce0f5636801576e715b4b8", + ) + self.assertEqual( + url, + "https://cdimage.debian.org/cdimage/cloud/trixie/daily/" + "20260717-2542/debian-13-genericcloud-amd64-daily-20260717-2542.qcow2", + ) + self.assertEqual(version, "20260717") + + +if __name__ == "__main__": + unittest.main()