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 23*5d8e7da8SJohn Snow 24d322fe2dSRobert FoleyDEFAULT_CONFIG = { 25d322fe2dSRobert Foley 'cpu' : "max", 26d322fe2dSRobert Foley 'machine' : "virt,gic-version=max", 27*5d8e7da8SJohn Snow 'install_cmds' : ( 28*5d8e7da8SJohn Snow "dnf config-manager --set-enabled powertools, " 29*5d8e7da8SJohn Snow "dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo, " 30*5d8e7da8SJohn Snow "dnf install -y make ninja-build git python38 gcc gcc-c++ flex bison "\ 31*5d8e7da8SJohn Snow "glib2-devel perl pixman-devel zlib-devel docker-ce.aarch64, " 32*5d8e7da8SJohn Snow "systemctl enable docker, " 33*5d8e7da8SJohn 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 39*5d8e7da8SJohn Snow 40d322fe2dSRobert Foleyclass CentosAarch64VM(basevm.BaseVM): 41*5d8e7da8SJohn Snow name = "centos8.aarch64" 42d322fe2dSRobert Foley arch = "aarch64" 43*5d8e7da8SJohn Snow image_name = "CentOS-Stream-GenericCloud-8-20220125.1.aarch64.qcow2" 44*5d8e7da8SJohn Snow image_link = "https://cloud.centos.org/centos/8-stream/aarch64/images/" 45d322fe2dSRobert Foley image_link += image_name 46d322fe2dSRobert Foley BUILD_SCRIPT = """ 47d322fe2dSRobert Foley set -e; 48d322fe2dSRobert Foley cd $(mktemp -d); 49*5d8e7da8SJohn Snow export SRC_ARCHIVE=/dev/vdb; 50*5d8e7da8SJohn Snow sudo chmod a+r $SRC_ARCHIVE; 51*5d8e7da8SJohn 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): 76*5d8e7da8SJohn Snow cimg = self._download_with_cache(self.image_link) 77d322fe2dSRobert Foley img_tmp = img + ".tmp" 78*5d8e7da8SJohn Snow subprocess.run(['cp', '-f', cimg, img_tmp]) 79*5d8e7da8SJohn Snow self.exec_qemu_img("resize", img_tmp, "50G") 80*5d8e7da8SJohn Snow self.boot(img_tmp, extra_args = ["-cdrom", self.gen_cloud_init_iso()]) 81d322fe2dSRobert Foley self.wait_ssh(wait_root=True) 82*5d8e7da8SJohn 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: 89*5d8e7da8SJohn Snow self.ssh_root_check(cmd) 90*5d8e7da8SJohn Snow 91d322fe2dSRobert Foley self.ssh_root("poweroff") 92*5d8e7da8SJohn Snow self.wait() 93d322fe2dSRobert Foley os.rename(img_tmp, img) 94d322fe2dSRobert Foley print("image creation complete: {}".format(img)) 95d322fe2dSRobert Foley return 0 96d322fe2dSRobert Foley 97*5d8e7da8SJohn Snow 98d322fe2dSRobert Foleyif __name__ == "__main__": 99d322fe2dSRobert Foley defaults = aarch64vm.get_config_defaults(CentosAarch64VM, DEFAULT_CONFIG) 100d322fe2dSRobert Foley sys.exit(basevm.main(CentosAarch64VM, defaults)) 101