#!/usr/bin/env bash
# Cluster-adapted inittest for running test/shell/ scripts on cluster VMs
# with real devices. Replaces test/lib/inittest.sh.

initskip() {
	[[ $# -eq 0 ]] || echo "TEST SKIPPED:" "$@"
	exit 200
}

# Parse command line options (same flags as original inittest.sh)
SKIP_WITH_LVMLOCKD=${SKIP_WITH_LVMLOCKD:-0}
SKIP_WITH_LVMPOLLD=${SKIP_WITH_LVMPOLLD:-0}
SKIP_WITH_DEVICES_FILE=${SKIP_WITH_DEVICES_FILE:-0}
REQUIRE_EXTENDED=1
REQUIRE_MULTI_HOST=1
REQUIRE_IDM_FAILURE=1
REQUIRE_LOCK_TYPE_IDM=1
REQUIRE_LOCK_TYPE_DLM=1
REQUIRE_LOCK_TYPE_SANLOCK=1
while [[ "$#" -gt 0 ]]; do
	case "$1" in
		--skip-root-dm-check)
			;;
		--skip-with-devices-file)
			SKIP_WITH_DEVICES_FILE=1
			;;
		--skip-with-lvmpolld)
			SKIP_WITH_LVMPOLLD=1
			;;
		--skip-with-lvmlockd)
			SKIP_WITH_LVMLOCKD=1
			;;
		--with-extended)
			initskip "extended tests not supported in cluster shell mode"
			;;
		--with-multi-host)
			initskip "multi-host tests not supported in cluster shell mode"
			;;
		--with-idm-failure)
			initskip "IDM failure tests not supported in cluster shell mode"
			;;
		--with-lock-type-idm)
			initskip "lock-type-idm not configured"
			;;
		--with-lock-type-dlm)
			initskip "lock-type-dlm not configured"
			;;
		--with-lock-type-sanlock)
			initskip "lock-type-sanlock not configured"
			;;
		*)
			echo "Unknown option: $1"
			exit 1
			;;
	esac
	shift
done

LANG=C
LC_ALL=C
TZ=UTC

