diff --git a/testcloud/config.py b/testcloud/config.py index 16a2d63..e2dc12e 100644 --- a/testcloud/config.py +++ b/testcloud/config.py @@ -273,8 +273,8 @@ def DATA_DIR(self, value): "latest": "9", } - DEBIAN_RELEASE_MAP = {"10": "buster", "11": "bullseye", "12": "bookworm"} - DEBIAN_LATEST = "12" + DEBIAN_RELEASE_MAP = {"10": "buster", "11": "bullseye", "12": "bookworm", "13": "trixie"} + DEBIAN_LATEST = "13" DEBIAN_IMG_URL = "https://cloud.debian.org/images/cloud/%s/daily/latest/debian-%s-genericcloud-%s-daily.qcow2" UBUNTU_RELEASES_API = "https://api.launchpad.net/devel/ubuntu/series" diff --git a/testcloud/distro_utils/debian.py b/testcloud/distro_utils/debian.py index 171f176..90b5c35 100644 --- a/testcloud/distro_utils/debian.py +++ b/testcloud/distro_utils/debian.py @@ -13,7 +13,7 @@ def get_debian_image_url(version: str, arch: str) -> str: - arch_map = {"x86_64": "amd64", "aarch64": "arm64", "ppc64le": "ppc64el"} + arch_map = {"x86_64": "amd64", "aarch64": "arm64", "ppc64le": "ppc64el", "riscv64": "riscv64"} if arch not in arch_map: log.error("Requested architecture is not supported by testcloud for Debian.") diff --git a/testcloud/distro_utils/fedora.py b/testcloud/distro_utils/fedora.py index c5e6b0e..4fa727c 100644 --- a/testcloud/distro_utils/fedora.py +++ b/testcloud/distro_utils/fedora.py @@ -125,6 +125,10 @@ def get_fedora_image_url(version: str, arch: str) -> str: if version == "latest": version = str(oraculum_releases["fedora"]["stable"]) + # RISC-V image not released + if arch == "riscv64": + return "https://dl.fedoraproject.org/pub/alt/risc-v/release/42/Cloud/riscv64/images/Fedora-Cloud-Base-Generic-42.20250911-2251ba41cdd3.riscv64.qcow2" + try: releases = session.get("https://getfedora.org/releases.json").json() except (ConnectionError, requests.exceptions.JSONDecodeError): diff --git a/testcloud/domain_configuration.py b/testcloud/domain_configuration.py index e73b680..3194ebf 100644 --- a/testcloud/domain_configuration.py +++ b/testcloud/domain_configuration.py @@ -155,6 +155,37 @@ def generate(self) -> str: ) +class RISCV64ArchitectureConfiguration(ArchitectureConfiguration): + qemu = "qemu-system-riscv64" + arch = "riscv64" + model = "virt" + + def __init__(self, kvm=True, uefi=True, model="virt") -> None: + self.kvm = kvm + self.uefi = uefi + self.model = model + + def generate(self) -> str: + return """ + + hvm + {uefi_loader} + + + {cpu} + + """.format( + arch=self.arch, + model=self.model, + uefi_loader="/usr/share/edk2/riscv/RISCV_VIRT_CODE.qcow2", + cpu=( + "" + if self.kvm + else "rva23s64" + ), + ) + + def storage_device_name_generator(): prefix = "vd" for i in range(26): @@ -529,6 +560,8 @@ def _get_default_domain_conf( domain_configuration.system_architecture = Ppc64leArchitectureConfiguration(kvm=kvm, uefi=False, model="pseries") elif desired_arch == "s390x": domain_configuration.system_architecture = S390xArchitectureConfiguration(kvm=kvm, uefi=False, model="s390-ccw-virtio") + elif desired_arch == "riscv64": + domain_configuration.system_architecture = RISCV64ArchitectureConfiguration(kvm=kvm, uefi=True, model="virt") else: raise TestcloudInstanceError("Unsupported arch")