#!/usr/bin/env bash
#
# Copyright (c) 2018-2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#

[[ -z "${DEBUG}" ]] || set -x
set -o errexit
set -o nounset
set -o pipefail
set -o errtrace

script_dir=$(dirname "$(readlink -f "$0")")
kata_dir=$(realpath "${script_dir}/../../../../")
kata_deploy_create="${script_dir}/kata-deploy-binaries.sh"
uid=$(id -u "${USER}")
gid=$(id -g "${USER}")
http_proxy="${http_proxy:-}"
https_proxy="${https_proxy:-}"

ARCH=${ARCH:-$(uname -m)}

if [[ "${script_dir}" != "${PWD}" && ! -L "${PWD}/build" ]]; then
	# If a parallel job creates the link between the check and our ln,
	# accept that and move on; any other failure aborts.
	ln -s "${script_dir}/build" "${PWD}/build" 2>/dev/null || [[ -L "${PWD}/build" ]]
fi

# This is the gid of the "docker" group on host. In case of docker in docker builds
# for some of the targets (clh builds from source), the nested container user needs to
# be part of this group.
docker_gid=$(getent group docker | cut -d: -f3 || { echo >&2 "Missing docker group, docker needs to be installed" && false; })

# If docker gid is the effective group id of the user, do not pass it as
# an additional group.
if [[ "${docker_gid}" == "${gid}" ]]; then
	docker_gid=""
fi

remove_dot_docker_dir=false
if [[ ! -d "${HOME}/.docker" ]]; then
	# Tolerate the dir being created by a parallel job between the check
	# above and this mkdir.
	mkdir -p "${HOME}"/.docker
	remove_dot_docker_dir=true
fi

"${script_dir}"/kata-deploy-copy-yq-installer.sh
docker build -q -t build-kata-deploy \
	--build-arg IMG_USER="${USER}" \
	--build-arg UID="${uid}" \
	--build-arg GID="${gid}" \
	--build-arg http_proxy="${http_proxy}" \
	--build-arg https_proxy="${https_proxy}" \
	--build-arg HOST_DOCKER_GID="${docker_gid}" \
	"${script_dir}/dockerbuild/"

ARTEFACT_REGISTRY="${ARTEFACT_REGISTRY:-}"
ARTEFACT_REPOSITORY="${ARTEFACT_REPOSITORY:-}"
ARTEFACT_REGISTRY_USERNAME="${ARTEFACT_REGISTRY_USERNAME:-}"
ARTEFACT_REGISTRY_PASSWORD="${ARTEFACT_REGISTRY_PASSWORD:-}"
TARGET_BRANCH="${TARGET_BRANCH:-}"
BUILDER_REGISTRY="${BUILDER_REGISTRY:-}"
PUSH_TO_REGISTRY="${PUSH_TO_REGISTRY:-"no"}"
RELEASE="${RELEASE:-"no"}"
AGENT_CONTAINER_BUILDER="${AGENT_CONTAINER_BUILDER:-}"
COCO_GUEST_COMPONENTS_CONTAINER_BUILDER="${COCO_GUEST_COMPONENTS_CONTAINER_BUILDER:-}"
INITRAMFS_CONTAINER_BUILDER="${INITRAMFS_CONTAINER_BUILDER:-}"
KERNEL_CONTAINER_BUILDER="${KERNEL_CONTAINER_BUILDER:-}"
OVMF_CONTAINER_BUILDER="${OVMF_CONTAINER_BUILDER:-}"
PAUSE_IMAGE_CONTAINER_BUILDER="${PAUSE_IMAGE_CONTAINER_BUILDER:-}"
QEMU_CONTAINER_BUILDER="${QEMU_CONTAINER_BUILDER:-}"
SHIM_V2_CONTAINER_BUILDER="${SHIM_V2_CONTAINER_BUILDER:-}"
TDSHIM_CONTAINER_BUILDER="${TDSHIM_CONTAINER_BUILDER:-}"
TOOLS_CONTAINER_BUILDER="${TOOLS_CONTAINER_BUILDER:-}"
VIRTIOFSD_CONTAINER_BUILDER="${VIRTIOFSD_CONTAINER_BUILDER:-}"
AGENT_INIT="${AGENT_INIT:-no}"
MEASURED_ROOTFS="${MEASURED_ROOTFS:-no}"
CONFIDENTIAL_GUEST="${CONFIDENTIAL_GUEST:-no}"
USE_CACHE="${USE_CACHE:-}"
BUSYBOX_CONF_FILE=${BUSYBOX_CONF_FILE:-}
NVIDIA_GPU_STACK="${NVIDIA_GPU_STACK:-}"
KBUILD_SIGN_PIN=${KBUILD_SIGN_PIN:-}
GUEST_HOOKS_TARBALL_NAME="${GUEST_HOOKS_TARBALL_NAME:-}"
EXTRA_PKGS="${EXTRA_PKGS:-}"
REPO_URL="${REPO_URL:-}"
REPO_URL_X86_64="${REPO_URL_X86_64:-}"
REPO_COMPONENTS="${REPO_COMPONENTS:-}"
AGENT_POLICY="${AGENT_POLICY:-yes}"
RUNTIME_CHOICE="${RUNTIME_CHOICE:-both}"
IMAGE_SIZE_ALIGNMENT_MB=${IMAGE_SIZE_ALIGNMENT_MB:-}
KERNEL_DEBUG_ENABLED="${KERNEL_DEBUG_ENABLED:-}"
INIT_DATA="${INIT_DATA:-yes}"
USE_DEVMAPPER="${USE_DEVMAPPER:-no}"

