#!/usr/bin/env bash
# This script is used for testing install.sh and that it works for
# each of component of our apt and yum repos
set -e

: ${DEB_DIR:="$(pwd)/bundles/$(cat VERSION)/build-deb"}

if [[ ! -d "${DEB_DIR}" ]]; then
	echo "you must first run `make deb` or hack/make/build-deb"
	exit 1
fi

test_deb_install(){
	# test for each Dockerfile in contrib/builder

	builderDir="contrib/builder/deb/${PACKAGE_ARCH}"
	pkgs=( $(find "${builderDir}/"*/ -type d) )
	if [ ! -z "$DOCKER_BUILD_PKGS" ]; then
		pkgs=()
		for p in $DOCKER_BUILD_PKGS; do
			pkgs+=( "$builderDir/$p" )
		done
	fi
	for dir in "${pkgs[@]}"; do
		[ -d "$dir" ] || { echo >&2 "skipping nonexistent $dir"; continue; }
		local from="$(awk 'toupper($1) == "FROM" { print $2; exit }' "$dir/Dockerfile")"
		local dir=$(basename "$dir")

		if [[ ! -d "${DEB_DIR}/${dir}" ]]; then
			echo "No deb found for ${dir}"
			exit 1
		fi

		local script=$(mktemp /tmp/install-XXXXXXXXXX.sh)
		cat <<-EOF > "${script}"
		#!/bin/bash
		set -e
		set -x

		apt-get update && apt-get install -y apparmor

		dpkg -i /root/debs/*.deb || true

		apt-get install -yf

		/etc/init.d/apparmor start

		# this will do everything _except_ load the profile into the kernel
		(
		cd /etc/apparmor.d
		/sbin/apparmor_parser --skip-kernel-load docker-engine
		)
		EOF

		chmod +x "${script}"

		echo "testing deb install for ${from}"
		docker run --rm -i --privileged \
			-v ${DEB_DIR}/${dir}:/root/debs \
			-v ${script}:/install.sh \
			${from} /install.sh

		rm -f ${script}
	done
}

(
	bundle .integration-daemon-start
	test_deb_install
	bundle .integration-daemon-stop
) 2>&1 | tee -a "$DEST/test.log"
