#!/bin/bash
# Usage build-and-publish-docker [cli-version]
set -o nounset
set -o errexit
set -o pipefail

readonly SCRIPT_DIR="$( cd "$( dirname "${0}" )" && pwd )"
readonly ROOT=${SCRIPT_DIR}/..

if [ -z "${1:-}" ]; then
    >&2 echo "error: missing version to publish"
    exit 1
fi

if [ -z "${DOCKER_HUB_USER:-}" ]; then
    >&2 echo "error: 'DOCKER_HUB_USER' should be defined"
    exit 1
fi

if [ -z "${DOCKER_HUB_PASSWORD:-}" ]; then
    >&2 echo "error: 'DOCKER_HUB_PASSWORD' should be defined"
    exit 1
fi

CLI_VERSION="${1}"

# We only want to push docker images for stable versions of Pulumi. So if there is a -alpha
# pre-release tag, skip publishing.
if [[ "${CLI_VERSION}" == *-alpha* ]]; then
    >&2 echo "Skipping docker publishing for ${CLI_VERSION} since it is a pre-release"
    exit 0    
fi

docker login -u "${DOCKER_HUB_USER}" -p "${DOCKER_HUB_PASSWORD}"

echo "Building containers..."
for container in pulumi actions; do
    echo "- pulumi/${container}"
    docker build --build-arg PULUMI_VERSION="${CLI_VERSION}" \
        -t "pulumi/${container}:${CLI_VERSION}" \
        -t "pulumi/${container}:latest" \
        "${SCRIPT_DIR}/../dist/${container}"
done

echo "Running container runtime tests..."
pushd ${ROOT}/tests
GOOS=linux go test -c -o /tmp/pulumi-test-containers ${ROOT}/tests/containers/...
popd
docker run -e RUN_CONTAINER_TESTS=true \
	-e PULUMI_ACCESS_TOKEN=${PULUMI_ACCESS_TOKEN} \
	--volume /tmp:/src \
	--entrypoint /bin/bash \
	pulumi/pulumi:latest \
	-c "pip install pipenv && /src/pulumi-test-containers -test.parallel=1 -test.v -test.run TestPulumiDockerImage"

# Disabled due to https://github.com/pulumi/pulumi/issues/4136
# echo "Running container entrypoint tests..."
# RUN_CONTAINER_TESTS=true go test ${ROOT}/tests/containers/... -test.run TestPulumiActionsImage -test.v

echo "Publishing containers..."
for container in pulumi actions; do
    echo "- pulumi/${container}"
    docker push "pulumi/${container}:${CLI_VERSION}"
    docker push "pulumi/${container}:latest"
done

docker logout