TESTNAME=${0##*/}
PS4='#${BASH_SOURCE[0]##*/}:${LINENO}+ '
export TESTNAME PS4

# No flavour in cluster mode
LVM_TEST_FLAVOUR=""

LVM_TEST_BACKING_DEVICE=""
LVM_TEST_DEVDIR=""
LVM_TEST_NODEBUG=${LVM_TEST_NODEBUG:-0}
LVM_TEST_LVM1=${LVM_TEST_LVM1:-0}
LVM_TEST_FAILURE=0
LVM_TEST_MULTI_HOST=0
SHARED=""
LVM_TEST_LVMLOCKD=0
LVM_TEST_LVMLOCKD_TEST=0
LVM_TEST_LVMPOLLD=0
LVM_TEST_DEVICES_FILE=${LVM_TEST_DEVICES_FILE:-0}
LVM_TEST_EXTENDED=0
LVM_TEST_LOCK_TYPE_DLM=0
LVM_TEST_LOCK_TYPE_SANLOCK=0
LVM_TEST_LOCK_TYPE_IDM=0

# --skip-with-lvmpolld does NOT cause a skip here.
# The flag means "skip when running with a test-specific lvmpolld"
# (LVM_TEST_LVMPOLLD!=0), which we don't do. The system lvmpolld
# is running but that's compatible with these tests.

# Tool path defaults for generate_config (normally set by lib/paths,
# which we skip because it also sets abs_top_builddir with host paths)
LVM_TEST_THIN_CHECK_CMD=${LVM_TEST_THIN_CHECK_CMD-/usr/sbin/thin_check}
LVM_TEST_THIN_DUMP_CMD=${LVM_TEST_THIN_DUMP_CMD-/usr/sbin/thin_dump}
LVM_TEST_THIN_REPAIR_CMD=${LVM_TEST_THIN_REPAIR_CMD-/usr/sbin/thin_repair}
LVM_TEST_THIN_RESTORE_CMD=${LVM_TEST_THIN_RESTORE_CMD-/usr/sbin/thin_restore}
LVM_TEST_CACHE_CHECK_CMD=${LVM_TEST_CACHE_CHECK_CMD-/usr/sbin/cache_check}
LVM_TEST_CACHE_DUMP_CMD=${LVM_TEST_CACHE_DUMP_CMD-/usr/sbin/cache_dump}
LVM_TEST_CACHE_REPAIR_CMD=${LVM_TEST_CACHE_REPAIR_CMD-/usr/sbin/cache_repair}
LVM_TEST_CACHE_RESTORE_CMD=${LVM_TEST_CACHE_RESTORE_CMD-/usr/sbin/cache_restore}

DMEVENTD_PIDFILE="/run/dmeventd.pid"

export DMEVENTD_PIDFILE
export LVM_TEST_BACKING_DEVICE LVM_TEST_DEVDIR LVM_TEST_NODEBUG LVM_TEST_FAILURE
export LVM_TEST_MULTI_HOST
export LVM_TEST_LVMLOCKD LVM_TEST_LVMLOCKD_TEST
export LVM_TEST_LVMPOLLD LVM_TEST_LOCK_TYPE_DLM LVM_TEST_LOCK_TYPE_SANLOCK LVM_TEST_LOCK_TYPE_IDM
export LVM_TEST_DEVICES_FILE
export LVM_TEST_EXTENDED
export LVM_TEST_THIN_CHECK_CMD LVM_TEST_THIN_DUMP_CMD LVM_TEST_THIN_REPAIR_CMD LVM_TEST_THIN_RESTORE_CMD
export LVM_TEST_CACHE_CHECK_CMD LVM_TEST_CACHE_DUMP_CMD LVM_TEST_CACHE_REPAIR_CMD LVM_TEST_CACHE_RESTORE_CMD

unset CDPATH

# Source utils (provides die, prepare_test_vars, get_devs, etc.)
. lib/utils

TESTOLDPWD=$(pwd)
COMMON_PREFIX="LVMTEST"
PREFIX="${COMMON_PREFIX}$$"

[[ -n "$LVM_TEST_DIR" ]] || LVM_TEST_DIR=${TMPDIR:-/tmp}
TESTDIR=$(mkdtemp "$LVM_TEST_DIR" "$PREFIX.XXXXXXXXXX") || \
	die "failed to create temporary directory in \"$LVM_TEST_DIR\""
RUNNING_DMEVENTD=$(pgrep dmeventd || true)

export TESTOLDPWD TESTDIR COMMON_PREFIX PREFIX RUNNING_DMEVENTD
LVM_LOG_FILE_EPOCH=DEBUG
LVM_LOG_FILE_MAX_LINES=${LVM_LOG_FILE_MAX_LINES-1000000}
LVM_EXPECTED_EXIT_STATUS=1
export LVM_LOG_FILE_EPOCH LVM_LOG_FILE_MAX_LINES LVM_EXPECTED_EXIT_STATUS

# Traps
[[ -n "$BASH" ]] && trap '{ set +vx; } 2>/dev/null; STACKTRACE; exit 1' ERR
trap '{ set +vx; } 2>/dev/null; aux teardown' EXIT

cd "$TESTDIR"
mkdir lib tmp

# Link lib files from the deployed lib/ in the working directory
# Include .sh files (unlike original inittest.sh) since our aux wrapper
# needs aux_t_defs.sh and aux-overrides.sh accessible from $TESTDIR/lib/
find "$TESTOLDPWD/lib" ! \( -name '*.[cdo]' -o -name '*~' \) \
    -exec ln -s -t lib "{}" +

DM_DEFAULT_NAME_MANGLING_MODE=none
DM_DEV_DIR="/dev"
LVM_SYSTEM_DIR="$TESTDIR/etc"
TMPDIR="$TESTDIR/tmp"
DM_ABORT_ON_INTERNAL_ERRORS=${DM_ABORT_ON_INTERNAL_ERRORS:-1}
DM_DEBUG_WITH_LINE_NUMBERS=${DM_DEBUG_WITH_LINE_NUMBERS:-1}

export DM_DEFAULT_NAME_MANGLING_MODE DM_DEV_DIR LVM_SYSTEM_DIR DM_ABORT_ON_INTERNAL_ERRORS
mkdir "$LVM_SYSTEM_DIR"
MACHINEID=$(uuidgen 2>/dev/null || echo "abcdefabcdefabcdefabcdefabcdefab")
echo "${MACHINEID//-/}" > "$LVM_SYSTEM_DIR/machine-id"

echo "$TESTNAME" >TESTNAME

echo "Kernel is $(uname -a)"
echo "Selinux mode is $(getenforce 2>/dev/null || echo not installed)."
free -m || true
df -h || true

# Set vars from utils now that we have TESTDIR/PREFIX
prepare_test_vars

# Strict shell mode
[[ -n "$BASH" ]] && set -euE -o pipefail

echo "@TESTDIR=$TESTDIR"
echo "@PREFIX=$PREFIX"
echo "## DATE: $(date || true)"

HOSTNAME=$(hostname -I 2>/dev/null) || HOSTNAME=
HOSTNAME="$(hostname 2>/dev/null) ${HOSTNAME}" || true
echo "## HOST: $HOSTNAME"

# Generate lvm.conf with cluster device filter
# CLUSTER_DEVICE_FILTER is set by cluster-shell-bridge.sh
if [[ -n "${CLUSTER_DEVICE_FILTER:-}" ]]; then
	aux lvmconf "devices/global_filter = $CLUSTER_DEVICE_FILTER"
else
	aux lvmconf
fi

export SHARED=""

echo "<======== Processing test: \"$TESTNAME\" ========>"

set -vx
