From da3abe609c205ae49a33a8ce9d1504338feb0084 Mon Sep 17 00:00:00 2001 From: ignis Date: Tue, 2 Sep 2025 15:12:52 +0200 Subject: [PATCH 01/92] *.py files migrated from gardenlinux workflows --- src/gardenlinux/release_note/__init__.py | 0 src/gardenlinux/release_note/__main__.py | 414 ++++++++++++++++++ .../release_note/get_kernelurls.py | 136 ++++++ 3 files changed, 550 insertions(+) create mode 100644 src/gardenlinux/release_note/__init__.py create mode 100755 src/gardenlinux/release_note/__main__.py create mode 100755 src/gardenlinux/release_note/get_kernelurls.py diff --git a/src/gardenlinux/release_note/__init__.py b/src/gardenlinux/release_note/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/gardenlinux/release_note/__main__.py b/src/gardenlinux/release_note/__main__.py new file mode 100755 index 00000000..4ce1c08c --- /dev/null +++ b/src/gardenlinux/release_note/__main__.py @@ -0,0 +1,414 @@ +from botocore import UNSIGNED +from botocore.client import Config +from gardenlinux.apt import DebsrcFile +from gardenlinux.features import CName +from gardenlinux.flavors import Parser as FlavorsParser +from gardenlinux.s3 import S3Artifacts +from pathlib import Path +from yaml.loader import SafeLoader +import argparse +import boto3 +import gzip +import json +import os +import re +import requests +import subprocess +import sys +import textwrap +import yaml +import urllib.request + +from .get_kernelurls import get_kernel_urls + + +GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME = "gardenlinux-github-releases" + +arches = [ + 'amd64', + 'arm64' +] + +cloud_fullname_dict = { + 'ali': 'Alibaba Cloud', + 'aws': 'Amazon Web Services', + 'gcp': 'Google Cloud Platform', + 'azure': 'Microsoft Azure' +} + +# https://github.com/gardenlinux/gardenlinux/issues/3044 +# Empty string is the 'legacy' variant with traditional root fs and still needed/supported +image_variants = ['', '_usi', '_tpm2_trustedboot'] + + +def _ali_release_note(published_image_metadata): + output = "" + for pset in published_image_metadata: + for p in published_image_metadata[pset]: + for image in published_image_metadata: + output += f"- Region: {p['region_id']}, Image-Id: {p['image_id']}\n" + return output + + +def _aws_release_note(published_image_metadata): + output = "" + for pset in published_image_metadata: + for p in published_image_metadata[pset]: + for image in published_image_metadata: + output += f"- Region: {p['aws_region_id']}, Image-Id: {p['ami_id']}\n" + return output + + +def _gcp_release_note(published_image_metadata): + return f"gcp_image_name: {published_image_metadata['gcp_image_name']}\n" + + +def _azure_release_note(published_image_metadata): + output = "" + for pset in published_image_metadata: + if pset == 'published_gallery_images': + if (len(published_image_metadata[pset]) > 0): + output += "# all regions (community gallery image):\n" + for gallery_image in published_image_metadata[pset]: + output += f"Hyper V: {gallery_image['hyper_v_generation']}, " + output += f"Azure Cloud: {gallery_image['azure_cloud']}, " + output += f"Image Id: {gallery_image['community_gallery_image_id']}\n" + + if pset == 'published_marketplace_images': + if (len(published_image_metadata[pset]) > 0): + output += "# all regions (marketplace image):\n" + for market_image in published_image_metadata[pset]: + output += f"Hyper V: {market_image['hyper_v_generation']}, " + output += f"urn: {market_image['urn']}\n" + return output + + +def generate_release_note_image_ids(manifests): + out = "" + for m in manifests: + out += generate_release_note_image_id_single(m) + return out + + +def generate_release_note_image_id_single(manifest_path): + """ + Outputs a markdown formatted string for github release notes, + containing the image-ids for the respective cloud regions + """ + output = "" + with open(manifest_path) as f: + manifest_data = yaml.load(f, Loader=SafeLoader) + published_image_metadata = manifest_data['published_image_metadata'] + + # No publishing metadata found in manifest, assume it was not published + if published_image_metadata is None: + return "" + + platform_short_name = manifest_data['platform'] + arch = manifest_data['architecture'] + if platform_short_name in cloud_fullname_dict: + platform_long_name = cloud_fullname_dict[platform_short_name] + output = output + f"### {platform_long_name} ({arch})\n" + else: + output = output + f"### {platform_short_name} ({arch})\n" + + output += "```\n" + if platform_short_name == 'ali': + output += _ali_release_note(published_image_metadata) + elif platform_short_name == 'aws': + output += _aws_release_note(published_image_metadata) + elif platform_short_name == 'gcp': + output += _gcp_release_note(published_image_metadata) + elif platform_short_name == 'azure': + output += _azure_release_note(published_image_metadata) + else: + print(f"unknown platform {platform_short_name}") + output += "```\n" + return output + + +def download_all_singles(version, commitish): + with open("./flavors.yaml", "r") as f: + flavors_data = f.read() + flavors = FlavorsParser(flavors_data).filter(only_publish=True) + + local_dest_path = Path("s3_downloads") + local_dest_path.makedir(mode=0o755, exist_ok=True) + + for flavor in flavors: + cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish)) + S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME).download_to_directory(cname.cname, local_dest_path) + + return [str(artifact) for artifact in local_dest_path.iterdir()] + + +def get_image_object_url(bucket, object, expiration=0): + s3_config = Config(signature_version=UNSIGNED) + s3_client = boto3.client('s3', config=s3_config) + url = s3_client.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': object}, ExpiresIn=expiration) + return url + + +def generate_image_download_section(manifests, version, commitish): + output = "" + for manifest_path in manifests: + with open(manifest_path) as f: + manifest_data = yaml.load(f, Loader=SafeLoader) + arch = manifest_data['architecture'].upper() + platform = manifest_data['platform'] + paths = manifest_data['paths'] + + for path in paths: + if platform == 'ali' and '.qcow2' == path['suffix']: + output += f"### {cloud_fullname_dict['ali']} ({arch})\n" + output += f"* [{version}-{commitish}-rootfs.qcow2]({get_image_object_url(path['s3_bucket_name'], path['s3_key'])})\n" + elif platform == 'aws' and '.raw' == path['suffix']: + output += f"### {cloud_fullname_dict['aws']} ({arch})\n" + output += f"* [{version}-{commitish}-rootfs.raw]({get_image_object_url(path['s3_bucket_name'], path['s3_key'])})\n" + elif platform == 'gcp' and '.tar.gz' == path['suffix']: + output += f"### {cloud_fullname_dict['gcp']} ({arch})\n" + output += f"* [{version}-{commitish}-rootfs-gcpimage.tar.gz]({get_image_object_url(path['s3_bucket_name'], path['s3_key'])})\n" + elif platform == 'azure' and '.vhd' == path['suffix']: + output += f"### {cloud_fullname_dict['azure']} ({arch})\n" + output += f"* [{version}-{commitish}-rootfs.vhd]({get_image_object_url(path['s3_bucket_name'], path['s3_key'])})\n" + return output + + +def _parse_match_section(pkg_list: list): + output = "" + for pkg in pkg_list: + # If is dict, the package has additional information relevant for release notes + if isinstance(pkg, dict): + pkg_string = next(iter(pkg)) + output += f"\n{pkg_string}:\n" + for item in pkg[pkg_string]: + for k, v in item.items(): + output += f" * {k}: {v}\n" + return output + + +def release_notes_changes_section(gardenlinux_version): + """ + Get list of fixed CVEs, grouped by upgraded package. + Note: This result is not perfect, feel free to edit the generated release notes and + file issues in glvd for improvement suggestions https://github.com/gardenlinux/glvd/issues + """ + try: + url = f"https://glvd.ingress.glvd.gardnlinux.shoot.canary.k8s-hana.ondemand.com/v1/patchReleaseNotes/{gardenlinux_version}" + response = requests.get(url) + response.raise_for_status() # Will raise an error for bad responses + data = response.json() + + if len(data["packageList"]) == 0: + return "" + + output = [ + "## Changes", + "The following packages have been upgraded, to address the mentioned CVEs:" + ] + for package in data["packageList"]: + upgrade_line = ( + f"- upgrade '{package['sourcePackageName']}' from `{package['oldVersion']}` " + f"to `{package['newVersion']}`" + ) + output.append(upgrade_line) + + if package["fixedCves"]: + for fixedCve in package["fixedCves"]: + output.append(f' - {fixedCve}') + + return "\n".join(output) + "\n\n" + except: + # There are expected error cases, for example with versions not supported by glvd (1443.x) or when the api is not available + # Fail gracefully by adding the placeholder we previously used, so that the release note generation does not fail. + return textwrap.dedent(""" + ## Changes + The following packages have been upgraded, to address the mentioned CVEs: + **todo release facilitator: fill this in** + """) + + +def release_notes_software_components_section(package_list): + output = "## Software Component Versions\n" + output += "```" + output += "\n" + packages_regex = re.compile(r'^linux-image-amd64$|^systemd$|^containerd$|^runc$|^curl$|^openssl$|^openssh-server$|^libc-bin$') + for entry in package_list.values(): + if packages_regex.match(entry.deb_source): + output += f'{entry!r}\n' + output += "```" + output += "\n\n" + return output + + +def release_notes_compare_package_versions_section(gardenlinux_version, package_list): + output = "" + version_components = gardenlinux_version.split('.') + # Assumes we always have version numbers like 1443.2 + if (len(version_components) == 2): + try: + major = int(version_components[0]) + patch = int(version_components[1]) + + if patch > 0: + previous_version = f"{major}.{patch - 1}" + + output += f"## Changes in Package Versions Compared to {previous_version}\n" + output += "```diff\n" + output += subprocess.check_output(['/bin/bash', './hack/compare-apt-repo-versions.sh', + previous_version, gardenlinux_version]).decode("utf-8") + output += "```\n\n" + elif patch == 0: + output += f"## Full List of Packages in Garden Linux version {major}\n" + output += "
Expand to see full list\n" + output += "
"
+                output += "\n"
+                for entry in package_list.values():
+                    output += f'{entry!r}\n'
+                output += "
" + output += "\n
\n\n" + + except ValueError: + print(f"Could not parse {gardenlinux_version} as the Garden Linux version, skipping version compare section") + else: + print(f"Unexpected version number format {gardenlinux_version}, expected format (major is int).(patch is int)") + return output + + +def _get_package_list(gardenlinux_version): + (path, headers) = urllib.request.urlretrieve( + f'https://packages.gardenlinux.io/gardenlinux/dists/{gardenlinux_version}/main/binary-amd64/Packages.gz') + with gzip.open(path, 'rt') as f: + d = DebsrcFile() + d.read(f) + return d + + +def create_github_release_notes(gardenlinux_version, commitish, dry_run=False): + commitish_short = commitish[:8] + + package_list = _get_package_list(gardenlinux_version) + + output = "" + + output += release_notes_changes_section(gardenlinux_version) + + output += release_notes_software_components_section(package_list) + + output += release_notes_compare_package_versions_section(gardenlinux_version, package_list) + + manifests = download_all_singles(gardenlinux_version, commitish_short) + + output += generate_release_note_image_ids(manifests) + + output += "\n" + output += "## Kernel Package direct download links\n" + output += get_kernel_urls(gardenlinux_version) + output += "\n" + + output += generate_image_download_section(manifests, gardenlinux_version, commitish_short) + + output += "\n" + output += "## Kernel Module Build Container (kmodbuild) " + output += "\n" + output += "```" + output += "\n" + output += f"ghcr.io/gardenlinux/gardenlinux/kmodbuild:{gardenlinux_version}" + output += "\n" + output += "```" + output += "\n" + return output + + +def write_to_release_id_file(release_id): + try: + with open('.github_release_id', 'w') as file: + file.write(release_id) + print("Created .github_release_id successfully.") + except IOError as e: + print(f"Could not create .github_release_id file: {e}") + sys.exit(1) + + +def create_github_release(owner, repo, tag, commitish, body): + + token = os.environ.get('GITHUB_TOKEN') + if not token: + raise ValueError("GITHUB_TOKEN environment variable not set") + + headers = { + 'Authorization': f'token {token}', + 'Accept': 'application/vnd.github.v3+json' + } + + data = { + 'tag_name': tag, + 'target_commitish': commitish, + 'name': tag, + 'body': body, + 'draft': False, + 'prerelease': False + } + + response = requests.post(f'https://api.github.com/repos/{owner}/{repo}/releases', headers=headers, data=json.dumps(data)) + + if response.status_code == 201: + print("Release created successfully") + response_json = response.json() + return response_json.get('id') + else: + print("Failed to create release") + print(response.json()) + response.raise_for_status() + + +def main(): + parser = argparse.ArgumentParser(description="GitHub Release Script") + subparsers = parser.add_subparsers(dest='command') + + create_parser = subparsers.add_parser('create') + create_parser.add_argument('--owner', default="gardenlinux") + create_parser.add_argument('--repo', default="gardenlinux") + create_parser.add_argument('--tag', required=True) + create_parser.add_argument('--commit', required=True) + create_parser.add_argument('--dry-run', action='store_true', default=False) + + upload_parser = subparsers.add_parser('upload') + upload_parser.add_argument('--release_id', required=True) + upload_parser.add_argument('--file_path', required=True) + + kernelurl_parser = subparsers.add_parser('kernelurls') + kernelurl_parser.add_argument('--version', required=True) + args = parser.parse_args() + + if args.command == 'create': + body = create_github_release_notes(args.tag, args.commit, args.dry_run) + if not args.dry_run: + release_id = create_github_release(args.owner, args.repo, args.tag, args.commit, body) + write_to_release_id_file(f"{release_id}") + print(f"Release created with ID: {release_id}") + else: + print(body) + elif args.command == 'upload': + # Implementation for 'upload' command + pass + elif args.command == 'kernelurls': + # Implementation for 'upload' command + output = "" + output += "## Kernel Package direct download links\n" + output += get_kernel_urls(args.version) + print(output) + else: + parser.print_help() + + +if __name__ == "__main__": + main() + + +# # Example usage +# try: +# release_info = create_github_release('gardenlinux', 'gardenlinux', "1312.0", "40b9db2c") +# print(release_info) +# except Exception as e: +# print(f"Error occurred: {e}") diff --git a/src/gardenlinux/release_note/get_kernelurls.py b/src/gardenlinux/release_note/get_kernelurls.py new file mode 100755 index 00000000..6efab6f4 --- /dev/null +++ b/src/gardenlinux/release_note/get_kernelurls.py @@ -0,0 +1,136 @@ +import re +import requests +import lzma +import gzip +import yaml +import itertools + + +def get_pkg_attr(package_name, attribute_key, packages_per_repo): + + current_package = {} + found_package = False + for packages in packages_per_repo.values(): + for line in packages.split('\n'): + # Check for new package section or end of file + if line.startswith("Package: ") or line.strip() == "": + if found_package: + # Return the attribute if it exists + return current_package.get(attribute_key) + current_package = {} + found_package = False + + key_value = line.split(": ", 1) + if len(key_value) == 2: + key, value = key_value + current_package[key.strip()] = value.strip() + + # Check if current section is the desired package + if current_package.get("Package") == package_name: + found_package = True + + +def get_kernel_urls(gardenlinux_version): + if not gardenlinux_version: + print("You need to specify gardenlinux_version") + repositories = [f'http://packages.gardenlinux.io/gardenlinux {gardenlinux_version} main'] + + # Temporary for as long as we need to perform releases for versions < 1443 + if "1312" in gardenlinux_version: + repositories = [f'http://repo.gardenlinux.io/gardenlinux {gardenlinux_version} main'] + + architecture = ["arm64", "amd64"] + packages = get_package_list(repositories, architecture) + + # find all Linux kernel versions available for the specified Gardenlinux version + + # We want to only list the packages for the specific kernel used for a given release + # GL uses always the latest available kernel in the given repo, even if older kernel versions would be available. + # Ideally we would parse the version of the package linux-headers-${arch}, which specifies the actual version. + # Here, it is safe enough for the release notes to take the highest version available. + latest_version = get_pkg_attr("linux-headers-amd64", "Version", packages) + package_urls = check_urls([latest_version], get_package_urls(packages, 'linux-headers'), architecture) + return output_urls(package_urls) + + +def get_package_list(repositories, architecture): + '''Get Packages lists from repository and return it as dictionary. + ''' + packages_dict = {} + for repo in repositories: + repo_entries = repo.split(' ') + uri = repo_entries[0] + suite = repo_entries[1] + for component, arch, compression in itertools.product(repo_entries[2:], ['all'] + architecture, ['.gz', '.xz', '']): + packages_url = f'{uri}/dists/{suite}/{component}/binary-{arch}/Packages{compression}' + response = requests.get(packages_url) + if response.status_code == 200: + if compression == '.xz': + packages = lzma.decompress(response.content).decode("UTF-8") + elif compression == '.gz': + packages = gzip.decompress(response.content).decode("UTF-8") + else: + packages = response.content.decode("UTF-8") + + packages_dict.update({f'{uri}-{suite}-{component}-{arch}': packages}) + + assert len(packages_dict) != 0, "Expected to find packages" + return packages_dict + + +def get_package_urls(package_list, package_name, resolve_depends=True): + '''Check if kernel headers and their dependencies are available. Returns a list + with the complete urls to all found kernel header packages and their dependencies. + ''' + header_packages = [] + dependencies = [] + for repo, packages in package_list.items(): + uri = re.match('(.*?)-.*', repo).group(1) + for line in packages.split('\n'): + if resolve_depends and line.startswith('Depends:'): + dependencies = re.sub(' ?\(.*?\),?|,', '', re.match("Depends: (.*)", line).group(1)).split(' ') + if line.startswith('Filename:') and f'/{package_name}' in line: + filename = re.match("Filename: (.*)", line).group(1) + header_packages.append(f'{uri}/{filename}') + if resolve_depends: + for dependency in dependencies: + header_packages.extend(get_package_urls(package_list, dependency, False)) + + return header_packages + + +def check_urls(linux_versions, header_package_urls, architecture): + '''Pick the package urls that match the Linux image versions. + ''' + result = {} + versions = {} + for arch, version in itertools.product(architecture, linux_versions): + if arch not in result: + result[arch] = {} + result[arch][version] = [] + for version, arch, package in itertools.product(linux_versions, architecture, header_package_urls): + if version in package and arch in package: + result[arch][version].append(package) + versions[version] = re.match(".*?(_.*)\.deb", package).group(1) + # Workaround for linux compiler package name on arm64 architecture + if 'arm64' in package and arch == 'arm64' and re.match('.*/gcc-\d\d_.*', package): + result[arch][version].append(package) + for version, arch, package in itertools.product(versions, architecture, header_package_urls): + if versions[version] in package and arch in package and 'linux-headers' not in package: + result[arch][version].append(package) + + for key, value in result.items(): + for nested_key, nested_value in value.items(): + result[key][nested_key] = list(dict.fromkeys(nested_value)) + + return result + + +def output_urls(package_urls): + + yaml_output = "```yaml\n" + yaml_output += "" + yaml_output += yaml.dump(package_urls) + yaml_output += "```\n" + yaml_output += "" + return yaml_output From 06b2f69c1974455602f5371119acb132fa3444d1 Mon Sep 17 00:00:00 2001 From: ignis Date: Thu, 4 Sep 2025 12:42:19 +0200 Subject: [PATCH 02/92] reorganized code, package version bump --- pyproject.toml | 3 ++- .../{release_note => github}/__init__.py | 0 .../{release_note => github}/__main__.py | 0 src/gardenlinux/github/get_kernelurls.py | 0 src/gardenlinux/sources/__init__.py | 0 .../get_kernelurls.py => sources/debian.py} | 23 ------------------- src/gardenlinux/sources/kernel.py | 21 +++++++++++++++++ 7 files changed, 23 insertions(+), 24 deletions(-) rename src/gardenlinux/{release_note => github}/__init__.py (100%) rename src/gardenlinux/{release_note => github}/__main__.py (100%) create mode 100644 src/gardenlinux/github/get_kernelurls.py create mode 100644 src/gardenlinux/sources/__init__.py rename src/gardenlinux/{release_note/get_kernelurls.py => sources/debian.py} (78%) mode change 100755 => 100644 create mode 100644 src/gardenlinux/sources/kernel.py diff --git a/pyproject.toml b/pyproject.toml index 3d5d984a..9b0f5e56 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "gardenlinux" -version = "0.9.0" +version = "0.10.0" description = "Contains tools to work with the features directory of gardenlinux, for example deducting dependencies from feature sets or validating cnames" authors = ["Garden Linux Maintainers "] license = "Apache-2.0" @@ -37,6 +37,7 @@ gl-features-parse = "gardenlinux.features.__main__:main" gl-flavors-parse = "gardenlinux.flavors.__main__:main" gl-oci = "gardenlinux.oci.__main__:main" gl-s3 = "gardenlinux.s3.__main__:main" +gl-gh = "gardenlinux.github.__main__:main" [tool.pytest.ini_options] pythonpath = ["src"] diff --git a/src/gardenlinux/release_note/__init__.py b/src/gardenlinux/github/__init__.py similarity index 100% rename from src/gardenlinux/release_note/__init__.py rename to src/gardenlinux/github/__init__.py diff --git a/src/gardenlinux/release_note/__main__.py b/src/gardenlinux/github/__main__.py similarity index 100% rename from src/gardenlinux/release_note/__main__.py rename to src/gardenlinux/github/__main__.py diff --git a/src/gardenlinux/github/get_kernelurls.py b/src/gardenlinux/github/get_kernelurls.py new file mode 100644 index 00000000..e69de29b diff --git a/src/gardenlinux/sources/__init__.py b/src/gardenlinux/sources/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/gardenlinux/release_note/get_kernelurls.py b/src/gardenlinux/sources/debian.py old mode 100755 new mode 100644 similarity index 78% rename from src/gardenlinux/release_note/get_kernelurls.py rename to src/gardenlinux/sources/debian.py index 6efab6f4..fcbe9189 --- a/src/gardenlinux/release_note/get_kernelurls.py +++ b/src/gardenlinux/sources/debian.py @@ -30,29 +30,6 @@ def get_pkg_attr(package_name, attribute_key, packages_per_repo): found_package = True -def get_kernel_urls(gardenlinux_version): - if not gardenlinux_version: - print("You need to specify gardenlinux_version") - repositories = [f'http://packages.gardenlinux.io/gardenlinux {gardenlinux_version} main'] - - # Temporary for as long as we need to perform releases for versions < 1443 - if "1312" in gardenlinux_version: - repositories = [f'http://repo.gardenlinux.io/gardenlinux {gardenlinux_version} main'] - - architecture = ["arm64", "amd64"] - packages = get_package_list(repositories, architecture) - - # find all Linux kernel versions available for the specified Gardenlinux version - - # We want to only list the packages for the specific kernel used for a given release - # GL uses always the latest available kernel in the given repo, even if older kernel versions would be available. - # Ideally we would parse the version of the package linux-headers-${arch}, which specifies the actual version. - # Here, it is safe enough for the release notes to take the highest version available. - latest_version = get_pkg_attr("linux-headers-amd64", "Version", packages) - package_urls = check_urls([latest_version], get_package_urls(packages, 'linux-headers'), architecture) - return output_urls(package_urls) - - def get_package_list(repositories, architecture): '''Get Packages lists from repository and return it as dictionary. ''' diff --git a/src/gardenlinux/sources/kernel.py b/src/gardenlinux/sources/kernel.py new file mode 100644 index 00000000..4bb179ea --- /dev/null +++ b/src/gardenlinux/sources/kernel.py @@ -0,0 +1,21 @@ +def get_kernel_urls(gardenlinux_version): + if not gardenlinux_version: + print("You need to specify gardenlinux_version") + repositories = [f'http://packages.gardenlinux.io/gardenlinux {gardenlinux_version} main'] + + # Temporary for as long as we need to perform releases for versions < 1443 + if "1312" in gardenlinux_version: + repositories = [f'http://repo.gardenlinux.io/gardenlinux {gardenlinux_version} main'] + + architecture = ["arm64", "amd64"] + packages = get_package_list(repositories, architecture) + + # find all Linux kernel versions available for the specified Gardenlinux version + + # We want to only list the packages for the specific kernel used for a given release + # GL uses always the latest available kernel in the given repo, even if older kernel versions would be available. + # Ideally we would parse the version of the package linux-headers-${arch}, which specifies the actual version. + # Here, it is safe enough for the release notes to take the highest version available. + latest_version = get_pkg_attr("linux-headers-amd64", "Version", packages) + package_urls = check_urls([latest_version], get_package_urls(packages, 'linux-headers'), architecture) + return output_urls(package_urls) From 234cad8edcfd4f8be8c65b37115c9b2913b158d2 Mon Sep 17 00:00:00 2001 From: ignis Date: Thu, 4 Sep 2025 13:13:37 +0200 Subject: [PATCH 03/92] bumped setup action tag in flavors_parse --- .github/actions/flavors_parse/action.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/actions/flavors_parse/action.yml b/.github/actions/flavors_parse/action.yml index 71e478fe..d402e52c 100644 --- a/.github/actions/flavors_parse/action.yml +++ b/.github/actions/flavors_parse/action.yml @@ -2,18 +2,18 @@ name: flavors_parse description: Parses the given GardenLinux flavors parameters inputs: flags: - description: 'Flags passed to `gl-flavors-parse`' + description: "Flags passed to `gl-flavors-parse`" required: true flavors_matrix: - description: 'Generated GitHub workflow flavors matrix' + description: "Generated GitHub workflow flavors matrix" outputs: matrix: - description: 'Flavors matrix' + description: "Flavors matrix" value: ${{ steps.matrix.outputs.matrix }} runs: using: composite steps: - - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@0.9.0 + - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@0.10.0 - id: matrix shell: bash run: | From 332329de94103973fb968ee4e4342ab00b8db757 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 5 Sep 2025 10:18:24 +0200 Subject: [PATCH 04/92] version 0.10.0 is the default --- .github/actions/features_parse/action.yml | 6 +++--- .github/actions/setup/action.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/actions/features_parse/action.yml b/.github/actions/features_parse/action.yml index 306eea80..cd46fdc0 100644 --- a/.github/actions/features_parse/action.yml +++ b/.github/actions/features_parse/action.yml @@ -2,16 +2,16 @@ name: features_parse description: Parses the given GardenLinux features parameters inputs: flags: - description: 'Flags passed to `gl-features-parse`' + description: "Flags passed to `gl-features-parse`" required: true outputs: result: - description: 'features result' + description: "features result" value: ${{ steps.result.outputs.result }} runs: using: composite steps: - - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@0.9.0 + - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@0.10.0 - id: result shell: bash run: | diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 0f9a19ba..f7f933d2 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -4,7 +4,7 @@ description: Installs the given GardenLinux Python library inputs: version: description: GardenLinux Python library version - default: "0.9.0" + default: "0.10.0" python_version: description: Python version to setup default: "3.13" From 3ad7a9ef242477b0234264904151b3b955a51e3d Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 5 Sep 2025 11:29:41 +0200 Subject: [PATCH 05/92] fixed import --- src/gardenlinux/github/__main__.py | 3 +-- src/gardenlinux/github/get_kernelurls.py | 0 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 src/gardenlinux/github/get_kernelurls.py diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 4ce1c08c..3e41d12f 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -4,6 +4,7 @@ from gardenlinux.features import CName from gardenlinux.flavors import Parser as FlavorsParser from gardenlinux.s3 import S3Artifacts +from gardenlinux.sources.kernel import get_kernel_urls from pathlib import Path from yaml.loader import SafeLoader import argparse @@ -19,8 +20,6 @@ import yaml import urllib.request -from .get_kernelurls import get_kernel_urls - GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME = "gardenlinux-github-releases" diff --git a/src/gardenlinux/github/get_kernelurls.py b/src/gardenlinux/github/get_kernelurls.py deleted file mode 100644 index e69de29b..00000000 From df1c1ebb7fd415635b262f9662471109a53485c7 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 5 Sep 2025 12:00:57 +0200 Subject: [PATCH 06/92] fixed imports for sources.kernel --- src/gardenlinux/sources/kernel.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/gardenlinux/sources/kernel.py b/src/gardenlinux/sources/kernel.py index 4bb179ea..d935e560 100644 --- a/src/gardenlinux/sources/kernel.py +++ b/src/gardenlinux/sources/kernel.py @@ -1,3 +1,12 @@ +from .debian import ( + get_package_list, + get_package_urls, + get_pkg_attr, + check_urls, + output_urls +) + + def get_kernel_urls(gardenlinux_version): if not gardenlinux_version: print("You need to specify gardenlinux_version") From 2ec4e57e8ff921b25b60769731b81df433d3f52a Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 5 Sep 2025 15:01:48 +0200 Subject: [PATCH 07/92] added compare-apt-repo-versions script --- hack/compare-apt-repo-versions.sh | 42 +++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100755 hack/compare-apt-repo-versions.sh diff --git a/hack/compare-apt-repo-versions.sh b/hack/compare-apt-repo-versions.sh new file mode 100755 index 00000000..8c23ff84 --- /dev/null +++ b/hack/compare-apt-repo-versions.sh @@ -0,0 +1,42 @@ +#!/bin/bash +set -o errexit + +SCRIPT_NAME="${0##*/}" +readonly SCRIPT_NAME + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +readonly SCRIPT_DIR + +usage() { + echo "Script to compare the apt repo version of two Garden Linux releases." + echo "Usage: $SCRIPT_NAME VERSION_A VERSION_B" + echo "Example: $SCRIPT_NAME 1443.10 1587.0" + exit 1 +} + +main() { + [[ $# -ge 2 ]] || usage + [[ -n "$1" ]] || usage + [[ -n "$2" ]] || usage + local VERSION_A="${1}"; shift + local VERSION_B="${1}"; shift + + TEMP_DIR=$(mktemp -d) + + trap 'rm -rf $TEMP_DIR' EXIT + + curl -s https://packages.gardenlinux.io/gardenlinux/dists/"$VERSION_A"/main/binary-amd64/Packages.gz | gunzip > "$TEMP_DIR"/GardenLinux-"$VERSION_A" + curl -s https://packages.gardenlinux.io/gardenlinux/dists/"$VERSION_B"/main/binary-amd64/Packages.gz | gunzip > "$TEMP_DIR"/GardenLinux-"$VERSION_B" + + python3 "$SCRIPT_DIR"/parse-aptsource.py "$TEMP_DIR"/GardenLinux-"$VERSION_A" > "$TEMP_DIR"/"$VERSION_A" + python3 "$SCRIPT_DIR"/parse-aptsource.py "$TEMP_DIR"/GardenLinux-"$VERSION_B" > "$TEMP_DIR"/"$VERSION_B" + + pushd "$TEMP_DIR" > /dev/null + + diff -U 0 --minimal "$VERSION_A" "$VERSION_B" | grep -v '^@' + + popd > /dev/null +} + +main "${@}" + From a3419b76507f2b060905d0f66ae4478cf8c166a9 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 5 Sep 2025 15:12:52 +0200 Subject: [PATCH 08/92] replaced compare-apt-repo-versions with python code --- src/gardenlinux/github/__main__.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 3e41d12f..12a94e21 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -19,6 +19,7 @@ import textwrap import yaml import urllib.request +import difflib GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME = "gardenlinux-github-releases" @@ -254,8 +255,22 @@ def release_notes_compare_package_versions_section(gardenlinux_version, package_ output += f"## Changes in Package Versions Compared to {previous_version}\n" output += "```diff\n" - output += subprocess.check_output(['/bin/bash', './hack/compare-apt-repo-versions.sh', - previous_version, gardenlinux_version]).decode("utf-8") + try: + prev_pkg_list = _get_package_list(previous_version) + current_pkg_lines = [] + for entry in package_list.values(): + current_pkg_lines.append(repr(entry)) + prev_pkg_lines = [] + for entry in prev_pkg_list.values(): + prev_pkg_lines.append(repr(entry)) + diff = difflib.unified_diff(prev_pkg_lines, current_pkg_lines, + fromfile=f"{previous_version}", + tofile=f"{gardenlinux_version}", + lineterm="") + diff_text = "\n".join(list(diff)) + output += diff_text + except Exception as e: + output += f"Error generating diff: {e}" output += "```\n\n" elif patch == 0: output += f"## Full List of Packages in Garden Linux version {major}\n" From 4dc00f53a84bc3c6c08c115e9ef3399e8a8b3fd2 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 5 Sep 2025 15:22:05 +0200 Subject: [PATCH 09/92] github fixes --- src/gardenlinux/github/__main__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 12a94e21..242e9f60 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -14,7 +14,6 @@ import os import re import requests -import subprocess import sys import textwrap import yaml @@ -133,7 +132,7 @@ def download_all_singles(version, commitish): flavors = FlavorsParser(flavors_data).filter(only_publish=True) local_dest_path = Path("s3_downloads") - local_dest_path.makedir(mode=0o755, exist_ok=True) + local_dest_path.mkdir(mode=0o755, exist_ok=True) for flavor in flavors: cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish)) From 701131309d076acc2b605b7db0c6da46f0653203 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 5 Sep 2025 15:47:04 +0200 Subject: [PATCH 10/92] loading s3 bucket name from an envvar --- src/gardenlinux/github/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 242e9f60..5394c5e7 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -21,7 +21,7 @@ import difflib -GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME = "gardenlinux-github-releases" +GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME = os.environ['GITHUB_RELEASE_BUCKET_NAME'] arches = [ 'amd64', From bfd7fa79eb7db48e62b790ea49bf2628adc9a02e Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 8 Sep 2025 15:47:03 +0200 Subject: [PATCH 11/92] debug prints --- src/gardenlinux/github/__main__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 5394c5e7..c051c634 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -136,6 +136,7 @@ def download_all_singles(version, commitish): for flavor in flavors: cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish)) + print(f'YTDBG // {cname=}') S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME).download_to_directory(cname.cname, local_dest_path) return [str(artifact) for artifact in local_dest_path.iterdir()] From ff7965f33601f6236cc2e8cd401662fb4f8a1d33 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 8 Sep 2025 15:51:25 +0200 Subject: [PATCH 12/92] switched from tag to branch while we're in development mode --- .github/actions/features_parse/action.yml | 2 +- .github/actions/flavors_parse/action.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/features_parse/action.yml b/.github/actions/features_parse/action.yml index cd46fdc0..3d5579c7 100644 --- a/.github/actions/features_parse/action.yml +++ b/.github/actions/features_parse/action.yml @@ -11,7 +11,7 @@ outputs: runs: using: composite steps: - - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@0.10.0 + - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@3054-move-github-workflows-py-to-python-gardenlinux-lib - id: result shell: bash run: | diff --git a/.github/actions/flavors_parse/action.yml b/.github/actions/flavors_parse/action.yml index d402e52c..e8ed527a 100644 --- a/.github/actions/flavors_parse/action.yml +++ b/.github/actions/flavors_parse/action.yml @@ -13,7 +13,7 @@ outputs: runs: using: composite steps: - - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@0.10.0 + - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@3054-move-github-workflows-py-to-python-gardenlinux-lib - id: matrix shell: bash run: | From 70b22318e9dd11b9a3b3724ede2eb7f35da94469 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 8 Sep 2025 15:57:45 +0200 Subject: [PATCH 13/92] flavors_parse needs to support version input too --- .github/actions/flavors_parse/action.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/actions/flavors_parse/action.yml b/.github/actions/flavors_parse/action.yml index e8ed527a..be7de4c7 100644 --- a/.github/actions/flavors_parse/action.yml +++ b/.github/actions/flavors_parse/action.yml @@ -6,6 +6,9 @@ inputs: required: true flavors_matrix: description: "Generated GitHub workflow flavors matrix" + version: + description: GardenLinux Python library version + default: "0.10.0" outputs: matrix: description: "Flavors matrix" @@ -16,6 +19,8 @@ runs: - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@3054-move-github-workflows-py-to-python-gardenlinux-lib - id: matrix shell: bash + with: + version: ${{ inputs.version }} run: | MATRIX='${{ inputs.flavors_matrix }}' From a1527ed0e85bd89b3e5a7378dcdce130cd5dc20c Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 8 Sep 2025 16:05:18 +0200 Subject: [PATCH 14/92] with block was placed in a wrong place, now fixed --- .github/actions/flavors_parse/action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/flavors_parse/action.yml b/.github/actions/flavors_parse/action.yml index be7de4c7..8e56f8be 100644 --- a/.github/actions/flavors_parse/action.yml +++ b/.github/actions/flavors_parse/action.yml @@ -17,10 +17,10 @@ runs: using: composite steps: - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@3054-move-github-workflows-py-to-python-gardenlinux-lib - - id: matrix - shell: bash with: version: ${{ inputs.version }} + - id: matrix + shell: bash run: | MATRIX='${{ inputs.flavors_matrix }}' From c2c5d055f1f0db46d054684dc79fb7cc4d34e98c Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 8 Sep 2025 16:16:51 +0200 Subject: [PATCH 15/92] passing the version parameter --- .github/actions/setup/action.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index f7f933d2..f002adc5 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -50,5 +50,7 @@ runs: - name: Install GardenLinux Python library shell: bash + with: + version: ${{ inputs.version }} run: | pip install git+https://github.com/gardenlinux/python-gardenlinux-lib.git@${{ inputs.version }} From ab770f6ffe57d580ba9aecae743e5bc21ec5b485 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 8 Sep 2025 16:32:43 +0200 Subject: [PATCH 16/92] syntax fix --- .github/actions/setup/action.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index f002adc5..f7f933d2 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -50,7 +50,5 @@ runs: - name: Install GardenLinux Python library shell: bash - with: - version: ${{ inputs.version }} run: | pip install git+https://github.com/gardenlinux/python-gardenlinux-lib.git@${{ inputs.version }} From 3cd9870c6b897a0dde18d49baa85ffad308d1950 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 8 Sep 2025 16:37:26 +0200 Subject: [PATCH 17/92] fixed debug print --- src/gardenlinux/github/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index c051c634..8b0c0f31 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -136,7 +136,7 @@ def download_all_singles(version, commitish): for flavor in flavors: cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish)) - print(f'YTDBG // {cname=}') + print(f'YTDBG // {cname.cname=}') S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME).download_to_directory(cname.cname, local_dest_path) return [str(artifact) for artifact in local_dest_path.iterdir()] From f00621b1649843c754c2a8bc118e7530e68563b1 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 8 Sep 2025 16:45:36 +0200 Subject: [PATCH 18/92] moar debug --- src/gardenlinux/github/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 8b0c0f31..e1909545 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -136,7 +136,7 @@ def download_all_singles(version, commitish): for flavor in flavors: cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish)) - print(f'YTDBG // {cname.cname=}') + print(f'YTDBG // {flavor=} | {version=} | {commitish=} | {cname.cname=}') S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME).download_to_directory(cname.cname, local_dest_path) return [str(artifact) for artifact in local_dest_path.iterdir()] From 72d2f6f9ecbc61473b0249056853d8e13d15f295 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 8 Sep 2025 16:57:04 +0200 Subject: [PATCH 19/92] fixed potentially wrong CName constructor call --- src/gardenlinux/github/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index e1909545..88c01c8d 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -135,7 +135,7 @@ def download_all_singles(version, commitish): local_dest_path.mkdir(mode=0o755, exist_ok=True) for flavor in flavors: - cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish)) + cname = CName(cname=flavor[1], arch=flavor[0], version=version, commit_id=commitish) print(f'YTDBG // {flavor=} | {version=} | {commitish=} | {cname.cname=}') S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME).download_to_directory(cname.cname, local_dest_path) From 5cdd443dd5b2f0eecb0e9f2f94903faf82481dcb Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Tue, 9 Sep 2025 16:46:24 +0200 Subject: [PATCH 20/92] updates from "upstream" --- src/gardenlinux/github/__main__.py | 78 +++++++++++++++++++----------- 1 file changed, 51 insertions(+), 27 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 88c01c8d..73fc6b7b 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -4,7 +4,6 @@ from gardenlinux.features import CName from gardenlinux.flavors import Parser as FlavorsParser from gardenlinux.s3 import S3Artifacts -from gardenlinux.sources.kernel import get_kernel_urls from pathlib import Path from yaml.loader import SafeLoader import argparse @@ -14,11 +13,15 @@ import os import re import requests +import shutil import sys +from git import Repo import textwrap import yaml import urllib.request -import difflib + + +from gardenlinux.sources.kernel import get_kernel_urls GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME = os.environ['GITHUB_RELEASE_BUCKET_NAME'] @@ -82,29 +85,29 @@ def _azure_release_note(published_image_metadata): return output -def generate_release_note_image_ids(manifests): +def generate_release_note_image_ids(metadata_files): out = "" - for m in manifests: + for m in metadata_files: out += generate_release_note_image_id_single(m) return out -def generate_release_note_image_id_single(manifest_path): +def generate_release_note_image_id_single(metadata_file_path): """ Outputs a markdown formatted string for github release notes, containing the image-ids for the respective cloud regions """ output = "" - with open(manifest_path) as f: - manifest_data = yaml.load(f, Loader=SafeLoader) - published_image_metadata = manifest_data['published_image_metadata'] + with open(metadata_file_path) as f: + metadata = yaml.load(f, Loader=SafeLoader) + published_image_metadata = metadata['published_image_metadata'] - # No publishing metadata found in manifest, assume it was not published + # No publishing metadata found in metadata file, assume it was not published if published_image_metadata is None: return "" - platform_short_name = manifest_data['platform'] - arch = manifest_data['architecture'] + platform_short_name = metadata['platform'] + arch = metadata['architecture'] if platform_short_name in cloud_fullname_dict: platform_long_name = cloud_fullname_dict[platform_short_name] output = output + f"### {platform_long_name} ({arch})\n" @@ -126,18 +129,39 @@ def generate_release_note_image_id_single(manifest_path): return output -def download_all_singles(version, commitish): - with open("./flavors.yaml", "r") as f: - flavors_data = f.read() +def download_metadata_file(s3_artifacts, cname, artifacts_dir): + """ + Download metadata file (s3_metadata.yaml) + """ + release_object = list( + s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}") + )[0] + s3_artifacts._bucket.download_file( + release_object.key, artifacts_dir.joinpath(f"{cname}.s3_metadata.yaml") + ) + + +def download_all_metadata_files(version, commitish): + repo = Repo(".") + commit = repo.commit(commitish) + flavors_data = commit.tree["flavors.yaml"].data_stream.read().decode('utf-8') flavors = FlavorsParser(flavors_data).filter(only_publish=True) local_dest_path = Path("s3_downloads") - local_dest_path.mkdir(mode=0o755, exist_ok=True) + if local_dest_path.exists(): + shutil.rmtree(local_dest_path) + local_dest_path.mkdir(mode=0o755, exist_ok=False) + + s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) for flavor in flavors: - cname = CName(cname=flavor[1], arch=flavor[0], version=version, commit_id=commitish) + cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish)) print(f'YTDBG // {flavor=} | {version=} | {commitish=} | {cname.cname=}') - S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME).download_to_directory(cname.cname, local_dest_path) + try: + download_metadata_file(s3_artifacts, cname.cname, local_dest_path) + except IndexError: + print(f"WARNING: No artifacts found for flavor {cname.cname}, skipping...") + continue return [str(artifact) for artifact in local_dest_path.iterdir()] @@ -149,14 +173,14 @@ def get_image_object_url(bucket, object, expiration=0): return url -def generate_image_download_section(manifests, version, commitish): +def generate_image_download_section(metadata_files, version, commitish): output = "" - for manifest_path in manifests: - with open(manifest_path) as f: - manifest_data = yaml.load(f, Loader=SafeLoader) - arch = manifest_data['architecture'].upper() - platform = manifest_data['platform'] - paths = manifest_data['paths'] + for metadata_file_path in metadata_files: + with open(metadata_file_path) as f: + metadata = yaml.load(f, Loader=SafeLoader) + arch = metadata['architecture'].upper() + platform = metadata['platform'] + paths = metadata['paths'] for path in paths: if platform == 'ali' and '.qcow2' == path['suffix']: @@ -311,16 +335,16 @@ def create_github_release_notes(gardenlinux_version, commitish, dry_run=False): output += release_notes_compare_package_versions_section(gardenlinux_version, package_list) - manifests = download_all_singles(gardenlinux_version, commitish_short) + metadata_files = download_all_metadata_files(gardenlinux_version, commitish_short) - output += generate_release_note_image_ids(manifests) + output += generate_release_note_image_ids(metadata_files) output += "\n" output += "## Kernel Package direct download links\n" output += get_kernel_urls(gardenlinux_version) output += "\n" - output += generate_image_download_section(manifests, gardenlinux_version, commitish_short) + output += generate_image_download_section(metadata_files, gardenlinux_version, commitish_short) output += "\n" output += "## Kernel Module Build Container (kmodbuild) " From 821efcf16eb1fdab6cca17f36a333fdab4ab53b0 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Tue, 9 Sep 2025 17:28:29 +0200 Subject: [PATCH 21/92] missing import, logger for github module --- src/gardenlinux/github/__main__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 73fc6b7b..34b955a4 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -19,10 +19,12 @@ import textwrap import yaml import urllib.request - +import difflib from gardenlinux.sources.kernel import get_kernel_urls +from ..logger import LoggerSetup +LOGGER = LoggerSetup.get_logger("gardenlinux.github") GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME = os.environ['GITHUB_RELEASE_BUCKET_NAME'] @@ -156,7 +158,7 @@ def download_all_metadata_files(version, commitish): for flavor in flavors: cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish)) - print(f'YTDBG // {flavor=} | {version=} | {commitish=} | {cname.cname=}') + LOGGER.info(f'YTDBG // {flavor=} | {version=} | {commitish=} | {cname.cname=}') try: download_metadata_file(s3_artifacts, cname.cname, local_dest_path) except IndexError: From 23a8a147ab8264d70410e69394c05f8e061344c4 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Wed, 10 Sep 2025 09:02:07 +0200 Subject: [PATCH 22/92] switching from the custom requests-based code to python-apt --- .github/actions/setup/action.yml | 5 +++++ src/gardenlinux/sources/debian.py | 32 ++++++++++++++++--------------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index f7f933d2..e7f1d16d 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -48,6 +48,11 @@ runs: python-version: ${{ inputs.python_version }} cache: ${{ steps.env-check.outputs.package_tool }} + - name: Install python apt library + shell: bash + run: | + sudo apt install -y python3-apt + - name: Install GardenLinux Python library shell: bash run: | diff --git a/src/gardenlinux/sources/debian.py b/src/gardenlinux/sources/debian.py index fcbe9189..7aababe9 100644 --- a/src/gardenlinux/sources/debian.py +++ b/src/gardenlinux/sources/debian.py @@ -1,7 +1,5 @@ import re -import requests -import lzma -import gzip +import apt import yaml import itertools @@ -34,22 +32,26 @@ def get_package_list(repositories, architecture): '''Get Packages lists from repository and return it as dictionary. ''' packages_dict = {} + cache = apt.Cache() for repo in repositories: repo_entries = repo.split(' ') uri = repo_entries[0] suite = repo_entries[1] - for component, arch, compression in itertools.product(repo_entries[2:], ['all'] + architecture, ['.gz', '.xz', '']): - packages_url = f'{uri}/dists/{suite}/{component}/binary-{arch}/Packages{compression}' - response = requests.get(packages_url) - if response.status_code == 200: - if compression == '.xz': - packages = lzma.decompress(response.content).decode("UTF-8") - elif compression == '.gz': - packages = gzip.decompress(response.content).decode("UTF-8") - else: - packages = response.content.decode("UTF-8") - - packages_dict.update({f'{uri}-{suite}-{component}-{arch}': packages}) + components = repo_entries[2:] + for component in components: + for arch in ['all'] + architecture: + pkg_info = "" + for pkg in cache: + if not pkg.candidate: + continue + for origin in pkg.candidate.origins: + if origin.site == uri and origin.archive == suite and origin.component == component: + # Only add package if its candidate’s architecture exactly matches OR we allow 'all' + if pkg.candidate.architecture == arch or arch == 'all': + pkg_info += f"Package: {pkg.name}\nVersion: {pkg.candidate.version}\nArchitecture: {pkg.candidate.architecture}\n\n" + break # Break from origins loop once matched + if pkg_info: + packages_dict[f"{uri}-{suite}-{component}-{arch}"] = pkg_info assert len(packages_dict) != 0, "Expected to find packages" return packages_dict From 3c292e701180402dfed276ee38c9d7c65b75a91b Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Wed, 10 Sep 2025 09:18:56 +0200 Subject: [PATCH 23/92] python-apt added to the poetry project --- .github/actions/setup/action.yml | 5 ----- poetry.lock | 18 +++++++++++++++++- pyproject.toml | 1 + 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index e7f1d16d..f7f933d2 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -48,11 +48,6 @@ runs: python-version: ${{ inputs.python_version }} cache: ${{ steps.env-check.outputs.package_tool }} - - name: Install python apt library - shell: bash - run: | - sudo apt install -y python3-apt - - name: Install GardenLinux Python library shell: bash run: | diff --git a/poetry.lock b/poetry.lock index ea1a24b3..6a89704e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1041,6 +1041,22 @@ pytest = ">=6.2.5" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] +[[package]] +name = "python-apt" +version = "2.9.9" +description = "Python bindings for APT" +optional = false +python-versions = "*" +groups = ["main"] +files = [] +develop = false + +[package.source] +type = "git" +url = "https://salsa.debian.org/apt-team/python-apt" +reference = "2.9.9" +resolved_reference = "3b62c25961d289ce9fe40eee3b820f7a8eaf1c5c" + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -1704,4 +1720,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = "^3.13" -content-hash = "8a14928c4c3dabdc94084f93ecd25d2f21e7ff578e562d5777a86741372a173a" +content-hash = "2a703a43dcb8036595551777106912584445d0de42c1a33ee67ee1d5a2374ffd" diff --git a/pyproject.toml b/pyproject.toml index 9b0f5e56..2b4ebda0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,7 @@ networkx = "^3.5" oras = "^0.2.37" pygments = "^2.19.2" PyYAML = "^6.0.2" +python-apt = { git = "https://salsa.debian.org/apt-team/python-apt", tag = "2.9.9" } [tool.poetry.group.dev.dependencies] bandit = "^1.8.6" From eed5ba094b86a07bb8a30ad79457e1edc4e3d44e Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Wed, 10 Sep 2025 09:22:14 +0200 Subject: [PATCH 24/92] installing dependency for python-apt --- .github/actions/setup/action.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index f7f933d2..a178c5b9 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -48,6 +48,11 @@ runs: python-version: ${{ inputs.python_version }} cache: ${{ steps.env-check.outputs.package_tool }} + - name: Install dependency for python-apt + shell: bash + run: | + sudo apt install -y libapt-pkg-dev + - name: Install GardenLinux Python library shell: bash run: | From 355860bef57278e9c36e3bc071532b93c4c63860 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Thu, 11 Sep 2025 15:32:14 +0200 Subject: [PATCH 25/92] removed libapt from setup wf --- .github/actions/setup/action.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index a178c5b9..f7f933d2 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -48,11 +48,6 @@ runs: python-version: ${{ inputs.python_version }} cache: ${{ steps.env-check.outputs.package_tool }} - - name: Install dependency for python-apt - shell: bash - run: | - sudo apt install -y libapt-pkg-dev - - name: Install GardenLinux Python library shell: bash run: | From 114af49365de4057875f1e3ded7225405a0e51eb Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Thu, 11 Sep 2025 15:35:11 +0200 Subject: [PATCH 26/92] packages update; python-apt removed --- poetry.lock | 870 +++++++++++++++++++++++-------------------------- pyproject.toml | 1 - 2 files changed, 416 insertions(+), 455 deletions(-) diff --git a/poetry.lock b/poetry.lock index 6a89704e..a0fd0905 100644 --- a/poetry.lock +++ b/poetry.lock @@ -130,34 +130,34 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.40.17" +version = "1.40.27" description = "The AWS SDK for Python" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "boto3-1.40.17-py3-none-any.whl", hash = "sha256:2cacecd689cb51d81fbf54f84b64d0e6e922fbc18ee513c568b9f61caf4221e0"}, - {file = "boto3-1.40.17.tar.gz", hash = "sha256:e115dc87d5975d32dfa0ebaf19c39e360665317a350004fa94b03200fe853f2e"}, + {file = "boto3-1.40.27-py3-none-any.whl", hash = "sha256:397d8cde7924f03b25eb553d5ed69293697dbfa1ca29b07369b3fa2df8318eca"}, + {file = "boto3-1.40.27.tar.gz", hash = "sha256:bf1e0f5aa79dbeedff14926dc2eb1b57bc119fa9015a190a24b6cd5bf9a60e9a"}, ] [package.dependencies] -botocore = ">=1.40.17,<1.41.0" +botocore = ">=1.40.27,<1.41.0" jmespath = ">=0.7.1,<2.0.0" -s3transfer = ">=0.13.0,<0.14.0" +s3transfer = ">=0.14.0,<0.15.0" [package.extras] crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.40.17" +version = "1.40.27" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "botocore-1.40.17-py3-none-any.whl", hash = "sha256:603951935c1a741ae70236bf15725c5293074f28503e7029ad0e24ece476a342"}, - {file = "botocore-1.40.17.tar.gz", hash = "sha256:769cd04a6a612f2d48b5f456c676fd81733fab682870952f7e2887260ea6a2bc"}, + {file = "botocore-1.40.27-py3-none-any.whl", hash = "sha256:47441c94913740f5c24abf3d7f6fa534f12705e4c6669cd2e8443f3b3ca9d7ca"}, + {file = "botocore-1.40.27.tar.gz", hash = "sha256:f7cb28668751d85adc7f17929efa684640d8e2739800a86a05d4bc38f8443d1c"}, ] [package.dependencies] @@ -182,84 +182,101 @@ files = [ [[package]] name = "cffi" -version = "1.17.1" +version = "2.0.0" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "dev"] markers = "platform_python_implementation != \"PyPy\"" files = [ - {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, - {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, - {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, - {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, + {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, + {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb"}, + {file = "cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a"}, + {file = "cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743"}, + {file = "cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5"}, + {file = "cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5"}, + {file = "cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187"}, + {file = "cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18"}, + {file = "cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5"}, + {file = "cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b"}, + {file = "cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27"}, + {file = "cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75"}, + {file = "cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1"}, + {file = "cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f"}, + {file = "cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25"}, + {file = "cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4"}, + {file = "cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e"}, + {file = "cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6"}, + {file = "cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322"}, + {file = "cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a"}, + {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, + {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] [package.dependencies] -pycparser = "*" +pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} [[package]] name = "charset-normalizer" @@ -380,100 +397,100 @@ markers = {main = "platform_system == \"Windows\"", dev = "platform_system == \" [[package]] name = "coverage" -version = "7.10.3" +version = "7.10.6" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "coverage-7.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53808194afdf948c462215e9403cca27a81cf150d2f9b386aee4dab614ae2ffe"}, - {file = "coverage-7.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f4d1b837d1abf72187a61645dbf799e0d7705aa9232924946e1f57eb09a3bf00"}, - {file = "coverage-7.10.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2a90dd4505d3cc68b847ab10c5ee81822a968b5191664e8a0801778fa60459fa"}, - {file = "coverage-7.10.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d52989685ff5bf909c430e6d7f6550937bc6d6f3e6ecb303c97a86100efd4596"}, - {file = "coverage-7.10.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdb558a1d97345bde3a9f4d3e8d11c9e5611f748646e9bb61d7d612a796671b5"}, - {file = "coverage-7.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c9e6331a8f09cb1fc8bda032752af03c366870b48cce908875ba2620d20d0ad4"}, - {file = "coverage-7.10.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:992f48bf35b720e174e7fae916d943599f1a66501a2710d06c5f8104e0756ee1"}, - {file = "coverage-7.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c5595fc4ad6a39312c786ec3326d7322d0cf10e3ac6a6df70809910026d67cfb"}, - {file = "coverage-7.10.3-cp310-cp310-win32.whl", hash = "sha256:9e92fa1f2bd5a57df9d00cf9ce1eb4ef6fccca4ceabec1c984837de55329db34"}, - {file = "coverage-7.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:b96524d6e4a3ce6a75c56bb15dbd08023b0ae2289c254e15b9fbdddf0c577416"}, - {file = "coverage-7.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2ff2e2afdf0d51b9b8301e542d9c21a8d084fd23d4c8ea2b3a1b3c96f5f7397"}, - {file = "coverage-7.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:18ecc5d1b9a8c570f6c9b808fa9a2b16836b3dd5414a6d467ae942208b095f85"}, - {file = "coverage-7.10.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1af4461b25fe92889590d438905e1fc79a95680ec2a1ff69a591bb3fdb6c7157"}, - {file = "coverage-7.10.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3966bc9a76b09a40dc6063c8b10375e827ea5dfcaffae402dd65953bef4cba54"}, - {file = "coverage-7.10.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:205a95b87ef4eb303b7bc5118b47b6b6604a644bcbdb33c336a41cfc0a08c06a"}, - {file = "coverage-7.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b3801b79fb2ad61e3c7e2554bab754fc5f105626056980a2b9cf3aef4f13f84"}, - {file = "coverage-7.10.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0dc69c60224cda33d384572da945759756e3f06b9cdac27f302f53961e63160"}, - {file = "coverage-7.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a83d4f134bab2c7ff758e6bb1541dd72b54ba295ced6a63d93efc2e20cb9b124"}, - {file = "coverage-7.10.3-cp311-cp311-win32.whl", hash = "sha256:54e409dd64e5302b2a8fdf44ec1c26f47abd1f45a2dcf67bd161873ee05a59b8"}, - {file = "coverage-7.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:30c601610a9b23807c5e9e2e442054b795953ab85d525c3de1b1b27cebeb2117"}, - {file = "coverage-7.10.3-cp311-cp311-win_arm64.whl", hash = "sha256:dabe662312a97958e932dee056f2659051d822552c0b866823e8ba1c2fe64770"}, - {file = "coverage-7.10.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:449c1e2d3a84d18bd204258a897a87bc57380072eb2aded6a5b5226046207b42"}, - {file = "coverage-7.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d4f9ce50b9261ad196dc2b2e9f1fbbee21651b54c3097a25ad783679fd18294"}, - {file = "coverage-7.10.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4dd4564207b160d0d45c36a10bc0a3d12563028e8b48cd6459ea322302a156d7"}, - {file = "coverage-7.10.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5ca3c9530ee072b7cb6a6ea7b640bcdff0ad3b334ae9687e521e59f79b1d0437"}, - {file = "coverage-7.10.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b6df359e59fa243c9925ae6507e27f29c46698359f45e568fd51b9315dbbe587"}, - {file = "coverage-7.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a181e4c2c896c2ff64c6312db3bda38e9ade2e1aa67f86a5628ae85873786cea"}, - {file = "coverage-7.10.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a374d4e923814e8b72b205ef6b3d3a647bb50e66f3558582eda074c976923613"}, - {file = "coverage-7.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:daeefff05993e5e8c6e7499a8508e7bd94502b6b9a9159c84fd1fe6bce3151cb"}, - {file = "coverage-7.10.3-cp312-cp312-win32.whl", hash = "sha256:187ecdcac21f9636d570e419773df7bd2fda2e7fa040f812e7f95d0bddf5f79a"}, - {file = "coverage-7.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:4a50ad2524ee7e4c2a95e60d2b0b83283bdfc745fe82359d567e4f15d3823eb5"}, - {file = "coverage-7.10.3-cp312-cp312-win_arm64.whl", hash = "sha256:c112f04e075d3495fa3ed2200f71317da99608cbb2e9345bdb6de8819fc30571"}, - {file = "coverage-7.10.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b99e87304ffe0eb97c5308447328a584258951853807afdc58b16143a530518a"}, - {file = "coverage-7.10.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4af09c7574d09afbc1ea7da9dcea23665c01f3bc1b1feb061dac135f98ffc53a"}, - {file = "coverage-7.10.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:488e9b50dc5d2aa9521053cfa706209e5acf5289e81edc28291a24f4e4488f46"}, - {file = "coverage-7.10.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:913ceddb4289cbba3a310704a424e3fb7aac2bc0c3a23ea473193cb290cf17d4"}, - {file = "coverage-7.10.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b1f91cbc78c7112ab84ed2a8defbccd90f888fcae40a97ddd6466b0bec6ae8a"}, - {file = "coverage-7.10.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0bac054d45af7cd938834b43a9878b36ea92781bcb009eab040a5b09e9927e3"}, - {file = "coverage-7.10.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fe72cbdd12d9e0f4aca873fa6d755e103888a7f9085e4a62d282d9d5b9f7928c"}, - {file = "coverage-7.10.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c1e2e927ab3eadd7c244023927d646e4c15c65bb2ac7ae3c3e9537c013700d21"}, - {file = "coverage-7.10.3-cp313-cp313-win32.whl", hash = "sha256:24d0c13de473b04920ddd6e5da3c08831b1170b8f3b17461d7429b61cad59ae0"}, - {file = "coverage-7.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:3564aae76bce4b96e2345cf53b4c87e938c4985424a9be6a66ee902626edec4c"}, - {file = "coverage-7.10.3-cp313-cp313-win_arm64.whl", hash = "sha256:f35580f19f297455f44afcd773c9c7a058e52eb6eb170aa31222e635f2e38b87"}, - {file = "coverage-7.10.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07009152f497a0464ffdf2634586787aea0e69ddd023eafb23fc38267db94b84"}, - {file = "coverage-7.10.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dd2ba5f0c7e7e8cc418be2f0c14c4d9e3f08b8fb8e4c0f83c2fe87d03eb655e"}, - {file = "coverage-7.10.3-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1ae22b97003c74186e034a93e4f946c75fad8c0ce8d92fbbc168b5e15ee2841f"}, - {file = "coverage-7.10.3-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:eb329f1046888a36b1dc35504d3029e1dd5afe2196d94315d18c45ee380f67d5"}, - {file = "coverage-7.10.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce01048199a91f07f96ca3074b0c14021f4fe7ffd29a3e6a188ac60a5c3a4af8"}, - {file = "coverage-7.10.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:08b989a06eb9dfacf96d42b7fb4c9a22bafa370d245dc22fa839f2168c6f9fa1"}, - {file = "coverage-7.10.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:669fe0d4e69c575c52148511029b722ba8d26e8a3129840c2ce0522e1452b256"}, - {file = "coverage-7.10.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3262d19092771c83f3413831d9904b1ccc5f98da5de4ffa4ad67f5b20c7aaf7b"}, - {file = "coverage-7.10.3-cp313-cp313t-win32.whl", hash = "sha256:cc0ee4b2ccd42cab7ee6be46d8a67d230cb33a0a7cd47a58b587a7063b6c6b0e"}, - {file = "coverage-7.10.3-cp313-cp313t-win_amd64.whl", hash = "sha256:03db599f213341e2960430984e04cf35fb179724e052a3ee627a068653cf4a7c"}, - {file = "coverage-7.10.3-cp313-cp313t-win_arm64.whl", hash = "sha256:46eae7893ba65f53c71284585a262f083ef71594f05ec5c85baf79c402369098"}, - {file = "coverage-7.10.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:bce8b8180912914032785850d8f3aacb25ec1810f5f54afc4a8b114e7a9b55de"}, - {file = "coverage-7.10.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07790b4b37d56608536f7c1079bd1aa511567ac2966d33d5cec9cf520c50a7c8"}, - {file = "coverage-7.10.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e79367ef2cd9166acedcbf136a458dfe9a4a2dd4d1ee95738fb2ee581c56f667"}, - {file = "coverage-7.10.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:419d2a0f769f26cb1d05e9ccbc5eab4cb5d70231604d47150867c07822acbdf4"}, - {file = "coverage-7.10.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee221cf244757cdc2ac882e3062ab414b8464ad9c884c21e878517ea64b3fa26"}, - {file = "coverage-7.10.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c2079d8cdd6f7373d628e14b3357f24d1db02c9dc22e6a007418ca7a2be0435a"}, - {file = "coverage-7.10.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:bd8df1f83c0703fa3ca781b02d36f9ec67ad9cb725b18d486405924f5e4270bd"}, - {file = "coverage-7.10.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6b4e25e0fa335c8aa26e42a52053f3786a61cc7622b4d54ae2dad994aa754fec"}, - {file = "coverage-7.10.3-cp314-cp314-win32.whl", hash = "sha256:d7c3d02c2866deb217dce664c71787f4b25420ea3eaf87056f44fb364a3528f5"}, - {file = "coverage-7.10.3-cp314-cp314-win_amd64.whl", hash = "sha256:9c8916d44d9e0fe6cdb2227dc6b0edd8bc6c8ef13438bbbf69af7482d9bb9833"}, - {file = "coverage-7.10.3-cp314-cp314-win_arm64.whl", hash = "sha256:1007d6a2b3cf197c57105cc1ba390d9ff7f0bee215ced4dea530181e49c65ab4"}, - {file = "coverage-7.10.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:ebc8791d346410d096818788877d675ca55c91db87d60e8f477bd41c6970ffc6"}, - {file = "coverage-7.10.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f4e4d8e75f6fd3c6940ebeed29e3d9d632e1f18f6fb65d33086d99d4d073241"}, - {file = "coverage-7.10.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:24581ed69f132b6225a31b0228ae4885731cddc966f8a33fe5987288bdbbbd5e"}, - {file = "coverage-7.10.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec151569ddfccbf71bac8c422dce15e176167385a00cd86e887f9a80035ce8a5"}, - {file = "coverage-7.10.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2ae8e7c56290b908ee817200c0b65929b8050bc28530b131fe7c6dfee3e7d86b"}, - {file = "coverage-7.10.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5fb742309766d7e48e9eb4dc34bc95a424707bc6140c0e7d9726e794f11b92a0"}, - {file = "coverage-7.10.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:c65e2a5b32fbe1e499f1036efa6eb9cb4ea2bf6f7168d0e7a5852f3024f471b1"}, - {file = "coverage-7.10.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d48d2cb07d50f12f4f18d2bb75d9d19e3506c26d96fffabf56d22936e5ed8f7c"}, - {file = "coverage-7.10.3-cp314-cp314t-win32.whl", hash = "sha256:dec0d9bc15ee305e09fe2cd1911d3f0371262d3cfdae05d79515d8cb712b4869"}, - {file = "coverage-7.10.3-cp314-cp314t-win_amd64.whl", hash = "sha256:424ea93a323aa0f7f01174308ea78bde885c3089ec1bef7143a6d93c3e24ef64"}, - {file = "coverage-7.10.3-cp314-cp314t-win_arm64.whl", hash = "sha256:f5983c132a62d93d71c9ef896a0b9bf6e6828d8d2ea32611f58684fba60bba35"}, - {file = "coverage-7.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:da749daa7e141985487e1ff90a68315b0845930ed53dc397f4ae8f8bab25b551"}, - {file = "coverage-7.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3126fb6a47d287f461d9b1aa5d1a8c97034d1dffb4f452f2cf211289dae74ef"}, - {file = "coverage-7.10.3-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3da794db13cc27ca40e1ec8127945b97fab78ba548040047d54e7bfa6d442dca"}, - {file = "coverage-7.10.3-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4e27bebbd184ef8d1c1e092b74a2b7109dcbe2618dce6e96b1776d53b14b3fe8"}, - {file = "coverage-7.10.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8fd4ee2580b9fefbd301b4f8f85b62ac90d1e848bea54f89a5748cf132782118"}, - {file = "coverage-7.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6999920bdd73259ce11cabfc1307484f071ecc6abdb2ca58d98facbcefc70f16"}, - {file = "coverage-7.10.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c3623f929db885fab100cb88220a5b193321ed37e03af719efdbaf5d10b6e227"}, - {file = "coverage-7.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:25b902c5e15dea056485d782e420bb84621cc08ee75d5131ecb3dbef8bd1365f"}, - {file = "coverage-7.10.3-cp39-cp39-win32.whl", hash = "sha256:f930a4d92b004b643183451fe9c8fe398ccf866ed37d172ebaccfd443a097f61"}, - {file = "coverage-7.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:08e638a93c8acba13c7842953f92a33d52d73e410329acd472280d2a21a6c0e1"}, - {file = "coverage-7.10.3-py3-none-any.whl", hash = "sha256:416a8d74dc0adfd33944ba2f405897bab87b7e9e84a391e09d241956bd953ce1"}, - {file = "coverage-7.10.3.tar.gz", hash = "sha256:812ba9250532e4a823b070b0420a36499859542335af3dca8f47fc6aa1a05619"}, + {file = "coverage-7.10.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:70e7bfbd57126b5554aa482691145f798d7df77489a177a6bef80de78860a356"}, + {file = "coverage-7.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e41be6f0f19da64af13403e52f2dec38bbc2937af54df8ecef10850ff8d35301"}, + {file = "coverage-7.10.6-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c61fc91ab80b23f5fddbee342d19662f3d3328173229caded831aa0bd7595460"}, + {file = "coverage-7.10.6-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10356fdd33a7cc06e8051413140bbdc6f972137508a3572e3f59f805cd2832fd"}, + {file = "coverage-7.10.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80b1695cf7c5ebe7b44bf2521221b9bb8cdf69b1f24231149a7e3eb1ae5fa2fb"}, + {file = "coverage-7.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2e4c33e6378b9d52d3454bd08847a8651f4ed23ddbb4a0520227bd346382bbc6"}, + {file = "coverage-7.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c8a3ec16e34ef980a46f60dc6ad86ec60f763c3f2fa0db6d261e6e754f72e945"}, + {file = "coverage-7.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7d79dabc0a56f5af990cc6da9ad1e40766e82773c075f09cc571e2076fef882e"}, + {file = "coverage-7.10.6-cp310-cp310-win32.whl", hash = "sha256:86b9b59f2b16e981906e9d6383eb6446d5b46c278460ae2c36487667717eccf1"}, + {file = "coverage-7.10.6-cp310-cp310-win_amd64.whl", hash = "sha256:e132b9152749bd33534e5bd8565c7576f135f157b4029b975e15ee184325f528"}, + {file = "coverage-7.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c706db3cabb7ceef779de68270150665e710b46d56372455cd741184f3868d8f"}, + {file = "coverage-7.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e0c38dc289e0508ef68ec95834cb5d2e96fdbe792eaccaa1bccac3966bbadcc"}, + {file = "coverage-7.10.6-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:752a3005a1ded28f2f3a6e8787e24f28d6abe176ca64677bcd8d53d6fe2ec08a"}, + {file = "coverage-7.10.6-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:689920ecfd60f992cafca4f5477d55720466ad2c7fa29bb56ac8d44a1ac2b47a"}, + {file = "coverage-7.10.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec98435796d2624d6905820a42f82149ee9fc4f2d45c2c5bc5a44481cc50db62"}, + {file = "coverage-7.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b37201ce4a458c7a758ecc4efa92fa8ed783c66e0fa3c42ae19fc454a0792153"}, + {file = "coverage-7.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2904271c80898663c810a6b067920a61dd8d38341244a3605bd31ab55250dad5"}, + {file = "coverage-7.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5aea98383463d6e1fa4e95416d8de66f2d0cb588774ee20ae1b28df826bcb619"}, + {file = "coverage-7.10.6-cp311-cp311-win32.whl", hash = "sha256:e3fb1fa01d3598002777dd259c0c2e6d9d5e10e7222976fc8e03992f972a2cba"}, + {file = "coverage-7.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:f35ed9d945bece26553d5b4c8630453169672bea0050a564456eb88bdffd927e"}, + {file = "coverage-7.10.6-cp311-cp311-win_arm64.whl", hash = "sha256:99e1a305c7765631d74b98bf7dbf54eeea931f975e80f115437d23848ee8c27c"}, + {file = "coverage-7.10.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5b2dd6059938063a2c9fee1af729d4f2af28fd1a545e9b7652861f0d752ebcea"}, + {file = "coverage-7.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:388d80e56191bf846c485c14ae2bc8898aa3124d9d35903fef7d907780477634"}, + {file = "coverage-7.10.6-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:90cb5b1a4670662719591aa92d0095bb41714970c0b065b02a2610172dbf0af6"}, + {file = "coverage-7.10.6-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:961834e2f2b863a0e14260a9a273aff07ff7818ab6e66d2addf5628590c628f9"}, + {file = "coverage-7.10.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf9a19f5012dab774628491659646335b1928cfc931bf8d97b0d5918dd58033c"}, + {file = "coverage-7.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99c4283e2a0e147b9c9cc6bc9c96124de9419d6044837e9799763a0e29a7321a"}, + {file = "coverage-7.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:282b1b20f45df57cc508c1e033403f02283adfb67d4c9c35a90281d81e5c52c5"}, + {file = "coverage-7.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cdbe264f11afd69841bd8c0d83ca10b5b32853263ee62e6ac6a0ab63895f972"}, + {file = "coverage-7.10.6-cp312-cp312-win32.whl", hash = "sha256:a517feaf3a0a3eca1ee985d8373135cfdedfbba3882a5eab4362bda7c7cf518d"}, + {file = "coverage-7.10.6-cp312-cp312-win_amd64.whl", hash = "sha256:856986eadf41f52b214176d894a7de05331117f6035a28ac0016c0f63d887629"}, + {file = "coverage-7.10.6-cp312-cp312-win_arm64.whl", hash = "sha256:acf36b8268785aad739443fa2780c16260ee3fa09d12b3a70f772ef100939d80"}, + {file = "coverage-7.10.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ffea0575345e9ee0144dfe5701aa17f3ba546f8c3bb48db62ae101afb740e7d6"}, + {file = "coverage-7.10.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:95d91d7317cde40a1c249d6b7382750b7e6d86fad9d8eaf4fa3f8f44cf171e80"}, + {file = "coverage-7.10.6-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3e23dd5408fe71a356b41baa82892772a4cefcf758f2ca3383d2aa39e1b7a003"}, + {file = "coverage-7.10.6-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0f3f56e4cb573755e96a16501a98bf211f100463d70275759e73f3cbc00d4f27"}, + {file = "coverage-7.10.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:db4a1d897bbbe7339946ffa2fe60c10cc81c43fab8b062d3fcb84188688174a4"}, + {file = "coverage-7.10.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d8fd7879082953c156d5b13c74aa6cca37f6a6f4747b39538504c3f9c63d043d"}, + {file = "coverage-7.10.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:28395ca3f71cd103b8c116333fa9db867f3a3e1ad6a084aa3725ae002b6583bc"}, + {file = "coverage-7.10.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:61c950fc33d29c91b9e18540e1aed7d9f6787cc870a3e4032493bbbe641d12fc"}, + {file = "coverage-7.10.6-cp313-cp313-win32.whl", hash = "sha256:160c00a5e6b6bdf4e5984b0ef21fc860bc94416c41b7df4d63f536d17c38902e"}, + {file = "coverage-7.10.6-cp313-cp313-win_amd64.whl", hash = "sha256:628055297f3e2aa181464c3808402887643405573eb3d9de060d81531fa79d32"}, + {file = "coverage-7.10.6-cp313-cp313-win_arm64.whl", hash = "sha256:df4ec1f8540b0bcbe26ca7dd0f541847cc8a108b35596f9f91f59f0c060bfdd2"}, + {file = "coverage-7.10.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c9a8b7a34a4de3ed987f636f71881cd3b8339f61118b1aa311fbda12741bff0b"}, + {file = "coverage-7.10.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dd5af36092430c2b075cee966719898f2ae87b636cefb85a653f1d0ba5d5393"}, + {file = "coverage-7.10.6-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b0353b0f0850d49ada66fdd7d0c7cdb0f86b900bb9e367024fd14a60cecc1e27"}, + {file = "coverage-7.10.6-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d6b9ae13d5d3e8aeca9ca94198aa7b3ebbc5acfada557d724f2a1f03d2c0b0df"}, + {file = "coverage-7.10.6-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:675824a363cc05781b1527b39dc2587b8984965834a748177ee3c37b64ffeafb"}, + {file = "coverage-7.10.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:692d70ea725f471a547c305f0d0fc6a73480c62fb0da726370c088ab21aed282"}, + {file = "coverage-7.10.6-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:851430a9a361c7a8484a36126d1d0ff8d529d97385eacc8dfdc9bfc8c2d2cbe4"}, + {file = "coverage-7.10.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d9369a23186d189b2fc95cc08b8160ba242057e887d766864f7adf3c46b2df21"}, + {file = "coverage-7.10.6-cp313-cp313t-win32.whl", hash = "sha256:92be86fcb125e9bda0da7806afd29a3fd33fdf58fba5d60318399adf40bf37d0"}, + {file = "coverage-7.10.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6b3039e2ca459a70c79523d39347d83b73f2f06af5624905eba7ec34d64d80b5"}, + {file = "coverage-7.10.6-cp313-cp313t-win_arm64.whl", hash = "sha256:3fb99d0786fe17b228eab663d16bee2288e8724d26a199c29325aac4b0319b9b"}, + {file = "coverage-7.10.6-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6008a021907be8c4c02f37cdc3ffb258493bdebfeaf9a839f9e71dfdc47b018e"}, + {file = "coverage-7.10.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5e75e37f23eb144e78940b40395b42f2321951206a4f50e23cfd6e8a198d3ceb"}, + {file = "coverage-7.10.6-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0f7cb359a448e043c576f0da00aa8bfd796a01b06aa610ca453d4dde09cc1034"}, + {file = "coverage-7.10.6-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c68018e4fc4e14b5668f1353b41ccf4bc83ba355f0e1b3836861c6f042d89ac1"}, + {file = "coverage-7.10.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cd4b2b0707fc55afa160cd5fc33b27ccbf75ca11d81f4ec9863d5793fc6df56a"}, + {file = "coverage-7.10.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4cec13817a651f8804a86e4f79d815b3b28472c910e099e4d5a0e8a3b6a1d4cb"}, + {file = "coverage-7.10.6-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f2a6a8e06bbda06f78739f40bfb56c45d14eb8249d0f0ea6d4b3d48e1f7c695d"}, + {file = "coverage-7.10.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:081b98395ced0d9bcf60ada7661a0b75f36b78b9d7e39ea0790bb4ed8da14747"}, + {file = "coverage-7.10.6-cp314-cp314-win32.whl", hash = "sha256:6937347c5d7d069ee776b2bf4e1212f912a9f1f141a429c475e6089462fcecc5"}, + {file = "coverage-7.10.6-cp314-cp314-win_amd64.whl", hash = "sha256:adec1d980fa07e60b6ef865f9e5410ba760e4e1d26f60f7e5772c73b9a5b0713"}, + {file = "coverage-7.10.6-cp314-cp314-win_arm64.whl", hash = "sha256:a80f7aef9535442bdcf562e5a0d5a5538ce8abe6bb209cfbf170c462ac2c2a32"}, + {file = "coverage-7.10.6-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0de434f4fbbe5af4fa7989521c655c8c779afb61c53ab561b64dcee6149e4c65"}, + {file = "coverage-7.10.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6e31b8155150c57e5ac43ccd289d079eb3f825187d7c66e755a055d2c85794c6"}, + {file = "coverage-7.10.6-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:98cede73eb83c31e2118ae8d379c12e3e42736903a8afcca92a7218e1f2903b0"}, + {file = "coverage-7.10.6-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f863c08f4ff6b64fa8045b1e3da480f5374779ef187f07b82e0538c68cb4ff8e"}, + {file = "coverage-7.10.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b38261034fda87be356f2c3f42221fdb4171c3ce7658066ae449241485390d5"}, + {file = "coverage-7.10.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e93b1476b79eae849dc3872faeb0bf7948fd9ea34869590bc16a2a00b9c82a7"}, + {file = "coverage-7.10.6-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ff8a991f70f4c0cf53088abf1e3886edcc87d53004c7bb94e78650b4d3dac3b5"}, + {file = "coverage-7.10.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ac765b026c9f33044419cbba1da913cfb82cca1b60598ac1c7a5ed6aac4621a0"}, + {file = "coverage-7.10.6-cp314-cp314t-win32.whl", hash = "sha256:441c357d55f4936875636ef2cfb3bee36e466dcf50df9afbd398ce79dba1ebb7"}, + {file = "coverage-7.10.6-cp314-cp314t-win_amd64.whl", hash = "sha256:073711de3181b2e204e4870ac83a7c4853115b42e9cd4d145f2231e12d670930"}, + {file = "coverage-7.10.6-cp314-cp314t-win_arm64.whl", hash = "sha256:137921f2bac5559334ba66122b753db6dc5d1cf01eb7b64eb412bb0d064ef35b"}, + {file = "coverage-7.10.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90558c35af64971d65fbd935c32010f9a2f52776103a259f1dee865fe8259352"}, + {file = "coverage-7.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8953746d371e5695405806c46d705a3cd170b9cc2b9f93953ad838f6c1e58612"}, + {file = "coverage-7.10.6-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c83f6afb480eae0313114297d29d7c295670a41c11b274e6bca0c64540c1ce7b"}, + {file = "coverage-7.10.6-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7eb68d356ba0cc158ca535ce1381dbf2037fa8cb5b1ae5ddfc302e7317d04144"}, + {file = "coverage-7.10.6-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5b15a87265e96307482746d86995f4bff282f14b027db75469c446da6127433b"}, + {file = "coverage-7.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fc53ba868875bfbb66ee447d64d6413c2db91fddcfca57025a0e7ab5b07d5862"}, + {file = "coverage-7.10.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:efeda443000aa23f276f4df973cb82beca682fd800bb119d19e80504ffe53ec2"}, + {file = "coverage-7.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9702b59d582ff1e184945d8b501ffdd08d2cee38d93a2206aa5f1365ce0b8d78"}, + {file = "coverage-7.10.6-cp39-cp39-win32.whl", hash = "sha256:2195f8e16ba1a44651ca684db2ea2b2d4b5345da12f07d9c22a395202a05b23c"}, + {file = "coverage-7.10.6-cp39-cp39-win_amd64.whl", hash = "sha256:f32ff80e7ef6a5b5b606ea69a36e97b219cd9dc799bcf2963018a4d8f788cfbf"}, + {file = "coverage-7.10.6-py3-none-any.whl", hash = "sha256:92c4ecf6bf11b2e85fd4d8204814dc26e6a19f0c9d938c207c5cb0eadfcabbe3"}, + {file = "coverage-7.10.6.tar.gz", hash = "sha256:f644a3ae5933a552a29dbb9aa2f90c677a875f80ebea028e5a52a4f429044b90"}, ] [package.extras] @@ -481,49 +498,49 @@ toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "cryptography" -version = "45.0.6" +version = "45.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = "!=3.9.0,!=3.9.1,>=3.7" groups = ["main", "dev"] files = [ - {file = "cryptography-45.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:048e7ad9e08cf4c0ab07ff7f36cc3115924e22e2266e034450a890d9e312dd74"}, - {file = "cryptography-45.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44647c5d796f5fc042bbc6d61307d04bf29bccb74d188f18051b635f20a9c75f"}, - {file = "cryptography-45.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e40b80ecf35ec265c452eea0ba94c9587ca763e739b8e559c128d23bff7ebbbf"}, - {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:00e8724bdad672d75e6f069b27970883179bd472cd24a63f6e620ca7e41cc0c5"}, - {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a3085d1b319d35296176af31c90338eeb2ddac8104661df79f80e1d9787b8b2"}, - {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1b7fa6a1c1188c7ee32e47590d16a5a0646270921f8020efc9a511648e1b2e08"}, - {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:275ba5cc0d9e320cd70f8e7b96d9e59903c815ca579ab96c1e37278d231fc402"}, - {file = "cryptography-45.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f4028f29a9f38a2025abedb2e409973709c660d44319c61762202206ed577c42"}, - {file = "cryptography-45.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ee411a1b977f40bd075392c80c10b58025ee5c6b47a822a33c1198598a7a5f05"}, - {file = "cryptography-45.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e2a21a8eda2d86bb604934b6b37691585bd095c1f788530c1fcefc53a82b3453"}, - {file = "cryptography-45.0.6-cp311-abi3-win32.whl", hash = "sha256:d063341378d7ee9c91f9d23b431a3502fc8bfacd54ef0a27baa72a0843b29159"}, - {file = "cryptography-45.0.6-cp311-abi3-win_amd64.whl", hash = "sha256:833dc32dfc1e39b7376a87b9a6a4288a10aae234631268486558920029b086ec"}, - {file = "cryptography-45.0.6-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:3436128a60a5e5490603ab2adbabc8763613f638513ffa7d311c900a8349a2a0"}, - {file = "cryptography-45.0.6-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0d9ef57b6768d9fa58e92f4947cea96ade1233c0e236db22ba44748ffedca394"}, - {file = "cryptography-45.0.6-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea3c42f2016a5bbf71825537c2ad753f2870191134933196bee408aac397b3d9"}, - {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:20ae4906a13716139d6d762ceb3e0e7e110f7955f3bc3876e3a07f5daadec5f3"}, - {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dac5ec199038b8e131365e2324c03d20e97fe214af051d20c49db129844e8b3"}, - {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:18f878a34b90d688982e43f4b700408b478102dd58b3e39de21b5ebf6509c301"}, - {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5bd6020c80c5b2b2242d6c48487d7b85700f5e0038e67b29d706f98440d66eb5"}, - {file = "cryptography-45.0.6-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:eccddbd986e43014263eda489abbddfbc287af5cddfd690477993dbb31e31016"}, - {file = "cryptography-45.0.6-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:550ae02148206beb722cfe4ef0933f9352bab26b087af00e48fdfb9ade35c5b3"}, - {file = "cryptography-45.0.6-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5b64e668fc3528e77efa51ca70fadcd6610e8ab231e3e06ae2bab3b31c2b8ed9"}, - {file = "cryptography-45.0.6-cp37-abi3-win32.whl", hash = "sha256:780c40fb751c7d2b0c6786ceee6b6f871e86e8718a8ff4bc35073ac353c7cd02"}, - {file = "cryptography-45.0.6-cp37-abi3-win_amd64.whl", hash = "sha256:20d15aed3ee522faac1a39fbfdfee25d17b1284bafd808e1640a74846d7c4d1b"}, - {file = "cryptography-45.0.6-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:705bb7c7ecc3d79a50f236adda12ca331c8e7ecfbea51edd931ce5a7a7c4f012"}, - {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:826b46dae41a1155a0c0e66fafba43d0ede1dc16570b95e40c4d83bfcf0a451d"}, - {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cc4d66f5dc4dc37b89cfef1bd5044387f7a1f6f0abb490815628501909332d5d"}, - {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f68f833a9d445cc49f01097d95c83a850795921b3f7cc6488731e69bde3288da"}, - {file = "cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:3b5bf5267e98661b9b888a9250d05b063220dfa917a8203744454573c7eb79db"}, - {file = "cryptography-45.0.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2384f2ab18d9be88a6e4f8972923405e2dbb8d3e16c6b43f15ca491d7831bd18"}, - {file = "cryptography-45.0.6-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fc022c1fa5acff6def2fc6d7819bbbd31ccddfe67d075331a65d9cfb28a20983"}, - {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3de77e4df42ac8d4e4d6cdb342d989803ad37707cf8f3fbf7b088c9cbdd46427"}, - {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:599c8d7df950aa68baa7e98f7b73f4f414c9f02d0e8104a30c0182a07732638b"}, - {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:31a2b9a10530a1cb04ffd6aa1cd4d3be9ed49f7d77a4dafe198f3b382f41545c"}, - {file = "cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:e5b3dda1b00fb41da3af4c5ef3f922a200e33ee5ba0f0bc9ecf0b0c173958385"}, - {file = "cryptography-45.0.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:629127cfdcdc6806dfe234734d7cb8ac54edaf572148274fa377a7d3405b0043"}, - {file = "cryptography-45.0.6.tar.gz", hash = "sha256:5c966c732cf6e4a276ce83b6e4c729edda2df6929083a952cc7da973c539c719"}, + {file = "cryptography-45.0.7-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:3be4f21c6245930688bd9e162829480de027f8bf962ede33d4f8ba7d67a00cee"}, + {file = "cryptography-45.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:67285f8a611b0ebc0857ced2081e30302909f571a46bfa7a3cc0ad303fe015c6"}, + {file = "cryptography-45.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:577470e39e60a6cd7780793202e63536026d9b8641de011ed9d8174da9ca5339"}, + {file = "cryptography-45.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4bd3e5c4b9682bc112d634f2c6ccc6736ed3635fc3319ac2bb11d768cc5a00d8"}, + {file = "cryptography-45.0.7-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:465ccac9d70115cd4de7186e60cfe989de73f7bb23e8a7aa45af18f7412e75bf"}, + {file = "cryptography-45.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:16ede8a4f7929b4b7ff3642eba2bf79aa1d71f24ab6ee443935c0d269b6bc513"}, + {file = "cryptography-45.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8978132287a9d3ad6b54fcd1e08548033cc09dc6aacacb6c004c73c3eb5d3ac3"}, + {file = "cryptography-45.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b6a0e535baec27b528cb07a119f321ac024592388c5681a5ced167ae98e9fff3"}, + {file = "cryptography-45.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:a24ee598d10befaec178efdff6054bc4d7e883f615bfbcd08126a0f4931c83a6"}, + {file = "cryptography-45.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:fa26fa54c0a9384c27fcdc905a2fb7d60ac6e47d14bc2692145f2b3b1e2cfdbd"}, + {file = "cryptography-45.0.7-cp311-abi3-win32.whl", hash = "sha256:bef32a5e327bd8e5af915d3416ffefdbe65ed975b646b3805be81b23580b57b8"}, + {file = "cryptography-45.0.7-cp311-abi3-win_amd64.whl", hash = "sha256:3808e6b2e5f0b46d981c24d79648e5c25c35e59902ea4391a0dcb3e667bf7443"}, + {file = "cryptography-45.0.7-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bfb4c801f65dd61cedfc61a83732327fafbac55a47282e6f26f073ca7a41c3b2"}, + {file = "cryptography-45.0.7-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:81823935e2f8d476707e85a78a405953a03ef7b7b4f55f93f7c2d9680e5e0691"}, + {file = "cryptography-45.0.7-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3994c809c17fc570c2af12c9b840d7cea85a9fd3e5c0e0491f4fa3c029216d59"}, + {file = "cryptography-45.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:dad43797959a74103cb59c5dac71409f9c27d34c8a05921341fb64ea8ccb1dd4"}, + {file = "cryptography-45.0.7-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ce7a453385e4c4693985b4a4a3533e041558851eae061a58a5405363b098fcd3"}, + {file = "cryptography-45.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b04f85ac3a90c227b6e5890acb0edbaf3140938dbecf07bff618bf3638578cf1"}, + {file = "cryptography-45.0.7-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:48c41a44ef8b8c2e80ca4527ee81daa4c527df3ecbc9423c41a420a9559d0e27"}, + {file = "cryptography-45.0.7-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f3df7b3d0f91b88b2106031fd995802a2e9ae13e02c36c1fc075b43f420f3a17"}, + {file = "cryptography-45.0.7-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dd342f085542f6eb894ca00ef70236ea46070c8a13824c6bde0dfdcd36065b9b"}, + {file = "cryptography-45.0.7-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1993a1bb7e4eccfb922b6cd414f072e08ff5816702a0bdb8941c247a6b1b287c"}, + {file = "cryptography-45.0.7-cp37-abi3-win32.whl", hash = "sha256:18fcf70f243fe07252dcb1b268a687f2358025ce32f9f88028ca5c364b123ef5"}, + {file = "cryptography-45.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:7285a89df4900ed3bfaad5679b1e668cb4b38a8de1ccbfc84b05f34512da0a90"}, + {file = "cryptography-45.0.7-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:de58755d723e86175756f463f2f0bddd45cc36fbd62601228a3f8761c9f58252"}, + {file = "cryptography-45.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a20e442e917889d1a6b3c570c9e3fa2fdc398c20868abcea268ea33c024c4083"}, + {file = "cryptography-45.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:258e0dff86d1d891169b5af222d362468a9570e2532923088658aa866eb11130"}, + {file = "cryptography-45.0.7-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d97cf502abe2ab9eff8bd5e4aca274da8d06dd3ef08b759a8d6143f4ad65d4b4"}, + {file = "cryptography-45.0.7-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:c987dad82e8c65ebc985f5dae5e74a3beda9d0a2a4daf8a1115f3772b59e5141"}, + {file = "cryptography-45.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c13b1e3afd29a5b3b2656257f14669ca8fa8d7956d509926f0b130b600b50ab7"}, + {file = "cryptography-45.0.7-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a862753b36620af6fc54209264f92c716367f2f0ff4624952276a6bbd18cbde"}, + {file = "cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:06ce84dc14df0bf6ea84666f958e6080cdb6fe1231be2a51f3fc1267d9f3fb34"}, + {file = "cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d0c5c6bac22b177bf8da7435d9d27a6834ee130309749d162b26c3105c0795a9"}, + {file = "cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:2f641b64acc00811da98df63df7d59fd4706c0df449da71cb7ac39a0732b40ae"}, + {file = "cryptography-45.0.7-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:f5414a788ecc6ee6bc58560e85ca624258a55ca434884445440a810796ea0e0b"}, + {file = "cryptography-45.0.7-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:1f3d56f73595376f4244646dd5c5870c14c196949807be39e79e7bd9bac3da63"}, + {file = "cryptography-45.0.7.tar.gz", hash = "sha256:4b1654dfc64ea479c242508eb8c724044f1e964a47d1d1cacc5132292d851971"}, ] [package.dependencies] @@ -536,7 +553,7 @@ nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_full_version >= \"3.8 pep8test = ["check-sdist ; python_full_version >= \"3.8.0\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==45.0.6)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test = ["certifi (>=2024)", "cryptography-vectors (==45.0.7)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] [[package]] @@ -678,14 +695,14 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jsonschema-specifications" -version = "2025.4.1" +version = "2025.9.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af"}, - {file = "jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"}, + {file = "jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe"}, + {file = "jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"}, ] [package.dependencies] @@ -800,14 +817,14 @@ files = [ [[package]] name = "moto" -version = "5.1.11" +version = "5.1.12" description = "A library that allows you to easily mock out tests based on AWS infrastructure" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "moto-5.1.11-py3-none-any.whl", hash = "sha256:d09429ed5f67f8568637700cd525997d6abe7f91439a6f900b4f98a9fe4ecac9"}, - {file = "moto-5.1.11.tar.gz", hash = "sha256:1330b6d9b91088e971469dfb67f297595541914b364e0b49047bb82622975ec7"}, + {file = "moto-5.1.12-py3-none-any.whl", hash = "sha256:c9f1119ab57819ce4b88f793f51c6ca0361b6932a90c59865fd71022acfc5582"}, + {file = "moto-5.1.12.tar.gz", hash = "sha256:6eca3a020cb89c188b763610c27c969c32b832205712d3bdcb1a6031a4005187"}, ] [package.dependencies] @@ -879,14 +896,14 @@ test-extras = ["pytest-mpl", "pytest-randomly"] [[package]] name = "oras" -version = "0.2.37" +version = "0.2.38" description = "OCI Registry as Storage Python SDK" optional = false python-versions = "*" groups = ["main"] files = [ - {file = "oras-0.2.37-py3-none-any.whl", hash = "sha256:5973f52287887813dad6affede51d7a699f443dacad1e98e5f50634ec80c9f37"}, - {file = "oras-0.2.37.tar.gz", hash = "sha256:7e48f6b8cda08c11f612c16e2bdafc346b884be3a83b924495b5e43d34af0e1f"}, + {file = "oras-0.2.38-py3-none-any.whl", hash = "sha256:a97658086cea1e1ebb412a5b504005480c70de5d2e81a160d33e60fc187d42f4"}, + {file = "oras-0.2.38.tar.gz", hash = "sha256:58482f78275cb5cc9fdf135248ca878a19204428a51bd3a1ca24c32714d35341"}, ] [package.dependencies] @@ -923,31 +940,16 @@ files = [ {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] -[[package]] -name = "pbr" -version = "7.0.0" -description = "Python Build Reasonableness" -optional = false -python-versions = ">=2.6" -groups = ["dev"] -files = [ - {file = "pbr-7.0.0-py2.py3-none-any.whl", hash = "sha256:b447e63a2bc04fd975fc0480b8d5ebf979179e2c0ae203bf1eff9ea20073bc38"}, - {file = "pbr-7.0.0.tar.gz", hash = "sha256:cf4127298723dafbce3afd13775ccf3885be5d3c8435751b867f9a6a10b71a39"}, -] - -[package.dependencies] -setuptools = "*" - [[package]] name = "platformdirs" -version = "4.3.8" +version = "4.4.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, - {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, + {file = "platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85"}, + {file = "platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf"}, ] [package.extras] @@ -973,15 +975,15 @@ testing = ["coverage", "pytest", "pytest-benchmark"] [[package]] name = "pycparser" -version = "2.22" +version = "2.23" description = "C parser in Python" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "platform_python_implementation != \"PyPy\"" +markers = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"" files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, + {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, + {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, ] [[package]] @@ -1001,14 +1003,14 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pytest" -version = "8.4.1" +version = "8.4.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7"}, - {file = "pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c"}, + {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, + {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, ] [package.dependencies] @@ -1023,14 +1025,14 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests [[package]] name = "pytest-cov" -version = "6.2.1" +version = "6.3.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5"}, - {file = "pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2"}, + {file = "pytest_cov-6.3.0-py3-none-any.whl", hash = "sha256:440db28156d2468cafc0415b4f8e50856a0d11faefa38f30906048fe490f1749"}, + {file = "pytest_cov-6.3.0.tar.gz", hash = "sha256:35c580e7800f87ce892e687461166e1ac2bcb8fb9e13aea79032518d6e503ff2"}, ] [package.dependencies] @@ -1041,22 +1043,6 @@ pytest = ">=6.2.5" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] -[[package]] -name = "python-apt" -version = "2.9.9" -description = "Python bindings for APT" -optional = false -python-versions = "*" -groups = ["main"] -files = [] -develop = false - -[package.source] -type = "git" -url = "https://salsa.debian.org/apt-team/python-apt" -reference = "2.9.9" -resolved_reference = "3b62c25961d289ce9fe40eee3b820f7a8eaf1c5c" - [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -1168,14 +1154,14 @@ rpds-py = ">=0.7.0" [[package]] name = "requests" -version = "2.32.4" +version = "2.32.5" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "dev", "docs"] files = [ - {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, - {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, + {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, + {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, ] [package.dependencies] @@ -1245,179 +1231,179 @@ test = ["pytest (>=8)"] [[package]] name = "rpds-py" -version = "0.27.0" +version = "0.27.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "rpds_py-0.27.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:130c1ffa5039a333f5926b09e346ab335f0d4ec393b030a18549a7c7e7c2cea4"}, - {file = "rpds_py-0.27.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a4cf32a26fa744101b67bfd28c55d992cd19438aff611a46cac7f066afca8fd4"}, - {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64a0fe3f334a40b989812de70160de6b0ec7e3c9e4a04c0bbc48d97c5d3600ae"}, - {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a0ff7ee28583ab30a52f371b40f54e7138c52ca67f8ca17ccb7ccf0b383cb5f"}, - {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15ea4d2e182345dd1b4286593601d766411b43f868924afe297570658c31a62b"}, - {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36184b44bf60a480863e51021c26aca3dfe8dd2f5eeabb33622b132b9d8b8b54"}, - {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b78430703cfcf5f5e86eb74027a1ed03a93509273d7c705babb547f03e60016"}, - {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:dbd749cff1defbde270ca346b69b3baf5f1297213ef322254bf2a28537f0b046"}, - {file = "rpds_py-0.27.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bde37765564cd22a676dd8101b657839a1854cfaa9c382c5abf6ff7accfd4ae"}, - {file = "rpds_py-0.27.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1d66f45b9399036e890fb9c04e9f70c33857fd8f58ac8db9f3278cfa835440c3"}, - {file = "rpds_py-0.27.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d85d784c619370d9329bbd670f41ff5f2ae62ea4519761b679d0f57f0f0ee267"}, - {file = "rpds_py-0.27.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5df559e9e7644d9042f626f2c3997b555f347d7a855a15f170b253f6c5bfe358"}, - {file = "rpds_py-0.27.0-cp310-cp310-win32.whl", hash = "sha256:b8a4131698b6992b2a56015f51646711ec5d893a0b314a4b985477868e240c87"}, - {file = "rpds_py-0.27.0-cp310-cp310-win_amd64.whl", hash = "sha256:cbc619e84a5e3ab2d452de831c88bdcad824414e9c2d28cd101f94dbdf26329c"}, - {file = "rpds_py-0.27.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:dbc2ab5d10544eb485baa76c63c501303b716a5c405ff2469a1d8ceffaabf622"}, - {file = "rpds_py-0.27.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7ec85994f96a58cf7ed288caa344b7fe31fd1d503bdf13d7331ead5f70ab60d5"}, - {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:190d7285cd3bb6d31d37a0534d7359c1ee191eb194c511c301f32a4afa5a1dd4"}, - {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c10d92fb6d7fd827e44055fcd932ad93dac6a11e832d51534d77b97d1d85400f"}, - {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd2c1d27ebfe6a015cfa2005b7fe8c52d5019f7bbdd801bc6f7499aab9ae739e"}, - {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4790c9d5dd565ddb3e9f656092f57268951398cef52e364c405ed3112dc7c7c1"}, - {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4300e15e7d03660f04be84a125d1bdd0e6b2f674bc0723bc0fd0122f1a4585dc"}, - {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:59195dc244fc183209cf8a93406889cadde47dfd2f0a6b137783aa9c56d67c85"}, - {file = "rpds_py-0.27.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fae4a01ef8c4cb2bbe92ef2063149596907dc4a881a8d26743b3f6b304713171"}, - {file = "rpds_py-0.27.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e3dc8d4ede2dbae6c0fc2b6c958bf51ce9fd7e9b40c0f5b8835c3fde44f5807d"}, - {file = "rpds_py-0.27.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c3782fb753aa825b4ccabc04292e07897e2fd941448eabf666856c5530277626"}, - {file = "rpds_py-0.27.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:887ab1f12b0d227e9260558a4a2320024b20102207ada65c43e1ffc4546df72e"}, - {file = "rpds_py-0.27.0-cp311-cp311-win32.whl", hash = "sha256:5d6790ff400254137b81b8053b34417e2c46921e302d655181d55ea46df58cf7"}, - {file = "rpds_py-0.27.0-cp311-cp311-win_amd64.whl", hash = "sha256:e24d8031a2c62f34853756d9208eeafa6b940a1efcbfe36e8f57d99d52bb7261"}, - {file = "rpds_py-0.27.0-cp311-cp311-win_arm64.whl", hash = "sha256:08680820d23df1df0a0260f714d12966bc6c42d02e8055a91d61e03f0c47dda0"}, - {file = "rpds_py-0.27.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:19c990fdf5acecbf0623e906ae2e09ce1c58947197f9bced6bbd7482662231c4"}, - {file = "rpds_py-0.27.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6c27a7054b5224710fcfb1a626ec3ff4f28bcb89b899148c72873b18210e446b"}, - {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09965b314091829b378b60607022048953e25f0b396c2b70e7c4c81bcecf932e"}, - {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:14f028eb47f59e9169bfdf9f7ceafd29dd64902141840633683d0bad5b04ff34"}, - {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6168af0be75bba990a39f9431cdfae5f0ad501f4af32ae62e8856307200517b8"}, - {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab47fe727c13c09d0e6f508e3a49e545008e23bf762a245b020391b621f5b726"}, - {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa01b3d5e3b7d97efab65bd3d88f164e289ec323a8c033c5c38e53ee25c007e"}, - {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:6c135708e987f46053e0a1246a206f53717f9fadfba27174a9769ad4befba5c3"}, - {file = "rpds_py-0.27.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc327f4497b7087d06204235199daf208fd01c82d80465dc5efa4ec9df1c5b4e"}, - {file = "rpds_py-0.27.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e57906e38583a2cba67046a09c2637e23297618dc1f3caddbc493f2be97c93f"}, - {file = "rpds_py-0.27.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f4f69d7a4300fbf91efb1fb4916421bd57804c01ab938ab50ac9c4aa2212f03"}, - {file = "rpds_py-0.27.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b4c4fbbcff474e1e5f38be1bf04511c03d492d42eec0babda5d03af3b5589374"}, - {file = "rpds_py-0.27.0-cp312-cp312-win32.whl", hash = "sha256:27bac29bbbf39601b2aab474daf99dbc8e7176ca3389237a23944b17f8913d97"}, - {file = "rpds_py-0.27.0-cp312-cp312-win_amd64.whl", hash = "sha256:8a06aa1197ec0281eb1d7daf6073e199eb832fe591ffa329b88bae28f25f5fe5"}, - {file = "rpds_py-0.27.0-cp312-cp312-win_arm64.whl", hash = "sha256:e14aab02258cb776a108107bd15f5b5e4a1bbaa61ef33b36693dfab6f89d54f9"}, - {file = "rpds_py-0.27.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:443d239d02d9ae55b74015234f2cd8eb09e59fbba30bf60baeb3123ad4c6d5ff"}, - {file = "rpds_py-0.27.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b8a7acf04fda1f30f1007f3cc96d29d8cf0a53e626e4e1655fdf4eabc082d367"}, - {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d0f92b78cfc3b74a42239fdd8c1266f4715b573204c234d2f9fc3fc7a24f185"}, - {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce4ed8e0c7dbc5b19352b9c2c6131dd23b95fa8698b5cdd076307a33626b72dc"}, - {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fde355b02934cc6b07200cc3b27ab0c15870a757d1a72fd401aa92e2ea3c6bfe"}, - {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13bbc4846ae4c993f07c93feb21a24d8ec637573d567a924b1001e81c8ae80f9"}, - {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be0744661afbc4099fef7f4e604e7f1ea1be1dd7284f357924af12a705cc7d5c"}, - {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:069e0384a54f427bd65d7fda83b68a90606a3835901aaff42185fcd94f5a9295"}, - {file = "rpds_py-0.27.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4bc262ace5a1a7dc3e2eac2fa97b8257ae795389f688b5adf22c5db1e2431c43"}, - {file = "rpds_py-0.27.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2fe6e18e5c8581f0361b35ae575043c7029d0a92cb3429e6e596c2cdde251432"}, - {file = "rpds_py-0.27.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d93ebdb82363d2e7bec64eecdc3632b59e84bd270d74fe5be1659f7787052f9b"}, - {file = "rpds_py-0.27.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0954e3a92e1d62e83a54ea7b3fdc9efa5d61acef8488a8a3d31fdafbfb00460d"}, - {file = "rpds_py-0.27.0-cp313-cp313-win32.whl", hash = "sha256:2cff9bdd6c7b906cc562a505c04a57d92e82d37200027e8d362518df427f96cd"}, - {file = "rpds_py-0.27.0-cp313-cp313-win_amd64.whl", hash = "sha256:dc79d192fb76fc0c84f2c58672c17bbbc383fd26c3cdc29daae16ce3d927e8b2"}, - {file = "rpds_py-0.27.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b3a5c8089eed498a3af23ce87a80805ff98f6ef8f7bdb70bd1b7dae5105f6ac"}, - {file = "rpds_py-0.27.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:90fb790138c1a89a2e58c9282fe1089638401f2f3b8dddd758499041bc6e0774"}, - {file = "rpds_py-0.27.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:010c4843a3b92b54373e3d2291a7447d6c3fc29f591772cc2ea0e9f5c1da434b"}, - {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9ce7a9e967afc0a2af7caa0d15a3e9c1054815f73d6a8cb9225b61921b419bd"}, - {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aa0bf113d15e8abdfee92aa4db86761b709a09954083afcb5bf0f952d6065fdb"}, - {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb91d252b35004a84670dfeafadb042528b19842a0080d8b53e5ec1128e8f433"}, - {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db8a6313dbac934193fc17fe7610f70cd8181c542a91382531bef5ed785e5615"}, - {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce96ab0bdfcef1b8c371ada2100767ace6804ea35aacce0aef3aeb4f3f499ca8"}, - {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:7451ede3560086abe1aa27dcdcf55cd15c96b56f543fb12e5826eee6f721f858"}, - {file = "rpds_py-0.27.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:32196b5a99821476537b3f7732432d64d93a58d680a52c5e12a190ee0135d8b5"}, - {file = "rpds_py-0.27.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a029be818059870664157194e46ce0e995082ac49926f1423c1f058534d2aaa9"}, - {file = "rpds_py-0.27.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3841f66c1ffdc6cebce8aed64e36db71466f1dc23c0d9a5592e2a782a3042c79"}, - {file = "rpds_py-0.27.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:42894616da0fc0dcb2ec08a77896c3f56e9cb2f4b66acd76fc8992c3557ceb1c"}, - {file = "rpds_py-0.27.0-cp313-cp313t-win32.whl", hash = "sha256:b1fef1f13c842a39a03409e30ca0bf87b39a1e2a305a9924deadb75a43105d23"}, - {file = "rpds_py-0.27.0-cp313-cp313t-win_amd64.whl", hash = "sha256:183f5e221ba3e283cd36fdfbe311d95cd87699a083330b4f792543987167eff1"}, - {file = "rpds_py-0.27.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:f3cd110e02c5bf17d8fb562f6c9df5c20e73029d587cf8602a2da6c5ef1e32cb"}, - {file = "rpds_py-0.27.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8d0e09cf4863c74106b5265c2c310f36146e2b445ff7b3018a56799f28f39f6f"}, - {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f689ab822f9b5eb6dfc69893b4b9366db1d2420f7db1f6a2adf2a9ca15ad64"}, - {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e36c80c49853b3ffda7aa1831bf175c13356b210c73128c861f3aa93c3cc4015"}, - {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6de6a7f622860af0146cb9ee148682ff4d0cea0b8fd3ad51ce4d40efb2f061d0"}, - {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4045e2fc4b37ec4b48e8907a5819bdd3380708c139d7cc358f03a3653abedb89"}, - {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9da162b718b12c4219eeeeb68a5b7552fbc7aadedf2efee440f88b9c0e54b45d"}, - {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:0665be515767dc727ffa5f74bd2ef60b0ff85dad6bb8f50d91eaa6b5fb226f51"}, - {file = "rpds_py-0.27.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:203f581accef67300a942e49a37d74c12ceeef4514874c7cede21b012613ca2c"}, - {file = "rpds_py-0.27.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7873b65686a6471c0037139aa000d23fe94628e0daaa27b6e40607c90e3f5ec4"}, - {file = "rpds_py-0.27.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:249ab91ceaa6b41abc5f19513cb95b45c6f956f6b89f1fe3d99c81255a849f9e"}, - {file = "rpds_py-0.27.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d2f184336bc1d6abfaaa1262ed42739c3789b1e3a65a29916a615307d22ffd2e"}, - {file = "rpds_py-0.27.0-cp314-cp314-win32.whl", hash = "sha256:d3c622c39f04d5751408f5b801ecb527e6e0a471b367f420a877f7a660d583f6"}, - {file = "rpds_py-0.27.0-cp314-cp314-win_amd64.whl", hash = "sha256:cf824aceaeffff029ccfba0da637d432ca71ab21f13e7f6f5179cd88ebc77a8a"}, - {file = "rpds_py-0.27.0-cp314-cp314-win_arm64.whl", hash = "sha256:86aca1616922b40d8ac1b3073a1ead4255a2f13405e5700c01f7c8d29a03972d"}, - {file = "rpds_py-0.27.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:341d8acb6724c0c17bdf714319c393bb27f6d23d39bc74f94221b3e59fc31828"}, - {file = "rpds_py-0.27.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6b96b0b784fe5fd03beffff2b1533dc0d85e92bab8d1b2c24ef3a5dc8fac5669"}, - {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c431bfb91478d7cbe368d0a699978050d3b112d7f1d440a41e90faa325557fd"}, - {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20e222a44ae9f507d0f2678ee3dd0c45ec1e930f6875d99b8459631c24058aec"}, - {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:184f0d7b342967f6cda94a07d0e1fae177d11d0b8f17d73e06e36ac02889f303"}, - {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a00c91104c173c9043bc46f7b30ee5e6d2f6b1149f11f545580f5d6fdff42c0b"}, - {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7a37dd208f0d658e0487522078b1ed68cd6bce20ef4b5a915d2809b9094b410"}, - {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:92f3b3ec3e6008a1fe00b7c0946a170f161ac00645cde35e3c9a68c2475e8156"}, - {file = "rpds_py-0.27.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a1b3db5fae5cbce2131b7420a3f83553d4d89514c03d67804ced36161fe8b6b2"}, - {file = "rpds_py-0.27.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5355527adaa713ab693cbce7c1e0ec71682f599f61b128cf19d07e5c13c9b1f1"}, - {file = "rpds_py-0.27.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fcc01c57ce6e70b728af02b2401c5bc853a9e14eb07deda30624374f0aebfe42"}, - {file = "rpds_py-0.27.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3001013dae10f806380ba739d40dee11db1ecb91684febb8406a87c2ded23dae"}, - {file = "rpds_py-0.27.0-cp314-cp314t-win32.whl", hash = "sha256:0f401c369186a5743694dd9fc08cba66cf70908757552e1f714bfc5219c655b5"}, - {file = "rpds_py-0.27.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8a1dca5507fa1337f75dcd5070218b20bc68cf8844271c923c1b79dfcbc20391"}, - {file = "rpds_py-0.27.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:e0d7151a1bd5d0a203a5008fc4ae51a159a610cb82ab0a9b2c4d80241745582e"}, - {file = "rpds_py-0.27.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42ccc57ff99166a55a59d8c7d14f1a357b7749f9ed3584df74053fd098243451"}, - {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e377e4cf8795cdbdff75b8f0223d7b6c68ff4fef36799d88ccf3a995a91c0112"}, - {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:79af163a4b40bbd8cfd7ca86ec8b54b81121d3b213b4435ea27d6568bcba3e9d"}, - {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2eff8ee57c5996b0d2a07c3601fb4ce5fbc37547344a26945dd9e5cbd1ed27a"}, - {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7cf9bc4508efb18d8dff6934b602324eb9f8c6644749627ce001d6f38a490889"}, - {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05284439ebe7d9f5f5a668d4d8a0a1d851d16f7d47c78e1fab968c8ad30cab04"}, - {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_31_riscv64.whl", hash = "sha256:1321bce595ad70e80f97f998db37356b2e22cf98094eba6fe91782e626da2f71"}, - {file = "rpds_py-0.27.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:737005088449ddd3b3df5a95476ee1c2c5c669f5c30eed909548a92939c0e12d"}, - {file = "rpds_py-0.27.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9b2a4e17bfd68536c3b801800941c95a1d4a06e3cada11c146093ba939d9638d"}, - {file = "rpds_py-0.27.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:dc6b0d5a1ea0318ef2def2b6a55dccf1dcaf77d605672347271ed7b829860765"}, - {file = "rpds_py-0.27.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4c3f8a0d4802df34fcdbeb3dfe3a4d8c9a530baea8fafdf80816fcaac5379d83"}, - {file = "rpds_py-0.27.0-cp39-cp39-win32.whl", hash = "sha256:699c346abc73993962cac7bb4f02f58e438840fa5458a048d3a178a7a670ba86"}, - {file = "rpds_py-0.27.0-cp39-cp39-win_amd64.whl", hash = "sha256:be806e2961cd390a89d6c3ce8c2ae34271cfcd05660f716257838bb560f1c3b6"}, - {file = "rpds_py-0.27.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:46f48482c1a4748ab2773f75fffbdd1951eb59794e32788834b945da857c47a8"}, - {file = "rpds_py-0.27.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:419dd9c98bcc9fb0242be89e0c6e922df333b975d4268faa90d58499fd9c9ebe"}, - {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d42a0ef2bdf6bc81e1cc2d49d12460f63c6ae1423c4f4851b828e454ccf6f1"}, - {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e39169ac6aae06dd79c07c8a69d9da867cef6a6d7883a0186b46bb46ccfb0c3"}, - {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:935afcdea4751b0ac918047a2df3f720212892347767aea28f5b3bf7be4f27c0"}, - {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8de567dec6d451649a781633d36f5c7501711adee329d76c095be2178855b042"}, - {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:555ed147cbe8c8f76e72a4c6cd3b7b761cbf9987891b9448808148204aed74a5"}, - {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:d2cc2b34f9e1d31ce255174da82902ad75bd7c0d88a33df54a77a22f2ef421ee"}, - {file = "rpds_py-0.27.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cb0702c12983be3b2fab98ead349ac63a98216d28dda6f518f52da5498a27a1b"}, - {file = "rpds_py-0.27.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ba783541be46f27c8faea5a6645e193943c17ea2f0ffe593639d906a327a9bcc"}, - {file = "rpds_py-0.27.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:2406d034635d1497c596c40c85f86ecf2bf9611c1df73d14078af8444fe48031"}, - {file = "rpds_py-0.27.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dea0808153f1fbbad772669d906cddd92100277533a03845de6893cadeffc8be"}, - {file = "rpds_py-0.27.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d2a81bdcfde4245468f7030a75a37d50400ac2455c3a4819d9d550c937f90ab5"}, - {file = "rpds_py-0.27.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e6491658dd2569f05860bad645569145c8626ac231877b0fb2d5f9bcb7054089"}, - {file = "rpds_py-0.27.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:bec77545d188f8bdd29d42bccb9191682a46fb2e655e3d1fb446d47c55ac3b8d"}, - {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a4aebf8ca02bbb90a9b3e7a463bbf3bee02ab1c446840ca07b1695a68ce424"}, - {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:44524b96481a4c9b8e6c46d6afe43fa1fb485c261e359fbe32b63ff60e3884d8"}, - {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45d04a73c54b6a5fd2bab91a4b5bc8b426949586e61340e212a8484919183859"}, - {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:343cf24de9ed6c728abefc5d5c851d5de06497caa7ac37e5e65dd572921ed1b5"}, - {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aed8118ae20515974650d08eb724150dc2e20c2814bcc307089569995e88a14"}, - {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:af9d4fd79ee1cc8e7caf693ee02737daabfc0fcf2773ca0a4735b356c8ad6f7c"}, - {file = "rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f0396e894bd1e66c74ecbc08b4f6a03dc331140942c4b1d345dd131b68574a60"}, - {file = "rpds_py-0.27.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:59714ab0a5af25d723d8e9816638faf7f4254234decb7d212715c1aa71eee7be"}, - {file = "rpds_py-0.27.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:88051c3b7d5325409f433c5a40328fcb0685fc04e5db49ff936e910901d10114"}, - {file = "rpds_py-0.27.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:181bc29e59e5e5e6e9d63b143ff4d5191224d355e246b5a48c88ce6b35c4e466"}, - {file = "rpds_py-0.27.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9ad08547995a57e74fea6abaf5940d399447935faebbd2612b3b0ca6f987946b"}, - {file = "rpds_py-0.27.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:61490d57e82e23b45c66f96184237994bfafa914433b8cd1a9bb57fecfced59d"}, - {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7cf5e726b6fa977e428a61880fb108a62f28b6d0c7ef675b117eaff7076df49"}, - {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dc662bc9375a6a394b62dfd331874c434819f10ee3902123200dbcf116963f89"}, - {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:299a245537e697f28a7511d01038c310ac74e8ea213c0019e1fc65f52c0dcb23"}, - {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:be3964f7312ea05ed283b20f87cb533fdc555b2e428cc7be64612c0b2124f08c"}, - {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33ba649a6e55ae3808e4c39e01580dc9a9b0d5b02e77b66bb86ef117922b1264"}, - {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:81f81bbd7cdb4bdc418c09a73809abeda8f263a6bf8f9c7f93ed98b5597af39d"}, - {file = "rpds_py-0.27.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11e8e28c0ba0373d052818b600474cfee2fafa6c9f36c8587d217b13ee28ca7d"}, - {file = "rpds_py-0.27.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e3acb9c16530362aeaef4e84d57db357002dc5cbfac9a23414c3e73c08301ab2"}, - {file = "rpds_py-0.27.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:2e307cb5f66c59ede95c00e93cd84190a5b7f3533d7953690b2036780622ba81"}, - {file = "rpds_py-0.27.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:f09c9d4c26fa79c1bad927efb05aca2391350b8e61c38cbc0d7d3c814e463124"}, - {file = "rpds_py-0.27.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:af22763a0a1eff106426a6e1f13c4582e0d0ad89c1493ab6c058236174cd6c6a"}, - {file = "rpds_py-0.27.0.tar.gz", hash = "sha256:8b23cf252f180cda89220b378d917180f29d313cd6a07b2431c0d3b776aae86f"}, + {file = "rpds_py-0.27.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:68afeec26d42ab3b47e541b272166a0b4400313946871cba3ed3a4fc0cab1cef"}, + {file = "rpds_py-0.27.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74e5b2f7bb6fa38b1b10546d27acbacf2a022a8b5543efb06cfebc72a59c85be"}, + {file = "rpds_py-0.27.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9024de74731df54546fab0bfbcdb49fae19159ecaecfc8f37c18d2c7e2c0bd61"}, + {file = "rpds_py-0.27.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:31d3ebadefcd73b73928ed0b2fd696f7fefda8629229f81929ac9c1854d0cffb"}, + {file = "rpds_py-0.27.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2e7f8f169d775dd9092a1743768d771f1d1300453ddfe6325ae3ab5332b4657"}, + {file = "rpds_py-0.27.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d905d16f77eb6ab2e324e09bfa277b4c8e5e6b8a78a3e7ff8f3cdf773b4c013"}, + {file = "rpds_py-0.27.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50c946f048209e6362e22576baea09193809f87687a95a8db24e5fbdb307b93a"}, + {file = "rpds_py-0.27.1-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:3deab27804d65cd8289eb814c2c0e807c4b9d9916c9225e363cb0cf875eb67c1"}, + {file = "rpds_py-0.27.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8b61097f7488de4be8244c89915da8ed212832ccf1e7c7753a25a394bf9b1f10"}, + {file = "rpds_py-0.27.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8a3f29aba6e2d7d90528d3c792555a93497fe6538aa65eb675b44505be747808"}, + {file = "rpds_py-0.27.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd6cd0485b7d347304067153a6dc1d73f7d4fd995a396ef32a24d24b8ac63ac8"}, + {file = "rpds_py-0.27.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6f4461bf931108c9fa226ffb0e257c1b18dc2d44cd72b125bec50ee0ab1248a9"}, + {file = "rpds_py-0.27.1-cp310-cp310-win32.whl", hash = "sha256:ee5422d7fb21f6a00c1901bf6559c49fee13a5159d0288320737bbf6585bd3e4"}, + {file = "rpds_py-0.27.1-cp310-cp310-win_amd64.whl", hash = "sha256:3e039aabf6d5f83c745d5f9a0a381d031e9ed871967c0a5c38d201aca41f3ba1"}, + {file = "rpds_py-0.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:be898f271f851f68b318872ce6ebebbc62f303b654e43bf72683dbdc25b7c881"}, + {file = "rpds_py-0.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62ac3d4e3e07b58ee0ddecd71d6ce3b1637de2d373501412df395a0ec5f9beb5"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4708c5c0ceb2d034f9991623631d3d23cb16e65c83736ea020cdbe28d57c0a0e"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:abfa1171a9952d2e0002aba2ad3780820b00cc3d9c98c6630f2e93271501f66c"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b507d19f817ebaca79574b16eb2ae412e5c0835542c93fe9983f1e432aca195"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168b025f8fd8d8d10957405f3fdcef3dc20f5982d398f90851f4abc58c566c52"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c6210ef77caa58e16e8c17d35c63fe3f5b60fd9ba9d424470c3400bcf9ed"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:d252f2d8ca0195faa707f8eb9368955760880b2b42a8ee16d382bf5dd807f89a"}, + {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6e5e54da1e74b91dbc7996b56640f79b195d5925c2b78efaa8c5d53e1d88edde"}, + {file = "rpds_py-0.27.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ffce0481cc6e95e5b3f0a47ee17ffbd234399e6d532f394c8dce320c3b089c21"}, + {file = "rpds_py-0.27.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a205fdfe55c90c2cd8e540ca9ceba65cbe6629b443bc05db1f590a3db8189ff9"}, + {file = "rpds_py-0.27.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:689fb5200a749db0415b092972e8eba85847c23885c8543a8b0f5c009b1a5948"}, + {file = "rpds_py-0.27.1-cp311-cp311-win32.whl", hash = "sha256:3182af66048c00a075010bc7f4860f33913528a4b6fc09094a6e7598e462fe39"}, + {file = "rpds_py-0.27.1-cp311-cp311-win_amd64.whl", hash = "sha256:b4938466c6b257b2f5c4ff98acd8128ec36b5059e5c8f8372d79316b1c36bb15"}, + {file = "rpds_py-0.27.1-cp311-cp311-win_arm64.whl", hash = "sha256:2f57af9b4d0793e53266ee4325535a31ba48e2f875da81a9177c9926dfa60746"}, + {file = "rpds_py-0.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ae2775c1973e3c30316892737b91f9283f9908e3cc7625b9331271eaaed7dc90"}, + {file = "rpds_py-0.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2643400120f55c8a96f7c9d858f7be0c88d383cd4653ae2cf0d0c88f668073e5"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16323f674c089b0360674a4abd28d5042947d54ba620f72514d69be4ff64845e"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a1f4814b65eacac94a00fc9a526e3fdafd78e439469644032032d0d63de4881"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ba32c16b064267b22f1850a34051121d423b6f7338a12b9459550eb2096e7ec"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5c20f33fd10485b80f65e800bbe5f6785af510b9f4056c5a3c612ebc83ba6cb"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:466bfe65bd932da36ff279ddd92de56b042f2266d752719beb97b08526268ec5"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:41e532bbdcb57c92ba3be62c42e9f096431b4cf478da9bc3bc6ce5c38ab7ba7a"}, + {file = "rpds_py-0.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f149826d742b406579466283769a8ea448eed82a789af0ed17b0cd5770433444"}, + {file = "rpds_py-0.27.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80c60cfb5310677bd67cb1e85a1e8eb52e12529545441b43e6f14d90b878775a"}, + {file = "rpds_py-0.27.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7ee6521b9baf06085f62ba9c7a3e5becffbc32480d2f1b351559c001c38ce4c1"}, + {file = "rpds_py-0.27.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a512c8263249a9d68cac08b05dd59d2b3f2061d99b322813cbcc14c3c7421998"}, + {file = "rpds_py-0.27.1-cp312-cp312-win32.whl", hash = "sha256:819064fa048ba01b6dadc5116f3ac48610435ac9a0058bbde98e569f9e785c39"}, + {file = "rpds_py-0.27.1-cp312-cp312-win_amd64.whl", hash = "sha256:d9199717881f13c32c4046a15f024971a3b78ad4ea029e8da6b86e5aa9cf4594"}, + {file = "rpds_py-0.27.1-cp312-cp312-win_arm64.whl", hash = "sha256:33aa65b97826a0e885ef6e278fbd934e98cdcfed80b63946025f01e2f5b29502"}, + {file = "rpds_py-0.27.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e4b9fcfbc021633863a37e92571d6f91851fa656f0180246e84cbd8b3f6b329b"}, + {file = "rpds_py-0.27.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1441811a96eadca93c517d08df75de45e5ffe68aa3089924f963c782c4b898cf"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55266dafa22e672f5a4f65019015f90336ed31c6383bd53f5e7826d21a0e0b83"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d78827d7ac08627ea2c8e02c9e5b41180ea5ea1f747e9db0915e3adf36b62dcf"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae92443798a40a92dc5f0b01d8a7c93adde0c4dc965310a29ae7c64d72b9fad2"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c46c9dd2403b66a2a3b9720ec4b74d4ab49d4fabf9f03dfdce2d42af913fe8d0"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2efe4eb1d01b7f5f1939f4ef30ecea6c6b3521eec451fb93191bf84b2a522418"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:15d3b4d83582d10c601f481eca29c3f138d44c92187d197aff663a269197c02d"}, + {file = "rpds_py-0.27.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4ed2e16abbc982a169d30d1a420274a709949e2cbdef119fe2ec9d870b42f274"}, + {file = "rpds_py-0.27.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a75f305c9b013289121ec0f1181931975df78738cdf650093e6b86d74aa7d8dd"}, + {file = "rpds_py-0.27.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:67ce7620704745881a3d4b0ada80ab4d99df390838839921f99e63c474f82cf2"}, + {file = "rpds_py-0.27.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d992ac10eb86d9b6f369647b6a3f412fc0075cfd5d799530e84d335e440a002"}, + {file = "rpds_py-0.27.1-cp313-cp313-win32.whl", hash = "sha256:4f75e4bd8ab8db624e02c8e2fc4063021b58becdbe6df793a8111d9343aec1e3"}, + {file = "rpds_py-0.27.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9025faafc62ed0b75a53e541895ca272815bec18abe2249ff6501c8f2e12b83"}, + {file = "rpds_py-0.27.1-cp313-cp313-win_arm64.whl", hash = "sha256:ed10dc32829e7d222b7d3b93136d25a406ba9788f6a7ebf6809092da1f4d279d"}, + {file = "rpds_py-0.27.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:92022bbbad0d4426e616815b16bc4127f83c9a74940e1ccf3cfe0b387aba0228"}, + {file = "rpds_py-0.27.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47162fdab9407ec3f160805ac3e154df042e577dd53341745fc7fb3f625e6d92"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb89bec23fddc489e5d78b550a7b773557c9ab58b7946154a10a6f7a214a48b2"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e48af21883ded2b3e9eb48cb7880ad8598b31ab752ff3be6457001d78f416723"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f5b7bd8e219ed50299e58551a410b64daafb5017d54bbe822e003856f06a802"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08f1e20bccf73b08d12d804d6e1c22ca5530e71659e6673bce31a6bb71c1e73f"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dc5dceeaefcc96dc192e3a80bbe1d6c410c469e97bdd47494a7d930987f18b2"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:d76f9cc8665acdc0c9177043746775aa7babbf479b5520b78ae4002d889f5c21"}, + {file = "rpds_py-0.27.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:134fae0e36022edad8290a6661edf40c023562964efea0cc0ec7f5d392d2aaef"}, + {file = "rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb11a4f1b2b63337cfd3b4d110af778a59aae51c81d195768e353d8b52f88081"}, + {file = "rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:13e608ac9f50a0ed4faec0e90ece76ae33b34c0e8656e3dceb9a7db994c692cd"}, + {file = "rpds_py-0.27.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dd2135527aa40f061350c3f8f89da2644de26cd73e4de458e79606384f4f68e7"}, + {file = "rpds_py-0.27.1-cp313-cp313t-win32.whl", hash = "sha256:3020724ade63fe320a972e2ffd93b5623227e684315adce194941167fee02688"}, + {file = "rpds_py-0.27.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8ee50c3e41739886606388ba3ab3ee2aae9f35fb23f833091833255a31740797"}, + {file = "rpds_py-0.27.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:acb9aafccaae278f449d9c713b64a9e68662e7799dbd5859e2c6b3c67b56d334"}, + {file = "rpds_py-0.27.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b7fb801aa7f845ddf601c49630deeeccde7ce10065561d92729bfe81bd21fb33"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0dd05afb46597b9a2e11c351e5e4283c741237e7f617ffb3252780cca9336a"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6dfb0e058adb12d8b1d1b25f686e94ffa65d9995a5157afe99743bf7369d62b"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed090ccd235f6fa8bb5861684567f0a83e04f52dfc2e5c05f2e4b1309fcf85e7"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf876e79763eecf3e7356f157540d6a093cef395b65514f17a356f62af6cc136"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12ed005216a51b1d6e2b02a7bd31885fe317e45897de81d86dcce7d74618ffff"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:ee4308f409a40e50593c7e3bb8cbe0b4d4c66d1674a316324f0c2f5383b486f9"}, + {file = "rpds_py-0.27.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b08d152555acf1f455154d498ca855618c1378ec810646fcd7c76416ac6dc60"}, + {file = "rpds_py-0.27.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:dce51c828941973a5684d458214d3a36fcd28da3e1875d659388f4f9f12cc33e"}, + {file = "rpds_py-0.27.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c1476d6f29eb81aa4151c9a31219b03f1f798dc43d8af1250a870735516a1212"}, + {file = "rpds_py-0.27.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3ce0cac322b0d69b63c9cdb895ee1b65805ec9ffad37639f291dd79467bee675"}, + {file = "rpds_py-0.27.1-cp314-cp314-win32.whl", hash = "sha256:dfbfac137d2a3d0725758cd141f878bf4329ba25e34979797c89474a89a8a3a3"}, + {file = "rpds_py-0.27.1-cp314-cp314-win_amd64.whl", hash = "sha256:a6e57b0abfe7cc513450fcf529eb486b6e4d3f8aee83e92eb5f1ef848218d456"}, + {file = "rpds_py-0.27.1-cp314-cp314-win_arm64.whl", hash = "sha256:faf8d146f3d476abfee026c4ae3bdd9ca14236ae4e4c310cbd1cf75ba33d24a3"}, + {file = "rpds_py-0.27.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:ba81d2b56b6d4911ce735aad0a1d4495e808b8ee4dc58715998741a26874e7c2"}, + {file = "rpds_py-0.27.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:84f7d509870098de0e864cad0102711c1e24e9b1a50ee713b65928adb22269e4"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e960fc78fecd1100539f14132425e1d5fe44ecb9239f8f27f079962021523e"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62f85b665cedab1a503747617393573995dac4600ff51869d69ad2f39eb5e817"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fed467af29776f6556250c9ed85ea5a4dd121ab56a5f8b206e3e7a4c551e48ec"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2729615f9d430af0ae6b36cf042cb55c0936408d543fb691e1a9e36648fd35a"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b207d881a9aef7ba753d69c123a35d96ca7cb808056998f6b9e8747321f03b8"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:639fd5efec029f99b79ae47e5d7e00ad8a773da899b6309f6786ecaf22948c48"}, + {file = "rpds_py-0.27.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fecc80cb2a90e28af8a9b366edacf33d7a91cbfe4c2c4544ea1246e949cfebeb"}, + {file = "rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42a89282d711711d0a62d6f57d81aa43a1368686c45bc1c46b7f079d55692734"}, + {file = "rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:cf9931f14223de59551ab9d38ed18d92f14f055a5f78c1d8ad6493f735021bbb"}, + {file = "rpds_py-0.27.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f39f58a27cc6e59f432b568ed8429c7e1641324fbe38131de852cd77b2d534b0"}, + {file = "rpds_py-0.27.1-cp314-cp314t-win32.whl", hash = "sha256:d5fa0ee122dc09e23607a28e6d7b150da16c662e66409bbe85230e4c85bb528a"}, + {file = "rpds_py-0.27.1-cp314-cp314t-win_amd64.whl", hash = "sha256:6567d2bb951e21232c2f660c24cf3470bb96de56cdcb3f071a83feeaff8a2772"}, + {file = "rpds_py-0.27.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c918c65ec2e42c2a78d19f18c553d77319119bf43aa9e2edf7fb78d624355527"}, + {file = "rpds_py-0.27.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1fea2b1a922c47c51fd07d656324531adc787e415c8b116530a1d29c0516c62d"}, + {file = "rpds_py-0.27.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbf94c58e8e0cd6b6f38d8de67acae41b3a515c26169366ab58bdca4a6883bb8"}, + {file = "rpds_py-0.27.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c2a8fed130ce946d5c585eddc7c8eeef0051f58ac80a8ee43bd17835c144c2cc"}, + {file = "rpds_py-0.27.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:037a2361db72ee98d829bc2c5b7cc55598ae0a5e0ec1823a56ea99374cfd73c1"}, + {file = "rpds_py-0.27.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5281ed1cc1d49882f9997981c88df1a22e140ab41df19071222f7e5fc4e72125"}, + {file = "rpds_py-0.27.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fd50659a069c15eef8aa3d64bbef0d69fd27bb4a50c9ab4f17f83a16cbf8905"}, + {file = "rpds_py-0.27.1-cp39-cp39-manylinux_2_31_riscv64.whl", hash = "sha256:c4b676c4ae3921649a15d28ed10025548e9b561ded473aa413af749503c6737e"}, + {file = "rpds_py-0.27.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:079bc583a26db831a985c5257797b2b5d3affb0386e7ff886256762f82113b5e"}, + {file = "rpds_py-0.27.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4e44099bd522cba71a2c6b97f68e19f40e7d85399de899d66cdb67b32d7cb786"}, + {file = "rpds_py-0.27.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e202e6d4188e53c6661af813b46c37ca2c45e497fc558bacc1a7630ec2695aec"}, + {file = "rpds_py-0.27.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f41f814b8eaa48768d1bb551591f6ba45f87ac76899453e8ccd41dba1289b04b"}, + {file = "rpds_py-0.27.1-cp39-cp39-win32.whl", hash = "sha256:9e71f5a087ead99563c11fdaceee83ee982fd39cf67601f4fd66cb386336ee52"}, + {file = "rpds_py-0.27.1-cp39-cp39-win_amd64.whl", hash = "sha256:71108900c9c3c8590697244b9519017a400d9ba26a36c48381b3f64743a44aab"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7ba22cb9693df986033b91ae1d7a979bc399237d45fccf875b76f62bb9e52ddf"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b640501be9288c77738b5492b3fd3abc4ba95c50c2e41273c8a1459f08298d3"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb08b65b93e0c6dd70aac7f7890a9c0938d5ec71d5cb32d45cf844fb8ae47636"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d7ff07d696a7a38152ebdb8212ca9e5baab56656749f3d6004b34ab726b550b8"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb7c72262deae25366e3b6c0c0ba46007967aea15d1eea746e44ddba8ec58dcc"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b002cab05d6339716b03a4a3a2ce26737f6231d7b523f339fa061d53368c9d8"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23f6b69d1c26c4704fec01311963a41d7de3ee0570a84ebde4d544e5a1859ffc"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:530064db9146b247351f2a0250b8f00b289accea4596a033e94be2389977de71"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7b90b0496570bd6b0321724a330d8b545827c4df2034b6ddfc5f5275f55da2ad"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:879b0e14a2da6a1102a3fc8af580fc1ead37e6d6692a781bd8c83da37429b5ab"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:0d807710df3b5faa66c731afa162ea29717ab3be17bdc15f90f2d9f183da4059"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3adc388fc3afb6540aec081fa59e6e0d3908722771aa1e37ffe22b220a436f0b"}, + {file = "rpds_py-0.27.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c796c0c1cc68cb08b0284db4229f5af76168172670c74908fdbd4b7d7f515819"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdfe4bb2f9fe7458b7453ad3c33e726d6d1c7c0a72960bcc23800d77384e42df"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8fabb8fd848a5f75a2324e4a84501ee3a5e3c78d8603f83475441866e60b94a3"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda8719d598f2f7f3e0f885cba8646644b55a187762bec091fa14a2b819746a9"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c64d07e95606ec402a0a1c511fe003873fa6af630bda59bac77fac8b4318ebc"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93a2ed40de81bcff59aabebb626562d48332f3d028ca2036f1d23cbb52750be4"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:387ce8c44ae94e0ec50532d9cb0edce17311024c9794eb196b90e1058aadeb66"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf94f812c95b5e60ebaf8bfb1898a7d7cb9c1af5744d4a67fa47796e0465d4e"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:4848ca84d6ded9b58e474dfdbad4b8bfb450344c0551ddc8d958bf4b36aa837c"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bde09cbcf2248b73c7c323be49b280180ff39fadcfe04e7b6f54a678d02a7cf"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:94c44ee01fd21c9058f124d2d4f0c9dc7634bec93cd4b38eefc385dabe71acbf"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:df8b74962e35c9249425d90144e721eed198e6555a0e22a563d29fe4486b51f6"}, + {file = "rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dc23e6820e3b40847e2f4a7726462ba0cf53089512abe9ee16318c366494c17a"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa8933159edc50be265ed22b401125c9eebff3171f570258854dbce3ecd55475"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a50431bf02583e21bf273c71b89d710e7a710ad5e39c725b14e685610555926f"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78af06ddc7fe5cc0e967085a9115accee665fb912c22a3f54bad70cc65b05fe6"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:70d0738ef8fee13c003b100c2fbd667ec4f133468109b3472d249231108283a3"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2f6fd8a1cea5bbe599b6e78a6e5ee08db434fc8ffea51ff201c8765679698b3"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8177002868d1426305bb5de1e138161c2ec9eb2d939be38291d7c431c4712df8"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:008b839781d6c9bf3b6a8984d1d8e56f0ec46dc56df61fd669c49b58ae800400"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:a55b9132bb1ade6c734ddd2759c8dc132aa63687d259e725221f106b83a0e485"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a46fdec0083a26415f11d5f236b79fa1291c32aaa4a17684d82f7017a1f818b1"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:8a63b640a7845f2bdd232eb0d0a4a2dd939bcdd6c57e6bb134526487f3160ec5"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:7e32721e5d4922deaaf963469d795d5bde6093207c52fec719bd22e5d1bedbc4"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:2c426b99a068601b5f4623573df7a7c3d72e87533a2dd2253353a03e7502566c"}, + {file = "rpds_py-0.27.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4fc9b7fe29478824361ead6e14e4f5aed570d477e06088826537e202d25fe859"}, + {file = "rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8"}, ] [[package]] name = "s3transfer" -version = "0.13.1" +version = "0.14.0" description = "An Amazon S3 Transfer Manager" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "s3transfer-0.13.1-py3-none-any.whl", hash = "sha256:a981aa7429be23fe6dfc13e80e4020057cbab622b08c0315288758d67cabc724"}, - {file = "s3transfer-0.13.1.tar.gz", hash = "sha256:c3fdba22ba1bd367922f27ec8032d6a1cf5f10c934fb5d68cf60fd5a23d936cf"}, + {file = "s3transfer-0.14.0-py3-none-any.whl", hash = "sha256:ea3b790c7077558ed1f02a3072fb3cb992bbbd253392f4b6e9e8976941c7d456"}, + {file = "s3transfer-0.14.0.tar.gz", hash = "sha256:eff12264e7c8b4985074ccce27a3b38a485bb7f7422cc8046fee9be4983e4125"}, ] [package.dependencies] @@ -1426,27 +1412,6 @@ botocore = ">=1.37.4,<2.0a.0" [package.extras] crt = ["botocore[crt] (>=1.37.4,<2.0a.0)"] -[[package]] -name = "setuptools" -version = "80.9.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.9" -groups = ["dev"] -files = [ - {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"}, - {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"}, -] - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] -core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] - [[package]] name = "six" version = "1.17.0" @@ -1656,19 +1621,16 @@ test = ["pytest"] [[package]] name = "stevedore" -version = "5.4.1" +version = "5.5.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "stevedore-5.4.1-py3-none-any.whl", hash = "sha256:d10a31c7b86cba16c1f6e8d15416955fc797052351a56af15e608ad20811fcfe"}, - {file = "stevedore-5.4.1.tar.gz", hash = "sha256:3135b5ae50fe12816ef291baff420acb727fcd356106e3e9cbfa9e5985cd6f4b"}, + {file = "stevedore-5.5.0-py3-none-any.whl", hash = "sha256:18363d4d268181e8e8452e71a38cd77630f345b2ef6b4a8d5614dac5ee0d18cf"}, + {file = "stevedore-5.5.0.tar.gz", hash = "sha256:d31496a4f4df9825e1a1e4f1f74d19abb0154aff311c3b376fcc89dae8fccd73"}, ] -[package.dependencies] -pbr = ">=2.0.0" - [[package]] name = "urllib3" version = "2.5.0" @@ -1707,17 +1669,17 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "xmltodict" -version = "0.14.2" +version = "0.15.1" description = "Makes working with XML feel like you are working with JSON" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, - {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, + {file = "xmltodict-0.15.1-py2.py3-none-any.whl", hash = "sha256:dcd84b52f30a15be5ac4c9099a0cb234df8758624b035411e329c5c1e7a49089"}, + {file = "xmltodict-0.15.1.tar.gz", hash = "sha256:3d8d49127f3ce6979d40a36dbcad96f8bab106d232d24b49efdd4bd21716983c"}, ] [metadata] lock-version = "2.1" python-versions = "^3.13" -content-hash = "2a703a43dcb8036595551777106912584445d0de42c1a33ee67ee1d5a2374ffd" +content-hash = "8a14928c4c3dabdc94084f93ecd25d2f21e7ff578e562d5777a86741372a173a" diff --git a/pyproject.toml b/pyproject.toml index 2b4ebda0..9b0f5e56 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,6 @@ networkx = "^3.5" oras = "^0.2.37" pygments = "^2.19.2" PyYAML = "^6.0.2" -python-apt = { git = "https://salsa.debian.org/apt-team/python-apt", tag = "2.9.9" } [tool.poetry.group.dev.dependencies] bandit = "^1.8.6" From 85efed3c02a126f0c01830a7567d994c7590323a Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Thu, 11 Sep 2025 15:35:27 +0200 Subject: [PATCH 27/92] sources module is not needed anymore --- src/gardenlinux/sources/__init__.py | 0 src/gardenlinux/sources/debian.py | 115 ---------------------------- src/gardenlinux/sources/kernel.py | 30 -------- 3 files changed, 145 deletions(-) delete mode 100644 src/gardenlinux/sources/__init__.py delete mode 100644 src/gardenlinux/sources/debian.py delete mode 100644 src/gardenlinux/sources/kernel.py diff --git a/src/gardenlinux/sources/__init__.py b/src/gardenlinux/sources/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/src/gardenlinux/sources/debian.py b/src/gardenlinux/sources/debian.py deleted file mode 100644 index 7aababe9..00000000 --- a/src/gardenlinux/sources/debian.py +++ /dev/null @@ -1,115 +0,0 @@ -import re -import apt -import yaml -import itertools - - -def get_pkg_attr(package_name, attribute_key, packages_per_repo): - - current_package = {} - found_package = False - for packages in packages_per_repo.values(): - for line in packages.split('\n'): - # Check for new package section or end of file - if line.startswith("Package: ") or line.strip() == "": - if found_package: - # Return the attribute if it exists - return current_package.get(attribute_key) - current_package = {} - found_package = False - - key_value = line.split(": ", 1) - if len(key_value) == 2: - key, value = key_value - current_package[key.strip()] = value.strip() - - # Check if current section is the desired package - if current_package.get("Package") == package_name: - found_package = True - - -def get_package_list(repositories, architecture): - '''Get Packages lists from repository and return it as dictionary. - ''' - packages_dict = {} - cache = apt.Cache() - for repo in repositories: - repo_entries = repo.split(' ') - uri = repo_entries[0] - suite = repo_entries[1] - components = repo_entries[2:] - for component in components: - for arch in ['all'] + architecture: - pkg_info = "" - for pkg in cache: - if not pkg.candidate: - continue - for origin in pkg.candidate.origins: - if origin.site == uri and origin.archive == suite and origin.component == component: - # Only add package if its candidate’s architecture exactly matches OR we allow 'all' - if pkg.candidate.architecture == arch or arch == 'all': - pkg_info += f"Package: {pkg.name}\nVersion: {pkg.candidate.version}\nArchitecture: {pkg.candidate.architecture}\n\n" - break # Break from origins loop once matched - if pkg_info: - packages_dict[f"{uri}-{suite}-{component}-{arch}"] = pkg_info - - assert len(packages_dict) != 0, "Expected to find packages" - return packages_dict - - -def get_package_urls(package_list, package_name, resolve_depends=True): - '''Check if kernel headers and their dependencies are available. Returns a list - with the complete urls to all found kernel header packages and their dependencies. - ''' - header_packages = [] - dependencies = [] - for repo, packages in package_list.items(): - uri = re.match('(.*?)-.*', repo).group(1) - for line in packages.split('\n'): - if resolve_depends and line.startswith('Depends:'): - dependencies = re.sub(' ?\(.*?\),?|,', '', re.match("Depends: (.*)", line).group(1)).split(' ') - if line.startswith('Filename:') and f'/{package_name}' in line: - filename = re.match("Filename: (.*)", line).group(1) - header_packages.append(f'{uri}/{filename}') - if resolve_depends: - for dependency in dependencies: - header_packages.extend(get_package_urls(package_list, dependency, False)) - - return header_packages - - -def check_urls(linux_versions, header_package_urls, architecture): - '''Pick the package urls that match the Linux image versions. - ''' - result = {} - versions = {} - for arch, version in itertools.product(architecture, linux_versions): - if arch not in result: - result[arch] = {} - result[arch][version] = [] - for version, arch, package in itertools.product(linux_versions, architecture, header_package_urls): - if version in package and arch in package: - result[arch][version].append(package) - versions[version] = re.match(".*?(_.*)\.deb", package).group(1) - # Workaround for linux compiler package name on arm64 architecture - if 'arm64' in package and arch == 'arm64' and re.match('.*/gcc-\d\d_.*', package): - result[arch][version].append(package) - for version, arch, package in itertools.product(versions, architecture, header_package_urls): - if versions[version] in package and arch in package and 'linux-headers' not in package: - result[arch][version].append(package) - - for key, value in result.items(): - for nested_key, nested_value in value.items(): - result[key][nested_key] = list(dict.fromkeys(nested_value)) - - return result - - -def output_urls(package_urls): - - yaml_output = "```yaml\n" - yaml_output += "" - yaml_output += yaml.dump(package_urls) - yaml_output += "```\n" - yaml_output += "" - return yaml_output diff --git a/src/gardenlinux/sources/kernel.py b/src/gardenlinux/sources/kernel.py deleted file mode 100644 index d935e560..00000000 --- a/src/gardenlinux/sources/kernel.py +++ /dev/null @@ -1,30 +0,0 @@ -from .debian import ( - get_package_list, - get_package_urls, - get_pkg_attr, - check_urls, - output_urls -) - - -def get_kernel_urls(gardenlinux_version): - if not gardenlinux_version: - print("You need to specify gardenlinux_version") - repositories = [f'http://packages.gardenlinux.io/gardenlinux {gardenlinux_version} main'] - - # Temporary for as long as we need to perform releases for versions < 1443 - if "1312" in gardenlinux_version: - repositories = [f'http://repo.gardenlinux.io/gardenlinux {gardenlinux_version} main'] - - architecture = ["arm64", "amd64"] - packages = get_package_list(repositories, architecture) - - # find all Linux kernel versions available for the specified Gardenlinux version - - # We want to only list the packages for the specific kernel used for a given release - # GL uses always the latest available kernel in the given repo, even if older kernel versions would be available. - # Ideally we would parse the version of the package linux-headers-${arch}, which specifies the actual version. - # Here, it is safe enough for the release notes to take the highest version available. - latest_version = get_pkg_attr("linux-headers-amd64", "Version", packages) - package_urls = check_urls([latest_version], get_package_urls(packages, 'linux-headers'), architecture) - return output_urls(package_urls) From 2d466453585b90d314591a313c8299e5d79cd676 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Thu, 11 Sep 2025 15:46:26 +0200 Subject: [PATCH 28/92] got rid of getkernelurls --- src/gardenlinux/github/__main__.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 34b955a4..fb8c2a1d 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -21,11 +21,6 @@ import urllib.request import difflib -from gardenlinux.sources.kernel import get_kernel_urls -from ..logger import LoggerSetup - -LOGGER = LoggerSetup.get_logger("gardenlinux.github") - GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME = os.environ['GITHUB_RELEASE_BUCKET_NAME'] arches = [ @@ -342,10 +337,6 @@ def create_github_release_notes(gardenlinux_version, commitish, dry_run=False): output += generate_release_note_image_ids(metadata_files) output += "\n" - output += "## Kernel Package direct download links\n" - output += get_kernel_urls(gardenlinux_version) - output += "\n" - output += generate_image_download_section(metadata_files, gardenlinux_version, commitish_short) output += "\n" @@ -432,12 +423,6 @@ def main(): elif args.command == 'upload': # Implementation for 'upload' command pass - elif args.command == 'kernelurls': - # Implementation for 'upload' command - output = "" - output += "## Kernel Package direct download links\n" - output += get_kernel_urls(args.version) - print(output) else: parser.print_help() From 7e89bd98c59d596bdfac897aa9a3f9b38d8bd909 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Thu, 11 Sep 2025 15:49:14 +0200 Subject: [PATCH 29/92] removed LOGGER --- src/gardenlinux/github/__main__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index fb8c2a1d..93f742de 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -153,7 +153,6 @@ def download_all_metadata_files(version, commitish): for flavor in flavors: cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish)) - LOGGER.info(f'YTDBG // {flavor=} | {version=} | {commitish=} | {cname.cname=}') try: download_metadata_file(s3_artifacts, cname.cname, local_dest_path) except IndexError: From 895c87e779a470ab8d8de0417e81d490a41052ad Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Thu, 11 Sep 2025 16:26:09 +0200 Subject: [PATCH 30/92] release_note: update from upstream, dead code elimination --- src/gardenlinux/github/__main__.py | 582 ++++++++++++++++++++++------- 1 file changed, 443 insertions(+), 139 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 93f742de..654974eb 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -1,5 +1,3 @@ -from botocore import UNSIGNED -from botocore.client import Config from gardenlinux.apt import DebsrcFile from gardenlinux.features import CName from gardenlinux.flavors import Parser as FlavorsParser @@ -7,122 +5,478 @@ from pathlib import Path from yaml.loader import SafeLoader import argparse -import boto3 import gzip import json import os import re import requests import shutil +import subprocess import sys from git import Repo import textwrap import yaml import urllib.request -import difflib -GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME = os.environ['GITHUB_RELEASE_BUCKET_NAME'] -arches = [ - 'amd64', - 'arm64' -] +GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME = "gardenlinux-github-releases" + cloud_fullname_dict = { 'ali': 'Alibaba Cloud', 'aws': 'Amazon Web Services', 'gcp': 'Google Cloud Platform', - 'azure': 'Microsoft Azure' + 'azure': 'Microsoft Azure', + 'openstack': 'OpenStack', + 'openstackbaremetal': 'OpenStack Baremetal' } # https://github.com/gardenlinux/gardenlinux/issues/3044 # Empty string is the 'legacy' variant with traditional root fs and still needed/supported -image_variants = ['', '_usi', '_tpm2_trustedboot'] +IMAGE_VARIANTS = ['', '_usi', '_tpm2_trustedboot'] + +# Variant display names and order for consistent use across functions +VARIANT_ORDER = ['legacy', 'usi', 'tpm2_trustedboot'] +VARIANT_NAMES = { + 'legacy': 'Default', + 'usi': 'USI (Unified System Image)', + 'tpm2_trustedboot': 'TPM2 Trusted Boot' +} +# Mapping from image variant suffixes to variant keys +VARIANT_SUFFIX_MAP = { + '': 'legacy', + '_usi': 'usi', + '_tpm2_trustedboot': 'tpm2_trustedboot' +} -def _ali_release_note(published_image_metadata): - output = "" +# Short display names for table view +VARIANT_TABLE_NAMES = { + 'legacy': 'Default', + 'usi': 'USI', + 'tpm2_trustedboot': 'TPM2' +} + + +def get_variant_from_flavor(flavor_name): + """ + Determine the variant from a flavor name by checking for variant suffixes. + Returns the variant key (e.g., 'legacy', 'usi', 'tpm2_trustedboot'). + """ + match flavor_name: + case name if '_usi' in name: + return 'usi' + case name if '_tpm2_trustedboot' in name: + return 'tpm2_trustedboot' + case _: + return 'legacy' + + +def get_platform_release_note_data(metadata, platform): + """ + Get the appropriate cloud release note data based on platform. + Returns the structured data dictionary. + """ + match platform: + case 'ali': + return _ali_release_note(metadata) + case 'aws': + return _aws_release_note(metadata) + case 'gcp': + return _gcp_release_note(metadata) + case 'azure': + return _azure_release_note(metadata) + case 'openstack': + return _openstack_release_note(metadata) + case 'openstackbaremetal': + return _openstackbaremetal_release_note(metadata) + case _: + print(f"unknown platform {platform}") + return None + + +def get_file_extension_for_platform(platform): + """ + Get the correct file extension for a given platform. + """ + match platform: + case 'ali': + return '.qcow2' + case 'gcp': + return '.gcpimage.tar.gz' + case 'azure': + return '.vhd' + case 'aws' | 'openstack' | 'openstackbaremetal': + return '.raw' + case _: + return '.raw' # Default fallback + + +def get_platform_display_name(platform): + """ + Get the display name for a platform. + """ + match platform: + case 'ali' | 'openstackbaremetal' | 'openstack' | 'azure' | 'gcp' | 'aws': + return cloud_fullname_dict[platform] + case _: + return platform.upper() + + +def _ali_release_note(metadata): + published_image_metadata = metadata['published_image_metadata'] + flavor_name = metadata['s3_key'].split('/')[-1] # Extract flavor from s3_key + + regions = [] for pset in published_image_metadata: for p in published_image_metadata[pset]: - for image in published_image_metadata: - output += f"- Region: {p['region_id']}, Image-Id: {p['image_id']}\n" - return output + regions.append({ + 'region': p['region_id'], + 'image_id': p['image_id'] + }) + + return { + 'flavor': flavor_name, + 'regions': regions + } -def _aws_release_note(published_image_metadata): - output = "" +def _aws_release_note(metadata): + published_image_metadata = metadata['published_image_metadata'] + flavor_name = metadata['s3_key'].split('/')[-1] # Extract flavor from s3_key + + regions = [] for pset in published_image_metadata: for p in published_image_metadata[pset]: - for image in published_image_metadata: - output += f"- Region: {p['aws_region_id']}, Image-Id: {p['ami_id']}\n" - return output + regions.append({ + 'region': p['aws_region_id'], + 'image_id': p['ami_id'] + }) + + return { + 'flavor': flavor_name, + 'regions': regions + } -def _gcp_release_note(published_image_metadata): - return f"gcp_image_name: {published_image_metadata['gcp_image_name']}\n" +def _gcp_release_note(metadata): + published_image_metadata = metadata['published_image_metadata'] + flavor_name = metadata['s3_key'].split('/')[-1] # Extract flavor from s3_key + + details = {} + if 'gcp_image_name' in published_image_metadata: + details['image_name'] = published_image_metadata['gcp_image_name'] + if 'gcp_project_name' in published_image_metadata: + details['project'] = published_image_metadata['gcp_project_name'] + details['availability'] = "Global (all regions)" + + return { + 'flavor': flavor_name, + 'details': details + } -def _azure_release_note(published_image_metadata): - output = "" +def _openstack_release_note(metadata): + published_image_metadata = metadata['published_image_metadata'] + flavor_name = metadata['s3_key'].split('/')[-1] # Extract flavor from s3_key + + regions = [] + if 'published_openstack_images' in published_image_metadata: + for image in published_image_metadata['published_openstack_images']: + regions.append({ + 'region': image['region_name'], + 'image_id': image['image_id'], + 'image_name': image['image_name'] + }) + + return { + 'flavor': flavor_name, + 'regions': regions + } + + +def _openstackbaremetal_release_note(metadata): + published_image_metadata = metadata['published_image_metadata'] + flavor_name = metadata['s3_key'].split('/')[-1] # Extract flavor from s3_key + + regions = [] + if 'published_openstack_images' in published_image_metadata: + for image in published_image_metadata['published_openstack_images']: + regions.append({ + 'region': image['region_name'], + 'image_id': image['image_id'], + 'image_name': image['image_name'] + }) + + return { + 'flavor': flavor_name, + 'regions': regions + } + + +def _azure_release_note(metadata): + published_image_metadata = metadata['published_image_metadata'] + flavor_name = metadata['s3_key'].split('/')[-1] # Extract flavor from s3_key + + gallery_images = [] + marketplace_images = [] + for pset in published_image_metadata: if pset == 'published_gallery_images': - if (len(published_image_metadata[pset]) > 0): - output += "# all regions (community gallery image):\n" for gallery_image in published_image_metadata[pset]: - output += f"Hyper V: {gallery_image['hyper_v_generation']}, " - output += f"Azure Cloud: {gallery_image['azure_cloud']}, " - output += f"Image Id: {gallery_image['community_gallery_image_id']}\n" + gallery_images.append({ + 'hyper_v_generation': gallery_image['hyper_v_generation'], + 'azure_cloud': gallery_image['azure_cloud'], + 'image_id': gallery_image['community_gallery_image_id'] + }) if pset == 'published_marketplace_images': - if (len(published_image_metadata[pset]) > 0): - output += "# all regions (marketplace image):\n" for market_image in published_image_metadata[pset]: - output += f"Hyper V: {market_image['hyper_v_generation']}, " - output += f"urn: {market_image['urn']}\n" - return output + marketplace_images.append({ + 'hyper_v_generation': market_image['hyper_v_generation'], + 'urn': market_image['urn'] + }) + + return { + 'flavor': flavor_name, + 'gallery_images': gallery_images, + 'marketplace_images': marketplace_images + } def generate_release_note_image_ids(metadata_files): - out = "" - for m in metadata_files: - out += generate_release_note_image_id_single(m) - return out + """ + Groups metadata files by image variant, then platform, then architecture + """ + # Group metadata by variant, platform, and architecture + grouped_data = {} + + for metadata_file_path in metadata_files: + with open(metadata_file_path) as f: + metadata = yaml.load(f, Loader=SafeLoader) + + published_image_metadata = metadata['published_image_metadata'] + # Skip if no publishing metadata found + if published_image_metadata is None: + continue + + platform = metadata['platform'] + arch = metadata['architecture'] + + # Determine variant from flavor name + flavor_name = metadata['s3_key'].split('/')[-1] + variant = get_variant_from_flavor(flavor_name) + if variant not in grouped_data: + grouped_data[variant] = {} + if platform not in grouped_data[variant]: + grouped_data[variant][platform] = {} + if arch not in grouped_data[variant][platform]: + grouped_data[variant][platform][arch] = [] -def generate_release_note_image_id_single(metadata_file_path): + grouped_data[variant][platform][arch].append(metadata) + + # Generate both table and old format + output = "## Published Images\n\n" + + # Add table format (collapsed by default) + output += "
\n📊 Table View\n\n" + output += generate_table_format(grouped_data) + output += "\n
\n\n" + + # Add old format (collapsed by default) + output += "
\n📝 Detailed View\n\n" + output += generate_detailed_format(grouped_data) + output += "\n
\n\n" + + return output + + +def generate_table_format(grouped_data): + """ + Generate the table format with collapsible region details + """ + output = "| Variant | Platform | Architecture | Flavor | Regions & Image IDs | Download Links |\n" + output += "|---------|----------|--------------|--------|---------------------|----------------|\n" + + for variant in VARIANT_ORDER: + if variant not in grouped_data: + continue + + for platform in sorted(grouped_data[variant].keys()): + platform_display = get_platform_display_name(platform) + + for arch in sorted(grouped_data[variant][platform].keys()): + # Process all metadata for this variant/platform/architecture + for metadata in grouped_data[variant][platform][arch]: + data = get_platform_release_note_data(metadata, platform) + if data is None: + continue + + # Generate collapsible details for regions + details_content = generate_region_details(data, platform) + summary_text = generate_summary_text(data, platform) + + # Generate download links + download_links = generate_download_links(data['flavor'], platform) + + # Use shorter names for table display + variant_display = VARIANT_TABLE_NAMES[variant] + output += f"| {variant_display} | {platform_display} | {arch} | `{data['flavor']}` |
{summary_text}
{details_content}
|
Download
{download_links}
|\n" + + return output + + +def generate_region_details(data, platform): + """ + Generate the detailed region information for the collapsible section + """ + details = "" + + match data: + case {'regions': regions}: + for region in regions: + match region: + case {'region': region_name, 'image_id': image_id, 'image_name': image_name}: + details += f"**{region_name}:** {image_id} ({image_name})
" + case {'region': region_name, 'image_id': image_id}: + details += f"**{region_name}:** {image_id}
" + case {'details': details_dict}: + for key, value in details_dict.items(): + details += f"**{key.replace('_', ' ').title()}:** {value}
" + case {'gallery_images': gallery_images, 'marketplace_images': marketplace_images}: + if gallery_images: + details += "**Gallery Images:**
" + for img in gallery_images: + details += f"• {img['hyper_v_generation']} ({img['azure_cloud']}): {img['image_id']}
" + if marketplace_images: + details += "**Marketplace Images:**
" + for img in marketplace_images: + details += f"• {img['hyper_v_generation']}: {img['urn']}
" + case {'gallery_images': gallery_images}: + details += "**Gallery Images:**
" + for img in gallery_images: + details += f"• {img['hyper_v_generation']} ({img['azure_cloud']}): {img['image_id']}
" + case {'marketplace_images': marketplace_images}: + details += "**Marketplace Images:**
" + for img in marketplace_images: + details += f"• {img['hyper_v_generation']}: {img['urn']}
" + + return details + + +def generate_summary_text(data, platform): + """ + Generate the summary text for the collapsible section + """ + match data: + case {'regions': regions}: + count = len(regions) + return f"{count} regions" + case {'details': _}: + return "Global availability" + case {'gallery_images': gallery_images, 'marketplace_images': marketplace_images}: + gallery_count = len(gallery_images) + marketplace_count = len(marketplace_images) + return f"{gallery_count} gallery + {marketplace_count} marketplace images" + case {'gallery_images': gallery_images}: + gallery_count = len(gallery_images) + return f"{gallery_count} gallery images" + case {'marketplace_images': marketplace_images}: + marketplace_count = len(marketplace_images) + return f"{marketplace_count} marketplace images" + case _: + return "Details available" + + +def generate_download_links(flavor, platform): + """ + Generate download links for the flavor with correct file extension based on platform + """ + base_url = "https://gardenlinux-github-releases.s3.amazonaws.com/objects" + file_ext = get_file_extension_for_platform(platform) + filename = f"{flavor}{file_ext}" + download_url = f"{base_url}/{flavor}/{filename}" + return f"[{filename}]({download_url})" + + +def generate_detailed_format(grouped_data): """ - Outputs a markdown formatted string for github release notes, - containing the image-ids for the respective cloud regions + Generate the old detailed format with YAML """ output = "" - with open(metadata_file_path) as f: - metadata = yaml.load(f, Loader=SafeLoader) - published_image_metadata = metadata['published_image_metadata'] - # No publishing metadata found in metadata file, assume it was not published - if published_image_metadata is None: - return "" + for variant in VARIANT_ORDER: + if variant not in grouped_data: + continue + + output += f"
\nVariant - {VARIANT_NAMES[variant]}\n\n" + output += f"### Variant - {VARIANT_NAMES[variant]}\n\n" + + for platform in sorted(grouped_data[variant].keys()): + platform_long_name = cloud_fullname_dict.get(platform, platform) + output += f"
\n{platform.upper()} - {platform_long_name}\n\n" + output += f"#### {platform.upper()} - {platform_long_name}\n\n" + + for arch in sorted(grouped_data[variant][platform].keys()): + output += f"
\n{arch}\n\n" + output += f"##### {arch}\n\n" + output += "```\n" + + # Process all metadata for this variant/platform/architecture + for metadata in grouped_data[variant][platform][arch]: + data = get_platform_release_note_data(metadata, platform) + if data is None: + continue + + # Format the data according to the new structure as YAML + output += f"- flavor: {data['flavor']}\n" + + # Add download link with correct file extension + file_ext = get_file_extension_for_platform(platform) + + filename = f"{data['flavor']}{file_ext}" + download_url = f"https://gardenlinux-github-releases.s3.amazonaws.com/objects/{data['flavor']}/{filename}" + output += f" download_url: {download_url}\n" + + if 'regions' in data: + output += " regions:\n" + for region in data['regions']: + if 'image_name' in region: + output += f" - region: {region['region']}\n" + output += f" image_id: {region['image_id']}\n" + output += f" image_name: {region['image_name']}\n" + else: + output += f" - region: {region['region']}\n" + output += f" image_id: {region['image_id']}\n" + elif 'details' in data and platform != 'gcp': + output += " details:\n" + for key, value in data['details'].items(): + output += f" {key}: {value}\n" + elif platform == 'gcp' and 'details' in data: + # For GCP, move details up to same level as flavor + for key, value in data['details'].items(): + output += f" {key}: {value}\n" + elif 'gallery_images' in data or 'marketplace_images' in data: + if data.get('gallery_images'): + output += " gallery_images:\n" + for img in data['gallery_images']: + output += f" - hyper_v_generation: {img['hyper_v_generation']}\n" + output += f" azure_cloud: {img['azure_cloud']}\n" + output += f" image_id: {img['image_id']}\n" + if data.get('marketplace_images'): + output += " marketplace_images:\n" + for img in data['marketplace_images']: + output += f" - hyper_v_generation: {img['hyper_v_generation']}\n" + output += f" urn: {img['urn']}\n" + + output += "```\n\n" + output += "
\n\n" + + output += "
\n\n" + + output += "
\n\n" - platform_short_name = metadata['platform'] - arch = metadata['architecture'] - if platform_short_name in cloud_fullname_dict: - platform_long_name = cloud_fullname_dict[platform_short_name] - output = output + f"### {platform_long_name} ({arch})\n" - else: - output = output + f"### {platform_short_name} ({arch})\n" - - output += "```\n" - if platform_short_name == 'ali': - output += _ali_release_note(published_image_metadata) - elif platform_short_name == 'aws': - output += _aws_release_note(published_image_metadata) - elif platform_short_name == 'gcp': - output += _gcp_release_note(published_image_metadata) - elif platform_short_name == 'azure': - output += _azure_release_note(published_image_metadata) - else: - print(f"unknown platform {platform_short_name}") - output += "```\n" return output @@ -153,6 +507,23 @@ def download_all_metadata_files(version, commitish): for flavor in flavors: cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish)) + # Filter by image variants - only download if the flavor matches one of the variants + flavor_matches_variant = False + for variant_suffix in IMAGE_VARIANTS: + if variant_suffix == '': + last_part = cname.cname.split("-")[-1] + if "_" not in last_part: + flavor_matches_variant = True + break + elif variant_suffix in cname.cname: + # Specific variant (any non-empty string in IMAGE_VARIANTS) + flavor_matches_variant = True + break + + if not flavor_matches_variant: + print(f"INFO: Skipping flavor {cname.cname} - not matching image variants filter") + continue + try: download_metadata_file(s3_artifacts, cname.cname, local_dest_path) except IndexError: @@ -162,38 +533,6 @@ def download_all_metadata_files(version, commitish): return [str(artifact) for artifact in local_dest_path.iterdir()] -def get_image_object_url(bucket, object, expiration=0): - s3_config = Config(signature_version=UNSIGNED) - s3_client = boto3.client('s3', config=s3_config) - url = s3_client.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': object}, ExpiresIn=expiration) - return url - - -def generate_image_download_section(metadata_files, version, commitish): - output = "" - for metadata_file_path in metadata_files: - with open(metadata_file_path) as f: - metadata = yaml.load(f, Loader=SafeLoader) - arch = metadata['architecture'].upper() - platform = metadata['platform'] - paths = metadata['paths'] - - for path in paths: - if platform == 'ali' and '.qcow2' == path['suffix']: - output += f"### {cloud_fullname_dict['ali']} ({arch})\n" - output += f"* [{version}-{commitish}-rootfs.qcow2]({get_image_object_url(path['s3_bucket_name'], path['s3_key'])})\n" - elif platform == 'aws' and '.raw' == path['suffix']: - output += f"### {cloud_fullname_dict['aws']} ({arch})\n" - output += f"* [{version}-{commitish}-rootfs.raw]({get_image_object_url(path['s3_bucket_name'], path['s3_key'])})\n" - elif platform == 'gcp' and '.tar.gz' == path['suffix']: - output += f"### {cloud_fullname_dict['gcp']} ({arch})\n" - output += f"* [{version}-{commitish}-rootfs-gcpimage.tar.gz]({get_image_object_url(path['s3_bucket_name'], path['s3_key'])})\n" - elif platform == 'azure' and '.vhd' == path['suffix']: - output += f"### {cloud_fullname_dict['azure']} ({arch})\n" - output += f"* [{version}-{commitish}-rootfs.vhd]({get_image_object_url(path['s3_bucket_name'], path['s3_key'])})\n" - return output - - def _parse_match_section(pkg_list: list): output = "" for pkg in pkg_list: @@ -275,22 +614,8 @@ def release_notes_compare_package_versions_section(gardenlinux_version, package_ output += f"## Changes in Package Versions Compared to {previous_version}\n" output += "```diff\n" - try: - prev_pkg_list = _get_package_list(previous_version) - current_pkg_lines = [] - for entry in package_list.values(): - current_pkg_lines.append(repr(entry)) - prev_pkg_lines = [] - for entry in prev_pkg_list.values(): - prev_pkg_lines.append(repr(entry)) - diff = difflib.unified_diff(prev_pkg_lines, current_pkg_lines, - fromfile=f"{previous_version}", - tofile=f"{gardenlinux_version}", - lineterm="") - diff_text = "\n".join(list(diff)) - output += diff_text - except Exception as e: - output += f"Error generating diff: {e}" + output += subprocess.check_output(['/usr/bin/env', 'bash', './hack/compare-apt-repo-versions.sh', + previous_version, gardenlinux_version]).decode("utf-8") output += "```\n\n" elif patch == 0: output += f"## Full List of Packages in Garden Linux version {major}\n" @@ -318,7 +643,7 @@ def _get_package_list(gardenlinux_version): return d -def create_github_release_notes(gardenlinux_version, commitish, dry_run=False): +def create_github_release_notes(gardenlinux_version, commitish): commitish_short = commitish[:8] package_list = _get_package_list(gardenlinux_version) @@ -335,9 +660,6 @@ def create_github_release_notes(gardenlinux_version, commitish, dry_run=False): output += generate_release_note_image_ids(metadata_files) - output += "\n" - output += generate_image_download_section(metadata_files, gardenlinux_version, commitish_short) - output += "\n" output += "## Kernel Module Build Container (kmodbuild) " output += "\n" @@ -402,37 +724,19 @@ def main(): create_parser.add_argument('--tag', required=True) create_parser.add_argument('--commit', required=True) create_parser.add_argument('--dry-run', action='store_true', default=False) - - upload_parser = subparsers.add_parser('upload') - upload_parser.add_argument('--release_id', required=True) - upload_parser.add_argument('--file_path', required=True) - - kernelurl_parser = subparsers.add_parser('kernelurls') - kernelurl_parser.add_argument('--version', required=True) args = parser.parse_args() if args.command == 'create': - body = create_github_release_notes(args.tag, args.commit, args.dry_run) + body = create_github_release_notes(args.tag, args.commit) if not args.dry_run: release_id = create_github_release(args.owner, args.repo, args.tag, args.commit, body) write_to_release_id_file(f"{release_id}") print(f"Release created with ID: {release_id}") else: print(body) - elif args.command == 'upload': - # Implementation for 'upload' command - pass else: parser.print_help() if __name__ == "__main__": main() - - -# # Example usage -# try: -# release_info = create_github_release('gardenlinux', 'gardenlinux', "1312.0", "40b9db2c") -# print(release_info) -# except Exception as e: -# print(f"Error occurred: {e}") From e8f171d6804be83b68acccfea5aa8d0c90e28816 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Thu, 11 Sep 2025 16:51:41 +0200 Subject: [PATCH 31/92] debug print --- src/gardenlinux/github/__main__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 654974eb..b2d28e78 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -507,6 +507,7 @@ def download_all_metadata_files(version, commitish): for flavor in flavors: cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish)) + print(f'YTDBG // {flavor=} {version=} {commitish=}') # Filter by image variants - only download if the flavor matches one of the variants flavor_matches_variant = False for variant_suffix in IMAGE_VARIANTS: From 0c40e02a97ba560ecdbd2e2ad791b193c6d85da4 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Thu, 11 Sep 2025 16:58:32 +0200 Subject: [PATCH 32/92] the fun with short commits go on --- src/gardenlinux/github/__main__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index b2d28e78..1e352105 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -505,8 +505,10 @@ def download_all_metadata_files(version, commitish): s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + commitish_short = commitish[:8] + for flavor in flavors: - cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish)) + cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish_short)) print(f'YTDBG // {flavor=} {version=} {commitish=}') # Filter by image variants - only download if the flavor matches one of the variants flavor_matches_variant = False @@ -645,8 +647,6 @@ def _get_package_list(gardenlinux_version): def create_github_release_notes(gardenlinux_version, commitish): - commitish_short = commitish[:8] - package_list = _get_package_list(gardenlinux_version) output = "" @@ -657,7 +657,7 @@ def create_github_release_notes(gardenlinux_version, commitish): output += release_notes_compare_package_versions_section(gardenlinux_version, package_list) - metadata_files = download_all_metadata_files(gardenlinux_version, commitish_short) + metadata_files = download_all_metadata_files(gardenlinux_version, commitish) output += generate_release_note_image_ids(metadata_files) From 6981bca8e7074d581b60af31d01338f440b0ebef Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 07:15:16 +0200 Subject: [PATCH 33/92] debugging s3 filtering --- src/gardenlinux/github/__main__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 1e352105..ae95c3d2 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -484,9 +484,13 @@ def download_metadata_file(s3_artifacts, cname, artifacts_dir): """ Download metadata file (s3_metadata.yaml) """ + print(f'YTDBG // {s3_artifacts=} | {cname=} | {artifacts_dir=}') + _release_objects = s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}") + print(f'YTDBG // {_release_objects=}') release_object = list( s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}") )[0] + print(f'YTDBG // {release_object =}') s3_artifacts._bucket.download_file( release_object.key, artifacts_dir.joinpath(f"{cname}.s3_metadata.yaml") ) From cf7fca27a58ae68926d558eb90125189f5918586 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 07:31:45 +0200 Subject: [PATCH 34/92] more debug prints --- src/gardenlinux/github/__main__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index ae95c3d2..177a9db2 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -486,10 +486,13 @@ def download_metadata_file(s3_artifacts, cname, artifacts_dir): """ print(f'YTDBG // {s3_artifacts=} | {cname=} | {artifacts_dir=}') _release_objects = s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}") + for o in _release_objects: + print(f'YTDBG // {o.bucket_name=} | {o.key=}') print(f'YTDBG // {_release_objects=}') release_object = list( s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}") )[0] + print(f'YTBDG // {release_object.bucket_name=} | {release_object.key=}') print(f'YTDBG // {release_object =}') s3_artifacts._bucket.download_file( release_object.key, artifacts_dir.joinpath(f"{cname}.s3_metadata.yaml") From 104b7ea191f1cd1dc9fea1159819f8ab9ef0be43 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 08:11:19 +0200 Subject: [PATCH 35/92] better filtering for metadata files download --- src/gardenlinux/github/__main__.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 177a9db2..f6521f0b 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -480,12 +480,12 @@ def generate_detailed_format(grouped_data): return output -def download_metadata_file(s3_artifacts, cname, artifacts_dir): +def download_metadata_file(s3_artifacts, cname, version, commitish_short, artifacts_dir): """ Download metadata file (s3_metadata.yaml) """ print(f'YTDBG // {s3_artifacts=} | {cname=} | {artifacts_dir=}') - _release_objects = s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}") + _release_objects = s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}-{version}-{commitish_short}") for o in _release_objects: print(f'YTDBG // {o.bucket_name=} | {o.key=}') print(f'YTDBG // {_release_objects=}') @@ -535,7 +535,11 @@ def download_all_metadata_files(version, commitish): continue try: - download_metadata_file(s3_artifacts, cname.cname, local_dest_path) + download_metadata_file(s3_artifacts, + cname.cname, + version, + commitish_short, + local_dest_path) except IndexError: print(f"WARNING: No artifacts found for flavor {cname.cname}, skipping...") continue From b268216b84af72d226b3b1601ab2d2b45deb7fe6 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 08:16:12 +0200 Subject: [PATCH 36/92] debug --- src/gardenlinux/github/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index f6521f0b..34fad49b 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -484,7 +484,7 @@ def download_metadata_file(s3_artifacts, cname, version, commitish_short, artifa """ Download metadata file (s3_metadata.yaml) """ - print(f'YTDBG // {s3_artifacts=} | {cname=} | {artifacts_dir=}') + print(f'YTDBG // {s3_artifacts=} | {cname=} | {version=} | {commitish_short=} | {artifacts_dir=}') _release_objects = s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}-{version}-{commitish_short}") for o in _release_objects: print(f'YTDBG // {o.bucket_name=} | {o.key=}') From 5fa5d0488b426aeb5820e1f6514bc19664e78459 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 08:21:01 +0200 Subject: [PATCH 37/92] fixed s3 filtering --- src/gardenlinux/github/__main__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 34fad49b..0896dd14 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -488,9 +488,8 @@ def download_metadata_file(s3_artifacts, cname, version, commitish_short, artifa _release_objects = s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}-{version}-{commitish_short}") for o in _release_objects: print(f'YTDBG // {o.bucket_name=} | {o.key=}') - print(f'YTDBG // {_release_objects=}') release_object = list( - s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}") + s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}-{version}-{commitish_short}") )[0] print(f'YTBDG // {release_object.bucket_name=} | {release_object.key=}') print(f'YTDBG // {release_object =}') From 7587e26c7aa6a4ff5523ebeafdcfc4d884cd81df Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 09:02:03 +0200 Subject: [PATCH 38/92] proper debug logging --- src/gardenlinux/github/__main__.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 0896dd14..eb451b59 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -18,11 +18,14 @@ import yaml import urllib.request +from ..logger import LoggerSetup + +LOGGER = LoggerSetup.get_logger("gardenlinux.github") GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME = "gardenlinux-github-releases" -cloud_fullname_dict = { +CLOUD_FULLNAME_DICT = { 'ali': 'Alibaba Cloud', 'aws': 'Amazon Web Services', 'gcp': 'Google Cloud Platform', @@ -118,7 +121,7 @@ def get_platform_display_name(platform): """ match platform: case 'ali' | 'openstackbaremetal' | 'openstack' | 'azure' | 'gcp' | 'aws': - return cloud_fullname_dict[platform] + return CLOUD_FULLNAME_DICT[platform] case _: return platform.upper() @@ -414,7 +417,7 @@ def generate_detailed_format(grouped_data): output += f"### Variant - {VARIANT_NAMES[variant]}\n\n" for platform in sorted(grouped_data[variant].keys()): - platform_long_name = cloud_fullname_dict.get(platform, platform) + platform_long_name = CLOUD_FULLNAME_DICT.get(platform, platform) output += f"
\n{platform.upper()} - {platform_long_name}\n\n" output += f"#### {platform.upper()} - {platform_long_name}\n\n" @@ -484,15 +487,15 @@ def download_metadata_file(s3_artifacts, cname, version, commitish_short, artifa """ Download metadata file (s3_metadata.yaml) """ - print(f'YTDBG // {s3_artifacts=} | {cname=} | {version=} | {commitish_short=} | {artifacts_dir=}') + LOGGER.debug(f'{s3_artifacts=} | {cname=} | {version=} | {commitish_short=} | {artifacts_dir=}') _release_objects = s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}-{version}-{commitish_short}") for o in _release_objects: - print(f'YTDBG // {o.bucket_name=} | {o.key=}') + LOGGER.debug(f'{o.bucket_name=} | {o.key=}') release_object = list( s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}-{version}-{commitish_short}") )[0] print(f'YTBDG // {release_object.bucket_name=} | {release_object.key=}') - print(f'YTDBG // {release_object =}') + LOGGER.debug(f'{release_object =}') s3_artifacts._bucket.download_file( release_object.key, artifacts_dir.joinpath(f"{cname}.s3_metadata.yaml") ) @@ -515,7 +518,7 @@ def download_all_metadata_files(version, commitish): for flavor in flavors: cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish_short)) - print(f'YTDBG // {flavor=} {version=} {commitish=}') + LOGGER.debug(f'{flavor=} {version=} {commitish=}') # Filter by image variants - only download if the flavor matches one of the variants flavor_matches_variant = False for variant_suffix in IMAGE_VARIANTS: From b18747fdc298e95d94fd7ad460dbb478db298657 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 09:02:21 +0200 Subject: [PATCH 39/92] formatting fix --- src/gardenlinux/s3/s3_artifacts.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gardenlinux/s3/s3_artifacts.py b/src/gardenlinux/s3/s3_artifacts.py index 7938277a..766d8cc9 100644 --- a/src/gardenlinux/s3/s3_artifacts.py +++ b/src/gardenlinux/s3/s3_artifacts.py @@ -202,7 +202,7 @@ def upload_from_directory( sha256sum = file_digest(fp, "sha256").hexdigest() if artifact.name.startswith(cname): - suffix = artifact.name[len(cname) :] + suffix = artifact.name[len(cname):] else: raise RuntimeError( f"Artifact name '{artifact.name}' does not start with cname '{cname}'" From b0abc3a4d7830acdd57ec5fcc659b45ea506c095 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 09:16:00 +0200 Subject: [PATCH 40/92] not using list for bucket objects iterator --- src/gardenlinux/github/__main__.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index eb451b59..ae9a47f9 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -488,14 +488,15 @@ def download_metadata_file(s3_artifacts, cname, version, commitish_short, artifa Download metadata file (s3_metadata.yaml) """ LOGGER.debug(f'{s3_artifacts=} | {cname=} | {version=} | {commitish_short=} | {artifacts_dir=}') - _release_objects = s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}-{version}-{commitish_short}") - for o in _release_objects: - LOGGER.debug(f'{o.bucket_name=} | {o.key=}') - release_object = list( - s3_artifacts._bucket.objects.filter(Prefix=f"meta/singles/{cname}-{version}-{commitish_short}") - )[0] - print(f'YTBDG // {release_object.bucket_name=} | {release_object.key=}') - LOGGER.debug(f'{release_object =}') + release_object = next( + s3_artifacts._bucket.objects.filter( + Prefix=f"meta/singles/{cname}-{version}-{commitish_short}" + ) + ) + # for o in _release_objects: + # LOGGER.debug(f'{o.bucket_name=} | {o.key=}') + # release_object = list(_release_objects)[0] + LOGGER.debug(f'{release_object.bucket_name=} | {release_object.key=}') s3_artifacts._bucket.download_file( release_object.key, artifacts_dir.joinpath(f"{cname}.s3_metadata.yaml") ) From 23dd7cf470fba17f883ad71e359a1306230d2381 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 09:25:46 +0200 Subject: [PATCH 41/92] list is fine --- src/gardenlinux/github/__main__.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index ae9a47f9..43fb6e2a 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -488,15 +488,13 @@ def download_metadata_file(s3_artifacts, cname, version, commitish_short, artifa Download metadata file (s3_metadata.yaml) """ LOGGER.debug(f'{s3_artifacts=} | {cname=} | {version=} | {commitish_short=} | {artifacts_dir=}') - release_object = next( + release_object = list( s3_artifacts._bucket.objects.filter( Prefix=f"meta/singles/{cname}-{version}-{commitish_short}" ) - ) - # for o in _release_objects: - # LOGGER.debug(f'{o.bucket_name=} | {o.key=}') - # release_object = list(_release_objects)[0] + )[0] LOGGER.debug(f'{release_object.bucket_name=} | {release_object.key=}') + s3_artifacts._bucket.download_file( release_object.key, artifacts_dir.joinpath(f"{cname}.s3_metadata.yaml") ) From 17488b950cc043f95b48089f0da5f9f241aae29a Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 11:10:33 +0200 Subject: [PATCH 42/92] table-formatted diff for packages --- src/gardenlinux/github/__main__.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 43fb6e2a..ea9226d3 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -1,4 +1,5 @@ from gardenlinux.apt import DebsrcFile +from gardenlinux.apt.package_repo_info import GardenLinuxRepo, compare_repo from gardenlinux.features import CName from gardenlinux.flavors import Parser as FlavorsParser from gardenlinux.s3 import S3Artifacts @@ -11,7 +12,6 @@ import re import requests import shutil -import subprocess import sys from git import Repo import textwrap @@ -629,8 +629,7 @@ def release_notes_compare_package_versions_section(gardenlinux_version, package_ output += f"## Changes in Package Versions Compared to {previous_version}\n" output += "```diff\n" - output += subprocess.check_output(['/usr/bin/env', 'bash', './hack/compare-apt-repo-versions.sh', - previous_version, gardenlinux_version]).decode("utf-8") + output += compare_apt_repo_versions(previous_version, gardenlinux_version) output += "```\n\n" elif patch == 0: output += f"## Full List of Packages in Garden Linux version {major}\n" @@ -649,6 +648,19 @@ def release_notes_compare_package_versions_section(gardenlinux_version, package_ return output +def compare_apt_repo_versions(previous_version, current_version): + previous_repo = GardenLinuxRepo(previous_version) + current_repo = GardenLinuxRepo(current_version) + pkg_diffs = sorted(compare_repo(previous_repo, current_repo), key=lambda t: t[0]) + + output = f"| Package | {previous_version} | {current_version} |\n" + output += "|---------|--------------------|-------------------|\n" + + for pkg in pkg_diffs: + output += f"|{pkg[0]} | {pkg[1] if pkg[1] is not None else '-'} | {pkg[2] if pkg[2] is not None else '-'} |\n" + return output + + def _get_package_list(gardenlinux_version): (path, headers) = urllib.request.urlretrieve( f'https://packages.gardenlinux.io/gardenlinux/dists/{gardenlinux_version}/main/binary-amd64/Packages.gz') From d42eac8a576295144282e36a2614c7b18d1ab21a Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 11:14:19 +0200 Subject: [PATCH 43/92] formatting fix --- src/gardenlinux/github/__main__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index ea9226d3..68997459 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -628,9 +628,7 @@ def release_notes_compare_package_versions_section(gardenlinux_version, package_ previous_version = f"{major}.{patch - 1}" output += f"## Changes in Package Versions Compared to {previous_version}\n" - output += "```diff\n" output += compare_apt_repo_versions(previous_version, gardenlinux_version) - output += "```\n\n" elif patch == 0: output += f"## Full List of Packages in Garden Linux version {major}\n" output += "
Expand to see full list\n" From 08f0a6e4ba67fbdf316ff05e71d04902d4c09cbd Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 11:27:30 +0200 Subject: [PATCH 44/92] removed unneccessary shell script --- hack/compare-apt-repo-versions.sh | 42 ------------------------------- 1 file changed, 42 deletions(-) delete mode 100755 hack/compare-apt-repo-versions.sh diff --git a/hack/compare-apt-repo-versions.sh b/hack/compare-apt-repo-versions.sh deleted file mode 100755 index 8c23ff84..00000000 --- a/hack/compare-apt-repo-versions.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -set -o errexit - -SCRIPT_NAME="${0##*/}" -readonly SCRIPT_NAME - -SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" -readonly SCRIPT_DIR - -usage() { - echo "Script to compare the apt repo version of two Garden Linux releases." - echo "Usage: $SCRIPT_NAME VERSION_A VERSION_B" - echo "Example: $SCRIPT_NAME 1443.10 1587.0" - exit 1 -} - -main() { - [[ $# -ge 2 ]] || usage - [[ -n "$1" ]] || usage - [[ -n "$2" ]] || usage - local VERSION_A="${1}"; shift - local VERSION_B="${1}"; shift - - TEMP_DIR=$(mktemp -d) - - trap 'rm -rf $TEMP_DIR' EXIT - - curl -s https://packages.gardenlinux.io/gardenlinux/dists/"$VERSION_A"/main/binary-amd64/Packages.gz | gunzip > "$TEMP_DIR"/GardenLinux-"$VERSION_A" - curl -s https://packages.gardenlinux.io/gardenlinux/dists/"$VERSION_B"/main/binary-amd64/Packages.gz | gunzip > "$TEMP_DIR"/GardenLinux-"$VERSION_B" - - python3 "$SCRIPT_DIR"/parse-aptsource.py "$TEMP_DIR"/GardenLinux-"$VERSION_A" > "$TEMP_DIR"/"$VERSION_A" - python3 "$SCRIPT_DIR"/parse-aptsource.py "$TEMP_DIR"/GardenLinux-"$VERSION_B" > "$TEMP_DIR"/"$VERSION_B" - - pushd "$TEMP_DIR" > /dev/null - - diff -U 0 --minimal "$VERSION_A" "$VERSION_B" | grep -v '^@' - - popd > /dev/null -} - -main "${@}" - From 535e6de3e8f322b4bc4630a409d4138820d643f5 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 11:44:18 +0200 Subject: [PATCH 45/92] simplified workflows setup --- .github/actions/features_parse/action.yml | 2 +- .github/actions/flavors_parse/action.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/features_parse/action.yml b/.github/actions/features_parse/action.yml index 3d5579c7..0c4edc11 100644 --- a/.github/actions/features_parse/action.yml +++ b/.github/actions/features_parse/action.yml @@ -11,7 +11,7 @@ outputs: runs: using: composite steps: - - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@3054-move-github-workflows-py-to-python-gardenlinux-lib + - uses: .github/actions/setup - id: result shell: bash run: | diff --git a/.github/actions/flavors_parse/action.yml b/.github/actions/flavors_parse/action.yml index 8e56f8be..49cb8f4c 100644 --- a/.github/actions/flavors_parse/action.yml +++ b/.github/actions/flavors_parse/action.yml @@ -16,7 +16,7 @@ outputs: runs: using: composite steps: - - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@3054-move-github-workflows-py-to-python-gardenlinux-lib + - uses: .github/actions/setup with: version: ${{ inputs.version }} - id: matrix From a3437c1a1e4a3581d5d79af8d469f0d400e0f62d Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 11:59:01 +0200 Subject: [PATCH 46/92] calling gl-flavors-parse correctly --- .github/actions/flavors_parse/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/flavors_parse/action.yml b/.github/actions/flavors_parse/action.yml index 49cb8f4c..b7638449 100644 --- a/.github/actions/flavors_parse/action.yml +++ b/.github/actions/flavors_parse/action.yml @@ -25,7 +25,7 @@ runs: MATRIX='${{ inputs.flavors_matrix }}' if [[ $(echo "${MATRIX}" | jq -r 'type') != 'object' ]]; then - FLAVORS=$(gl-flavors-parse ${{ inputs.flags }}) + FLAVORS=$(poetry run gl-flavors-parse ${{ inputs.flags }}) MATRIX=$(jq -nc \ --argjson flavors "$(echo $FLAVORS)" \ '{ From 8613416d8d6edaff272195afe1ff4787faf70784 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 12:06:00 +0200 Subject: [PATCH 47/92] relative path to actions --- .github/actions/features_parse/action.yml | 7 +++++-- .github/actions/flavors_parse/action.yml | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/actions/features_parse/action.yml b/.github/actions/features_parse/action.yml index 0c4edc11..807e14b0 100644 --- a/.github/actions/features_parse/action.yml +++ b/.github/actions/features_parse/action.yml @@ -1,18 +1,21 @@ name: features_parse description: Parses the given GardenLinux features parameters + inputs: flags: description: "Flags passed to `gl-features-parse`" required: true + outputs: result: description: "features result" value: ${{ steps.result.outputs.result }} + runs: using: composite steps: - - uses: .github/actions/setup + - uses: ./.github/actions/setup - id: result shell: bash run: | - echo "result=$(gl-features-parse ${{ inputs.flags }})" | tee -a $GITHUB_OUTPUT + echo "result=$(poetry run gl-features-parse ${{ inputs.flags }})" | tee -a $GITHUB_OUTPUT diff --git a/.github/actions/flavors_parse/action.yml b/.github/actions/flavors_parse/action.yml index b7638449..6e193d6a 100644 --- a/.github/actions/flavors_parse/action.yml +++ b/.github/actions/flavors_parse/action.yml @@ -1,5 +1,6 @@ name: flavors_parse description: Parses the given GardenLinux flavors parameters + inputs: flags: description: "Flags passed to `gl-flavors-parse`" @@ -9,16 +10,19 @@ inputs: version: description: GardenLinux Python library version default: "0.10.0" + outputs: matrix: description: "Flavors matrix" value: ${{ steps.matrix.outputs.matrix }} + runs: using: composite steps: - - uses: .github/actions/setup + - uses: ./.github/actions/setup with: version: ${{ inputs.version }} + - id: matrix shell: bash run: | From 3cc6051a65dd152ad6a74be9fbc9ffd59247ade3 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 12:18:19 +0200 Subject: [PATCH 48/92] reverting actions-related changes --- .github/actions/features_parse/action.yml | 2 +- .github/actions/flavors_parse/action.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/features_parse/action.yml b/.github/actions/features_parse/action.yml index 807e14b0..5523f99c 100644 --- a/.github/actions/features_parse/action.yml +++ b/.github/actions/features_parse/action.yml @@ -14,7 +14,7 @@ outputs: runs: using: composite steps: - - uses: ./.github/actions/setup + - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@3054-move-github-workflows-py-to-python-gardenlinux-lib - id: result shell: bash run: | diff --git a/.github/actions/flavors_parse/action.yml b/.github/actions/flavors_parse/action.yml index 6e193d6a..8cae5afe 100644 --- a/.github/actions/flavors_parse/action.yml +++ b/.github/actions/flavors_parse/action.yml @@ -19,7 +19,7 @@ outputs: runs: using: composite steps: - - uses: ./.github/actions/setup + - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@3054-move-github-workflows-py-to-python-gardenlinux-lib with: version: ${{ inputs.version }} From f417b2849bef86f91a51bc448d38a65a5e76ebd2 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 12:22:31 +0200 Subject: [PATCH 49/92] which gl-* debugging --- .github/actions/features_parse/action.yml | 3 ++- .github/actions/flavors_parse/action.yml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/actions/features_parse/action.yml b/.github/actions/features_parse/action.yml index 5523f99c..cf04422a 100644 --- a/.github/actions/features_parse/action.yml +++ b/.github/actions/features_parse/action.yml @@ -18,4 +18,5 @@ runs: - id: result shell: bash run: | - echo "result=$(poetry run gl-features-parse ${{ inputs.flags }})" | tee -a $GITHUB_OUTPUT + which gl-features-parse + echo "result=$(gl-features-parse ${{ inputs.flags }})" | tee -a $GITHUB_OUTPUT diff --git a/.github/actions/flavors_parse/action.yml b/.github/actions/flavors_parse/action.yml index 8cae5afe..e1a39062 100644 --- a/.github/actions/flavors_parse/action.yml +++ b/.github/actions/flavors_parse/action.yml @@ -29,7 +29,8 @@ runs: MATRIX='${{ inputs.flavors_matrix }}' if [[ $(echo "${MATRIX}" | jq -r 'type') != 'object' ]]; then - FLAVORS=$(poetry run gl-flavors-parse ${{ inputs.flags }}) + which gl-flavors-parse + FLAVORS=$(gl-flavors-parse ${{ inputs.flags }}) MATRIX=$(jq -nc \ --argjson flavors "$(echo $FLAVORS)" \ '{ From 5b657d6d02fccd648c9c7d7e8d94235eb6cc9107 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 12:41:37 +0200 Subject: [PATCH 50/92] removed debug prints --- .github/actions/features_parse/action.yml | 1 - .github/actions/flavors_parse/action.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/.github/actions/features_parse/action.yml b/.github/actions/features_parse/action.yml index cf04422a..30206248 100644 --- a/.github/actions/features_parse/action.yml +++ b/.github/actions/features_parse/action.yml @@ -18,5 +18,4 @@ runs: - id: result shell: bash run: | - which gl-features-parse echo "result=$(gl-features-parse ${{ inputs.flags }})" | tee -a $GITHUB_OUTPUT diff --git a/.github/actions/flavors_parse/action.yml b/.github/actions/flavors_parse/action.yml index e1a39062..0160bfec 100644 --- a/.github/actions/flavors_parse/action.yml +++ b/.github/actions/flavors_parse/action.yml @@ -29,7 +29,6 @@ runs: MATRIX='${{ inputs.flavors_matrix }}' if [[ $(echo "${MATRIX}" | jq -r 'type') != 'object' ]]; then - which gl-flavors-parse FLAVORS=$(gl-flavors-parse ${{ inputs.flags }}) MATRIX=$(jq -nc \ --argjson flavors "$(echo $FLAVORS)" \ From 4b0fcb152e599dce9ee0f6cb5d1521be78a03fe2 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 12:56:57 +0200 Subject: [PATCH 51/92] proper logging, upload command --- src/gardenlinux/github/__main__.py | 74 ++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 14 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 68997459..85881c62 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -94,7 +94,7 @@ def get_platform_release_note_data(metadata, platform): case 'openstackbaremetal': return _openstackbaremetal_release_note(metadata) case _: - print(f"unknown platform {platform}") + LOGGER.error(f"unknown platform {platform}") return None @@ -532,7 +532,7 @@ def download_all_metadata_files(version, commitish): break if not flavor_matches_variant: - print(f"INFO: Skipping flavor {cname.cname} - not matching image variants filter") + LOGGER.info(f"Skipping flavor {cname.cname} - not matching image variants filter") continue try: @@ -542,7 +542,7 @@ def download_all_metadata_files(version, commitish): commitish_short, local_dest_path) except IndexError: - print(f"WARNING: No artifacts found for flavor {cname.cname}, skipping...") + LOGGER.warn(f"No artifacts found for flavor {cname.cname}, skipping...") continue return [str(artifact) for artifact in local_dest_path.iterdir()] @@ -640,9 +640,9 @@ def release_notes_compare_package_versions_section(gardenlinux_version, package_ output += "\n
\n\n" except ValueError: - print(f"Could not parse {gardenlinux_version} as the Garden Linux version, skipping version compare section") + LOGGER.error(f"Could not parse {gardenlinux_version} as the Garden Linux version, skipping version compare section") else: - print(f"Unexpected version number format {gardenlinux_version}, expected format (major is int).(patch is int)") + LOGGER.error(f"Unexpected version number format {gardenlinux_version}, expected format (major is int).(patch is int)") return output @@ -699,9 +699,9 @@ def write_to_release_id_file(release_id): try: with open('.github_release_id', 'w') as file: file.write(release_id) - print("Created .github_release_id successfully.") + LOGGER.info("Created .github_release_id successfully.") except IOError as e: - print(f"Could not create .github_release_id file: {e}") + LOGGER.error(f"Could not create .github_release_id file: {e}") sys.exit(1) @@ -728,12 +728,44 @@ def create_github_release(owner, repo, tag, commitish, body): response = requests.post(f'https://api.github.com/repos/{owner}/{repo}/releases', headers=headers, data=json.dumps(data)) if response.status_code == 201: - print("Release created successfully") + LOGGER.info("Release created successfully") response_json = response.json() return response_json.get('id') else: - print("Failed to create release") - print(response.json()) + LOGGER.error("Failed to create release") + LOGGER.debug(response.json()) + response.raise_for_status() + + +def upload_to_github_release_page(github_owner, github_repo, gardenlinux_release_id, file_to_upload, dry_run): + if dry_run: + LOGGER.info( + f"Dry run: would upload {file_to_upload} to release {gardenlinux_release_id} in repo {github_owner}/{github_repo}") + return + + token = os.environ.get('GITHUB_TOKEN') + if not token: + raise ValueError("GITHUB_TOKEN environment variable not set") + + headers = { + 'Authorization': f'token {token}', + 'Content-Type': 'application/octet-stream' + } + + upload_url = f"https://uploads.github.com/repos/{github_owner}/{github_repo}/releases/{gardenlinux_release_id}/assets?name={os.path.basename(file_to_upload)}" + + try: + with open(file_to_upload, 'rb') as f: + file_contents = f.read() + except IOError as e: + LOGGER.error(f"Error reading file {file_to_upload}: {e}") + return + + response = requests.post(upload_url, headers=headers, data=file_contents) + if response.status_code == 201: + LOGGER.info("Upload successful") + else: + LOGGER.error(f"Upload failed with status code {response.status_code}: {response.text}") response.raise_for_status() @@ -747,16 +779,30 @@ def main(): create_parser.add_argument('--tag', required=True) create_parser.add_argument('--commit', required=True) create_parser.add_argument('--dry-run', action='store_true', default=False) + + upload_parser = subparsers.add_parser('upload') + upload_parser.add_argument('--owner', default="gardenlinux") + upload_parser.add_argument('--repo', default="gardenlinux") + upload_parser.add_argument('--release_id', required=True) + upload_parser.add_argument('--file_path', required=True) + upload_parser.add_argument('--dry-run', action='store_true', default=False) + args = parser.parse_args() if args.command == 'create': body = create_github_release_notes(args.tag, args.commit) - if not args.dry_run: + if args.dry_run: + print(body) + else: release_id = create_github_release(args.owner, args.repo, args.tag, args.commit, body) write_to_release_id_file(f"{release_id}") - print(f"Release created with ID: {release_id}") - else: - print(body) + LOGGER.info(f"Release created with ID: {release_id}") + elif args.command == 'upload': + upload_to_github_release_page(args.owner, + args.repo, + args.release_id, + args.file_path, + args.dry_run) else: parser.print_help() From 587faeaf50faf9ad5b6c90024a79b64a432d0752 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 16:04:28 +0200 Subject: [PATCH 52/92] disable python caching when using act --- .github/actions/setup/action.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index f7f933d2..ac6d9549 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -28,7 +28,9 @@ runs: shell: bash run: | # Determine cache type based on available lockfile - if [ -f poetry.lock ]; then + if [ "x${{ env.ACT }}" != "x" ]; then + echo "Local GHA testing environment detected, disabling python cache" + elif [ -f poetry.lock ]; then echo "package_tool=poetry" >> $GITHUB_OUTPUT elif [ -f requirements.txt ]; then echo "package_tool=pip" >> $GITHUB_OUTPUT From 943e2d39a51c89da0cb899d67d26184d531e1bef Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 12 Sep 2025 16:08:13 +0200 Subject: [PATCH 53/92] a different approach to skip python caching with act --- .github/actions/setup/action.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index ac6d9549..f2ecc6ab 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -24,13 +24,12 @@ runs: using: composite steps: - name: Evaluate Python environment + if: ${{ !env.ACT }} id: env-check shell: bash run: | # Determine cache type based on available lockfile - if [ "x${{ env.ACT }}" != "x" ]; then - echo "Local GHA testing environment detected, disabling python cache" - elif [ -f poetry.lock ]; then + if [ -f poetry.lock ]; then echo "package_tool=poetry" >> $GITHUB_OUTPUT elif [ -f requirements.txt ]; then echo "package_tool=pip" >> $GITHUB_OUTPUT From fa6e7f898639e51419acaaa3885c0c1755ac5410 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Sat, 13 Sep 2025 13:20:00 +0200 Subject: [PATCH 54/92] disabled python cache configuration step --- .github/actions/setup/action.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index f2ecc6ab..655889c7 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -23,21 +23,21 @@ outputs: runs: using: composite steps: - - name: Evaluate Python environment - if: ${{ !env.ACT }} - id: env-check - shell: bash - run: | - # Determine cache type based on available lockfile - if [ -f poetry.lock ]; then - echo "package_tool=poetry" >> $GITHUB_OUTPUT - elif [ -f requirements.txt ]; then - echo "package_tool=pip" >> $GITHUB_OUTPUT - else - # no lockfile present: create one and use pip caching - echo "gardenlinux @ git+https://github.com/gardenlinux/python-gardenlinux-lib.git@${{ inputs.version }}" | tee -a requirements.txt - echo "package_tool=pip" >> $GITHUB_OUTPUT - fi + # - name: Evaluate Python environment + # if: ${{ !env.ACT }} + # id: env-check + # shell: bash + # run: | + # # Determine cache type based on available lockfile + # if [ -f poetry.lock ]; then + # echo "package_tool=poetry" >> $GITHUB_OUTPUT + # elif [ -f requirements.txt ]; then + # echo "package_tool=pip" >> $GITHUB_OUTPUT + # else + # # no lockfile present: create one and use pip caching + # echo "gardenlinux @ git+https://github.com/gardenlinux/python-gardenlinux-lib.git@${{ inputs.version }}" | tee -a requirements.txt + # echo "package_tool=pip" >> $GITHUB_OUTPUT + # fi - name: Install Poetry if: steps.env-check.outputs.package_tool == 'poetry' From de948abddb28efd90de29818a1a6715d751d335e Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 15 Sep 2025 09:04:52 +0200 Subject: [PATCH 55/92] black-reformatted code --- src/gardenlinux/github/__main__.py | 457 +++++++++++++++-------------- src/gardenlinux/s3/s3_artifacts.py | 2 +- 2 files changed, 241 insertions(+), 218 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 85881c62..7fc4f9f9 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -26,39 +26,35 @@ CLOUD_FULLNAME_DICT = { - 'ali': 'Alibaba Cloud', - 'aws': 'Amazon Web Services', - 'gcp': 'Google Cloud Platform', - 'azure': 'Microsoft Azure', - 'openstack': 'OpenStack', - 'openstackbaremetal': 'OpenStack Baremetal' + "ali": "Alibaba Cloud", + "aws": "Amazon Web Services", + "gcp": "Google Cloud Platform", + "azure": "Microsoft Azure", + "openstack": "OpenStack", + "openstackbaremetal": "OpenStack Baremetal", } # https://github.com/gardenlinux/gardenlinux/issues/3044 # Empty string is the 'legacy' variant with traditional root fs and still needed/supported -IMAGE_VARIANTS = ['', '_usi', '_tpm2_trustedboot'] +IMAGE_VARIANTS = ["", "_usi", "_tpm2_trustedboot"] # Variant display names and order for consistent use across functions -VARIANT_ORDER = ['legacy', 'usi', 'tpm2_trustedboot'] +VARIANT_ORDER = ["legacy", "usi", "tpm2_trustedboot"] VARIANT_NAMES = { - 'legacy': 'Default', - 'usi': 'USI (Unified System Image)', - 'tpm2_trustedboot': 'TPM2 Trusted Boot' + "legacy": "Default", + "usi": "USI (Unified System Image)", + "tpm2_trustedboot": "TPM2 Trusted Boot", } # Mapping from image variant suffixes to variant keys VARIANT_SUFFIX_MAP = { - '': 'legacy', - '_usi': 'usi', - '_tpm2_trustedboot': 'tpm2_trustedboot' + "": "legacy", + "_usi": "usi", + "_tpm2_trustedboot": "tpm2_trustedboot", } # Short display names for table view -VARIANT_TABLE_NAMES = { - 'legacy': 'Default', - 'usi': 'USI', - 'tpm2_trustedboot': 'TPM2' -} +VARIANT_TABLE_NAMES = {"legacy": "Default", "usi": "USI", "tpm2_trustedboot": "TPM2"} def get_variant_from_flavor(flavor_name): @@ -67,12 +63,12 @@ def get_variant_from_flavor(flavor_name): Returns the variant key (e.g., 'legacy', 'usi', 'tpm2_trustedboot'). """ match flavor_name: - case name if '_usi' in name: - return 'usi' - case name if '_tpm2_trustedboot' in name: - return 'tpm2_trustedboot' + case name if "_usi" in name: + return "usi" + case name if "_tpm2_trustedboot" in name: + return "tpm2_trustedboot" case _: - return 'legacy' + return "legacy" def get_platform_release_note_data(metadata, platform): @@ -81,17 +77,17 @@ def get_platform_release_note_data(metadata, platform): Returns the structured data dictionary. """ match platform: - case 'ali': + case "ali": return _ali_release_note(metadata) - case 'aws': + case "aws": return _aws_release_note(metadata) - case 'gcp': + case "gcp": return _gcp_release_note(metadata) - case 'azure': + case "azure": return _azure_release_note(metadata) - case 'openstack': + case "openstack": return _openstack_release_note(metadata) - case 'openstackbaremetal': + case "openstackbaremetal": return _openstackbaremetal_release_note(metadata) case _: LOGGER.error(f"unknown platform {platform}") @@ -103,16 +99,16 @@ def get_file_extension_for_platform(platform): Get the correct file extension for a given platform. """ match platform: - case 'ali': - return '.qcow2' - case 'gcp': - return '.gcpimage.tar.gz' - case 'azure': - return '.vhd' - case 'aws' | 'openstack' | 'openstackbaremetal': - return '.raw' + case "ali": + return ".qcow2" + case "gcp": + return ".gcpimage.tar.gz" + case "azure": + return ".vhd" + case "aws" | "openstack" | "openstackbaremetal": + return ".raw" case _: - return '.raw' # Default fallback + return ".raw" # Default fallback def get_platform_display_name(platform): @@ -120,130 +116,117 @@ def get_platform_display_name(platform): Get the display name for a platform. """ match platform: - case 'ali' | 'openstackbaremetal' | 'openstack' | 'azure' | 'gcp' | 'aws': + case "ali" | "openstackbaremetal" | "openstack" | "azure" | "gcp" | "aws": return CLOUD_FULLNAME_DICT[platform] case _: return platform.upper() def _ali_release_note(metadata): - published_image_metadata = metadata['published_image_metadata'] - flavor_name = metadata['s3_key'].split('/')[-1] # Extract flavor from s3_key + published_image_metadata = metadata["published_image_metadata"] + flavor_name = metadata["s3_key"].split("/")[-1] # Extract flavor from s3_key regions = [] for pset in published_image_metadata: for p in published_image_metadata[pset]: - regions.append({ - 'region': p['region_id'], - 'image_id': p['image_id'] - }) + regions.append({"region": p["region_id"], "image_id": p["image_id"]}) - return { - 'flavor': flavor_name, - 'regions': regions - } + return {"flavor": flavor_name, "regions": regions} def _aws_release_note(metadata): - published_image_metadata = metadata['published_image_metadata'] - flavor_name = metadata['s3_key'].split('/')[-1] # Extract flavor from s3_key + published_image_metadata = metadata["published_image_metadata"] + flavor_name = metadata["s3_key"].split("/")[-1] # Extract flavor from s3_key regions = [] for pset in published_image_metadata: for p in published_image_metadata[pset]: - regions.append({ - 'region': p['aws_region_id'], - 'image_id': p['ami_id'] - }) + regions.append({"region": p["aws_region_id"], "image_id": p["ami_id"]}) - return { - 'flavor': flavor_name, - 'regions': regions - } + return {"flavor": flavor_name, "regions": regions} def _gcp_release_note(metadata): - published_image_metadata = metadata['published_image_metadata'] - flavor_name = metadata['s3_key'].split('/')[-1] # Extract flavor from s3_key + published_image_metadata = metadata["published_image_metadata"] + flavor_name = metadata["s3_key"].split("/")[-1] # Extract flavor from s3_key details = {} - if 'gcp_image_name' in published_image_metadata: - details['image_name'] = published_image_metadata['gcp_image_name'] - if 'gcp_project_name' in published_image_metadata: - details['project'] = published_image_metadata['gcp_project_name'] - details['availability'] = "Global (all regions)" + if "gcp_image_name" in published_image_metadata: + details["image_name"] = published_image_metadata["gcp_image_name"] + if "gcp_project_name" in published_image_metadata: + details["project"] = published_image_metadata["gcp_project_name"] + details["availability"] = "Global (all regions)" - return { - 'flavor': flavor_name, - 'details': details - } + return {"flavor": flavor_name, "details": details} def _openstack_release_note(metadata): - published_image_metadata = metadata['published_image_metadata'] - flavor_name = metadata['s3_key'].split('/')[-1] # Extract flavor from s3_key + published_image_metadata = metadata["published_image_metadata"] + flavor_name = metadata["s3_key"].split("/")[-1] # Extract flavor from s3_key regions = [] - if 'published_openstack_images' in published_image_metadata: - for image in published_image_metadata['published_openstack_images']: - regions.append({ - 'region': image['region_name'], - 'image_id': image['image_id'], - 'image_name': image['image_name'] - }) + if "published_openstack_images" in published_image_metadata: + for image in published_image_metadata["published_openstack_images"]: + regions.append( + { + "region": image["region_name"], + "image_id": image["image_id"], + "image_name": image["image_name"], + } + ) - return { - 'flavor': flavor_name, - 'regions': regions - } + return {"flavor": flavor_name, "regions": regions} def _openstackbaremetal_release_note(metadata): - published_image_metadata = metadata['published_image_metadata'] - flavor_name = metadata['s3_key'].split('/')[-1] # Extract flavor from s3_key + published_image_metadata = metadata["published_image_metadata"] + flavor_name = metadata["s3_key"].split("/")[-1] # Extract flavor from s3_key regions = [] - if 'published_openstack_images' in published_image_metadata: - for image in published_image_metadata['published_openstack_images']: - regions.append({ - 'region': image['region_name'], - 'image_id': image['image_id'], - 'image_name': image['image_name'] - }) + if "published_openstack_images" in published_image_metadata: + for image in published_image_metadata["published_openstack_images"]: + regions.append( + { + "region": image["region_name"], + "image_id": image["image_id"], + "image_name": image["image_name"], + } + ) - return { - 'flavor': flavor_name, - 'regions': regions - } + return {"flavor": flavor_name, "regions": regions} def _azure_release_note(metadata): - published_image_metadata = metadata['published_image_metadata'] - flavor_name = metadata['s3_key'].split('/')[-1] # Extract flavor from s3_key + published_image_metadata = metadata["published_image_metadata"] + flavor_name = metadata["s3_key"].split("/")[-1] # Extract flavor from s3_key gallery_images = [] marketplace_images = [] for pset in published_image_metadata: - if pset == 'published_gallery_images': + if pset == "published_gallery_images": for gallery_image in published_image_metadata[pset]: - gallery_images.append({ - 'hyper_v_generation': gallery_image['hyper_v_generation'], - 'azure_cloud': gallery_image['azure_cloud'], - 'image_id': gallery_image['community_gallery_image_id'] - }) - - if pset == 'published_marketplace_images': + gallery_images.append( + { + "hyper_v_generation": gallery_image["hyper_v_generation"], + "azure_cloud": gallery_image["azure_cloud"], + "image_id": gallery_image["community_gallery_image_id"], + } + ) + + if pset == "published_marketplace_images": for market_image in published_image_metadata[pset]: - marketplace_images.append({ - 'hyper_v_generation': market_image['hyper_v_generation'], - 'urn': market_image['urn'] - }) + marketplace_images.append( + { + "hyper_v_generation": market_image["hyper_v_generation"], + "urn": market_image["urn"], + } + ) return { - 'flavor': flavor_name, - 'gallery_images': gallery_images, - 'marketplace_images': marketplace_images + "flavor": flavor_name, + "gallery_images": gallery_images, + "marketplace_images": marketplace_images, } @@ -258,16 +241,16 @@ def generate_release_note_image_ids(metadata_files): with open(metadata_file_path) as f: metadata = yaml.load(f, Loader=SafeLoader) - published_image_metadata = metadata['published_image_metadata'] + published_image_metadata = metadata["published_image_metadata"] # Skip if no publishing metadata found if published_image_metadata is None: continue - platform = metadata['platform'] - arch = metadata['architecture'] + platform = metadata["platform"] + arch = metadata["architecture"] # Determine variant from flavor name - flavor_name = metadata['s3_key'].split('/')[-1] + flavor_name = metadata["s3_key"].split("/")[-1] variant = get_variant_from_flavor(flavor_name) if variant not in grouped_data: @@ -321,7 +304,7 @@ def generate_table_format(grouped_data): summary_text = generate_summary_text(data, platform) # Generate download links - download_links = generate_download_links(data['flavor'], platform) + download_links = generate_download_links(data["flavor"], platform) # Use shorter names for table display variant_display = VARIANT_TABLE_NAMES[variant] @@ -337,17 +320,24 @@ def generate_region_details(data, platform): details = "" match data: - case {'regions': regions}: + case {"regions": regions}: for region in regions: match region: - case {'region': region_name, 'image_id': image_id, 'image_name': image_name}: + case { + "region": region_name, + "image_id": image_id, + "image_name": image_name, + }: details += f"**{region_name}:** {image_id} ({image_name})
" - case {'region': region_name, 'image_id': image_id}: + case {"region": region_name, "image_id": image_id}: details += f"**{region_name}:** {image_id}
" - case {'details': details_dict}: + case {"details": details_dict}: for key, value in details_dict.items(): details += f"**{key.replace('_', ' ').title()}:** {value}
" - case {'gallery_images': gallery_images, 'marketplace_images': marketplace_images}: + case { + "gallery_images": gallery_images, + "marketplace_images": marketplace_images, + }: if gallery_images: details += "**Gallery Images:**
" for img in gallery_images: @@ -356,11 +346,11 @@ def generate_region_details(data, platform): details += "**Marketplace Images:**
" for img in marketplace_images: details += f"• {img['hyper_v_generation']}: {img['urn']}
" - case {'gallery_images': gallery_images}: + case {"gallery_images": gallery_images}: details += "**Gallery Images:**
" for img in gallery_images: details += f"• {img['hyper_v_generation']} ({img['azure_cloud']}): {img['image_id']}
" - case {'marketplace_images': marketplace_images}: + case {"marketplace_images": marketplace_images}: details += "**Marketplace Images:**
" for img in marketplace_images: details += f"• {img['hyper_v_generation']}: {img['urn']}
" @@ -373,19 +363,22 @@ def generate_summary_text(data, platform): Generate the summary text for the collapsible section """ match data: - case {'regions': regions}: + case {"regions": regions}: count = len(regions) return f"{count} regions" - case {'details': _}: + case {"details": _}: return "Global availability" - case {'gallery_images': gallery_images, 'marketplace_images': marketplace_images}: + case { + "gallery_images": gallery_images, + "marketplace_images": marketplace_images, + }: gallery_count = len(gallery_images) marketplace_count = len(marketplace_images) return f"{gallery_count} gallery + {marketplace_count} marketplace images" - case {'gallery_images': gallery_images}: + case {"gallery_images": gallery_images}: gallery_count = len(gallery_images) return f"{gallery_count} gallery images" - case {'marketplace_images': marketplace_images}: + case {"marketplace_images": marketplace_images}: marketplace_count = len(marketplace_images) return f"{marketplace_count} marketplace images" case _: @@ -413,7 +406,9 @@ def generate_detailed_format(grouped_data): if variant not in grouped_data: continue - output += f"
\nVariant - {VARIANT_NAMES[variant]}\n\n" + output += ( + f"
\nVariant - {VARIANT_NAMES[variant]}\n\n" + ) output += f"### Variant - {VARIANT_NAMES[variant]}\n\n" for platform in sorted(grouped_data[variant].keys()): @@ -442,34 +437,34 @@ def generate_detailed_format(grouped_data): download_url = f"https://gardenlinux-github-releases.s3.amazonaws.com/objects/{data['flavor']}/{filename}" output += f" download_url: {download_url}\n" - if 'regions' in data: + if "regions" in data: output += " regions:\n" - for region in data['regions']: - if 'image_name' in region: + for region in data["regions"]: + if "image_name" in region: output += f" - region: {region['region']}\n" output += f" image_id: {region['image_id']}\n" output += f" image_name: {region['image_name']}\n" else: output += f" - region: {region['region']}\n" output += f" image_id: {region['image_id']}\n" - elif 'details' in data and platform != 'gcp': + elif "details" in data and platform != "gcp": output += " details:\n" - for key, value in data['details'].items(): + for key, value in data["details"].items(): output += f" {key}: {value}\n" - elif platform == 'gcp' and 'details' in data: + elif platform == "gcp" and "details" in data: # For GCP, move details up to same level as flavor - for key, value in data['details'].items(): + for key, value in data["details"].items(): output += f" {key}: {value}\n" - elif 'gallery_images' in data or 'marketplace_images' in data: - if data.get('gallery_images'): + elif "gallery_images" in data or "marketplace_images" in data: + if data.get("gallery_images"): output += " gallery_images:\n" - for img in data['gallery_images']: + for img in data["gallery_images"]: output += f" - hyper_v_generation: {img['hyper_v_generation']}\n" output += f" azure_cloud: {img['azure_cloud']}\n" output += f" image_id: {img['image_id']}\n" - if data.get('marketplace_images'): + if data.get("marketplace_images"): output += " marketplace_images:\n" - for img in data['marketplace_images']: + for img in data["marketplace_images"]: output += f" - hyper_v_generation: {img['hyper_v_generation']}\n" output += f" urn: {img['urn']}\n" @@ -483,17 +478,21 @@ def generate_detailed_format(grouped_data): return output -def download_metadata_file(s3_artifacts, cname, version, commitish_short, artifacts_dir): +def download_metadata_file( + s3_artifacts, cname, version, commitish_short, artifacts_dir +): """ Download metadata file (s3_metadata.yaml) """ - LOGGER.debug(f'{s3_artifacts=} | {cname=} | {version=} | {commitish_short=} | {artifacts_dir=}') + LOGGER.debug( + f"{s3_artifacts=} | {cname=} | {version=} | {commitish_short=} | {artifacts_dir=}" + ) release_object = list( s3_artifacts._bucket.objects.filter( Prefix=f"meta/singles/{cname}-{version}-{commitish_short}" ) )[0] - LOGGER.debug(f'{release_object.bucket_name=} | {release_object.key=}') + LOGGER.debug(f"{release_object.bucket_name=} | {release_object.key=}") s3_artifacts._bucket.download_file( release_object.key, artifacts_dir.joinpath(f"{cname}.s3_metadata.yaml") @@ -503,7 +502,7 @@ def download_metadata_file(s3_artifacts, cname, version, commitish_short, artifa def download_all_metadata_files(version, commitish): repo = Repo(".") commit = repo.commit(commitish) - flavors_data = commit.tree["flavors.yaml"].data_stream.read().decode('utf-8') + flavors_data = commit.tree["flavors.yaml"].data_stream.read().decode("utf-8") flavors = FlavorsParser(flavors_data).filter(only_publish=True) local_dest_path = Path("s3_downloads") @@ -517,11 +516,11 @@ def download_all_metadata_files(version, commitish): for flavor in flavors: cname = CName(flavor[1], flavor[0], "{0}-{1}".format(version, commitish_short)) - LOGGER.debug(f'{flavor=} {version=} {commitish=}') + LOGGER.debug(f"{flavor=} {version=} {commitish=}") # Filter by image variants - only download if the flavor matches one of the variants flavor_matches_variant = False for variant_suffix in IMAGE_VARIANTS: - if variant_suffix == '': + if variant_suffix == "": last_part = cname.cname.split("-")[-1] if "_" not in last_part: flavor_matches_variant = True @@ -532,15 +531,15 @@ def download_all_metadata_files(version, commitish): break if not flavor_matches_variant: - LOGGER.info(f"Skipping flavor {cname.cname} - not matching image variants filter") + LOGGER.info( + f"Skipping flavor {cname.cname} - not matching image variants filter" + ) continue try: - download_metadata_file(s3_artifacts, - cname.cname, - version, - commitish_short, - local_dest_path) + download_metadata_file( + s3_artifacts, cname.cname, version, commitish_short, local_dest_path + ) except IndexError: LOGGER.warn(f"No artifacts found for flavor {cname.cname}, skipping...") continue @@ -563,9 +562,9 @@ def _parse_match_section(pkg_list: list): def release_notes_changes_section(gardenlinux_version): """ - Get list of fixed CVEs, grouped by upgraded package. - Note: This result is not perfect, feel free to edit the generated release notes and - file issues in glvd for improvement suggestions https://github.com/gardenlinux/glvd/issues + Get list of fixed CVEs, grouped by upgraded package. + Note: This result is not perfect, feel free to edit the generated release notes and + file issues in glvd for improvement suggestions https://github.com/gardenlinux/glvd/issues """ try: url = f"https://glvd.ingress.glvd.gardnlinux.shoot.canary.k8s-hana.ondemand.com/v1/patchReleaseNotes/{gardenlinux_version}" @@ -578,7 +577,7 @@ def release_notes_changes_section(gardenlinux_version): output = [ "## Changes", - "The following packages have been upgraded, to address the mentioned CVEs:" + "The following packages have been upgraded, to address the mentioned CVEs:", ] for package in data["packageList"]: upgrade_line = ( @@ -589,27 +588,31 @@ def release_notes_changes_section(gardenlinux_version): if package["fixedCves"]: for fixedCve in package["fixedCves"]: - output.append(f' - {fixedCve}') + output.append(f" - {fixedCve}") return "\n".join(output) + "\n\n" except: # There are expected error cases, for example with versions not supported by glvd (1443.x) or when the api is not available # Fail gracefully by adding the placeholder we previously used, so that the release note generation does not fail. - return textwrap.dedent(""" + return textwrap.dedent( + """ ## Changes The following packages have been upgraded, to address the mentioned CVEs: **todo release facilitator: fill this in** - """) + """ + ) def release_notes_software_components_section(package_list): output = "## Software Component Versions\n" output += "```" output += "\n" - packages_regex = re.compile(r'^linux-image-amd64$|^systemd$|^containerd$|^runc$|^curl$|^openssl$|^openssh-server$|^libc-bin$') + packages_regex = re.compile( + r"^linux-image-amd64$|^systemd$|^containerd$|^runc$|^curl$|^openssl$|^openssh-server$|^libc-bin$" + ) for entry in package_list.values(): if packages_regex.match(entry.deb_source): - output += f'{entry!r}\n' + output += f"{entry!r}\n" output += "```" output += "\n\n" return output @@ -617,9 +620,9 @@ def release_notes_software_components_section(package_list): def release_notes_compare_package_versions_section(gardenlinux_version, package_list): output = "" - version_components = gardenlinux_version.split('.') + version_components = gardenlinux_version.split(".") # Assumes we always have version numbers like 1443.2 - if (len(version_components) == 2): + if len(version_components) == 2: try: major = int(version_components[0]) patch = int(version_components[1]) @@ -627,22 +630,30 @@ def release_notes_compare_package_versions_section(gardenlinux_version, package_ if patch > 0: previous_version = f"{major}.{patch - 1}" - output += f"## Changes in Package Versions Compared to {previous_version}\n" - output += compare_apt_repo_versions(previous_version, gardenlinux_version) + output += ( + f"## Changes in Package Versions Compared to {previous_version}\n" + ) + output += compare_apt_repo_versions( + previous_version, gardenlinux_version + ) elif patch == 0: output += f"## Full List of Packages in Garden Linux version {major}\n" output += "
Expand to see full list\n" output += "
"
                 output += "\n"
                 for entry in package_list.values():
-                    output += f'{entry!r}\n'
+                    output += f"{entry!r}\n"
                 output += "
" output += "\n
\n\n" except ValueError: - LOGGER.error(f"Could not parse {gardenlinux_version} as the Garden Linux version, skipping version compare section") + LOGGER.error( + f"Could not parse {gardenlinux_version} as the Garden Linux version, skipping version compare section" + ) else: - LOGGER.error(f"Unexpected version number format {gardenlinux_version}, expected format (major is int).(patch is int)") + LOGGER.error( + f"Unexpected version number format {gardenlinux_version}, expected format (major is int).(patch is int)" + ) return output @@ -661,8 +672,9 @@ def compare_apt_repo_versions(previous_version, current_version): def _get_package_list(gardenlinux_version): (path, headers) = urllib.request.urlretrieve( - f'https://packages.gardenlinux.io/gardenlinux/dists/{gardenlinux_version}/main/binary-amd64/Packages.gz') - with gzip.open(path, 'rt') as f: + f"https://packages.gardenlinux.io/gardenlinux/dists/{gardenlinux_version}/main/binary-amd64/Packages.gz" + ) + with gzip.open(path, "rt") as f: d = DebsrcFile() d.read(f) return d @@ -677,7 +689,9 @@ def create_github_release_notes(gardenlinux_version, commitish): output += release_notes_software_components_section(package_list) - output += release_notes_compare_package_versions_section(gardenlinux_version, package_list) + output += release_notes_compare_package_versions_section( + gardenlinux_version, package_list + ) metadata_files = download_all_metadata_files(gardenlinux_version, commitish) @@ -697,7 +711,7 @@ def create_github_release_notes(gardenlinux_version, commitish): def write_to_release_id_file(release_id): try: - with open('.github_release_id', 'w') as file: + with open(".github_release_id", "w") as file: file.write(release_id) LOGGER.info("Created .github_release_id successfully.") except IOError as e: @@ -707,55 +721,62 @@ def write_to_release_id_file(release_id): def create_github_release(owner, repo, tag, commitish, body): - token = os.environ.get('GITHUB_TOKEN') + token = os.environ.get("GITHUB_TOKEN") if not token: raise ValueError("GITHUB_TOKEN environment variable not set") headers = { - 'Authorization': f'token {token}', - 'Accept': 'application/vnd.github.v3+json' + "Authorization": f"token {token}", + "Accept": "application/vnd.github.v3+json", } data = { - 'tag_name': tag, - 'target_commitish': commitish, - 'name': tag, - 'body': body, - 'draft': False, - 'prerelease': False + "tag_name": tag, + "target_commitish": commitish, + "name": tag, + "body": body, + "draft": False, + "prerelease": False, } - response = requests.post(f'https://api.github.com/repos/{owner}/{repo}/releases', headers=headers, data=json.dumps(data)) + response = requests.post( + f"https://api.github.com/repos/{owner}/{repo}/releases", + headers=headers, + data=json.dumps(data), + ) if response.status_code == 201: LOGGER.info("Release created successfully") response_json = response.json() - return response_json.get('id') + return response_json.get("id") else: LOGGER.error("Failed to create release") LOGGER.debug(response.json()) response.raise_for_status() -def upload_to_github_release_page(github_owner, github_repo, gardenlinux_release_id, file_to_upload, dry_run): +def upload_to_github_release_page( + github_owner, github_repo, gardenlinux_release_id, file_to_upload, dry_run +): if dry_run: LOGGER.info( - f"Dry run: would upload {file_to_upload} to release {gardenlinux_release_id} in repo {github_owner}/{github_repo}") + f"Dry run: would upload {file_to_upload} to release {gardenlinux_release_id} in repo {github_owner}/{github_repo}" + ) return - token = os.environ.get('GITHUB_TOKEN') + token = os.environ.get("GITHUB_TOKEN") if not token: raise ValueError("GITHUB_TOKEN environment variable not set") headers = { - 'Authorization': f'token {token}', - 'Content-Type': 'application/octet-stream' + "Authorization": f"token {token}", + "Content-Type": "application/octet-stream", } upload_url = f"https://uploads.github.com/repos/{github_owner}/{github_repo}/releases/{gardenlinux_release_id}/assets?name={os.path.basename(file_to_upload)}" try: - with open(file_to_upload, 'rb') as f: + with open(file_to_upload, "rb") as f: file_contents = f.read() except IOError as e: LOGGER.error(f"Error reading file {file_to_upload}: {e}") @@ -765,44 +786,46 @@ def upload_to_github_release_page(github_owner, github_repo, gardenlinux_release if response.status_code == 201: LOGGER.info("Upload successful") else: - LOGGER.error(f"Upload failed with status code {response.status_code}: {response.text}") + LOGGER.error( + f"Upload failed with status code {response.status_code}: {response.text}" + ) response.raise_for_status() def main(): parser = argparse.ArgumentParser(description="GitHub Release Script") - subparsers = parser.add_subparsers(dest='command') - - create_parser = subparsers.add_parser('create') - create_parser.add_argument('--owner', default="gardenlinux") - create_parser.add_argument('--repo', default="gardenlinux") - create_parser.add_argument('--tag', required=True) - create_parser.add_argument('--commit', required=True) - create_parser.add_argument('--dry-run', action='store_true', default=False) - - upload_parser = subparsers.add_parser('upload') - upload_parser.add_argument('--owner', default="gardenlinux") - upload_parser.add_argument('--repo', default="gardenlinux") - upload_parser.add_argument('--release_id', required=True) - upload_parser.add_argument('--file_path', required=True) - upload_parser.add_argument('--dry-run', action='store_true', default=False) + subparsers = parser.add_subparsers(dest="command") + + create_parser = subparsers.add_parser("create") + create_parser.add_argument("--owner", default="gardenlinux") + create_parser.add_argument("--repo", default="gardenlinux") + create_parser.add_argument("--tag", required=True) + create_parser.add_argument("--commit", required=True) + create_parser.add_argument("--dry-run", action="store_true", default=False) + + upload_parser = subparsers.add_parser("upload") + upload_parser.add_argument("--owner", default="gardenlinux") + upload_parser.add_argument("--repo", default="gardenlinux") + upload_parser.add_argument("--release_id", required=True) + upload_parser.add_argument("--file_path", required=True) + upload_parser.add_argument("--dry-run", action="store_true", default=False) args = parser.parse_args() - if args.command == 'create': + if args.command == "create": body = create_github_release_notes(args.tag, args.commit) if args.dry_run: print(body) else: - release_id = create_github_release(args.owner, args.repo, args.tag, args.commit, body) + release_id = create_github_release( + args.owner, args.repo, args.tag, args.commit, body + ) write_to_release_id_file(f"{release_id}") LOGGER.info(f"Release created with ID: {release_id}") - elif args.command == 'upload': - upload_to_github_release_page(args.owner, - args.repo, - args.release_id, - args.file_path, - args.dry_run) + elif args.command == "upload": + upload_to_github_release_page( + args.owner, args.repo, args.release_id, args.file_path, args.dry_run + ) else: parser.print_help() diff --git a/src/gardenlinux/s3/s3_artifacts.py b/src/gardenlinux/s3/s3_artifacts.py index 766d8cc9..7938277a 100644 --- a/src/gardenlinux/s3/s3_artifacts.py +++ b/src/gardenlinux/s3/s3_artifacts.py @@ -202,7 +202,7 @@ def upload_from_directory( sha256sum = file_digest(fp, "sha256").hexdigest() if artifact.name.startswith(cname): - suffix = artifact.name[len(cname):] + suffix = artifact.name[len(cname) :] else: raise RuntimeError( f"Artifact name '{artifact.name}' does not start with cname '{cname}'" From a243406883de740d2688d3e55c87531f460f76bb Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 15 Sep 2025 09:05:01 +0200 Subject: [PATCH 56/92] black --diff makes more sense for CI --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0aecfa2d..af48fd11 100644 --- a/Makefile +++ b/Makefile @@ -62,7 +62,7 @@ format: install-dev $(POETRY) run black --extend-exclude test-data/gardenlinux . lint: install-dev - $(POETRY) run black --check --extend-exclude test-data/gardenlinux . + $(POETRY) run black --diff --extend-exclude test-data/gardenlinux . security: install-dev @if [ "$(CI)" = "true" ]; then \ From 5de40e14cdc5b750ec50d144834e9f040940d0c4 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 15 Sep 2025 09:28:02 +0200 Subject: [PATCH 57/92] bandit config, requests timeouts --- Makefile | 4 ++-- pyproject.toml | 4 ++++ src/gardenlinux/github/__main__.py | 6 ++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index af48fd11..59d6b33a 100644 --- a/Makefile +++ b/Makefile @@ -66,9 +66,9 @@ lint: install-dev security: install-dev @if [ "$(CI)" = "true" ]; then \ - $(POETRY) run bandit -ll -ii -r . -f json -o bandit-report.json ; \ + $(POETRY) run bandit -c pyproject.toml -ll -ii -r . -f json -o bandit-report.json ; \ else \ - $(POETRY) run bandit -r . ; \ + $(POETRY) run bandit -c pyproject.toml -r . ; \ fi docs: install-docs diff --git a/pyproject.toml b/pyproject.toml index 9b0f5e56..9a830dc8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,6 +43,10 @@ gl-gh = "gardenlinux.github.__main__:main" pythonpath = ["src"] norecursedirs = "test-data" +[tool.bandit] +skips = ["B101", "B404", "B310"] # allow asserts, subprocesses, urlopen +exclude_dirs = ["tests"] + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 7fc4f9f9..9cfd7bc9 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -24,6 +24,7 @@ GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME = "gardenlinux-github-releases" +REQUESTS_TIMEOUTS = (5, 30) # connect, read CLOUD_FULLNAME_DICT = { "ali": "Alibaba Cloud", @@ -568,7 +569,7 @@ def release_notes_changes_section(gardenlinux_version): """ try: url = f"https://glvd.ingress.glvd.gardnlinux.shoot.canary.k8s-hana.ondemand.com/v1/patchReleaseNotes/{gardenlinux_version}" - response = requests.get(url) + response = requests.get(url, timeout=REQUESTS_TIMEOUTS) response.raise_for_status() # Will raise an error for bad responses data = response.json() @@ -743,6 +744,7 @@ def create_github_release(owner, repo, tag, commitish, body): f"https://api.github.com/repos/{owner}/{repo}/releases", headers=headers, data=json.dumps(data), + timeout=REQUESTS_TIMEOUTS ) if response.status_code == 201: @@ -782,7 +784,7 @@ def upload_to_github_release_page( LOGGER.error(f"Error reading file {file_to_upload}: {e}") return - response = requests.post(upload_url, headers=headers, data=file_contents) + response = requests.post(upload_url, headers=headers, data=file_contents, timeout=REQUESTS_TIMEOUTS) if response.status_code == 201: LOGGER.info("Upload successful") else: From 932fa28454f1f370a1409934ecd1fe51ec71affc Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 15 Sep 2025 09:55:27 +0200 Subject: [PATCH 58/92] reverted dev-mode changes to GHA workflows --- .github/actions/features_parse/action.yml | 2 +- .github/actions/flavors_parse/action.yml | 2 +- .github/actions/setup/action.yml | 29 +++++++++++------------ 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/.github/actions/features_parse/action.yml b/.github/actions/features_parse/action.yml index 30206248..b582b6f0 100644 --- a/.github/actions/features_parse/action.yml +++ b/.github/actions/features_parse/action.yml @@ -14,7 +14,7 @@ outputs: runs: using: composite steps: - - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@3054-move-github-workflows-py-to-python-gardenlinux-lib + - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@0.10.0 - id: result shell: bash run: | diff --git a/.github/actions/flavors_parse/action.yml b/.github/actions/flavors_parse/action.yml index 0160bfec..c2f72973 100644 --- a/.github/actions/flavors_parse/action.yml +++ b/.github/actions/flavors_parse/action.yml @@ -19,7 +19,7 @@ outputs: runs: using: composite steps: - - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@3054-move-github-workflows-py-to-python-gardenlinux-lib + - uses: gardenlinux/python-gardenlinux-lib/.github/actions/setup@0.10.0 with: version: ${{ inputs.version }} diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 655889c7..f7f933d2 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -23,21 +23,20 @@ outputs: runs: using: composite steps: - # - name: Evaluate Python environment - # if: ${{ !env.ACT }} - # id: env-check - # shell: bash - # run: | - # # Determine cache type based on available lockfile - # if [ -f poetry.lock ]; then - # echo "package_tool=poetry" >> $GITHUB_OUTPUT - # elif [ -f requirements.txt ]; then - # echo "package_tool=pip" >> $GITHUB_OUTPUT - # else - # # no lockfile present: create one and use pip caching - # echo "gardenlinux @ git+https://github.com/gardenlinux/python-gardenlinux-lib.git@${{ inputs.version }}" | tee -a requirements.txt - # echo "package_tool=pip" >> $GITHUB_OUTPUT - # fi + - name: Evaluate Python environment + id: env-check + shell: bash + run: | + # Determine cache type based on available lockfile + if [ -f poetry.lock ]; then + echo "package_tool=poetry" >> $GITHUB_OUTPUT + elif [ -f requirements.txt ]; then + echo "package_tool=pip" >> $GITHUB_OUTPUT + else + # no lockfile present: create one and use pip caching + echo "gardenlinux @ git+https://github.com/gardenlinux/python-gardenlinux-lib.git@${{ inputs.version }}" | tee -a requirements.txt + echo "package_tool=pip" >> $GITHUB_OUTPUT + fi - name: Install Poetry if: steps.env-check.outputs.package_tool == 'poetry' From e22a7bb7298f692e4931f2822cc4d3c54588c2bb Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 15 Sep 2025 10:27:34 +0200 Subject: [PATCH 59/92] poetry.lock updated --- poetry.lock | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/poetry.lock b/poetry.lock index 56ed5614..758c0599 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.2.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "alabaster" @@ -130,18 +130,18 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.40.27" +version = "1.40.30" description = "The AWS SDK for Python" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "boto3-1.40.27-py3-none-any.whl", hash = "sha256:397d8cde7924f03b25eb553d5ed69293697dbfa1ca29b07369b3fa2df8318eca"}, - {file = "boto3-1.40.27.tar.gz", hash = "sha256:bf1e0f5aa79dbeedff14926dc2eb1b57bc119fa9015a190a24b6cd5bf9a60e9a"}, + {file = "boto3-1.40.30-py3-none-any.whl", hash = "sha256:04e89abf61240857bf7dec160e22f097eec68c502509b2bb3c5010a22cb91052"}, + {file = "boto3-1.40.30.tar.gz", hash = "sha256:e95db539c938710917f4cb4fc5915f71b27f2c836d949a1a95df7895d2e9ec8b"}, ] [package.dependencies] -botocore = ">=1.40.27,<1.41.0" +botocore = ">=1.40.30,<1.41.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.14.0,<0.15.0" @@ -150,14 +150,14 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.40.27" +version = "1.40.30" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "botocore-1.40.27-py3-none-any.whl", hash = "sha256:47441c94913740f5c24abf3d7f6fa534f12705e4c6669cd2e8443f3b3ca9d7ca"}, - {file = "botocore-1.40.27.tar.gz", hash = "sha256:f7cb28668751d85adc7f17929efa684640d8e2739800a86a05d4bc38f8443d1c"}, + {file = "botocore-1.40.30-py3-none-any.whl", hash = "sha256:1d87874ad81234bec3e83f9de13618f67ccdfefd08d6b8babc041cd45007447e"}, + {file = "botocore-1.40.30.tar.gz", hash = "sha256:8a74f77cfe5c519826d22f7613f89544cbb8491a1a49d965031bd997f89a8e3f"}, ] [package.dependencies] @@ -187,7 +187,6 @@ description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.9" groups = ["main", "dev"] -markers = "platform_python_implementation != \"PyPy\"" files = [ {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, @@ -274,6 +273,7 @@ files = [ {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] +markers = {dev = "platform_python_implementation != \"PyPy\""} [package.dependencies] pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} @@ -946,7 +946,6 @@ description = "C parser in Python" optional = false python-versions = ">=3.8" groups = ["main", "dev"] -markers = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"" files = [ {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, @@ -1674,14 +1673,14 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "xmltodict" -version = "0.15.1" +version = "1.0.0" description = "Makes working with XML feel like you are working with JSON" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "xmltodict-0.15.1-py2.py3-none-any.whl", hash = "sha256:dcd84b52f30a15be5ac4c9099a0cb234df8758624b035411e329c5c1e7a49089"}, - {file = "xmltodict-0.15.1.tar.gz", hash = "sha256:3d8d49127f3ce6979d40a36dbcad96f8bab106d232d24b49efdd4bd21716983c"}, + {file = "xmltodict-1.0.0-py3-none-any.whl", hash = "sha256:64316adb5e30ca21ad5cf391f4f0f6b34f673d96b79574f1db1e32b13b43ee34"}, + {file = "xmltodict-1.0.0.tar.gz", hash = "sha256:f50eb9020d28c673b40bbe3f43458ee165f0267c67f8ad8df0d70d9a4f3ac824"}, ] [metadata] From 0ea4100ff19e38312a93739bfedbbbcfd79460f7 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 15 Sep 2025 12:24:33 +0200 Subject: [PATCH 60/92] isort added to dev dependencies --- poetry.lock | 18 +++++++++++++++++- pyproject.toml | 1 + 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 758c0599..cc473446 100644 --- a/poetry.lock +++ b/poetry.lock @@ -607,6 +607,22 @@ files = [ {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, ] +[[package]] +name = "isort" +version = "6.0.1" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.9.0" +groups = ["dev"] +files = [ + {file = "isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615"}, + {file = "isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450"}, +] + +[package.extras] +colors = ["colorama"] +plugins = ["setuptools"] + [[package]] name = "jinja2" version = "3.1.6" @@ -1686,4 +1702,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = "^3.13" -content-hash = "db941862c1994bddda0357554f8cb7c5773d961b0666a773c06e6edb993a7b46" +content-hash = "aa2deafe22cde5b10430fe31900069524b2f6c52a4a4b0d3ca27d389d7767f12" diff --git a/pyproject.toml b/pyproject.toml index 1de63594..aaec5776 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,6 +27,7 @@ moto = "^5.1.12" python-dotenv = "^1.1.1" pytest = "^8.4.1" pytest-cov = "^6.3.0" +isort = "^6.0.1" [tool.poetry.group.docs.dependencies] sphinx-rtd-theme = "^3.0.2" From 3e00c6c083f11efbd3802d7fd57d42511065aca7 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 15 Sep 2025 12:24:49 +0200 Subject: [PATCH 61/92] proper imports sorting --- src/gardenlinux/github/__main__.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 9cfd7bc9..0f8bd68e 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -1,24 +1,25 @@ -from gardenlinux.apt import DebsrcFile -from gardenlinux.apt.package_repo_info import GardenLinuxRepo, compare_repo -from gardenlinux.features import CName -from gardenlinux.flavors import Parser as FlavorsParser -from gardenlinux.s3 import S3Artifacts -from pathlib import Path -from yaml.loader import SafeLoader import argparse import gzip import json import os import re -import requests import shutil import sys -from git import Repo import textwrap -import yaml import urllib.request +from pathlib import Path + +import requests +import yaml +from git import Repo +from yaml.loader import SafeLoader +from ..apt import DebsrcFile, GardenLinuxRepo +from ..apt.package_repo_info import compare_repo +from ..features import CName +from ..flavors import Parser as FlavorsParser from ..logger import LoggerSetup +from ..s3 import S3Artifacts LOGGER = LoggerSetup.get_logger("gardenlinux.github") From 721a013775fa22b81895a0679d493d25df6847b3 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 15 Sep 2025 12:25:03 +0200 Subject: [PATCH 62/92] default exports for apt module --- src/gardenlinux/apt/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gardenlinux/apt/__init__.py b/src/gardenlinux/apt/__init__.py index 3e0ca58c..3d2dfb7c 100644 --- a/src/gardenlinux/apt/__init__.py +++ b/src/gardenlinux/apt/__init__.py @@ -5,5 +5,6 @@ """ from .debsource import Debsrc, DebsrcFile +from .package_repo_info import GardenLinuxRepo -__all__ = ["Debsrc", "DebsrcFile"] +__all__ = ["Debsrc", "DebsrcFile", "GardenLinuxRepo"] From 601ca8cd3f343e1d63b5b115880dab5bf0cda56d Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 15 Sep 2025 12:56:29 +0200 Subject: [PATCH 63/92] got rid of urllib --- src/gardenlinux/github/__main__.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 0f8bd68e..b7cac003 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -1,12 +1,12 @@ import argparse import gzip +import io import json import os import re import shutil import sys import textwrap -import urllib.request from pathlib import Path import requests @@ -673,13 +673,17 @@ def compare_apt_repo_versions(previous_version, current_version): def _get_package_list(gardenlinux_version): - (path, headers) = urllib.request.urlretrieve( - f"https://packages.gardenlinux.io/gardenlinux/dists/{gardenlinux_version}/main/binary-amd64/Packages.gz" - ) - with gzip.open(path, "rt") as f: - d = DebsrcFile() - d.read(f) - return d + url = f"https://packages.gardenlinux.io/gardenlinux/dists/{gardenlinux_version}/main/binary-amd64/Packages.gz" + response = requests.get(url, timeout=REQUESTS_TIMEOUTS) + response.raise_for_status() + + d = DebsrcFile() + + with io.BytesIO(response.content) as buf: + with gzip.open(buf, "rt") as f: + d.read(f) + + return d def create_github_release_notes(gardenlinux_version, commitish): From c99b904ef65b418597072fd563d34913fcb14b1b Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 15 Sep 2025 13:01:38 +0200 Subject: [PATCH 64/92] removed unused function --- src/gardenlinux/github/__main__.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index b7cac003..42173a8d 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -549,19 +549,6 @@ def download_all_metadata_files(version, commitish): return [str(artifact) for artifact in local_dest_path.iterdir()] -def _parse_match_section(pkg_list: list): - output = "" - for pkg in pkg_list: - # If is dict, the package has additional information relevant for release notes - if isinstance(pkg, dict): - pkg_string = next(iter(pkg)) - output += f"\n{pkg_string}:\n" - for item in pkg[pkg_string]: - for k, v in item.items(): - output += f" * {k}: {v}\n" - return output - - def release_notes_changes_section(gardenlinux_version): """ Get list of fixed CVEs, grouped by upgraded package. From 1c550791a71d9a69523806f78f1c2f626285693a Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 15 Sep 2025 13:46:50 +0200 Subject: [PATCH 65/92] constant for release id file name --- src/gardenlinux/github/__main__.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 42173a8d..17a39dcc 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -25,6 +25,8 @@ GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME = "gardenlinux-github-releases" +RELEASE_ID_FILE = ".github_release_id" + REQUESTS_TIMEOUTS = (5, 30) # connect, read CLOUD_FULLNAME_DICT = { @@ -704,11 +706,11 @@ def create_github_release_notes(gardenlinux_version, commitish): def write_to_release_id_file(release_id): try: - with open(".github_release_id", "w") as file: + with open(RELEASE_ID_FILE, "w") as file: file.write(release_id) - LOGGER.info("Created .github_release_id successfully.") + LOGGER.info(f"Created {RELEASE_ID_FILE} successfully.") except IOError as e: - LOGGER.error(f"Could not create .github_release_id file: {e}") + LOGGER.error(f"Could not create {RELEASE_ID_FILE} file: {e}") sys.exit(1) From 83fae3738c46d3dc7a193bffb62a08225ad33098 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 15 Sep 2025 17:08:01 +0200 Subject: [PATCH 66/92] added ptpython to dev deps, cleaned up bandit excludes --- poetry.lock | 98 +++++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 3 +- 2 files changed, 99 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index cc473446..bb8054be 100644 --- a/poetry.lock +++ b/poetry.lock @@ -12,6 +12,18 @@ files = [ {file = "alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e"}, ] +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + [[package]] name = "apt-repo" version = "0.5" @@ -623,6 +635,26 @@ files = [ colors = ["colorama"] plugins = ["setuptools"] +[[package]] +name = "jedi" +version = "0.19.2" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +groups = ["dev"] +files = [ + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, +] + +[package.dependencies] +parso = ">=0.8.4,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] + [[package]] name = "jinja2" version = "3.1.6" @@ -910,6 +942,22 @@ files = [ {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] +[[package]] +name = "parso" +version = "0.8.5" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +groups = ["dev"] +files = [ + {file = "parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887"}, + {file = "parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + [[package]] name = "pathspec" version = "0.12.1" @@ -955,6 +1003,42 @@ files = [ dev = ["pre-commit", "tox"] testing = ["coverage", "pytest", "pytest-benchmark"] +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955"}, + {file = "prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "ptpython" +version = "3.0.31" +description = "Python REPL build on top of prompt_toolkit" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "ptpython-3.0.31-py3-none-any.whl", hash = "sha256:ddd25fadb6f2ecd4469a699c068d2dcd40d77c7105922569bba6dc79c0523458"}, + {file = "ptpython-3.0.31.tar.gz", hash = "sha256:4fed0be42bad01b7c299922cf262f51d8a77c9c8ab8e261c902e981a57439c13"}, +] + +[package.dependencies] +appdirs = "*" +jedi = ">=0.16.0" +prompt_toolkit = ">=3.0.43,<3.1.0" +pygments = "*" + +[package.extras] +ptipython = ["ipython"] + [[package]] name = "pycparser" version = "2.23" @@ -1669,6 +1753,18 @@ h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + [[package]] name = "werkzeug" version = "3.1.3" @@ -1702,4 +1798,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = "^3.13" -content-hash = "aa2deafe22cde5b10430fe31900069524b2f6c52a4a4b0d3ca27d389d7767f12" +content-hash = "9bea7e97ec41a8baf6aedb368eeb061cf16cebc8d471f6c2c28e6005166ae027" diff --git a/pyproject.toml b/pyproject.toml index aaec5776..76a5092b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,7 @@ python-dotenv = "^1.1.1" pytest = "^8.4.1" pytest-cov = "^6.3.0" isort = "^6.0.1" +ptpython = "^3.0.31" [tool.poetry.group.docs.dependencies] sphinx-rtd-theme = "^3.0.2" @@ -45,7 +46,7 @@ pythonpath = ["src"] norecursedirs = "test-data" [tool.bandit] -skips = ["B101", "B404", "B310"] # allow asserts, subprocesses, urlopen +skips = ["B101", "B404"] # allow asserts, subprocesses exclude_dirs = ["tests"] [build-system] From f789749922bf6e598ce7c7c71cf56052e7229a62 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Tue, 16 Sep 2025 08:58:30 +0200 Subject: [PATCH 67/92] integration tests for release notes generation routines --- src/gardenlinux/github/__init__.py | 3 + test-data/github_release_notes_1877.3.md | 1208 ++++++++++++++++++++++ tests/github/__init__.py | 0 tests/github/test_release_page.py | 38 + 4 files changed, 1249 insertions(+) create mode 100644 test-data/github_release_notes_1877.3.md create mode 100644 tests/github/__init__.py create mode 100644 tests/github/test_release_page.py diff --git a/src/gardenlinux/github/__init__.py b/src/gardenlinux/github/__init__.py index e69de29b..d5ef54fc 100644 --- a/src/gardenlinux/github/__init__.py +++ b/src/gardenlinux/github/__init__.py @@ -0,0 +1,3 @@ +from .__main__ import create_github_release_notes + +__all__ = ["create_github_release_notes"] diff --git a/test-data/github_release_notes_1877.3.md b/test-data/github_release_notes_1877.3.md new file mode 100644 index 00000000..ac22830f --- /dev/null +++ b/test-data/github_release_notes_1877.3.md @@ -0,0 +1,1208 @@ +## Changes +The following packages have been upgraded, to address the mentioned CVEs: +- upgrade 'gnutls28' from `3.8.9-2` to `3.8.9-3gl0+bp1877` + - CVE-2025-32988 + - CVE-2025-32989 + - CVE-2025-32990 + - CVE-2025-6395 +- upgrade 'sqlite3' from `3.46.1-4` to `3.46.1-7gl0+bp1877` + - CVE-2025-6965 +- upgrade 'dpkg' from `1.22.18` to `1.22.21gl0+bp1877` + - CVE-2025-6297 +- upgrade 'linux' from `6.12.40-2gl0` to `6.12.44-3gl0` + - CVE-2025-38676 + - CVE-2025-38683 + - CVE-2025-38684 + - CVE-2025-38686 + - CVE-2025-38687 + - CVE-2025-38688 + - CVE-2025-38691 + - CVE-2025-38692 + - CVE-2025-38695 + - CVE-2025-38696 + - CVE-2025-38699 + - CVE-2025-38700 + - CVE-2025-38701 + - CVE-2025-38704 + - CVE-2025-38708 + - CVE-2025-38709 + - CVE-2025-38710 + - CVE-2025-38711 + - CVE-2025-38717 + - CVE-2025-38718 + - CVE-2025-38721 + - CVE-2025-38722 + - CVE-2025-38724 + - CVE-2025-38726 + - CVE-2025-38727 + - CVE-2025-38728 + - CVE-2025-38730 + - CVE-2025-38601 + - CVE-2025-38604 + - CVE-2025-38608 + - CVE-2025-38609 + - CVE-2025-38610 + - CVE-2025-38614 + - CVE-2022-50031 + - CVE-2022-50083 + - CVE-2023-53137 + - CVE-2025-37744 + - CVE-2025-38500 + - CVE-2025-38501 + - CVE-2025-38732 + - CVE-2025-38734 + - CVE-2025-38735 + - CVE-2025-38737 + - CVE-2025-39673 + - CVE-2025-39676 + - CVE-2025-39681 + - CVE-2025-39682 + - CVE-2025-39683 + - CVE-2025-39684 + - CVE-2025-39685 + - CVE-2025-39686 + - CVE-2025-39689 + - CVE-2025-39691 + - CVE-2025-39692 + - CVE-2025-39695 + - CVE-2025-39697 + - CVE-2025-39698 + - CVE-2025-39700 + - CVE-2025-39701 + - CVE-2025-39702 + - CVE-2025-39703 + - CVE-2025-39718 + - CVE-2025-39720 + - CVE-2025-39721 + - CVE-2025-39722 + - CVE-2025-39724 + - CVE-2025-39727 + - CVE-2025-39730 + - CVE-2025-39732 + - CVE-2025-21884 + - CVE-2025-38335 + - CVE-2025-38351 + - CVE-2025-38553 + - CVE-2025-38559 + - CVE-2025-38560 + - CVE-2025-38561 + - CVE-2025-38562 + - CVE-2025-38563 + - CVE-2025-38565 + - CVE-2025-38566 + - CVE-2025-38568 + - CVE-2025-38569 + - CVE-2025-38571 + - CVE-2025-38572 + - CVE-2025-38574 + - CVE-2025-38581 + - CVE-2025-38582 + - CVE-2025-38583 + - CVE-2025-38586 + - CVE-2025-38587 + - CVE-2025-38588 + - CVE-2025-38590 + - CVE-2025-38593 + - CVE-2025-38616 + - CVE-2025-38617 + - CVE-2025-38618 + - CVE-2025-38622 + - CVE-2025-38624 + - CVE-2025-38625 + - CVE-2025-38628 + - CVE-2025-38631 + - CVE-2025-38632 + - CVE-2025-38634 + - CVE-2025-38635 + - CVE-2025-38639 + - CVE-2025-38640 + - CVE-2025-38644 + - CVE-2025-38645 + - CVE-2025-38646 + - CVE-2025-38653 + - CVE-2025-38659 + - CVE-2025-38660 + - CVE-2025-38666 + - CVE-2025-38668 + - CVE-2025-38670 + - CVE-2025-38675 + - CVE-2025-39736 + - CVE-2025-39737 + - CVE-2025-39738 + - CVE-2025-39739 + - CVE-2025-39742 + - CVE-2025-39744 + - CVE-2025-39746 + - CVE-2025-39748 + - CVE-2025-39749 + - CVE-2025-39750 + - CVE-2025-39752 + - CVE-2025-39753 + - CVE-2025-39754 + - CVE-2025-39756 + - CVE-2025-39758 + - CVE-2025-39759 + - CVE-2025-39761 + - CVE-2025-39763 + - CVE-2025-39766 + - CVE-2025-39770 + - CVE-2025-39773 + - CVE-2025-39776 + - CVE-2025-39779 + - CVE-2025-39780 + - CVE-2025-39782 + - CVE-2025-39783 + - CVE-2025-39787 + - CVE-2025-39788 + - CVE-2025-39790 + - CVE-2025-39791 +- upgrade 'iputils' from `3:20240905-3` to `3:20250605-1gl0~bp1877` + - CVE-2025-47268 + +## Software Component Versions +``` +containerd 2.1.4-0gl1+bp1877 +curl 8.14.1-2gl0+bp1877 +libc-bin 2.41-7 +linux-image-amd64 6.12.44-3gl0 +openssh-server 1:10.0p1-5gl0 +openssl 3.5.0-1gl0 +runc 1.3.0-1gl0+bp1877 +systemd 257.5-2gl0 +``` + +## Changes in Package Versions Compared to 1877.2 +| Package | 1877.2 | 1877.3 | +|---------|--------------------|-------------------| +|bpftool | 7.5.0+6.12.40-2gl0 | 7.5.0+6.12.44-3gl0 | +|bpftool-dbgsym | 7.5.0+6.12.40-2gl0 | 7.5.0+6.12.44-3gl0 | +|dpkg | 1.22.18 | 1.22.21gl0+bp1877 | +|dpkg-dbgsym | - | 1.22.21gl0+bp1877 | +|dpkg-dev | 1.22.18 | 1.22.21gl0+bp1877 | +|dselect | - | 1.22.21gl0+bp1877 | +|dselect-dbgsym | - | 1.22.21gl0+bp1877 | +|gnutls-bin | - | 3.8.9-3gl0+bp1877 | +|gnutls-bin-dbgsym | - | 3.8.9-3gl0+bp1877 | +|gnutls-doc | - | 3.8.9-3gl0+bp1877 | +|golang-github-opencontainers-runc-dev | 1.1.15+ds1-2gl1+bp1877 | 1.3.0-1gl0+bp1877 | +|hyperv-daemons | 6.12.40-2gl0 | 6.12.44-3gl0 | +|hyperv-daemons-dbgsym | 6.12.40-2gl0 | 6.12.44-3gl0 | +|intel-sdsi | 6.12.40-2gl0 | 6.12.44-3gl0 | +|intel-sdsi-dbgsym | 6.12.40-2gl0 | 6.12.44-3gl0 | +|iputils-arping | 3:20240905-3 | 3:20250605-1gl0~bp1877 | +|iputils-arping-dbgsym | - | 3:20250605-1gl0~bp1877 | +|iputils-clockdiff | - | 3:20250605-1gl0~bp1877 | +|iputils-clockdiff-dbgsym | - | 3:20250605-1gl0~bp1877 | +|iputils-ping | 3:20240905-3 | 3:20250605-1gl0~bp1877 | +|iputils-ping-dbgsym | - | 3:20250605-1gl0~bp1877 | +|iputils-tracepath | 3:20240905-3 | 3:20250605-1gl0~bp1877 | +|iputils-tracepath-dbgsym | - | 3:20250605-1gl0~bp1877 | +|lemon | - | 3.46.1-7gl0+bp1877 | +|lemon-dbgsym | - | 3.46.1-7gl0+bp1877 | +|libcpupower-dev | 6.12.40-2gl0 | 6.12.44-3gl0 | +|libcpupower1 | 6.12.40-2gl0 | 6.12.44-3gl0 | +|libcpupower1-dbgsym | 6.12.40-2gl0 | 6.12.44-3gl0 | +|libdpkg-dev | - | 1.22.21gl0+bp1877 | +|libdpkg-perl | 1.22.18 | 1.22.21gl0+bp1877 | +|libgnutls-dane0t64 | 3.8.9-2 | 3.8.9-3gl0+bp1877 | +|libgnutls-dane0t64-dbgsym | - | 3.8.9-3gl0+bp1877 | +|libgnutls-openssl27t64 | 3.8.9-2 | 3.8.9-3gl0+bp1877 | +|libgnutls-openssl27t64-dbgsym | - | 3.8.9-3gl0+bp1877 | +|libgnutls28-dev | 3.8.9-2 | 3.8.9-3gl0+bp1877 | +|libgnutls30t64 | 3.8.9-2 | 3.8.9-3gl0+bp1877 | +|libgnutls30t64-dbgsym | - | 3.8.9-3gl0+bp1877 | +|libmd-dev | - | 1.1.0-2+b1 | +|libsqlite3-0 | 3.46.1-4 | 3.46.1-7gl0+bp1877 | +|libsqlite3-0-dbgsym | - | 3.46.1-7gl0+bp1877 | +|libsqlite3-dev | - | 3.46.1-7gl0+bp1877 | +|libsqlite3-ext-csv | - | 3.46.1-7gl0+bp1877 | +|libsqlite3-ext-csv-dbgsym | - | 3.46.1-7gl0+bp1877 | +|libsqlite3-ext-icu | - | 3.46.1-7gl0+bp1877 | +|libsqlite3-ext-icu-dbgsym | - | 3.46.1-7gl0+bp1877 | +|libsqlite3-tcl | - | 3.46.1-7gl0+bp1877 | +|libsqlite3-tcl-dbgsym | - | 3.46.1-7gl0+bp1877 | +|linux-base | 4.11 | 4.12gl0+bp1877 | +|linux-bpf-dev | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-config-6.12 | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-cpupower | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-cpupower-dbgsym | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-headers-6.12.40-amd64 | 6.12.40-2gl0 | - | +|linux-headers-6.12.40-cloud-amd64 | 6.12.40-2gl0 | - | +|linux-headers-6.12.40-common | 6.12.40-2gl0 | - | +|linux-headers-6.12.40-firecracker-amd64 | 6.12.40-2gl0 | - | +|linux-headers-6.12.44-amd64 | - | 6.12.44-3gl0 | +|linux-headers-6.12.44-cloud-amd64 | - | 6.12.44-3gl0 | +|linux-headers-6.12.44-common | - | 6.12.44-3gl0 | +|linux-headers-6.12.44-firecracker-amd64 | - | 6.12.44-3gl0 | +|linux-headers-amd64 | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-headers-cloud-amd64 | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-headers-firecracker-amd64 | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-image-6.12.40-amd64 | 6.12.40-2gl0 | - | +|linux-image-6.12.40-amd64-dbg | 6.12.40-2gl0 | - | +|linux-image-6.12.40-cloud-amd64 | 6.12.40-2gl0 | - | +|linux-image-6.12.40-cloud-amd64-dbg | 6.12.40-2gl0 | - | +|linux-image-6.12.40-firecracker-amd64 | 6.12.40-2gl0 | - | +|linux-image-6.12.40-firecracker-amd64-dbg | 6.12.40-2gl0 | - | +|linux-image-6.12.44-amd64 | - | 6.12.44-3gl0 | +|linux-image-6.12.44-amd64-dbg | - | 6.12.44-3gl0 | +|linux-image-6.12.44-cloud-amd64 | - | 6.12.44-3gl0 | +|linux-image-6.12.44-cloud-amd64-dbg | - | 6.12.44-3gl0 | +|linux-image-6.12.44-firecracker-amd64 | - | 6.12.44-3gl0 | +|linux-image-6.12.44-firecracker-amd64-dbg | - | 6.12.44-3gl0 | +|linux-image-amd64 | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-image-amd64-dbg | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-image-cloud-amd64 | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-image-cloud-amd64-dbg | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-image-firecracker-amd64 | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-image-firecracker-amd64-dbg | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-kbuild-6.12.40 | 6.12.40-2gl0 | - | +|linux-kbuild-6.12.40-dbgsym | 6.12.40-2gl0 | - | +|linux-kbuild-6.12.44 | - | 6.12.44-3gl0 | +|linux-kbuild-6.12.44-dbgsym | - | 6.12.44-3gl0 | +|linux-libc-dev | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-source | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-source-6.12 | 6.12.40-2gl0 | 6.12.44-3gl0 | +|linux-support-6.12.40 | 6.12.40-2gl0 | - | +|linux-support-6.12.44 | - | 6.12.44-3gl0 | +|linux-sysctl-defaults | 4.11 | 4.12gl0+bp1877 | +|rtla | 6.12.40-2gl0 | 6.12.44-3gl0 | +|rtla-dbgsym | 6.12.40-2gl0 | 6.12.44-3gl0 | +|runc | 1.1.15+ds1-2gl1+bp1877 | 1.3.0-1gl0+bp1877 | +|runc-dbgsym | 1.1.15+ds1-2gl1+bp1877 | 1.3.0-1gl0+bp1877 | +|sqlite3 | - | 3.46.1-7gl0+bp1877 | +|sqlite3-dbgsym | - | 3.46.1-7gl0+bp1877 | +|sqlite3-doc | - | 3.46.1-7gl0+bp1877 | +|sqlite3-tools | - | 3.46.1-7gl0+bp1877 | +|sqlite3-tools-dbgsym | - | 3.46.1-7gl0+bp1877 | +|usbip | 2.0+6.12.40-2gl0 | 2.0+6.12.44-3gl0 | +|usbip-dbgsym | 2.0+6.12.40-2gl0 | 2.0+6.12.44-3gl0 | +## Published Images + +
+📊 Table View + +| Variant | Platform | Architecture | Flavor | Regions & Image IDs | Download Links | +|---------|----------|--------------|--------|---------------------|----------------| +| Default | Alibaba Cloud | amd64 | `ali-gardener_prod-amd64-1877.3-75df9f40` |
28 regions
**cn-qingdao:** m-m5efm8l2bltkbloui235
**cn-beijing:** m-2zee5ebi20ltzy5et7in
**cn-zhangjiakou:** m-8vbddy2wfex9nb29afcy
**cn-huhehaote:** m-hp3bx14og6cw9thujw1d
**cn-wulanchabu:** m-0jlh1iq2f3bryb5okjdk
**cn-hangzhou:** m-bp13aseh5a2wn0s5rdz6
**cn-shanghai:** m-uf61jbe9n8a9291h4u21
**cn-nanjing:** m-gc77bfbctuzphl2bpk0o
**cn-shenzhen:** m-wz9gio8m5ey0foj0g4xx
**cn-heyuan:** m-f8zdn54v0blnsafxb1t5
**cn-guangzhou:** m-7xv0q5feffsxxyttxdy9
**cn-fuzhou:** m-gw07bfbctuzphl2bpk0p
**cn-wuhan-lr:** m-n4a1u2avlb9pq0u5bdms
**cn-chengdu:** m-2vc5saul2saa2z57h216
**cn-hongkong:** m-j6c4zk6mwb2673iq5wrz
**ap-northeast-1:** m-6weibwo3vrt7ar7nelc9
**ap-northeast-2:** m-mj73oldn06th2vy0ymhv
**ap-southeast-1:** m-t4ngrf81d0fohwq493pw
**ap-southeast-3:** m-8psd64gzc1eru0qld7cc
**ap-southeast-6:** m-5tsdd6k3z1vvdyyio7zn
**ap-southeast-5:** m-k1aj4usnhqcssa2fpy0c
**ap-southeast-7:** m-0jo6uwekvn0gnwhwnq3s
**us-east-1:** m-0xi8netpfc2fdwfstz3c
**us-west-1:** m-rj9gwpx907qv6p6x8w45
**na-south-1:** m-4hfi34x77oaeznwuulq6
**eu-west-1:** m-d7o2ny5xc0m3kacxjbem
**me-east-1:** m-eb39mgohcec6gaynet9l
**eu-central-1:** m-gw86dlqmpaugljiykx91
|
Download
[ali-gardener_prod-amd64-1877.3-75df9f40.qcow2](https://gardenlinux-github-releases.s3.amazonaws.com/objects/ali-gardener_prod-amd64-1877.3-75df9f40/ali-gardener_prod-amd64-1877.3-75df9f40.qcow2)
| +| Default | Amazon Web Services | amd64 | `aws-gardener_prod-amd64-1877.3-75df9f40` |
21 regions
**ap-south-1:** ami-00c6adf1de4dd746a
**eu-north-1:** ami-07ad3940828172b90
**eu-west-3:** ami-071f4f48679d86638
**eu-south-1:** ami-0b10af1a19df9f038
**eu-west-2:** ami-0e2b7fe07573b71cd
**eu-west-1:** ami-01c547eb85d61da61
**ap-northeast-3:** ami-0dad917ede94cd3c7
**ap-northeast-2:** ami-0ecbeaf40d4643016
**ap-northeast-1:** ami-0b7225242babad11c
**me-central-1:** ami-0d298e552bf051bc7
**ca-central-1:** ami-0af8422162c8f056e
**sa-east-1:** ami-05d885175e942fc80
**ap-southeast-1:** ami-0a9802680adf7e430
**ap-southeast-2:** ami-07ed6f1e62fbd6d66
**us-east-1:** ami-055a0ce37433fcdee
**us-east-2:** ami-07e9069631850755a
**us-west-1:** ami-08c18abab76066f71
**us-west-2:** ami-00eca0475f90a1f8c
**eu-central-1:** ami-0198822fa7d539f8c
**cn-north-1:** ami-093c993faaca89b4d
**cn-northwest-1:** ami-05e1cc73d997d67b7
|
Download
[aws-gardener_prod-amd64-1877.3-75df9f40.raw](https://gardenlinux-github-releases.s3.amazonaws.com/objects/aws-gardener_prod-amd64-1877.3-75df9f40/aws-gardener_prod-amd64-1877.3-75df9f40.raw)
| +| Default | Amazon Web Services | arm64 | `aws-gardener_prod-arm64-1877.3-75df9f40` |
21 regions
**ap-south-1:** ami-00cd00c30d19609a2
**eu-north-1:** ami-0a969a1a1c4726831
**eu-west-3:** ami-0b579f6c70b7c4fe6
**eu-south-1:** ami-06c38608e2e7223d3
**eu-west-2:** ami-005c7058c3923b2eb
**eu-west-1:** ami-0395c3cd38a0a5cd6
**ap-northeast-3:** ami-0db3697cea87a5104
**ap-northeast-2:** ami-084444f62c7c580fb
**ap-northeast-1:** ami-017237dd9abeae8dd
**me-central-1:** ami-08efdb3153d0cd184
**ca-central-1:** ami-05b535ae9418fee3d
**sa-east-1:** ami-036ded98bad763e3c
**ap-southeast-1:** ami-03fcefb2fd18519d0
**ap-southeast-2:** ami-040f9d0caa5d79e84
**us-east-1:** ami-04110d6a1970e748c
**us-east-2:** ami-0c8dc664a21d5ca08
**us-west-1:** ami-0ddc462d075935666
**us-west-2:** ami-0e67c2546e54fed06
**eu-central-1:** ami-06a2a1e7da947b192
**cn-north-1:** ami-0b3755339496a3158
**cn-northwest-1:** ami-06fc0f74b500d2d82
|
Download
[aws-gardener_prod-arm64-1877.3-75df9f40.raw](https://gardenlinux-github-releases.s3.amazonaws.com/objects/aws-gardener_prod-arm64-1877.3-75df9f40/aws-gardener_prod-arm64-1877.3-75df9f40.raw)
| +| Default | Microsoft Azure | amd64 | `azure-gardener_prod-amd64-1877.3-75df9f40` |
4 gallery + 0 marketplace images
**Gallery Images:**
• V1 (public): /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme/Versions/1877.3.0
• V2 (public): /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-gen2/Versions/1877.3.0
• V1 (china): /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme/Versions/1877.3.0
• V2 (china): /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-gen2/Versions/1877.3.0
|
Download
[azure-gardener_prod-amd64-1877.3-75df9f40.vhd](https://gardenlinux-github-releases.s3.amazonaws.com/objects/azure-gardener_prod-amd64-1877.3-75df9f40/azure-gardener_prod-amd64-1877.3-75df9f40.vhd)
| +| Default | Microsoft Azure | arm64 | `azure-gardener_prod-arm64-1877.3-75df9f40` |
2 gallery + 0 marketplace images
**Gallery Images:**
• V2 (public): /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-arm64-gen2/Versions/1877.3.0
• V2 (china): /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-arm64-gen2/Versions/1877.3.0
|
Download
[azure-gardener_prod-arm64-1877.3-75df9f40.vhd](https://gardenlinux-github-releases.s3.amazonaws.com/objects/azure-gardener_prod-arm64-1877.3-75df9f40/azure-gardener_prod-arm64-1877.3-75df9f40.vhd)
| +| Default | Google Cloud Platform | amd64 | `gcp-gardener_prod-amd64-1877.3-75df9f40` |
Global availability
**Image Name:** gardenlinux-gcp-ff804026cbe7b5f2d6f729e4-1877-3-75df9f40
**Project:** sap-se-gcp-gardenlinux
**Availability:** Global (all regions)
|
Download
[gcp-gardener_prod-amd64-1877.3-75df9f40.gcpimage.tar.gz](https://gardenlinux-github-releases.s3.amazonaws.com/objects/gcp-gardener_prod-amd64-1877.3-75df9f40/gcp-gardener_prod-amd64-1877.3-75df9f40.gcpimage.tar.gz)
| +| Default | Google Cloud Platform | arm64 | `gcp-gardener_prod-arm64-1877.3-75df9f40` |
Global availability
**Image Name:** gardenlinux-gcp-c8504d3c3e67cf2fc7c3408c-1877-3-75df9f40
**Project:** sap-se-gcp-gardenlinux
**Availability:** Global (all regions)
|
Download
[gcp-gardener_prod-arm64-1877.3-75df9f40.gcpimage.tar.gz](https://gardenlinux-github-releases.s3.amazonaws.com/objects/gcp-gardener_prod-arm64-1877.3-75df9f40/gcp-gardener_prod-arm64-1877.3-75df9f40.gcpimage.tar.gz)
| +| Default | OpenStack | amd64 | `openstack-gardener_prod-amd64-1877.3-75df9f40` |
15 regions
**eu-de-1:** ed3b4c3d-941f-456a-a551-bd52b8397443 (gardenlinux-1877.3)
**eu-de-2:** 5ea6fb4f-20fc-43b8-8ffe-af8da6d61d6a (gardenlinux-1877.3)
**eu-nl-1:** ac9b5d43-ff53-494d-8adf-2249c324a9db (gardenlinux-1877.3)
**la-br-1:** 404f22a3-9822-4696-a60f-8566eedb93e3 (gardenlinux-1877.3)
**na-ca-1:** b69b72f3-574a-4f76-b4eb-ac9185ea2681 (gardenlinux-1877.3)
**na-us-1:** 40e99366-f13b-402a-a264-e7e4773ab8ba (gardenlinux-1877.3)
**na-us-2:** c50200c6-95fd-4a97-bef2-90b2d6afa3d3 (gardenlinux-1877.3)
**na-us-3:** d5b1d8c0-3420-4a82-931d-0506a6b8f166 (gardenlinux-1877.3)
**ap-ae-1:** 81c26cb7-c515-4610-949a-92c275640325 (gardenlinux-1877.3)
**ap-au-1:** 2d6e3edd-5596-41e6-a640-4b1b8e7310e7 (gardenlinux-1877.3)
**ap-cn-1:** 3564b5ef-9b37-4926-bb23-5655cf90de69 (gardenlinux-1877.3)
**ap-jp-1:** 2ff61187-f004-4317-bd4c-a17d93b475bc (gardenlinux-1877.3)
**ap-jp-2:** 2bc58951-9bf7-445b-a6e4-f634c7522d9b (gardenlinux-1877.3)
**ap-sa-1:** e4a4aa92-335a-454b-83bb-643cb918cf6a (gardenlinux-1877.3)
**ap-sa-2:** d3ac5df8-ce38-4a23-b611-dfef6b7a0db9 (gardenlinux-1877.3)
|
Download
[openstack-gardener_prod-amd64-1877.3-75df9f40.raw](https://gardenlinux-github-releases.s3.amazonaws.com/objects/openstack-gardener_prod-amd64-1877.3-75df9f40/openstack-gardener_prod-amd64-1877.3-75df9f40.raw)
| +| Default | OpenStack Baremetal | amd64 | `openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40` |
15 regions
**eu-de-1:** 01c3ab26-5b93-4655-a743-1fef60f64b53 (gardenlinux-1877.3-baremetal)
**eu-de-2:** 7488d07b-65f1-4b85-8df8-13244b895d71 (gardenlinux-1877.3-baremetal)
**eu-nl-1:** 1926a818-55d5-49e1-9af8-eab8450705eb (gardenlinux-1877.3-baremetal)
**la-br-1:** 6fda686d-d2f7-4018-ab4c-1250e898197a (gardenlinux-1877.3-baremetal)
**na-ca-1:** a032ecc1-3bee-4d65-9f68-3e3f99e2c291 (gardenlinux-1877.3-baremetal)
**na-us-1:** d663d5f1-1b44-41af-9039-e36cc64a5920 (gardenlinux-1877.3-baremetal)
**na-us-2:** 818bbfdd-4ee4-49ee-8294-dc3a3c66971f (gardenlinux-1877.3-baremetal)
**na-us-3:** b154b48b-050f-48d6-997f-b6c2756079a6 (gardenlinux-1877.3-baremetal)
**ap-ae-1:** 5992e19c-2ca2-47be-ae55-50e2fd26b662 (gardenlinux-1877.3-baremetal)
**ap-au-1:** 986403a6-e254-4689-8f81-e32dc33c9b64 (gardenlinux-1877.3-baremetal)
**ap-cn-1:** 0c794890-a690-4881-b0c2-39a939b020e2 (gardenlinux-1877.3-baremetal)
**ap-jp-1:** f5be2c30-8e8e-4713-9e34-eb0a18922af5 (gardenlinux-1877.3-baremetal)
**ap-jp-2:** 8edb20a7-f0f2-47f2-9112-faa2569c3893 (gardenlinux-1877.3-baremetal)
**ap-sa-1:** dc12514b-b0a8-40dd-b756-a4d27421029c (gardenlinux-1877.3-baremetal)
**ap-sa-2:** 617f5ae7-91fd-4149-b783-7a3701a5f420 (gardenlinux-1877.3-baremetal)
|
Download
[openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.raw](https://gardenlinux-github-releases.s3.amazonaws.com/objects/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.raw)
| +| USI | Amazon Web Services | amd64 | `aws-gardener_prod_usi-amd64-1877.3-75df9f40` |
21 regions
**ap-south-1:** ami-0e904b4c264dbe923
**eu-north-1:** ami-016f506d46abb5c06
**eu-west-3:** ami-052404d8a97e9ec57
**eu-south-1:** ami-002193c185fb2d939
**eu-west-2:** ami-0225bc62c7d291107
**eu-west-1:** ami-0f737c34ae9ccfe10
**ap-northeast-3:** ami-0ecf19a78a7259c02
**ap-northeast-2:** ami-029152bf0a15cf306
**ap-northeast-1:** ami-0bf003b58ed636124
**me-central-1:** ami-0546ca7d7c2e00077
**ca-central-1:** ami-0a0081cbd4b479d33
**sa-east-1:** ami-086d3b7282338bcd1
**ap-southeast-1:** ami-04973efd023e5883f
**ap-southeast-2:** ami-00389783d0b7ef01b
**us-east-1:** ami-0f5c28bbc45608e9b
**us-east-2:** ami-08c7494a2a00b74e5
**us-west-1:** ami-0e2290963849dba62
**us-west-2:** ami-0fb86d519a38da40f
**eu-central-1:** ami-0c6394e4fdbefe8c0
**cn-north-1:** ami-0b4c979b27a0a7714
**cn-northwest-1:** ami-0cab977e76e274599
|
Download
[aws-gardener_prod_usi-amd64-1877.3-75df9f40.raw](https://gardenlinux-github-releases.s3.amazonaws.com/objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.raw)
| +| USI | Amazon Web Services | arm64 | `aws-gardener_prod_usi-arm64-1877.3-75df9f40` |
21 regions
**ap-south-1:** ami-029f2b705d69f9d50
**eu-north-1:** ami-0b1a9e403ea563206
**eu-west-3:** ami-067465814788be84a
**eu-south-1:** ami-092d7cf152ef6df29
**eu-west-2:** ami-0441298c8ae55a62b
**eu-west-1:** ami-012e58abe02f904c1
**ap-northeast-3:** ami-08c18c5f1aa7e9fba
**ap-northeast-2:** ami-0277ca365657bd9c2
**ap-northeast-1:** ami-006a3f35202f6edd4
**me-central-1:** ami-0aa9e8af8c777e400
**ca-central-1:** ami-0f8225fd2d6009961
**sa-east-1:** ami-0e945c537aef91eff
**ap-southeast-1:** ami-0f30b29a4428f7cea
**ap-southeast-2:** ami-0129e3a207e3e6f9d
**us-east-1:** ami-0cc9f69e3a7594e7b
**us-east-2:** ami-046243dad95d56f2a
**us-west-1:** ami-03ae03953c81a43c1
**us-west-2:** ami-0cbe1dbfeda64dc9b
**eu-central-1:** ami-0dd2780bfcddbda6b
**cn-north-1:** ami-0d993477d25affb3c
**cn-northwest-1:** ami-0a7fe5959bb23fab8
|
Download
[aws-gardener_prod_usi-arm64-1877.3-75df9f40.raw](https://gardenlinux-github-releases.s3.amazonaws.com/objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.raw)
| +| USI | Microsoft Azure | amd64 | `azure-gardener_prod_usi-amd64-1877.3-75df9f40` |
2 gallery + 0 marketplace images
**Gallery Images:**
• V2 (public): /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-gen2-usi/Versions/1877.3.0
• V2 (china): /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-gen2-usi/Versions/1877.3.0
|
Download
[azure-gardener_prod_usi-amd64-1877.3-75df9f40.vhd](https://gardenlinux-github-releases.s3.amazonaws.com/objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.vhd)
| +| USI | Microsoft Azure | arm64 | `azure-gardener_prod_usi-arm64-1877.3-75df9f40` |
2 gallery + 0 marketplace images
**Gallery Images:**
• V2 (public): /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-arm64-gen2-usi/Versions/1877.3.0
• V2 (china): /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-arm64-gen2-usi/Versions/1877.3.0
|
Download
[azure-gardener_prod_usi-arm64-1877.3-75df9f40.vhd](https://gardenlinux-github-releases.s3.amazonaws.com/objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.vhd)
| +| USI | Google Cloud Platform | amd64 | `gcp-gardener_prod_usi-amd64-1877.3-75df9f40` |
Global availability
**Image Name:** gardenlinux-gcp-51db8a4be084c3b640095f4b-1877-3-75df9f40
**Project:** sap-se-gcp-gardenlinux
**Availability:** Global (all regions)
|
Download
[gcp-gardener_prod_usi-amd64-1877.3-75df9f40.gcpimage.tar.gz](https://gardenlinux-github-releases.s3.amazonaws.com/objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.gcpimage.tar.gz)
| +| USI | Google Cloud Platform | arm64 | `gcp-gardener_prod_usi-arm64-1877.3-75df9f40` |
Global availability
**Image Name:** gardenlinux-gcp-c00f1e20ffeed4d8b80a76b9-1877-3-75df9f40
**Project:** sap-se-gcp-gardenlinux
**Availability:** Global (all regions)
|
Download
[gcp-gardener_prod_usi-arm64-1877.3-75df9f40.gcpimage.tar.gz](https://gardenlinux-github-releases.s3.amazonaws.com/objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.gcpimage.tar.gz)
| +| USI | OpenStack | amd64 | `openstack-gardener_prod_usi-amd64-1877.3-75df9f40` |
15 regions
**eu-de-1:** 15fc38b3-1cee-4c0a-829a-ef1f7faa1920 (gardenlinux-1877.3)
**eu-de-2:** c4e8e8e5-8c92-4c73-b21b-333087e7b092 (gardenlinux-1877.3)
**eu-nl-1:** e6f9e054-0613-4204-98c7-84676680418a (gardenlinux-1877.3)
**la-br-1:** 04416634-2eaf-44a1-a653-b1ae36bf0e0e (gardenlinux-1877.3)
**na-ca-1:** b548d8fd-0e6b-4cb6-9cd1-68b258df00cc (gardenlinux-1877.3)
**na-us-1:** 0a97e9af-a1f3-4ae4-bf44-98c432aa436c (gardenlinux-1877.3)
**na-us-2:** b1705d73-3f67-427c-8ade-5e245a857338 (gardenlinux-1877.3)
**na-us-3:** da3234f1-307c-431e-80bb-9e51dd75673d (gardenlinux-1877.3)
**ap-ae-1:** 16f24b39-b9ba-4756-8dcd-82473182f1e4 (gardenlinux-1877.3)
**ap-au-1:** 49de0ff1-2c7e-439d-a065-07c837fe48a8 (gardenlinux-1877.3)
**ap-cn-1:** 23a94a40-1e9a-4f4b-b2b6-4c167493fbb0 (gardenlinux-1877.3)
**ap-jp-1:** 1558417d-14bb-413e-9194-88b2bc5f18aa (gardenlinux-1877.3)
**ap-jp-2:** 8d39ad55-2f09-490e-8fa7-0bdf5c854ed7 (gardenlinux-1877.3)
**ap-sa-1:** 62be0147-062a-4375-b142-278a811e9754 (gardenlinux-1877.3)
**ap-sa-2:** 510d1ff1-4fc6-49ec-ad2f-a0985217dd14 (gardenlinux-1877.3)
|
Download
[openstack-gardener_prod_usi-amd64-1877.3-75df9f40.raw](https://gardenlinux-github-releases.s3.amazonaws.com/objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.raw)
| +| TPM2 | Amazon Web Services | amd64 | `aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40` |
19 regions
**ap-south-1:** ami-0052561d7bccfe6b7
**eu-north-1:** ami-06623180935c63669
**eu-west-3:** ami-026632e35fe37f9f4
**eu-south-1:** ami-0b60116fac38c2556
**eu-west-2:** ami-0ecd844859adf35c5
**eu-west-1:** ami-0313333df0acd7eb0
**ap-northeast-3:** ami-04e53edbd6ce18fc6
**ap-northeast-2:** ami-0ae03e19777874cef
**ap-northeast-1:** ami-079e68ce96cc03e78
**me-central-1:** ami-01e368d192a479934
**ca-central-1:** ami-02cabce931cafcf1f
**sa-east-1:** ami-075d5fa3b98620e15
**ap-southeast-1:** ami-0a26b478c0a210190
**ap-southeast-2:** ami-0f226413240aec4aa
**us-east-1:** ami-07dea60f619226e1b
**us-east-2:** ami-0e8e852987ee840c3
**us-west-1:** ami-0d9314ee5a439ab29
**us-west-2:** ami-04dc4614abf1649ab
**eu-central-1:** ami-005f7dab618420a91
|
Download
[aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw](https://gardenlinux-github-releases.s3.amazonaws.com/objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw)
| +| TPM2 | Amazon Web Services | arm64 | `aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40` |
19 regions
**ap-south-1:** ami-035b751a08f528e47
**eu-north-1:** ami-04c60d1feb092d00f
**eu-west-3:** ami-0443172a73fe4fb27
**eu-south-1:** ami-02f8a867d02227542
**eu-west-2:** ami-06a900dd59c84620d
**eu-west-1:** ami-056a9d8447a991bff
**ap-northeast-3:** ami-0769caf50f7b7fb6f
**ap-northeast-2:** ami-06ad8c60e1093b543
**ap-northeast-1:** ami-0b8313d62dfeec78b
**me-central-1:** ami-0fa388dcaca7b3baf
**ca-central-1:** ami-02e7a07f60a5e0411
**sa-east-1:** ami-000ca39b22f2a695c
**ap-southeast-1:** ami-04f521cff21b58f50
**ap-southeast-2:** ami-02f5afcce42276457
**us-east-1:** ami-0a25256d5aaf8fdd7
**us-east-2:** ami-07bcfed39a329b612
**us-west-1:** ami-0b2e93f36b5a8bff2
**us-west-2:** ami-063f4f34958917b5c
**eu-central-1:** ami-0b15b442dd5e90d50
|
Download
[aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw](https://gardenlinux-github-releases.s3.amazonaws.com/objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw)
| +| TPM2 | Microsoft Azure | amd64 | `azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40` |
2 gallery + 0 marketplace images
**Gallery Images:**
• V2 (public): /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-gen2-usi-secureboot/Versions/1877.3.0
• V2 (china): /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-gen2-usi-secureboot/Versions/1877.3.0
|
Download
[azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.vhd](https://gardenlinux-github-releases.s3.amazonaws.com/objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.vhd)
| +| TPM2 | Microsoft Azure | arm64 | `azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40` |
2 gallery + 0 marketplace images
**Gallery Images:**
• V2 (public): /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-arm64-gen2-usi-secureboot/Versions/1877.3.0
• V2 (china): /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-arm64-gen2-usi-secureboot/Versions/1877.3.0
|
Download
[azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.vhd](https://gardenlinux-github-releases.s3.amazonaws.com/objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.vhd)
| +| TPM2 | Google Cloud Platform | amd64 | `gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40` |
Global availability
**Image Name:** gardenlinux-gcp-b4636aa3660a8d166531aab9-1877-3-75df9f40
**Project:** sap-se-gcp-gardenlinux
**Availability:** Global (all regions)
|
Download
[gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.gcpimage.tar.gz](https://gardenlinux-github-releases.s3.amazonaws.com/objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.gcpimage.tar.gz)
| +| TPM2 | Google Cloud Platform | arm64 | `gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40` |
Global availability
**Image Name:** gardenlinux-gcp-63fd9d7dd465420fd4e499ab-1877-3-75df9f40
**Project:** sap-se-gcp-gardenlinux
**Availability:** Global (all regions)
|
Download
[gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.gcpimage.tar.gz](https://gardenlinux-github-releases.s3.amazonaws.com/objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.gcpimage.tar.gz)
| + +
+ +
+📝 Detailed View + +
+Variant - Default + +### Variant - Default + +
+ALI - Alibaba Cloud + +#### ALI - Alibaba Cloud + +
+amd64 + +##### amd64 + +``` +- flavor: ali-gardener_prod-amd64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/ali-gardener_prod-amd64-1877.3-75df9f40/ali-gardener_prod-amd64-1877.3-75df9f40.qcow2 + regions: + - region: cn-qingdao + image_id: m-m5efm8l2bltkbloui235 + - region: cn-beijing + image_id: m-2zee5ebi20ltzy5et7in + - region: cn-zhangjiakou + image_id: m-8vbddy2wfex9nb29afcy + - region: cn-huhehaote + image_id: m-hp3bx14og6cw9thujw1d + - region: cn-wulanchabu + image_id: m-0jlh1iq2f3bryb5okjdk + - region: cn-hangzhou + image_id: m-bp13aseh5a2wn0s5rdz6 + - region: cn-shanghai + image_id: m-uf61jbe9n8a9291h4u21 + - region: cn-nanjing + image_id: m-gc77bfbctuzphl2bpk0o + - region: cn-shenzhen + image_id: m-wz9gio8m5ey0foj0g4xx + - region: cn-heyuan + image_id: m-f8zdn54v0blnsafxb1t5 + - region: cn-guangzhou + image_id: m-7xv0q5feffsxxyttxdy9 + - region: cn-fuzhou + image_id: m-gw07bfbctuzphl2bpk0p + - region: cn-wuhan-lr + image_id: m-n4a1u2avlb9pq0u5bdms + - region: cn-chengdu + image_id: m-2vc5saul2saa2z57h216 + - region: cn-hongkong + image_id: m-j6c4zk6mwb2673iq5wrz + - region: ap-northeast-1 + image_id: m-6weibwo3vrt7ar7nelc9 + - region: ap-northeast-2 + image_id: m-mj73oldn06th2vy0ymhv + - region: ap-southeast-1 + image_id: m-t4ngrf81d0fohwq493pw + - region: ap-southeast-3 + image_id: m-8psd64gzc1eru0qld7cc + - region: ap-southeast-6 + image_id: m-5tsdd6k3z1vvdyyio7zn + - region: ap-southeast-5 + image_id: m-k1aj4usnhqcssa2fpy0c + - region: ap-southeast-7 + image_id: m-0jo6uwekvn0gnwhwnq3s + - region: us-east-1 + image_id: m-0xi8netpfc2fdwfstz3c + - region: us-west-1 + image_id: m-rj9gwpx907qv6p6x8w45 + - region: na-south-1 + image_id: m-4hfi34x77oaeznwuulq6 + - region: eu-west-1 + image_id: m-d7o2ny5xc0m3kacxjbem + - region: me-east-1 + image_id: m-eb39mgohcec6gaynet9l + - region: eu-central-1 + image_id: m-gw86dlqmpaugljiykx91 +``` + +
+ +
+ +
+AWS - Amazon Web Services + +#### AWS - Amazon Web Services + +
+amd64 + +##### amd64 + +``` +- flavor: aws-gardener_prod-amd64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/aws-gardener_prod-amd64-1877.3-75df9f40/aws-gardener_prod-amd64-1877.3-75df9f40.raw + regions: + - region: ap-south-1 + image_id: ami-00c6adf1de4dd746a + - region: eu-north-1 + image_id: ami-07ad3940828172b90 + - region: eu-west-3 + image_id: ami-071f4f48679d86638 + - region: eu-south-1 + image_id: ami-0b10af1a19df9f038 + - region: eu-west-2 + image_id: ami-0e2b7fe07573b71cd + - region: eu-west-1 + image_id: ami-01c547eb85d61da61 + - region: ap-northeast-3 + image_id: ami-0dad917ede94cd3c7 + - region: ap-northeast-2 + image_id: ami-0ecbeaf40d4643016 + - region: ap-northeast-1 + image_id: ami-0b7225242babad11c + - region: me-central-1 + image_id: ami-0d298e552bf051bc7 + - region: ca-central-1 + image_id: ami-0af8422162c8f056e + - region: sa-east-1 + image_id: ami-05d885175e942fc80 + - region: ap-southeast-1 + image_id: ami-0a9802680adf7e430 + - region: ap-southeast-2 + image_id: ami-07ed6f1e62fbd6d66 + - region: us-east-1 + image_id: ami-055a0ce37433fcdee + - region: us-east-2 + image_id: ami-07e9069631850755a + - region: us-west-1 + image_id: ami-08c18abab76066f71 + - region: us-west-2 + image_id: ami-00eca0475f90a1f8c + - region: eu-central-1 + image_id: ami-0198822fa7d539f8c + - region: cn-north-1 + image_id: ami-093c993faaca89b4d + - region: cn-northwest-1 + image_id: ami-05e1cc73d997d67b7 +``` + +
+ +
+arm64 + +##### arm64 + +``` +- flavor: aws-gardener_prod-arm64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/aws-gardener_prod-arm64-1877.3-75df9f40/aws-gardener_prod-arm64-1877.3-75df9f40.raw + regions: + - region: ap-south-1 + image_id: ami-00cd00c30d19609a2 + - region: eu-north-1 + image_id: ami-0a969a1a1c4726831 + - region: eu-west-3 + image_id: ami-0b579f6c70b7c4fe6 + - region: eu-south-1 + image_id: ami-06c38608e2e7223d3 + - region: eu-west-2 + image_id: ami-005c7058c3923b2eb + - region: eu-west-1 + image_id: ami-0395c3cd38a0a5cd6 + - region: ap-northeast-3 + image_id: ami-0db3697cea87a5104 + - region: ap-northeast-2 + image_id: ami-084444f62c7c580fb + - region: ap-northeast-1 + image_id: ami-017237dd9abeae8dd + - region: me-central-1 + image_id: ami-08efdb3153d0cd184 + - region: ca-central-1 + image_id: ami-05b535ae9418fee3d + - region: sa-east-1 + image_id: ami-036ded98bad763e3c + - region: ap-southeast-1 + image_id: ami-03fcefb2fd18519d0 + - region: ap-southeast-2 + image_id: ami-040f9d0caa5d79e84 + - region: us-east-1 + image_id: ami-04110d6a1970e748c + - region: us-east-2 + image_id: ami-0c8dc664a21d5ca08 + - region: us-west-1 + image_id: ami-0ddc462d075935666 + - region: us-west-2 + image_id: ami-0e67c2546e54fed06 + - region: eu-central-1 + image_id: ami-06a2a1e7da947b192 + - region: cn-north-1 + image_id: ami-0b3755339496a3158 + - region: cn-northwest-1 + image_id: ami-06fc0f74b500d2d82 +``` + +
+ +
+ +
+AZURE - Microsoft Azure + +#### AZURE - Microsoft Azure + +
+amd64 + +##### amd64 + +``` +- flavor: azure-gardener_prod-amd64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/azure-gardener_prod-amd64-1877.3-75df9f40/azure-gardener_prod-amd64-1877.3-75df9f40.vhd + gallery_images: + - hyper_v_generation: V1 + azure_cloud: public + image_id: /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme/Versions/1877.3.0 + - hyper_v_generation: V2 + azure_cloud: public + image_id: /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-gen2/Versions/1877.3.0 + - hyper_v_generation: V1 + azure_cloud: china + image_id: /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme/Versions/1877.3.0 + - hyper_v_generation: V2 + azure_cloud: china + image_id: /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-gen2/Versions/1877.3.0 +``` + +
+ +
+arm64 + +##### arm64 + +``` +- flavor: azure-gardener_prod-arm64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/azure-gardener_prod-arm64-1877.3-75df9f40/azure-gardener_prod-arm64-1877.3-75df9f40.vhd + gallery_images: + - hyper_v_generation: V2 + azure_cloud: public + image_id: /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-arm64-gen2/Versions/1877.3.0 + - hyper_v_generation: V2 + azure_cloud: china + image_id: /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-arm64-gen2/Versions/1877.3.0 +``` + +
+ +
+ +
+GCP - Google Cloud Platform + +#### GCP - Google Cloud Platform + +
+amd64 + +##### amd64 + +``` +- flavor: gcp-gardener_prod-amd64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/gcp-gardener_prod-amd64-1877.3-75df9f40/gcp-gardener_prod-amd64-1877.3-75df9f40.gcpimage.tar.gz + image_name: gardenlinux-gcp-ff804026cbe7b5f2d6f729e4-1877-3-75df9f40 + project: sap-se-gcp-gardenlinux + availability: Global (all regions) +``` + +
+ +
+arm64 + +##### arm64 + +``` +- flavor: gcp-gardener_prod-arm64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/gcp-gardener_prod-arm64-1877.3-75df9f40/gcp-gardener_prod-arm64-1877.3-75df9f40.gcpimage.tar.gz + image_name: gardenlinux-gcp-c8504d3c3e67cf2fc7c3408c-1877-3-75df9f40 + project: sap-se-gcp-gardenlinux + availability: Global (all regions) +``` + +
+ +
+ +
+OPENSTACK - OpenStack + +#### OPENSTACK - OpenStack + +
+amd64 + +##### amd64 + +``` +- flavor: openstack-gardener_prod-amd64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/openstack-gardener_prod-amd64-1877.3-75df9f40/openstack-gardener_prod-amd64-1877.3-75df9f40.raw + regions: + - region: eu-de-1 + image_id: ed3b4c3d-941f-456a-a551-bd52b8397443 + image_name: gardenlinux-1877.3 + - region: eu-de-2 + image_id: 5ea6fb4f-20fc-43b8-8ffe-af8da6d61d6a + image_name: gardenlinux-1877.3 + - region: eu-nl-1 + image_id: ac9b5d43-ff53-494d-8adf-2249c324a9db + image_name: gardenlinux-1877.3 + - region: la-br-1 + image_id: 404f22a3-9822-4696-a60f-8566eedb93e3 + image_name: gardenlinux-1877.3 + - region: na-ca-1 + image_id: b69b72f3-574a-4f76-b4eb-ac9185ea2681 + image_name: gardenlinux-1877.3 + - region: na-us-1 + image_id: 40e99366-f13b-402a-a264-e7e4773ab8ba + image_name: gardenlinux-1877.3 + - region: na-us-2 + image_id: c50200c6-95fd-4a97-bef2-90b2d6afa3d3 + image_name: gardenlinux-1877.3 + - region: na-us-3 + image_id: d5b1d8c0-3420-4a82-931d-0506a6b8f166 + image_name: gardenlinux-1877.3 + - region: ap-ae-1 + image_id: 81c26cb7-c515-4610-949a-92c275640325 + image_name: gardenlinux-1877.3 + - region: ap-au-1 + image_id: 2d6e3edd-5596-41e6-a640-4b1b8e7310e7 + image_name: gardenlinux-1877.3 + - region: ap-cn-1 + image_id: 3564b5ef-9b37-4926-bb23-5655cf90de69 + image_name: gardenlinux-1877.3 + - region: ap-jp-1 + image_id: 2ff61187-f004-4317-bd4c-a17d93b475bc + image_name: gardenlinux-1877.3 + - region: ap-jp-2 + image_id: 2bc58951-9bf7-445b-a6e4-f634c7522d9b + image_name: gardenlinux-1877.3 + - region: ap-sa-1 + image_id: e4a4aa92-335a-454b-83bb-643cb918cf6a + image_name: gardenlinux-1877.3 + - region: ap-sa-2 + image_id: d3ac5df8-ce38-4a23-b611-dfef6b7a0db9 + image_name: gardenlinux-1877.3 +``` + +
+ +
+ +
+OPENSTACKBAREMETAL - OpenStack Baremetal + +#### OPENSTACKBAREMETAL - OpenStack Baremetal + +
+amd64 + +##### amd64 + +``` +- flavor: openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.raw + regions: + - region: eu-de-1 + image_id: 01c3ab26-5b93-4655-a743-1fef60f64b53 + image_name: gardenlinux-1877.3-baremetal + - region: eu-de-2 + image_id: 7488d07b-65f1-4b85-8df8-13244b895d71 + image_name: gardenlinux-1877.3-baremetal + - region: eu-nl-1 + image_id: 1926a818-55d5-49e1-9af8-eab8450705eb + image_name: gardenlinux-1877.3-baremetal + - region: la-br-1 + image_id: 6fda686d-d2f7-4018-ab4c-1250e898197a + image_name: gardenlinux-1877.3-baremetal + - region: na-ca-1 + image_id: a032ecc1-3bee-4d65-9f68-3e3f99e2c291 + image_name: gardenlinux-1877.3-baremetal + - region: na-us-1 + image_id: d663d5f1-1b44-41af-9039-e36cc64a5920 + image_name: gardenlinux-1877.3-baremetal + - region: na-us-2 + image_id: 818bbfdd-4ee4-49ee-8294-dc3a3c66971f + image_name: gardenlinux-1877.3-baremetal + - region: na-us-3 + image_id: b154b48b-050f-48d6-997f-b6c2756079a6 + image_name: gardenlinux-1877.3-baremetal + - region: ap-ae-1 + image_id: 5992e19c-2ca2-47be-ae55-50e2fd26b662 + image_name: gardenlinux-1877.3-baremetal + - region: ap-au-1 + image_id: 986403a6-e254-4689-8f81-e32dc33c9b64 + image_name: gardenlinux-1877.3-baremetal + - region: ap-cn-1 + image_id: 0c794890-a690-4881-b0c2-39a939b020e2 + image_name: gardenlinux-1877.3-baremetal + - region: ap-jp-1 + image_id: f5be2c30-8e8e-4713-9e34-eb0a18922af5 + image_name: gardenlinux-1877.3-baremetal + - region: ap-jp-2 + image_id: 8edb20a7-f0f2-47f2-9112-faa2569c3893 + image_name: gardenlinux-1877.3-baremetal + - region: ap-sa-1 + image_id: dc12514b-b0a8-40dd-b756-a4d27421029c + image_name: gardenlinux-1877.3-baremetal + - region: ap-sa-2 + image_id: 617f5ae7-91fd-4149-b783-7a3701a5f420 + image_name: gardenlinux-1877.3-baremetal +``` + +
+ +
+ +
+ +
+Variant - USI (Unified System Image) + +### Variant - USI (Unified System Image) + +
+AWS - Amazon Web Services + +#### AWS - Amazon Web Services + +
+amd64 + +##### amd64 + +``` +- flavor: aws-gardener_prod_usi-amd64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.raw + regions: + - region: ap-south-1 + image_id: ami-0e904b4c264dbe923 + - region: eu-north-1 + image_id: ami-016f506d46abb5c06 + - region: eu-west-3 + image_id: ami-052404d8a97e9ec57 + - region: eu-south-1 + image_id: ami-002193c185fb2d939 + - region: eu-west-2 + image_id: ami-0225bc62c7d291107 + - region: eu-west-1 + image_id: ami-0f737c34ae9ccfe10 + - region: ap-northeast-3 + image_id: ami-0ecf19a78a7259c02 + - region: ap-northeast-2 + image_id: ami-029152bf0a15cf306 + - region: ap-northeast-1 + image_id: ami-0bf003b58ed636124 + - region: me-central-1 + image_id: ami-0546ca7d7c2e00077 + - region: ca-central-1 + image_id: ami-0a0081cbd4b479d33 + - region: sa-east-1 + image_id: ami-086d3b7282338bcd1 + - region: ap-southeast-1 + image_id: ami-04973efd023e5883f + - region: ap-southeast-2 + image_id: ami-00389783d0b7ef01b + - region: us-east-1 + image_id: ami-0f5c28bbc45608e9b + - region: us-east-2 + image_id: ami-08c7494a2a00b74e5 + - region: us-west-1 + image_id: ami-0e2290963849dba62 + - region: us-west-2 + image_id: ami-0fb86d519a38da40f + - region: eu-central-1 + image_id: ami-0c6394e4fdbefe8c0 + - region: cn-north-1 + image_id: ami-0b4c979b27a0a7714 + - region: cn-northwest-1 + image_id: ami-0cab977e76e274599 +``` + +
+ +
+arm64 + +##### arm64 + +``` +- flavor: aws-gardener_prod_usi-arm64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.raw + regions: + - region: ap-south-1 + image_id: ami-029f2b705d69f9d50 + - region: eu-north-1 + image_id: ami-0b1a9e403ea563206 + - region: eu-west-3 + image_id: ami-067465814788be84a + - region: eu-south-1 + image_id: ami-092d7cf152ef6df29 + - region: eu-west-2 + image_id: ami-0441298c8ae55a62b + - region: eu-west-1 + image_id: ami-012e58abe02f904c1 + - region: ap-northeast-3 + image_id: ami-08c18c5f1aa7e9fba + - region: ap-northeast-2 + image_id: ami-0277ca365657bd9c2 + - region: ap-northeast-1 + image_id: ami-006a3f35202f6edd4 + - region: me-central-1 + image_id: ami-0aa9e8af8c777e400 + - region: ca-central-1 + image_id: ami-0f8225fd2d6009961 + - region: sa-east-1 + image_id: ami-0e945c537aef91eff + - region: ap-southeast-1 + image_id: ami-0f30b29a4428f7cea + - region: ap-southeast-2 + image_id: ami-0129e3a207e3e6f9d + - region: us-east-1 + image_id: ami-0cc9f69e3a7594e7b + - region: us-east-2 + image_id: ami-046243dad95d56f2a + - region: us-west-1 + image_id: ami-03ae03953c81a43c1 + - region: us-west-2 + image_id: ami-0cbe1dbfeda64dc9b + - region: eu-central-1 + image_id: ami-0dd2780bfcddbda6b + - region: cn-north-1 + image_id: ami-0d993477d25affb3c + - region: cn-northwest-1 + image_id: ami-0a7fe5959bb23fab8 +``` + +
+ +
+ +
+AZURE - Microsoft Azure + +#### AZURE - Microsoft Azure + +
+amd64 + +##### amd64 + +``` +- flavor: azure-gardener_prod_usi-amd64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.vhd + gallery_images: + - hyper_v_generation: V2 + azure_cloud: public + image_id: /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-gen2-usi/Versions/1877.3.0 + - hyper_v_generation: V2 + azure_cloud: china + image_id: /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-gen2-usi/Versions/1877.3.0 +``` + +
+ +
+arm64 + +##### arm64 + +``` +- flavor: azure-gardener_prod_usi-arm64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.vhd + gallery_images: + - hyper_v_generation: V2 + azure_cloud: public + image_id: /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-arm64-gen2-usi/Versions/1877.3.0 + - hyper_v_generation: V2 + azure_cloud: china + image_id: /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-arm64-gen2-usi/Versions/1877.3.0 +``` + +
+ +
+ +
+GCP - Google Cloud Platform + +#### GCP - Google Cloud Platform + +
+amd64 + +##### amd64 + +``` +- flavor: gcp-gardener_prod_usi-amd64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.gcpimage.tar.gz + image_name: gardenlinux-gcp-51db8a4be084c3b640095f4b-1877-3-75df9f40 + project: sap-se-gcp-gardenlinux + availability: Global (all regions) +``` + +
+ +
+arm64 + +##### arm64 + +``` +- flavor: gcp-gardener_prod_usi-arm64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.gcpimage.tar.gz + image_name: gardenlinux-gcp-c00f1e20ffeed4d8b80a76b9-1877-3-75df9f40 + project: sap-se-gcp-gardenlinux + availability: Global (all regions) +``` + +
+ +
+ +
+OPENSTACK - OpenStack + +#### OPENSTACK - OpenStack + +
+amd64 + +##### amd64 + +``` +- flavor: openstack-gardener_prod_usi-amd64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.raw + regions: + - region: eu-de-1 + image_id: 15fc38b3-1cee-4c0a-829a-ef1f7faa1920 + image_name: gardenlinux-1877.3 + - region: eu-de-2 + image_id: c4e8e8e5-8c92-4c73-b21b-333087e7b092 + image_name: gardenlinux-1877.3 + - region: eu-nl-1 + image_id: e6f9e054-0613-4204-98c7-84676680418a + image_name: gardenlinux-1877.3 + - region: la-br-1 + image_id: 04416634-2eaf-44a1-a653-b1ae36bf0e0e + image_name: gardenlinux-1877.3 + - region: na-ca-1 + image_id: b548d8fd-0e6b-4cb6-9cd1-68b258df00cc + image_name: gardenlinux-1877.3 + - region: na-us-1 + image_id: 0a97e9af-a1f3-4ae4-bf44-98c432aa436c + image_name: gardenlinux-1877.3 + - region: na-us-2 + image_id: b1705d73-3f67-427c-8ade-5e245a857338 + image_name: gardenlinux-1877.3 + - region: na-us-3 + image_id: da3234f1-307c-431e-80bb-9e51dd75673d + image_name: gardenlinux-1877.3 + - region: ap-ae-1 + image_id: 16f24b39-b9ba-4756-8dcd-82473182f1e4 + image_name: gardenlinux-1877.3 + - region: ap-au-1 + image_id: 49de0ff1-2c7e-439d-a065-07c837fe48a8 + image_name: gardenlinux-1877.3 + - region: ap-cn-1 + image_id: 23a94a40-1e9a-4f4b-b2b6-4c167493fbb0 + image_name: gardenlinux-1877.3 + - region: ap-jp-1 + image_id: 1558417d-14bb-413e-9194-88b2bc5f18aa + image_name: gardenlinux-1877.3 + - region: ap-jp-2 + image_id: 8d39ad55-2f09-490e-8fa7-0bdf5c854ed7 + image_name: gardenlinux-1877.3 + - region: ap-sa-1 + image_id: 62be0147-062a-4375-b142-278a811e9754 + image_name: gardenlinux-1877.3 + - region: ap-sa-2 + image_id: 510d1ff1-4fc6-49ec-ad2f-a0985217dd14 + image_name: gardenlinux-1877.3 +``` + +
+ +
+ +
+ +
+Variant - TPM2 Trusted Boot + +### Variant - TPM2 Trusted Boot + +
+AWS - Amazon Web Services + +#### AWS - Amazon Web Services + +
+amd64 + +##### amd64 + +``` +- flavor: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw + regions: + - region: ap-south-1 + image_id: ami-0052561d7bccfe6b7 + - region: eu-north-1 + image_id: ami-06623180935c63669 + - region: eu-west-3 + image_id: ami-026632e35fe37f9f4 + - region: eu-south-1 + image_id: ami-0b60116fac38c2556 + - region: eu-west-2 + image_id: ami-0ecd844859adf35c5 + - region: eu-west-1 + image_id: ami-0313333df0acd7eb0 + - region: ap-northeast-3 + image_id: ami-04e53edbd6ce18fc6 + - region: ap-northeast-2 + image_id: ami-0ae03e19777874cef + - region: ap-northeast-1 + image_id: ami-079e68ce96cc03e78 + - region: me-central-1 + image_id: ami-01e368d192a479934 + - region: ca-central-1 + image_id: ami-02cabce931cafcf1f + - region: sa-east-1 + image_id: ami-075d5fa3b98620e15 + - region: ap-southeast-1 + image_id: ami-0a26b478c0a210190 + - region: ap-southeast-2 + image_id: ami-0f226413240aec4aa + - region: us-east-1 + image_id: ami-07dea60f619226e1b + - region: us-east-2 + image_id: ami-0e8e852987ee840c3 + - region: us-west-1 + image_id: ami-0d9314ee5a439ab29 + - region: us-west-2 + image_id: ami-04dc4614abf1649ab + - region: eu-central-1 + image_id: ami-005f7dab618420a91 +``` + +
+ +
+arm64 + +##### arm64 + +``` +- flavor: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw + regions: + - region: ap-south-1 + image_id: ami-035b751a08f528e47 + - region: eu-north-1 + image_id: ami-04c60d1feb092d00f + - region: eu-west-3 + image_id: ami-0443172a73fe4fb27 + - region: eu-south-1 + image_id: ami-02f8a867d02227542 + - region: eu-west-2 + image_id: ami-06a900dd59c84620d + - region: eu-west-1 + image_id: ami-056a9d8447a991bff + - region: ap-northeast-3 + image_id: ami-0769caf50f7b7fb6f + - region: ap-northeast-2 + image_id: ami-06ad8c60e1093b543 + - region: ap-northeast-1 + image_id: ami-0b8313d62dfeec78b + - region: me-central-1 + image_id: ami-0fa388dcaca7b3baf + - region: ca-central-1 + image_id: ami-02e7a07f60a5e0411 + - region: sa-east-1 + image_id: ami-000ca39b22f2a695c + - region: ap-southeast-1 + image_id: ami-04f521cff21b58f50 + - region: ap-southeast-2 + image_id: ami-02f5afcce42276457 + - region: us-east-1 + image_id: ami-0a25256d5aaf8fdd7 + - region: us-east-2 + image_id: ami-07bcfed39a329b612 + - region: us-west-1 + image_id: ami-0b2e93f36b5a8bff2 + - region: us-west-2 + image_id: ami-063f4f34958917b5c + - region: eu-central-1 + image_id: ami-0b15b442dd5e90d50 +``` + +
+ +
+ +
+AZURE - Microsoft Azure + +#### AZURE - Microsoft Azure + +
+amd64 + +##### amd64 + +``` +- flavor: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.vhd + gallery_images: + - hyper_v_generation: V2 + azure_cloud: public + image_id: /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-gen2-usi-secureboot/Versions/1877.3.0 + - hyper_v_generation: V2 + azure_cloud: china + image_id: /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-gen2-usi-secureboot/Versions/1877.3.0 +``` + +
+ +
+arm64 + +##### arm64 + +``` +- flavor: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.vhd + gallery_images: + - hyper_v_generation: V2 + azure_cloud: public + image_id: /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-arm64-gen2-usi-secureboot/Versions/1877.3.0 + - hyper_v_generation: V2 + azure_cloud: china + image_id: /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-arm64-gen2-usi-secureboot/Versions/1877.3.0 +``` + +
+ +
+ +
+GCP - Google Cloud Platform + +#### GCP - Google Cloud Platform + +
+amd64 + +##### amd64 + +``` +- flavor: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.gcpimage.tar.gz + image_name: gardenlinux-gcp-b4636aa3660a8d166531aab9-1877-3-75df9f40 + project: sap-se-gcp-gardenlinux + availability: Global (all regions) +``` + +
+ +
+arm64 + +##### arm64 + +``` +- flavor: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + download_url: https://gardenlinux-github-releases.s3.amazonaws.com/objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.gcpimage.tar.gz + image_name: gardenlinux-gcp-63fd9d7dd465420fd4e499ab-1877-3-75df9f40 + project: sap-se-gcp-gardenlinux + availability: Global (all regions) +``` + +
+ +
+ +
+ + +
+ + +## Kernel Module Build Container (kmodbuild) +``` +ghcr.io/gardenlinux/gardenlinux/kmodbuild:1877.3 +``` diff --git a/tests/github/__init__.py b/tests/github/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py new file mode 100644 index 00000000..f90ffb2f --- /dev/null +++ b/tests/github/test_release_page.py @@ -0,0 +1,38 @@ +import importlib +import os +from pathlib import Path + +import git +from git import Repo + + +class SubmoduleAsRepo(Repo): + """This will fake a git submodule as a git repository object.""" + def __new__(cls, *args, **kwargs): + r = super().__new__(Repo) + r.__init__(*args, **kwargs) + + maybe_gl_submodule = [submodule for submodule in r.submodules if submodule.name.endswith("/gardenlinux")] + if not maybe_gl_submodule: + return r + else: + gl = maybe_gl_submodule[0] + + sr = gl.module() + sr.remotes.origin.pull("main") + return sr + + +def test_github_release_page(monkeypatch): + monkeypatch.setattr(git, "Repo", SubmoduleAsRepo) + import gardenlinux.github + importlib.reload(gardenlinux.github) + + generated_release_notes = gardenlinux.github.create_github_release_notes( + "1877.3", + "75df9f401a842914563f312899ec3ce34b24515c" + ) + fixture_path = Path(os.path.dirname(__file__)) / ".." / ".." / "test-data" / "github_release_notes_1877.3.md" + with open(fixture_path) as md: + release_notes_fixture = md.read() + assert generated_release_notes == release_notes_fixture From b22f3491adc9a018c046ea78399779ad5fee88bb Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Tue, 16 Sep 2025 17:29:03 +0200 Subject: [PATCH 68/92] working GL release notes integration test --- poetry.lock | 20 +- pyproject.toml | 1 + src/gardenlinux/github/__main__.py | 5 +- .../github_release_notes_1877.3.md | 0 test-data/release_notes/glvd_1877.3.json | 193 ++++++++++++++++++ tests/github/test_release_page.py | 33 ++- 6 files changed, 241 insertions(+), 11 deletions(-) rename test-data/{ => release_notes}/github_release_notes_1877.3.md (100%) create mode 100644 test-data/release_notes/glvd_1877.3.json diff --git a/poetry.lock b/poetry.lock index bb8054be..25acb423 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1290,6 +1290,24 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "requests-mock" +version = "1.12.1" +description = "Mock out responses from the requests package" +optional = false +python-versions = ">=3.5" +groups = ["dev"] +files = [ + {file = "requests-mock-1.12.1.tar.gz", hash = "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"}, + {file = "requests_mock-1.12.1-py2.py3-none-any.whl", hash = "sha256:b1e37054004cdd5e56c84454cc7df12b25f90f382159087f4b6915aaeef39563"}, +] + +[package.dependencies] +requests = ">=2.22,<3" + +[package.extras] +fixture = ["fixtures"] + [[package]] name = "responses" version = "0.25.8" @@ -1798,4 +1816,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = "^3.13" -content-hash = "9bea7e97ec41a8baf6aedb368eeb061cf16cebc8d471f6c2c28e6005166ae027" +content-hash = "e6cffa53fa46383db2184376fda82411e9bd372c146f9936e88aad023f001cc4" diff --git a/pyproject.toml b/pyproject.toml index 76a5092b..5be59d27 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ pytest = "^8.4.1" pytest-cov = "^6.3.0" isort = "^6.0.1" ptpython = "^3.0.31" +requests-mock = "^1.12.1" [tool.poetry.group.docs.dependencies] sphinx-rtd-theme = "^3.0.2" diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 17a39dcc..d243663f 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -582,9 +582,10 @@ def release_notes_changes_section(gardenlinux_version): output.append(f" - {fixedCve}") return "\n".join(output) + "\n\n" - except: + except Exception as exn: # There are expected error cases, for example with versions not supported by glvd (1443.x) or when the api is not available # Fail gracefully by adding the placeholder we previously used, so that the release note generation does not fail. + LOGGER.error(f"Failed to process GLVD API output: {exn}") return textwrap.dedent( """ ## Changes @@ -693,7 +694,7 @@ def create_github_release_notes(gardenlinux_version, commitish): output += generate_release_note_image_ids(metadata_files) output += "\n" - output += "## Kernel Module Build Container (kmodbuild) " + output += "## Kernel Module Build Container (kmodbuild)" output += "\n" output += "```" output += "\n" diff --git a/test-data/github_release_notes_1877.3.md b/test-data/release_notes/github_release_notes_1877.3.md similarity index 100% rename from test-data/github_release_notes_1877.3.md rename to test-data/release_notes/github_release_notes_1877.3.md diff --git a/test-data/release_notes/glvd_1877.3.json b/test-data/release_notes/glvd_1877.3.json new file mode 100644 index 00000000..d739cdb8 --- /dev/null +++ b/test-data/release_notes/glvd_1877.3.json @@ -0,0 +1,193 @@ +{ + "version": "1877.3", + "packageList": [ + { + "sourcePackageName": "gnutls28", + "oldVersion": "3.8.9-2", + "newVersion": "3.8.9-3gl0+bp1877", + "fixedCves": [ + "CVE-2025-32988", + "CVE-2025-32989", + "CVE-2025-32990", + "CVE-2025-6395" + ] + }, + { + "sourcePackageName": "sqlite3", + "oldVersion": "3.46.1-4", + "newVersion": "3.46.1-7gl0+bp1877", + "fixedCves": [ + "CVE-2025-6965" + ] + }, + { + "sourcePackageName": "dpkg", + "oldVersion": "1.22.18", + "newVersion": "1.22.21gl0+bp1877", + "fixedCves": [ + "CVE-2025-6297" + ] + }, + { + "sourcePackageName": "linux", + "oldVersion": "6.12.40-2gl0", + "newVersion": "6.12.44-3gl0", + "fixedCves": [ + "CVE-2025-38676", + "CVE-2025-38683", + "CVE-2025-38684", + "CVE-2025-38686", + "CVE-2025-38687", + "CVE-2025-38688", + "CVE-2025-38691", + "CVE-2025-38692", + "CVE-2025-38695", + "CVE-2025-38696", + "CVE-2025-38699", + "CVE-2025-38700", + "CVE-2025-38701", + "CVE-2025-38704", + "CVE-2025-38708", + "CVE-2025-38709", + "CVE-2025-38710", + "CVE-2025-38711", + "CVE-2025-38717", + "CVE-2025-38718", + "CVE-2025-38721", + "CVE-2025-38722", + "CVE-2025-38724", + "CVE-2025-38726", + "CVE-2025-38727", + "CVE-2025-38728", + "CVE-2025-38730", + "CVE-2025-38601", + "CVE-2025-38604", + "CVE-2025-38608", + "CVE-2025-38609", + "CVE-2025-38610", + "CVE-2025-38614", + "CVE-2022-50031", + "CVE-2022-50083", + "CVE-2023-53137", + "CVE-2025-37744", + "CVE-2025-38500", + "CVE-2025-38501", + "CVE-2025-38732", + "CVE-2025-38734", + "CVE-2025-38735", + "CVE-2025-38737", + "CVE-2025-39673", + "CVE-2025-39676", + "CVE-2025-39681", + "CVE-2025-39682", + "CVE-2025-39683", + "CVE-2025-39684", + "CVE-2025-39685", + "CVE-2025-39686", + "CVE-2025-39689", + "CVE-2025-39691", + "CVE-2025-39692", + "CVE-2025-39695", + "CVE-2025-39697", + "CVE-2025-39698", + "CVE-2025-39700", + "CVE-2025-39701", + "CVE-2025-39702", + "CVE-2025-39703", + "CVE-2025-39718", + "CVE-2025-39720", + "CVE-2025-39721", + "CVE-2025-39722", + "CVE-2025-39724", + "CVE-2025-39727", + "CVE-2025-39730", + "CVE-2025-39732", + "CVE-2025-21884", + "CVE-2025-38335", + "CVE-2025-38351", + "CVE-2025-38553", + "CVE-2025-38559", + "CVE-2025-38560", + "CVE-2025-38561", + "CVE-2025-38562", + "CVE-2025-38563", + "CVE-2025-38565", + "CVE-2025-38566", + "CVE-2025-38568", + "CVE-2025-38569", + "CVE-2025-38571", + "CVE-2025-38572", + "CVE-2025-38574", + "CVE-2025-38581", + "CVE-2025-38582", + "CVE-2025-38583", + "CVE-2025-38586", + "CVE-2025-38587", + "CVE-2025-38588", + "CVE-2025-38590", + "CVE-2025-38593", + "CVE-2025-38616", + "CVE-2025-38617", + "CVE-2025-38618", + "CVE-2025-38622", + "CVE-2025-38624", + "CVE-2025-38625", + "CVE-2025-38628", + "CVE-2025-38631", + "CVE-2025-38632", + "CVE-2025-38634", + "CVE-2025-38635", + "CVE-2025-38639", + "CVE-2025-38640", + "CVE-2025-38644", + "CVE-2025-38645", + "CVE-2025-38646", + "CVE-2025-38653", + "CVE-2025-38659", + "CVE-2025-38660", + "CVE-2025-38666", + "CVE-2025-38668", + "CVE-2025-38670", + "CVE-2025-38675", + "CVE-2025-39736", + "CVE-2025-39737", + "CVE-2025-39738", + "CVE-2025-39739", + "CVE-2025-39742", + "CVE-2025-39744", + "CVE-2025-39746", + "CVE-2025-39748", + "CVE-2025-39749", + "CVE-2025-39750", + "CVE-2025-39752", + "CVE-2025-39753", + "CVE-2025-39754", + "CVE-2025-39756", + "CVE-2025-39758", + "CVE-2025-39759", + "CVE-2025-39761", + "CVE-2025-39763", + "CVE-2025-39766", + "CVE-2025-39770", + "CVE-2025-39773", + "CVE-2025-39776", + "CVE-2025-39779", + "CVE-2025-39780", + "CVE-2025-39782", + "CVE-2025-39783", + "CVE-2025-39787", + "CVE-2025-39788", + "CVE-2025-39790", + "CVE-2025-39791" + ] + }, + { + "sourcePackageName": "iputils", + "oldVersion": "3:20240905-3", + "newVersion": "3:20250605-1gl0~bp1877", + "fixedCves": [ + "CVE-2025-47268" + ] + } + ] +} diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index f90ffb2f..a2fa02fe 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -3,8 +3,15 @@ from pathlib import Path import git +import requests_mock from git import Repo +GARDENLINUX_RELEASE = "1877.3" +GARDENLINUX_COMMIT = "75df9f401a842914563f312899ec3ce34b24515c" +GLVD_BASE_URL = "https://glvd.ingress.glvd.gardnlinux.shoot.canary.k8s-hana.ondemand.com/v1" + +TEST_DATA_DIR = Path(os.path.dirname(__file__)) / ".." / ".." / "test-data" / "release_notes" + class SubmoduleAsRepo(Repo): """This will fake a git submodule as a git repository object.""" @@ -28,11 +35,21 @@ def test_github_release_page(monkeypatch): import gardenlinux.github importlib.reload(gardenlinux.github) - generated_release_notes = gardenlinux.github.create_github_release_notes( - "1877.3", - "75df9f401a842914563f312899ec3ce34b24515c" - ) - fixture_path = Path(os.path.dirname(__file__)) / ".." / ".." / "test-data" / "github_release_notes_1877.3.md" - with open(fixture_path) as md: - release_notes_fixture = md.read() - assert generated_release_notes == release_notes_fixture + release_fixture_path = TEST_DATA_DIR / f"github_release_notes_{GARDENLINUX_RELEASE}.md" + glvd_response_fixture_path = TEST_DATA_DIR / f"glvd_{GARDENLINUX_RELEASE}.json" + + with requests_mock.Mocker(real_http=True) as m: + with open(glvd_response_fixture_path) as resp_json: + m.get( + f"{GLVD_BASE_URL}/patchReleaseNotes/{GARDENLINUX_RELEASE}", + text=resp_json.read(), + status_code=200 + ) + generated_release_notes = gardenlinux.github.create_github_release_notes( + GARDENLINUX_RELEASE, + GARDENLINUX_COMMIT + ) + + with open(release_fixture_path) as md: + release_notes_fixture = md.read() + assert f"x{generated_release_notes}" == f"x{release_notes_fixture}" From 616321d9ef4b7a9c92b73b0a051f6634d2e35446 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Wed, 17 Sep 2025 08:58:53 +0200 Subject: [PATCH 69/92] cosmetic fix --- tests/github/test_release_page.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index a2fa02fe..2e522bce 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -52,4 +52,4 @@ def test_github_release_page(monkeypatch): with open(release_fixture_path) as md: release_notes_fixture = md.read() - assert f"x{generated_release_notes}" == f"x{release_notes_fixture}" + assert generated_release_notes == release_notes_fixture From 7b0699c8fd33b043cad811d8a27b5ae5365873cb Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Wed, 17 Sep 2025 09:01:24 +0200 Subject: [PATCH 70/92] poetry deps updated --- poetry.lock | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/poetry.lock b/poetry.lock index e070571c..d8a56686 100644 --- a/poetry.lock +++ b/poetry.lock @@ -142,18 +142,18 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.40.30" +version = "1.40.32" description = "The AWS SDK for Python" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "boto3-1.40.30-py3-none-any.whl", hash = "sha256:04e89abf61240857bf7dec160e22f097eec68c502509b2bb3c5010a22cb91052"}, - {file = "boto3-1.40.30.tar.gz", hash = "sha256:e95db539c938710917f4cb4fc5915f71b27f2c836d949a1a95df7895d2e9ec8b"}, + {file = "boto3-1.40.32-py3-none-any.whl", hash = "sha256:9edf07327f444ddd142f45120c6979902712921b6e90fdb05963996b97bd7689"}, + {file = "boto3-1.40.32.tar.gz", hash = "sha256:6951aac75ce25611df55a31c844b118c288460648535ce9125fb15b490387ba4"}, ] [package.dependencies] -botocore = ">=1.40.30,<1.41.0" +botocore = ">=1.40.32,<1.41.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.14.0,<0.15.0" @@ -162,14 +162,14 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.40.30" +version = "1.40.32" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "botocore-1.40.30-py3-none-any.whl", hash = "sha256:1d87874ad81234bec3e83f9de13618f67ccdfefd08d6b8babc041cd45007447e"}, - {file = "botocore-1.40.30.tar.gz", hash = "sha256:8a74f77cfe5c519826d22f7613f89544cbb8491a1a49d965031bd997f89a8e3f"}, + {file = "botocore-1.40.32-py3-none-any.whl", hash = "sha256:a7cc409648aaf08a7d1aab76c675818868a0b76745b9deb478f91c1d8898aa8a"}, + {file = "botocore-1.40.32.tar.gz", hash = "sha256:e027adff8d6e177b396dff68340dafa7548b84aeb2cff149d84844d56ad29bae"}, ] [package.dependencies] @@ -1141,23 +1141,23 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests [[package]] name = "pytest-cov" -version = "7.0.0" +version = "6.3.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861"}, - {file = "pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1"}, + {file = "pytest_cov-6.3.0-py3-none-any.whl", hash = "sha256:440db28156d2468cafc0415b4f8e50856a0d11faefa38f30906048fe490f1749"}, + {file = "pytest_cov-6.3.0.tar.gz", hash = "sha256:35c580e7800f87ce892e687461166e1ac2bcb8fb9e13aea79032518d6e503ff2"}, ] [package.dependencies] -coverage = {version = ">=7.10.6", extras = ["toml"]} +coverage = {version = ">=7.5", extras = ["toml"]} pluggy = ">=1.2" -pytest = ">=7" +pytest = ">=6.2.5" [package.extras] -testing = ["process-tests", "pytest-xdist", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "python-dateutil" @@ -1803,16 +1803,19 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "xmltodict" -version = "1.0.0" +version = "1.0.1" description = "Makes working with XML feel like you are working with JSON" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "xmltodict-1.0.0-py3-none-any.whl", hash = "sha256:64316adb5e30ca21ad5cf391f4f0f6b34f673d96b79574f1db1e32b13b43ee34"}, - {file = "xmltodict-1.0.0.tar.gz", hash = "sha256:f50eb9020d28c673b40bbe3f43458ee165f0267c67f8ad8df0d70d9a4f3ac824"}, + {file = "xmltodict-1.0.1-py3-none-any.whl", hash = "sha256:47b370ca0bf049bfad9e12ab27b2bb81c9d4d0ac2f58901810f3acc1c06987a5"}, + {file = "xmltodict-1.0.1.tar.gz", hash = "sha256:43f06e35e03f0f3ce622b9bd5e9652570a923db2906d5d4b830b76eafcafddcb"}, ] +[package.extras] +test = ["pytest", "pytest-cov"] + [metadata] lock-version = "2.1" python-versions = "^3.13" From c9baa93243511d3cdfb445b836d9e48f98fb0abd Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Wed, 17 Sep 2025 09:11:21 +0200 Subject: [PATCH 71/92] gitpython dependency added --- poetry.lock | 48 +++++++++++++++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index d8a56686..c4061c4e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -580,6 +580,40 @@ files = [ {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] +[[package]] +name = "gitdb" +version = "4.0.12" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"}, + {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.45" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77"}, + {file = "gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] + [[package]] name = "idna" version = "3.10" @@ -1558,6 +1592,18 @@ files = [ {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] +[[package]] +name = "smmap" +version = "5.0.2" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"}, + {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"}, +] + [[package]] name = "snowballstemmer" version = "3.0.1" @@ -1819,4 +1865,4 @@ test = ["pytest", "pytest-cov"] [metadata] lock-version = "2.1" python-versions = "^3.13" -content-hash = "e6cffa53fa46383db2184376fda82411e9bd372c146f9936e88aad023f001cc4" +content-hash = "7f3b580ab2c8bd76d23cb82759c32d46902c3c9d4f989756737826e1f423901c" diff --git a/pyproject.toml b/pyproject.toml index 5be59d27..cd52acd9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,7 @@ oras = "^0.2.38" pygit2 = "^1.18.2" pygments = "^2.19.2" PyYAML = "^6.0.2" +gitpython = "^3.1.45" [tool.poetry.group.dev.dependencies] bandit = "^1.8.6" From 48fc0c4eee5308aac73a145f9e91fcc6c0a0e077 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Wed, 17 Sep 2025 12:00:41 +0200 Subject: [PATCH 72/92] testing get_package_list with a static Packages file --- test-data/release_notes/Packages.gz | Bin 0 -> 741568 bytes tests/github/test_release_page.py | 27 +++++++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 test-data/release_notes/Packages.gz diff --git a/test-data/release_notes/Packages.gz b/test-data/release_notes/Packages.gz new file mode 100644 index 0000000000000000000000000000000000000000..fb2dd4b31bb0d4b46dbf9a98b87d0ea0f06c9ce5 GIT binary patch literal 741568 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

7r=Eut-b+kYpMXk_DP$frLbi$5JLwJTwke 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

oV{om$ulSj3_Njjuu5f3{3dqw7< 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

a6#u0zrbb)3^xLbGul{0+{SsWQQ;!@_ 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

l{(g22>%r2q%fLwLWI8FhE1?W##z7L;U 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%0D_AVX=R@eT2v9M$$5JL0cJa8Fv} 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

RPkc;^f+It#DIp+0P( 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

lTUiZ`%{zEAIBnsY0?OUev8(X!p8p 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≈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 Date: Wed, 17 Sep 2025 12:01:03 +0200 Subject: [PATCH 73/92] isort configuration added --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index cd52acd9..7aec34f9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,6 +51,9 @@ norecursedirs = "test-data" skips = ["B101", "B404"] # allow asserts, subprocesses exclude_dirs = ["tests"] +[tool.isort] +known_first_party = "gardenlinux" + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" From 233613d554f06c02735aed35eacdcd2f65a3369d Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Wed, 17 Sep 2025 12:01:16 +0200 Subject: [PATCH 74/92] not using hardcoded bucket name anymore --- src/gardenlinux/github/__main__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index d243663f..c41ca971 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -393,7 +393,7 @@ def generate_download_links(flavor, platform): """ Generate download links for the flavor with correct file extension based on platform """ - base_url = "https://gardenlinux-github-releases.s3.amazonaws.com/objects" + base_url = f"https://{GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME}.s3.amazonaws.com/objects" file_ext = get_file_extension_for_platform(platform) filename = f"{flavor}{file_ext}" download_url = f"{base_url}/{flavor}/{filename}" @@ -438,7 +438,7 @@ def generate_detailed_format(grouped_data): file_ext = get_file_extension_for_platform(platform) filename = f"{data['flavor']}{file_ext}" - download_url = f"https://gardenlinux-github-releases.s3.amazonaws.com/objects/{data['flavor']}/{filename}" + download_url = f"https://{GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME}.s3.amazonaws.com/objects/{data['flavor']}/{filename}" output += f" download_url: {download_url}\n" if "regions" in data: @@ -716,7 +716,6 @@ def write_to_release_id_file(release_id): def create_github_release(owner, repo, tag, commitish, body): - token = os.environ.get("GITHUB_TOKEN") if not token: raise ValueError("GITHUB_TOKEN environment variable not set") From 201f37207974da6ca6c1b665d796d283502ed1ee Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Wed, 17 Sep 2025 12:01:55 +0200 Subject: [PATCH 75/92] s3_downloads added to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 955a202f..25f28988 100644 --- a/.gitignore +++ b/.gitignore @@ -169,3 +169,4 @@ bandit-report.json # zot test-data/zot +s3_downloads/ From 7dbbe20f72de584c77bf62bfe625df0d2c8658bd Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Wed, 17 Sep 2025 14:26:19 +0200 Subject: [PATCH 76/92] debug log level for github module --- src/gardenlinux/github/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index c41ca971..3780d0f7 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -21,7 +21,7 @@ from ..logger import LoggerSetup from ..s3 import S3Artifacts -LOGGER = LoggerSetup.get_logger("gardenlinux.github") +LOGGER = LoggerSetup.get_logger("gardenlinux.github", "DEBUG") GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME = "gardenlinux-github-releases" From 54a2f5d7431eafc0c4261165ad85af1e7a269a7a Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Wed, 17 Sep 2025 15:46:15 +0200 Subject: [PATCH 77/92] metadata download test --- tests/github/test_release_page.py | 40 ++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index c59faa18..9c14dc9d 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -1,18 +1,33 @@ import os +import shutil from pathlib import Path +import pytest import requests_mock from git import Repo from gardenlinux.apt.debsource import DebsrcFile -from gardenlinux.github.__main__ import _get_package_list +from gardenlinux.features import CName +from gardenlinux.github.__main__ import ( + GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, _get_package_list, + download_metadata_file, get_variant_from_flavor) +from gardenlinux.s3 import S3Artifacts GARDENLINUX_RELEASE = "1877.3" GARDENLINUX_COMMIT = "75df9f401a842914563f312899ec3ce34b24515c" +GARDENLINUX_COMMIT_SHORT = GARDENLINUX_COMMIT[:8] + GLVD_BASE_URL = "https://glvd.ingress.glvd.gardnlinux.shoot.canary.k8s-hana.ondemand.com/v1" GL_REPO_BASE_URL = "https://packages.gardenlinux.io/gardenlinux" TEST_DATA_DIR = Path(os.path.dirname(__file__)) / ".." / ".." / "test-data" / "release_notes" +S3_DOWNLOADS_DIR = Path(os.path.dirname(__file__)) / ".." / ".." / "s3_downloads" + +TEST_FLAVORS = [("foo_bar_baz", "legacy"), + ("aws-gardener_prod_trustedboot_tpm2-amd64", "legacy"), + ("openstack-gardener_prod_tpm2_trustedboot-arm64", "tpm2_trustedboot"), + ("azure-gardener_prod_usi-amd64", "usi"), + ("", "legacy")] class SubmoduleAsRepo(Repo): @@ -37,6 +52,18 @@ def __new__(cls, *args, **kwargs): return sr +@pytest.fixture +def downloads_dir(): + os.makedirs(S3_DOWNLOADS_DIR, exist_ok=True) + yield + shutil.rmtree(S3_DOWNLOADS_DIR) + + +@pytest.mark.parametrize("flavor", TEST_FLAVORS) +def test_get_variant_from_flavor(flavor): + assert get_variant_from_flavor(flavor[0]) == flavor[1] + + def test_get_package_list(): gl_packages_gz = TEST_DATA_DIR / "Packages.gz" @@ -50,6 +77,17 @@ def test_get_package_list(): assert isinstance(_get_package_list(GARDENLINUX_RELEASE), DebsrcFile) +def test_download_metadata_file(downloads_dir): + s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(GARDENLINUX_RELEASE, GARDENLINUX_COMMIT_SHORT)) + download_metadata_file(s3_artifacts, + cname.cname, + GARDENLINUX_RELEASE, + GARDENLINUX_COMMIT_SHORT, + S3_DOWNLOADS_DIR) + os.path.isfile(S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml") + + def test_github_release_page(monkeypatch): monkeypatch.setattr("gardenlinux.github.__main__.Repo", SubmoduleAsRepo) import gardenlinux.github From 1c58f8df08f4e865656522696a8427a13362a6f3 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Thu, 18 Sep 2025 07:26:13 +0200 Subject: [PATCH 78/92] more tests --- tests/github/test_release_page.py | 46 +++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index 9c14dc9d..5d3b3f0e 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -85,10 +85,52 @@ def test_download_metadata_file(downloads_dir): GARDENLINUX_RELEASE, GARDENLINUX_COMMIT_SHORT, S3_DOWNLOADS_DIR) - os.path.isfile(S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml") + assert (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() -def test_github_release_page(monkeypatch): +def test_download_metadata_file_no_such_release(downloads_dir): + s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + release = "0000.0" + commit = GARDENLINUX_COMMIT_SHORT + cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) + with pytest.raises(IndexError): + download_metadata_file(s3_artifacts, + cname.cname, + release, + commit, + S3_DOWNLOADS_DIR) + assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() + + +def test_download_metadata_file_no_such_commit(downloads_dir): + s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + release = GARDENLINUX_RELEASE + commit = "deadbeef" + cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) + with pytest.raises(IndexError): + download_metadata_file(s3_artifacts, + cname.cname, + release, + commit, + S3_DOWNLOADS_DIR) + assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() + + +def test_download_metadata_file_no_such_release_and_commit(downloads_dir): + s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + release = "0000.0" + commit = "deadbeef" + cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) + with pytest.raises(IndexError): + download_metadata_file(s3_artifacts, + cname.cname, + release, + commit, + S3_DOWNLOADS_DIR) + assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() + + +def test_github_release_page(monkeypatch, downloads_dir): monkeypatch.setattr("gardenlinux.github.__main__.Repo", SubmoduleAsRepo) import gardenlinux.github From ddf2116cf9d7667cd178f7e0fa2ddb023e5a26f1 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Thu, 18 Sep 2025 09:21:23 +0200 Subject: [PATCH 79/92] more tests --- tests/github/test_release_page.py | 36 +++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index 5d3b3f0e..a38dd5a2 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -9,8 +9,10 @@ from gardenlinux.apt.debsource import DebsrcFile from gardenlinux.features import CName from gardenlinux.github.__main__ import ( - GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, _get_package_list, - download_metadata_file, get_variant_from_flavor) + GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, RELEASE_ID_FILE, _get_package_list, + download_metadata_file, get_file_extension_for_platform, + get_platform_display_name, get_platform_release_note_data, + get_variant_from_flavor, write_to_release_id_file) from gardenlinux.s3 import S3Artifacts GARDENLINUX_RELEASE = "1877.3" @@ -59,6 +61,15 @@ def downloads_dir(): shutil.rmtree(S3_DOWNLOADS_DIR) +@pytest.fixture +def release_id_file(): + with open(RELEASE_ID_FILE, "w"): + pass + os.chmod(RELEASE_ID_FILE, 0) + yield + os.remove(RELEASE_ID_FILE) + + @pytest.mark.parametrize("flavor", TEST_FLAVORS) def test_get_variant_from_flavor(flavor): assert get_variant_from_flavor(flavor[0]) == flavor[1] @@ -77,6 +88,23 @@ def test_get_package_list(): assert isinstance(_get_package_list(GARDENLINUX_RELEASE), DebsrcFile) +def test_get_platform_release_note_data_invalid_platform(): + assert get_platform_release_note_data("_", "foo") is None + + +def test_get_file_extension_for_platform_invalid_platform(): + assert get_file_extension_for_platform("foo") == ".raw" + + +def test_get_platform_display_name_invalid_platform(): + assert get_platform_display_name("foo") == "FOO" + + +def test_write_to_release_id_file_broken_file_permissions(release_id_file): + with pytest.raises(SystemExit): + write_to_release_id_file(GARDENLINUX_RELEASE) + + def test_download_metadata_file(downloads_dir): s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(GARDENLINUX_RELEASE, GARDENLINUX_COMMIT_SHORT)) @@ -152,3 +180,7 @@ def test_github_release_page(monkeypatch, downloads_dir): with open(release_fixture_path) as md: release_notes_fixture = md.read() assert generated_release_notes == release_notes_fixture + + +def test_upload_to_github_release_page(): + pass From 5e79b3c38096b9359cb9c687ab34cc7d6d9bb806 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Thu, 18 Sep 2025 09:21:31 +0200 Subject: [PATCH 80/92] generate coverage report in html format if run locally --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 59d6b33a..077bc3e9 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,7 @@ test: install-test $(POETRY) run pytest -k "not kms" test-coverage: install-test - $(POETRY) run pytest -k "not kms" --cov=gardenlinux --cov-report=xml tests/ + $(POETRY) run pytest -k "not kms" --cov=gardenlinux --cov-report=html tests/ test-coverage-ci: install-test $(POETRY) run pytest -k "not kms" --cov=gardenlinux --cov-report=xml --cov-fail-under=85 tests/ From a24966c94a90ab464652e4de9a76d56e80936b1d Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Thu, 18 Sep 2025 16:31:56 +0200 Subject: [PATCH 81/92] working release page test with mocked s3 --- Makefile | 3 + .../ali-gardener_prod-amd64.s3_metadata.yaml | 188 ++++++++++++ .../aws-gardener_prod-amd64.s3_metadata.yaml | 167 +++++++++++ .../aws-gardener_prod-arm64.s3_metadata.yaml | 155 ++++++++++ ...od_tpm2_trustedboot-amd64.s3_metadata.yaml | 265 +++++++++++++++++ ...od_tpm2_trustedboot-arm64.s3_metadata.yaml | 277 ++++++++++++++++++ ...s-gardener_prod_usi-amd64.s3_metadata.yaml | 193 ++++++++++++ ...s-gardener_prod_usi-arm64.s3_metadata.yaml | 181 ++++++++++++ ...azure-gardener_prod-amd64.s3_metadata.yaml | 105 +++++++ ...azure-gardener_prod-arm64.s3_metadata.yaml | 111 +++++++ ...od_tpm2_trustedboot-amd64.s3_metadata.yaml | 227 ++++++++++++++ ...od_tpm2_trustedboot-arm64.s3_metadata.yaml | 227 ++++++++++++++ ...e-gardener_prod_usi-amd64.s3_metadata.yaml | 137 +++++++++ ...e-gardener_prod_usi-arm64.s3_metadata.yaml | 149 ++++++++++ .../container-amd64.s3_metadata.yaml | 91 ++++++ .../container-arm64.s3_metadata.yaml | 91 ++++++ .../gcp-gardener_prod-amd64.s3_metadata.yaml | 105 +++++++ .../gcp-gardener_prod-arm64.s3_metadata.yaml | 93 ++++++ ...od_tpm2_trustedboot-amd64.s3_metadata.yaml | 233 +++++++++++++++ ...od_tpm2_trustedboot-arm64.s3_metadata.yaml | 221 ++++++++++++++ ...p-gardener_prod_usi-amd64.s3_metadata.yaml | 131 +++++++++ ...p-gardener_prod_usi-arm64.s3_metadata.yaml | 131 +++++++++ .../gdch-gardener_prod-amd64.s3_metadata.yaml | 91 ++++++ .../gdch-gardener_prod-arm64.s3_metadata.yaml | 103 +++++++ .../kvm-gardener_prod-amd64.s3_metadata.yaml | 92 ++++++ .../kvm-gardener_prod-arm64.s3_metadata.yaml | 92 ++++++ ...od_tpm2_trustedboot-amd64.s3_metadata.yaml | 208 +++++++++++++ ...od_tpm2_trustedboot-arm64.s3_metadata.yaml | 220 ++++++++++++++ ...m-gardener_prod_usi-amd64.s3_metadata.yaml | 118 ++++++++ ...m-gardener_prod_usi-arm64.s3_metadata.yaml | 118 ++++++++ .../metal-capi-amd64.s3_metadata.yaml | 89 ++++++ .../metal-capi-arm64.s3_metadata.yaml | 101 +++++++ ...metal-gardener_prod-amd64.s3_metadata.yaml | 90 ++++++ ...metal-gardener_prod-arm64.s3_metadata.yaml | 90 ++++++ ...od_tpm2_trustedboot-amd64.s3_metadata.yaml | 206 +++++++++++++ ...od_tpm2_trustedboot-arm64.s3_metadata.yaml | 206 +++++++++++++ ...l-gardener_prod_usi-amd64.s3_metadata.yaml | 116 ++++++++ ...l-gardener_prod_usi-arm64.s3_metadata.yaml | 128 ++++++++ .../metal-gardener_pxe-amd64.s3_metadata.yaml | 90 ++++++ .../metal-gardener_pxe-arm64.s3_metadata.yaml | 90 ++++++ .../metal-vhost-amd64.s3_metadata.yaml | 87 ++++++ .../metal-vhost-arm64.s3_metadata.yaml | 87 ++++++ .../metal_pxe-amd64.s3_metadata.yaml | 88 ++++++ .../metal_pxe-arm64.s3_metadata.yaml | 88 ++++++ ...stack-gardener_prod-amd64.s3_metadata.yaml | 149 ++++++++++ ...stack-gardener_prod-arm64.s3_metadata.yaml | 103 +++++++ ...od_tpm2_trustedboot-amd64.s3_metadata.yaml | 243 +++++++++++++++ ...od_tpm2_trustedboot-arm64.s3_metadata.yaml | 243 +++++++++++++++ ...k-gardener_prod_usi-amd64.s3_metadata.yaml | 199 +++++++++++++ ...k-gardener_prod_usi-arm64.s3_metadata.yaml | 141 +++++++++ ...metal-gardener_prod-amd64.s3_metadata.yaml | 149 ++++++++++ ...metal-gardener_prod-arm64.s3_metadata.yaml | 103 +++++++ ...mware-gardener_prod-amd64.s3_metadata.yaml | 104 +++++++ ...mware-gardener_prod-arm64.s3_metadata.yaml | 92 ++++++ tests/github/test_release_page.py | 75 ++++- 55 files changed, 7673 insertions(+), 7 deletions(-) create mode 100644 test-data/release_notes/s3_bucket_artifacts/ali-gardener_prod-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_usi-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_usi-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_usi-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_usi-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/container-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/container-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_usi-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_usi-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/gdch-gardener_prod-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/gdch-gardener_prod-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_usi-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_usi-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/metal-capi-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/metal-capi-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_usi-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_usi-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/metal-gardener_pxe-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/metal-gardener_pxe-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/metal-vhost-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/metal-vhost-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/metal_pxe-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/metal_pxe-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_usi-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_usi-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/openstackbaremetal-gardener_prod-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/openstackbaremetal-gardener_prod-arm64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/vmware-gardener_prod-amd64.s3_metadata.yaml create mode 100644 test-data/release_notes/s3_bucket_artifacts/vmware-gardener_prod-arm64.s3_metadata.yaml diff --git a/Makefile b/Makefile index 077bc3e9..dea13c3d 100644 --- a/Makefile +++ b/Makefile @@ -46,6 +46,9 @@ install-test: install-dev test: install-test $(POETRY) run pytest -k "not kms" +coverage: + $(POETRY) run coverage report -m + test-coverage: install-test $(POETRY) run pytest -k "not kms" --cov=gardenlinux --cov-report=html tests/ diff --git a/test-data/release_notes/s3_bucket_artifacts/ali-gardener_prod-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/ali-gardener_prod-amd64.s3_metadata.yaml new file mode 100644 index 00000000..8429ecad --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/ali-gardener_prod-amd64.s3_metadata.yaml @@ -0,0 +1,188 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:14.341330' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- ali +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: 509c00f64279214b2b2da852eff090a5 + name: ali-gardener_prod-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/ali-gardener_prod-amd64-1877.3-75df9f40/ali-gardener_prod-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: ad6ef2a783c3ff41121c4b737676e856 + name: ali-gardener_prod-amd64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/ali-gardener_prod-amd64-1877.3-75df9f40/ali-gardener_prod-amd64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: ali-gardener_prod-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/ali-gardener_prod-amd64-1877.3-75df9f40/ali-gardener_prod-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: ed2508739ef125509598fd59501cfab1 + name: ali-gardener_prod-amd64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/ali-gardener_prod-amd64-1877.3-75df9f40/ali-gardener_prod-amd64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: 1f4b5a08ab62b46d129ca5d50687b0d8 + name: ali-gardener_prod-amd64-1877.3-75df9f40.qcow2 + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/ali-gardener_prod-amd64-1877.3-75df9f40/ali-gardener_prod-amd64-1877.3-75df9f40.qcow2 + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2 +- md5sum: 6fc647efdb84e2510c30eff2741a573c + name: ali-gardener_prod-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/ali-gardener_prod-amd64-1877.3-75df9f40/ali-gardener_prod-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 99ffb5ea74e0799faca2737dc3bf8d89 + name: ali-gardener_prod-amd64-1877.3-75df9f40.qcow2.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/ali-gardener_prod-amd64-1877.3-75df9f40/ali-gardener_prod-amd64-1877.3-75df9f40.qcow2.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2.log +- md5sum: 6fc647efdb84e2510c30eff2741a573c + name: ali-gardener_prod-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/ali-gardener_prod-amd64-1877.3-75df9f40/ali-gardener_prod-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 6fc647efdb84e2510c30eff2741a573c + name: ali-gardener_prod-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/ali-gardener_prod-amd64-1877.3-75df9f40/ali-gardener_prod-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: d2dab0252d2b9b7542a8255a1e7e4aa7 + name: ali-gardener_prod-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/ali-gardener_prod-amd64-1877.3-75df9f40/ali-gardener_prod-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 008002e0d4cf9a832756ae303b597e56 + name: ali-gardener_prod-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/ali-gardener_prod-amd64-1877.3-75df9f40/ali-gardener_prod-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 6fc647efdb84e2510c30eff2741a573c + name: ali-gardener_prod-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/ali-gardener_prod-amd64-1877.3-75df9f40/ali-gardener_prod-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +platform: ali +published_image_metadata: + published_alicloud_images: + - image_id: m-m5efm8l2bltkbloui235 + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-qingdao + - image_id: m-2zee5ebi20ltzy5et7in + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-beijing + - image_id: m-8vbddy2wfex9nb29afcy + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-zhangjiakou + - image_id: m-hp3bx14og6cw9thujw1d + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-huhehaote + - image_id: m-0jlh1iq2f3bryb5okjdk + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-wulanchabu + - image_id: m-bp13aseh5a2wn0s5rdz6 + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-hangzhou + - image_id: m-uf61jbe9n8a9291h4u21 + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-shanghai + - image_id: m-gc77bfbctuzphl2bpk0o + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-nanjing + - image_id: m-wz9gio8m5ey0foj0g4xx + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-shenzhen + - image_id: m-f8zdn54v0blnsafxb1t5 + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-heyuan + - image_id: m-7xv0q5feffsxxyttxdy9 + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-guangzhou + - image_id: m-gw07bfbctuzphl2bpk0p + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-fuzhou + - image_id: m-n4a1u2avlb9pq0u5bdms + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-wuhan-lr + - image_id: m-2vc5saul2saa2z57h216 + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-chengdu + - image_id: m-j6c4zk6mwb2673iq5wrz + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: cn-hongkong + - image_id: m-6weibwo3vrt7ar7nelc9 + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: ap-northeast-1 + - image_id: m-mj73oldn06th2vy0ymhv + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: ap-northeast-2 + - image_id: m-t4ngrf81d0fohwq493pw + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: ap-southeast-1 + - image_id: m-8psd64gzc1eru0qld7cc + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: ap-southeast-3 + - image_id: m-5tsdd6k3z1vvdyyio7zn + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: ap-southeast-6 + - image_id: m-k1aj4usnhqcssa2fpy0c + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: ap-southeast-5 + - image_id: m-0jo6uwekvn0gnwhwnq3s + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: ap-southeast-7 + - image_id: m-0xi8netpfc2fdwfstz3c + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: us-east-1 + - image_id: m-rj9gwpx907qv6p6x8w45 + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: us-west-1 + - image_id: m-4hfi34x77oaeznwuulq6 + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: na-south-1 + - image_id: m-d7o2ny5xc0m3kacxjbem + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: eu-west-1 + - image_id: m-eb39mgohcec6gaynet9l + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: me-east-1 + - image_id: m-gw86dlqmpaugljiykx91 + image_name: gardenlinux-ali-gardener_prod-amd64-1877.3-75df9f40 + region_id: eu-central-1 +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/ali-gardener_prod-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod-amd64.s3_metadata.yaml new file mode 100644 index 00000000..6a39f83b --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod-amd64.s3_metadata.yaml @@ -0,0 +1,167 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:13.957549' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- aws +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: 3066488dd32eb7a2753e6400e086b0a0 + name: aws-gardener_prod-amd64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-amd64-1877.3-75df9f40/aws-gardener_prod-amd64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: 79b1ee8129cacef200f59312e14fa8c9 + name: aws-gardener_prod-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-amd64-1877.3-75df9f40/aws-gardener_prod-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 79b1ee8129cacef200f59312e14fa8c9 + name: aws-gardener_prod-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-amd64-1877.3-75df9f40/aws-gardener_prod-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: fbe9ffc34436b133144eaa2a23c9307c + name: aws-gardener_prod-amd64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-amd64-1877.3-75df9f40/aws-gardener_prod-amd64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: 85a3d5dc30fc515300a8c108d8e98165 + name: aws-gardener_prod-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-amd64-1877.3-75df9f40/aws-gardener_prod-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: cc6da9c24852e2641db487018c0004f7 + name: aws-gardener_prod-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-amd64-1877.3-75df9f40/aws-gardener_prod-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: aws-gardener_prod-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-amd64-1877.3-75df9f40/aws-gardener_prod-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 759e52114e6c72e0625481b9201bae98 + name: aws-gardener_prod-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-amd64-1877.3-75df9f40/aws-gardener_prod-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 42da33eb4c20a9be994dda3d4cac9af4 + name: aws-gardener_prod-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-amd64-1877.3-75df9f40/aws-gardener_prod-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 79b1ee8129cacef200f59312e14fa8c9 + name: aws-gardener_prod-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-amd64-1877.3-75df9f40/aws-gardener_prod-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 79b1ee8129cacef200f59312e14fa8c9 + name: aws-gardener_prod-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-amd64-1877.3-75df9f40/aws-gardener_prod-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: fcc91411ef66be74a825cc77bbffc4c6 + name: aws-gardener_prod-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-amd64-1877.3-75df9f40/aws-gardener_prod-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +platform: aws +published_image_metadata: + published_aws_images: + - ami_id: ami-00c6adf1de4dd746a + aws_region_id: ap-south-1 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-07ad3940828172b90 + aws_region_id: eu-north-1 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-071f4f48679d86638 + aws_region_id: eu-west-3 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-0b10af1a19df9f038 + aws_region_id: eu-south-1 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-0e2b7fe07573b71cd + aws_region_id: eu-west-2 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-01c547eb85d61da61 + aws_region_id: eu-west-1 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-0dad917ede94cd3c7 + aws_region_id: ap-northeast-3 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-0ecbeaf40d4643016 + aws_region_id: ap-northeast-2 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-0b7225242babad11c + aws_region_id: ap-northeast-1 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-0d298e552bf051bc7 + aws_region_id: me-central-1 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-0af8422162c8f056e + aws_region_id: ca-central-1 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-05d885175e942fc80 + aws_region_id: sa-east-1 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-0a9802680adf7e430 + aws_region_id: ap-southeast-1 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-07ed6f1e62fbd6d66 + aws_region_id: ap-southeast-2 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-055a0ce37433fcdee + aws_region_id: us-east-1 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-07e9069631850755a + aws_region_id: us-east-2 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-08c18abab76066f71 + aws_region_id: us-west-1 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-00eca0475f90a1f8c + aws_region_id: us-west-2 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-0198822fa7d539f8c + aws_region_id: eu-central-1 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-093c993faaca89b4d + aws_region_id: cn-north-1 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 + - ami_id: ami-05e1cc73d997d67b7 + aws_region_id: cn-northwest-1 + image_name: gardenlinux-aws-gardener_prod-amd64-1877.3-75df9f40 +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/aws-gardener_prod-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod-arm64.s3_metadata.yaml new file mode 100644 index 00000000..0d207610 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod-arm64.s3_metadata.yaml @@ -0,0 +1,155 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:31.789764' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- aws +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: eb0f092f64112efc021759faf4b43384 + name: aws-gardener_prod-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-arm64-1877.3-75df9f40/aws-gardener_prod-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: b09fbe9f2601e48df6f9235da89dc440 + name: aws-gardener_prod-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-arm64-1877.3-75df9f40/aws-gardener_prod-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: ebe40d9d33607ccbd9991a2e31237644 + name: aws-gardener_prod-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-arm64-1877.3-75df9f40/aws-gardener_prod-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 52b44db1a13838d442aa6ab6862be2c1 + name: aws-gardener_prod-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-arm64-1877.3-75df9f40/aws-gardener_prod-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 139411e6cbfd432bc4273cedad07faf1 + name: aws-gardener_prod-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-arm64-1877.3-75df9f40/aws-gardener_prod-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: eb0f092f64112efc021759faf4b43384 + name: aws-gardener_prod-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-arm64-1877.3-75df9f40/aws-gardener_prod-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: eb0f092f64112efc021759faf4b43384 + name: aws-gardener_prod-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-arm64-1877.3-75df9f40/aws-gardener_prod-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: eb0f092f64112efc021759faf4b43384 + name: aws-gardener_prod-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-arm64-1877.3-75df9f40/aws-gardener_prod-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: c6b294bf3012b3c374d4136abbfb7890 + name: aws-gardener_prod-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-arm64-1877.3-75df9f40/aws-gardener_prod-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: adb1442c2ff3dc27e21d27bed1a18d73 + name: aws-gardener_prod-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod-arm64-1877.3-75df9f40/aws-gardener_prod-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +platform: aws +published_image_metadata: + published_aws_images: + - ami_id: ami-00cd00c30d19609a2 + aws_region_id: ap-south-1 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-0a969a1a1c4726831 + aws_region_id: eu-north-1 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-0b579f6c70b7c4fe6 + aws_region_id: eu-west-3 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-06c38608e2e7223d3 + aws_region_id: eu-south-1 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-005c7058c3923b2eb + aws_region_id: eu-west-2 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-0395c3cd38a0a5cd6 + aws_region_id: eu-west-1 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-0db3697cea87a5104 + aws_region_id: ap-northeast-3 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-084444f62c7c580fb + aws_region_id: ap-northeast-2 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-017237dd9abeae8dd + aws_region_id: ap-northeast-1 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-08efdb3153d0cd184 + aws_region_id: me-central-1 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-05b535ae9418fee3d + aws_region_id: ca-central-1 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-036ded98bad763e3c + aws_region_id: sa-east-1 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-03fcefb2fd18519d0 + aws_region_id: ap-southeast-1 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-040f9d0caa5d79e84 + aws_region_id: ap-southeast-2 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-04110d6a1970e748c + aws_region_id: us-east-1 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-0c8dc664a21d5ca08 + aws_region_id: us-east-2 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-0ddc462d075935666 + aws_region_id: us-west-1 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-0e67c2546e54fed06 + aws_region_id: us-west-2 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-06a2a1e7da947b192 + aws_region_id: eu-central-1 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-0b3755339496a3158 + aws_region_id: cn-north-1 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 + - ami_id: ami-06fc0f74b500d2d82 + aws_region_id: cn-northwest-1 + image_name: gardenlinux-aws-gardener_prod-arm64-1877.3-75df9f40 +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/aws-gardener_prod-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml new file mode 100644 index 00000000..3488a130 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml @@ -0,0 +1,265 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:11.317861' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- aws +- multipath +- iscsi +- nvme +- gardener +- _tpm2 +- _usi +- _trustedboot +paths: +- md5sum: dfe7ec9966baed78f736dbdd66bd499b + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 90506fc70b6ee2b8ac8c2fd849c27608 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: dd083fb6e5161375ebbdd09be72046be + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.auth +- md5sum: 00c6a209a251e559c491dc747eaef1bd + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.crt +- md5sum: 0c3532df41de8807c054e4c8344dcd22 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: d00a88a05460802c94211cdd7e8cc8e5 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.der +- md5sum: bd97f335f9e70a7012879b67e0de93c8 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: cb1498b70089c70087f70f3fa729c93d + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: 866015eea9749a3b01b07bf385706676 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.der +- md5sum: c186ed1f06ea27eb516e3db49cfee700 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.der +- md5sum: 71cd1e0927785984303bf045d06d5a00 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.auth +- md5sum: deb3e30bbbd0bc8b11b41fde73eef3dc + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.conf +- md5sum: dfe7ec9966baed78f736dbdd66bd499b + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 94494df8e01481b52238a09206e0e3a2 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.crt +- md5sum: 9cb071f5577890934e8b939140f8a41d + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: cb1498b70089c70087f70f3fa729c93d + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 03d78f357e62eb5051bd5e04a69dc805 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.conf +- md5sum: 32d06b0baf4e3027766ee19f0722ff40 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.null.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.null.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.null.pk.auth +- md5sum: f4dfe8a5dd7c912408fa59f761e8840b + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 52a08859dd78bc3ec1d971e6e3896213 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.auth +- md5sum: 6b64f5c6af595356b599dfb5ce4a4cd6 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 7540eb9300b16ac6ac6c51e2c0324f81 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: d41d8cd98f00b204e9800998ecf8427e + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.arn + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.arn + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.arn +- md5sum: dfe7ec9966baed78f736dbdd66bd499b + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: b61f1bcc6921163cd6f1bf6978b7e015 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 55b26949aaeb59e9699cebc4bbdcca3e + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.conf +- md5sum: 4474c294b76e3f65574a013f6f8e89b1 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.crt +- md5sum: dfe7ec9966baed78f736dbdd66bd499b + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 79ffa1228382c7c5d7adf3578a209bd0 + name: aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.aws-efivars + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.aws-efivars + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.aws-efivars +platform: aws +published_image_metadata: + published_aws_images: + - ami_id: ami-0052561d7bccfe6b7 + aws_region_id: ap-south-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-06623180935c63669 + aws_region_id: eu-north-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-026632e35fe37f9f4 + aws_region_id: eu-west-3 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-0b60116fac38c2556 + aws_region_id: eu-south-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-0ecd844859adf35c5 + aws_region_id: eu-west-2 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-0313333df0acd7eb0 + aws_region_id: eu-west-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-04e53edbd6ce18fc6 + aws_region_id: ap-northeast-3 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-0ae03e19777874cef + aws_region_id: ap-northeast-2 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-079e68ce96cc03e78 + aws_region_id: ap-northeast-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-01e368d192a479934 + aws_region_id: me-central-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-02cabce931cafcf1f + aws_region_id: ca-central-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-075d5fa3b98620e15 + aws_region_id: sa-east-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-0a26b478c0a210190 + aws_region_id: ap-southeast-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-0f226413240aec4aa + aws_region_id: ap-southeast-2 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-07dea60f619226e1b + aws_region_id: us-east-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-0e8e852987ee840c3 + aws_region_id: us-east-2 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-0d9314ee5a439ab29 + aws_region_id: us-west-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-04dc4614abf1649ab + aws_region_id: us-west-2 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 + - ami_id: ami-005f7dab618420a91 + aws_region_id: eu-central-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/aws-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 +secureboot: true +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml new file mode 100644 index 00000000..a0205400 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml @@ -0,0 +1,277 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:29.267582' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- aws +- multipath +- iscsi +- nvme +- gardener +- _tpm2 +- _usi +- _trustedboot +paths: +- md5sum: 8243543bb4ed8d495662ef218aed9d9b + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 866015eea9749a3b01b07bf385706676 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.der +- md5sum: 03d78f357e62eb5051bd5e04a69dc805 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.conf +- md5sum: 8c0534751f3fb0998157e9c6a3d810b5 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 40eb7202cb8049721aaa1ba637469309 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: 0cfe4815af000fcdea7d7e5b8515cebc + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: d390574c13df3e49ce200bbeba5e0e08 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: ba9b31f1a9ec7dd34bd578e47fac7b5d + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 79ffa1228382c7c5d7adf3578a209bd0 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.aws-efivars + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.aws-efivars + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.aws-efivars +- md5sum: 4dc4878451eec3317655cfbaaec8118e + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: 00c6a209a251e559c491dc747eaef1bd + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.crt +- md5sum: e5aff4397d06065fb77719a7f939c45b + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 94494df8e01481b52238a09206e0e3a2 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.crt +- md5sum: dd083fb6e5161375ebbdd09be72046be + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.auth +- md5sum: d2e949b4238b341baadc4e0d8f35f7d0 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: deb3e30bbbd0bc8b11b41fde73eef3dc + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.conf +- md5sum: ba9ffe8f691424c5a44d15b30a0e1191 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: 55b26949aaeb59e9699cebc4bbdcca3e + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.conf +- md5sum: 71cd1e0927785984303bf045d06d5a00 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.auth +- md5sum: 4474c294b76e3f65574a013f6f8e89b1 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.crt +- md5sum: 32d06b0baf4e3027766ee19f0722ff40 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.null.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.null.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.null.pk.auth +- md5sum: 52a08859dd78bc3ec1d971e6e3896213 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.auth +- md5sum: 527afa118ccd8e1265dc45e29efa58fe + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: ba9b31f1a9ec7dd34bd578e47fac7b5d + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: c186ed1f06ea27eb516e3db49cfee700 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.der +- md5sum: 40eb7202cb8049721aaa1ba637469309 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 45f4004d7f4bd20ff985e151664910b0 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: d00a88a05460802c94211cdd7e8cc8e5 + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.der +- md5sum: ba9b31f1a9ec7dd34bd578e47fac7b5d + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: ba9b31f1a9ec7dd34bd578e47fac7b5d + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: d41d8cd98f00b204e9800998ecf8427e + name: aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.arn + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.arn + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.arn +platform: aws +published_image_metadata: + published_aws_images: + - ami_id: ami-035b751a08f528e47 + aws_region_id: ap-south-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-04c60d1feb092d00f + aws_region_id: eu-north-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-0443172a73fe4fb27 + aws_region_id: eu-west-3 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-02f8a867d02227542 + aws_region_id: eu-south-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-06a900dd59c84620d + aws_region_id: eu-west-2 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-056a9d8447a991bff + aws_region_id: eu-west-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-0769caf50f7b7fb6f + aws_region_id: ap-northeast-3 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-06ad8c60e1093b543 + aws_region_id: ap-northeast-2 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-0b8313d62dfeec78b + aws_region_id: ap-northeast-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-0fa388dcaca7b3baf + aws_region_id: me-central-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-02e7a07f60a5e0411 + aws_region_id: ca-central-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-000ca39b22f2a695c + aws_region_id: sa-east-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-04f521cff21b58f50 + aws_region_id: ap-southeast-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-02f5afcce42276457 + aws_region_id: ap-southeast-2 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-0a25256d5aaf8fdd7 + aws_region_id: us-east-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-07bcfed39a329b612 + aws_region_id: us-east-2 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-0b2e93f36b5a8bff2 + aws_region_id: us-west-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-063f4f34958917b5c + aws_region_id: us-west-2 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 + - ami_id: ami-0b15b442dd5e90d50 + aws_region_id: eu-central-1 + image_name: gardenlinux-aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/aws-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 +secureboot: true +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_usi-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_usi-amd64.s3_metadata.yaml new file mode 100644 index 00000000..6333e28b --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_usi-amd64.s3_metadata.yaml @@ -0,0 +1,193 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:53.197872' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nocrypt +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- aws +- multipath +- iscsi +- nvme +- gardener +- _unsigned +- _usi +paths: +- md5sum: 815a4c98a92ee4ad440f6a7f74242d6d + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 527d1f663b89bc956983b6f1929c1b07 + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: 5c220b0737ceae8ad853c6945270182a + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 5c220b0737ceae8ad853c6945270182a + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: eeb4ca6a8459a7ff0bfeb6854560584f + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: 073689d27f237067015538a6119910c6 + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: 5c220b0737ceae8ad853c6945270182a + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: ce6c8e943cbff94b2c110b077136a218 + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: fb92799df8fc891ece13f427e3bfab5c + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 6220ff01d80283095b3ed3b611cd183a + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 815a4c98a92ee4ad440f6a7f74242d6d + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: 90506fc70b6ee2b8ac8c2fd849c27608 + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 5c220b0737ceae8ad853c6945270182a + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 3ba526c627631bc4934dc4c1ccabd6b8 + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 28ce5927bb5e59290300190a30167ee3 + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 28e7a0143e01e71dc347758d7e5ef7b4 + name: aws-gardener_prod_usi-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-amd64-1877.3-75df9f40/aws-gardener_prod_usi-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +platform: aws +published_image_metadata: + published_aws_images: + - ami_id: ami-0e904b4c264dbe923 + aws_region_id: ap-south-1 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-016f506d46abb5c06 + aws_region_id: eu-north-1 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-052404d8a97e9ec57 + aws_region_id: eu-west-3 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-002193c185fb2d939 + aws_region_id: eu-south-1 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-0225bc62c7d291107 + aws_region_id: eu-west-2 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-0f737c34ae9ccfe10 + aws_region_id: eu-west-1 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-0ecf19a78a7259c02 + aws_region_id: ap-northeast-3 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-029152bf0a15cf306 + aws_region_id: ap-northeast-2 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-0bf003b58ed636124 + aws_region_id: ap-northeast-1 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-0546ca7d7c2e00077 + aws_region_id: me-central-1 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-0a0081cbd4b479d33 + aws_region_id: ca-central-1 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-086d3b7282338bcd1 + aws_region_id: sa-east-1 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-04973efd023e5883f + aws_region_id: ap-southeast-1 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-00389783d0b7ef01b + aws_region_id: ap-southeast-2 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-0f5c28bbc45608e9b + aws_region_id: us-east-1 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-08c7494a2a00b74e5 + aws_region_id: us-east-2 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-0e2290963849dba62 + aws_region_id: us-west-1 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-0fb86d519a38da40f + aws_region_id: us-west-2 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-0c6394e4fdbefe8c0 + aws_region_id: eu-central-1 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-0b4c979b27a0a7714 + aws_region_id: cn-north-1 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 + - ami_id: ami-0cab977e76e274599 + aws_region_id: cn-northwest-1 + image_name: gardenlinux-aws-gardener_prod_usi-amd64-1877.3-75df9f40 +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/aws-gardener_prod_usi-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_usi-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_usi-arm64.s3_metadata.yaml new file mode 100644 index 00000000..4ceff914 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/aws-gardener_prod_usi-arm64.s3_metadata.yaml @@ -0,0 +1,181 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:58.150429' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nocrypt +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- aws +- multipath +- iscsi +- nvme +- gardener +- _unsigned +- _usi +paths: +- md5sum: 187fe8fd4f991100f96e76ae6f2700bf + name: aws-gardener_prod_usi-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 089289d072a918947ca9f0df0461030d + name: aws-gardener_prod_usi-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: ad21bd9a9428b3e31ccfc62547e8de5c + name: aws-gardener_prod_usi-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 8609daf69fcdd9fb9d2fb237634d04c3 + name: aws-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: bf5a05f8878a8de8652484793b78e3f5 + name: aws-gardener_prod_usi-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: f9ffa5382525f470b1552030061c1e56 + name: aws-gardener_prod_usi-arm64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: b830015c7dce9d9c64047e11cd458c19 + name: aws-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 2e75ca5c271e8b0a3581cbc3a43e8685 + name: aws-gardener_prod_usi-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 8243543bb4ed8d495662ef218aed9d9b + name: aws-gardener_prod_usi-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 3c9e039165cce4654b361767764835f8 + name: aws-gardener_prod_usi-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: b830015c7dce9d9c64047e11cd458c19 + name: aws-gardener_prod_usi-arm64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: ad21bd9a9428b3e31ccfc62547e8de5c + name: aws-gardener_prod_usi-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: ad21bd9a9428b3e31ccfc62547e8de5c + name: aws-gardener_prod_usi-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: ad21bd9a9428b3e31ccfc62547e8de5c + name: aws-gardener_prod_usi-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/aws-gardener_prod_usi-arm64-1877.3-75df9f40/aws-gardener_prod_usi-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +platform: aws +published_image_metadata: + published_aws_images: + - ami_id: ami-029f2b705d69f9d50 + aws_region_id: ap-south-1 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-0b1a9e403ea563206 + aws_region_id: eu-north-1 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-067465814788be84a + aws_region_id: eu-west-3 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-092d7cf152ef6df29 + aws_region_id: eu-south-1 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-0441298c8ae55a62b + aws_region_id: eu-west-2 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-012e58abe02f904c1 + aws_region_id: eu-west-1 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-08c18c5f1aa7e9fba + aws_region_id: ap-northeast-3 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-0277ca365657bd9c2 + aws_region_id: ap-northeast-2 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-006a3f35202f6edd4 + aws_region_id: ap-northeast-1 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-0aa9e8af8c777e400 + aws_region_id: me-central-1 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-0f8225fd2d6009961 + aws_region_id: ca-central-1 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-0e945c537aef91eff + aws_region_id: sa-east-1 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-0f30b29a4428f7cea + aws_region_id: ap-southeast-1 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-0129e3a207e3e6f9d + aws_region_id: ap-southeast-2 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-0cc9f69e3a7594e7b + aws_region_id: us-east-1 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-046243dad95d56f2a + aws_region_id: us-east-2 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-03ae03953c81a43c1 + aws_region_id: us-west-1 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-0cbe1dbfeda64dc9b + aws_region_id: us-west-2 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-0dd2780bfcddbda6b + aws_region_id: eu-central-1 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-0d993477d25affb3c + aws_region_id: cn-north-1 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 + - ami_id: ami-0a7fe5959bb23fab8 + aws_region_id: cn-northwest-1 + image_name: gardenlinux-aws-gardener_prod_usi-arm64-1877.3-75df9f40 +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/aws-gardener_prod_usi-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod-amd64.s3_metadata.yaml new file mode 100644 index 00000000..2578fee6 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod-amd64.s3_metadata.yaml @@ -0,0 +1,105 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:51.276497' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- azure +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: aa7fb82f169642e3203e209a8c22f3a2 + name: azure-gardener_prod-amd64-1877.3-75df9f40.vhd + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-amd64-1877.3-75df9f40/azure-gardener_prod-amd64-1877.3-75df9f40.vhd + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vhd +- md5sum: ffc6fbddd820f72cffa99d0e51df319c + name: azure-gardener_prod-amd64-1877.3-75df9f40.vhd.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-amd64-1877.3-75df9f40/azure-gardener_prod-amd64-1877.3-75df9f40.vhd.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vhd.log +- md5sum: 6ee682a084a95a297b95de772641c0bb + name: azure-gardener_prod-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-amd64-1877.3-75df9f40/azure-gardener_prod-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: azure-gardener_prod-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-amd64-1877.3-75df9f40/azure-gardener_prod-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 3ccf288ea0e8b4eee48f5f6e7dd3bd24 + name: azure-gardener_prod-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-amd64-1877.3-75df9f40/azure-gardener_prod-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 6ee682a084a95a297b95de772641c0bb + name: azure-gardener_prod-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-amd64-1877.3-75df9f40/azure-gardener_prod-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 6ee682a084a95a297b95de772641c0bb + name: azure-gardener_prod-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-amd64-1877.3-75df9f40/azure-gardener_prod-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: ef443c543f2403a9f51d1f25db29cf87 + name: azure-gardener_prod-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-amd64-1877.3-75df9f40/azure-gardener_prod-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 6ee682a084a95a297b95de772641c0bb + name: azure-gardener_prod-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-amd64-1877.3-75df9f40/azure-gardener_prod-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: d850caf510208fdad4ad1f3322267c0d + name: azure-gardener_prod-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-amd64-1877.3-75df9f40/azure-gardener_prod-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +platform: azure +published_image_metadata: + published_gallery_images: + - azure_cloud: public + community_gallery_image_id: /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme/Versions/1877.3.0 + hyper_v_generation: V1 + - azure_cloud: public + community_gallery_image_id: /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-gen2/Versions/1877.3.0 + hyper_v_generation: V2 + - azure_cloud: china + community_gallery_image_id: /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme/Versions/1877.3.0 + hyper_v_generation: V1 + - azure_cloud: china + community_gallery_image_id: /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-gen2/Versions/1877.3.0 + hyper_v_generation: V2 + published_marketplace_images: [] +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/azure-gardener_prod-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod-arm64.s3_metadata.yaml new file mode 100644 index 00000000..0bd048a7 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod-arm64.s3_metadata.yaml @@ -0,0 +1,111 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:50.680060' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- azure +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: db8b19519602dff6e90e70b3218df402 + name: azure-gardener_prod-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-arm64-1877.3-75df9f40/azure-gardener_prod-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: ebe40d9d33607ccbd9991a2e31237644 + name: azure-gardener_prod-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-arm64-1877.3-75df9f40/azure-gardener_prod-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: db8b19519602dff6e90e70b3218df402 + name: azure-gardener_prod-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-arm64-1877.3-75df9f40/azure-gardener_prod-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 73c435a64c5b0b74b4cecd116e7cce72 + name: azure-gardener_prod-arm64-1877.3-75df9f40.vhd + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-arm64-1877.3-75df9f40/azure-gardener_prod-arm64-1877.3-75df9f40.vhd + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vhd +- md5sum: 15dbc2f26f955c2a8b76005dd3f769be + name: azure-gardener_prod-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-arm64-1877.3-75df9f40/azure-gardener_prod-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: db8b19519602dff6e90e70b3218df402 + name: azure-gardener_prod-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-arm64-1877.3-75df9f40/azure-gardener_prod-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 2087746ea0eef1549e932dd61ad20e95 + name: azure-gardener_prod-arm64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-arm64-1877.3-75df9f40/azure-gardener_prod-arm64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: ecf7b0a58adfe60221d31a58c9ddaff2 + name: azure-gardener_prod-arm64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-arm64-1877.3-75df9f40/azure-gardener_prod-arm64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: ac77d4436920de38c349d077173a206d + name: azure-gardener_prod-arm64-1877.3-75df9f40.vhd.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-arm64-1877.3-75df9f40/azure-gardener_prod-arm64-1877.3-75df9f40.vhd.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vhd.log +- md5sum: ea84bb52f96641cc2db009db1aef532d + name: azure-gardener_prod-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-arm64-1877.3-75df9f40/azure-gardener_prod-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: db8b19519602dff6e90e70b3218df402 + name: azure-gardener_prod-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-arm64-1877.3-75df9f40/azure-gardener_prod-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 7ded488368b7618ea17829ad2f96ff30 + name: azure-gardener_prod-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod-arm64-1877.3-75df9f40/azure-gardener_prod-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +platform: azure +published_image_metadata: + published_gallery_images: + - azure_cloud: public + community_gallery_image_id: /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-arm64-gen2/Versions/1877.3.0 + hyper_v_generation: V2 + - azure_cloud: china + community_gallery_image_id: /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-arm64-gen2/Versions/1877.3.0 + hyper_v_generation: V2 + published_marketplace_images: [] +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/azure-gardener_prod-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml new file mode 100644 index 00000000..016be01c --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml @@ -0,0 +1,227 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:59.810039' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- azure +- multipath +- iscsi +- nvme +- gardener +- _tpm2 +- _usi +- _trustedboot +paths: +- md5sum: 866015eea9749a3b01b07bf385706676 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.der +- md5sum: 6d3020bcb75e4a661db1cb1e6ed83cce + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: b2df3c7e524d051a1be3e6c0bc349793 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 55b26949aaeb59e9699cebc4bbdcca3e + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.conf +- md5sum: 547e38ec3274c5adf6e0c78ee72505f5 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: deb3e30bbbd0bc8b11b41fde73eef3dc + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.conf +- md5sum: 00c6a209a251e559c491dc747eaef1bd + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.crt +- md5sum: 52a08859dd78bc3ec1d971e6e3896213 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.auth +- md5sum: 5c91310d4bf4ebfdc051c7288c64bab8 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: b2df3c7e524d051a1be3e6c0bc349793 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: f4dfe8a5dd7c912408fa59f761e8840b + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: efbfb9e901b471eb89dde1c6d67987cc + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.vhd + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.vhd + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vhd +- md5sum: b2df3c7e524d051a1be3e6c0bc349793 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: a8b1b6f0e2e5da79a0d6522687ad280b + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 348fb01f1cc9afbd3cca229cbcc23fdb + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: d00a88a05460802c94211cdd7e8cc8e5 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.der +- md5sum: 94494df8e01481b52238a09206e0e3a2 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.crt +- md5sum: 612866ba48ed46be46c85ed4aafd2eba + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 161533e510d46c68dce2360c3bb7e218 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: 79ffa1228382c7c5d7adf3578a209bd0 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.aws-efivars + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.aws-efivars + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.aws-efivars +- md5sum: d41d8cd98f00b204e9800998ecf8427e + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.arn + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.arn + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.arn +- md5sum: 32d06b0baf4e3027766ee19f0722ff40 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.null.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.null.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.null.pk.auth +- md5sum: 03d78f357e62eb5051bd5e04a69dc805 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.conf +- md5sum: 1f56d722f2f282aabd261b4851bf3871 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: c186ed1f06ea27eb516e3db49cfee700 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.der +- md5sum: 71cd1e0927785984303bf045d06d5a00 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.auth +- md5sum: dd083fb6e5161375ebbdd09be72046be + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.auth +- md5sum: b2df3c7e524d051a1be3e6c0bc349793 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 584a012ef9425f81a2f0deb63e393235 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.vhd.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.vhd.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vhd.log +- md5sum: 348fb01f1cc9afbd3cca229cbcc23fdb + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: 4474c294b76e3f65574a013f6f8e89b1 + name: azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.crt +platform: azure +published_image_metadata: + published_gallery_images: + - azure_cloud: public + community_gallery_image_id: /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-gen2-usi-secureboot/Versions/1877.3.0 + hyper_v_generation: V2 + - azure_cloud: china + community_gallery_image_id: /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-gen2-usi-secureboot/Versions/1877.3.0 + hyper_v_generation: V2 + published_marketplace_images: [] +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/azure-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 +secureboot: true +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml new file mode 100644 index 00000000..bef6f893 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml @@ -0,0 +1,227 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:32.005497' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- azure +- multipath +- iscsi +- nvme +- gardener +- _tpm2 +- _usi +- _trustedboot +paths: +- md5sum: 35971b178dce3a2df0b569dbcdd74814 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: 64f4582f19902eaf85d33a4fae85dc4a + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: dd083fb6e5161375ebbdd09be72046be + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.auth +- md5sum: 71cd1e0927785984303bf045d06d5a00 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.auth +- md5sum: d00a88a05460802c94211cdd7e8cc8e5 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.der +- md5sum: 18aa7019ca44d54fb791b253d9ac52be + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.vhd.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.vhd.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vhd.log +- md5sum: 35971b178dce3a2df0b569dbcdd74814 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: deb3e30bbbd0bc8b11b41fde73eef3dc + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.conf +- md5sum: d41d8cd98f00b204e9800998ecf8427e + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.arn + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.arn + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.arn +- md5sum: 79ffa1228382c7c5d7adf3578a209bd0 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.aws-efivars + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.aws-efivars + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.aws-efivars +- md5sum: b0c40c161050025a8a9383b2f5cc9013 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: 64f4582f19902eaf85d33a4fae85dc4a + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 866015eea9749a3b01b07bf385706676 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.der +- md5sum: 00c6a209a251e559c491dc747eaef1bd + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.crt +- md5sum: c186ed1f06ea27eb516e3db49cfee700 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.der +- md5sum: 52a08859dd78bc3ec1d971e6e3896213 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.auth +- md5sum: 632b0541a3c185ca584067d4ee2314a8 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 8c0534751f3fb0998157e9c6a3d810b5 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 64f4582f19902eaf85d33a4fae85dc4a + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: e4d493a5048426ba1472861560f47338 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.vhd + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.vhd + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vhd +- md5sum: 94494df8e01481b52238a09206e0e3a2 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.crt +- md5sum: 03d78f357e62eb5051bd5e04a69dc805 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.conf +- md5sum: b40728f89d28b6581b506b3f0cf01e6b + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 32d06b0baf4e3027766ee19f0722ff40 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.null.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.null.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.null.pk.auth +- md5sum: 592a7621dc5788f94bc365b4b29c072f + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 8a5567a95b1ad692aadf5f595706f312 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 4474c294b76e3f65574a013f6f8e89b1 + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.crt +- md5sum: 55b26949aaeb59e9699cebc4bbdcca3e + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.conf +- md5sum: 58eec0a875c8d55c0a3cd4c736ce39ac + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 4edeed2585378c930b546c65d322d3fa + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: 64f4582f19902eaf85d33a4fae85dc4a + name: azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +platform: azure +published_image_metadata: + published_gallery_images: + - azure_cloud: public + community_gallery_image_id: /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-arm64-gen2-usi-secureboot/Versions/1877.3.0 + hyper_v_generation: V2 + - azure_cloud: china + community_gallery_image_id: /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-arm64-gen2-usi-secureboot/Versions/1877.3.0 + hyper_v_generation: V2 + published_marketplace_images: [] +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/azure-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 +secureboot: true +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_usi-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_usi-amd64.s3_metadata.yaml new file mode 100644 index 00000000..c093e6a8 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_usi-amd64.s3_metadata.yaml @@ -0,0 +1,137 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:59.470262' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nocrypt +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- azure +- multipath +- iscsi +- nvme +- gardener +- _unsigned +- _usi +paths: +- md5sum: 28ce5927bb5e59290300190a30167ee3 + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: a490b4c4d83c12ccfb99493bb014c122 + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 6d3020bcb75e4a661db1cb1e6ed83cce + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 3f19526793bf12a3fec2450a4a218db0 + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: ae1fe0da020259a1a0598f18360dcc79 + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: 18ae9fcf9be3a0c68567faa67a54811b + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: 0196b72482e09cfe947737b0831833ea + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 0196b72482e09cfe947737b0831833ea + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 0196b72482e09cfe947737b0831833ea + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: defc405a2b0ef5f42a6085d97e456095 + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.vhd + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.vhd + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vhd +- md5sum: 5688fdd71c4317765aede55fab9f57e9 + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.vhd.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.vhd.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vhd.log +- md5sum: 8e339d4e2db27ba17f76b95e7cebc9b9 + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 0196b72482e09cfe947737b0831833ea + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: f54b543318ffb87c8144821ae0369ebc + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: a281bcfeab9b852fa640a0dc89925135 + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: ae1fe0da020259a1a0598f18360dcc79 + name: azure-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-amd64-1877.3-75df9f40/azure-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +platform: azure +published_image_metadata: + published_gallery_images: + - azure_cloud: public + community_gallery_image_id: /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-gen2-usi/Versions/1877.3.0 + hyper_v_generation: V2 + - azure_cloud: china + community_gallery_image_id: /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-gen2-usi/Versions/1877.3.0 + hyper_v_generation: V2 + published_marketplace_images: [] +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/azure-gardener_prod_usi-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_usi-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_usi-arm64.s3_metadata.yaml new file mode 100644 index 00000000..eb877bd0 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/azure-gardener_prod_usi-arm64.s3_metadata.yaml @@ -0,0 +1,149 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:38.898139' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nocrypt +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- azure +- multipath +- iscsi +- nvme +- gardener +- _unsigned +- _usi +paths: +- md5sum: aca092887336c9d7e3cf1b3241286ca4 + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 889d02738f5d4bf55bb445c6024e410d + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 95a82961df9dc2ac2655ae91a1e655c2 + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: 889d02738f5d4bf55bb445c6024e410d + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 2e75ca5c271e8b0a3581cbc3a43e8685 + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 96a83797df1371396633d406ca04dd7d + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 96a83797df1371396633d406ca04dd7d + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: 889d02738f5d4bf55bb445c6024e410d + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 58eec0a875c8d55c0a3cd4c736ce39ac + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 43c96e37776dd3c267922c50c11ca1f8 + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 889d02738f5d4bf55bb445c6024e410d + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 7e5479c3747cf1713e295c16fafc76f8 + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 2ca35638b2dec1c9518290ef7b43f5ec + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: cd68658b26ecf843686518c049f8391d + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.vhd.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.vhd.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vhd.log +- md5sum: 4d34300f68afe452acc9c1cb394330e6 + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: 88b56ce5309de6d5ab3ee0f99013d34a + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: 7427baeb7d874a6fd45241019fff9b5c + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: a3dc665ee70a611e5e5376b93d587808 + name: azure-gardener_prod_usi-arm64-1877.3-75df9f40.vhd + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/azure-gardener_prod_usi-arm64-1877.3-75df9f40/azure-gardener_prod_usi-arm64-1877.3-75df9f40.vhd + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vhd +platform: azure +published_image_metadata: + published_gallery_images: + - azure_cloud: public + community_gallery_image_id: /CommunityGalleries/gardenlinux-13e998fe-534d-4b0a-8a27-f16a73aef620/Images/gardenlinux-nvme-arm64-gen2-usi/Versions/1877.3.0 + hyper_v_generation: V2 + - azure_cloud: china + community_gallery_image_id: /CommunityGalleries/gardenlinux-8e6518fb-9ae0-4f66-abfd-9a06997e2492/Images/gardenlinux-nvme-arm64-gen2-usi/Versions/1877.3.0 + hyper_v_generation: V2 + published_marketplace_images: [] +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/azure-gardener_prod_usi-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/container-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/container-amd64.s3_metadata.yaml new file mode 100644 index 00000000..a10af111 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/container-amd64.s3_metadata.yaml @@ -0,0 +1,91 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:42.317474' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- _slim +- base +- container +paths: +- md5sum: 8e4ee6a504aa9ce452dac12073961ce8 + name: container-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-amd64-1877.3-75df9f40/container-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 8e4ee6a504aa9ce452dac12073961ce8 + name: container-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-amd64-1877.3-75df9f40/container-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 8e4ee6a504aa9ce452dac12073961ce8 + name: container-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-amd64-1877.3-75df9f40/container-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 8f487029575e920bc99d007c9e3cbefc + name: container-amd64-1877.3-75df9f40.oci + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-amd64-1877.3-75df9f40/container-amd64-1877.3-75df9f40.oci + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .oci +- md5sum: b021f9179ac07ad8c377ced543e658d2 + name: container-amd64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-amd64-1877.3-75df9f40/container-amd64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: 490837be70b14a43e4ee39aaee00f63d + name: container-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-amd64-1877.3-75df9f40/container-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 8e4ee6a504aa9ce452dac12073961ce8 + name: container-amd64-1877.3-75df9f40.oci.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-amd64-1877.3-75df9f40/container-amd64-1877.3-75df9f40.oci.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .oci.log +- md5sum: c2ba014b03ebc0b84d67f48caf440dcc + name: container-amd64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-amd64-1877.3-75df9f40/container-amd64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: 230d47a057967dfb38bb4d214cc3cffa + name: container-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-amd64-1877.3-75df9f40/container-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: eb142022f761e9f7f2ba2768fb653e6e + name: container-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-amd64-1877.3-75df9f40/container-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 8e4ee6a504aa9ce452dac12073961ce8 + name: container-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-amd64-1877.3-75df9f40/container-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: container-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-amd64-1877.3-75df9f40/container-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +platform: container +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/container-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/container-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/container-arm64.s3_metadata.yaml new file mode 100644 index 00000000..0d681e21 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/container-arm64.s3_metadata.yaml @@ -0,0 +1,91 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:43.552027' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- _slim +- base +- container +paths: +- md5sum: dda0cefff5025e1218e2b6907fcba82d + name: container-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-arm64-1877.3-75df9f40/container-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 7a358c7e8b8d1d8b11c7ec174e3379c5 + name: container-arm64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-arm64-1877.3-75df9f40/container-arm64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: 02e6eb8964615af9652e5d6d20e442d1 + name: container-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-arm64-1877.3-75df9f40/container-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 1f404338302d063d30bf3324618341f9 + name: container-arm64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-arm64-1877.3-75df9f40/container-arm64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: dda0cefff5025e1218e2b6907fcba82d + name: container-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-arm64-1877.3-75df9f40/container-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: dda0cefff5025e1218e2b6907fcba82d + name: container-arm64-1877.3-75df9f40.oci.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-arm64-1877.3-75df9f40/container-arm64-1877.3-75df9f40.oci.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .oci.log +- md5sum: df4b835d7ff84350eaaa9532455f9259 + name: container-arm64-1877.3-75df9f40.oci + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-arm64-1877.3-75df9f40/container-arm64-1877.3-75df9f40.oci + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .oci +- md5sum: dda0cefff5025e1218e2b6907fcba82d + name: container-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-arm64-1877.3-75df9f40/container-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: dda0cefff5025e1218e2b6907fcba82d + name: container-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-arm64-1877.3-75df9f40/container-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: ebe40d9d33607ccbd9991a2e31237644 + name: container-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-arm64-1877.3-75df9f40/container-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 9c05146a504955c43115850f59b4cd04 + name: container-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-arm64-1877.3-75df9f40/container-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 945bb16fdfaf1967558d244513799ac5 + name: container-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/container-arm64-1877.3-75df9f40/container-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +platform: container +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/container-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod-amd64.s3_metadata.yaml new file mode 100644 index 00000000..cd887bb8 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod-amd64.s3_metadata.yaml @@ -0,0 +1,105 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:55.741364' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- gcp +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: 0c1380758e04bb5d28d68a59ef97ab72 + name: gcp-gardener_prod-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-amd64-1877.3-75df9f40/gcp-gardener_prod-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 818b8148c8ea894e6fdfd6e99c6cc115 + name: gcp-gardener_prod-amd64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-amd64-1877.3-75df9f40/gcp-gardener_prod-amd64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: cf5e48822365453858f6b955b09dd824 + name: gcp-gardener_prod-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-amd64-1877.3-75df9f40/gcp-gardener_prod-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 2eef3298fdf1e9f01b930f185ac5434b + name: gcp-gardener_prod-amd64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-amd64-1877.3-75df9f40/gcp-gardener_prod-amd64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: b4b187d6af4d661cb3e1754a4ce7a894 + name: gcp-gardener_prod-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-amd64-1877.3-75df9f40/gcp-gardener_prod-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 5c7ba29d0cd14677f261b2c88a0baefb + name: gcp-gardener_prod-amd64-1877.3-75df9f40.gcpimage.tar.gz.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-amd64-1877.3-75df9f40/gcp-gardener_prod-amd64-1877.3-75df9f40.gcpimage.tar.gz.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz.log +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: gcp-gardener_prod-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-amd64-1877.3-75df9f40/gcp-gardener_prod-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 03eab411581bba162d7bf60727841d4d + name: gcp-gardener_prod-amd64-1877.3-75df9f40.gcpimage.tar.gz + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-amd64-1877.3-75df9f40/gcp-gardener_prod-amd64-1877.3-75df9f40.gcpimage.tar.gz + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz +- md5sum: 0c1380758e04bb5d28d68a59ef97ab72 + name: gcp-gardener_prod-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-amd64-1877.3-75df9f40/gcp-gardener_prod-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 0c1380758e04bb5d28d68a59ef97ab72 + name: gcp-gardener_prod-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-amd64-1877.3-75df9f40/gcp-gardener_prod-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: d6c28c83701b5f377e2e422d068c9f6d + name: gcp-gardener_prod-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-amd64-1877.3-75df9f40/gcp-gardener_prod-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 0c1380758e04bb5d28d68a59ef97ab72 + name: gcp-gardener_prod-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-amd64-1877.3-75df9f40/gcp-gardener_prod-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +platform: gcp +published_image_metadata: + gcp_image_name: gardenlinux-gcp-ff804026cbe7b5f2d6f729e4-1877-3-75df9f40 + gcp_project_name: sap-se-gcp-gardenlinux +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/gcp-gardener_prod-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod-arm64.s3_metadata.yaml new file mode 100644 index 00000000..48d219f6 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod-arm64.s3_metadata.yaml @@ -0,0 +1,93 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:16.095433' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- gcp +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: 2f7f1c032514c3c08cf4c7ddf58627ea + name: gcp-gardener_prod-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-arm64-1877.3-75df9f40/gcp-gardener_prod-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: bfa3337fe11b2acb9babf0d3e07fb005 + name: gcp-gardener_prod-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-arm64-1877.3-75df9f40/gcp-gardener_prod-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 9de3c63b4dd02a6e166532d9dce72487 + name: gcp-gardener_prod-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-arm64-1877.3-75df9f40/gcp-gardener_prod-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 9de3c63b4dd02a6e166532d9dce72487 + name: gcp-gardener_prod-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-arm64-1877.3-75df9f40/gcp-gardener_prod-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: f367d1f5a411d5e3b02a521a39a3556a + name: gcp-gardener_prod-arm64-1877.3-75df9f40.gcpimage.tar.gz.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-arm64-1877.3-75df9f40/gcp-gardener_prod-arm64-1877.3-75df9f40.gcpimage.tar.gz.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz.log +- md5sum: ebe40d9d33607ccbd9991a2e31237644 + name: gcp-gardener_prod-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-arm64-1877.3-75df9f40/gcp-gardener_prod-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 9de3c63b4dd02a6e166532d9dce72487 + name: gcp-gardener_prod-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-arm64-1877.3-75df9f40/gcp-gardener_prod-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 8f68608cba980227ce416868f3c1ca06 + name: gcp-gardener_prod-arm64-1877.3-75df9f40.gcpimage.tar.gz + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-arm64-1877.3-75df9f40/gcp-gardener_prod-arm64-1877.3-75df9f40.gcpimage.tar.gz + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz +- md5sum: 9de3c63b4dd02a6e166532d9dce72487 + name: gcp-gardener_prod-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-arm64-1877.3-75df9f40/gcp-gardener_prod-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 3c7b1e1eb9c25e7cd8e304b32e464dc2 + name: gcp-gardener_prod-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod-arm64-1877.3-75df9f40/gcp-gardener_prod-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +platform: gcp +published_image_metadata: + gcp_image_name: gardenlinux-gcp-c8504d3c3e67cf2fc7c3408c-1877-3-75df9f40 + gcp_project_name: sap-se-gcp-gardenlinux +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/gcp-gardener_prod-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml new file mode 100644 index 00000000..baa8d6ba --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml @@ -0,0 +1,233 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:40.646191' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- gcp +- multipath +- iscsi +- nvme +- gardener +- _tpm2 +- _usi +- _trustedboot +paths: +- md5sum: ba37a1d2773bdbc8e9d7aebb94d3b59b + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: d86a4370f351d9b71c652b409b204254 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 55b26949aaeb59e9699cebc4bbdcca3e + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.conf +- md5sum: e7ad8774649d057197b2230e14434885 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: d86a4370f351d9b71c652b409b204254 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.gcpimage.tar.gz.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.gcpimage.tar.gz.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz.log +- md5sum: 79ffa1228382c7c5d7adf3578a209bd0 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.aws-efivars + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.aws-efivars + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.aws-efivars +- md5sum: deb3e30bbbd0bc8b11b41fde73eef3dc + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.conf +- md5sum: 1b5e1cb570e94a03f0850743d2a370e5 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 1b5e1cb570e94a03f0850743d2a370e5 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 03d78f357e62eb5051bd5e04a69dc805 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.conf +- md5sum: d41d8cd98f00b204e9800998ecf8427e + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.arn + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.arn + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.arn +- md5sum: fbc72aae422d96c75f75c79448de5c43 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.gcpimage.tar.gz + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.gcpimage.tar.gz + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz +- md5sum: cd83834ee317da43cdb433afbbaf342d + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: 00c6a209a251e559c491dc747eaef1bd + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.crt +- md5sum: 8a0cedc292b826d5380089a10de1513f + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 71cd1e0927785984303bf045d06d5a00 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.auth +- md5sum: 8e5ff70911ccf86a270f2df8df437fb9 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: 827e26a3694eba7901d0a3308c4afc3b + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: 32d06b0baf4e3027766ee19f0722ff40 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.null.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.null.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.null.pk.auth +- md5sum: f4dfe8a5dd7c912408fa59f761e8840b + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 1b5e1cb570e94a03f0850743d2a370e5 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 866015eea9749a3b01b07bf385706676 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.der +- md5sum: 52a08859dd78bc3ec1d971e6e3896213 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.auth +- md5sum: 4474c294b76e3f65574a013f6f8e89b1 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.crt +- md5sum: 09a7ce267143459536cb1f17f4774c04 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: 94494df8e01481b52238a09206e0e3a2 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.crt +- md5sum: d00a88a05460802c94211cdd7e8cc8e5 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.der +- md5sum: c186ed1f06ea27eb516e3db49cfee700 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.der +- md5sum: 35b97420a1f743c4444cd15fa52c7e1e + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 3b2028168a2fa5232cbf549a84acf3f1 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: dd083fb6e5161375ebbdd09be72046be + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.auth +- md5sum: 1b5e1cb570e94a03f0850743d2a370e5 + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: ba37a1d2773bdbc8e9d7aebb94d3b59b + name: gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +platform: gcp +published_image_metadata: + gcp_image_name: gardenlinux-gcp-b4636aa3660a8d166531aab9-1877-3-75df9f40 + gcp_project_name: sap-se-gcp-gardenlinux +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/gcp-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 +secureboot: true +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml new file mode 100644 index 00000000..3449d965 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml @@ -0,0 +1,221 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:01.728362' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- gcp +- multipath +- iscsi +- nvme +- gardener +- _tpm2 +- _usi +- _trustedboot +paths: +- md5sum: a5f9c71cdd14db0e4efef97851c98bcb + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 4132be06e536de0e958dda7ed9a3bac1 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: 03d78f357e62eb5051bd5e04a69dc805 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.conf +- md5sum: e52f74ddf5851bc56537229f80541bc1 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 55b26949aaeb59e9699cebc4bbdcca3e + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.conf +- md5sum: deb3e30bbbd0bc8b11b41fde73eef3dc + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.conf +- md5sum: 4474c294b76e3f65574a013f6f8e89b1 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.crt +- md5sum: 94494df8e01481b52238a09206e0e3a2 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.crt +- md5sum: 52014733a0821d2d584131ecc6d117e4 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 52014733a0821d2d584131ecc6d117e4 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: d41d8cd98f00b204e9800998ecf8427e + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.arn + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.arn + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.arn +- md5sum: 8c0534751f3fb0998157e9c6a3d810b5 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 32d06b0baf4e3027766ee19f0722ff40 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.null.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.null.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.null.pk.auth +- md5sum: 35c92dfbafb23ad67f68111466a34a1c + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.gcpimage.tar.gz + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.gcpimage.tar.gz + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz +- md5sum: 6779d52e4583320a98acbe3f5c72ad2c + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 00780d672baa7e3164555e9e48280969 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: 71cd1e0927785984303bf045d06d5a00 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.auth +- md5sum: d00a88a05460802c94211cdd7e8cc8e5 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.der +- md5sum: ae6afa6c54ea1c705c31e40bb54ce925 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 00c6a209a251e559c491dc747eaef1bd + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.crt +- md5sum: a5f9c71cdd14db0e4efef97851c98bcb + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: a49b47c8d335f1d0961e7fbfd27539bb + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 52014733a0821d2d584131ecc6d117e4 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 52014733a0821d2d584131ecc6d117e4 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 866015eea9749a3b01b07bf385706676 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.der +- md5sum: 79ffa1228382c7c5d7adf3578a209bd0 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.aws-efivars + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.aws-efivars + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.aws-efivars +- md5sum: e52f74ddf5851bc56537229f80541bc1 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.gcpimage.tar.gz.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.gcpimage.tar.gz.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz.log +- md5sum: c186ed1f06ea27eb516e3db49cfee700 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.der +- md5sum: 52a08859dd78bc3ec1d971e6e3896213 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.auth +- md5sum: dd083fb6e5161375ebbdd09be72046be + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.auth +- md5sum: 9cdae82667669b89416564f20ef55385 + name: gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +platform: gcp +published_image_metadata: + gcp_image_name: gardenlinux-gcp-63fd9d7dd465420fd4e499ab-1877-3-75df9f40 + gcp_project_name: sap-se-gcp-gardenlinux +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/gcp-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 +secureboot: true +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_usi-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_usi-amd64.s3_metadata.yaml new file mode 100644 index 00000000..fc81c313 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_usi-amd64.s3_metadata.yaml @@ -0,0 +1,131 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:58.408180' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nocrypt +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- gcp +- multipath +- iscsi +- nvme +- gardener +- _unsigned +- _usi +paths: +- md5sum: cb09648e0e1421f2fd2261c2c066f7ec + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 4e76b47fca7d6012a009d6d67336ca2e + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: ae4baf8f51980fc4bf33fdec039caaac + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: 8d81de64a908f10b5f2319c5ee3e6e33 + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.gcpimage.tar.gz + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.gcpimage.tar.gz + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz +- md5sum: ddae4e9dbb1589ed52c09dc0053e7d16 + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: 4e76b47fca7d6012a009d6d67336ca2e + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: cb09648e0e1421f2fd2261c2c066f7ec + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: a2fe91c463595db6b0e9b94e9bf2d0c2 + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: f41174f3a7a59886a037af08647ed606 + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: a2fe91c463595db6b0e9b94e9bf2d0c2 + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.gcpimage.tar.gz.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.gcpimage.tar.gz.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz.log +- md5sum: ec2b76785fb3271509464840bb67b451 + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 4e76b47fca7d6012a009d6d67336ca2e + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: b4973d065a9283b7edc96e4de5850af0 + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 4e76b47fca7d6012a009d6d67336ca2e + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 28ce5927bb5e59290300190a30167ee3 + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 35b97420a1f743c4444cd15fa52c7e1e + name: gcp-gardener_prod_usi-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-amd64-1877.3-75df9f40/gcp-gardener_prod_usi-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +platform: gcp +published_image_metadata: + gcp_image_name: gardenlinux-gcp-51db8a4be084c3b640095f4b-1877-3-75df9f40 + gcp_project_name: sap-se-gcp-gardenlinux +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/gcp-gardener_prod_usi-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_usi-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_usi-arm64.s3_metadata.yaml new file mode 100644 index 00000000..5bb6a3a5 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/gcp-gardener_prod_usi-arm64.s3_metadata.yaml @@ -0,0 +1,131 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:31.156975' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nocrypt +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- gcp +- multipath +- iscsi +- nvme +- gardener +- _unsigned +- _usi +paths: +- md5sum: 199be170b7a7130e964a9df1993a5bb8 + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 199be170b7a7130e964a9df1993a5bb8 + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 56c217b6ade8a40e6bde606eb9d408fd + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 1f903a4dfaec9eaf11b965f2863503c7 + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 199be170b7a7130e964a9df1993a5bb8 + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: a5f05ba150406b82c95cead3142c4373 + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.gcpimage.tar.gz + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.gcpimage.tar.gz + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz +- md5sum: 199be170b7a7130e964a9df1993a5bb8 + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 2e75ca5c271e8b0a3581cbc3a43e8685 + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: aaff26c49fee59d77af152889beb8a27 + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: f50cc9e27fbfd8ce331a405e19f94fdc + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.gcpimage.tar.gz.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.gcpimage.tar.gz.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz.log +- md5sum: 1f903a4dfaec9eaf11b965f2863503c7 + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: f50add2ada4aaa7fc51b17dc3978d00c + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: f50cc9e27fbfd8ce331a405e19f94fdc + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: a94527b2e8dd19a2518b88025cba7207 + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 1f487053debf1b383e0499940d5b9e85 + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: ae6afa6c54ea1c705c31e40bb54ce925 + name: gcp-gardener_prod_usi-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gcp-gardener_prod_usi-arm64-1877.3-75df9f40/gcp-gardener_prod_usi-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +platform: gcp +published_image_metadata: + gcp_image_name: gardenlinux-gcp-c00f1e20ffeed4d8b80a76b9-1877-3-75df9f40 + gcp_project_name: sap-se-gcp-gardenlinux +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/gcp-gardener_prod_usi-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/gdch-gardener_prod-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/gdch-gardener_prod-amd64.s3_metadata.yaml new file mode 100644 index 00000000..63b88a03 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/gdch-gardener_prod-amd64.s3_metadata.yaml @@ -0,0 +1,91 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:57.116500' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- gdch +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: 84156c6e6b4f41ff32b3b7777ced804d + name: gdch-gardener_prod-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-amd64-1877.3-75df9f40/gdch-gardener_prod-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: be2aed9b412affcfc4e57d33538e1512 + name: gdch-gardener_prod-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-amd64-1877.3-75df9f40/gdch-gardener_prod-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 84156c6e6b4f41ff32b3b7777ced804d + name: gdch-gardener_prod-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-amd64-1877.3-75df9f40/gdch-gardener_prod-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 4a12425f7755b3b1ed4800116ad4f14b + name: gdch-gardener_prod-amd64-1877.3-75df9f40.gcpimage.tar.gz.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-amd64-1877.3-75df9f40/gdch-gardener_prod-amd64-1877.3-75df9f40.gcpimage.tar.gz.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz.log +- md5sum: 2093de29ce392701214b88c249d187f2 + name: gdch-gardener_prod-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-amd64-1877.3-75df9f40/gdch-gardener_prod-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 84156c6e6b4f41ff32b3b7777ced804d + name: gdch-gardener_prod-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-amd64-1877.3-75df9f40/gdch-gardener_prod-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 84156c6e6b4f41ff32b3b7777ced804d + name: gdch-gardener_prod-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-amd64-1877.3-75df9f40/gdch-gardener_prod-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: gdch-gardener_prod-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-amd64-1877.3-75df9f40/gdch-gardener_prod-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 15a03ca5802626c9b39ea3ecd0f48b17 + name: gdch-gardener_prod-amd64-1877.3-75df9f40.gcpimage.tar.gz + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-amd64-1877.3-75df9f40/gdch-gardener_prod-amd64-1877.3-75df9f40.gcpimage.tar.gz + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz +- md5sum: 14d6befc6e0c9a0dbd605d097b68b495 + name: gdch-gardener_prod-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-amd64-1877.3-75df9f40/gdch-gardener_prod-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +platform: gdch +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/gdch-gardener_prod-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/gdch-gardener_prod-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/gdch-gardener_prod-arm64.s3_metadata.yaml new file mode 100644 index 00000000..4db93ea9 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/gdch-gardener_prod-arm64.s3_metadata.yaml @@ -0,0 +1,103 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:51.225611' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- gdch +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: f81fc4d04baf714fc985f4433035af1a + name: gdch-gardener_prod-arm64-1877.3-75df9f40.gcpimage.tar.gz.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-arm64-1877.3-75df9f40/gdch-gardener_prod-arm64-1877.3-75df9f40.gcpimage.tar.gz.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz.log +- md5sum: f218ce6b12123207ba537151eeabc7b2 + name: gdch-gardener_prod-arm64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-arm64-1877.3-75df9f40/gdch-gardener_prod-arm64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: cc726c0c4ce71cc94f740d44cad1e7cd + name: gdch-gardener_prod-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-arm64-1877.3-75df9f40/gdch-gardener_prod-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 0c3fa17234c381e3c72f15ee62f807c0 + name: gdch-gardener_prod-arm64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-arm64-1877.3-75df9f40/gdch-gardener_prod-arm64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: ee8e8ae2168e51c99433a4ed1a2fb274 + name: gdch-gardener_prod-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-arm64-1877.3-75df9f40/gdch-gardener_prod-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 29e8ed3d164db2d2fe1eff37b99d8c76 + name: gdch-gardener_prod-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-arm64-1877.3-75df9f40/gdch-gardener_prod-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 81c8854ba4d1387f62b0bea59366a3b3 + name: gdch-gardener_prod-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-arm64-1877.3-75df9f40/gdch-gardener_prod-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: cc726c0c4ce71cc94f740d44cad1e7cd + name: gdch-gardener_prod-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-arm64-1877.3-75df9f40/gdch-gardener_prod-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: cc726c0c4ce71cc94f740d44cad1e7cd + name: gdch-gardener_prod-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-arm64-1877.3-75df9f40/gdch-gardener_prod-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: ebe40d9d33607ccbd9991a2e31237644 + name: gdch-gardener_prod-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-arm64-1877.3-75df9f40/gdch-gardener_prod-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: d4549a6bae698ee5acc71579ad8cee72 + name: gdch-gardener_prod-arm64-1877.3-75df9f40.gcpimage.tar.gz + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-arm64-1877.3-75df9f40/gdch-gardener_prod-arm64-1877.3-75df9f40.gcpimage.tar.gz + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .gcpimage.tar.gz +- md5sum: cc726c0c4ce71cc94f740d44cad1e7cd + name: gdch-gardener_prod-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/gdch-gardener_prod-arm64-1877.3-75df9f40/gdch-gardener_prod-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +platform: gdch +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/gdch-gardener_prod-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod-amd64.s3_metadata.yaml new file mode 100644 index 00000000..5e4d78c1 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod-amd64.s3_metadata.yaml @@ -0,0 +1,92 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:16.666711' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _ignite +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- kvm +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: 636c48d7fddf9a7790bcef4fdf5c4bce + name: kvm-gardener_prod-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-amd64-1877.3-75df9f40/kvm-gardener_prod-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 7bd66b15aec27aa4fbff75ac4cbb2735 + name: kvm-gardener_prod-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-amd64-1877.3-75df9f40/kvm-gardener_prod-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 2e7bf59bbe88065e7e3b0caf834bd1b4 + name: kvm-gardener_prod-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-amd64-1877.3-75df9f40/kvm-gardener_prod-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 636c48d7fddf9a7790bcef4fdf5c4bce + name: kvm-gardener_prod-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-amd64-1877.3-75df9f40/kvm-gardener_prod-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 636c48d7fddf9a7790bcef4fdf5c4bce + name: kvm-gardener_prod-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-amd64-1877.3-75df9f40/kvm-gardener_prod-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: kvm-gardener_prod-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-amd64-1877.3-75df9f40/kvm-gardener_prod-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 636c48d7fddf9a7790bcef4fdf5c4bce + name: kvm-gardener_prod-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-amd64-1877.3-75df9f40/kvm-gardener_prod-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: f9d2862020bdc3e4140c7158c37aaaec + name: kvm-gardener_prod-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-amd64-1877.3-75df9f40/kvm-gardener_prod-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 761314106405ae184d8365d98e053860 + name: kvm-gardener_prod-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-amd64-1877.3-75df9f40/kvm-gardener_prod-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 9754177a87e09af80d823ddeae8f5119 + name: kvm-gardener_prod-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-amd64-1877.3-75df9f40/kvm-gardener_prod-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +platform: kvm +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/kvm-gardener_prod-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod-arm64.s3_metadata.yaml new file mode 100644 index 00000000..9385c024 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod-arm64.s3_metadata.yaml @@ -0,0 +1,92 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:49.040383' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _ignite +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- kvm +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: ccd3497025abf4a9187f6c28057b78c7 + name: kvm-gardener_prod-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-arm64-1877.3-75df9f40/kvm-gardener_prod-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 83403ee6a21aff9c0e6d7da0e86f4753 + name: kvm-gardener_prod-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-arm64-1877.3-75df9f40/kvm-gardener_prod-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 83403ee6a21aff9c0e6d7da0e86f4753 + name: kvm-gardener_prod-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-arm64-1877.3-75df9f40/kvm-gardener_prod-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: cd3c5c30f1095dec7a5e5e5d1ec15baa + name: kvm-gardener_prod-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-arm64-1877.3-75df9f40/kvm-gardener_prod-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 8dd0100ad9529edb8a5f01f19f58345d + name: kvm-gardener_prod-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-arm64-1877.3-75df9f40/kvm-gardener_prod-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: eef6e395c8bd9954a7a77e316ce6b3c7 + name: kvm-gardener_prod-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-arm64-1877.3-75df9f40/kvm-gardener_prod-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 83403ee6a21aff9c0e6d7da0e86f4753 + name: kvm-gardener_prod-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-arm64-1877.3-75df9f40/kvm-gardener_prod-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 83403ee6a21aff9c0e6d7da0e86f4753 + name: kvm-gardener_prod-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-arm64-1877.3-75df9f40/kvm-gardener_prod-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: ebe40d9d33607ccbd9991a2e31237644 + name: kvm-gardener_prod-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-arm64-1877.3-75df9f40/kvm-gardener_prod-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 9883123306741c9caf17d04e13dd7070 + name: kvm-gardener_prod-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod-arm64-1877.3-75df9f40/kvm-gardener_prod-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +platform: kvm +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/kvm-gardener_prod-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml new file mode 100644 index 00000000..1f718446 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml @@ -0,0 +1,208 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:57.638166' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _ignite +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- kvm +- multipath +- iscsi +- nvme +- gardener +- _tpm2 +- _usi +- _trustedboot +paths: +- md5sum: b84926c8b080d45415fea7d083c630ff + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: c186ed1f06ea27eb516e3db49cfee700 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.der +- md5sum: 582840abe3f76ac3499f1af2bd4efd78 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: f4dfe8a5dd7c912408fa59f761e8840b + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 866015eea9749a3b01b07bf385706676 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.der +- md5sum: a23c33048089865ab1884180dfa4f920 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: d41d8cd98f00b204e9800998ecf8427e + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.arn + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.arn + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.arn +- md5sum: b84926c8b080d45415fea7d083c630ff + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 85ba780b6dca9f016f17b5befd369c70 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 582840abe3f76ac3499f1af2bd4efd78 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 79ffa1228382c7c5d7adf3578a209bd0 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.aws-efivars + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.aws-efivars + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.aws-efivars +- md5sum: deb3e30bbbd0bc8b11b41fde73eef3dc + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.conf +- md5sum: 32d06b0baf4e3027766ee19f0722ff40 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.null.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.null.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.null.pk.auth +- md5sum: 52a08859dd78bc3ec1d971e6e3896213 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.auth +- md5sum: 55b26949aaeb59e9699cebc4bbdcca3e + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.conf +- md5sum: 94494df8e01481b52238a09206e0e3a2 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.crt +- md5sum: 00c6a209a251e559c491dc747eaef1bd + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.crt +- md5sum: f69597cbdf3fa2ea827a1ad1456a5506 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: dd083fb6e5161375ebbdd09be72046be + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.auth +- md5sum: 80b01cdcbb8417c54e937f6718175462 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: d00a88a05460802c94211cdd7e8cc8e5 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.der +- md5sum: 03d78f357e62eb5051bd5e04a69dc805 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.conf +- md5sum: 582840abe3f76ac3499f1af2bd4efd78 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: a0b2a017b98a756d525d82678ec35afc + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: 3d57cbafe8c76401e972e6d937a34f24 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 582840abe3f76ac3499f1af2bd4efd78 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 4474c294b76e3f65574a013f6f8e89b1 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.crt +- md5sum: 71cd1e0927785984303bf045d06d5a00 + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.auth +- md5sum: c097978dd4c58b42f161f6b6cd58eb9e + name: kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +platform: kvm +published_image_metadata: null +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/kvm-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 +secureboot: true +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml new file mode 100644 index 00000000..7364209e --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml @@ -0,0 +1,220 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:57.184245' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _ignite +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- kvm +- multipath +- iscsi +- nvme +- gardener +- _tpm2 +- _usi +- _trustedboot +paths: +- md5sum: 71cd1e0927785984303bf045d06d5a00 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.auth +- md5sum: d00a88a05460802c94211cdd7e8cc8e5 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.der +- md5sum: 94494df8e01481b52238a09206e0e3a2 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.crt +- md5sum: 7f7a83d2a32cfa83bd33a4c975b02fad + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: f86a32ce52d702a24c00c58d5834d785 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: 7f7a83d2a32cfa83bd33a4c975b02fad + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 866015eea9749a3b01b07bf385706676 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.der +- md5sum: 55b26949aaeb59e9699cebc4bbdcca3e + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.conf +- md5sum: d41d8cd98f00b204e9800998ecf8427e + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.arn + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.arn + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.arn +- md5sum: c186ed1f06ea27eb516e3db49cfee700 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.der +- md5sum: 7f7a83d2a32cfa83bd33a4c975b02fad + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 03d78f357e62eb5051bd5e04a69dc805 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.conf +- md5sum: 5a88cba14afbc4a3260e57a4f55c3eac + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: 6bb807a3ba4972a6a743033afb3a040b + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 6bb807a3ba4972a6a743033afb3a040b + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: 00c6a209a251e559c491dc747eaef1bd + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.crt +- md5sum: b572fc79150b27fb6b318f9482e87573 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: 32d06b0baf4e3027766ee19f0722ff40 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.null.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.null.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.null.pk.auth +- md5sum: d1a5e871fccfdd208b850787c49b9983 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 52a08859dd78bc3ec1d971e6e3896213 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.auth +- md5sum: 656467e62c03c198f2cbf99c65a48afa + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: 7f7a83d2a32cfa83bd33a4c975b02fad + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 6ac1e54710e4d6092dcac9fd5caa0a6a + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 8c0534751f3fb0998157e9c6a3d810b5 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: deb3e30bbbd0bc8b11b41fde73eef3dc + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.conf +- md5sum: 471935501eeec40c113575b2ecdee74d + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 79ffa1228382c7c5d7adf3578a209bd0 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.aws-efivars + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.aws-efivars + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.aws-efivars +- md5sum: dd083fb6e5161375ebbdd09be72046be + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.auth +- md5sum: 91a818efc52505a94c6b3c69098533f1 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 26ef61c3237df9c144183a3a999d26d5 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 4474c294b76e3f65574a013f6f8e89b1 + name: kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.crt +platform: kvm +published_image_metadata: null +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/kvm-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 +secureboot: true +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_usi-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_usi-amd64.s3_metadata.yaml new file mode 100644 index 00000000..9e102731 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_usi-amd64.s3_metadata.yaml @@ -0,0 +1,118 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:26.644945' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _ignite +- _nocrypt +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- kvm +- multipath +- iscsi +- nvme +- gardener +- _unsigned +- _usi +paths: +- md5sum: c48aa67af7ba1ca5476642075fab60d4 + name: kvm-gardener_prod_usi-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-amd64-1877.3-75df9f40/kvm-gardener_prod_usi-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: d5dbaab293ba1efcc94d2759a7b9dffd + name: kvm-gardener_prod_usi-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-amd64-1877.3-75df9f40/kvm-gardener_prod_usi-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 6ea462b43680be993efe560c48337e6b + name: kvm-gardener_prod_usi-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-amd64-1877.3-75df9f40/kvm-gardener_prod_usi-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: a25552ebe21a2694d4ba91c2321c7e30 + name: kvm-gardener_prod_usi-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-amd64-1877.3-75df9f40/kvm-gardener_prod_usi-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 28ce5927bb5e59290300190a30167ee3 + name: kvm-gardener_prod_usi-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-amd64-1877.3-75df9f40/kvm-gardener_prod_usi-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 28e6788d49ca1fc125f713867a617b52 + name: kvm-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-amd64-1877.3-75df9f40/kvm-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: c48aa67af7ba1ca5476642075fab60d4 + name: kvm-gardener_prod_usi-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-amd64-1877.3-75df9f40/kvm-gardener_prod_usi-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 8ce00d484725770c0ed07bd3a8399dbc + name: kvm-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-amd64-1877.3-75df9f40/kvm-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: 2157bb822434ed74b67a8f2dbbb20070 + name: kvm-gardener_prod_usi-amd64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-amd64-1877.3-75df9f40/kvm-gardener_prod_usi-amd64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: ee21f1409e54902b05e2f028df40269f + name: kvm-gardener_prod_usi-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-amd64-1877.3-75df9f40/kvm-gardener_prod_usi-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 28e6788d49ca1fc125f713867a617b52 + name: kvm-gardener_prod_usi-amd64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-amd64-1877.3-75df9f40/kvm-gardener_prod_usi-amd64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: f69597cbdf3fa2ea827a1ad1456a5506 + name: kvm-gardener_prod_usi-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-amd64-1877.3-75df9f40/kvm-gardener_prod_usi-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: c48aa67af7ba1ca5476642075fab60d4 + name: kvm-gardener_prod_usi-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-amd64-1877.3-75df9f40/kvm-gardener_prod_usi-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: c48aa67af7ba1ca5476642075fab60d4 + name: kvm-gardener_prod_usi-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-amd64-1877.3-75df9f40/kvm-gardener_prod_usi-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +platform: kvm +published_image_metadata: null +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/kvm-gardener_prod_usi-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_usi-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_usi-arm64.s3_metadata.yaml new file mode 100644 index 00000000..202c7c7a --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/kvm-gardener_prod_usi-arm64.s3_metadata.yaml @@ -0,0 +1,118 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:54.167269' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _ignite +- _nocrypt +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- kvm +- multipath +- iscsi +- nvme +- gardener +- _unsigned +- _usi +paths: +- md5sum: 9c8a2087dfb3d3fd5620a8f38d10d427 + name: kvm-gardener_prod_usi-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-arm64-1877.3-75df9f40/kvm-gardener_prod_usi-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 9c8a2087dfb3d3fd5620a8f38d10d427 + name: kvm-gardener_prod_usi-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-arm64-1877.3-75df9f40/kvm-gardener_prod_usi-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: c8ca132b0e6aba25f7623f8865b85987 + name: kvm-gardener_prod_usi-arm64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-arm64-1877.3-75df9f40/kvm-gardener_prod_usi-arm64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: 55be7dbd3a96790ffbcf8eeca90ee573 + name: kvm-gardener_prod_usi-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-arm64-1877.3-75df9f40/kvm-gardener_prod_usi-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 9c8a2087dfb3d3fd5620a8f38d10d427 + name: kvm-gardener_prod_usi-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-arm64-1877.3-75df9f40/kvm-gardener_prod_usi-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: f88cbd97ddc5676faab3bfd1b0d2b0b3 + name: kvm-gardener_prod_usi-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-arm64-1877.3-75df9f40/kvm-gardener_prod_usi-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 417d677c363f6b8a84e4a527b9d23637 + name: kvm-gardener_prod_usi-arm64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-arm64-1877.3-75df9f40/kvm-gardener_prod_usi-arm64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: 23a2beb1d11989317762ba412888df1f + name: kvm-gardener_prod_usi-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-arm64-1877.3-75df9f40/kvm-gardener_prod_usi-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: d1a5e871fccfdd208b850787c49b9983 + name: kvm-gardener_prod_usi-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-arm64-1877.3-75df9f40/kvm-gardener_prod_usi-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 7a1a7c03a2ae03262b658e1649e08523 + name: kvm-gardener_prod_usi-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-arm64-1877.3-75df9f40/kvm-gardener_prod_usi-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 2e75ca5c271e8b0a3581cbc3a43e8685 + name: kvm-gardener_prod_usi-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-arm64-1877.3-75df9f40/kvm-gardener_prod_usi-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: c8ca132b0e6aba25f7623f8865b85987 + name: kvm-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-arm64-1877.3-75df9f40/kvm-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 1f90275bc276a445b20af23eb3d4f11b + name: kvm-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-arm64-1877.3-75df9f40/kvm-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: 9c8a2087dfb3d3fd5620a8f38d10d427 + name: kvm-gardener_prod_usi-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/kvm-gardener_prod_usi-arm64-1877.3-75df9f40/kvm-gardener_prod_usi-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +platform: kvm +published_image_metadata: null +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/kvm-gardener_prod_usi-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/metal-capi-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/metal-capi-amd64.s3_metadata.yaml new file mode 100644 index 00000000..4971eaff --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/metal-capi-amd64.s3_metadata.yaml @@ -0,0 +1,89 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:05.440446' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _ignite +- _legacy +- _pxe +- _slim +- base +- server +- metal +- chost +- khost +- capi +paths: +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: metal-capi-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-amd64-1877.3-75df9f40/metal-capi-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 4cd6036fc184d7e7a9f645d2733b0b83 + name: metal-capi-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-amd64-1877.3-75df9f40/metal-capi-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 828c199af2b69ec272d82ff7a8aabd72 + name: metal-capi-amd64-1877.3-75df9f40.pxe.tar.gz + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-amd64-1877.3-75df9f40/metal-capi-amd64-1877.3-75df9f40.pxe.tar.gz + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .pxe.tar.gz +- md5sum: 4cd6036fc184d7e7a9f645d2733b0b83 + name: metal-capi-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-amd64-1877.3-75df9f40/metal-capi-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 29803ecc769d8d4d4e6246c41f576bb9 + name: metal-capi-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-amd64-1877.3-75df9f40/metal-capi-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 4cd6036fc184d7e7a9f645d2733b0b83 + name: metal-capi-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-amd64-1877.3-75df9f40/metal-capi-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 4cd6036fc184d7e7a9f645d2733b0b83 + name: metal-capi-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-amd64-1877.3-75df9f40/metal-capi-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 0b236bf89b779899bc9f399c63a034d1 + name: metal-capi-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-amd64-1877.3-75df9f40/metal-capi-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 13918bda82208a19f9db69244d1ceb5c + name: metal-capi-amd64-1877.3-75df9f40.pxe.tar.gz.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-amd64-1877.3-75df9f40/metal-capi-amd64-1877.3-75df9f40.pxe.tar.gz.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .pxe.tar.gz.log +- md5sum: 3ffdbf4f628a79749ceebe8e0b241a64 + name: metal-capi-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-amd64-1877.3-75df9f40/metal-capi-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +platform: metal +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/metal-capi-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/metal-capi-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/metal-capi-arm64.s3_metadata.yaml new file mode 100644 index 00000000..713fa246 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/metal-capi-arm64.s3_metadata.yaml @@ -0,0 +1,101 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:40.619990' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _ignite +- _legacy +- _pxe +- _slim +- base +- server +- metal +- chost +- khost +- capi +paths: +- md5sum: 59ef097cf48f6091bdac652c15363663 + name: metal-capi-arm64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-arm64-1877.3-75df9f40/metal-capi-arm64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: 900d92fa8e557a8c6c982f1c8eed7d32 + name: metal-capi-arm64-1877.3-75df9f40.pxe.tar.gz + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-arm64-1877.3-75df9f40/metal-capi-arm64-1877.3-75df9f40.pxe.tar.gz + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .pxe.tar.gz +- md5sum: 4a1277f094d681d27894838579bbb90f + name: metal-capi-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-arm64-1877.3-75df9f40/metal-capi-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 4a1277f094d681d27894838579bbb90f + name: metal-capi-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-arm64-1877.3-75df9f40/metal-capi-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 30744d7edff17b810a57ce046386a63f + name: metal-capi-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-arm64-1877.3-75df9f40/metal-capi-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: da3f23ae087e91535d414e17aae6c49e + name: metal-capi-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-arm64-1877.3-75df9f40/metal-capi-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: ebe40d9d33607ccbd9991a2e31237644 + name: metal-capi-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-arm64-1877.3-75df9f40/metal-capi-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 4a1277f094d681d27894838579bbb90f + name: metal-capi-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-arm64-1877.3-75df9f40/metal-capi-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: e4c57dd02a893a49609d787622d95eae + name: metal-capi-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-arm64-1877.3-75df9f40/metal-capi-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 4a1277f094d681d27894838579bbb90f + name: metal-capi-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-arm64-1877.3-75df9f40/metal-capi-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: c3b679562682936478b8654e825bedef + name: metal-capi-arm64-1877.3-75df9f40.pxe.tar.gz.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-arm64-1877.3-75df9f40/metal-capi-arm64-1877.3-75df9f40.pxe.tar.gz.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .pxe.tar.gz.log +- md5sum: b516fe67bf0117c4dcdfe1b21f77d2db + name: metal-capi-arm64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-capi-arm64-1877.3-75df9f40/metal-capi-arm64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +platform: metal +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/metal-capi-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod-amd64.s3_metadata.yaml new file mode 100644 index 00000000..58faf69c --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod-amd64.s3_metadata.yaml @@ -0,0 +1,90 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:57.476144' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- metal +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: 6f4ebd2219f7b29c2c57779f4f5f99c7 + name: metal-gardener_prod-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-amd64-1877.3-75df9f40/metal-gardener_prod-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: cd73b1e1fcdffbb1bfe0c1adb1a58572 + name: metal-gardener_prod-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-amd64-1877.3-75df9f40/metal-gardener_prod-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 8867d9cc7be832100fd222c574705bb7 + name: metal-gardener_prod-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-amd64-1877.3-75df9f40/metal-gardener_prod-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 6e0716cb5d16efa71f7fff842b6b590e + name: metal-gardener_prod-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-amd64-1877.3-75df9f40/metal-gardener_prod-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 8867d9cc7be832100fd222c574705bb7 + name: metal-gardener_prod-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-amd64-1877.3-75df9f40/metal-gardener_prod-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 8867d9cc7be832100fd222c574705bb7 + name: metal-gardener_prod-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-amd64-1877.3-75df9f40/metal-gardener_prod-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 8867d9cc7be832100fd222c574705bb7 + name: metal-gardener_prod-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-amd64-1877.3-75df9f40/metal-gardener_prod-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: f5c833e59124b8437cc9aadaee19102f + name: metal-gardener_prod-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-amd64-1877.3-75df9f40/metal-gardener_prod-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: efc7d72b597457130db46b8f81519be0 + name: metal-gardener_prod-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-amd64-1877.3-75df9f40/metal-gardener_prod-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: metal-gardener_prod-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-amd64-1877.3-75df9f40/metal-gardener_prod-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +platform: metal +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/metal-gardener_prod-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod-arm64.s3_metadata.yaml new file mode 100644 index 00000000..6bea5a5a --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod-arm64.s3_metadata.yaml @@ -0,0 +1,90 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:27.628067' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- metal +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: 53cfc9460601f4c9aaa66fb1cd6af2dd + name: metal-gardener_prod-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-arm64-1877.3-75df9f40/metal-gardener_prod-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: ea7e20181f232f68c71709094e124c76 + name: metal-gardener_prod-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-arm64-1877.3-75df9f40/metal-gardener_prod-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 419e5783fb104d93a8ccc537c9d3539b + name: metal-gardener_prod-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-arm64-1877.3-75df9f40/metal-gardener_prod-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 73f40cd8c2729b6d1c94e3fc7aa8698b + name: metal-gardener_prod-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-arm64-1877.3-75df9f40/metal-gardener_prod-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 73f40cd8c2729b6d1c94e3fc7aa8698b + name: metal-gardener_prod-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-arm64-1877.3-75df9f40/metal-gardener_prod-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: bf434ac2e0d2d11467286b7593c7e96f + name: metal-gardener_prod-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-arm64-1877.3-75df9f40/metal-gardener_prod-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 73f40cd8c2729b6d1c94e3fc7aa8698b + name: metal-gardener_prod-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-arm64-1877.3-75df9f40/metal-gardener_prod-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: ebe40d9d33607ccbd9991a2e31237644 + name: metal-gardener_prod-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-arm64-1877.3-75df9f40/metal-gardener_prod-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 73f40cd8c2729b6d1c94e3fc7aa8698b + name: metal-gardener_prod-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-arm64-1877.3-75df9f40/metal-gardener_prod-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 4bb08a78ec9990610be9caec0ffdfd95 + name: metal-gardener_prod-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod-arm64-1877.3-75df9f40/metal-gardener_prod-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +platform: metal +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/metal-gardener_prod-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml new file mode 100644 index 00000000..91fb6c40 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml @@ -0,0 +1,206 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:11.613690' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nopkg +- _prod +- _slim +- base +- server +- metal +- multipath +- iscsi +- nvme +- gardener +- _tpm2 +- _usi +- _trustedboot +paths: +- md5sum: 00c6a209a251e559c491dc747eaef1bd + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.crt +- md5sum: d73933387061eba57bb2888fc9eee32c + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 4474c294b76e3f65574a013f6f8e89b1 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.crt +- md5sum: e94d7c365612e226b1a54261217d92ce + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 03d78f357e62eb5051bd5e04a69dc805 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.conf +- md5sum: c6a253bc2069b1e4bd74a16fdf4e84bb + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 71cd1e0927785984303bf045d06d5a00 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.auth +- md5sum: 94494df8e01481b52238a09206e0e3a2 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.crt +- md5sum: 5f34b081afc236fc91fc2ddbd88287fa + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: c4f50c80c6f761fd284b75b60abcd2d5 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 55b26949aaeb59e9699cebc4bbdcca3e + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.conf +- md5sum: 78636e5f4fb996004dcbd2bdc5e5def1 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: f85e2a7b57ab51fbe56e110cc76fc134 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: d73933387061eba57bb2888fc9eee32c + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: d89a3c158c457ff8f1c90d48c163c3f3 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: d00a88a05460802c94211cdd7e8cc8e5 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.der +- md5sum: c4495a6b640ffef700997c73c5d9c48f + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: d41d8cd98f00b204e9800998ecf8427e + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.arn + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.arn + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.arn +- md5sum: c186ed1f06ea27eb516e3db49cfee700 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.der +- md5sum: 866015eea9749a3b01b07bf385706676 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.der +- md5sum: 32d06b0baf4e3027766ee19f0722ff40 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.null.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.null.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.null.pk.auth +- md5sum: deb3e30bbbd0bc8b11b41fde73eef3dc + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.conf +- md5sum: d73933387061eba57bb2888fc9eee32c + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: dd083fb6e5161375ebbdd09be72046be + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.auth +- md5sum: 52a08859dd78bc3ec1d971e6e3896213 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.auth +- md5sum: 79ffa1228382c7c5d7adf3578a209bd0 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.aws-efivars + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.aws-efivars + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.aws-efivars +- md5sum: d73933387061eba57bb2888fc9eee32c + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 78636e5f4fb996004dcbd2bdc5e5def1 + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: f4dfe8a5dd7c912408fa59f761e8840b + name: metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +platform: metal +published_image_metadata: null +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/metal-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 +secureboot: true +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml new file mode 100644 index 00000000..cb253fb8 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml @@ -0,0 +1,206 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:59.191862' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nopkg +- _prod +- _slim +- base +- server +- metal +- multipath +- iscsi +- nvme +- gardener +- _tpm2 +- _usi +- _trustedboot +paths: +- md5sum: 45a481701d571365522941b5d86df139 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: c186ed1f06ea27eb516e3db49cfee700 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.der +- md5sum: 79ffa1228382c7c5d7adf3578a209bd0 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.aws-efivars + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.aws-efivars + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.aws-efivars +- md5sum: 8c0534751f3fb0998157e9c6a3d810b5 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: d93669eb149701f969329f50967d964b + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 4474c294b76e3f65574a013f6f8e89b1 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.crt +- md5sum: ce0ee9b1d5413109a1e6aeeb8bf7ab6f + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 00c6a209a251e559c491dc747eaef1bd + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.crt +- md5sum: 866015eea9749a3b01b07bf385706676 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.der +- md5sum: ce0ee9b1d5413109a1e6aeeb8bf7ab6f + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: deb3e30bbbd0bc8b11b41fde73eef3dc + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.conf +- md5sum: 4fa6e6684c59d1a43189157ed9dc328c + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: c2942960541f135eaf54fe62af333804 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: a46a49d4b193ce28e74dafa2622d42cb + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 4da3c7d9927f81d21e137a40633ed008 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 71cd1e0927785984303bf045d06d5a00 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.auth +- md5sum: ce0ee9b1d5413109a1e6aeeb8bf7ab6f + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: d00a88a05460802c94211cdd7e8cc8e5 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.der +- md5sum: e779416715bb4bdf4a7bf2d2e69f6ca3 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 94494df8e01481b52238a09206e0e3a2 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.crt +- md5sum: dd083fb6e5161375ebbdd09be72046be + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.auth +- md5sum: d41d8cd98f00b204e9800998ecf8427e + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.arn + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.arn + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.arn +- md5sum: 52a08859dd78bc3ec1d971e6e3896213 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.auth +- md5sum: 937ef37e5cacf858e0fdff2c5034f458 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 32d06b0baf4e3027766ee19f0722ff40 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.null.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.null.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.null.pk.auth +- md5sum: 03d78f357e62eb5051bd5e04a69dc805 + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.conf +- md5sum: ce0ee9b1d5413109a1e6aeeb8bf7ab6f + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: a46a49d4b193ce28e74dafa2622d42cb + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: 55b26949aaeb59e9699cebc4bbdcca3e + name: metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.conf +platform: metal +published_image_metadata: null +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/metal-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 +secureboot: true +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_usi-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_usi-amd64.s3_metadata.yaml new file mode 100644 index 00000000..479b9ae3 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_usi-amd64.s3_metadata.yaml @@ -0,0 +1,116 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:02.531494' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nocrypt +- _nopkg +- _prod +- _slim +- base +- server +- metal +- multipath +- iscsi +- nvme +- gardener +- _unsigned +- _usi +paths: +- md5sum: 4092064f7314f3da9a830974ed880625 + name: metal-gardener_prod_usi-amd64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-amd64-1877.3-75df9f40/metal-gardener_prod_usi-amd64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: 2a7196181bb0187b20b6c7c4bbac6934 + name: metal-gardener_prod_usi-amd64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-amd64-1877.3-75df9f40/metal-gardener_prod_usi-amd64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: 0bac7c56c80c9c918c6d581adaeda25a + name: metal-gardener_prod_usi-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-amd64-1877.3-75df9f40/metal-gardener_prod_usi-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 4626c43c896e7e36efd4d047b76f7428 + name: metal-gardener_prod_usi-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-amd64-1877.3-75df9f40/metal-gardener_prod_usi-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 1e8fad6f61af2b3ea5893b1eb9092c33 + name: metal-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-amd64-1877.3-75df9f40/metal-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: 759611fbd0df90d904c3af49f88d9b47 + name: metal-gardener_prod_usi-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-amd64-1877.3-75df9f40/metal-gardener_prod_usi-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 4f1b97af8c60f26c0e049d10c0f12f42 + name: metal-gardener_prod_usi-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-amd64-1877.3-75df9f40/metal-gardener_prod_usi-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: a5e7210e2771f2c420fa4ff7c2ac91d4 + name: metal-gardener_prod_usi-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-amd64-1877.3-75df9f40/metal-gardener_prod_usi-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: c4495a6b640ffef700997c73c5d9c48f + name: metal-gardener_prod_usi-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-amd64-1877.3-75df9f40/metal-gardener_prod_usi-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 4f1b97af8c60f26c0e049d10c0f12f42 + name: metal-gardener_prod_usi-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-amd64-1877.3-75df9f40/metal-gardener_prod_usi-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 4f1b97af8c60f26c0e049d10c0f12f42 + name: metal-gardener_prod_usi-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-amd64-1877.3-75df9f40/metal-gardener_prod_usi-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 28ce5927bb5e59290300190a30167ee3 + name: metal-gardener_prod_usi-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-amd64-1877.3-75df9f40/metal-gardener_prod_usi-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 4f1b97af8c60f26c0e049d10c0f12f42 + name: metal-gardener_prod_usi-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-amd64-1877.3-75df9f40/metal-gardener_prod_usi-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 2a7196181bb0187b20b6c7c4bbac6934 + name: metal-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-amd64-1877.3-75df9f40/metal-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +platform: metal +published_image_metadata: null +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/metal-gardener_prod_usi-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_usi-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_usi-arm64.s3_metadata.yaml new file mode 100644 index 00000000..c923e335 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_prod_usi-arm64.s3_metadata.yaml @@ -0,0 +1,128 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:00.830359' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nocrypt +- _nopkg +- _prod +- _slim +- base +- server +- metal +- multipath +- iscsi +- nvme +- gardener +- _unsigned +- _usi +paths: +- md5sum: f8e60934e1259799853ca480a8c6770a + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 4682b5c3e83384cec51614e629cbe9a9 + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 2993b00f82127a198029835ee6c0f060 + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: 3c86a2f4eb09deac1cc9e54410e34152 + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: d31ca3c9e93ece476d64b9407710782a + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 3e2b4b366ee158d604131ce761f14af0 + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: f8e60934e1259799853ca480a8c6770a + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 89fd215fd3aa42ce2cc9ec49786611ea + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: 4682b5c3e83384cec51614e629cbe9a9 + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: 4da3c7d9927f81d21e137a40633ed008 + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: ef54030b27ae795d9374beb5bba2dd08 + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: f8e60934e1259799853ca480a8c6770a + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 2e75ca5c271e8b0a3581cbc3a43e8685 + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: f8e60934e1259799853ca480a8c6770a + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: c0402b05eaead236d19e91979690e664 + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: cd3aefc26cba379dd0f6bcbfc8137f3e + name: metal-gardener_prod_usi-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_prod_usi-arm64-1877.3-75df9f40/metal-gardener_prod_usi-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +platform: metal +published_image_metadata: null +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/metal-gardener_prod_usi-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/metal-gardener_pxe-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_pxe-amd64.s3_metadata.yaml new file mode 100644 index 00000000..8f763306 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_pxe-amd64.s3_metadata.yaml @@ -0,0 +1,90 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:59.397822' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _ignite +- _legacy +- _pxe +- _slim +- base +- server +- metal +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: 87b1a4aff729f3231f408f685c0e1688 + name: metal-gardener_pxe-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-amd64-1877.3-75df9f40/metal-gardener_pxe-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: e71605c32a51f1ff689b658dca865b32 + name: metal-gardener_pxe-amd64-1877.3-75df9f40.pxe.tar.gz.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-amd64-1877.3-75df9f40/metal-gardener_pxe-amd64-1877.3-75df9f40.pxe.tar.gz.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .pxe.tar.gz.log +- md5sum: 7c6b945b8b985b882099673449e6daed + name: metal-gardener_pxe-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-amd64-1877.3-75df9f40/metal-gardener_pxe-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 2b796849a71505c382e86ee593d56e63 + name: metal-gardener_pxe-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-amd64-1877.3-75df9f40/metal-gardener_pxe-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: metal-gardener_pxe-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-amd64-1877.3-75df9f40/metal-gardener_pxe-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 7c6b945b8b985b882099673449e6daed + name: metal-gardener_pxe-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-amd64-1877.3-75df9f40/metal-gardener_pxe-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 7c6b945b8b985b882099673449e6daed + name: metal-gardener_pxe-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-amd64-1877.3-75df9f40/metal-gardener_pxe-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 5851d8bdb3ba8709e884952b2f44a743 + name: metal-gardener_pxe-amd64-1877.3-75df9f40.pxe.tar.gz + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-amd64-1877.3-75df9f40/metal-gardener_pxe-amd64-1877.3-75df9f40.pxe.tar.gz + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .pxe.tar.gz +- md5sum: 7c6b945b8b985b882099673449e6daed + name: metal-gardener_pxe-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-amd64-1877.3-75df9f40/metal-gardener_pxe-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 1160708c5bd99af2a32a08ebc4a9c459 + name: metal-gardener_pxe-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-amd64-1877.3-75df9f40/metal-gardener_pxe-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +platform: metal +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/metal-gardener_pxe-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/metal-gardener_pxe-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_pxe-arm64.s3_metadata.yaml new file mode 100644 index 00000000..73732a72 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/metal-gardener_pxe-arm64.s3_metadata.yaml @@ -0,0 +1,90 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:59.567800' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _ignite +- _legacy +- _pxe +- _slim +- base +- server +- metal +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: 57dcc2017149222765ee6cf179236d40 + name: metal-gardener_pxe-arm64-1877.3-75df9f40.pxe.tar.gz + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-arm64-1877.3-75df9f40/metal-gardener_pxe-arm64-1877.3-75df9f40.pxe.tar.gz + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .pxe.tar.gz +- md5sum: ebe40d9d33607ccbd9991a2e31237644 + name: metal-gardener_pxe-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-arm64-1877.3-75df9f40/metal-gardener_pxe-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 1cfa2a3832559b23c2131e2a8636efcb + name: metal-gardener_pxe-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-arm64-1877.3-75df9f40/metal-gardener_pxe-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 1cfa2a3832559b23c2131e2a8636efcb + name: metal-gardener_pxe-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-arm64-1877.3-75df9f40/metal-gardener_pxe-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: f6462ea4b9c9621cdcb45fbe6835e7f7 + name: metal-gardener_pxe-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-arm64-1877.3-75df9f40/metal-gardener_pxe-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: ac4893409e9e5826ddfb3bb66cd5552c + name: metal-gardener_pxe-arm64-1877.3-75df9f40.pxe.tar.gz.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-arm64-1877.3-75df9f40/metal-gardener_pxe-arm64-1877.3-75df9f40.pxe.tar.gz.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .pxe.tar.gz.log +- md5sum: 1cfa2a3832559b23c2131e2a8636efcb + name: metal-gardener_pxe-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-arm64-1877.3-75df9f40/metal-gardener_pxe-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 903e2f4a02370ea82fa45d6543ebdf6a + name: metal-gardener_pxe-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-arm64-1877.3-75df9f40/metal-gardener_pxe-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 64144c3221bef980bcf4d425b762ad2c + name: metal-gardener_pxe-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-arm64-1877.3-75df9f40/metal-gardener_pxe-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 1cfa2a3832559b23c2131e2a8636efcb + name: metal-gardener_pxe-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-gardener_pxe-arm64-1877.3-75df9f40/metal-gardener_pxe-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +platform: metal +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/metal-gardener_pxe-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/metal-vhost-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/metal-vhost-amd64.s3_metadata.yaml new file mode 100644 index 00000000..4dae4bd9 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/metal-vhost-amd64.s3_metadata.yaml @@ -0,0 +1,87 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:18.724519' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- firewall +- log +- sap +- ssh +- _legacy +- _selinux +- _slim +- base +- server +- metal +- vhost +paths: +- md5sum: 0768ba382b56c22ad3a00a1d6c81f489 + name: metal-vhost-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-amd64-1877.3-75df9f40/metal-vhost-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 8dedde16285e8c726c4ba2fa2f4f68be + name: metal-vhost-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-amd64-1877.3-75df9f40/metal-vhost-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 41305cfe513b5fc35ebef6dd35ad804e + name: metal-vhost-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-amd64-1877.3-75df9f40/metal-vhost-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 53ef902117ec56b73aedc6c9a4a269f5 + name: metal-vhost-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-amd64-1877.3-75df9f40/metal-vhost-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 5f7e9d063b0e3ed27c80aeea84fe3f5a + name: metal-vhost-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-amd64-1877.3-75df9f40/metal-vhost-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 41305cfe513b5fc35ebef6dd35ad804e + name: metal-vhost-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-amd64-1877.3-75df9f40/metal-vhost-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: metal-vhost-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-amd64-1877.3-75df9f40/metal-vhost-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 41305cfe513b5fc35ebef6dd35ad804e + name: metal-vhost-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-amd64-1877.3-75df9f40/metal-vhost-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 3822f82c8a753c8123e49d4974c2b8b5 + name: metal-vhost-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-amd64-1877.3-75df9f40/metal-vhost-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 41305cfe513b5fc35ebef6dd35ad804e + name: metal-vhost-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-amd64-1877.3-75df9f40/metal-vhost-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +platform: metal +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/metal-vhost-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/metal-vhost-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/metal-vhost-arm64.s3_metadata.yaml new file mode 100644 index 00000000..504c399a --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/metal-vhost-arm64.s3_metadata.yaml @@ -0,0 +1,87 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:29.581791' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- firewall +- log +- sap +- ssh +- _legacy +- _selinux +- _slim +- base +- server +- metal +- vhost +paths: +- md5sum: 72318ddfdaad32c4416423bf74326fcb + name: metal-vhost-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-arm64-1877.3-75df9f40/metal-vhost-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 6f5f686be885301ca9fff04218a6567d + name: metal-vhost-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-arm64-1877.3-75df9f40/metal-vhost-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: fc8763cca6a072910992219f40dea7cb + name: metal-vhost-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-arm64-1877.3-75df9f40/metal-vhost-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: fc8763cca6a072910992219f40dea7cb + name: metal-vhost-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-arm64-1877.3-75df9f40/metal-vhost-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: d39b3a582158fa37afede6329b227a46 + name: metal-vhost-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-arm64-1877.3-75df9f40/metal-vhost-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: fc8763cca6a072910992219f40dea7cb + name: metal-vhost-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-arm64-1877.3-75df9f40/metal-vhost-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: ebe40d9d33607ccbd9991a2e31237644 + name: metal-vhost-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-arm64-1877.3-75df9f40/metal-vhost-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: fc8763cca6a072910992219f40dea7cb + name: metal-vhost-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-arm64-1877.3-75df9f40/metal-vhost-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 010b4c367f6ab62b85e912a506891022 + name: metal-vhost-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-arm64-1877.3-75df9f40/metal-vhost-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: 663d4afeb0fbdcd94459c518e6ea953e + name: metal-vhost-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal-vhost-arm64-1877.3-75df9f40/metal-vhost-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +platform: metal +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/metal-vhost-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/metal_pxe-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/metal_pxe-amd64.s3_metadata.yaml new file mode 100644 index 00000000..307f8594 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/metal_pxe-amd64.s3_metadata.yaml @@ -0,0 +1,88 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:55.498458' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- firewall +- log +- sap +- ssh +- _ignite +- _legacy +- _pxe +- _selinux +- _slim +- base +- server +- metal +paths: +- md5sum: 030a83d4dd7e2f2d7e999c5913446e62 + name: metal_pxe-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-amd64-1877.3-75df9f40/metal_pxe-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 1a9b2c1db94d15c427b2449fdfb754b0 + name: metal_pxe-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-amd64-1877.3-75df9f40/metal_pxe-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: metal_pxe-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-amd64-1877.3-75df9f40/metal_pxe-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 36abb44810e936ae65ac5e1b76928235 + name: metal_pxe-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-amd64-1877.3-75df9f40/metal_pxe-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 030a83d4dd7e2f2d7e999c5913446e62 + name: metal_pxe-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-amd64-1877.3-75df9f40/metal_pxe-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 7587f4a51bf1036582201acbbb905e32 + name: metal_pxe-amd64-1877.3-75df9f40.pxe.tar.gz.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-amd64-1877.3-75df9f40/metal_pxe-amd64-1877.3-75df9f40.pxe.tar.gz.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .pxe.tar.gz.log +- md5sum: e063340fcf351658fa71442e8980dfae + name: metal_pxe-amd64-1877.3-75df9f40.pxe.tar.gz + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-amd64-1877.3-75df9f40/metal_pxe-amd64-1877.3-75df9f40.pxe.tar.gz + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .pxe.tar.gz +- md5sum: 030a83d4dd7e2f2d7e999c5913446e62 + name: metal_pxe-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-amd64-1877.3-75df9f40/metal_pxe-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: fee3c4f5de821fac536fb04ec78fc8c5 + name: metal_pxe-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-amd64-1877.3-75df9f40/metal_pxe-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 030a83d4dd7e2f2d7e999c5913446e62 + name: metal_pxe-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-amd64-1877.3-75df9f40/metal_pxe-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +platform: metal +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/metal_pxe-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/metal_pxe-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/metal_pxe-arm64.s3_metadata.yaml new file mode 100644 index 00000000..a848e1d8 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/metal_pxe-arm64.s3_metadata.yaml @@ -0,0 +1,88 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:14:04.480446' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- firewall +- log +- sap +- ssh +- _ignite +- _legacy +- _pxe +- _selinux +- _slim +- base +- server +- metal +paths: +- md5sum: ebe40d9d33607ccbd9991a2e31237644 + name: metal_pxe-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-arm64-1877.3-75df9f40/metal_pxe-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: f2a44ed60b462803472bac55a21286e1 + name: metal_pxe-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-arm64-1877.3-75df9f40/metal_pxe-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 35af88fafde836ea260212af9206a3ed + name: metal_pxe-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-arm64-1877.3-75df9f40/metal_pxe-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 30de5a1996b2dad46c24116686ef8619 + name: metal_pxe-arm64-1877.3-75df9f40.pxe.tar.gz + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-arm64-1877.3-75df9f40/metal_pxe-arm64-1877.3-75df9f40.pxe.tar.gz + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .pxe.tar.gz +- md5sum: 35af88fafde836ea260212af9206a3ed + name: metal_pxe-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-arm64-1877.3-75df9f40/metal_pxe-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: cf413a844c5a9b6dd4c6410c8df407d5 + name: metal_pxe-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-arm64-1877.3-75df9f40/metal_pxe-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 0aab5b61dc981037c9d6105d13dddfe5 + name: metal_pxe-arm64-1877.3-75df9f40.pxe.tar.gz.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-arm64-1877.3-75df9f40/metal_pxe-arm64-1877.3-75df9f40.pxe.tar.gz.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .pxe.tar.gz.log +- md5sum: 35af88fafde836ea260212af9206a3ed + name: metal_pxe-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-arm64-1877.3-75df9f40/metal_pxe-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: c8c770381fb43a8fc93b2a6a72c1fd4c + name: metal_pxe-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-arm64-1877.3-75df9f40/metal_pxe-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 35af88fafde836ea260212af9206a3ed + name: metal_pxe-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/metal_pxe-arm64-1877.3-75df9f40/metal_pxe-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +platform: metal +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/metal_pxe-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod-amd64.s3_metadata.yaml new file mode 100644 index 00000000..73d0db62 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod-amd64.s3_metadata.yaml @@ -0,0 +1,149 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:19.108412' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- openstack +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: 6e868a97c15168b6967d4a3a34a978d0 + name: openstack-gardener_prod-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-amd64-1877.3-75df9f40/openstack-gardener_prod-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 725b8bb7957d6ae699146aa35b2132b6 + name: openstack-gardener_prod-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-amd64-1877.3-75df9f40/openstack-gardener_prod-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 725b8bb7957d6ae699146aa35b2132b6 + name: openstack-gardener_prod-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-amd64-1877.3-75df9f40/openstack-gardener_prod-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 158ae4ef6747480206eee34d74480b74 + name: openstack-gardener_prod-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-amd64-1877.3-75df9f40/openstack-gardener_prod-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: c8a215c7fd206dd7b05b4ccc2f83ce95 + name: openstack-gardener_prod-amd64-1877.3-75df9f40.vmdk + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-amd64-1877.3-75df9f40/openstack-gardener_prod-amd64-1877.3-75df9f40.vmdk + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: openstack-gardener_prod-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-amd64-1877.3-75df9f40/openstack-gardener_prod-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 725b8bb7957d6ae699146aa35b2132b6 + name: openstack-gardener_prod-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-amd64-1877.3-75df9f40/openstack-gardener_prod-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: af305715135330de9f1ae16b39ee52a6 + name: openstack-gardener_prod-amd64-1877.3-75df9f40.vmdk.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-amd64-1877.3-75df9f40/openstack-gardener_prod-amd64-1877.3-75df9f40.vmdk.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk.log +- md5sum: ee1f88373cbf7b7f2ce719a5d1d39d9c + name: openstack-gardener_prod-amd64-1877.3-75df9f40.qcow2 + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-amd64-1877.3-75df9f40/openstack-gardener_prod-amd64-1877.3-75df9f40.qcow2 + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2 +- md5sum: 725b8bb7957d6ae699146aa35b2132b6 + name: openstack-gardener_prod-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-amd64-1877.3-75df9f40/openstack-gardener_prod-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 3f34988aa83007f61167060218c7b88d + name: openstack-gardener_prod-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-amd64-1877.3-75df9f40/openstack-gardener_prod-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: af305715135330de9f1ae16b39ee52a6 + name: openstack-gardener_prod-amd64-1877.3-75df9f40.qcow2.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-amd64-1877.3-75df9f40/openstack-gardener_prod-amd64-1877.3-75df9f40.qcow2.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2.log +platform: openstack +published_image_metadata: + published_openstack_images: + - image_id: ed3b4c3d-941f-456a-a551-bd52b8397443 + image_name: gardenlinux-1877.3 + region_name: eu-de-1 + - image_id: 5ea6fb4f-20fc-43b8-8ffe-af8da6d61d6a + image_name: gardenlinux-1877.3 + region_name: eu-de-2 + - image_id: ac9b5d43-ff53-494d-8adf-2249c324a9db + image_name: gardenlinux-1877.3 + region_name: eu-nl-1 + - image_id: 404f22a3-9822-4696-a60f-8566eedb93e3 + image_name: gardenlinux-1877.3 + region_name: la-br-1 + - image_id: b69b72f3-574a-4f76-b4eb-ac9185ea2681 + image_name: gardenlinux-1877.3 + region_name: na-ca-1 + - image_id: 40e99366-f13b-402a-a264-e7e4773ab8ba + image_name: gardenlinux-1877.3 + region_name: na-us-1 + - image_id: c50200c6-95fd-4a97-bef2-90b2d6afa3d3 + image_name: gardenlinux-1877.3 + region_name: na-us-2 + - image_id: d5b1d8c0-3420-4a82-931d-0506a6b8f166 + image_name: gardenlinux-1877.3 + region_name: na-us-3 + - image_id: 81c26cb7-c515-4610-949a-92c275640325 + image_name: gardenlinux-1877.3 + region_name: ap-ae-1 + - image_id: 2d6e3edd-5596-41e6-a640-4b1b8e7310e7 + image_name: gardenlinux-1877.3 + region_name: ap-au-1 + - image_id: 3564b5ef-9b37-4926-bb23-5655cf90de69 + image_name: gardenlinux-1877.3 + region_name: ap-cn-1 + - image_id: 2ff61187-f004-4317-bd4c-a17d93b475bc + image_name: gardenlinux-1877.3 + region_name: ap-jp-1 + - image_id: 2bc58951-9bf7-445b-a6e4-f634c7522d9b + image_name: gardenlinux-1877.3 + region_name: ap-jp-2 + - image_id: e4a4aa92-335a-454b-83bb-643cb918cf6a + image_name: gardenlinux-1877.3 + region_name: ap-sa-1 + - image_id: d3ac5df8-ce38-4a23-b611-dfef6b7a0db9 + image_name: gardenlinux-1877.3 + region_name: ap-sa-2 +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/openstack-gardener_prod-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod-arm64.s3_metadata.yaml new file mode 100644 index 00000000..266ff39a --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod-arm64.s3_metadata.yaml @@ -0,0 +1,103 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:22.105461' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- openstack +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: 46adffa0b4a1179e18970824aff96ff3 + name: openstack-gardener_prod-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-arm64-1877.3-75df9f40/openstack-gardener_prod-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: ebe40d9d33607ccbd9991a2e31237644 + name: openstack-gardener_prod-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-arm64-1877.3-75df9f40/openstack-gardener_prod-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 82081eec4571c997737773e9844e50c9 + name: openstack-gardener_prod-arm64-1877.3-75df9f40.vmdk.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-arm64-1877.3-75df9f40/openstack-gardener_prod-arm64-1877.3-75df9f40.vmdk.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk.log +- md5sum: c61a4c4e18f5225fd870787f5e42ccc6 + name: openstack-gardener_prod-arm64-1877.3-75df9f40.qcow2 + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-arm64-1877.3-75df9f40/openstack-gardener_prod-arm64-1877.3-75df9f40.qcow2 + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2 +- md5sum: 46adffa0b4a1179e18970824aff96ff3 + name: openstack-gardener_prod-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-arm64-1877.3-75df9f40/openstack-gardener_prod-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: a2f7bdc7cfcbac65ea98e03473bbaabe + name: openstack-gardener_prod-arm64-1877.3-75df9f40.vmdk + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-arm64-1877.3-75df9f40/openstack-gardener_prod-arm64-1877.3-75df9f40.vmdk + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk +- md5sum: 82081eec4571c997737773e9844e50c9 + name: openstack-gardener_prod-arm64-1877.3-75df9f40.qcow2.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-arm64-1877.3-75df9f40/openstack-gardener_prod-arm64-1877.3-75df9f40.qcow2.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2.log +- md5sum: e5e434ca8a89091b2ed3f269f0f464ca + name: openstack-gardener_prod-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-arm64-1877.3-75df9f40/openstack-gardener_prod-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 922c72f4a93241c3ba0866e445136f41 + name: openstack-gardener_prod-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-arm64-1877.3-75df9f40/openstack-gardener_prod-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 46adffa0b4a1179e18970824aff96ff3 + name: openstack-gardener_prod-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-arm64-1877.3-75df9f40/openstack-gardener_prod-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 46adffa0b4a1179e18970824aff96ff3 + name: openstack-gardener_prod-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-arm64-1877.3-75df9f40/openstack-gardener_prod-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: ce9a79b9d9d39c269214b123a06667f8 + name: openstack-gardener_prod-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod-arm64-1877.3-75df9f40/openstack-gardener_prod-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +platform: openstack +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/openstack-gardener_prod-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml new file mode 100644 index 00000000..9f04ca2f --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_tpm2_trustedboot-amd64.s3_metadata.yaml @@ -0,0 +1,243 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:34.859067' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- openstack +- multipath +- iscsi +- nvme +- gardener +- _tpm2 +- _usi +- _trustedboot +paths: +- md5sum: 71cd1e0927785984303bf045d06d5a00 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.auth +- md5sum: 03d78f357e62eb5051bd5e04a69dc805 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.conf +- md5sum: 62102f94c34154b2bb6f924d5ab10579 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 17d64d2a1affe25a821e64c9f99322f3 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: dd083fb6e5161375ebbdd09be72046be + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.auth +- md5sum: 42cedff3dac800d01ad322cebe645375 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 17d64d2a1affe25a821e64c9f99322f3 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.vmdk.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.vmdk.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk.log +- md5sum: 39ef29d127de2bde822c6f0a8300735a + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: 49f2c92a65ddf2716feed4029feccea7 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: f308fb82276b34f6797447513a88ffa9 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: 2d8b27e704661908135888fbe3daf51a + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 79da281895b3bc4bc36d8b3ea6bbbeff + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 17d64d2a1affe25a821e64c9f99322f3 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.qcow2.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.qcow2.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2.log +- md5sum: 52a08859dd78bc3ec1d971e6e3896213 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.auth +- md5sum: 79da281895b3bc4bc36d8b3ea6bbbeff + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 5e5dd2b3d71412d82b4ff28a12b490d7 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.qcow2 + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.qcow2 + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2 +- md5sum: 79da281895b3bc4bc36d8b3ea6bbbeff + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 4474c294b76e3f65574a013f6f8e89b1 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.crt +- md5sum: 79da281895b3bc4bc36d8b3ea6bbbeff + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 49f2c92a65ddf2716feed4029feccea7 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 79ffa1228382c7c5d7adf3578a209bd0 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.aws-efivars + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.aws-efivars + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.aws-efivars +- md5sum: 866015eea9749a3b01b07bf385706676 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.der +- md5sum: f4dfe8a5dd7c912408fa59f761e8840b + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: d41d8cd98f00b204e9800998ecf8427e + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.arn + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.arn + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.arn +- md5sum: 81a441d427ef19080be7187608725c86 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: c186ed1f06ea27eb516e3db49cfee700 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.der +- md5sum: 55b26949aaeb59e9699cebc4bbdcca3e + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.conf +- md5sum: 32d06b0baf4e3027766ee19f0722ff40 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.null.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.null.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.null.pk.auth +- md5sum: 00c6a209a251e559c491dc747eaef1bd + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.pk.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.crt +- md5sum: 3a467cdc9d85477dee9ca5834404ceca + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: deb3e30bbbd0bc8b11b41fde73eef3dc + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.conf +- md5sum: abe2b52e6d36223b84a488e2d49dd249 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: 94494df8e01481b52238a09206e0e3a2 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.db.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.crt +- md5sum: d00a88a05460802c94211cdd7e8cc8e5 + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.secureboot.kek.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.der +- md5sum: 674ed8489a4fc0fd70553cf4b6c21b6e + name: openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.vmdk + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40.vmdk + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk +platform: openstack +published_image_metadata: null +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/openstack-gardener_prod_tpm2_trustedboot-amd64-1877.3-75df9f40 +secureboot: true +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml new file mode 100644 index 00000000..1665b1e8 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_tpm2_trustedboot-arm64.s3_metadata.yaml @@ -0,0 +1,243 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:43.831435' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- openstack +- multipath +- iscsi +- nvme +- gardener +- _tpm2 +- _usi +- _trustedboot +paths: +- md5sum: 55b26949aaeb59e9699cebc4bbdcca3e + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.conf +- md5sum: 4474c294b76e3f65574a013f6f8e89b1 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.crt +- md5sum: 9424612d82bc7be818198b2ab9e53373 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: dd083fb6e5161375ebbdd09be72046be + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.auth +- md5sum: 70d002bdae51e6b4d62613fdb49ccebe + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 79ffa1228382c7c5d7adf3578a209bd0 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.aws-efivars + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.aws-efivars + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.aws-efivars +- md5sum: d41d8cd98f00b204e9800998ecf8427e + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.arn + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.arn + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.arn +- md5sum: 00c6a209a251e559c491dc747eaef1bd + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.crt +- md5sum: 6955edd0b497b630dbe5960a9a7a7952 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 8da317e572d77cd1f413b1e1f4fa499a + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.qcow2 + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.qcow2 + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2 +- md5sum: 8c0534751f3fb0998157e9c6a3d810b5 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: cff03bf157740950433b3bb71ec014a2 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.vmdk + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.vmdk + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk +- md5sum: 03d78f357e62eb5051bd5e04a69dc805 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.conf +- md5sum: 70d002bdae51e6b4d62613fdb49ccebe + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: 71cd1e0927785984303bf045d06d5a00 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.auth +- md5sum: d00a88a05460802c94211cdd7e8cc8e5 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.der +- md5sum: 86e0939295ebb1e0190ddb22769ae863 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: caf59e15826eeebd09e1da897a23ae5a + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 32d06b0baf4e3027766ee19f0722ff40 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.null.pk.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.null.pk.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.null.pk.auth +- md5sum: 6955edd0b497b630dbe5960a9a7a7952 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 2a1526ae69f1dcb18a848eda5a62ffe8 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.qcow2.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.qcow2.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2.log +- md5sum: 7cf22153c28f80b3da984a3114aa1ef3 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: a5240f5bf47b7484a69ec011c805657e + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: c186ed1f06ea27eb516e3db49cfee700 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.der +- md5sum: a72f317bc0f469d4191b6f80df3696ed + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: 2f367fe46da697b2e086661e6983044e + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: 769ae3fcfeaae3ae98cec9b96c753bcb + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 6955edd0b497b630dbe5960a9a7a7952 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: deb3e30bbbd0bc8b11b41fde73eef3dc + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.conf + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.conf + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.conf +- md5sum: 2a1526ae69f1dcb18a848eda5a62ffe8 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.vmdk.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.vmdk.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk.log +- md5sum: 2a1526ae69f1dcb18a848eda5a62ffe8 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: 866015eea9749a3b01b07bf385706676 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.der + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.pk.der + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.pk.der +- md5sum: 52a08859dd78bc3ec1d971e6e3896213 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.auth + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.kek.auth + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.kek.auth +- md5sum: 94494df8e01481b52238a09206e0e3a2 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.crt + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.secureboot.db.crt + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .secureboot.db.crt +- md5sum: 6955edd0b497b630dbe5960a9a7a7952 + name: openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +platform: openstack +published_image_metadata: null +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/openstack-gardener_prod_tpm2_trustedboot-arm64-1877.3-75df9f40 +secureboot: true +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_usi-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_usi-amd64.s3_metadata.yaml new file mode 100644 index 00000000..a5dcb804 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_usi-amd64.s3_metadata.yaml @@ -0,0 +1,199 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:12:58.700877' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nocrypt +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- openstack +- multipath +- iscsi +- nvme +- gardener +- _unsigned +- _usi +paths: +- md5sum: c85075d4fa7a0371ea7d1ca00a94dcd8 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 29377ca7abfd659a3b10d7834ec86580 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +- md5sum: c1457cb3871313e371c9df912cfd76b6 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: ce382ffc4e3a3529e83f3c5fa306fe68 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.vmdk.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.vmdk.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk.log +- md5sum: 0518337c168bf385582680a812d769c7 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 7f353aaacc5520999d943822a91d9835 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: 0518337c168bf385582680a812d769c7 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: c85075d4fa7a0371ea7d1ca00a94dcd8 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 62102f94c34154b2bb6f924d5ab10579 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: c85075d4fa7a0371ea7d1ca00a94dcd8 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: df7d7614685bc321bf34693e29521a73 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 28ce5927bb5e59290300190a30167ee3 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: d6b654f902d2dbadc21ba197dcd98467 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: ce382ffc4e3a3529e83f3c5fa306fe68 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.qcow2.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.qcow2.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2.log +- md5sum: ce382ffc4e3a3529e83f3c5fa306fe68 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: defec13ab061d52561f1175fac0ae09b + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.vmdk + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.vmdk + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk +- md5sum: c85075d4fa7a0371ea7d1ca00a94dcd8 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 1a1be497d4e49e2dc71fe8aaa1cf0c98 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: c2643f51fc294fb3ba61cc6ef9044be1 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: 43133f8580a503ed54b54f4cf0f92b77 + name: openstack-gardener_prod_usi-amd64-1877.3-75df9f40.qcow2 + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-amd64-1877.3-75df9f40/openstack-gardener_prod_usi-amd64-1877.3-75df9f40.qcow2 + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2 +platform: openstack +published_image_metadata: + published_openstack_images: + - image_id: 15fc38b3-1cee-4c0a-829a-ef1f7faa1920 + image_name: gardenlinux-1877.3 + region_name: eu-de-1 + - image_id: c4e8e8e5-8c92-4c73-b21b-333087e7b092 + image_name: gardenlinux-1877.3 + region_name: eu-de-2 + - image_id: e6f9e054-0613-4204-98c7-84676680418a + image_name: gardenlinux-1877.3 + region_name: eu-nl-1 + - image_id: 04416634-2eaf-44a1-a653-b1ae36bf0e0e + image_name: gardenlinux-1877.3 + region_name: la-br-1 + - image_id: b548d8fd-0e6b-4cb6-9cd1-68b258df00cc + image_name: gardenlinux-1877.3 + region_name: na-ca-1 + - image_id: 0a97e9af-a1f3-4ae4-bf44-98c432aa436c + image_name: gardenlinux-1877.3 + region_name: na-us-1 + - image_id: b1705d73-3f67-427c-8ade-5e245a857338 + image_name: gardenlinux-1877.3 + region_name: na-us-2 + - image_id: da3234f1-307c-431e-80bb-9e51dd75673d + image_name: gardenlinux-1877.3 + region_name: na-us-3 + - image_id: 16f24b39-b9ba-4756-8dcd-82473182f1e4 + image_name: gardenlinux-1877.3 + region_name: ap-ae-1 + - image_id: 49de0ff1-2c7e-439d-a065-07c837fe48a8 + image_name: gardenlinux-1877.3 + region_name: ap-au-1 + - image_id: 23a94a40-1e9a-4f4b-b2b6-4c167493fbb0 + image_name: gardenlinux-1877.3 + region_name: ap-cn-1 + - image_id: 1558417d-14bb-413e-9194-88b2bc5f18aa + image_name: gardenlinux-1877.3 + region_name: ap-jp-1 + - image_id: 8d39ad55-2f09-490e-8fa7-0bdf5c854ed7 + image_name: gardenlinux-1877.3 + region_name: ap-jp-2 + - image_id: 62be0147-062a-4375-b142-278a811e9754 + image_name: gardenlinux-1877.3 + region_name: ap-sa-1 + - image_id: 510d1ff1-4fc6-49ec-ad2f-a0985217dd14 + image_name: gardenlinux-1877.3 + region_name: ap-sa-2 +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/openstack-gardener_prod_usi-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_usi-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_usi-arm64.s3_metadata.yaml new file mode 100644 index 00000000..3ad68665 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/openstack-gardener_prod_usi-arm64.s3_metadata.yaml @@ -0,0 +1,141 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:59.668995' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _nocrypt +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- openstack +- multipath +- iscsi +- nvme +- gardener +- _unsigned +- _usi +paths: +- md5sum: 04ee3723056cc9dabd6dfe5f11fc9543 + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.raw + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.raw + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw +- md5sum: a546959b46742517c97154fce63166fc + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 35c701c70d40c5d649b45d863e2a58b1 + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.raw.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.raw.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .raw.log +- md5sum: ec3b6e6f59ae98e4402b18784d628bf4 + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.vmdk + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.vmdk + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk +- md5sum: 2e75ca5c271e8b0a3581cbc3a43e8685 + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: bd88cb8853ba8cfa4a1f9c85eaa76cf2 + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: a546959b46742517c97154fce63166fc + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 13f13f896480fe70c4a396abf3f3910d + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar +- md5sum: 35c701c70d40c5d649b45d863e2a58b1 + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.qcow2.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.qcow2.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2.log +- md5sum: b62eb84c44f547236258f7880d7d5bb8 + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.qcow2 + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.qcow2 + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2 +- md5sum: 35c701c70d40c5d649b45d863e2a58b1 + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.vmdk.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.vmdk.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk.log +- md5sum: f4edf3f4c607a2df56d5010b448dfd99 + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.uki + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.uki + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki +- md5sum: a546959b46742517c97154fce63166fc + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: a546959b46742517c97154fce63166fc + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 01f2e9ad67ea885c000b389ff975d373 + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.esp.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .esp.tar.log +- md5sum: 02a88030d9ec84b259be4951d2fba147 + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 01f2e9ad67ea885c000b389ff975d373 + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.uki.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.uki.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .uki.log +- md5sum: 769ae3fcfeaae3ae98cec9b96c753bcb + name: openstack-gardener_prod_usi-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstack-gardener_prod_usi-arm64-1877.3-75df9f40/openstack-gardener_prod_usi-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +platform: openstack +published_image_metadata: null +require_uefi: true +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/openstack-gardener_prod_usi-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/openstackbaremetal-gardener_prod-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/openstackbaremetal-gardener_prod-amd64.s3_metadata.yaml new file mode 100644 index 00000000..52be1a3a --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/openstackbaremetal-gardener_prod-amd64.s3_metadata.yaml @@ -0,0 +1,149 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:32.220459' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- metal +- openstackbaremetal +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: 1f623e6d600dd0a75315168c1fe08842 + name: openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 4f6ba6efbb8365a83e75dfa990081698 + name: openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 7a794e785482272717178696ac8985f5 + name: openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 3a62fe4e7d3e7eec0a403415295367de + name: openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.vmdk + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.vmdk + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk +- md5sum: c944ee1bbf956eb21c75a4e7ac0de7f0 + name: openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.qcow2.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.qcow2.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2.log +- md5sum: 6ae63b7c170876cd3956160716632daf + name: openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.qcow2 + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.qcow2 + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2 +- md5sum: f639a7d60017640477ae17bfb4958d06 + name: openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: f66eefdcb1bb890ea0655468394f9ed8 + name: openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 26a40e4d6d136cd548aff3cdd53f0a38 + name: openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 38b60b8eb5fc0419958b7e56e223b006 + name: openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.vmdk.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.vmdk.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk.log +- md5sum: bdae3f2fccc8313c1b24bcc85102b969 + name: openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +platform: openstackbaremetal +published_image_metadata: + published_openstack_images: + - image_id: 01c3ab26-5b93-4655-a743-1fef60f64b53 + image_name: gardenlinux-1877.3-baremetal + region_name: eu-de-1 + - image_id: 7488d07b-65f1-4b85-8df8-13244b895d71 + image_name: gardenlinux-1877.3-baremetal + region_name: eu-de-2 + - image_id: 1926a818-55d5-49e1-9af8-eab8450705eb + image_name: gardenlinux-1877.3-baremetal + region_name: eu-nl-1 + - image_id: 6fda686d-d2f7-4018-ab4c-1250e898197a + image_name: gardenlinux-1877.3-baremetal + region_name: la-br-1 + - image_id: a032ecc1-3bee-4d65-9f68-3e3f99e2c291 + image_name: gardenlinux-1877.3-baremetal + region_name: na-ca-1 + - image_id: d663d5f1-1b44-41af-9039-e36cc64a5920 + image_name: gardenlinux-1877.3-baremetal + region_name: na-us-1 + - image_id: 818bbfdd-4ee4-49ee-8294-dc3a3c66971f + image_name: gardenlinux-1877.3-baremetal + region_name: na-us-2 + - image_id: b154b48b-050f-48d6-997f-b6c2756079a6 + image_name: gardenlinux-1877.3-baremetal + region_name: na-us-3 + - image_id: 5992e19c-2ca2-47be-ae55-50e2fd26b662 + image_name: gardenlinux-1877.3-baremetal + region_name: ap-ae-1 + - image_id: 986403a6-e254-4689-8f81-e32dc33c9b64 + image_name: gardenlinux-1877.3-baremetal + region_name: ap-au-1 + - image_id: 0c794890-a690-4881-b0c2-39a939b020e2 + image_name: gardenlinux-1877.3-baremetal + region_name: ap-cn-1 + - image_id: f5be2c30-8e8e-4713-9e34-eb0a18922af5 + image_name: gardenlinux-1877.3-baremetal + region_name: ap-jp-1 + - image_id: 8edb20a7-f0f2-47f2-9112-faa2569c3893 + image_name: gardenlinux-1877.3-baremetal + region_name: ap-jp-2 + - image_id: dc12514b-b0a8-40dd-b756-a4d27421029c + image_name: gardenlinux-1877.3-baremetal + region_name: ap-sa-1 + - image_id: 617f5ae7-91fd-4149-b783-7a3701a5f420 + image_name: gardenlinux-1877.3-baremetal + region_name: ap-sa-2 +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/openstackbaremetal-gardener_prod-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/openstackbaremetal-gardener_prod-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/openstackbaremetal-gardener_prod-arm64.s3_metadata.yaml new file mode 100644 index 00000000..51f2492a --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/openstackbaremetal-gardener_prod-arm64.s3_metadata.yaml @@ -0,0 +1,103 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:15.543918' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- metal +- openstackbaremetal +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: 4c15b91586f2a4c123c7627a8be711b6 + name: openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.vmdk + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.vmdk + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk +- md5sum: f57c5c6e8835f07fc267c1cc28af19ca + name: openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: ebe40d9d33607ccbd9991a2e31237644 + name: openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 8ed6aa12bba6718cbf9b3b2944c2c927 + name: openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.qcow2 + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.qcow2 + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2 +- md5sum: 8eab4412b0993d5de157803a1340f825 + name: openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.vmdk.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.vmdk.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .vmdk.log +- md5sum: d8b567e70758cfb0641f960724f3b727 + name: openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: f9efa0960fd92f224b7b1169cd8c6e5b + name: openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: fa61b7fb9dcf96b859c5f3645c002fc0 + name: openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: 174417199fb77d6cdfa6f88e84653b6e + name: openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.qcow2.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.qcow2.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .qcow2.log +- md5sum: 07efb74726196db2d2c14a86f10345e3 + name: openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 6673374a016b29564778ffae08161e99 + name: openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 696beebcdb753921c8d8a2926581b67d + name: openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +platform: openstackbaremetal +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/openstackbaremetal-gardener_prod-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/vmware-gardener_prod-amd64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/vmware-gardener_prod-amd64.s3_metadata.yaml new file mode 100644 index 00000000..92bd03a9 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/vmware-gardener_prod-amd64.s3_metadata.yaml @@ -0,0 +1,104 @@ +architecture: amd64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:21.851181' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _ignite +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- vmware +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: ce07506e44032e09075df344ff8630a9 + name: vmware-gardener_prod-amd64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-amd64-1877.3-75df9f40/vmware-gardener_prod-amd64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: ce07506e44032e09075df344ff8630a9 + name: vmware-gardener_prod-amd64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-amd64-1877.3-75df9f40/vmware-gardener_prod-amd64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: a22aceb6877ad306e416c8f8554c7e73 + name: vmware-gardener_prod-amd64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-amd64-1877.3-75df9f40/vmware-gardener_prod-amd64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 1c14e3ae9722cf7144285b286d7e7d54 + name: vmware-gardener_prod-amd64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-amd64-1877.3-75df9f40/vmware-gardener_prod-amd64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: c3c14afa2a16569d414916847f504c97 + name: vmware-gardener_prod-amd64-1877.3-75df9f40.chroot.test.xml + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-amd64-1877.3-75df9f40/vmware-gardener_prod-amd64-1877.3-75df9f40.chroot.test.xml + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.xml +- md5sum: b0713bb33d29fbb27e697f5bb5666f94 + name: vmware-gardener_prod-amd64-1877.3-75df9f40.ova.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-amd64-1877.3-75df9f40/vmware-gardener_prod-amd64-1877.3-75df9f40.ova.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .ova.log +- md5sum: d5cf741f5a44079a12d8c9bd4eca1305 + name: vmware-gardener_prod-amd64-1877.3-75df9f40.ova + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-amd64-1877.3-75df9f40/vmware-gardener_prod-amd64-1877.3-75df9f40.ova + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .ova +- md5sum: ce07506e44032e09075df344ff8630a9 + name: vmware-gardener_prod-amd64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-amd64-1877.3-75df9f40/vmware-gardener_prod-amd64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 8d5e1d0bf64b49bf209b001c0f71c25f + name: vmware-gardener_prod-amd64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-amd64-1877.3-75df9f40/vmware-gardener_prod-amd64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 82fa064efdb35805324dbd2ddb44798b + name: vmware-gardener_prod-amd64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-amd64-1877.3-75df9f40/vmware-gardener_prod-amd64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: ce07506e44032e09075df344ff8630a9 + name: vmware-gardener_prod-amd64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-amd64-1877.3-75df9f40/vmware-gardener_prod-amd64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +- md5sum: bdd11d636a3bd8aa95e07ab045b8dcd9 + name: vmware-gardener_prod-amd64-1877.3-75df9f40.chroot.test.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-amd64-1877.3-75df9f40/vmware-gardener_prod-amd64-1877.3-75df9f40.chroot.test.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .chroot.test.log +platform: vmware +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/vmware-gardener_prod-amd64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/test-data/release_notes/s3_bucket_artifacts/vmware-gardener_prod-arm64.s3_metadata.yaml b/test-data/release_notes/s3_bucket_artifacts/vmware-gardener_prod-arm64.s3_metadata.yaml new file mode 100644 index 00000000..307d7ac0 --- /dev/null +++ b/test-data/release_notes/s3_bucket_artifacts/vmware-gardener_prod-arm64.s3_metadata.yaml @@ -0,0 +1,92 @@ +architecture: arm64 +base_image: null +build_committish: 75df9f401a842914563f312899ec3ce34b24515c +build_timestamp: '2025-09-08T11:13:14.069111' +gardenlinux_epoch: 1877 +logs: null +modifiers: +- log +- sap +- ssh +- _ignite +- _legacy +- _nopkg +- _prod +- _slim +- base +- server +- cloud +- vmware +- multipath +- iscsi +- nvme +- gardener +paths: +- md5sum: c84ec512620f6f85ebe3df57bd688da9 + name: vmware-gardener_prod-arm64-1877.3-75df9f40.manifest + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-arm64-1877.3-75df9f40/vmware-gardener_prod-arm64-1877.3-75df9f40.manifest + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest +- md5sum: 423ea4f9401b6055df394a38d0e70628 + name: vmware-gardener_prod-arm64-1877.3-75df9f40.tar.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-arm64-1877.3-75df9f40/vmware-gardener_prod-arm64-1877.3-75df9f40.tar.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar.log +- md5sum: 4c77dd2a8f517bddbcb4b3da476fc25d + name: vmware-gardener_prod-arm64-1877.3-75df9f40.release + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-arm64-1877.3-75df9f40/vmware-gardener_prod-arm64-1877.3-75df9f40.release + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release +- md5sum: 3495562e28ac86cfadb9ac90d1fcc590 + name: vmware-gardener_prod-arm64-1877.3-75df9f40.tar + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-arm64-1877.3-75df9f40/vmware-gardener_prod-arm64-1877.3-75df9f40.tar + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .tar +- md5sum: 821584fba8dc1bfbb104bd844128ee45 + name: vmware-gardener_prod-arm64-1877.3-75df9f40.ova + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-arm64-1877.3-75df9f40/vmware-gardener_prod-arm64-1877.3-75df9f40.ova + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .ova +- md5sum: af0895868ff45707de6a5077f0184b05 + name: vmware-gardener_prod-arm64-1877.3-75df9f40.ova.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-arm64-1877.3-75df9f40/vmware-gardener_prod-arm64-1877.3-75df9f40.ova.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .ova.log +- md5sum: ebe40d9d33607ccbd9991a2e31237644 + name: vmware-gardener_prod-arm64-1877.3-75df9f40.requirements + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-arm64-1877.3-75df9f40/vmware-gardener_prod-arm64-1877.3-75df9f40.requirements + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements +- md5sum: 423ea4f9401b6055df394a38d0e70628 + name: vmware-gardener_prod-arm64-1877.3-75df9f40.manifest.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-arm64-1877.3-75df9f40/vmware-gardener_prod-arm64-1877.3-75df9f40.manifest.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .manifest.log +- md5sum: 423ea4f9401b6055df394a38d0e70628 + name: vmware-gardener_prod-arm64-1877.3-75df9f40.requirements.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-arm64-1877.3-75df9f40/vmware-gardener_prod-arm64-1877.3-75df9f40.requirements.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .requirements.log +- md5sum: 423ea4f9401b6055df394a38d0e70628 + name: vmware-gardener_prod-arm64-1877.3-75df9f40.release.log + s3_bucket_name: gardenlinux-github-releases + s3_key: objects/vmware-gardener_prod-arm64-1877.3-75df9f40/vmware-gardener_prod-arm64-1877.3-75df9f40.release.log + sha256sum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + suffix: .release.log +platform: vmware +published_image_metadata: null +require_uefi: false +s3_bucket: gardenlinux-github-releases +s3_key: meta/singles/vmware-gardener_prod-arm64-1877.3-75df9f40 +secureboot: false +test_result: null +version: '1877.3' diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index a38dd5a2..b10fea14 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -5,6 +5,7 @@ import pytest import requests_mock from git import Repo +from moto import mock_aws from gardenlinux.apt.debsource import DebsrcFile from gardenlinux.features import CName @@ -12,9 +13,13 @@ GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, RELEASE_ID_FILE, _get_package_list, download_metadata_file, get_file_extension_for_platform, get_platform_display_name, get_platform_release_note_data, - get_variant_from_flavor, write_to_release_id_file) + get_variant_from_flavor, release_notes_changes_section, + release_notes_compare_package_versions_section, write_to_release_id_file) from gardenlinux.s3 import S3Artifacts +import boto3 # isort: skip + + GARDENLINUX_RELEASE = "1877.3" GARDENLINUX_COMMIT = "75df9f401a842914563f312899ec3ce34b24515c" GARDENLINUX_COMMIT_SHORT = GARDENLINUX_COMMIT[:8] @@ -23,6 +28,7 @@ GL_REPO_BASE_URL = "https://packages.gardenlinux.io/gardenlinux" TEST_DATA_DIR = Path(os.path.dirname(__file__)) / ".." / ".." / "test-data" / "release_notes" +S3_ARTIFACTS = TEST_DATA_DIR / "s3_bucket_artifacts" S3_DOWNLOADS_DIR = Path(os.path.dirname(__file__)) / ".." / ".." / "s3_downloads" TEST_FLAVORS = [("foo_bar_baz", "legacy"), @@ -58,11 +64,12 @@ def __new__(cls, *args, **kwargs): def downloads_dir(): os.makedirs(S3_DOWNLOADS_DIR, exist_ok=True) yield - shutil.rmtree(S3_DOWNLOADS_DIR) + # shutil.rmtree(S3_DOWNLOADS_DIR) @pytest.fixture def release_id_file(): + # this will make the file unwritable with open(RELEASE_ID_FILE, "w"): pass os.chmod(RELEASE_ID_FILE, 0) @@ -70,11 +77,13 @@ def release_id_file(): os.remove(RELEASE_ID_FILE) +@pytest.mark.skip @pytest.mark.parametrize("flavor", TEST_FLAVORS) def test_get_variant_from_flavor(flavor): assert get_variant_from_flavor(flavor[0]) == flavor[1] +@pytest.mark.skip def test_get_package_list(): gl_packages_gz = TEST_DATA_DIR / "Packages.gz" @@ -88,23 +97,28 @@ def test_get_package_list(): assert isinstance(_get_package_list(GARDENLINUX_RELEASE), DebsrcFile) +@pytest.mark.skip def test_get_platform_release_note_data_invalid_platform(): assert get_platform_release_note_data("_", "foo") is None +@pytest.mark.skip def test_get_file_extension_for_platform_invalid_platform(): assert get_file_extension_for_platform("foo") == ".raw" +@pytest.mark.skip def test_get_platform_display_name_invalid_platform(): assert get_platform_display_name("foo") == "FOO" +@pytest.mark.skip def test_write_to_release_id_file_broken_file_permissions(release_id_file): with pytest.raises(SystemExit): write_to_release_id_file(GARDENLINUX_RELEASE) +@pytest.mark.skip def test_download_metadata_file(downloads_dir): s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(GARDENLINUX_RELEASE, GARDENLINUX_COMMIT_SHORT)) @@ -116,6 +130,7 @@ def test_download_metadata_file(downloads_dir): assert (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() +@pytest.mark.skip def test_download_metadata_file_no_such_release(downloads_dir): s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) release = "0000.0" @@ -130,6 +145,7 @@ def test_download_metadata_file_no_such_release(downloads_dir): assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() +@pytest.mark.skip def test_download_metadata_file_no_such_commit(downloads_dir): s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) release = GARDENLINUX_RELEASE @@ -144,6 +160,7 @@ def test_download_metadata_file_no_such_commit(downloads_dir): assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() +@pytest.mark.skip def test_download_metadata_file_no_such_release_and_commit(downloads_dir): s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) release = "0000.0" @@ -158,6 +175,39 @@ def test_download_metadata_file_no_such_release_and_commit(downloads_dir): assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() +@pytest.mark.skip +def test_release_notes_changes_section_empty_packagelist(): + with requests_mock.Mocker(real_http=True) as m: + m.get( + f"{GLVD_BASE_URL}/patchReleaseNotes/{GARDENLINUX_RELEASE}", + text='{"packageList": []}', + status_code=200 + ) + assert release_notes_changes_section(GARDENLINUX_RELEASE) == "" + + +@pytest.mark.skip +def test_release_notes_changes_section_broken_glvd_response(): + with requests_mock.Mocker(real_http=True) as m: + m.get( + f"{GLVD_BASE_URL}/patchReleaseNotes/{GARDENLINUX_RELEASE}", + text="

    Personal Home Page

    ", + status_code=200 + ) + assert "fill this in" in release_notes_changes_section(GARDENLINUX_RELEASE) + + +@pytest.mark.skip +def test_release_notes_compare_package_versions_section_semver_is_not_recognized(): + assert release_notes_compare_package_versions_section("1.2.0", []) == "" + + +@pytest.mark.skip +def test_release_notes_compare_package_versions_section_unrecognizable_version(): + assert release_notes_compare_package_versions_section("garden.linux", []) == "" + + +@mock_aws def test_github_release_page(monkeypatch, downloads_dir): monkeypatch.setattr("gardenlinux.github.__main__.Repo", SubmoduleAsRepo) import gardenlinux.github @@ -166,10 +216,22 @@ def test_github_release_page(monkeypatch, downloads_dir): glvd_response_fixture_path = TEST_DATA_DIR / f"glvd_{GARDENLINUX_RELEASE}.json" with requests_mock.Mocker(real_http=True) as m: - with open(glvd_response_fixture_path) as resp_json: + with mock_aws(): + s3 = boto3.resource("s3", region_name="eu-central-1") + s3.create_bucket(Bucket=GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, + CreateBucketConfiguration={ + 'LocationConstraint': 'eu-central-1'}) + bucket = s3.Bucket(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + for yaml_file in S3_ARTIFACTS.glob("*.yaml"): + filename = yaml_file.name + base = filename[:-len(".s3_metadata.yaml")] + key = f"meta/singles/{base}-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}" + bucket.upload_file(str(yaml_file), key) + + resp_json = glvd_response_fixture_path.read_text() m.get( f"{GLVD_BASE_URL}/patchReleaseNotes/{GARDENLINUX_RELEASE}", - text=resp_json.read(), + text=resp_json, status_code=200 ) generated_release_notes = gardenlinux.github.create_github_release_notes( @@ -177,9 +239,8 @@ def test_github_release_page(monkeypatch, downloads_dir): GARDENLINUX_COMMIT ) - with open(release_fixture_path) as md: - release_notes_fixture = md.read() - assert generated_release_notes == release_notes_fixture + release_notes_fixture = release_fixture_path.read_text() + assert generated_release_notes == release_notes_fixture def test_upload_to_github_release_page(): From 4b4bfbac1856b00424073bad05953b687ba8fb77 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Thu, 18 Sep 2025 20:08:37 +0200 Subject: [PATCH 82/92] more tests --- tests/github/test_release_page.py | 95 ++++++++++++++++++++++++------- 1 file changed, 74 insertions(+), 21 deletions(-) diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index b10fea14..4b8580f1 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -3,6 +3,7 @@ from pathlib import Path import pytest +import requests import requests_mock from git import Repo from moto import mock_aws @@ -14,7 +15,8 @@ download_metadata_file, get_file_extension_for_platform, get_platform_display_name, get_platform_release_note_data, get_variant_from_flavor, release_notes_changes_section, - release_notes_compare_package_versions_section, write_to_release_id_file) + release_notes_compare_package_versions_section, + upload_to_github_release_page, write_to_release_id_file) from gardenlinux.s3 import S3Artifacts import boto3 # isort: skip @@ -64,7 +66,7 @@ def __new__(cls, *args, **kwargs): def downloads_dir(): os.makedirs(S3_DOWNLOADS_DIR, exist_ok=True) yield - # shutil.rmtree(S3_DOWNLOADS_DIR) + shutil.rmtree(S3_DOWNLOADS_DIR) @pytest.fixture @@ -77,13 +79,11 @@ def release_id_file(): os.remove(RELEASE_ID_FILE) -@pytest.mark.skip @pytest.mark.parametrize("flavor", TEST_FLAVORS) def test_get_variant_from_flavor(flavor): assert get_variant_from_flavor(flavor[0]) == flavor[1] -@pytest.mark.skip def test_get_package_list(): gl_packages_gz = TEST_DATA_DIR / "Packages.gz" @@ -97,28 +97,23 @@ def test_get_package_list(): assert isinstance(_get_package_list(GARDENLINUX_RELEASE), DebsrcFile) -@pytest.mark.skip def test_get_platform_release_note_data_invalid_platform(): assert get_platform_release_note_data("_", "foo") is None -@pytest.mark.skip def test_get_file_extension_for_platform_invalid_platform(): assert get_file_extension_for_platform("foo") == ".raw" -@pytest.mark.skip def test_get_platform_display_name_invalid_platform(): assert get_platform_display_name("foo") == "FOO" -@pytest.mark.skip def test_write_to_release_id_file_broken_file_permissions(release_id_file): with pytest.raises(SystemExit): write_to_release_id_file(GARDENLINUX_RELEASE) -@pytest.mark.skip def test_download_metadata_file(downloads_dir): s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(GARDENLINUX_RELEASE, GARDENLINUX_COMMIT_SHORT)) @@ -130,7 +125,6 @@ def test_download_metadata_file(downloads_dir): assert (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() -@pytest.mark.skip def test_download_metadata_file_no_such_release(downloads_dir): s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) release = "0000.0" @@ -145,7 +139,6 @@ def test_download_metadata_file_no_such_release(downloads_dir): assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() -@pytest.mark.skip def test_download_metadata_file_no_such_commit(downloads_dir): s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) release = GARDENLINUX_RELEASE @@ -160,7 +153,6 @@ def test_download_metadata_file_no_such_commit(downloads_dir): assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() -@pytest.mark.skip def test_download_metadata_file_no_such_release_and_commit(downloads_dir): s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) release = "0000.0" @@ -175,7 +167,6 @@ def test_download_metadata_file_no_such_release_and_commit(downloads_dir): assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() -@pytest.mark.skip def test_release_notes_changes_section_empty_packagelist(): with requests_mock.Mocker(real_http=True) as m: m.get( @@ -183,10 +174,10 @@ def test_release_notes_changes_section_empty_packagelist(): text='{"packageList": []}', status_code=200 ) - assert release_notes_changes_section(GARDENLINUX_RELEASE) == "" + assert release_notes_changes_section(GARDENLINUX_RELEASE) == "", \ + "Expected an empty result if GLVD returns an empty package list" -@pytest.mark.skip def test_release_notes_changes_section_broken_glvd_response(): with requests_mock.Mocker(real_http=True) as m: m.get( @@ -194,15 +185,14 @@ def test_release_notes_changes_section_broken_glvd_response(): text="

    Personal Home Page

    ", status_code=200 ) - assert "fill this in" in release_notes_changes_section(GARDENLINUX_RELEASE) + assert "fill this in" in release_notes_changes_section(GARDENLINUX_RELEASE), \ + "Expected a placeholder message to be generated if GVLD response is not valid" -@pytest.mark.skip def test_release_notes_compare_package_versions_section_semver_is_not_recognized(): - assert release_notes_compare_package_versions_section("1.2.0", []) == "" + assert release_notes_compare_package_versions_section("1.2.0", []) == "", "Semver is not supported" -@pytest.mark.skip def test_release_notes_compare_package_versions_section_unrecognizable_version(): assert release_notes_compare_package_versions_section("garden.linux", []) == "" @@ -243,5 +233,68 @@ def test_github_release_page(monkeypatch, downloads_dir): assert generated_release_notes == release_notes_fixture -def test_upload_to_github_release_page(): - pass +def test_upload_to_github_release_page_dryrun(caplog): + with requests_mock.Mocker(): + assert upload_to_github_release_page( + "gardenlinux", + "gardenlinux", + GARDENLINUX_RELEASE, + S3_DOWNLOADS_DIR / "artifact.log", + dry_run=True) is None + assert any("Dry run: would upload" in record.message for record in caplog.records), "Expected a dry‑run log entry" + + +def test_upload_to_github_release_page_needs_github_token(): + with requests_mock.Mocker(): + with pytest.raises(ValueError) as exn: + upload_to_github_release_page( + "gardenlinux", + "gardenlinux", + GARDENLINUX_RELEASE, + S3_DOWNLOADS_DIR / "artifact.log", + dry_run=False) + assert str(exn.value) == "GITHUB_TOKEN environment variable not set", \ + "Expected an exception to be raised on missing GITHUB_TOKEN environment variable" + + +def test_upload_to_github_release_page(downloads_dir, caplog): + os.environ["GITHUB_TOKEN"] = "foobarbazquux" + with requests_mock.Mocker(real_http=True) as m: + m.post( + f"https://uploads.github.com/repos/gardenlinux/gardenlinux/releases/{GARDENLINUX_RELEASE}/assets?name=artifact.log", + text="{}", + status_code=201 + ) + + with open(S3_DOWNLOADS_DIR / "artifact.log", "w") as f: + f.write("AllThePrettyLittleHorses") + upload_to_github_release_page( + "gardenlinux", + "gardenlinux", + GARDENLINUX_RELEASE, + S3_DOWNLOADS_DIR / "artifact.log", + dry_run=False) + assert any("Upload successful" in record.message for record in caplog.records), \ + "Expected an upload confirmation log entry" + + +def test_upload_to_github_release_page_failed(downloads_dir, caplog): + os.environ["GITHUB_TOKEN"] = "foobarbazquux" + with requests_mock.Mocker(real_http=True) as m: + m.post( + f"https://uploads.github.com/repos/gardenlinux/gardenlinux/releases/{GARDENLINUX_RELEASE}/assets?name=artifact.log", + text="{}", + status_code=503 + ) + + with open(S3_DOWNLOADS_DIR / "artifact.log", "w") as f: + f.write("AllThePrettyLittleHorses") + with pytest.raises(requests.exceptions.HTTPError): + upload_to_github_release_page( + "gardenlinux", + "gardenlinux", + GARDENLINUX_RELEASE, + S3_DOWNLOADS_DIR / "artifact.log", + dry_run=False) + assert any("Upload failed with status code 503:" in record.message for record in caplog.records), \ + "Expected an error HTTP status code to be logged" From fd4991c88b0c8b50de9a93a7f8484813949d1fcb Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 19 Sep 2025 09:14:19 +0200 Subject: [PATCH 83/92] more tests --- tests/github/test_release_page.py | 70 +++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 8 deletions(-) diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index 4b8580f1..561ae42e 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -12,9 +12,10 @@ from gardenlinux.features import CName from gardenlinux.github.__main__ import ( GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, RELEASE_ID_FILE, _get_package_list, - download_metadata_file, get_file_extension_for_platform, - get_platform_display_name, get_platform_release_note_data, - get_variant_from_flavor, release_notes_changes_section, + create_github_release, download_metadata_file, + get_file_extension_for_platform, get_platform_display_name, + get_platform_release_note_data, get_variant_from_flavor, + release_notes_changes_section, release_notes_compare_package_versions_section, upload_to_github_release_page, write_to_release_id_file) from gardenlinux.s3 import S3Artifacts @@ -79,6 +80,13 @@ def release_id_file(): os.remove(RELEASE_ID_FILE) +@pytest.fixture +def github_token(): + os.environ["GITHUB_TOKEN"] = "foobarbazquux" + yield + del os.environ["GITHUB_TOKEN"] + + @pytest.mark.parametrize("flavor", TEST_FLAVORS) def test_get_variant_from_flavor(flavor): assert get_variant_from_flavor(flavor[0]) == flavor[1] @@ -197,6 +205,52 @@ def test_release_notes_compare_package_versions_section_unrecognizable_version() assert release_notes_compare_package_versions_section("garden.linux", []) == "" +def test_create_github_release_needs_github_token(): + with requests_mock.Mocker(): + with pytest.raises(ValueError) as exn: + create_github_release( + "gardenlinux", + "gardenlinux", + GARDENLINUX_RELEASE, + GARDENLINUX_COMMIT, + "") + assert str(exn.value) == "GITHUB_TOKEN environment variable not set", \ + "Expected an exception to be raised on missing GITHUB_TOKEN environment variable" + + +def test_create_github_release_raise_on_failure(caplog, github_token): + with requests_mock.Mocker() as m: + with pytest.raises(requests.exceptions.HTTPError): + m.post( + "https://api.github.com/repos/gardenlinux/gardenlinux/releases", + text="{}", + status_code=503 + ) + create_github_release( + "gardenlinux", + "gardenlinux", + GARDENLINUX_RELEASE, + GARDENLINUX_COMMIT, + "") + assert any("Failed to create release" in record.message for record in caplog.records), "Expected a failure log record" + + +def test_create_github_release(caplog, github_token): + with requests_mock.Mocker() as m: + m.post( + "https://api.github.com/repos/gardenlinux/gardenlinux/releases", + text='{"id": 101}', + status_code=201 + ) + assert create_github_release( + "gardenlinux", + "gardenlinux", + GARDENLINUX_RELEASE, + GARDENLINUX_COMMIT, + "") == 101 + assert any("Release created successfully" in record.message for record in caplog.records), "Expected a success log record" + + @mock_aws def test_github_release_page(monkeypatch, downloads_dir): monkeypatch.setattr("gardenlinux.github.__main__.Repo", SubmoduleAsRepo) @@ -244,8 +298,10 @@ def test_upload_to_github_release_page_dryrun(caplog): assert any("Dry run: would upload" in record.message for record in caplog.records), "Expected a dry‑run log entry" -def test_upload_to_github_release_page_needs_github_token(): +def test_upload_to_github_release_page_needs_github_token(downloads_dir): with requests_mock.Mocker(): + with open(S3_DOWNLOADS_DIR / "artifact.log", "w") as f: + f.write("AllThePrettyLittleHorses") with pytest.raises(ValueError) as exn: upload_to_github_release_page( "gardenlinux", @@ -257,8 +313,7 @@ def test_upload_to_github_release_page_needs_github_token(): "Expected an exception to be raised on missing GITHUB_TOKEN environment variable" -def test_upload_to_github_release_page(downloads_dir, caplog): - os.environ["GITHUB_TOKEN"] = "foobarbazquux" +def test_upload_to_github_release_page(downloads_dir, caplog, github_token): with requests_mock.Mocker(real_http=True) as m: m.post( f"https://uploads.github.com/repos/gardenlinux/gardenlinux/releases/{GARDENLINUX_RELEASE}/assets?name=artifact.log", @@ -278,8 +333,7 @@ def test_upload_to_github_release_page(downloads_dir, caplog): "Expected an upload confirmation log entry" -def test_upload_to_github_release_page_failed(downloads_dir, caplog): - os.environ["GITHUB_TOKEN"] = "foobarbazquux" +def test_upload_to_github_release_page_failed(downloads_dir, caplog, github_token): with requests_mock.Mocker(real_http=True) as m: m.post( f"https://uploads.github.com/repos/gardenlinux/gardenlinux/releases/{GARDENLINUX_RELEASE}/assets?name=artifact.log", From e7fdcceaafd97d7f9632a5ae3ff0908f04143612 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 19 Sep 2025 09:23:46 +0200 Subject: [PATCH 84/92] s3 bucket mocks (no fixture for now)) --- tests/github/test_release_page.py | 117 +++++++++++++++++++----------- 1 file changed, 76 insertions(+), 41 deletions(-) diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index 561ae42e..995d7d26 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -123,56 +123,91 @@ def test_write_to_release_id_file_broken_file_permissions(release_id_file): def test_download_metadata_file(downloads_dir): - s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(GARDENLINUX_RELEASE, GARDENLINUX_COMMIT_SHORT)) - download_metadata_file(s3_artifacts, - cname.cname, - GARDENLINUX_RELEASE, - GARDENLINUX_COMMIT_SHORT, - S3_DOWNLOADS_DIR) - assert (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() - - -def test_download_metadata_file_no_such_release(downloads_dir): - s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - release = "0000.0" - commit = GARDENLINUX_COMMIT_SHORT - cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) - with pytest.raises(IndexError): + with mock_aws(): + s3 = boto3.resource("s3", region_name="eu-central-1") + s3.create_bucket(Bucket=GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, + CreateBucketConfiguration={ + 'LocationConstraint': 'eu-central-1'}) + bucket = s3.Bucket(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", + f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") + + s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(GARDENLINUX_RELEASE, GARDENLINUX_COMMIT_SHORT)) download_metadata_file(s3_artifacts, cname.cname, - release, - commit, + GARDENLINUX_RELEASE, + GARDENLINUX_COMMIT_SHORT, S3_DOWNLOADS_DIR) - assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() + assert (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() + + +def test_download_metadata_file_no_such_release(downloads_dir): + with mock_aws(): + s3 = boto3.resource("s3", region_name="eu-central-1") + s3.create_bucket(Bucket=GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, + CreateBucketConfiguration={ + 'LocationConstraint': 'eu-central-1'}) + bucket = s3.Bucket(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", + f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") + s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + release = "0000.0" + commit = GARDENLINUX_COMMIT_SHORT + cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) + with pytest.raises(IndexError): + download_metadata_file(s3_artifacts, + cname.cname, + release, + commit, + S3_DOWNLOADS_DIR) + assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() def test_download_metadata_file_no_such_commit(downloads_dir): - s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - release = GARDENLINUX_RELEASE - commit = "deadbeef" - cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) - with pytest.raises(IndexError): - download_metadata_file(s3_artifacts, - cname.cname, - release, - commit, - S3_DOWNLOADS_DIR) - assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() + with mock_aws(): + s3 = boto3.resource("s3", region_name="eu-central-1") + s3.create_bucket(Bucket=GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, + CreateBucketConfiguration={ + 'LocationConstraint': 'eu-central-1'}) + bucket = s3.Bucket(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", + f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") + + s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + release = GARDENLINUX_RELEASE + commit = "deadbeef" + cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) + with pytest.raises(IndexError): + download_metadata_file(s3_artifacts, + cname.cname, + release, + commit, + S3_DOWNLOADS_DIR) + assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() def test_download_metadata_file_no_such_release_and_commit(downloads_dir): - s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - release = "0000.0" - commit = "deadbeef" - cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) - with pytest.raises(IndexError): - download_metadata_file(s3_artifacts, - cname.cname, - release, - commit, - S3_DOWNLOADS_DIR) - assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() + with mock_aws(): + s3 = boto3.resource("s3", region_name="eu-central-1") + s3.create_bucket(Bucket=GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, + CreateBucketConfiguration={ + 'LocationConstraint': 'eu-central-1'}) + bucket = s3.Bucket(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", + f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") + + s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + release = "0000.0" + commit = "deadbeef" + cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) + with pytest.raises(IndexError): + download_metadata_file(s3_artifacts, + cname.cname, + release, + commit, + S3_DOWNLOADS_DIR) + assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() def test_release_notes_changes_section_empty_packagelist(): From 5d1a585609499bd26e25d0a2d7ed52451e72492e Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 19 Sep 2025 10:17:36 +0200 Subject: [PATCH 85/92] release_s3_bucket fixture --- tests/github/test_release_page.py | 120 ++++++++++++++---------------- 1 file changed, 56 insertions(+), 64 deletions(-) diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index 995d7d26..60e07957 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -87,6 +87,16 @@ def github_token(): del os.environ["GITHUB_TOKEN"] +@pytest.fixture +def release_s3_bucket(): + with mock_aws(): + s3 = boto3.resource("s3", region_name="eu-central-1") + s3.create_bucket(Bucket=GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, + CreateBucketConfiguration={ + 'LocationConstraint': 'eu-central-1'}) + yield s3.Bucket(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + + @pytest.mark.parametrize("flavor", TEST_FLAVORS) def test_get_variant_from_flavor(flavor): assert get_variant_from_flavor(flavor[0]) == flavor[1] @@ -142,72 +152,54 @@ def test_download_metadata_file(downloads_dir): assert (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() -def test_download_metadata_file_no_such_release(downloads_dir): - with mock_aws(): - s3 = boto3.resource("s3", region_name="eu-central-1") - s3.create_bucket(Bucket=GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, - CreateBucketConfiguration={ - 'LocationConstraint': 'eu-central-1'}) - bucket = s3.Bucket(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", - f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") - s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - release = "0000.0" - commit = GARDENLINUX_COMMIT_SHORT - cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) - with pytest.raises(IndexError): - download_metadata_file(s3_artifacts, - cname.cname, - release, - commit, - S3_DOWNLOADS_DIR) - assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() - - -def test_download_metadata_file_no_such_commit(downloads_dir): - with mock_aws(): - s3 = boto3.resource("s3", region_name="eu-central-1") - s3.create_bucket(Bucket=GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, - CreateBucketConfiguration={ - 'LocationConstraint': 'eu-central-1'}) - bucket = s3.Bucket(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", - f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") +def test_download_metadata_file_no_such_release(downloads_dir, release_s3_bucket): + release_s3_bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", + f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") + s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + release = "0000.0" + commit = GARDENLINUX_COMMIT_SHORT + cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) + with pytest.raises(IndexError): + download_metadata_file(s3_artifacts, + cname.cname, + release, + commit, + S3_DOWNLOADS_DIR) + assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() - s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - release = GARDENLINUX_RELEASE - commit = "deadbeef" - cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) - with pytest.raises(IndexError): - download_metadata_file(s3_artifacts, - cname.cname, - release, - commit, - S3_DOWNLOADS_DIR) - assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() - - -def test_download_metadata_file_no_such_release_and_commit(downloads_dir): - with mock_aws(): - s3 = boto3.resource("s3", region_name="eu-central-1") - s3.create_bucket(Bucket=GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, - CreateBucketConfiguration={ - 'LocationConstraint': 'eu-central-1'}) - bucket = s3.Bucket(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", - f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") - s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - release = "0000.0" - commit = "deadbeef" - cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) - with pytest.raises(IndexError): - download_metadata_file(s3_artifacts, - cname.cname, - release, - commit, - S3_DOWNLOADS_DIR) - assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() +def test_download_metadata_file_no_such_commit(downloads_dir, release_s3_bucket): + release_s3_bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", + f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") + + s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + release = GARDENLINUX_RELEASE + commit = "deadbeef" + cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) + with pytest.raises(IndexError): + download_metadata_file(s3_artifacts, + cname.cname, + release, + commit, + S3_DOWNLOADS_DIR) + assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() + + +def test_download_metadata_file_no_such_release_and_commit(downloads_dir, release_s3_bucket): + release_s3_bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", + f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") + + s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + release = "0000.0" + commit = "deadbeef" + cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) + with pytest.raises(IndexError): + download_metadata_file(s3_artifacts, + cname.cname, + release, + commit, + S3_DOWNLOADS_DIR) + assert not (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() def test_release_notes_changes_section_empty_packagelist(): From f43ff13ff31d546026c8c04f594e31e934f541e8 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 19 Sep 2025 10:38:13 +0200 Subject: [PATCH 86/92] DRYed tests --- tests/github/test_release_page.py | 114 +++++++++++++----------------- 1 file changed, 51 insertions(+), 63 deletions(-) diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index 60e07957..8157afbb 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -72,12 +72,10 @@ def downloads_dir(): @pytest.fixture def release_id_file(): - # this will make the file unwritable - with open(RELEASE_ID_FILE, "w"): - pass - os.chmod(RELEASE_ID_FILE, 0) + f = Path(RELEASE_ID_FILE) + f.touch(0) # this will make the file unwritable yield - os.remove(RELEASE_ID_FILE) + f.unlink() @pytest.fixture @@ -97,6 +95,14 @@ def release_s3_bucket(): yield s3.Bucket(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) +@pytest.fixture +def artifact_for_upload(downloads_dir): + artifact = S3_DOWNLOADS_DIR / "artifact.log" + artifact.touch() + yield artifact + artifact.unlink() + + @pytest.mark.parametrize("flavor", TEST_FLAVORS) def test_get_variant_from_flavor(flavor): assert get_variant_from_flavor(flavor[0]) == flavor[1] @@ -132,24 +138,18 @@ def test_write_to_release_id_file_broken_file_permissions(release_id_file): write_to_release_id_file(GARDENLINUX_RELEASE) -def test_download_metadata_file(downloads_dir): - with mock_aws(): - s3 = boto3.resource("s3", region_name="eu-central-1") - s3.create_bucket(Bucket=GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, - CreateBucketConfiguration={ - 'LocationConstraint': 'eu-central-1'}) - bucket = s3.Bucket(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", - f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") +def test_download_metadata_file(downloads_dir, release_s3_bucket): + release_s3_bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", + f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") - s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(GARDENLINUX_RELEASE, GARDENLINUX_COMMIT_SHORT)) - download_metadata_file(s3_artifacts, - cname.cname, - GARDENLINUX_RELEASE, - GARDENLINUX_COMMIT_SHORT, - S3_DOWNLOADS_DIR) - assert (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() + s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(GARDENLINUX_RELEASE, GARDENLINUX_COMMIT_SHORT)) + download_metadata_file(s3_artifacts, + cname.cname, + GARDENLINUX_RELEASE, + GARDENLINUX_COMMIT_SHORT, + S3_DOWNLOADS_DIR) + assert (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() def test_download_metadata_file_no_such_release(downloads_dir, release_s3_bucket): @@ -203,7 +203,7 @@ def test_download_metadata_file_no_such_release_and_commit(downloads_dir, releas def test_release_notes_changes_section_empty_packagelist(): - with requests_mock.Mocker(real_http=True) as m: + with requests_mock.Mocker() as m: m.get( f"{GLVD_BASE_URL}/patchReleaseNotes/{GARDENLINUX_RELEASE}", text='{"packageList": []}', @@ -214,7 +214,7 @@ def test_release_notes_changes_section_empty_packagelist(): def test_release_notes_changes_section_broken_glvd_response(): - with requests_mock.Mocker(real_http=True) as m: + with requests_mock.Mocker() as m: m.get( f"{GLVD_BASE_URL}/patchReleaseNotes/{GARDENLINUX_RELEASE}", text="

    Personal Home Page

    ", @@ -279,7 +279,7 @@ def test_create_github_release(caplog, github_token): @mock_aws -def test_github_release_page(monkeypatch, downloads_dir): +def test_github_release_page(monkeypatch, downloads_dir, release_s3_bucket): monkeypatch.setattr("gardenlinux.github.__main__.Repo", SubmoduleAsRepo) import gardenlinux.github @@ -287,60 +287,52 @@ def test_github_release_page(monkeypatch, downloads_dir): glvd_response_fixture_path = TEST_DATA_DIR / f"glvd_{GARDENLINUX_RELEASE}.json" with requests_mock.Mocker(real_http=True) as m: - with mock_aws(): - s3 = boto3.resource("s3", region_name="eu-central-1") - s3.create_bucket(Bucket=GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, - CreateBucketConfiguration={ - 'LocationConstraint': 'eu-central-1'}) - bucket = s3.Bucket(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - for yaml_file in S3_ARTIFACTS.glob("*.yaml"): - filename = yaml_file.name - base = filename[:-len(".s3_metadata.yaml")] - key = f"meta/singles/{base}-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}" - bucket.upload_file(str(yaml_file), key) - - resp_json = glvd_response_fixture_path.read_text() - m.get( - f"{GLVD_BASE_URL}/patchReleaseNotes/{GARDENLINUX_RELEASE}", - text=resp_json, - status_code=200 - ) - generated_release_notes = gardenlinux.github.create_github_release_notes( - GARDENLINUX_RELEASE, - GARDENLINUX_COMMIT - ) + for yaml_file in S3_ARTIFACTS.glob("*.yaml"): + filename = yaml_file.name + base = filename[:-len(".s3_metadata.yaml")] + key = f"meta/singles/{base}-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}" + release_s3_bucket.upload_file(str(yaml_file), key) + + resp_json = glvd_response_fixture_path.read_text() + m.get( + f"{GLVD_BASE_URL}/patchReleaseNotes/{GARDENLINUX_RELEASE}", + text=resp_json, + status_code=200 + ) + generated_release_notes = gardenlinux.github.create_github_release_notes( + GARDENLINUX_RELEASE, + GARDENLINUX_COMMIT + ) - release_notes_fixture = release_fixture_path.read_text() - assert generated_release_notes == release_notes_fixture + release_notes_fixture = release_fixture_path.read_text() + assert generated_release_notes == release_notes_fixture -def test_upload_to_github_release_page_dryrun(caplog): +def test_upload_to_github_release_page_dryrun(caplog, artifact_for_upload): with requests_mock.Mocker(): assert upload_to_github_release_page( "gardenlinux", "gardenlinux", GARDENLINUX_RELEASE, - S3_DOWNLOADS_DIR / "artifact.log", + artifact_for_upload, dry_run=True) is None assert any("Dry run: would upload" in record.message for record in caplog.records), "Expected a dry‑run log entry" -def test_upload_to_github_release_page_needs_github_token(downloads_dir): +def test_upload_to_github_release_page_needs_github_token(downloads_dir, artifact_for_upload): with requests_mock.Mocker(): - with open(S3_DOWNLOADS_DIR / "artifact.log", "w") as f: - f.write("AllThePrettyLittleHorses") with pytest.raises(ValueError) as exn: upload_to_github_release_page( "gardenlinux", "gardenlinux", GARDENLINUX_RELEASE, - S3_DOWNLOADS_DIR / "artifact.log", + artifact_for_upload, dry_run=False) assert str(exn.value) == "GITHUB_TOKEN environment variable not set", \ "Expected an exception to be raised on missing GITHUB_TOKEN environment variable" -def test_upload_to_github_release_page(downloads_dir, caplog, github_token): +def test_upload_to_github_release_page(downloads_dir, caplog, github_token, artifact_for_upload): with requests_mock.Mocker(real_http=True) as m: m.post( f"https://uploads.github.com/repos/gardenlinux/gardenlinux/releases/{GARDENLINUX_RELEASE}/assets?name=artifact.log", @@ -348,19 +340,17 @@ def test_upload_to_github_release_page(downloads_dir, caplog, github_token): status_code=201 ) - with open(S3_DOWNLOADS_DIR / "artifact.log", "w") as f: - f.write("AllThePrettyLittleHorses") upload_to_github_release_page( "gardenlinux", "gardenlinux", GARDENLINUX_RELEASE, - S3_DOWNLOADS_DIR / "artifact.log", + artifact_for_upload, dry_run=False) assert any("Upload successful" in record.message for record in caplog.records), \ "Expected an upload confirmation log entry" -def test_upload_to_github_release_page_failed(downloads_dir, caplog, github_token): +def test_upload_to_github_release_page_failed(downloads_dir, caplog, github_token, artifact_for_upload): with requests_mock.Mocker(real_http=True) as m: m.post( f"https://uploads.github.com/repos/gardenlinux/gardenlinux/releases/{GARDENLINUX_RELEASE}/assets?name=artifact.log", @@ -368,14 +358,12 @@ def test_upload_to_github_release_page_failed(downloads_dir, caplog, github_toke status_code=503 ) - with open(S3_DOWNLOADS_DIR / "artifact.log", "w") as f: - f.write("AllThePrettyLittleHorses") with pytest.raises(requests.exceptions.HTTPError): upload_to_github_release_page( "gardenlinux", "gardenlinux", GARDENLINUX_RELEASE, - S3_DOWNLOADS_DIR / "artifact.log", + artifact_for_upload, dry_run=False) assert any("Upload failed with status code 503:" in record.message for record in caplog.records), \ "Expected an error HTTP status code to be logged" From 2583ffc7c3eaef47a629f8a60e3f3154e1f3de3a Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 19 Sep 2025 10:55:31 +0200 Subject: [PATCH 87/92] more tests for gods of tests --- tests/github/test_release_page.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index 8157afbb..4ba5c863 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -73,8 +73,7 @@ def downloads_dir(): @pytest.fixture def release_id_file(): f = Path(RELEASE_ID_FILE) - f.touch(0) # this will make the file unwritable - yield + yield f f.unlink() @@ -133,9 +132,17 @@ def test_get_platform_display_name_invalid_platform(): assert get_platform_display_name("foo") == "FOO" -def test_write_to_release_id_file_broken_file_permissions(release_id_file): +def test_write_to_release_id_file(release_id_file): + write_to_release_id_file(GARDENLINUX_RELEASE) + assert release_id_file.read_text() == GARDENLINUX_RELEASE + + +def test_write_to_release_id_file_broken_file_permissions(release_id_file, caplog): + release_id_file.touch(0) # this will make the file unwritable + with pytest.raises(SystemExit): write_to_release_id_file(GARDENLINUX_RELEASE) + assert any("Could not create" in record.message for record in caplog.records), "Expected a failure log record" def test_download_metadata_file(downloads_dir, release_s3_bucket): @@ -350,6 +357,19 @@ def test_upload_to_github_release_page(downloads_dir, caplog, github_token, arti "Expected an upload confirmation log entry" +def test_upload_to_github_release_page_unreadable_artifact(downloads_dir, caplog, github_token, artifact_for_upload): + artifact_for_upload.chmod(0) + + upload_to_github_release_page( + "gardenlinux", + "gardenlinux", + GARDENLINUX_RELEASE, + artifact_for_upload, + dry_run=False) + assert any("Error reading file" in record.message for record in caplog.records), \ + "Expected an error message log entry" + + def test_upload_to_github_release_page_failed(downloads_dir, caplog, github_token, artifact_for_upload): with requests_mock.Mocker(real_http=True) as m: m.post( From b9b38519dec0929e2581b2769fd26099773cd9e6 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 19 Sep 2025 11:36:23 +0200 Subject: [PATCH 88/92] cli args-parsing tests --- tests/github/test_release_page.py | 34 +++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index 4ba5c863..dc3a30cb 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -1,5 +1,6 @@ import os import shutil +import sys from pathlib import Path import pytest @@ -8,6 +9,7 @@ from git import Repo from moto import mock_aws +import gardenlinux.github.__main__ as gh from gardenlinux.apt.debsource import DebsrcFile from gardenlinux.features import CName from gardenlinux.github.__main__ import ( @@ -387,3 +389,35 @@ def test_upload_to_github_release_page_failed(downloads_dir, caplog, github_toke dry_run=False) assert any("Upload failed with status code 503:" in record.message for record in caplog.records), \ "Expected an error HTTP status code to be logged" + + +def test_script_parse_args_wrong_command(monkeypatch, capfd): + monkeypatch.setattr(sys, "argv", ["gh", "rejoice"]) + + with pytest.raises(SystemExit): + gh.main() + captured = capfd.readouterr() + + assert "argument command: invalid choice: 'rejoice'" in captured.err, "Expected help message printed" + + +def test_script_parse_args_create_command_required_args(monkeypatch, capfd): + monkeypatch.setattr(sys, "argv", ["gh", "create", "--owner", "gardenlinux", "--repo", "gardenlinux"]) + + with pytest.raises(SystemExit): + gh.main() + captured = capfd.readouterr() + + assert "the following arguments are required: --tag, --commit" in captured.err, \ + "Expected help message on missing arguments for 'create' command" + + +def test_script_parse_args_upload_command_required_args(monkeypatch, capfd): + monkeypatch.setattr(sys, "argv", ["gh", "upload", "--owner", "gardenlinux", "--repo", "gardenlinux"]) + + with pytest.raises(SystemExit): + gh.main() + captured = capfd.readouterr() + + assert "the following arguments are required: --release_id, --file_path" in captured.err, \ + "Expected help message on missing arguments for 'upload' command" From 4702fb779c2bbc4110c175157732f155af5ff146 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Fri, 19 Sep 2025 12:07:59 +0200 Subject: [PATCH 89/92] cli tests --- tests/github/test_release_page.py | 41 +++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index dc3a30cb..9c241fc7 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -9,6 +9,7 @@ from git import Repo from moto import mock_aws +import gardenlinux import gardenlinux.github.__main__ as gh from gardenlinux.apt.debsource import DebsrcFile from gardenlinux.features import CName @@ -421,3 +422,43 @@ def test_script_parse_args_upload_command_required_args(monkeypatch, capfd): assert "the following arguments are required: --release_id, --file_path" in captured.err, \ "Expected help message on missing arguments for 'upload' command" + + +def test_script_create_dry_run(monkeypatch, capfd): + + monkeypatch.setattr(sys, "argv", ["gh", "create", "--owner", "gardenlinux", "--repo", + "gardenlinux", "--tag", GARDENLINUX_RELEASE, "--commit", GARDENLINUX_COMMIT, "--dry-run"]) + monkeypatch.setattr("gardenlinux.github.__main__.create_github_release_notes", + lambda tag, commit: f"{tag} {commit}") + + gh.main() + captured = capfd.readouterr() + + assert captured.out == f"{GARDENLINUX_RELEASE} {GARDENLINUX_COMMIT}\n", \ + "Expected dry-run create to return generated release notes text" + + +def test_script_create(monkeypatch, caplog): + monkeypatch.setattr(sys, "argv", ["gh", "create", "--owner", "gardenlinux", "--repo", + "gardenlinux", "--tag", GARDENLINUX_RELEASE, "--commit", GARDENLINUX_COMMIT]) + monkeypatch.setattr("gardenlinux.github.__main__.create_github_release_notes", + lambda tag, commit: f"{tag} {commit}") + monkeypatch.setattr("gardenlinux.github.__main__.create_github_release", + lambda a1, a2, a3, a4, a5: GARDENLINUX_RELEASE) + + gh.main() + + assert any(f"Release created with ID: {GARDENLINUX_RELEASE}" in record.message for record in caplog.records), \ + "Expected a release creation confirmation log entry" + + +def test_script_upload_dry_run(monkeypatch, capfd): + monkeypatch.setattr(sys, "argv", ["gh", "upload", "--owner", "gardenlinux", "--repo", + "gardenlinux", "--release_id", GARDENLINUX_RELEASE, "--file_path", "foo", "--dry-run"]) + monkeypatch.setattr("gardenlinux.github.__main__.upload_to_github_release_page", + lambda a1, a2, a3, a4, dry_run: print(f"dry-run: {dry_run}")) + + gh.main() + captured = capfd.readouterr() + + assert captured.out == "dry-run: True\n" From 86c819590efdd8ba28d0f4e734d5e99f44208f81 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 22 Sep 2025 11:33:29 +0200 Subject: [PATCH 90/92] extracted constants and fixtures --- tests/constants.py | 13 +++ tests/github/conftest.py | 51 ++++++++++ tests/github/test_release_page.py | 159 ++++++++++-------------------- 3 files changed, 118 insertions(+), 105 deletions(-) create mode 100644 tests/github/conftest.py diff --git a/tests/constants.py b/tests/constants.py index d1e789c4..5bf8bc44 100644 --- a/tests/constants.py +++ b/tests/constants.py @@ -1,5 +1,8 @@ # -*- coding: utf-8 -*- +import os +from pathlib import Path + from gardenlinux.git import Repository TEST_DATA_DIR = "test-data" @@ -12,6 +15,8 @@ REPO_NAME = "gardenlinux-example" CONTAINER_NAME_ZOT_EXAMPLE = f"{REGISTRY}/{REPO_NAME}" GARDENLINUX_ROOT_DIR_EXAMPLE = f"{TEST_DATA_DIR}/gardenlinux/.build" +GLVD_BASE_URL = "https://glvd.ingress.glvd.gardnlinux.shoot.canary.k8s-hana.ondemand.com/v1" +GL_REPO_BASE_URL = "https://packages.gardenlinux.io/gardenlinux" TEST_PLATFORMS = ["aws", "azure", "gcp", "openstack", "openstackbaremetal", "metal"] TEST_ARCHITECTURES = ["arm64", "amd64"] @@ -20,3 +25,11 @@ TEST_COMMIT = Repository(GL_ROOT_DIR).commit_id[:8] TEST_VERSION = "1000.0" TEST_VERSION_STABLE = "1000" + +TEST_GARDENLINUX_RELEASE = "1877.3" +TEST_GARDENLINUX_COMMIT = "75df9f401a842914563f312899ec3ce34b24515c" +TEST_GARDENLINUX_COMMIT_SHORT = TEST_GARDENLINUX_COMMIT[:8] + +TEST_DATA_DIR = Path(os.path.dirname(__file__)) / ".." / "test-data" / "release_notes" +S3_ARTIFACTS_DIR = TEST_DATA_DIR / "s3_bucket_artifacts" +S3_DOWNLOADS_DIR = Path(os.path.dirname(__file__)) / ".." / "s3_downloads" diff --git a/tests/github/conftest.py b/tests/github/conftest.py new file mode 100644 index 00000000..bfe23c1a --- /dev/null +++ b/tests/github/conftest.py @@ -0,0 +1,51 @@ +import os +import shutil +from pathlib import Path + +import boto3 +import pytest +from moto import mock_aws + +from gardenlinux.github.__main__ import ( + GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, RELEASE_ID_FILE) + +from ..constants import S3_DOWNLOADS_DIR + + +@pytest.fixture +def downloads_dir(): + os.makedirs(S3_DOWNLOADS_DIR, exist_ok=True) + yield + shutil.rmtree(S3_DOWNLOADS_DIR) + + +@pytest.fixture +def release_id_file(): + f = Path(RELEASE_ID_FILE) + yield f + f.unlink() + + +@pytest.fixture +def github_token(): + os.environ["GITHUB_TOKEN"] = "foobarbazquux" + yield + del os.environ["GITHUB_TOKEN"] + + +@pytest.fixture +def release_s3_bucket(): + with mock_aws(): + s3 = boto3.resource("s3", region_name="eu-central-1") + s3.create_bucket(Bucket=GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, + CreateBucketConfiguration={ + 'LocationConstraint': 'eu-central-1'}) + yield s3.Bucket(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) + + +@pytest.fixture +def artifact_for_upload(downloads_dir): + artifact = S3_DOWNLOADS_DIR / "artifact.log" + artifact.touch() + yield artifact + artifact.unlink() diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index 9c241fc7..d3f0ed5b 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -1,7 +1,4 @@ -import os -import shutil import sys -from pathlib import Path import pytest import requests @@ -9,12 +6,11 @@ from git import Repo from moto import mock_aws -import gardenlinux import gardenlinux.github.__main__ as gh from gardenlinux.apt.debsource import DebsrcFile from gardenlinux.features import CName from gardenlinux.github.__main__ import ( - GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, RELEASE_ID_FILE, _get_package_list, + GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, _get_package_list, create_github_release, download_metadata_file, get_file_extension_for_platform, get_platform_display_name, get_platform_release_note_data, get_variant_from_flavor, @@ -23,19 +19,11 @@ upload_to_github_release_page, write_to_release_id_file) from gardenlinux.s3 import S3Artifacts -import boto3 # isort: skip - - -GARDENLINUX_RELEASE = "1877.3" -GARDENLINUX_COMMIT = "75df9f401a842914563f312899ec3ce34b24515c" -GARDENLINUX_COMMIT_SHORT = GARDENLINUX_COMMIT[:8] - -GLVD_BASE_URL = "https://glvd.ingress.glvd.gardnlinux.shoot.canary.k8s-hana.ondemand.com/v1" -GL_REPO_BASE_URL = "https://packages.gardenlinux.io/gardenlinux" - -TEST_DATA_DIR = Path(os.path.dirname(__file__)) / ".." / ".." / "test-data" / "release_notes" -S3_ARTIFACTS = TEST_DATA_DIR / "s3_bucket_artifacts" -S3_DOWNLOADS_DIR = Path(os.path.dirname(__file__)) / ".." / ".." / "s3_downloads" +from ..constants import (GL_REPO_BASE_URL, GLVD_BASE_URL, S3_ARTIFACTS_DIR, + S3_DOWNLOADS_DIR, TEST_DATA_DIR, + TEST_GARDENLINUX_COMMIT, + TEST_GARDENLINUX_COMMIT_SHORT, + TEST_GARDENLINUX_RELEASE) TEST_FLAVORS = [("foo_bar_baz", "legacy"), ("aws-gardener_prod_trustedboot_tpm2-amd64", "legacy"), @@ -66,45 +54,6 @@ def __new__(cls, *args, **kwargs): return sr -@pytest.fixture -def downloads_dir(): - os.makedirs(S3_DOWNLOADS_DIR, exist_ok=True) - yield - shutil.rmtree(S3_DOWNLOADS_DIR) - - -@pytest.fixture -def release_id_file(): - f = Path(RELEASE_ID_FILE) - yield f - f.unlink() - - -@pytest.fixture -def github_token(): - os.environ["GITHUB_TOKEN"] = "foobarbazquux" - yield - del os.environ["GITHUB_TOKEN"] - - -@pytest.fixture -def release_s3_bucket(): - with mock_aws(): - s3 = boto3.resource("s3", region_name="eu-central-1") - s3.create_bucket(Bucket=GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME, - CreateBucketConfiguration={ - 'LocationConstraint': 'eu-central-1'}) - yield s3.Bucket(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - - -@pytest.fixture -def artifact_for_upload(downloads_dir): - artifact = S3_DOWNLOADS_DIR / "artifact.log" - artifact.touch() - yield artifact - artifact.unlink() - - @pytest.mark.parametrize("flavor", TEST_FLAVORS) def test_get_variant_from_flavor(flavor): assert get_variant_from_flavor(flavor[0]) == flavor[1] @@ -116,11 +65,11 @@ def test_get_package_list(): with requests_mock.Mocker(real_http=True) as m: with open(gl_packages_gz, 'rb') as pgz: m.get( - f"{GL_REPO_BASE_URL}/dists/{GARDENLINUX_RELEASE}/main/binary-amd64/Packages.gz", + f"{GL_REPO_BASE_URL}/dists/{TEST_GARDENLINUX_RELEASE}/main/binary-amd64/Packages.gz", body=pgz, status_code=200 ) - assert isinstance(_get_package_list(GARDENLINUX_RELEASE), DebsrcFile) + assert isinstance(_get_package_list(TEST_GARDENLINUX_RELEASE), DebsrcFile) def test_get_platform_release_note_data_invalid_platform(): @@ -136,38 +85,38 @@ def test_get_platform_display_name_invalid_platform(): def test_write_to_release_id_file(release_id_file): - write_to_release_id_file(GARDENLINUX_RELEASE) - assert release_id_file.read_text() == GARDENLINUX_RELEASE + write_to_release_id_file(TEST_GARDENLINUX_RELEASE) + assert release_id_file.read_text() == TEST_GARDENLINUX_RELEASE def test_write_to_release_id_file_broken_file_permissions(release_id_file, caplog): release_id_file.touch(0) # this will make the file unwritable with pytest.raises(SystemExit): - write_to_release_id_file(GARDENLINUX_RELEASE) + write_to_release_id_file(TEST_GARDENLINUX_RELEASE) assert any("Could not create" in record.message for record in caplog.records), "Expected a failure log record" def test_download_metadata_file(downloads_dir, release_s3_bucket): - release_s3_bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", - f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") + release_s3_bucket.upload_file(S3_ARTIFACTS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml", + f"meta/singles/aws-gardener_prod-amd64-{TEST_GARDENLINUX_RELEASE}-{TEST_GARDENLINUX_COMMIT}") s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(GARDENLINUX_RELEASE, GARDENLINUX_COMMIT_SHORT)) + cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(TEST_GARDENLINUX_RELEASE, TEST_GARDENLINUX_COMMIT_SHORT)) download_metadata_file(s3_artifacts, cname.cname, - GARDENLINUX_RELEASE, - GARDENLINUX_COMMIT_SHORT, + TEST_GARDENLINUX_RELEASE, + TEST_GARDENLINUX_COMMIT_SHORT, S3_DOWNLOADS_DIR) assert (S3_DOWNLOADS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml").exists() def test_download_metadata_file_no_such_release(downloads_dir, release_s3_bucket): - release_s3_bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", - f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") + release_s3_bucket.upload_file(S3_ARTIFACTS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml", + f"meta/singles/aws-gardener_prod-amd64-{TEST_GARDENLINUX_RELEASE}-{TEST_GARDENLINUX_COMMIT}") s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) release = "0000.0" - commit = GARDENLINUX_COMMIT_SHORT + commit = TEST_GARDENLINUX_COMMIT_SHORT cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) with pytest.raises(IndexError): download_metadata_file(s3_artifacts, @@ -179,11 +128,11 @@ def test_download_metadata_file_no_such_release(downloads_dir, release_s3_bucket def test_download_metadata_file_no_such_commit(downloads_dir, release_s3_bucket): - release_s3_bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", - f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") + release_s3_bucket.upload_file(S3_ARTIFACTS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml", + f"meta/singles/aws-gardener_prod-amd64-{TEST_GARDENLINUX_RELEASE}-{TEST_GARDENLINUX_COMMIT}") s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) - release = GARDENLINUX_RELEASE + release = TEST_GARDENLINUX_RELEASE commit = "deadbeef" cname = CName("aws-gardener_prod", "amd64", "{0}-{1}".format(release, commit)) with pytest.raises(IndexError): @@ -196,8 +145,8 @@ def test_download_metadata_file_no_such_commit(downloads_dir, release_s3_bucket) def test_download_metadata_file_no_such_release_and_commit(downloads_dir, release_s3_bucket): - release_s3_bucket.upload_file(S3_ARTIFACTS / "aws-gardener_prod-amd64.s3_metadata.yaml", - f"meta/singles/aws-gardener_prod-amd64-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}") + release_s3_bucket.upload_file(S3_ARTIFACTS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml", + f"meta/singles/aws-gardener_prod-amd64-{TEST_GARDENLINUX_RELEASE}-{TEST_GARDENLINUX_COMMIT}") s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) release = "0000.0" @@ -215,22 +164,22 @@ def test_download_metadata_file_no_such_release_and_commit(downloads_dir, releas def test_release_notes_changes_section_empty_packagelist(): with requests_mock.Mocker() as m: m.get( - f"{GLVD_BASE_URL}/patchReleaseNotes/{GARDENLINUX_RELEASE}", + f"{GLVD_BASE_URL}/patchReleaseNotes/{TEST_GARDENLINUX_RELEASE}", text='{"packageList": []}', status_code=200 ) - assert release_notes_changes_section(GARDENLINUX_RELEASE) == "", \ + assert release_notes_changes_section(TEST_GARDENLINUX_RELEASE) == "", \ "Expected an empty result if GLVD returns an empty package list" def test_release_notes_changes_section_broken_glvd_response(): with requests_mock.Mocker() as m: m.get( - f"{GLVD_BASE_URL}/patchReleaseNotes/{GARDENLINUX_RELEASE}", + f"{GLVD_BASE_URL}/patchReleaseNotes/{TEST_GARDENLINUX_RELEASE}", text="

    Personal Home Page

    ", status_code=200 ) - assert "fill this in" in release_notes_changes_section(GARDENLINUX_RELEASE), \ + assert "fill this in" in release_notes_changes_section(TEST_GARDENLINUX_RELEASE), \ "Expected a placeholder message to be generated if GVLD response is not valid" @@ -248,8 +197,8 @@ def test_create_github_release_needs_github_token(): create_github_release( "gardenlinux", "gardenlinux", - GARDENLINUX_RELEASE, - GARDENLINUX_COMMIT, + TEST_GARDENLINUX_RELEASE, + TEST_GARDENLINUX_COMMIT, "") assert str(exn.value) == "GITHUB_TOKEN environment variable not set", \ "Expected an exception to be raised on missing GITHUB_TOKEN environment variable" @@ -266,8 +215,8 @@ def test_create_github_release_raise_on_failure(caplog, github_token): create_github_release( "gardenlinux", "gardenlinux", - GARDENLINUX_RELEASE, - GARDENLINUX_COMMIT, + TEST_GARDENLINUX_RELEASE, + TEST_GARDENLINUX_COMMIT, "") assert any("Failed to create release" in record.message for record in caplog.records), "Expected a failure log record" @@ -282,8 +231,8 @@ def test_create_github_release(caplog, github_token): assert create_github_release( "gardenlinux", "gardenlinux", - GARDENLINUX_RELEASE, - GARDENLINUX_COMMIT, + TEST_GARDENLINUX_RELEASE, + TEST_GARDENLINUX_COMMIT, "") == 101 assert any("Release created successfully" in record.message for record in caplog.records), "Expected a success log record" @@ -293,25 +242,25 @@ def test_github_release_page(monkeypatch, downloads_dir, release_s3_bucket): monkeypatch.setattr("gardenlinux.github.__main__.Repo", SubmoduleAsRepo) import gardenlinux.github - release_fixture_path = TEST_DATA_DIR / f"github_release_notes_{GARDENLINUX_RELEASE}.md" - glvd_response_fixture_path = TEST_DATA_DIR / f"glvd_{GARDENLINUX_RELEASE}.json" + release_fixture_path = TEST_DATA_DIR / f"github_release_notes_{TEST_GARDENLINUX_RELEASE}.md" + glvd_response_fixture_path = TEST_DATA_DIR / f"glvd_{TEST_GARDENLINUX_RELEASE}.json" with requests_mock.Mocker(real_http=True) as m: - for yaml_file in S3_ARTIFACTS.glob("*.yaml"): + for yaml_file in S3_ARTIFACTS_DIR.glob("*.yaml"): filename = yaml_file.name base = filename[:-len(".s3_metadata.yaml")] - key = f"meta/singles/{base}-{GARDENLINUX_RELEASE}-{GARDENLINUX_COMMIT}" + key = f"meta/singles/{base}-{TEST_GARDENLINUX_RELEASE}-{TEST_GARDENLINUX_COMMIT}" release_s3_bucket.upload_file(str(yaml_file), key) resp_json = glvd_response_fixture_path.read_text() m.get( - f"{GLVD_BASE_URL}/patchReleaseNotes/{GARDENLINUX_RELEASE}", + f"{GLVD_BASE_URL}/patchReleaseNotes/{TEST_GARDENLINUX_RELEASE}", text=resp_json, status_code=200 ) generated_release_notes = gardenlinux.github.create_github_release_notes( - GARDENLINUX_RELEASE, - GARDENLINUX_COMMIT + TEST_GARDENLINUX_RELEASE, + TEST_GARDENLINUX_COMMIT ) release_notes_fixture = release_fixture_path.read_text() @@ -323,7 +272,7 @@ def test_upload_to_github_release_page_dryrun(caplog, artifact_for_upload): assert upload_to_github_release_page( "gardenlinux", "gardenlinux", - GARDENLINUX_RELEASE, + TEST_GARDENLINUX_RELEASE, artifact_for_upload, dry_run=True) is None assert any("Dry run: would upload" in record.message for record in caplog.records), "Expected a dry‑run log entry" @@ -335,7 +284,7 @@ def test_upload_to_github_release_page_needs_github_token(downloads_dir, artifac upload_to_github_release_page( "gardenlinux", "gardenlinux", - GARDENLINUX_RELEASE, + TEST_GARDENLINUX_RELEASE, artifact_for_upload, dry_run=False) assert str(exn.value) == "GITHUB_TOKEN environment variable not set", \ @@ -345,7 +294,7 @@ def test_upload_to_github_release_page_needs_github_token(downloads_dir, artifac def test_upload_to_github_release_page(downloads_dir, caplog, github_token, artifact_for_upload): with requests_mock.Mocker(real_http=True) as m: m.post( - f"https://uploads.github.com/repos/gardenlinux/gardenlinux/releases/{GARDENLINUX_RELEASE}/assets?name=artifact.log", + f"https://uploads.github.com/repos/gardenlinux/gardenlinux/releases/{TEST_GARDENLINUX_RELEASE}/assets?name=artifact.log", text="{}", status_code=201 ) @@ -353,7 +302,7 @@ def test_upload_to_github_release_page(downloads_dir, caplog, github_token, arti upload_to_github_release_page( "gardenlinux", "gardenlinux", - GARDENLINUX_RELEASE, + TEST_GARDENLINUX_RELEASE, artifact_for_upload, dry_run=False) assert any("Upload successful" in record.message for record in caplog.records), \ @@ -366,7 +315,7 @@ def test_upload_to_github_release_page_unreadable_artifact(downloads_dir, caplog upload_to_github_release_page( "gardenlinux", "gardenlinux", - GARDENLINUX_RELEASE, + TEST_GARDENLINUX_RELEASE, artifact_for_upload, dry_run=False) assert any("Error reading file" in record.message for record in caplog.records), \ @@ -376,7 +325,7 @@ def test_upload_to_github_release_page_unreadable_artifact(downloads_dir, caplog def test_upload_to_github_release_page_failed(downloads_dir, caplog, github_token, artifact_for_upload): with requests_mock.Mocker(real_http=True) as m: m.post( - f"https://uploads.github.com/repos/gardenlinux/gardenlinux/releases/{GARDENLINUX_RELEASE}/assets?name=artifact.log", + f"https://uploads.github.com/repos/gardenlinux/gardenlinux/releases/{TEST_GARDENLINUX_RELEASE}/assets?name=artifact.log", text="{}", status_code=503 ) @@ -385,7 +334,7 @@ def test_upload_to_github_release_page_failed(downloads_dir, caplog, github_toke upload_to_github_release_page( "gardenlinux", "gardenlinux", - GARDENLINUX_RELEASE, + TEST_GARDENLINUX_RELEASE, artifact_for_upload, dry_run=False) assert any("Upload failed with status code 503:" in record.message for record in caplog.records), \ @@ -427,34 +376,34 @@ def test_script_parse_args_upload_command_required_args(monkeypatch, capfd): def test_script_create_dry_run(monkeypatch, capfd): monkeypatch.setattr(sys, "argv", ["gh", "create", "--owner", "gardenlinux", "--repo", - "gardenlinux", "--tag", GARDENLINUX_RELEASE, "--commit", GARDENLINUX_COMMIT, "--dry-run"]) + "gardenlinux", "--tag", TEST_GARDENLINUX_RELEASE, "--commit", TEST_GARDENLINUX_COMMIT, "--dry-run"]) monkeypatch.setattr("gardenlinux.github.__main__.create_github_release_notes", lambda tag, commit: f"{tag} {commit}") gh.main() captured = capfd.readouterr() - assert captured.out == f"{GARDENLINUX_RELEASE} {GARDENLINUX_COMMIT}\n", \ + assert captured.out == f"{TEST_GARDENLINUX_RELEASE} {TEST_GARDENLINUX_COMMIT}\n", \ "Expected dry-run create to return generated release notes text" def test_script_create(monkeypatch, caplog): monkeypatch.setattr(sys, "argv", ["gh", "create", "--owner", "gardenlinux", "--repo", - "gardenlinux", "--tag", GARDENLINUX_RELEASE, "--commit", GARDENLINUX_COMMIT]) + "gardenlinux", "--tag", TEST_GARDENLINUX_RELEASE, "--commit", TEST_GARDENLINUX_COMMIT]) monkeypatch.setattr("gardenlinux.github.__main__.create_github_release_notes", lambda tag, commit: f"{tag} {commit}") monkeypatch.setattr("gardenlinux.github.__main__.create_github_release", - lambda a1, a2, a3, a4, a5: GARDENLINUX_RELEASE) + lambda a1, a2, a3, a4, a5: TEST_GARDENLINUX_RELEASE) gh.main() - assert any(f"Release created with ID: {GARDENLINUX_RELEASE}" in record.message for record in caplog.records), \ + assert any(f"Release created with ID: {TEST_GARDENLINUX_RELEASE}" in record.message for record in caplog.records), \ "Expected a release creation confirmation log entry" def test_script_upload_dry_run(monkeypatch, capfd): monkeypatch.setattr(sys, "argv", ["gh", "upload", "--owner", "gardenlinux", "--repo", - "gardenlinux", "--release_id", GARDENLINUX_RELEASE, "--file_path", "foo", "--dry-run"]) + "gardenlinux", "--release_id", TEST_GARDENLINUX_RELEASE, "--file_path", "foo", "--dry-run"]) monkeypatch.setattr("gardenlinux.github.__main__.upload_to_github_release_page", lambda a1, a2, a3, a4, dry_run: print(f"dry-run: {dry_run}")) From 7cc833aeecdcd9994bbf399d09d4c84d13433ecf Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 22 Sep 2025 13:55:07 +0200 Subject: [PATCH 91/92] constants names fix --- tests/constants.py | 5 +++-- tests/github/test_release_page.py | 21 +++++++++++---------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/tests/constants.py b/tests/constants.py index 5bf8bc44..4a069c6d 100644 --- a/tests/constants.py +++ b/tests/constants.py @@ -30,6 +30,7 @@ TEST_GARDENLINUX_COMMIT = "75df9f401a842914563f312899ec3ce34b24515c" TEST_GARDENLINUX_COMMIT_SHORT = TEST_GARDENLINUX_COMMIT[:8] -TEST_DATA_DIR = Path(os.path.dirname(__file__)) / ".." / "test-data" / "release_notes" -S3_ARTIFACTS_DIR = TEST_DATA_DIR / "s3_bucket_artifacts" S3_DOWNLOADS_DIR = Path(os.path.dirname(__file__)) / ".." / "s3_downloads" + +RELEASE_NOTES_TEST_DATA_DIR = Path(os.path.dirname(__file__)) / ".." / "test-data" / "release_notes" +RELEASE_NOTES_S3_ARTIFACTS_DIR = RELEASE_NOTES_TEST_DATA_DIR / "s3_bucket_artifacts" diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index d3f0ed5b..14d057e1 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -19,8 +19,9 @@ upload_to_github_release_page, write_to_release_id_file) from gardenlinux.s3 import S3Artifacts -from ..constants import (GL_REPO_BASE_URL, GLVD_BASE_URL, S3_ARTIFACTS_DIR, - S3_DOWNLOADS_DIR, TEST_DATA_DIR, +from ..constants import (GL_REPO_BASE_URL, GLVD_BASE_URL, + RELEASE_NOTES_S3_ARTIFACTS_DIR, + RELEASE_NOTES_TEST_DATA_DIR, S3_DOWNLOADS_DIR, TEST_GARDENLINUX_COMMIT, TEST_GARDENLINUX_COMMIT_SHORT, TEST_GARDENLINUX_RELEASE) @@ -60,7 +61,7 @@ def test_get_variant_from_flavor(flavor): def test_get_package_list(): - gl_packages_gz = TEST_DATA_DIR / "Packages.gz" + gl_packages_gz = RELEASE_NOTES_TEST_DATA_DIR / "Packages.gz" with requests_mock.Mocker(real_http=True) as m: with open(gl_packages_gz, 'rb') as pgz: @@ -98,7 +99,7 @@ def test_write_to_release_id_file_broken_file_permissions(release_id_file, caplo def test_download_metadata_file(downloads_dir, release_s3_bucket): - release_s3_bucket.upload_file(S3_ARTIFACTS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml", + release_s3_bucket.upload_file(RELEASE_NOTES_S3_ARTIFACTS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml", f"meta/singles/aws-gardener_prod-amd64-{TEST_GARDENLINUX_RELEASE}-{TEST_GARDENLINUX_COMMIT}") s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) @@ -112,7 +113,7 @@ def test_download_metadata_file(downloads_dir, release_s3_bucket): def test_download_metadata_file_no_such_release(downloads_dir, release_s3_bucket): - release_s3_bucket.upload_file(S3_ARTIFACTS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml", + release_s3_bucket.upload_file(RELEASE_NOTES_S3_ARTIFACTS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml", f"meta/singles/aws-gardener_prod-amd64-{TEST_GARDENLINUX_RELEASE}-{TEST_GARDENLINUX_COMMIT}") s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) release = "0000.0" @@ -128,7 +129,7 @@ def test_download_metadata_file_no_such_release(downloads_dir, release_s3_bucket def test_download_metadata_file_no_such_commit(downloads_dir, release_s3_bucket): - release_s3_bucket.upload_file(S3_ARTIFACTS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml", + release_s3_bucket.upload_file(RELEASE_NOTES_S3_ARTIFACTS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml", f"meta/singles/aws-gardener_prod-amd64-{TEST_GARDENLINUX_RELEASE}-{TEST_GARDENLINUX_COMMIT}") s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) @@ -145,7 +146,7 @@ def test_download_metadata_file_no_such_commit(downloads_dir, release_s3_bucket) def test_download_metadata_file_no_such_release_and_commit(downloads_dir, release_s3_bucket): - release_s3_bucket.upload_file(S3_ARTIFACTS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml", + release_s3_bucket.upload_file(RELEASE_NOTES_S3_ARTIFACTS_DIR / "aws-gardener_prod-amd64.s3_metadata.yaml", f"meta/singles/aws-gardener_prod-amd64-{TEST_GARDENLINUX_RELEASE}-{TEST_GARDENLINUX_COMMIT}") s3_artifacts = S3Artifacts(GARDENLINUX_GITHUB_RELEASE_BUCKET_NAME) @@ -242,11 +243,11 @@ def test_github_release_page(monkeypatch, downloads_dir, release_s3_bucket): monkeypatch.setattr("gardenlinux.github.__main__.Repo", SubmoduleAsRepo) import gardenlinux.github - release_fixture_path = TEST_DATA_DIR / f"github_release_notes_{TEST_GARDENLINUX_RELEASE}.md" - glvd_response_fixture_path = TEST_DATA_DIR / f"glvd_{TEST_GARDENLINUX_RELEASE}.json" + release_fixture_path = RELEASE_NOTES_TEST_DATA_DIR / f"github_release_notes_{TEST_GARDENLINUX_RELEASE}.md" + glvd_response_fixture_path = RELEASE_NOTES_TEST_DATA_DIR / f"glvd_{TEST_GARDENLINUX_RELEASE}.json" with requests_mock.Mocker(real_http=True) as m: - for yaml_file in S3_ARTIFACTS_DIR.glob("*.yaml"): + for yaml_file in RELEASE_NOTES_S3_ARTIFACTS_DIR.glob("*.yaml"): filename = yaml_file.name base = filename[:-len(".s3_metadata.yaml")] key = f"meta/singles/{base}-{TEST_GARDENLINUX_RELEASE}-{TEST_GARDENLINUX_COMMIT}" From 12df7e812b20dd1bc0bda343a2eef03d4a441b67 Mon Sep 17 00:00:00 2001 From: Vivus Ignis Date: Mon, 22 Sep 2025 14:51:36 +0200 Subject: [PATCH 92/92] incorporated changes from gardenlinux issue #3485 --- src/gardenlinux/github/__main__.py | 8 ++++++-- tests/github/test_release_page.py | 7 +++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/gardenlinux/github/__main__.py b/src/gardenlinux/github/__main__.py index 3780d0f7..825fbc6f 100755 --- a/src/gardenlinux/github/__main__.py +++ b/src/gardenlinux/github/__main__.py @@ -715,7 +715,7 @@ def write_to_release_id_file(release_id): sys.exit(1) -def create_github_release(owner, repo, tag, commitish, body): +def create_github_release(owner, repo, tag, commitish, latest, body): token = os.environ.get("GITHUB_TOKEN") if not token: raise ValueError("GITHUB_TOKEN environment variable not set") @@ -732,6 +732,7 @@ def create_github_release(owner, repo, tag, commitish, body): "body": body, "draft": False, "prerelease": False, + "make_latest": latest } response = requests.post( @@ -797,6 +798,7 @@ def main(): create_parser.add_argument("--repo", default="gardenlinux") create_parser.add_argument("--tag", required=True) create_parser.add_argument("--commit", required=True) + create_parser.add_argument('--latest', action='store_true', default=False) create_parser.add_argument("--dry-run", action="store_true", default=False) upload_parser = subparsers.add_parser("upload") @@ -811,10 +813,12 @@ def main(): if args.command == "create": body = create_github_release_notes(args.tag, args.commit) if args.dry_run: + print("Dry Run ...") + print("This release would be created:") print(body) else: release_id = create_github_release( - args.owner, args.repo, args.tag, args.commit, body + args.owner, args.repo, args.tag, args.commit, args.latest, body ) write_to_release_id_file(f"{release_id}") LOGGER.info(f"Release created with ID: {release_id}") diff --git a/tests/github/test_release_page.py b/tests/github/test_release_page.py index 14d057e1..a8b576ef 100644 --- a/tests/github/test_release_page.py +++ b/tests/github/test_release_page.py @@ -200,6 +200,7 @@ def test_create_github_release_needs_github_token(): "gardenlinux", TEST_GARDENLINUX_RELEASE, TEST_GARDENLINUX_COMMIT, + False, "") assert str(exn.value) == "GITHUB_TOKEN environment variable not set", \ "Expected an exception to be raised on missing GITHUB_TOKEN environment variable" @@ -218,6 +219,7 @@ def test_create_github_release_raise_on_failure(caplog, github_token): "gardenlinux", TEST_GARDENLINUX_RELEASE, TEST_GARDENLINUX_COMMIT, + False, "") assert any("Failed to create release" in record.message for record in caplog.records), "Expected a failure log record" @@ -234,6 +236,7 @@ def test_create_github_release(caplog, github_token): "gardenlinux", TEST_GARDENLINUX_RELEASE, TEST_GARDENLINUX_COMMIT, + False, "") == 101 assert any("Release created successfully" in record.message for record in caplog.records), "Expected a success log record" @@ -384,7 +387,7 @@ def test_script_create_dry_run(monkeypatch, capfd): gh.main() captured = capfd.readouterr() - assert captured.out == f"{TEST_GARDENLINUX_RELEASE} {TEST_GARDENLINUX_COMMIT}\n", \ + assert captured.out == f"Dry Run ...\nThis release would be created:\n{TEST_GARDENLINUX_RELEASE} {TEST_GARDENLINUX_COMMIT}\n", \ "Expected dry-run create to return generated release notes text" @@ -394,7 +397,7 @@ def test_script_create(monkeypatch, caplog): monkeypatch.setattr("gardenlinux.github.__main__.create_github_release_notes", lambda tag, commit: f"{tag} {commit}") monkeypatch.setattr("gardenlinux.github.__main__.create_github_release", - lambda a1, a2, a3, a4, a5: TEST_GARDENLINUX_RELEASE) + lambda a1, a2, a3, a4, a5, a6: TEST_GARDENLINUX_RELEASE) gh.main()