#!/bin/bash -efu

topdir="$(readlink -ev "$0")"
topdir="${topdir%/*/*}"

. "$topdir/testing/sh-functions"

readonly VENDOR=altlinux
readonly ARCH=x86_64
readonly IMAGE=alt:sisyphus
readonly KERNEL_FLAVOR=-std-def

. "$topdir/testing/packages-$VENDOR"

TESTNAME="$1"; shift

KICKSTART_DISKS=0
BOOT_DISKS=0
BOOT_CMDLINE=""

eval $(sed -n -e 's/^# param //p' "$topdir/testing/$TESTNAME.cfg")

readonly builddir=/srv

readonly workdir="testing/cache/$VENDOR/$TESTNAME"
readonly logdir="testing/logs/$VENDOR/$TESTNAME"
readonly statusdir="$topdir/testing/status"

readonly top_workdir="$topdir/$workdir"
readonly top_logdir="$topdir/$logdir"

prepare_testsuite

for step in "$@"; do
	case "$step" in
		build-git)
			gh_group_start "building from git tree"

			cat_exec "$top_workdir/run.sh" <<-EOF
			#!/bin/bash -efux

			apt-get -y -qq update
			apt-get -y -qq install $MAKE_INITRD_PACKAGES_DEVEL

			cd "$builddir"
			rc=0

			ALTWRAP_LLVM_VERSION="\$(
				rpmquery -a --qf='%{name}\n' llvm\*-libs |
				sed -e 's/^llvm//' -e 's/-libs//' |
				sort -g |
				tail -1
			)"
			[ -z "\$ALTWRAP_LLVM_VERSION" ] ||
				export ALTWRAP_LLVM_VERSION

			./autogen.sh
			./configure \
				--enable-local-build \
				--with-runtimedir=/lib/initrd1 || rc=\$?

			if [ "\$rc" != 0 ]; then
				echo '========================================='
				cat config.log
				exit 1
			fi

			make || rc=\$?

			if [ "\$rc" != 0 ]; then
				echo '========================================='
				cat config.log
				exit 1
			fi
			EOF

			run podman run --rm -ti \
				--volume="$topdir:$builddir" \
				"$IMAGE" "$builddir/$workdir/run.sh"

			gh_group_end
			;;
		build-sysimage)
			[ -n "${SYSIMAGE_PACKAGES-}" ] ||
				continue

			if [ -z "$(podman images -an --format='1' -f reference=localhost/mi-$VENDOR:sysimage)" ]; then
				gh_group_start "creating sysimage"

				run podman image build \
					-t "localhost/mi-$VENDOR:sysimage" \
					--pull --squash --force-rm=true \
					-f - <<-EOF
				FROM $IMAGE
				RUN \
				 printf > /etc/initrd.mk '%s\n' \
				 'AUTODETECT =' \
				 'FEATURES += compress cleanup'
				RUN rpm -ql filesystem | xargs -r mkdir -p
				RUN apt-get -y -qq update
				RUN apt-get -y -qq install $SYSIMAGE_PACKAGES $KERNEL_PACKAGES
				RUN apt-get -y -qq clean
				RUN \
				 find /lib/modules \( \
				  -path '*/kernel/drivers/bluetooth/*' -o \
				  -path '*/kernel/drivers/gpio/*' -o \
				  -path '*/kernel/drivers/gpu/*' -o \
				  -path '*/kernel/drivers/hwmon/*' -o \
				  -path '*/kernel/drivers/i2c/*' -o \
				  -path '*/kernel/drivers/iio/*' -o \
				  -path '*/kernel/drivers/infiniband/*' -o \
				  -path '*/kernel/drivers/input/joystick/*' -o \
				  -path '*/kernel/drivers/input/misc/*' -o \
				  -path '*/kernel/drivers/input/touchscreen/*' -o \
				  -path '*/kernel/drivers/isdn/*' -o \
				  -path '*/kernel/drivers/leds/*' -o \
				  -path '*/kernel/drivers/media-core/*' -o \
				  -path '*/kernel/drivers/net/*' -o \
				  -path '*/kernel/drivers/net/usb/*' -o \
				  -path '*/kernel/drivers/nfc/*' -o \
				  -path '*/kernel/drivers/power/*' -o \
				  -path '*/kernel/drivers/usb/*' -o \
				  -path '*/kernel/drivers/video/*' -o \
				  -path '*/kernel/drivers/watchdog/*' -o \
				  -path '*/kernel/sound/*' \
				  \) -delete; \
				 find /usr/share/license /usr/share/license-exception -delete; \
				 find /usr/share/locale/ -mindepth 3 -maxdepth 3 -type f -name '*.mo' -delete; \
				 find /usr/share/doc/ /usr/share/man/ /usr/share/info/ -mindepth 1 -delete; \
				 find /var/lib/apt/lists/ /var/cache/apt/ -type f -delete;
				EOF

				run podman image tag \
					"localhost/mi-$VENDOR:sysimage" \
					"localhost/mi-$VENDOR:sys"

				gh_group_end
			fi

			gh_group_start "packing sysimage"
			pack_sysimage
			gh_group_end
			;;
		build-kickstart)
			[ -n "${KICKSTART_PACKAGES-}" ] ||
				continue

			gh_group_start "creating kickstart image"

			cat_exec "$top_workdir/run.sh" <<-EOF
			#!/bin/bash -efux

			cat > /etc/initrd.mk <<EOF1
			 AUTODETECT =
			 DISABLE_FEATURES += ucode
			 FEATURES = add-modules add-udev-rules kickstart qemu rdshell modules-virtio
			 MODULES_ADD += sd_mod
			 MODULES_PRELOAD += virtio-blk virtio-scsi virtio-pci
			 KICKSTART_CONFIGS = $builddir/$workdir/ks.cfg
			 PUT_PROGS += pwgen
			EOF1

			cat > /etc/sysconfig/installkernel <<EOF1
			 INITRD_GENERATOR=make-initrd
			 MAKE_INITRD=$builddir/.build/dest/usr/sbin/make-initrd
			 MKINITRD=$builddir/.build/dest/usr/sbin/mkinitrd-make-initrd
			EOF1

			apt-get -y -qq update
			apt-get -y -qq install $KICKSTART_PACKAGES
			apt-get -y -qq install $KERNEL_PACKAGES

			cp -L /boot/vmlinuz    $builddir/$workdir/boot-ks-vmlinuz
			cp -L /boot/initrd.img $builddir/$workdir/boot-ks-initrd.img
			EOF

			podman run --rm -ti \
				--volume="$topdir:$builddir" \
				"$IMAGE" "$builddir/$workdir/run.sh"

			gh_group_end
			;;
		build-tools)
			;;
		run-kickstart)
			[ -f "$top_workdir/boot-ks-initrd.img" ] ||
				continue

			gh_group_start "creating qemu kickstart disks"

			BOOT_PROG=
			BOOT_KERNEL="$top_workdir/boot-ks-vmlinuz"
			BOOT_INITRD="$top_workdir/boot-ks-initrd.img"
			BOOT_APPEND='console=ttyS0,115200n8 quiet rdlog=console ksfile=ks.cfg'

			qemu_setup_cpu
			qemu_setup_kickstart_disks
			qemu_exec

			gh_group_end
			;;
		run-services)
			;;
		run-boot)
			gh_group_start "checking the ability to boot"

			qemu_setup_cpu
			qemu_setup_boot_disks
			qemu_exec

			gh_group_end
			;;
		*)
			fatal "unknown step: $step"
			;;
	esac
done
