diff --git a/tests/ci/Makefile b/tests/ci/Makefile new file mode 100644 --- /dev/null +++ b/tests/ci/Makefile @@ -0,0 +1,210 @@ +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2024 The FreeBSD Foundation +# +# This software was developed by Cybermancer Infosec +# under sponsorship from the FreeBSD Foundation. +# +# Makefile for CI testing. +# +# User-driven targets: +# ci: Run CI tests. Currently only smoke tests are supported. +# ci-smokeit: Currently same as ci. +# +# Variables affecting the build process: +# TARGET/TARGET_ARCH: architecture of built release (default: same as build host) +# KERNELCONF: kernel configuration to use +# USE_QEMU: Use QEMU for testing rather than bhyve +# + +WORLDDIR?= ${.CURDIR}/../.. +RELEASEDIR= ${WORLDDIR}/release +MAKECONF?= /dev/null +SRCCONF?= /dev/null +_MEMORY!=sysctl -n hw.physmem 2>/dev/null +PARALLEL_JOBS!=sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null +TOTAL_MEMORY!=expr ${_MEMORY} / 1073741824 +KERNCONF?= GENERIC +LOCALBASE?= /usr/local + +.if !defined(TARGET) || empty(TARGET) +TARGET= ${MACHINE} +.endif +.if !defined(TARGET_ARCH) || empty(TARGET_ARCH) +.if ${TARGET} == ${MACHINE} +TARGET_ARCH= ${MACHINE_ARCH} +.else +TARGET_ARCH= ${TARGET} +.endif +.endif +IMAKE= ${MAKE} TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} + +.if defined(CROSS_TOOLCHAIN) || !empty(CROSS_TOOLCHAIN) +CROSS_TOOLCHAIN_PARAM= "CROSS_TOOLCHAIN=${CROSS_TOOLCHAIN}" +.endif + +# Define OSRELEASE by using newvers.sh +.if !defined(OSRELEASE) || empty(OSRELEASE) +.for _V in TYPE BRANCH REVISION +. if !defined(${_V}) || empty(${_V}) +${_V}!= eval $$(awk '/^${_V}=/{print}' ${.CURDIR}/../../sys/conf/newvers.sh); echo $$${_V} +. endif +.endfor +.for _V in ${TARGET_ARCH} +.if !empty(TARGET:M${_V}) +OSRELEASE= ${TYPE}-${REVISION}-${BRANCH}-${TARGET} +VOLUME_LABEL= ${REVISION:C/[.-]/_/g}_${BRANCH:C/[.-]/_/g}_${TARGET} +.else +OSRELEASE= ${TYPE}-${REVISION}-${BRANCH}-${TARGET}-${TARGET_ARCH} +VOLUME_LABEL= ${REVISION:C/[.-]/_/g}_${BRANCH:C/[.-]/_/g}_${TARGET_ARCH} +.endif +.endfor +.endif + +.if exists(${.CURDIR}/tools/ci.conf) && !defined(CICONF) +CICONF?= ${.CURDIR}/tools/ci.conf +.endif +SWAPSIZE?= 1g +VMFS?= ufs +FORMAT= raw +CIIMAGE= ci-${OSRELEASE}-${GITREV}-${KERNCONF}.${FORMAT} +VMSIZE?= 6g +CITYPE?= +TEST_VM_NAME= ci-${OSRELEASE}-${GITREV}-${KERNCONF} +.if ${TOTAL_MEMORY} >= 16 +VM_MEM!=expr ${TOTAL_MEMORY} / 2 +.elif ${TOTAL_MEMORY} >=4 +VM_MEM=${TOTAL_MEMORY} +.else +echo "Please increase the memory to at least 4GB" +exit 0 +.endif +VM_MEM_SIZE?=${VM_MEM}g +TIMEOUT_MS?=5400000 +TIMEOUT=$$((${TIMEOUT_MS} / 1000)) +TIMEOUT_EXPECT=$$((${TIMEOUT} - 60)) +TIMEOUT_VM=$$((${TIMEOUT_EXPECT} - 120)) +.if exists(${.CURDIR}/Makefile.${TARGET_ARCH}) +. include "${.CURDIR}/Makefile.${TARGET_ARCH}" +.endif +.if ${TARGET_ARCH} != ${MACHINE_ARCH} +.if ( ${TARGET_ARCH} != "i386" ) || ( ${MACHINE_ARCH} != "amd64" ) +QEMUSTATIC=/usr/local/bin/qemu-${QEMU_ARCH}-static +QEMUTGT=portinstall-qemu +.endif +.endif +QEMUTGT?= +QEMU_DEVICES?=-device virtio-blk,drive=hd0 +QEMU_EXTRA_PARAM?= +QEMU_MACHINE?=virt +QEMUBIN=/usr/local/bin/qemu-system-${QEMU_ARCH} +.if ${PARALLEL_JOBS} >= ${QEMU_MAX_CPU_COUNT} +QEMU_CPU_COUNT=${QEMU_MAX_CPU_COUNT} +.else +QEMU_CPU_COUNT=${PARALLEL_JOBS} +.endif +.if ${VM_MEM} >= ${QEMU_MAX_MEM_SIZE} +VM_MEM_SIZE=${QEMU_MAX_MEM_SIZE}g +.else +VM_MEM_SIZE=${VM_MEM}g +.endif +KLDVMMISLOADED!=kldload -q -n vmm 2>/dev/null && echo "1" || echo "0" +.if ${KLDVMMISLOADED} == "0" +USE_QEMU?=1 +.endif +KLDFILEMONISLOADED!=kldload -q -n filemon 2>/dev/null && echo "1" || echo "0" +.if ${KLDFILEMONISLOADED} == "1" +METAMODE?=-DWITH_META_MODE +.endif + +CLEANFILES= ${CIIMAGE} ci.img +CLEANDIRS= ci-buildimage + +portinstall: portinstall-pkg portinstall-qemu portinstall-expect portinstall-${TARGET_ARCH:tl} .PHONY + +portinstall-pkg: .PHONY +.if !exists(/usr/local/sbin/pkg-static) + env ASSUME_ALWAYS_YES=yes pkg bootstrap +.endif + +portinstall-qemu: portinstall-pkg .PHONY +.if !exists(/usr/local/bin/qemu-${TARGET_ARCH}-static) + env ASSUME_ALWAYS_YES=yes pkg install emulators/qemu-user-static +.endif +.if !exists(/usr/local/bin/qemu-system-${QEMU_ARCH}) + env ASSUME_ALWAYS_YES=yes pkg install emulators/qemu@nox11 +.endif + +portinstall-expect: portinstall-pkg .PHONY +.if !exists(/usr/local/bin/expect) + env ASSUME_ALWAYS_YES=yes pkg install lang/expect +.endif + +beforeclean: .PHONY + chflags -R noschg . + +.include +clean: beforeclean .PHONY + +ci-buildworld: .PHONY + ${IMAKE} -j${PARALLEL_JOBS} -C ${WORLDDIR} ${METAMODE} ${CROSS_TOOLCHAIN_PARAM} __MAKE_CONF=${MAKECONF} SRCCONF=${SRCCONF} buildworld + +ci-buildkernel: ci-buildworld-${TARGET_ARCH:tl} .PHONY + ${IMAKE} -j${PARALLEL_JOBS} -C ${WORLDDIR} ${METAMODE} ${CROSS_TOOLCHAIN_PARAM} __MAKE_CONF=${MAKECONF} SRCCONF=${SRCCONF} buildkernel + +ci-buildimage: ${QEMUTGT} ci-buildkernel-${TARGET_ARCH:tl} .PHONY + mkdir -p ${.OBJDIR}/${.TARGET} + env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} SWAPSIZE=${SWAPSIZE} \ + QEMUSTATIC=${QEMUSTATIC} CITYPE=${CITYPE} \ + ${RELEASEDIR}/scripts/mk-vmimage.sh \ + -C ${RELEASEDIR}/tools/vmimage.subr -d ${.OBJDIR}/${.TARGET} -F ${VMFS} \ + -i ${.OBJDIR}/ci.img -s ${VMSIZE} -f ${FORMAT} \ + -S ${WORLDDIR} -o ${.OBJDIR}/${CIIMAGE} -c ${CICONF} + touch ${.TARGET} + +ci-setsmokevar: .PHONY +CITYPE=smoke + +ci-runtest: ci-buildimage-${TARGET_ARCH:tl} portinstall .PHONY +.if ${MACHINE} == "amd64" && ( ${TARGET_ARCH} == "amd64" || ${TARGET_ARCH} == "i386" ) && ( !defined(USE_QEMU) || empty(USE_QEMU) ) + /usr/sbin/bhyvectl --vm=${TEST_VM_NAME} --destroy || true + /usr/sbin/bhyveload -c stdio -m ${VM_MEM_SIZE} -d ${CIIMAGE} ${TEST_VM_NAME} + expect -c "set timeout ${TIMEOUT_EXPECT}; \ + spawn /usr/bin/timeout -k 60 ${TIMEOUT_VM} /usr/sbin/bhyve \ + -c ${PARALLEL_JOBS} -m ${VM_MEM_SIZE} -A -H -P \ + -s 0:0,hostbridge \ + -s 1:0,lpc \ + -s 2:0,virtio-blk,${CIIMAGE} \ + -l com1,stdio \ + ${TEST_VM_NAME}; \ + expect { eof }" + /usr/sbin/bhyvectl --vm=${TEST_VM_NAME} --destroy +.else + timeout -k 60 ${TIMEOUT_VM} ${QEMUBIN} \ + -machine ${QEMU_MACHINE} \ + -smp ${QEMU_CPU_COUNT} \ + -m ${VM_MEM_SIZE} \ + -nographic \ + -no-reboot \ + ${QEMU_EXTRA_PARAM} \ + -drive if=none,file=${CIIMAGE},format=raw,id=hd0 \ + ${QEMU_DEVICES} +.endif + +ci-checktarget: .PHONY +.if ${TARGET_ARCH} != "aarch64" && \ + ${TARGET_ARCH} != "amd64" && \ + ${TARGET_ARCH} != "armv7" && \ + ${TARGET_ARCH} != "powerpc64" && \ + ${TARGET_ARCH} != "powerpc64le" && \ + ${TARGET_ARCH} != "riscv64" + @false +.ERROR: + @echo "Error: ${TARGET_ARCH} is not supported on ${TYPE} ${REVISION} ${BRANCH}" +.endif + +ci-smokeit: ci-setsmokevar ci-checktarget .WAIT ci-runtest-${TARGET_ARCH:tl} .PHONY + +ci: ci-smokeit .PHONY + +.include "${RELEASEDIR}/Makefile.inc1" diff --git a/tests/ci/Makefile.aarch64 b/tests/ci/Makefile.aarch64 new file mode 100644 --- /dev/null +++ b/tests/ci/Makefile.aarch64 @@ -0,0 +1,29 @@ +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2024 The FreeBSD Foundation +# +# This software was developed by Cybermancer Infosec +# under sponsorship from the FreeBSD Foundation. +# +# CI Makefile for aarch64. +# +QEMU_ARCH=aarch64 +QEMU_DEVICES=-device virtio-blk,drive=hd0 -device ahci,id=ahci +QEMU_EXTRA_PARAM=-bios /usr/local/share/u-boot/u-boot-qemu-arm64/u-boot.bin -cpu cortex-a57 +QEMU_MAX_CPU_COUNT=64 +QEMU_MAX_MEM_SIZE=64 + +portinstall-aarch64: portinstall-pkg .PHONY +.if !exists(/usr/local/share/u-boot/u-boot-qemu-arm64/u-boot.bin) + env ASSUME_ALWAYS_YES=yes pkg install sysutils/u-boot-qemu-arm64 +.endif + +# NOTE: Nothing should be changed below this line unless explicitly required. + +ci-buildworld-aarch64: ci-buildworld .PHONY + +ci-buildkernel-aarch64: ci-buildkernel .PHONY + +ci-buildimage-aarch64: ci-buildimage .PHONY + +ci-runtest-aarch64: ci-runtest .PHONY diff --git a/tests/ci/Makefile.amd64 b/tests/ci/Makefile.amd64 new file mode 100644 --- /dev/null +++ b/tests/ci/Makefile.amd64 @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2024 The FreeBSD Foundation +# +# This software was developed by Cybermancer Infosec +# under sponsorship from the FreeBSD Foundation. +# +# CI Makefile for amd64. +# +QEMU_ARCH=x86_64 +QEMU_MACHINE=q35 +QEMU_MAX_CPU_COUNT=256 +QEMU_MAX_MEM_SIZE=128 + +portinstall-amd64: portinstall-pkg .PHONY + @true + +# NOTE: Nothing should be changed below this line unless explicitly required. + +ci-buildworld-amd64: ci-buildworld .PHONY + +ci-buildkernel-amd64: ci-buildkernel .PHONY + +ci-buildimage-amd64: ci-buildimage .PHONY + +ci-runtest-amd64: ci-runtest .PHONY diff --git a/tests/ci/Makefile.armv7 b/tests/ci/Makefile.armv7 new file mode 100644 --- /dev/null +++ b/tests/ci/Makefile.armv7 @@ -0,0 +1,29 @@ +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2024 The FreeBSD Foundation +# +# This software was developed by Cybermancer Infosec +# under sponsorship from the FreeBSD Foundation. +# +# CI Makefile for armv7. +# +QEMU_ARCH=arm +QEMU_DEVICES=-device virtio-blk,drive=hd0 -device ahci,id=ahci +QEMU_EXTRA_PARAM=-bios /usr/local/share/u-boot/u-boot-qemu-arm/u-boot.bin +QEMU_MAX_CPU_COUNT=1 +QEMU_MAX_MEM_SIZE=3 + +portinstall-armv7: portinstall-pkg .PHONY +.if !exists(/usr/local/share/u-boot/u-boot-qemu-arm/u-boot.bin) + env ASSUME_ALWAYS_YES=yes pkg install sysutils/u-boot-qemu-arm +.endif + +# NOTE: Nothing should be changed below this line unless explicitly required. + +ci-buildworld-armv7: ci-buildworld .PHONY + +ci-buildkernel-armv7: ci-buildkernel .PHONY + +ci-buildimage-armv7: ci-buildimage .PHONY + +ci-runtest-armv7: ci-runtest .PHONY diff --git a/tests/ci/Makefile.powerpc64 b/tests/ci/Makefile.powerpc64 new file mode 100644 --- /dev/null +++ b/tests/ci/Makefile.powerpc64 @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2024 The FreeBSD Foundation +# +# This software was developed by Cybermancer Infosec +# under sponsorship from the FreeBSD Foundation. +# +# CI Makefile for powerpc64. +# +QEMU_ARCH=ppc64 +QEMU_DEVICES=-device virtio-blk,drive=hd0 +QEMU_EXTRA_PARAM=-vga none -accel tcg,thread=multi +QEMU_MACHINE=pseries,cap-hpt-max-page-size=16M +QEMU_MAX_CPU_COUNT=1 +QEMU_MAX_MEM_SIZE=64 + +portinstall-powerpc64: portinstall-pkg .PHONY + @true + +# NOTE: Nothing should be changed below this line unless explicitly required. + +ci-buildworld-powerpc64: ci-buildworld .PHONY + +ci-buildkernel-powerpc64: ci-buildkernel .PHONY + +ci-buildimage-powerpc64: ci-buildimage .PHONY + +ci-runtest-powerpc64: ci-runtest .PHONY diff --git a/tests/ci/Makefile.powerpc64le b/tests/ci/Makefile.powerpc64le new file mode 100644 --- /dev/null +++ b/tests/ci/Makefile.powerpc64le @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2024 The FreeBSD Foundation +# +# This software was developed by Cybermancer Infosec +# under sponsorship from the FreeBSD Foundation. +# +# CI Makefile for powerpc64le. +# +QEMU_ARCH=ppc64 +QEMU_DEVICES=-device virtio-blk,drive=hd0 +QEMU_EXTRA_PARAM=-vga none -accel tcg,thread=multi +QEMU_MACHINE=pseries,cap-hpt-max-page-size=16M +QEMU_MAX_CPU_COUNT=1 +QEMU_MAX_MEM_SIZE=64 + +portinstall-powerpc64le: portinstall-pkg .PHONY + @true + +# NOTE: Nothing should be changed below this line unless explicitly required. + +ci-buildworld-powerpc64le: ci-buildworld .PHONY + +ci-buildkernel-powerpc64le: ci-buildkernel .PHONY + +ci-buildimage-powerpc64le: ci-buildimage .PHONY + +ci-runtest-powerpc64le: ci-runtest .PHONY diff --git a/tests/ci/Makefile.riscv64 b/tests/ci/Makefile.riscv64 new file mode 100644 --- /dev/null +++ b/tests/ci/Makefile.riscv64 @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2024 The FreeBSD Foundation +# +# This software was developed by Cybermancer Infosec +# under sponsorship from the FreeBSD Foundation. +# +# CI Makefile for riscv64. +# +QEMU_ARCH=riscv64 +QEMU_DEVICES=-device virtio-blk-device,drive=hd0 +QEMU_EXTRA_PARAM=-bios /usr/local/share/opensbi/lp64/generic/firmware/fw_jump.elf -kernel /usr/local/share/u-boot/u-boot-qemu-riscv64/u-boot.bin +QEMU_MAX_CPU_COUNT=16 +QEMU_MAX_MEM_SIZE=64 + +portinstall-riscv64: portinstall-pkg .PHONY +.if !exists(/usr/local/share/opensbi/lp64/generic/firmware/fw_jump.elf) + env ASSUME_ALWAYS_YES=yes pkg install sysutils/opensbi +.endif +.if !exists(/usr/local/share/u-boot/u-boot-qemu-riscv64/u-boot.bin) + env ASSUME_ALWAYS_YES=yes pkg install sysutils/u-boot-qemu-riscv64 +.endif + +# NOTE: Nothing should be changed below this line unless explicitly required. + +ci-buildworld-riscv64: ci-buildworld .PHONY + +ci-buildkernel-riscv64: ci-buildkernel .PHONY + +ci-buildimage-riscv64: ci-buildimage .PHONY + +ci-runtest-riscv64: ci-runtest .PHONY diff --git a/tests/ci/tools/ci.conf b/tests/ci/tools/ci.conf new file mode 100644 --- /dev/null +++ b/tests/ci/tools/ci.conf @@ -0,0 +1,96 @@ +#!/bin/sh +# +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2024 The FreeBSD Foundation +# +# This software was developed by Cybermancer Infosec +# under sponsorship from the FreeBSD Foundation. +# +# Set to a list of third-party software to enable in rc.conf(5). +export VM_RC_LIST="auditd freebsdci" + +if [ "${CITYPE}" != "smoke" ]; then +export VM_EXTRA_PACKAGES="coreutils devel/py-pytest gdb jq ksh93 net/py-dpkt net/scapy nist-kat nmap perl5 python python3 sudo tcptestsuite" + + if [ "${TARGET}" = "amd64" ]; then + export VM_EXTRA_PACKAGES="${VM_EXTRA_PACKAGES} linux-c7-ltp" + fi +fi + +vm_extra_pre_umount() { +cat << EOF >> ${DESTDIR}/boot/loader.conf +autoboot_delay=1 +beastie_disable="YES" +loader_logo="none" +console="comconsole,vidconsole" +net.fibs=3 +net.inet.ip.fw.default_to_accept=1 +mac_bsdextended_load="YES" +vfs.zfs.arc_max=4294967296 +kern.vty=sc +EOF +cat << EOF >> ${DESTDIR}/etc/kyua/kyua.conf +test_suites.FreeBSD.ci = 'true' +test_suites.FreeBSD.fibs = '1 2' +test_suites.FreeBSD.allow_sysctl_side_effects = '1' +test_suites.FreeBSD.cam_test_device = '/dev/ada0' +test_suites.FreeBSD.disks = '/dev/vtbd2 /dev/vtbd3 /dev/vtbd4 /dev/vtbd5 /dev/vtbd6' +EOF +cat << EOF >> ${DESTDIR}/etc/rc.conf +kld_list="" # Load modules needed by tests +kld_list="${kld_list} blake2" # sys/opencrypto +kld_list="${kld_list} cryptodev" # sys/opencrypto +kld_list="${kld_list} fusefs" # sys/fs/fusefs +kld_list="${kld_list} ipsec" # sys/netipsec +kld_list="${kld_list} mac_portacl" # sys/mac/portacl +kld_list="${kld_list} mqueuefs" # sys/kern/mqueue_test +kld_list="${kld_list} pfsync" # sys/netpfil/pf (loads pf) +kld_list="${kld_list} pflog" # sys/netpfil/pf +kld_list="${kld_list} ipl" # sys/sbin/ipf (loads ipfilter) +kld_list="${kld_list} ipfw" # sys/netpfil/ipfw (loads ipfw) +kld_list="${kld_list} ipfw_nat" # sys/netpfil/ipfw (loads ipfw_nat) +kld_list="${kld_list} ipdivert" # sys/netinet (loads ipdivert) +kld_list="${kld_list} dummynet" # sys/netpfil/common +kld_list="${kld_list} carp" # sys/netinet/carp +kld_list="${kld_list} if_stf" # sys/net/if_stf +background_fsck="NO" +sendmail_enable="NONE" +cron_enable="NO" +syslogd_enable="NO" +newsyslog_enable="NO" +EOF +if [ "${CITYPE}" = "smoke" ]; then +cat << EOF >> ${DESTDIR}/etc/rc.conf +freebsdci_type="smoke" +EOF +fi +cat << EOF >> ${DESTDIR}/etc/sysctl.conf +kern.cryptodevallowsoft=1 +kern.ipc.tls.enable=1 +net.add_addr_allfibs=0 +security.mac.bsdextended.enabled=0 +vfs.aio.enable_unsafe=1 +vfs.usermount=1 +EOF +cat << EOF >> ${DESTDIR}/etc/fstab +fdesc /dev/fd fdescfs rw 0 0 +EOF + mkdir -p ${DESTDIR}/usr/local/etc/rc.d + echo $scriptdir + cp -p ${scriptdir}/../../tests/ci/tools/freebsdci ${DESTDIR}/usr/local/etc/rc.d/ + touch ${DESTDIR}/firstboot + + return 0 +} + +vm_extra_pkg_rmcache() { + if [ -e ${DESTDIR}/usr/local/sbin/pkg ]; then + mount -t devfs devfs ${DESTDIR}/dev + chroot ${DESTDIR} ${EMULATOR} env ASSUME_ALWAYS_YES=yes \ + /usr/local/sbin/pkg clean -a + umount_loop ${DESTDIR}/dev + fi + + return 0 +} diff --git a/tests/ci/tools/freebsdci b/tests/ci/tools/freebsdci new file mode 100755 --- /dev/null +++ b/tests/ci/tools/freebsdci @@ -0,0 +1,90 @@ +#!/bin/sh +# +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2024 The FreeBSD Foundation +# +# This software was developed by Cybermancer Infosec +# under sponsorship from the FreeBSD Foundation. +# +# PROVIDE: freebsdci +# REQUIRE: LOGIN FILESYSTEMS +# KEYWORD: firstboot + +# This script is used to run the firstboot CI tests on the first boot of a +# FreeBSD image. It is automatically disabled after the first boot. +# +# The script will run the firstboot CI tests and then shut down the system. +# The tests are run in the foreground so that the system can shut down +# immediately after the tests are finished. +# +# Default test types are full and smoke. To run only the smoke tests, set +# freebsdci_type="smoke" in /etc/rc.conf.local or /etc/rc.conf. +# To run only the full tests, set freebsdci_type="full" in +# /etc/rc.conf.local or /etc/rc.conf. + +. /etc/rc.subr + +: ${freebsdci_enable:="NO"} + +name="freebsdci" +desc="Run FreeBSD CI" +rcvar=freebsdci_enable +start_cmd="firstboot_ci_run" +stop_cmd=":" +os_arch=$(uname -p) + +auto_shutdown() +{ + # XXX: Currently RISC-V kernels lack the ability to + # make qemu exit on shutdown. Reboot instead; + # it makes qemu exit too. + case "$os_arch" in + riscv64) + shutdown -r now + ;; + *) + shutdown -p now + ;; + esac +} + +smoke_tests() +{ + echo + echo "--------------------------------------------------------------" + echo "BUILD sequence COMPLETED" + echo "IMAGE sequence COMPLETED" + echo "BOOT sequence COMPLETED" + echo "INITIATING system SHUTDOWN" + echo "--------------------------------------------------------------" +} + +full_tests() +{ + # Currently this is a placeholder. + # This will be used to add the full tests scenario those are run in + # the CI system + echo + echo "--------------------------------------------------------------" + echo "BUILD sequence COMPLETED" + echo "IMAGE sequence COMPLETED" + echo "BOOT sequence COMPLETED" + echo "TEST sequence STARTED" + echo "TEST sequence COMPLETED" + echo "INITIATING system SHUTDOWN" + echo "--------------------------------------------------------------" +} + +firstboot_ci_run() +{ + if [ "$freebsdci_type" = "smoke" ]; then + smoke_tests + elif [ "$freebsdci_type" = "full" ]; then + full_tests + fi + auto_shutdown +} + +load_rc_config $name +run_rc_command "$1"