docker run \
	-v "${HOME}"/.docker:/root/.docker \
	-v /var/run/docker.sock:/var/run/docker.sock \
	-v "${kata_dir}:${kata_dir}" \
	--env USER="${USER}" \
	--env ARTEFACT_REGISTRY="${ARTEFACT_REGISTRY}" \
	--env ARTEFACT_REPOSITORY="${ARTEFACT_REPOSITORY}" \
	--env ARTEFACT_REGISTRY_USERNAME="${ARTEFACT_REGISTRY_USERNAME}" \
	--env ARTEFACT_REGISTRY_PASSWORD="${ARTEFACT_REGISTRY_PASSWORD}" \
	--env TARGET_BRANCH="${TARGET_BRANCH}" \
	--env RELEASE="${RELEASE}" \
	--env BUILDER_REGISTRY="${BUILDER_REGISTRY}" \
	--env PUSH_TO_REGISTRY="${PUSH_TO_REGISTRY}" \
	--env AGENT_CONTAINER_BUILDER="${AGENT_CONTAINER_BUILDER}" \
	--env COCO_GUEST_COMPONENTS_CONTAINER_BUILDER="${COCO_GUEST_COMPONENTS_CONTAINER_BUILDER}" \
	--env INITRAMFS_CONTAINER_BUILDER="${INITRAMFS_CONTAINER_BUILDER}" \
	--env KERNEL_CONTAINER_BUILDER="${KERNEL_CONTAINER_BUILDER}" \
	--env OVMF_CONTAINER_BUILDER="${OVMF_CONTAINER_BUILDER}" \
	--env PAUSE_IMAGE_CONTAINER_BUILDER="${PAUSE_IMAGE_CONTAINER_BUILDER}" \
	--env QEMU_CONTAINER_BUILDER="${QEMU_CONTAINER_BUILDER}" \
	--env SHIM_V2_CONTAINER_BUILDER="${SHIM_V2_CONTAINER_BUILDER}" \
	--env TDSHIM_CONTAINER_BUILDER="${TDSHIM_CONTAINER_BUILDER}" \
	--env TOOLS_CONTAINER_BUILDER="${TOOLS_CONTAINER_BUILDER}" \
	--env VIRTIOFSD_CONTAINER_BUILDER="${VIRTIOFSD_CONTAINER_BUILDER}" \
	--env AGENT_INIT="${AGENT_INIT}" \
	--env MEASURED_ROOTFS="${MEASURED_ROOTFS}" \
	--env CONFIDENTIAL_GUEST="${CONFIDENTIAL_GUEST}" \
	--env USE_CACHE="${USE_CACHE}" \
	--env BUSYBOX_CONF_FILE="${BUSYBOX_CONF_FILE}" \
	--env NVIDIA_GPU_STACK="${NVIDIA_GPU_STACK}" \
	--env KBUILD_SIGN_PIN="${KBUILD_SIGN_PIN}" \
	--env GUEST_HOOKS_TARBALL_NAME="${GUEST_HOOKS_TARBALL_NAME}" \
	--env EXTRA_PKGS="${EXTRA_PKGS}" \
	--env REPO_URL="${REPO_URL}" \
	--env REPO_URL_X86_64="${REPO_URL_X86_64}" \
	--env REPO_COMPONENTS="${REPO_COMPONENTS}" \
	--env AGENT_POLICY="${AGENT_POLICY}" \
	--env GH_TOKEN="${GH_TOKEN:-${GITHUB_TOKEN:-}}" \
	--env VERIFY_COCO_EXTENSION_PROVENANCE="${VERIFY_COCO_EXTENSION_PROVENANCE:-}" \
	--env USE_DEVMAPPER="${USE_DEVMAPPER}" \
	--env RUNTIME_CHOICE="${RUNTIME_CHOICE}" \
	--env STATIC_RUNTIME="${STATIC_RUNTIME:-}" \
	--env IMAGE_SIZE_ALIGNMENT_MB="${IMAGE_SIZE_ALIGNMENT_MB}" \
	--env KERNEL_DEBUG_ENABLED="${KERNEL_DEBUG_ENABLED}" \
	--env AA_KBC="${AA_KBC:-}" \
	--env HKD_PATH="$(realpath "${HKD_PATH:-}" 2> /dev/null || true)" \
	--env SE_KERNEL_PARAMS="${SE_KERNEL_PARAMS:-}" \
	--env FAKE_SE_IMAGE="${FAKE_SE_IMAGE:-}" \
	--env ARCH="${ARCH}" \
	--rm \
	-w "${script_dir}" \
	build-kata-deploy "${kata_deploy_create}" "$@"

if [[ "${remove_dot_docker_dir}" == true ]]; then
	rm -rf "${HOME}/.docker"
fi
