2014-12-15 09:54:06 -08:00
|
|
|
#!/usr/bin/env bash
|
2014-12-21 13:52:20 -08:00
|
|
|
|
2014-12-13 18:56:31 -08:00
|
|
|
# constants
|
2015-01-02 16:06:32 -08:00
|
|
|
DOKKU_ROOT=${DOKKU_ROOT:=~dokku}
|
2019-11-19 15:09:54 -07:00
|
|
|
DOCKER_BIN=${DOCKER_BIN:="docker"}
|
2015-09-09 18:27:42 -07:00
|
|
|
DOKKU_LIB_ROOT=${DOKKU_LIB_PATH:="/var/lib/dokku"}
|
|
|
|
|
PLUGIN_PATH=${PLUGIN_PATH:="$DOKKU_LIB_ROOT/plugins"}
|
|
|
|
|
PLUGIN_AVAILABLE_PATH=${PLUGIN_AVAILABLE_PATH:="$PLUGIN_PATH/available"}
|
|
|
|
|
PLUGIN_ENABLED_PATH=${PLUGIN_ENABLED_PATH:="$PLUGIN_PATH/enabled"}
|
|
|
|
|
PLUGIN_CORE_PATH=${PLUGIN_CORE_PATH:="$DOKKU_LIB_ROOT/core-plugins"}
|
|
|
|
|
PLUGIN_CORE_AVAILABLE_PATH=${PLUGIN_CORE_AVAILABLE_PATH:="$PLUGIN_CORE_PATH/available"}
|
2016-02-14 18:43:40 -08:00
|
|
|
CUSTOM_TEMPLATE_SSL_DOMAIN=customssltemplate.dokku.me
|
2021-01-17 15:58:59 -05:00
|
|
|
UUID=$(uuidgen)
|
2016-03-03 18:18:09 -08:00
|
|
|
TEST_APP="rdmtestapp-${UUID}"
|
2018-12-27 23:32:28 +01:00
|
|
|
TEST_NETWORK="test-network-${UUID}"
|
2016-08-25 09:17:26 -07:00
|
|
|
SKIPPED_TEST_ERR_MSG="previous test failed! skipping remaining tests..."
|
|
|
|
|
|
|
|
|
|
# global setup() and teardown()
|
|
|
|
|
# skips remaining tests on first failure
|
|
|
|
|
global_setup() {
|
|
|
|
|
[[ ! -f "${BATS_PARENT_TMPNAME}.skip" ]] || skip "$SKIPPED_TEST_ERR_MSG"
|
2020-06-01 22:44:29 -04:00
|
|
|
|
2020-06-01 22:43:26 -04:00
|
|
|
free -m
|
2020-12-22 12:26:44 -05:00
|
|
|
cleanup_apps
|
|
|
|
|
cleanup_containers
|
2020-06-21 17:12:24 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
global_teardown() {
|
|
|
|
|
[[ -n "$BATS_TEST_COMPLETED" ]] || touch "${BATS_PARENT_TMPNAME}.skip"
|
2020-12-22 12:26:44 -05:00
|
|
|
cleanup_apps
|
|
|
|
|
cleanup_containers
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cleanup_apps() {
|
|
|
|
|
rm -rf $DOKKU_ROOT/*/nginx.conf
|
|
|
|
|
|
2021-09-16 00:24:43 -04:00
|
|
|
dokku --quiet apps:list | xargs --no-run-if-empty -n1 dokku --force apps:destroy
|
2020-12-22 12:26:44 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cleanup_containers() {
|
2020-06-21 15:33:10 -04:00
|
|
|
containers=$(docker container ls --quiet)
|
|
|
|
|
if [[ -n "$containers" ]]; then
|
2021-09-16 00:24:29 -04:00
|
|
|
docker inspect -f '{{ if ne "true" (index .Config.Labels "com.dokku.devcontainer") }}{{.ID}} {{ end }}' $(docker ps -q) | xargs --no-run-if-empty -n1 docker container rm -f || true
|
2020-06-21 15:33:10 -04:00
|
|
|
fi
|
2016-08-25 09:17:26 -07:00
|
|
|
}
|
|
|
|
|
|
2014-12-13 18:56:31 -08:00
|
|
|
# test functions
|
|
|
|
|
flunk() {
|
2019-01-07 01:04:17 -05:00
|
|
|
{
|
|
|
|
|
if [[ "$#" -eq 0 ]]; then
|
|
|
|
|
cat -
|
|
|
|
|
else
|
|
|
|
|
echo "$*"
|
2014-12-13 18:56:31 -08:00
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
return 1
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-02 17:36:20 -06:00
|
|
|
# ShellCheck doesn't know about $status from Bats
|
2014-12-13 18:56:31 -08:00
|
|
|
assert_success() {
|
2015-09-14 21:20:35 -07:00
|
|
|
if [[ "$status" -ne 0 ]]; then
|
2014-12-13 18:56:31 -08:00
|
|
|
flunk "command failed with exit status $status"
|
2015-09-14 21:20:35 -07:00
|
|
|
elif [[ "$#" -gt 0 ]]; then
|
2014-12-13 18:56:31 -08:00
|
|
|
assert_output "$1"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-10 05:04:19 -05:00
|
|
|
# ShellCheck doesn't know about $status from Bats
|
2014-12-13 18:56:31 -08:00
|
|
|
assert_failure() {
|
2015-09-14 21:20:35 -07:00
|
|
|
if [[ "$status" -eq 0 ]]; then
|
2014-12-13 18:56:31 -08:00
|
|
|
flunk "expected failed exit status"
|
2015-09-14 21:20:35 -07:00
|
|
|
elif [[ "$#" -gt 0 ]]; then
|
2014-12-13 18:56:31 -08:00
|
|
|
assert_output "$1"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert_equal() {
|
2015-09-14 21:20:35 -07:00
|
|
|
if [[ "$1" != "$2" ]]; then
|
2019-01-07 01:04:17 -05:00
|
|
|
{
|
|
|
|
|
echo "expected: $1"
|
2014-12-13 18:56:31 -08:00
|
|
|
echo "actual: $2"
|
|
|
|
|
} | flunk
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-19 17:20:54 -05:00
|
|
|
assert_not_equal() {
|
|
|
|
|
if [[ "$1" == "$2" ]]; then
|
|
|
|
|
{
|
|
|
|
|
echo "unexpected: $1"
|
|
|
|
|
echo "actual: $2"
|
|
|
|
|
} | flunk
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-02 17:36:20 -06:00
|
|
|
# ShellCheck doesn't know about $output from Bats
|
2014-12-13 18:56:31 -08:00
|
|
|
assert_output() {
|
|
|
|
|
local expected
|
2015-09-14 21:20:35 -07:00
|
|
|
if [[ $# -eq 0 ]]; then
|
|
|
|
|
expected="$(cat -)"
|
|
|
|
|
else
|
|
|
|
|
expected="$1"
|
2014-12-13 18:56:31 -08:00
|
|
|
fi
|
|
|
|
|
assert_equal "$expected" "$output"
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-19 17:20:54 -05:00
|
|
|
# ShellCheck doesn't know about $output from Bats
|
|
|
|
|
assert_not_output() {
|
|
|
|
|
local expected
|
|
|
|
|
if [[ $# -eq 0 ]]; then
|
|
|
|
|
unexpected="$(cat -)"
|
|
|
|
|
else
|
|
|
|
|
unexpected="$1"
|
|
|
|
|
fi
|
|
|
|
|
assert_not_equal "$unexpected" "$output"
|
|
|
|
|
}
|
|
|
|
|
|
2018-03-11 20:03:11 -04:00
|
|
|
# ShellCheck doesn't know about $output from Bats
|
|
|
|
|
assert_output_exists() {
|
|
|
|
|
[[ -n "$output" ]] || flunk "expected output, found none"
|
|
|
|
|
}
|
|
|
|
|
|
2019-01-22 00:22:35 -05:00
|
|
|
# ShellCheck doesn't know about $output from Bats
|
|
|
|
|
assert_output_not_exists() {
|
|
|
|
|
[[ -z "$output" ]] || flunk "expected no output, found some"
|
|
|
|
|
}
|
|
|
|
|
|
2016-02-14 15:37:24 -05:00
|
|
|
# ShellCheck doesn't know about $output from Bats
|
|
|
|
|
assert_output_contains() {
|
2019-01-07 01:04:17 -05:00
|
|
|
local input="$output"
|
|
|
|
|
local expected="$1"
|
|
|
|
|
local count="${2:-1}"
|
|
|
|
|
local found=0
|
2016-02-14 15:37:24 -05:00
|
|
|
until [ "${input/$expected/}" = "$input" ]; do
|
|
|
|
|
input="${input/$expected/}"
|
2020-12-22 12:26:44 -05:00
|
|
|
found=$((found + 1))
|
2016-02-14 15:37:24 -05:00
|
|
|
done
|
2016-02-22 10:16:57 -08:00
|
|
|
assert_equal "$count" "$found"
|
2016-02-14 15:37:24 -05:00
|
|
|
}
|
|
|
|
|
|
2015-11-02 17:36:20 -06:00
|
|
|
# ShellCheck doesn't know about $lines from Bats
|
2014-12-13 18:56:31 -08:00
|
|
|
assert_line() {
|
2015-09-14 21:20:35 -07:00
|
|
|
if [[ "$1" -ge 0 ]] 2>/dev/null; then
|
2014-12-13 18:56:31 -08:00
|
|
|
assert_equal "$2" "${lines[$1]}"
|
|
|
|
|
else
|
|
|
|
|
local line
|
|
|
|
|
for line in "${lines[@]}"; do
|
2019-01-07 01:04:17 -05:00
|
|
|
[[ "$line" == "$1" ]] && return 0
|
2014-12-13 18:56:31 -08:00
|
|
|
done
|
|
|
|
|
flunk "expected line \`$1'"
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2021-01-07 01:54:04 -05:00
|
|
|
# ShellCheck doesn't know about $lines from Bats
|
|
|
|
|
assert_line_count() {
|
|
|
|
|
declare EXPECTED="$1"
|
|
|
|
|
local num_lines="${#lines[@]}"
|
|
|
|
|
assert_equal "$EXPECTED" "$num_lines"
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-13 18:56:31 -08:00
|
|
|
refute_line() {
|
2015-09-14 21:20:35 -07:00
|
|
|
if [[ "$1" -ge 0 ]] 2>/dev/null; then
|
2014-12-13 18:56:31 -08:00
|
|
|
local num_lines="${#lines[@]}"
|
2015-09-14 21:20:35 -07:00
|
|
|
if [[ "$1" -lt "$num_lines" ]]; then
|
2014-12-13 18:56:31 -08:00
|
|
|
flunk "output has $num_lines lines"
|
|
|
|
|
fi
|
|
|
|
|
else
|
|
|
|
|
local line
|
|
|
|
|
for line in "${lines[@]}"; do
|
2019-01-07 01:04:17 -05:00
|
|
|
if [[ "$line" == "$1" ]]; then
|
2014-12-13 18:56:31 -08:00
|
|
|
flunk "expected to not find line \`$line'"
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert() {
|
2014-12-15 09:54:06 -08:00
|
|
|
if ! "$*"; then
|
|
|
|
|
flunk "failed: $*"
|
2014-12-13 18:56:31 -08:00
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-16 15:18:24 -08:00
|
|
|
assert_exit_status() {
|
|
|
|
|
assert_equal "$status" "$1"
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-13 18:56:31 -08:00
|
|
|
# dokku functions
|
|
|
|
|
create_app() {
|
2019-01-07 01:04:17 -05:00
|
|
|
local APP="$1"
|
|
|
|
|
local TEST_APP=${APP:=$TEST_APP}
|
2016-03-03 18:18:09 -08:00
|
|
|
dokku apps:create "$TEST_APP"
|
2014-12-13 18:56:31 -08:00
|
|
|
}
|
|
|
|
|
|
2016-06-30 17:34:07 -07:00
|
|
|
create_key() {
|
2019-01-07 01:04:17 -05:00
|
|
|
ssh-keygen -P "" -f /tmp/testkey &>/dev/null
|
2016-06-30 17:34:07 -07:00
|
|
|
}
|
|
|
|
|
|
2014-12-13 18:56:31 -08:00
|
|
|
destroy_app() {
|
2019-01-07 01:04:17 -05:00
|
|
|
local RC="$1"
|
|
|
|
|
local RC=${RC:=0}
|
|
|
|
|
local APP="$2"
|
|
|
|
|
local TEST_APP=${APP:=$TEST_APP}
|
2016-03-03 18:18:09 -08:00
|
|
|
dokku --force apps:destroy "$TEST_APP"
|
2016-02-22 10:16:57 -08:00
|
|
|
return "$RC"
|
2014-12-13 18:56:31 -08:00
|
|
|
}
|
2014-12-21 13:52:20 -08:00
|
|
|
|
2016-06-30 17:34:07 -07:00
|
|
|
destroy_key() {
|
2019-01-07 01:04:17 -05:00
|
|
|
rm -f /tmp/testkey* &>/dev/null || true
|
2016-06-30 17:34:07 -07:00
|
|
|
}
|
|
|
|
|
|
2016-02-14 18:43:40 -08:00
|
|
|
check_urls() {
|
|
|
|
|
local PATTERN="$1"
|
2021-08-06 17:48:39 -04:00
|
|
|
run /bin/bash -c "dokku urls $TEST_APP | grep -E \"${PATTERN}\""
|
2016-02-22 10:16:57 -08:00
|
|
|
echo "output: $output"
|
|
|
|
|
echo "status: $status"
|
2016-02-14 18:43:40 -08:00
|
|
|
assert_success
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert_http_success() {
|
|
|
|
|
local url=$1
|
|
|
|
|
run curl -kSso /dev/null -w "%{http_code}" "${url}"
|
2016-02-22 10:16:57 -08:00
|
|
|
echo "output: $output"
|
|
|
|
|
echo "status: $status"
|
2016-02-14 18:43:40 -08:00
|
|
|
assert_output "200"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert_ssl_domain() {
|
|
|
|
|
local domain=$1
|
|
|
|
|
assert_app_domain "${domain}"
|
|
|
|
|
assert_http_redirect "http://${domain}" "https://${domain}:443/"
|
|
|
|
|
assert_http_success "https://${domain}"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert_nonssl_domain() {
|
|
|
|
|
local domain=$1
|
|
|
|
|
assert_app_domain "${domain}"
|
|
|
|
|
assert_http_success "http://${domain}"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert_app_domain() {
|
|
|
|
|
local domain=$1
|
2020-02-17 04:39:52 -05:00
|
|
|
run /bin/bash -c "dokku domains:report $TEST_APP --domains-app-vhosts | tr \" \" \"\n\" | grep -xF ${domain}"
|
2021-02-13 02:28:27 -05:00
|
|
|
echo "app domains: $(dokku domains:report "$TEST_APP" --domains-app-vhosts)"
|
2016-02-22 10:16:57 -08:00
|
|
|
echo "output: $output"
|
|
|
|
|
echo "status: $status"
|
2016-02-14 18:43:40 -08:00
|
|
|
assert_output "${domain}"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert_http_redirect() {
|
|
|
|
|
local from=$1
|
|
|
|
|
local to=$2
|
|
|
|
|
run curl -kSso /dev/null -w "%{redirect_url}" "${from}"
|
2016-02-22 10:16:57 -08:00
|
|
|
echo "output: $output"
|
|
|
|
|
echo "status: $status"
|
2016-02-14 18:43:40 -08:00
|
|
|
assert_output "${to}"
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-10 05:04:19 -05:00
|
|
|
assert_external_port() {
|
|
|
|
|
local CID="$1"
|
|
|
|
|
local EXTERNAL_PORT_COUNT
|
|
|
|
|
EXTERNAL_PORT_COUNT="$(docker port "$CID" | wc -l)"
|
|
|
|
|
run /bin/bash -c "[[ $EXTERNAL_PORT_COUNT -gt 0 ]]"
|
|
|
|
|
assert_success
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert_not_external_port() {
|
|
|
|
|
local CID="$1"
|
|
|
|
|
local EXTERNAL_PORT_COUNT
|
|
|
|
|
EXTERNAL_PORT_COUNT="$(docker port "$CID" | wc -l)"
|
|
|
|
|
run /bin/bash -c "[[ $EXTERNAL_PORT_COUNT -gt 0 ]]"
|
|
|
|
|
assert_failure
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert_url() {
|
2021-02-13 03:52:28 -05:00
|
|
|
url="$1"
|
2022-12-02 02:19:59 -05:00
|
|
|
run /bin/bash -c "dokku url $TEST_APP | xargs"
|
|
|
|
|
echo "VHOST: $(cat $DOKKU_ROOT/$TEST_APP/VHOST | xargs)"
|
|
|
|
|
echo "tls: $(ls $DOKKU_ROOT/$TEST_APP/tls || true)"
|
|
|
|
|
echo "proxy-is-enabled: $(dokku plugin:trigger proxy-is-enabled "$TEST_APP")"
|
|
|
|
|
echo "port-map: $(dokku config:get "$TEST_APP" DOKKU_PROXY_PORT_MAP)"
|
|
|
|
|
echo "url: $(dokku urls $TEST_APP)"
|
2020-02-10 05:04:19 -05:00
|
|
|
echo "output: $output"
|
|
|
|
|
echo "status: $status"
|
|
|
|
|
assert_output "${url}"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert_urls() {
|
2021-02-13 05:05:57 -05:00
|
|
|
# shellcheck disable=SC2124
|
|
|
|
|
urls="$@"
|
2021-02-13 03:52:28 -05:00
|
|
|
run /bin/bash -c "dokku urls $TEST_APP | xargs"
|
2022-12-02 02:19:59 -05:00
|
|
|
echo "VHOST: $(cat $DOKKU_ROOT/$TEST_APP/VHOST | xargs)"
|
|
|
|
|
echo "tls: $(ls $DOKKU_ROOT/$TEST_APP/tls || true)"
|
|
|
|
|
echo "proxy-is-enabled: $(dokku plugin:trigger proxy-is-enabled "$TEST_APP")"
|
|
|
|
|
echo "port-map: $(dokku config:get "$TEST_APP" DOKKU_PROXY_PORT_MAP)"
|
|
|
|
|
echo "urls: $(dokku urls $TEST_APP)"
|
2020-02-10 05:04:19 -05:00
|
|
|
echo "output: $output"
|
|
|
|
|
echo "status: $status"
|
2022-12-02 10:47:40 -05:00
|
|
|
for url in "$@"; do
|
|
|
|
|
assert_output_contains "$url"
|
|
|
|
|
done
|
2020-02-10 05:04:19 -05:00
|
|
|
}
|
|
|
|
|
|
2014-12-21 13:52:20 -08:00
|
|
|
deploy_app() {
|
2017-01-26 00:32:23 -07:00
|
|
|
declare APP_TYPE="$1" GIT_REMOTE="$2" CUSTOM_TEMPLATE="$3" CUSTOM_PATH="$4"
|
2020-06-20 17:02:27 -04:00
|
|
|
local APP_TYPE=${APP_TYPE:="python"}
|
2017-01-26 00:32:23 -07:00
|
|
|
local GIT_REMOTE=${GIT_REMOTE:="dokku@dokku.me:$TEST_APP"}
|
|
|
|
|
local GIT_REMOTE_BRANCH=${GIT_REMOTE_BRANCH:="master"}
|
2019-10-03 17:48:20 -04:00
|
|
|
local TMP=${CUSTOM_TMP:=$(mktemp -d "/tmp/dokku.me.XXXXX")}
|
2016-02-14 18:43:40 -08:00
|
|
|
|
2018-12-29 05:01:39 -05:00
|
|
|
rmdir "$TMP" && cp -r "${BATS_TEST_DIRNAME}/../../tests/apps/$APP_TYPE" "$TMP"
|
2016-02-22 10:16:57 -08:00
|
|
|
|
2016-02-14 18:43:40 -08:00
|
|
|
[[ -n "$CUSTOM_TEMPLATE" ]] && $CUSTOM_TEMPLATE $TEST_APP $TMP/$CUSTOM_PATH
|
2016-02-22 10:16:57 -08:00
|
|
|
|
2019-01-07 01:04:17 -05:00
|
|
|
pushd "$TMP" &>/dev/null || exit 1
|
2019-10-03 17:48:20 -04:00
|
|
|
[[ -z "$CUSTOM_TMP" ]] && trap 'popd &>/dev/null || true; rm -rf "$TMP"' RETURN INT TERM
|
2016-02-22 10:16:57 -08:00
|
|
|
|
2022-12-29 01:55:06 -05:00
|
|
|
git config --global init.defaultBranch master
|
2014-12-21 13:52:20 -08:00
|
|
|
git init
|
|
|
|
|
git config user.email "robot@example.com"
|
|
|
|
|
git config user.name "Test Robot"
|
2015-04-25 09:54:40 -07:00
|
|
|
echo "setting up remote: $GIT_REMOTE"
|
2016-02-22 10:16:57 -08:00
|
|
|
git remote add target "$GIT_REMOTE"
|
2014-12-21 13:52:20 -08:00
|
|
|
|
|
|
|
|
[[ -f gitignore ]] && mv gitignore .gitignore
|
|
|
|
|
git add .
|
|
|
|
|
git commit -m 'initial commit'
|
2017-01-26 00:32:23 -07:00
|
|
|
git push target "master:${GIT_REMOTE_BRANCH}" || destroy_app $?
|
2014-12-21 13:52:20 -08:00
|
|
|
}
|
2014-12-23 16:40:28 -08:00
|
|
|
|
2015-01-16 17:59:51 -08:00
|
|
|
setup_client_repo() {
|
2020-12-22 12:26:44 -05:00
|
|
|
local TMP
|
|
|
|
|
TMP=$(mktemp -d "/tmp/dokku.me.XXXXX")
|
2018-12-29 05:01:39 -05:00
|
|
|
rmdir "$TMP" && cp -r "${BATS_TEST_DIRNAME}/../../tests/apps/nodejs-express" "$TMP"
|
2016-02-22 10:16:57 -08:00
|
|
|
cd "$TMP" || exit 1
|
2015-01-16 17:59:51 -08:00
|
|
|
git init
|
|
|
|
|
git config user.email "robot@example.com"
|
|
|
|
|
git config user.name "Test Robot"
|
|
|
|
|
|
|
|
|
|
[[ -f gitignore ]] && mv gitignore .gitignore
|
|
|
|
|
git add .
|
|
|
|
|
git commit -m 'initial commit'
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-23 16:40:28 -08:00
|
|
|
setup_test_tls() {
|
2019-01-07 01:04:17 -05:00
|
|
|
local TLS_TYPE="$1"
|
|
|
|
|
local TLS="/home/dokku/$TEST_APP/tls"
|
2023-01-10 02:09:33 -05:00
|
|
|
|
2023-01-11 00:55:47 -05:00
|
|
|
if ! dokku apps:exists "$TEST_APP" >/dev/null 2>&1; then
|
|
|
|
|
create_app "$TEST_APP"
|
|
|
|
|
fi
|
2016-03-03 18:18:09 -08:00
|
|
|
mkdir -p "$TLS"
|
2015-01-15 10:34:14 -08:00
|
|
|
|
2016-02-14 18:43:40 -08:00
|
|
|
case "$TLS_TYPE" in
|
|
|
|
|
wildcard)
|
|
|
|
|
local TLS_ARCHIVE=server_ssl_wildcard.tar
|
|
|
|
|
;;
|
|
|
|
|
sans)
|
|
|
|
|
local TLS_ARCHIVE=server_ssl_sans.tar
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
local TLS_ARCHIVE=server_ssl.tar
|
|
|
|
|
;;
|
|
|
|
|
esac
|
2016-03-03 18:18:09 -08:00
|
|
|
tar xf "$BATS_TEST_DIRNAME/$TLS_ARCHIVE" -C "$TLS"
|
|
|
|
|
sudo chown -R dokku:dokku "${TLS}/.."
|
2015-02-12 12:33:13 -08:00
|
|
|
}
|
2015-05-05 13:10:49 -07:00
|
|
|
|
2022-10-22 17:47:54 -04:00
|
|
|
teardown_test_tls() {
|
|
|
|
|
local TLS="/home/dokku/$TEST_APP/tls"
|
|
|
|
|
rm -rf "$TLS"
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-05 13:10:49 -07:00
|
|
|
custom_ssl_nginx_template() {
|
2019-01-07 01:04:17 -05:00
|
|
|
local APP="$1"
|
|
|
|
|
local APP_REPO_DIR="$2"
|
2016-02-14 18:43:40 -08:00
|
|
|
[[ -z "$APP" ]] && local APP="$TEST_APP"
|
2016-02-22 10:16:57 -08:00
|
|
|
mkdir -p "$APP_REPO_DIR"
|
2016-02-14 18:43:40 -08:00
|
|
|
|
|
|
|
|
echo "injecting custom_ssl_nginx_template -> $APP_REPO_DIR/nginx.conf.sigil"
|
2019-01-07 01:04:17 -05:00
|
|
|
cat <<EOF >"$APP_REPO_DIR/nginx.conf.sigil"
|
2016-06-14 17:36:26 -07:00
|
|
|
{{ range \$port_map := .PROXY_PORT_MAP | split " " }}
|
|
|
|
|
{{ \$port_map_list := \$port_map | split ":" }}
|
|
|
|
|
{{ \$scheme := index \$port_map_list 0 }}
|
|
|
|
|
{{ \$listen_port := index \$port_map_list 1 }}
|
|
|
|
|
{{ \$upstream_port := index \$port_map_list 2 }}
|
|
|
|
|
{{ if eq \$scheme "http" }}
|
2015-05-05 13:10:49 -07:00
|
|
|
server {
|
2016-06-14 17:36:26 -07:00
|
|
|
listen [::]:{{ \$listen_port }};
|
|
|
|
|
listen {{ \$listen_port }};
|
|
|
|
|
server_name {{ $.NOSSL_SERVER_NAME }} $CUSTOM_TEMPLATE_SSL_DOMAIN;
|
2017-07-03 11:07:07 +09:30
|
|
|
return 301 https://\$host:{{ $.PROXY_SSL_PORT }}\$request_uri;
|
2015-05-05 13:10:49 -07:00
|
|
|
}
|
2016-06-14 17:36:26 -07:00
|
|
|
{{ else if eq \$scheme "https"}}
|
2015-05-05 13:10:49 -07:00
|
|
|
server {
|
2022-12-29 01:59:54 -05:00
|
|
|
listen [::]:{{ $.PROXY_SSL_PORT }} ssl;
|
|
|
|
|
listen {{ $.PROXY_SSL_PORT }} ssl;
|
2016-06-14 17:36:26 -07:00
|
|
|
{{ if $.SSL_SERVER_NAME }}server_name {{ $.SSL_SERVER_NAME }} $CUSTOM_TEMPLATE_SSL_DOMAIN; {{ end }}
|
|
|
|
|
{{ if $.NOSSL_SERVER_NAME }}server_name {{ $.NOSSL_SERVER_NAME }} $CUSTOM_TEMPLATE_SSL_DOMAIN; {{ end }}
|
|
|
|
|
ssl_certificate {{ $.APP_SSL_PATH }}/server.crt;
|
|
|
|
|
ssl_certificate_key {{ $.APP_SSL_PATH }}/server.key;
|
2015-05-05 13:10:49 -07:00
|
|
|
|
|
|
|
|
keepalive_timeout 70;
|
|
|
|
|
location / {
|
2016-06-14 17:36:26 -07:00
|
|
|
proxy_pass http://{{ $.APP }}-{{ \$upstream_port }};
|
2015-05-05 13:10:49 -07:00
|
|
|
proxy_http_version 1.1;
|
2016-02-14 18:43:40 -08:00
|
|
|
proxy_set_header Upgrade \$http_upgrade;
|
2019-07-13 01:25:55 -04:00
|
|
|
proxy_set_header Connection \$http_connection;
|
2016-02-14 18:43:40 -08:00
|
|
|
proxy_set_header Host \$http_host;
|
|
|
|
|
proxy_set_header X-Forwarded-Proto \$scheme;
|
|
|
|
|
proxy_set_header X-Forwarded-For \$remote_addr;
|
|
|
|
|
proxy_set_header X-Forwarded-Port \$server_port;
|
|
|
|
|
proxy_set_header X-Request-Start \$msec;
|
2015-05-05 13:10:49 -07:00
|
|
|
}
|
2016-06-14 17:36:26 -07:00
|
|
|
include {{ $.DOKKU_ROOT }}/{{ $.APP }}/nginx.conf.d/*.conf;
|
2015-05-05 13:10:49 -07:00
|
|
|
}
|
2016-06-14 17:36:26 -07:00
|
|
|
{{ end }}{{ end }}
|
|
|
|
|
|
2020-03-11 12:34:29 -04:00
|
|
|
{{ if $.DOKKU_APP_WEB_LISTENERS }}
|
2016-06-14 17:36:26 -07:00
|
|
|
{{ range \$upstream_port := $.PROXY_UPSTREAM_PORTS | split " " }}
|
|
|
|
|
upstream {{ $.APP }}-{{ \$upstream_port }} {
|
2020-03-11 12:34:29 -04:00
|
|
|
{{ range \$listeners := $.DOKKU_APP_WEB_LISTENERS | split " " }}
|
2017-08-04 12:20:35 -05:00
|
|
|
{{ \$listener_list := \$listeners | split ":" }}
|
|
|
|
|
{{ \$listener_ip := index \$listener_list 0 }}
|
2016-06-14 17:36:26 -07:00
|
|
|
server {{ \$listener_ip }}:{{ \$upstream_port }};{{ end }}
|
2016-02-14 18:43:40 -08:00
|
|
|
}
|
2016-06-14 17:36:26 -07:00
|
|
|
{{ end }}{{ end }}
|
2015-05-05 13:10:49 -07:00
|
|
|
EOF
|
2019-01-07 01:04:17 -05:00
|
|
|
cat "$APP_REPO_DIR/nginx.conf.sigil"
|
2015-05-05 13:10:49 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
custom_nginx_template() {
|
2019-01-07 01:04:17 -05:00
|
|
|
local APP="$1"
|
|
|
|
|
local APP_REPO_DIR="$2"
|
2016-02-14 18:43:40 -08:00
|
|
|
[[ -z "$APP" ]] && local APP="$TEST_APP"
|
2016-02-22 10:16:57 -08:00
|
|
|
mkdir -p "$APP_REPO_DIR"
|
2016-02-14 18:43:40 -08:00
|
|
|
|
|
|
|
|
echo "injecting custom_nginx_template -> $APP_REPO_DIR/nginx.conf.sigil"
|
2019-01-07 01:04:17 -05:00
|
|
|
cat <<EOF >"$APP_REPO_DIR/nginx.conf.sigil"
|
2016-06-14 17:36:26 -07:00
|
|
|
{{ range \$port_map := .PROXY_PORT_MAP | split " " }}
|
|
|
|
|
{{ \$port_map_list := \$port_map | split ":" }}
|
|
|
|
|
{{ \$scheme := index \$port_map_list 0 }}
|
|
|
|
|
{{ \$listen_port := index \$port_map_list 1 }}
|
|
|
|
|
{{ \$upstream_port := index \$port_map_list 2 }}
|
|
|
|
|
|
2015-05-05 13:10:49 -07:00
|
|
|
server {
|
2016-06-14 17:36:26 -07:00
|
|
|
listen [::]:{{ \$listen_port }};
|
|
|
|
|
listen {{ \$listen_port }};
|
|
|
|
|
server_name {{ $.NOSSL_SERVER_NAME }} customtemplate.dokku.me;
|
2015-05-05 13:10:49 -07:00
|
|
|
|
|
|
|
|
location / {
|
2016-06-14 17:36:26 -07:00
|
|
|
proxy_pass http://{{ $.APP }}-{{ \$upstream_port }};
|
2015-05-05 13:10:49 -07:00
|
|
|
proxy_http_version 1.1;
|
2016-02-14 18:43:40 -08:00
|
|
|
proxy_set_header Upgrade \$http_upgrade;
|
2015-05-05 13:10:49 -07:00
|
|
|
proxy_set_header Connection "upgrade";
|
2016-02-14 18:43:40 -08:00
|
|
|
proxy_set_header Host \$http_host;
|
|
|
|
|
proxy_set_header X-Forwarded-Proto \$scheme;
|
|
|
|
|
proxy_set_header X-Forwarded-For \$remote_addr;
|
|
|
|
|
proxy_set_header X-Forwarded-Port \$server_port;
|
|
|
|
|
proxy_set_header X-Request-Start \$msec;
|
2015-05-05 13:10:49 -07:00
|
|
|
}
|
2016-06-14 17:36:26 -07:00
|
|
|
include {{ $.DOKKU_ROOT }}/{{ $.APP }}/nginx.conf.d/*.conf;
|
2015-05-05 13:10:49 -07:00
|
|
|
}
|
2016-02-14 18:43:40 -08:00
|
|
|
{{ end }}
|
2016-06-14 17:36:26 -07:00
|
|
|
|
2020-03-11 12:34:29 -04:00
|
|
|
{{ if $.DOKKU_APP_WEB_LISTENERS }}
|
2016-06-14 17:36:26 -07:00
|
|
|
{{ range \$upstream_port := $.PROXY_UPSTREAM_PORTS | split " " }}
|
|
|
|
|
upstream {{ $.APP }}-{{ \$upstream_port }} {
|
2020-03-11 12:34:29 -04:00
|
|
|
{{ range \$listeners := $.DOKKU_APP_WEB_LISTENERS | split " " }}
|
2017-08-04 12:20:35 -05:00
|
|
|
{{ \$listener_list := \$listeners | split ":" }}
|
|
|
|
|
{{ \$listener_ip := index \$listener_list 0 }}
|
2016-06-14 17:36:26 -07:00
|
|
|
server {{ \$listener_ip }}:{{ \$upstream_port }};{{ end }}
|
|
|
|
|
}
|
|
|
|
|
{{ end }}{{ end }}
|
2020-03-13 12:42:42 -04:00
|
|
|
{{ if $.DOKKU_APP_WORKER_LISTENERS }}
|
|
|
|
|
{{ range \$upstream_port := $.PROXY_UPSTREAM_PORTS | split " " }}
|
|
|
|
|
upstream {{ $.APP }}-worker-{{ \$upstream_port }} {
|
|
|
|
|
{{ range \$listeners := $.DOKKU_APP_WORKER_LISTENERS | split " " }}
|
|
|
|
|
server {{ \$listeners }};{{ end }}
|
|
|
|
|
}
|
|
|
|
|
{{ end }}{{ end }}
|
|
|
|
|
|
2016-02-14 18:43:40 -08:00
|
|
|
EOF
|
2019-01-07 01:04:17 -05:00
|
|
|
cat "$APP_REPO_DIR/nginx.conf.sigil"
|
2016-02-14 18:43:40 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bad_custom_nginx_template() {
|
2019-01-07 01:04:17 -05:00
|
|
|
local APP="$1"
|
|
|
|
|
local APP_REPO_DIR="$2"
|
2016-02-14 18:43:40 -08:00
|
|
|
[[ -z "$APP" ]] && local APP="$TEST_APP"
|
|
|
|
|
echo "injecting bad_custom_nginx_template -> $APP_REPO_DIR/nginx.conf.sigil"
|
2019-01-07 01:04:17 -05:00
|
|
|
cat <<EOF >"$APP_REPO_DIR/nginx.conf.sigil"
|
2016-02-14 18:43:40 -08:00
|
|
|
some lame nginx config
|
2015-05-05 13:10:49 -07:00
|
|
|
EOF
|
|
|
|
|
}
|
2018-07-28 00:19:13 -04:00
|
|
|
|
2020-12-30 05:48:29 -05:00
|
|
|
template_checks_file() {
|
|
|
|
|
local APP="$1"
|
|
|
|
|
local APP_REPO_DIR="$2"
|
|
|
|
|
[[ -z "$APP" ]] && local APP="$TEST_APP"
|
|
|
|
|
echo "injecting templated CHECKS file -> $APP_REPO_DIR/CHECKS"
|
|
|
|
|
cat <<EOF >"$APP_REPO_DIR/CHECKS"
|
|
|
|
|
WAIT=2 # wait 2 seconds
|
|
|
|
|
TIMEOUT=5 # set timeout to 5 seconds
|
|
|
|
|
ATTEMPTS=2 # try 2 times
|
|
|
|
|
|
|
|
|
|
{{ var "HEALTHCHECK_ENDPOINT" }} {{ var "HEALTHCHECK_ENDPOINT" }}
|
|
|
|
|
EOF
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-11 11:44:13 -05:00
|
|
|
add_release_command() {
|
|
|
|
|
local APP="$1"
|
|
|
|
|
local APP_REPO_DIR="$2"
|
|
|
|
|
[[ -z "$APP" ]] && local APP="$TEST_APP"
|
2021-02-13 02:05:44 -05:00
|
|
|
echo "release: touch /app/release.test" >>"$APP_REPO_DIR/Procfile"
|
2020-12-11 11:44:13 -05:00
|
|
|
}
|
|
|
|
|
|
2021-02-21 21:00:14 -05:00
|
|
|
add_postdeploy_command() {
|
|
|
|
|
local APP="$1"
|
|
|
|
|
local APP_REPO_DIR="$2"
|
|
|
|
|
[[ -z "$APP" ]] && local APP="$TEST_APP"
|
|
|
|
|
touch "$APP_REPO_DIR/app.json"
|
|
|
|
|
contents=$(jq '.scripts.postdeploy = "touch /app/heroku-postdeploy.test"' "$APP_REPO_DIR/app.json")
|
2021-02-28 14:36:45 -05:00
|
|
|
echo "${contents}" >"$APP_REPO_DIR/app.json"
|
2021-02-21 21:00:14 -05:00
|
|
|
}
|
|
|
|
|
|
2022-11-28 02:24:27 -05:00
|
|
|
move_dockerfile_into_place() {
|
|
|
|
|
local APP="$1"
|
|
|
|
|
local APP_REPO_DIR="$2"
|
|
|
|
|
[[ -z "$APP" ]] && local APP="$TEST_APP"
|
|
|
|
|
mv "$APP_REPO_DIR/alt.Dockerfile" "$APP_REPO_DIR/Dockerfile"
|
|
|
|
|
}
|
|
|
|
|
|
2021-02-11 03:52:02 -05:00
|
|
|
add_requirements_txt() {
|
|
|
|
|
local APP="$1"
|
|
|
|
|
local APP_REPO_DIR="$2"
|
|
|
|
|
[[ -z "$APP" ]] && local APP="$TEST_APP"
|
2021-02-13 02:05:44 -05:00
|
|
|
echo "flask" >>"$APP_REPO_DIR/requirements.txt"
|
2021-02-11 03:52:02 -05:00
|
|
|
}
|
|
|
|
|
|
2018-12-27 23:32:28 +01:00
|
|
|
create_network() {
|
|
|
|
|
local NETWORK_NAME="$1:=$TEST_NETWORK"
|
|
|
|
|
|
|
|
|
|
NETWORK=$(docker network ls -q -f name="$NETWORK_NAME")
|
|
|
|
|
[[ -z "$NETWORK" ]] && docker network create "$NETWORK_NAME"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
attach_network() {
|
|
|
|
|
local NETWORK_NAME="$1:=$TEST_NETWORK"
|
|
|
|
|
|
|
|
|
|
NETWORK=$(docker network ls -q -f name="$NETWORK_NAME")
|
|
|
|
|
[[ -n "$NETWORK" ]] && docker network connect "$NETWORK_NAME" "${TEST_APP}.web.1"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
create_attach_network() {
|
|
|
|
|
local NETWORK_NAME="$1:=$TEST_NETWORK"
|
|
|
|
|
|
|
|
|
|
create_network "$NETWORK_NAME"
|
|
|
|
|
attach_network "$NETWORK_NAME"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
delete_network() {
|
|
|
|
|
local NETWORK_NAME="$1:=$TEST_NETWORK"
|
|
|
|
|
|
|
|
|
|
NETWORK=$(docker network ls -q -f name="$NETWORK_NAME")
|
|
|
|
|
[[ -n "$NETWORK" ]] && docker network rm "$NETWORK_NAME"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
detach_network() {
|
|
|
|
|
local NETWORK_NAME="$1:=$TEST_NETWORK"
|
|
|
|
|
|
|
|
|
|
NETWORK=$(docker network ls -q -f name="$NETWORK_NAME")
|
|
|
|
|
[[ -z "$NETWORK" ]] && docker network disconnect "$NETWORK_NAME" "${TEST_APP}.web.1"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
detach_delete_network() {
|
|
|
|
|
local NETWORK_NAME="$1:=$TEST_NETWORK"
|
|
|
|
|
|
|
|
|
|
detach_network "$NETWORK_NAME"
|
|
|
|
|
delete_network "$NETWORK_NAME"
|
|
|
|
|
}
|
2021-08-12 22:07:53 -04:00
|
|
|
|
|
|
|
|
install_pack() {
|
|
|
|
|
if ! command -v "pack" &>/dev/null; then
|
|
|
|
|
add-apt-repository --yes ppa:cncf-buildpacks/pack-cli
|
|
|
|
|
apt-get update
|
|
|
|
|
apt-get --yes install pack-cli
|
|
|
|
|
fi
|
|
|
|
|
}
|
2022-11-08 23:52:38 -05:00
|
|
|
|
|
|
|
|
convert_to_dockerfile() {
|
|
|
|
|
local APP="$1"
|
|
|
|
|
local APP_REPO_DIR="$2"
|
|
|
|
|
[[ -z "$APP" ]] && local APP="$TEST_APP"
|
|
|
|
|
mv "$APP_REPO_DIR/dockerfile.Dockerfile" "$APP_REPO_DIR/Dockerfile"
|
|
|
|
|
}
|