#
# Podman specific functions
#
################################################################
#
# Copyright (c) 2023 Dirk Mueller
# Copyright (c) 2023 SUSE, LLC
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or 3 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program (see the file COPYING); if not, write to the
# Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
#
################################################################

vm_verify_options_podman() {
    VM_ROOT=
    VM_SWAP=
}

vm_startup_podman() {
    local name="build_${RECIPEFILE//:/-}"
    podman rm "$name" >/dev/null 2>&1 || true
    local podman_opts=
    test -n "$VM_TYPE_PRIVILEGED" && podman_opts="--privileged --cap-add=SYS_ADMIN --cap-add=MKNOD"
    test -n "$RUN_SHELL" -o -n "$RUN_SHELL_AFTER_FAIL" && podman_opts="$podman_opts -it"
    mkdir -p "$BUILD_ROOT/home"
    local mounts=()
    local non_mounts=()
    local d
    for d in $BUILD_ROOT/* $BUILD_ROOT/.??*; do
	d="${d##*/}"
	test "$d" = proc && continue
	test "$d" = dev && continue
	test "$d" = sys && continue
	test "$d" = installed-pkg && continue
	if test -d "$BUILD_ROOT/$d" -a ! -L "$BUILD_ROOT/$d" ; then
	    mounts[${#mounts[@]}]="--mount"
	    mounts[${#mounts[@]}]="type=bind,source=$BUILD_ROOT/$d,destination=/$d"
	else
	    test "$d" = .build.log && continue
	    non_mounts[${#non_mounts[@]}]="$d"
	fi
    done
    rm -f "$BUILD_ROOT/.build/.toextract.tar"
    mkdir -p "$BUILD_ROOT/.build/podman-oci-hooks"
    rm -f "$BUILD_ROOT/.build/podman-oci-hooks/create.json"
    if test -n "${non_mounts[*]}" ; then
	tar -C "$BUILD_ROOT" -cf - -- "${non_mounts[@]}" > "$BUILD_ROOT/.build/.podman-toextract.tar"
	cat > "$BUILD_ROOT/.build/podman-oci-hooks/create.sh" << EOF
#!/bin/sh
exec "$BUILD_ROOT/.build/unpackarchive" --tar < "$BUILD_ROOT/.build/.podman-toextract.tar"
EOF
	chmod 755 "$BUILD_ROOT/.build/podman-oci-hooks/create.sh"
	cat > "$BUILD_ROOT/.build/podman-oci-hooks/create.json" << EOF
{
    "version": "1.0.0",
    "hook": { "path": "$BUILD_ROOT/.build/podman-oci-hooks/create.sh" },
    "when": { "always": true },
    "stages": [ "createContainer" ]
}
EOF
    fi
    podman --hooks-dir="$BUILD_ROOT/.build/podman-oci-hooks" run \
        --runtime=runc \
        --rm --name "$name" --net=none $podman_opts \
        "${mounts[@]}" \
        "$@" build-scratch:latest "$vm_init_script"
    BUILDSTATUS="$?"
    test "$BUILDSTATUS" != 255 || BUILDSTATUS=3
    # copyout the .build.packages link
    rm -f "$BUILD_ROOT/.build.packages"
    test -L "$BUILD_ROOT/.build/.build.packages" && cp -a "$BUILD_ROOT/.build/.build.packages" "$BUILD_ROOT/.build.packages"
    cleanup_and_exit "$BUILDSTATUS"
}

vm_kill_podman() {
    local name="build_${RECIPEFILE//:/-}"
    podman stop -t 2 "$name" || true
}

vm_fixup_podman() {
    # create a scratch image for our build environment
    if ! podman image exists build-scratch:latest ; then
        echo "FROM scratch"  | podman build -t build-scratch:latest  -
    fi
}

vm_attach_root_podman() {
    :
}

vm_attach_swap_podman() {
    :
}

vm_detach_root_podman() {
    :
}

vm_detach_swap_podman() {
    :
}

vm_cleanup_podman() {
    :
}

vm_sysrq_podman() {
    :
}

vm_wipe_podman() {
    local name="build_${RECIPEFILE//:/-}"
    podman rm "$name" >/dev/null 2>&1 || true

    echo "Wiping build root: '$BUILD_ROOT'"
    unmount_build_root
    # calling 'podman unshare' is required because podman creates the files with SubUIDs/SubGIDs
    # that differ from user's UID/GID and removing them would normally end up with
    # a permission error for any user that is not root
    podman unshare rm -rf "$BUILD_ROOT"
}
