#!/usr/bin/env bash

# see test-integration for example usage of this script

base="$ABS_DEST/.."
export PATH="$base/dynbinary-daemon:$base/binary-daemon:$PATH"

export TEST_CLIENT_BINARY=docker

if [ -n "$DOCKER_CLI_PATH" ]; then
	export TEST_CLIENT_BINARY=/usr/local/cli/$(basename "$DOCKER_CLI_PATH")
fi

echo "Using test binary $TEST_CLIENT_BINARY"
if ! command -v "$TEST_CLIENT_BINARY" &> /dev/null; then
	echo >&2 'error: missing test client $TEST_CLIENT_BINARY'
	false
fi

# This is a temporary hack for split-binary mode. It can be removed once
# https://github.com/docker/docker/pull/22134 is merged into docker master
if [ "$(go env GOOS)" = 'windows' ]; then
	return
fi

if [ -z "$DOCKER_TEST_HOST" ]; then
	if docker version &> /dev/null; then
		echo >&2 'skipping daemon start, since daemon appears to be already started'
		return
	fi
fi

if ! command -v dockerd &> /dev/null; then
	echo >&2 'error: binary-daemon or dynbinary-daemon must be run before .integration-daemon-start'
	false
fi

# intentionally open a couple bogus file descriptors to help test that they get scrubbed in containers
exec 41>&1 42>&2

# Allow pushing manifest v2 schema 1 images, as they're used to push
# images to our test-registries for testing _pulling_ schema 2v1 images.
export DOCKER_ALLOW_SCHEMA1_PUSH_DONOTUSE=1
export DOCKER_GRAPHDRIVER=${DOCKER_GRAPHDRIVER:-vfs}
export DOCKER_USERLANDPROXY=${DOCKER_USERLANDPROXY:-true}

# example usage: DOCKER_STORAGE_OPTS="dm.basesize=20G,dm.loopdatasize=200G"
storage_params=""
if [ -n "$DOCKER_STORAGE_OPTS" ]; then
	IFS=','
	for i in ${DOCKER_STORAGE_OPTS}; do
		storage_params="--storage-opt $i $storage_params"
	done
	unset IFS
fi

# example usage: DOCKER_REMAP_ROOT=default
extra_params=""
if [ "$DOCKER_REMAP_ROOT" ]; then
	extra_params="--userns-remap $DOCKER_REMAP_ROOT"
fi

# example usage: DOCKER_EXPERIMENTAL=1
if [ "$DOCKER_EXPERIMENTAL" ]; then
	echo >&2 '# DOCKER_EXPERIMENTAL is set: starting daemon with experimental features enabled! '
	extra_params="$extra_params --experimental"
fi

dockerd="dockerd"
if [ -f "/sys/fs/cgroup/cgroup.controllers" ]; then
	if [ -z "$TEST_SKIP_INTEGRATION_CLI" ]; then
		echo >&2 '# cgroup v2 requires TEST_SKIP_INTEGRATION_CLI to be set'
		exit 1
	fi
fi

if [ -n "$DOCKER_ROOTLESS" ]; then
	if [ -z "$TEST_SKIP_INTEGRATION_CLI" ]; then
		echo >&2 '# DOCKER_ROOTLESS requires TEST_SKIP_INTEGRATION_CLI to be set'
		exit 1
	fi
	ln -sf "$(command -v vpnkit."$(uname -m)")" /usr/local/bin/vpnkit
	user="unprivilegeduser"
	uid=$(id -u $user)
	# shellcheck disable=SC2174
	mkdir -p -m 700 "/tmp/docker-${uid}"
	chown "$user" "/tmp/docker-${uid}"
	chmod -R o+w "$DEST"
	dockerd="sudo -u $user -E -E XDG_RUNTIME_DIR=/tmp/docker-${uid} -E HOME=/home/${user} -E PATH=$PATH -- dockerd-rootless.sh"
fi

if [ -z "$DOCKER_TEST_HOST" ]; then
	# Start apparmor if it is enabled
	if [ -e "/sys/module/apparmor/parameters/enabled" ] && [ "$(cat /sys/module/apparmor/parameters/enabled)" == "Y" ]; then
		# reset container variable so apparmor profile is applied to process
		# see https://github.com/docker/libcontainer/blob/master/apparmor/apparmor.go#L16
		export container=""
		(
			[ -n "$TESTDEBUG" ] && set -x
			/etc/init.d/apparmor start
		)
	fi

	# "pwd" tricks to make sure $DEST is an absolute path, not a relative one
	export DOCKER_HOST="unix://$(cd "$DEST" && pwd)/docker.sock"
	(
		echo "Starting dockerd"
		[ -n "$TESTDEBUG" ] && set -x
		exec \
			${dockerd} --debug \
			--host "$DOCKER_HOST" \
			--storage-driver "$DOCKER_GRAPHDRIVER" \
			--pidfile "$DEST/docker.pid" \
			--userland-proxy="$DOCKER_USERLANDPROXY" \
			${storage_params} \
			${extra_params} \
			&> "$DEST/docker.log"
	) &
else
	export DOCKER_HOST="$DOCKER_TEST_HOST"
fi

# give it a little time to come up so it's "ready"
tries=60
echo "INFO: Waiting for daemon to start..."
while ! ${TEST_CLIENT_BINARY} version &> /dev/null; do
	((tries--))
	if [ $tries -le 0 ]; then
		printf "\n"
		if [ -z "$DOCKER_HOST" ]; then
			echo >&2 "error: daemon failed to start"
			echo >&2 "  check $DEST/docker.log for details"
		else
			echo >&2 "error: daemon at $DOCKER_HOST fails to '$TEST_CLIENT_BINARY version':"
			${TEST_CLIENT_BINARY} version >&2 || true
			# Additional Windows CI debugging as this is a common error as of
			# January 2016
			if [ "$(go env GOOS)" = 'windows' ]; then
				echo >&2 "Container log below:"
				echo >&2 "---"
				# Important - use the docker on the CI host, not the one built locally
				# which is currently in our path.
				! /c/bin/docker -H=$MAIN_DOCKER_HOST logs docker-$COMMITHASH
				echo >&2 "---"
			fi
		fi
		false
	fi
	printf "."
	sleep 2
done
printf "\n"
