1d322fe2dSRobert Foley#!/usr/bin/env python3 2d322fe2dSRobert Foley# 3d322fe2dSRobert Foley# Centos aarch64 image 4d322fe2dSRobert Foley# 5d322fe2dSRobert Foley# Copyright 2020 Linaro 6d322fe2dSRobert Foley# 7d322fe2dSRobert Foley# Authors: 8d322fe2dSRobert Foley# Robert Foley <robert.foley@linaro.org> 9d322fe2dSRobert Foley# Originally based on ubuntu.aarch64 10d322fe2dSRobert Foley# 11d322fe2dSRobert Foley# This code is licensed under the GPL version 2 or later. See 12d322fe2dSRobert Foley# the COPYING file in the top-level directory. 13d322fe2dSRobert Foley# 14d322fe2dSRobert Foley 15d322fe2dSRobert Foleyimport os 16d322fe2dSRobert Foleyimport sys 17d322fe2dSRobert Foleyimport subprocess 18d322fe2dSRobert Foleyimport basevm 19d322fe2dSRobert Foleyimport time 20d322fe2dSRobert Foleyimport traceback 21d322fe2dSRobert Foleyimport aarch64vm 22d322fe2dSRobert Foley 235d8e7da8SJohn Snow 24d322fe2dSRobert FoleyDEFAULT_CONFIG = { 25d322fe2dSRobert Foley 'cpu' : "max", 26d322fe2dSRobert Foley 'machine' : "virt,gic-version=max", 275d8e7da8SJohn Snow 'install_cmds' : ( 28*5ed4e5a1SAlex Bennée "dnf config-manager --enable crb, " 295d8e7da8SJohn Snow "dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo, " 30*5ed4e5a1SAlex Bennée "dnf install -y make ninja-build git python3 gcc gcc-c++ flex bison "\ 317a6e869cSMarc-André Lureau "glib2-devel pixman-devel zlib-devel docker-ce.aarch64, " 325d8e7da8SJohn Snow "systemctl enable docker, " 335d8e7da8SJohn Snow ), 34d322fe2dSRobert Foley # We increase beyond the default time since during boot 35d322fe2dSRobert Foley # it can take some time (many seconds) to log into the VM. 36d322fe2dSRobert Foley 'ssh_timeout' : 60, 37d322fe2dSRobert Foley} 38d322fe2dSRobert Foley 395d8e7da8SJohn Snow 40d322fe2dSRobert Foleyclass CentosAarch64VM(basevm.BaseVM): 41*5ed4e5a1SAlex Bennée name = "centos9.aarch64" 42d322fe2dSRobert Foley arch = "aarch64" 43*5ed4e5a1SAlex Bennée image_name = "CentOS-Stream-GenericCloud-9-20230501.0.aarch64.qcow2" 44*5ed4e5a1SAlex Bennée image_link = "https://cloud.centos.org/centos/9-stream/aarch64/images/" 45d322fe2dSRobert Foley image_link += image_name 46d322fe2dSRobert Foley BUILD_SCRIPT = """ 47d322fe2dSRobert Foley set -e; 48d322fe2dSRobert Foley cd $(mktemp -d); 495d8e7da8SJohn Snow export SRC_ARCHIVE=/dev/vdb; 505d8e7da8SJohn Snow sudo chmod a+r $SRC_ARCHIVE; 515d8e7da8SJohn Snow tar -xf $SRC_ARCHIVE; 52d322fe2dSRobert Foley ./configure {configure_opts}; 53d322fe2dSRobert Foley make --output-sync {target} -j{jobs} {verbose}; 54d322fe2dSRobert Foley """ 55d322fe2dSRobert Foley 56d322fe2dSRobert Foley def boot(self, img, extra_args=None): 57d322fe2dSRobert Foley aarch64vm.create_flash_images(self._tmpdir, self._efi_aarch64) 58d322fe2dSRobert Foley default_args = aarch64vm.get_pflash_args(self._tmpdir) 59d322fe2dSRobert Foley if extra_args: 60d322fe2dSRobert Foley extra_args.extend(default_args) 61d322fe2dSRobert Foley else: 62d322fe2dSRobert Foley extra_args = default_args 63d322fe2dSRobert Foley # We always add these performance tweaks 64d322fe2dSRobert Foley # because without them, we boot so slowly that we 65d322fe2dSRobert Foley # can time out finding the boot efi device. 66d322fe2dSRobert Foley if '-smp' not in extra_args and \ 67d322fe2dSRobert Foley '-smp' not in self._config['extra_args'] and \ 68d322fe2dSRobert Foley '-smp' not in self._args: 69d322fe2dSRobert Foley # Only add if not already there to give caller option to change it. 70d322fe2dSRobert Foley extra_args.extend(["-smp", "8"]) 71d322fe2dSRobert Foley # We have overridden boot() since aarch64 has additional parameters. 72d322fe2dSRobert Foley # Call down to the base class method. 73d322fe2dSRobert Foley super(CentosAarch64VM, self).boot(img, extra_args=extra_args) 74d322fe2dSRobert Foley 75d322fe2dSRobert Foley def build_image(self, img): 765d8e7da8SJohn Snow cimg = self._download_with_cache(self.image_link) 77d322fe2dSRobert Foley img_tmp = img + ".tmp" 785d8e7da8SJohn Snow subprocess.run(['cp', '-f', cimg, img_tmp]) 795d8e7da8SJohn Snow self.exec_qemu_img("resize", img_tmp, "50G") 805d8e7da8SJohn Snow self.boot(img_tmp, extra_args = ["-cdrom", self.gen_cloud_init_iso()]) 81d322fe2dSRobert Foley self.wait_ssh(wait_root=True) 825d8e7da8SJohn Snow self.ssh_root_check("touch /etc/cloud/cloud-init.disabled") 83d322fe2dSRobert Foley 84d322fe2dSRobert Foley # If the user chooses *not* to do the second phase, 85d322fe2dSRobert Foley # then we will jump right to the graceful shutdown 86d322fe2dSRobert Foley if self._config['install_cmds'] != "": 87d322fe2dSRobert Foley install_cmds = self._config['install_cmds'].split(',') 88d322fe2dSRobert Foley for cmd in install_cmds: 895d8e7da8SJohn Snow self.ssh_root_check(cmd) 905d8e7da8SJohn Snow 91d322fe2dSRobert Foley self.ssh_root("poweroff") 925d8e7da8SJohn Snow self.wait() 93d322fe2dSRobert Foley os.rename(img_tmp, img) 94d322fe2dSRobert Foley print("image creation complete: {}".format(img)) 95d322fe2dSRobert Foley return 0 96d322fe2dSRobert Foley 975d8e7da8SJohn Snow 98d322fe2dSRobert Foleyif __name__ == "__main__": 99d322fe2dSRobert Foley defaults = aarch64vm.get_config_defaults(CentosAarch64VM, DEFAULT_CONFIG) 100d322fe2dSRobert Foley sys.exit(basevm.main(CentosAarch64VM, defaults)) 101