mirror of
https://github.com/ostreedev/ostree.git
synced 2024-12-22 17:35:55 +03:00
20d84f40fa
Skip /var test if running with systemd and libmount
155 lines
4.6 KiB
Bash
Executable File
155 lines
4.6 KiB
Bash
Executable File
#!/bin/bash -ex
|
|
|
|
this_script="${BASH_SOURCE:-$(readlink -f "$0")}"
|
|
|
|
OSTREE_PREPARE_ROOT=$(dirname "${this_script}")/../ostree-prepare-root
|
|
if [ ! -x "${OSTREE_PREPARE_ROOT}" ]; then
|
|
# ostree-prepare-root is in $libdir by default, assume we can find it
|
|
# based on our test directory, if not we'll have to skip this test.
|
|
OSTREE_PREPARE_ROOT=$(dirname "${this_script}")/../../../lib/ostree/ostree-prepare-root
|
|
if [ ! -x "${OSTREE_PREPARE_ROOT}" ]; then
|
|
OSTREE_PREPARE_ROOT=""
|
|
fi
|
|
fi
|
|
|
|
setup_bootfs() {
|
|
mkdir -p "$1/proc" "$1/bin"
|
|
|
|
# We need the real /proc mounted here so musl's realpath will work, but we
|
|
# want to be able to override /proc/cmdline, so bind mount.
|
|
mount -t proc proc "$1/proc"
|
|
|
|
echo "quiet ostree=/ostree/boot.0 ro" >"$1/override_cmdline"
|
|
mount --bind "$1/override_cmdline" "$1/proc/cmdline"
|
|
|
|
touch "$1/this_is_bootfs"
|
|
cp "${OSTREE_PREPARE_ROOT}" "$1/bin"
|
|
}
|
|
|
|
setup_rootfs() {
|
|
mkdir -p "$1/ostree/deploy/linux/deploy/1334/sysroot" \
|
|
"$1/ostree/deploy/linux/deploy/1334/var" \
|
|
"$1/ostree/deploy/linux/deploy/1334/usr" \
|
|
"$1/ostree/deploy/linux/var" \
|
|
"$1/bin"
|
|
ln -s "deploy/linux/deploy/1334" "$1/ostree/boot.0"
|
|
ln -s . "$1/sysroot"
|
|
touch "$1/ostree/deploy/linux/deploy/1334/this_is_ostree_root" \
|
|
"$1/ostree/deploy/linux/var/this_is_ostree_var" \
|
|
"$1/ostree/deploy/linux/deploy/1334/usr/this_is_ostree_usr" \
|
|
"$1/this_is_real_root"
|
|
cp /bin/busybox "$1/bin"
|
|
busybox --list | xargs -n1 -I '{}' ln -s busybox "$1/bin/{}"
|
|
cp -r "$1/bin" "$1/ostree/deploy/linux/deploy/1334/"
|
|
}
|
|
|
|
setup_overlay() {
|
|
mkdir -p "$1/ostree/deploy/linux/deploy/1334/.usr-ovl-work" \
|
|
"$1/ostree/deploy/linux/deploy/1334/.usr-ovl-upper"
|
|
}
|
|
|
|
enter_fs() {
|
|
cd "$1"
|
|
mkdir testroot
|
|
pivot_root . testroot
|
|
export PATH=$PATH:/sysroot/bin
|
|
cd /
|
|
umount -l testroot
|
|
rmdir testroot
|
|
}
|
|
|
|
find_in_env() {
|
|
tmpdir="$(mktemp -dt ostree-test-switchroot.XXXXXX)"
|
|
unshare -m <<-EOF
|
|
set -e
|
|
. "$this_script"
|
|
"$1" "$tmpdir"
|
|
enter_fs "$tmpdir"
|
|
ostree-prepare-root /sysroot
|
|
find / \( -path /proc -o -path /sysroot/proc \) -prune -o -print
|
|
touch /usr/usr_writable 2>/null \
|
|
&& echo "/usr is writable" \
|
|
|| echo "/usr is not writable"
|
|
touch /sysroot/usr/sysroot_usr_writable 2>/null \
|
|
&& echo "/sysroot/usr is writable" \
|
|
|| echo "/sysroot/usr is not writable"
|
|
EOF
|
|
(cd $tmpdir && find) >permanent_files
|
|
rm -rf "$tmpdir"
|
|
}
|
|
|
|
setup_initrd_env() {
|
|
mount -t tmpfs tmpfs "$1"
|
|
setup_bootfs "$1"
|
|
mkdir "$1/sysroot"
|
|
mount -t tmpfs tmpfs "$1/sysroot"
|
|
setup_rootfs "$1/sysroot"
|
|
}
|
|
|
|
test_that_prepare_root_sets_sysroot_up_correctly_with_initrd() {
|
|
find_in_env setup_initrd_env >files
|
|
|
|
grep -qx "/this_is_bootfs" files
|
|
grep -qx "/sysroot/this_is_ostree_root" files
|
|
grep -qx "/sysroot/sysroot/this_is_real_root" files
|
|
if ! have_systemd_and_libmount; then
|
|
grep -qx "/sysroot/var/this_is_ostree_var" files
|
|
fi
|
|
grep -qx "/sysroot/usr/this_is_ostree_usr" files
|
|
|
|
grep -qx "/sysroot/usr is not writable" files
|
|
echo "ok ostree-prepare-root sets sysroot up correctly with initrd"
|
|
}
|
|
|
|
setup_no_initrd_env() {
|
|
mount --bind "$1" "$1"
|
|
setup_rootfs "$1"
|
|
setup_bootfs "$1"
|
|
}
|
|
|
|
test_that_prepare_root_sets_root_up_correctly_with_no_initrd() {
|
|
find_in_env setup_no_initrd_env >files
|
|
|
|
grep -qx "/this_is_ostree_root" files
|
|
grep -qx "/sysroot/this_is_bootfs" files
|
|
grep -qx "/sysroot/this_is_real_root" files
|
|
if ! have_systemd_and_libmount; then
|
|
grep -qx "/var/this_is_ostree_var" files
|
|
fi
|
|
grep -qx "/usr/this_is_ostree_usr" files
|
|
|
|
grep -qx "/usr is not writable" files
|
|
echo "ok ostree-prepare-root sets root up correctly with no initrd"
|
|
}
|
|
|
|
setup_no_initrd_with_overlay() {
|
|
setup_no_initrd_env "$1"
|
|
setup_overlay "$1"
|
|
}
|
|
|
|
test_that_prepare_root_provides_overlay_over_usr_if__usr_ovl_work_exists() {
|
|
find_in_env setup_no_initrd_with_overlay >files
|
|
|
|
grep -qx "/usr is writable" files
|
|
grep -qx "./ostree/deploy/linux/deploy/1334/.usr-ovl-upper/usr_writable" permanent_files
|
|
! grep -qx "./ostree/deploy/linux/deploy/1334/usr/usr_writable" permanent_files || exit 1
|
|
echo "ok ostree-prepare-root sets root up correctly with writable usr overlay"
|
|
}
|
|
|
|
# This script sources itself so we only want to run tests if we're the parent:
|
|
if [ "${BASH_SOURCE[0]}" = "${0}" ]; then
|
|
. $(dirname $0)/libtest.sh
|
|
unshare -m true || \
|
|
skip "this test needs to set up mount namespaces, rerun as root"
|
|
[ -f /bin/busybox ] || \
|
|
skip "this test needs busybox"
|
|
|
|
[ -n "${OSTREE_PREPARE_ROOT}" ] || \
|
|
skip "this test needs ostree-prepare-root"
|
|
|
|
echo "1..3"
|
|
test_that_prepare_root_sets_sysroot_up_correctly_with_initrd
|
|
test_that_prepare_root_sets_root_up_correctly_with_no_initrd
|
|
test_that_prepare_root_provides_overlay_over_usr_if__usr_ovl_work_exists
|
|
fi
|