#!/usr/bin/env bash

set -e

# shellcheck source=./contrib/cirrus/lib.sh
source $(dirname $0)/lib.sh

die_unknown() {
    local var_name="$1"
    req_env_vars var_name
    local var_value="${!var_name}"
    die "Unknown/unsupported \$$var_name '$var_value'"
}

msg "************************************************************"
msg "Setting up runtime environment"
msg "************************************************************"
show_env_vars

req_env_vars USER HOME GOSRC SCRIPT_BASE TEST_FLAVOR TEST_ENVIRON \
             PODBIN_NAME PRIV_NAME DISTRO_NV

# Verify basic dependencies
for depbin in go rsync unzip sha256sum curl make python3 git
do
    if ! type -P "$depbin" &> /dev/null
    then
        warn "$depbin binary not found in $PATH"
    fi
done

# This is a possible manual maintenance gaff, check to be sure everything matches.
# shellcheck disable=SC2154
[[ "$DISTRO_NV" == "$OS_REL_VER" ]] || \
    die "Automation spec. '$DISTRO_NV'; actual host '$OS_REL_VER'"

# Only allow this script to execute once
if ((${SETUP_ENVIRONMENT:-0})); then
    # Comes from automation library
    # shellcheck disable=SC2154
    warn "Not executing $SCRIPT_FILENAME again"
    exit 0
fi

cd "${GOSRC}/"

# Defined by lib.sh: Does the host support cgroups v1 or v2
case "$CG_FS_TYPE" in
    tmpfs)
        if ((CONTAINER==0)); then
            warn "Forcing testing with runc instead of crun"
            if [[ "$OS_RELEASE_ID" == "ubuntu" ]]; then
                echo "export OCI_RUNTIME=/usr/lib/cri-o-runc/sbin/runc" >> /etc/environment
            else
                echo "export OCI_RUNTIME=/usr/bin/runc" >> /etc/environment
            fi
        fi
        ;;
    cgroup2fs)
        if ((CONTAINER==0)); then
            # This is necessary since we've built/installed from source,
            # which uses runc as the default.
            warn "Forcing testing with crun instead of runc"
            echo "export OCI_RUNTIME=/usr/bin/crun" >> /etc/environment
        fi
        ;;
    *) die_unknown CG_FS_TYPE
esac

# Which distribution are we testing on.
case "$OS_RELEASE_ID" in
    ubuntu*) ;;
    fedora*)
        if ((CONTAINER==0)); then  # Not yet running inside a container
            msg "Configuring / Expanding host storage."
            # VM is setup to allow flexibility in testing alternate storage.
            # For general use, simply make use of all available space.
            ooe.sh bash "$SCRIPT_BASE/add_second_partition.sh"

            # All SELinux distros need this for systemd-in-a-container
            msg "Enabling container_manage_cgroup"
            setsebool container_manage_cgroup true
        fi
        ;;
    *) die_unknown OS_RELEASE_ID
esac

# Required to be defined by caller: The environment where primary testing happens
# shellcheck disable=SC2154
case "$TEST_ENVIRON" in
    host)
        if [[ "$OS_RELEASE_ID" == "fedora" ]]; then
            # The e2e tests wrongly guess `--cgroup-manager cgroupfs`
            msg "Forcing CGROUP_MANAGER=systemd"
            _cgm="export CGROUP_MANAGER=systemd"
            echo "$_cgm" >> /etc/environment
            source /etc/environment
        fi
        ;;
    container)
        if ((CONTAINER==0)); then  # not yet inside a container
            msg "Force loading iptables modules"
            # Since CRIU 3.11, uses iptables to lock and unlock
            # the network during checkpoint and restore.  Needs
            # the following two modules loaded on the host.
            modprobe ip6table_nat || :
            modprobe iptable_nat || :
        else
            # The e2e tests wrongly guess `--cgroup-manager systemd`
            msg "Forcing CGROUP_MANAGER=cgroupfs"
            _cgm="export CGROUP_MANAGER=cgroupfs"
            echo "$_cgm" >> /etc/environment
            source /etc/environment
        fi
        ;;
    *) die_unknown TEST_ENVIRON
esac

# Required to be defined by caller: Are we testing as root or a regular user
# shellcheck disable=SC2154
case "$PRIV_NAME" in
    root)
        if [[ "$TEST_ENVIRON" == "container" ]] && ((container)); then
            # There's no practical way to detect userns w/in a container
            # affected/related tests are sensitive to this variable.
            _suns='export SKIP_USERNS=1'
            echo "$_suns" >> /etc/environment
            source /etc/environment
        fi
        ;;
    rootless)
        _ru="export ROOTLESS_USER='${ROOTLESS_USER:-some${RANDOM}dude}'"
        echo "$_ru" >> /etc/environment
        source /etc/environment
        setup_rootless
        ;;
    *) die_unknown PRIV_NAME
esac

# Required to be defined by caller: Are we testing podman or podman-remote client
# shellcheck disable=SC2154
case "$PODBIN_NAME" in
    podman) ;;
    remote) ;;
    *) die_unknown PODBIN_NAME
esac

# Required to be defined by caller: The primary type of testing that will be performed
# shellcheck disable=SC2154
case "$TEST_FLAVOR" in
    ext_svc) ;;
    smoke) ;&
    validate)
        # For some reason, this is also needed for validation
        make .install.pre-commit
        ;;
    automation) ;;
    altbuild)
        # Defined in .cirrus.yml
        # shellcheck disable=SC2154
        if [[ "$ALT_NAME" =~ RPM ]]; then
            bigto dnf install -y glibc-minimal-langpack rpm-build
        fi
        ;&
    docker-py) ;&
    build) make clean ;;
    unit) ;;
    apiv2) ;&  # use next item
    int) ;&
    sys) ;&
    bindings) ;&
    swagger) ;&
    endpoint)
        # Use existing host bits when testing is to happen inside a container
        # since this script will run again in that environment.
        # shellcheck disable=SC2154
        if ((CONTAINER==0)) && [[ "$TEST_ENVIRON" == "host" ]]; then
            remove_packaged_podman_files
            make install PREFIX=/usr ETCDIR=/etc
        fi
        ;;
    vendor) make clean ;;
    release) ;;
    *) die_unknown TEST_FLAVOR
esac

# Must be the very last command.  Establishes successful setup.
echo 'export SETUP_ENVIRONMENT=1' >> /etc/environment