From edd6e476b3742984f3f345c4a85ef1f287c67f3e Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Fri, 2 Dec 2022 02:19:59 -0500 Subject: [PATCH] refactor: simplify how url generation works The URLS file is no longer necessary as urls are now generated directly from the app VHOST file. This also moves all the url generation logic to the domains plugin. --- docs/appendices/0.29.0-migration-guide.md | 2 + docs/development/plugin-triggers.md | 30 +++++ plugins/00_dokku-standard/subcommands/urls | 6 +- .../caddy-vhosts/docker-args-process-deploy | 4 - plugins/certs/certs-exists | 18 +++ plugins/common/functions | 111 +----------------- plugins/domains/domains-urls | 35 ++++++ plugins/domains/functions | 5 +- plugins/domains/install | 1 + plugins/domains/internal-functions | 67 +++++++++++ plugins/domains/post-app-clone-setup | 2 +- plugins/domains/post-app-rename-setup | 4 +- plugins/nginx-vhosts/functions | 8 +- plugins/proxy/proxy-configure-ports | 3 +- .../traefik-vhosts/docker-args-process-deploy | 5 - tests/unit/apps_2.bats | 2 - tests/unit/core_2.bats | 69 ++++++++--- tests/unit/nginx-vhosts_2.bats | 14 +-- tests/unit/nginx-vhosts_4.bats | 4 +- tests/unit/nginx-vhosts_5.bats | 2 +- tests/unit/nginx-vhosts_7.bats | 8 +- tests/unit/nginx-vhosts_9.bats | 8 +- tests/unit/test_helper.bash | 18 +-- 23 files changed, 247 insertions(+), 179 deletions(-) create mode 100755 plugins/certs/certs-exists create mode 100755 plugins/domains/domains-urls diff --git a/docs/appendices/0.29.0-migration-guide.md b/docs/appendices/0.29.0-migration-guide.md index 0dc3d4ffe..3aced033b 100644 --- a/docs/appendices/0.29.0-migration-guide.md +++ b/docs/appendices/0.29.0-migration-guide.md @@ -13,3 +13,5 @@ - The `DOKKU_WAIT_TO_RETIRE` environment variable has been migrated to a `checks` property named `wait-to-retire` and will be ignored if set as an environment variable. - The `Procfile` is now extracted when source code is extracted for a build and not from the built image. Users can specify alternative paths via the `procfile-path` property of the `ps` plugin. See the [process management documentation](/docs/processes/process-management.md#changing-the-procfile-location) for more information on how to configure the `Procfile` path for your application. - The `domains-setup` trigger has been removed. Initial app domains will now be automatically setup during app creation. +- The `URLS` file containing generated urls for an app is no longer generated or referenced. Users should retrieve app urls via the new `domains-urls` plugin trigger. +- The common function `get_app_urls` has been removed. Users should retrieve app urls via the new `domains-urls` plugin trigger. diff --git a/docs/development/plugin-triggers.md b/docs/development/plugin-triggers.md index 743ffcc6a..81a14ae57 100644 --- a/docs/development/plugin-triggers.md +++ b/docs/development/plugin-triggers.md @@ -236,6 +236,21 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x # TODO ``` +### `certs-exists` + +- Description: Echos `true` if certs exists for the app, `false` otherwise +- Invoked by: +- Arguments: `$APP` +- Example: + +```shell +#!/usr/bin/env bash + +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x + +# TODO +``` + ### `check-deploy` - Description: Allows you to run checks on a deploy before Dokku allows the container to handle requests. @@ -713,6 +728,21 @@ set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x # TODO ``` +### `domains-urls` + +- Description: Gets an app's url(s) +- Invoked by: +- Arguments: `$APP $URL_TYPE` +- Example: + +```shell +#!/usr/bin/env bash + +set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x + +# TODO +``` + ### `domains-vhost-enabled` - Description: Checks if a virtual hosts are enabled for an app diff --git a/plugins/00_dokku-standard/subcommands/urls b/plugins/00_dokku-standard/subcommands/urls index f71fed601..1649aba5e 100755 --- a/plugins/00_dokku-standard/subcommands/urls +++ b/plugins/00_dokku-standard/subcommands/urls @@ -1,15 +1,15 @@ #!/usr/bin/env bash +source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" set -eo pipefail [[ $DOKKU_TRACE ]] && set -x -source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" cmd-urls() { declare desc="reports dokku vitals for troubleshooting" declare cmd="url" - declare APP="$2" + declare URL_TYPE="$1" APP="$2" verify_app_name "$APP" - get_app_urls "$@" + plugn trigger domains-urls "$APP" "$URL_TYPE" } cmd-urls "$@" diff --git a/plugins/caddy-vhosts/docker-args-process-deploy b/plugins/caddy-vhosts/docker-args-process-deploy index 60a4c232e..a5273b709 100755 --- a/plugins/caddy-vhosts/docker-args-process-deploy +++ b/plugins/caddy-vhosts/docker-args-process-deploy @@ -11,7 +11,6 @@ trigger-caddy-vhosts-docker-args-process-deploy() { local app_domains caddy_domains is_app_listening letsencrypt_email output proxy_container_port proxy_host_port port_map proxy_port_map proxy_scheme proxy_schemes scheme tls_internal local proxy_container_http_port proxy_container_http_port_candidate proxy_host_http_port_candidate local proxy_container_https_port proxy_container_https_port_candidate proxy_host_https_port_candidate - local app_urls_path="$DOKKU_ROOT/$APP/URLS" local STDIN=$(cat) if [[ "$PROC_TYPE" != "web" ]]; then @@ -128,9 +127,6 @@ trigger-caddy-vhosts-docker-args-process-deploy() { output="$output --label \"caddy.reverse_proxy={{ upstreams $proxy_container_http_port }}\"" fi - - echo "# THIS FILE IS GENERATED BY DOKKU - DO NOT EDIT, YOUR CHANGES WILL BE OVERWRITTEN" >"$app_urls_path" - xargs -I{} echo "$scheme://{}" <<<"$(echo "${app_domains}" | tr ' ' '\n' | sort -u)" >>"$app_urls_path" fi echo -n "$STDIN$output" diff --git a/plugins/certs/certs-exists b/plugins/certs/certs-exists new file mode 100755 index 000000000..25311583e --- /dev/null +++ b/plugins/certs/certs-exists @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +source "$PLUGIN_AVAILABLE_PATH/certs/functions" +set -eo pipefail +[[ $DOKKU_TRACE ]] && set -x + +trigger-certs-certs-exists() { + declare desc="checks if certs exist" + declare trigger="certs-exists" + declare APP="$1" + + if is_ssl_enabled "$APP"; then + echo "true" + else + echo "false" + fi +} + +trigger-certs-certs-exists "$@" diff --git a/plugins/common/functions b/plugins/common/functions index 220527418..a7ef0324d 100755 --- a/plugins/common/functions +++ b/plugins/common/functions @@ -384,7 +384,7 @@ is_image_herokuish_based() { fi if [[ -n "$APP" ]]; then - DOKKU_APP_USER=$(config_get "$APP" DOKKU_APP_USER || true) + DOKKU_APP_USER=$(plugn trigger config-get "$APP" DOKKU_APP_USER || true) fi DOKKU_APP_USER=${DOKKU_APP_USER:="herokuishuser"} @@ -719,7 +719,7 @@ release_and_deploy() { dokku_log_info1 "Deploying $APP via the $DOKKU_SCHEDULER scheduler..." cmd-deploy "$APP" "$IMAGE_TAG" dokku_log_info2 "Application deployed:" - get_app_urls urls "$APP" | sed "s/^/ /" + plugn trigger domains-urls "$APP" urls | sed "s/^/ /" else dokku_log_info1 "Skipping deployment" fi @@ -904,113 +904,6 @@ get_container_ports() { echo "$container_ports" } -get_app_urls() { - declare desc="print an app's available urls" - declare URL_TYPE="$1" APP="$2" - local urls - - urls=$(plugn trigger app-urls "$APP" "$URL_TYPE") - if [[ -n "$urls" ]]; then - echo "$urls" | sort - else - internal_get_app_urls "$URL_TYPE" "$APP" | sort - fi -} - -internal_get_app_urls() { - declare desc="print an app's available urls" - source "$PLUGIN_AVAILABLE_PATH/certs/functions" - source "$PLUGIN_AVAILABLE_PATH/config/functions" - - local APP="$2" - local URLS_FILE="$DOKKU_ROOT/$APP/URLS" - local DOKKU_PROXY_PORT_MAP=$(config_get "$APP" DOKKU_PROXY_PORT_MAP || true) - - if [[ -s "$URLS_FILE" ]]; then - local app_urls="$(grep -v -E "^#" "$URLS_FILE")" - if [[ -n "$DOKKU_PROXY_PORT_MAP" ]]; then - local port_map app_vhost - local app_vhosts=$(plugn trigger domains-list "$APP") - for port_map in $DOKKU_PROXY_PORT_MAP; do - local scheme="$(awk -F ':' '{ print $1 }' <<<"$port_map")" - local listen_port="$(awk -F ':' '{ print $2 }' <<<"$port_map")" - for app_vhost in $app_vhosts; do - if [[ "$listen_port" != "80" ]] && [[ "$listen_port" != "443" ]]; then - port_urls+=" $scheme://$app_vhost:$listen_port " - else - port_urls+=" $scheme://$app_vhost " - fi - done - done - fi - local port_urls="$(echo "$port_urls" | xargs)" - local URLS="$(merge_dedupe_list "$port_urls $app_urls" " ")" - case "$1" in - url) - if is_ssl_enabled "$APP"; then - echo "$URLS" | tr ' ' '\n' | grep https | head -n1 - else - echo "$URLS" | tr ' ' '\n' | head -n1 - fi - ;; - urls) - echo "$URLS" | tr ' ' '\n' | sort - ;; - esac - else - if [[ -s "$DOKKU_ROOT/VHOST" ]]; then - while read -r VHOST || [[ -n "$VHOST" ]]; do - internal_get_app_url_with_vhost "$APP" "$VHOST" - done <"$DOKKU_ROOT/VHOST" - else - internal_get_app_url_with_vhost "$APP" "$(hostname -f)" - fi - fi -} - -internal_get_app_url_with_vhost() { - declare APP="$1" VHOST="$2" - - local RAW_TCP_PORTS="$(get_app_raw_tcp_ports "$APP")" - local DOKKU_PROXY_PORT_MAP=$(config_get "$APP" DOKKU_PROXY_PORT_MAP || true) - local SCHEME="http" - local SSL="$DOKKU_ROOT/$APP/tls" - if [[ -e "$SSL/server.crt" && -e "$SSL/server.key" ]]; then - local SCHEME="https" - fi - - if [[ "$(plugn trigger proxy-is-enabled "$APP")" == "false" ]]; then - if [[ -n "$RAW_TCP_PORTS" ]]; then - local APP_CONTAINER_PORTS="$(get_container_ports "$APP")" - local app_port - for app_port in $APP_CONTAINER_PORTS; do - echo "$VHOST:$app_port (container)" - done - else - local DOKKU_APP_WEB_LISTENERS PORT - DOKKU_APP_WEB_LISTENERS="$(plugn trigger network-get-listeners "$APP" "web" | xargs)" - for DOKKU_APP_WEB_LISTENER in $DOKKU_APP_WEB_LISTENERS; do - PORT="$(echo "$DOKKU_APP_WEB_LISTENER" | cut -d ':' -f2)" - echo "$SCHEME://$VHOST:$PORT (container)" - done - shopt -u nullglob - fi - elif [[ -n "$DOKKU_PROXY_PORT_MAP" ]]; then - local port_map - for port_map in $DOKKU_PROXY_PORT_MAP; do - local scheme="$(awk -F ':' '{ print $1 }' <<<"$port_map")" - local listen_port="$(awk -F ':' '{ print $2 }' <<<"$port_map")" - echo "$scheme://$VHOST:$listen_port" - done - elif [[ -n "$RAW_TCP_PORTS" ]]; then - for p in $RAW_TCP_PORTS; do - echo "http://$VHOST:$p" - done - else - echo "$SCHEME://$VHOST" - fi -} - get_json_value() { declare desc="return value of provided json key from a json stream on stdin" # JSON_NODE should be expresses as either a top-level object that has no children diff --git a/plugins/domains/domains-urls b/plugins/domains/domains-urls new file mode 100755 index 000000000..3e45c80d5 --- /dev/null +++ b/plugins/domains/domains-urls @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +source "$PLUGIN_AVAILABLE_PATH/domains/internal-functions" +set -eo pipefail +[[ $DOKKU_TRACE ]] && set -x + +trigger-domains-domains-urls() { + declare desc="gets an app's urls" + declare trigger="domains-urls" + declare APP="$1" URL_TYPE="$2" + local urls + + local SCHEME="http" + local DEFAULT_LISTEN_PORT="80" + if [[ "$(plugn trigger certs-exists "$APP")" == "true" ]]; then + SCHEME="https" + DEFAULT_LISTEN_PORT="443" + fi + + urls=$(plugn trigger app-urls "$APP" "$URL_TYPE") + if [[ -n "$urls" ]]; then + if [[ "$URL_TYPE" == "url" ]]; then + echo "$urls" | tr ' ' '\n' | grep "$SCHEME://" | head -n1 + else + echo "$urls" | tr ' ' '\n' | sort + fi + else + if [[ "$URL_TYPE" == "url" ]]; then + fn-domains-generate-urls "$APP" "$SCHEME" "$DEFAULT_LISTEN_PORT" | tr ' ' '\n' | grep "$SCHEME://" | head -n1 + else + fn-domains-generate-urls "$APP" "$SCHEME" "$DEFAULT_LISTEN_PORT" | tr ' ' '\n' | sort + fi + fi +} + +trigger-domains-domains-urls "$@" diff --git a/plugins/domains/functions b/plugins/domains/functions index e7fe0bd2d..1ebff92d7 100755 --- a/plugins/domains/functions +++ b/plugins/domains/functions @@ -8,12 +8,11 @@ disable_app_vhost() { declare desc="disable vhost support for given application" declare APP=$1 RESTART_APP="$2" local APP_VHOST_PATH="$DOKKU_ROOT/$APP/VHOST" - local APP_URLS_PATH="$DOKKU_ROOT/$APP/URLS" plugn trigger pre-disable-vhost "$APP" - if [[ -f "$APP_VHOST_PATH" ]] || [[ -f "$APP_URLS_PATH" ]]; then + if [[ -f "$APP_VHOST_PATH" ]]; then dokku_log_info1 "App virtual host support disabled" - rm -f "$APP_VHOST_PATH" "$APP_URLS_PATH" + rm -f "$APP_VHOST_PATH" fi [[ "$RESTART_APP" == "--no-restart" ]] && local CONFIG_SET_ARGS=$RESTART_APP diff --git a/plugins/domains/install b/plugins/domains/install index 9a3155659..cb83eb49f 100755 --- a/plugins/domains/install +++ b/plugins/domains/install @@ -10,6 +10,7 @@ trigger-domains-install() { shopt -s nullglob for app in $(dokku_apps "false" 2>/dev/null); do domains_setup "$app" + rm -f "$DOKKU_ROOT/$APP/URLS" done } diff --git a/plugins/domains/internal-functions b/plugins/domains/internal-functions index adb6225c0..921ac9885 100755 --- a/plugins/domains/internal-functions +++ b/plugins/domains/internal-functions @@ -114,3 +114,70 @@ fn-domains-global-vhosts() { get_global_vhosts | tr '\n' ' ' fi } + +fn-domains-generate-urls() { + declare APP="$1" SCHEME="$2" DEFAULT_LISTEN_PORT="$3" + + local app_vhosts="$(plugn trigger domains-list "$APP")" + if [[ -n "$app_vhosts" ]]; then + for app_vhost in $app_vhosts; do + fn-domains-generate-urls-from-config "$APP" "$SCHEME" "$app_vhost" "$DEFAULT_LISTEN_PORT" + done + else + if [[ -s "$DOKKU_ROOT/VHOST" ]]; then + while read -r VHOST || [[ -n "$VHOST" ]]; do + fn-domains-generate-urls-from-config "$APP" "$SCHEME" "$VHOST" "$DEFAULT_LISTEN_PORT" + done <"$DOKKU_ROOT/VHOST" + else + fn-domains-generate-urls-from-config "$APP" "$SCHEME" "$(hostname -f)" "$DEFAULT_LISTEN_PORT" + fi + fi +} + +fn-domains-generate-urls-from-config() { + declare APP="$1" SCHEME="$2" VHOST="$3" DEFAULT_LISTEN_PORT="$4" + local DOKKU_PROXY_PORT_MAP=$(plugn trigger config-get "$APP" DOKKU_PROXY_PORT_MAP || true) + local RAW_TCP_PORTS="$(get_app_raw_tcp_ports "$APP")" + + if [[ "$(plugn trigger proxy-is-enabled "$APP")" == "false" ]]; then + if [[ -n "$RAW_TCP_PORTS" ]]; then + local APP_CONTAINER_PORTS="$(get_container_ports "$APP")" + local app_port + for listen_port in $APP_CONTAINER_PORTS; do + fn-domains-generate-url "$SCHEME" "$VHOST" "$listen_port" + done + else + local DOKKU_APP_WEB_LISTENERS PORT + DOKKU_APP_WEB_LISTENERS="$(plugn trigger network-get-listeners "$APP" "web" | xargs)" + for DOKKU_APP_WEB_LISTENER in $DOKKU_APP_WEB_LISTENERS; do + listen_port="$(echo "$DOKKU_APP_WEB_LISTENER" | cut -d ':' -f2)" + fn-domains-generate-url "$SCHEME" "$VHOST" "$listen_port" + done + shopt -u nullglob + fi + elif [[ -n "$DOKKU_PROXY_PORT_MAP" ]]; then + local port_map + for port_map in $DOKKU_PROXY_PORT_MAP; do + local scheme="$(awk -F ':' '{ print $1 }' <<<"$port_map")" + local listen_port="$(awk -F ':' '{ print $2 }' <<<"$port_map")" + fn-domains-generate-url "$SCHEME" "$VHOST" "$listen_port" + done + elif [[ -n "$RAW_TCP_PORTS" ]]; then + for listen_port in $RAW_TCP_PORTS; do + fn-domains-generate-url "$SCHEME" "$VHOST" "$listen_port" + done + else + fn-domains-generate-url "$SCHEME" "$VHOST" "$DEFAULT_LISTEN_PORT" + fi +} + +fn-domains-generate-url() { + declare SCHEME="$1" VHOST="$2" PORT="$3" + if [[ "$PORT" == "80" ]]; then + echo "http://$VHOST" + elif [[ "$PORT" == "443" ]]; then + echo "https://$VHOST" + else + echo "$SCHEME://$VHOST:$PORT" + fi +} diff --git a/plugins/domains/post-app-clone-setup b/plugins/domains/post-app-clone-setup index 6b3968e21..5b136369a 100755 --- a/plugins/domains/post-app-clone-setup +++ b/plugins/domains/post-app-clone-setup @@ -8,7 +8,7 @@ trigger-domains-post-app-clone-setup() { declare OLD_APP="$1" NEW_APP="$2" local APP_ROOT="$DOKKU_ROOT/$NEW_APP" - rm -rf "$APP_ROOT/URLS" "$APP_ROOT/VHOST" + rm -rf "$APP_ROOT/VHOST" } trigger-domains-post-app-clone-setup "$@" diff --git a/plugins/domains/post-app-rename-setup b/plugins/domains/post-app-rename-setup index 9b710ac9a..7cbce6a11 100755 --- a/plugins/domains/post-app-rename-setup +++ b/plugins/domains/post-app-rename-setup @@ -3,12 +3,10 @@ set -eo pipefail [[ $DOKKU_TRACE ]] && set -x trigger-domains-post-app-rename-setup() { - declare desc="updates VHOST and URLS files during rename" + declare desc="updates VHOST files during rename" declare trigger="post-app-rename-setup" declare OLD_APP="$1" NEW_APP="$2" - rm -f "$DOKKU_ROOT/$NEW_APP/URLS" - if [[ -f "$DOKKU_ROOT/$NEW_APP/VHOST" ]]; then while read -r VHOST || [[ -n "$VHOST" ]]; do sed -i -e "s/$OLD_APP.$VHOST/$NEW_APP.$VHOST/g" "$DOKKU_ROOT/$NEW_APP/VHOST" diff --git a/plugins/nginx-vhosts/functions b/plugins/nginx-vhosts/functions index edb08da95..569de8b03 100755 --- a/plugins/nginx-vhosts/functions +++ b/plugins/nginx-vhosts/functions @@ -311,7 +311,6 @@ nginx_build_config() { declare desc="build nginx config to proxy app containers using sigil" declare APP="$1" DOKKU_APP_LISTEN_PORT="$2" DOKKU_APP_LISTEN_IP="$3" local VHOST_PATH="$DOKKU_ROOT/$APP/VHOST" - local APP_URLS_PATH="$DOKKU_ROOT/$APP/URLS" local NGINX_TEMPLATE_NAME="nginx.conf.sigil" local NGINX_TEMPLATE="$PLUGIN_AVAILABLE_PATH/nginx-vhosts/templates/$NGINX_TEMPLATE_NAME" local SCHEME=http @@ -329,7 +328,7 @@ nginx_build_config() { plugn trigger domains-vhost-enabled "$APP" 2>/dev/null || IS_APP_VHOST_ENABLED=false local IS_SSL_ENABLED=false - if is_ssl_enabled "$APP"; then + if [[ "$(plugn trigger certs-exists "$APP")" == "true" ]]; then IS_SSL_ENABLED=true fi @@ -516,11 +515,6 @@ nginx_build_config() { dokku_log_verbose "Reloading nginx" validate_nginx && restart_nginx >/dev/null fi - - if ([[ -n "$NONSSL_VHOSTS" ]] || [[ -n "$SSL_VHOSTS" ]]) && [[ "$IS_APP_VHOST_ENABLED" == "true" ]]; then - echo "# THIS FILE IS GENERATED BY DOKKU - DO NOT EDIT, YOUR CHANGES WILL BE OVERWRITTEN" >"$APP_URLS_PATH" - xargs -i echo "$SCHEME://{}" <<<"$(echo "${SSL_VHOSTS}" "${NONSSL_VHOSTS}" | tr ' ' '\n' | sort -u)" >>"$APP_URLS_PATH" - fi else # note because this clause is long. if the proxy is disabled: dokku_log_info1 "Nginx support is disabled for app ($APP)" diff --git a/plugins/proxy/proxy-configure-ports b/plugins/proxy/proxy-configure-ports index 67754a7c4..21c94a69e 100755 --- a/plugins/proxy/proxy-configure-ports +++ b/plugins/proxy/proxy-configure-ports @@ -1,6 +1,5 @@ #!/usr/bin/env bash source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" -source "$PLUGIN_AVAILABLE_PATH/certs/functions" source "$PLUGIN_AVAILABLE_PATH/config/functions" set -eo pipefail [[ $DOKKU_TRACE ]] && set -x @@ -29,7 +28,7 @@ trigger-proxy-proxy-configure-ports() { DOKKU_QUIET_OUTPUT=1 config_set --no-restart "$APP" DOKKU_PROXY_PORT="$PROXY_PORT" fi if [[ -z "$DOKKU_PROXY_SSL_PORT" ]]; then - if (is_ssl_enabled "$APP"); then + if [[ "$(plugn trigger certs-exists "$APP")" == "true" ]]; then local PROXY_SSL_PORT=$(config_get --global DOKKU_PROXY_SSL_PORT) PROXY_SSL_PORT=${PROXY_SSL_PORT:=443} if [[ -z "$RAW_TCP_PORTS" ]] && [[ "$IS_APP_VHOST_ENABLED" == "false" ]]; then diff --git a/plugins/traefik-vhosts/docker-args-process-deploy b/plugins/traefik-vhosts/docker-args-process-deploy index 7eb3d2b47..c81248cea 100755 --- a/plugins/traefik-vhosts/docker-args-process-deploy +++ b/plugins/traefik-vhosts/docker-args-process-deploy @@ -11,7 +11,6 @@ trigger-traefik-vhosts-docker-args-process-deploy() { local app_domains is_app_listening letsencrypt_email output proxy_container_port proxy_host_port port_map proxy_port_map priority proxy_scheme proxy_schemes traefik_domains local proxy_container_http_port proxy_container_http_port_candidate proxy_host_http_port_candidate local proxy_container_https_port proxy_container_https_port_candidate proxy_host_https_port_candidate - local app_urls_path="$DOKKU_ROOT/$APP/URLS" local STDIN=$(cat) if [[ "$PROC_TYPE" != "web" ]]; then @@ -108,8 +107,6 @@ trigger-traefik-vhosts-docker-args-process-deploy() { output="$output --label traefik.http.routers.$APP-$PROC_TYPE-http.service=$APP-$PROC_TYPE-http" if [[ -n "$traefik_domains" ]]; then output="$output --label \"traefik.http.routers.$APP-$PROC_TYPE-http.rule=Host(\\\`$traefik_domains\\\`)\"" - echo "# THIS FILE IS GENERATED BY DOKKU - DO NOT EDIT, YOUR CHANGES WILL BE OVERWRITTEN" >"$app_urls_path" - xargs -I{} echo "http://{}" <<<"$(echo "${app_domains}" | tr ' ' '\n' | sort -u)" >>"$app_urls_path" fi fi @@ -127,8 +124,6 @@ trigger-traefik-vhosts-docker-args-process-deploy() { output="$output --label traefik.http.routers.$APP-$PROC_TYPE-https.tls.certresolver=leresolver" if [[ -n "$traefik_domains" ]]; then output="$output --label \"traefik.http.routers.$APP-$PROC_TYPE-https.rule=Host(\\\`$traefik_domains\\\`)\"" - echo "# THIS FILE IS GENERATED BY DOKKU - DO NOT EDIT, YOUR CHANGES WILL BE OVERWRITTEN" >"$app_urls_path" - xargs -I{} echo "https://{}" <<<"$(echo "${app_domains}" | tr ' ' '\n' | sort -u)" >>"$app_urls_path" fi fi fi diff --git a/tests/unit/apps_2.bats b/tests/unit/apps_2.bats index 2de337244..2afb61fa8 100644 --- a/tests/unit/apps_2.bats +++ b/tests/unit/apps_2.bats @@ -136,8 +136,6 @@ teardown() { assert_success run [ -d /home/dokku/great-test-name/tls ] assert_failure - run [ -f /home/dokku/great-test-name/URLS ] - assert_failure run [ -f /home/dokku/great-test-name/VHOST ] assert_failure run /bin/bash -c "curl --silent --write-out '%{http_code}\n' $(dokku url $TEST_APP) | grep 200" diff --git a/tests/unit/core_2.bats b/tests/unit/core_2.bats index 1a165098f..43c902616 100644 --- a/tests/unit/core_2.bats +++ b/tests/unit/core_2.bats @@ -39,33 +39,72 @@ teardown() { @test "(core) urls (non-ssl)" { assert_urls "http://${TEST_APP}.dokku.me" - add_domain "test.dokku.me" + dokku domains:add $TEST_APP "test.dokku.me" assert_urls "http://${TEST_APP}.dokku.me" "http://test.dokku.me" } @test "(core) urls (app ssl)" { assert_urls "http://${TEST_APP}.dokku.me" - setup_test_tls - dokku proxy:build-config "$TEST_APP" - assert_urls "http://${TEST_APP}.dokku.me" "https://${TEST_APP}.dokku.me" - add_domain "test.dokku.me" - assert_urls "http://${TEST_APP}.dokku.me" "http://test.dokku.me" "https://${TEST_APP}.dokku.me" "https://test.dokku.me" + + run setup_test_tls + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku proxy:build-config $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_success + + assert_urls "https://${TEST_APP}.dokku.me" + + run /bin/bash -c "dokku domains:add $TEST_APP test.dokku.me" + echo "output: $output" + echo "status: $status" + assert_success + + assert_urls "http://${TEST_APP}.dokku.me" "https://${TEST_APP}.dokku.me" "https://test.dokku.me" "http://test.dokku.me" } @test "(core) url (app ssl)" { - setup_test_tls - dokku proxy:build-config "$TEST_APP" + run setup_test_tls + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku proxy:build-config $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_success + assert_url "https://${TEST_APP}.dokku.me" } @test "(core) urls (wildcard ssl)" { - setup_test_tls wildcard - dokku proxy:build-config "$TEST_APP" - assert_urls "http://${TEST_APP}.dokku.me" "https://${TEST_APP}.dokku.me" - add_domain "test.dokku.me" - assert_urls "http://${TEST_APP}.dokku.me" "http://test.dokku.me" "https://${TEST_APP}.dokku.me" "https://test.dokku.me" - add_domain "dokku.example.com" - assert_urls "http://dokku.example.com" "http://${TEST_APP}.dokku.me" "http://test.dokku.me" "https://dokku.example.com" "https://${TEST_APP}.dokku.me" "https://test.dokku.me" + run setup_test_tls wildcard + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku proxy:build-config $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_success + + assert_urls "https://${TEST_APP}.dokku.me" + + run /bin/bash -c "dokku domains:add $TEST_APP test.dokku.me" + echo "output: $output" + echo "status: $status" + assert_success + + assert_urls "http://${TEST_APP}.dokku.me" "https://${TEST_APP}.dokku.me" "https://test.dokku.me" "http://test.dokku.me" + + run /bin/bash -c "dokku domains:add $TEST_APP dokku.example.com" + echo "output: $output" + echo "status: $status" + assert_success + assert_urls "http://dokku.example.com" "http://${TEST_APP}.dokku.me" "https://dokku.example.com" "https://${TEST_APP}.dokku.me" "https://test.dokku.me" "http://test.dokku.me" } @test "(core) git-remote (off-port)" { diff --git a/tests/unit/nginx-vhosts_2.bats b/tests/unit/nginx-vhosts_2.bats index f8f26ea5c..5f122c9d6 100644 --- a/tests/unit/nginx-vhosts_2.bats +++ b/tests/unit/nginx-vhosts_2.bats @@ -16,8 +16,8 @@ teardown() { @test "(nginx-vhosts) nginx:build-config (with SSL and unrelated domain)" { setup_test_tls - add_domain "node-js-app.dokku.me" - add_domain "test.dokku.me" + dokku domains:add $TEST_APP "node-js-app.dokku.me" + dokku domains:add $TEST_APP "test.dokku.me" deploy_app dokku nginx:show-config $TEST_APP assert_ssl_domain "node-js-app.dokku.me" @@ -26,8 +26,8 @@ teardown() { @test "(nginx-vhosts) nginx:build-config (wildcard SSL)" { setup_test_tls wildcard - add_domain "wildcard1.dokku.me" - add_domain "wildcard2.dokku.me" + dokku domains:add $TEST_APP "wildcard1.dokku.me" + dokku domains:add $TEST_APP "wildcard2.dokku.me" deploy_app dokku nginx:show-config $TEST_APP assert_ssl_domain "wildcard1.dokku.me" @@ -51,9 +51,9 @@ teardown() { @test "(nginx-vhosts) nginx:build-config (with SSL and Multiple SANs)" { setup_test_tls sans - add_domain "test.dokku.me" - add_domain "www.test.dokku.me" - add_domain "www.test.app.dokku.me" + dokku domains:add $TEST_APP "test.dokku.me" + dokku domains:add $TEST_APP "www.test.dokku.me" + dokku domains:add $TEST_APP "www.test.app.dokku.me" deploy_app assert_ssl_domain "test.dokku.me" assert_ssl_domain "www.test.dokku.me" diff --git a/tests/unit/nginx-vhosts_4.bats b/tests/unit/nginx-vhosts_4.bats index cb9e09837..f02bb570a 100644 --- a/tests/unit/nginx-vhosts_4.bats +++ b/tests/unit/nginx-vhosts_4.bats @@ -58,7 +58,7 @@ teardown() { @test "(nginx-vhosts) nginx:build-config (without global VHOST and domains:add pre deploy)" { rm "$DOKKU_ROOT/VHOST" create_app - add_domain "www.test.app.dokku.me" + dokku domains:add $TEST_APP "www.test.app.dokku.me" deploy_app assert_nonssl_domain "www.test.app.dokku.me" } @@ -66,7 +66,7 @@ teardown() { @test "(nginx-vhosts) nginx:build-config (without global VHOST and domains:add post deploy)" { rm "$DOKKU_ROOT/VHOST" deploy_app - add_domain "www.test.app.dokku.me" + dokku domains:add $TEST_APP "www.test.app.dokku.me" check_urls http://www.test.app.dokku.me assert_http_success http://www.test.app.dokku.me } diff --git a/tests/unit/nginx-vhosts_5.bats b/tests/unit/nginx-vhosts_5.bats index 0e65a35be..c171fa262 100644 --- a/tests/unit/nginx-vhosts_5.bats +++ b/tests/unit/nginx-vhosts_5.bats @@ -26,7 +26,7 @@ teardown() { @test "(nginx-vhosts) nginx:build-config (dockerfile expose)" { deploy_app dockerfile - add_domain "www.test.app.dokku.me" + dokku domains:add $TEST_APP "www.test.app.dokku.me" check_urls http://${TEST_APP}.dokku.me:3000 check_urls http://${TEST_APP}.dokku.me:3003 check_urls http://www.test.app.dokku.me:3000 diff --git a/tests/unit/nginx-vhosts_7.bats b/tests/unit/nginx-vhosts_7.bats index 52417e403..2812b4b18 100644 --- a/tests/unit/nginx-vhosts_7.bats +++ b/tests/unit/nginx-vhosts_7.bats @@ -16,8 +16,8 @@ teardown() { @test "(nginx-vhosts) nginx:build-config (wildcard SSL and custom nginx template)" { setup_test_tls wildcard - add_domain "wildcard1.dokku.me" - add_domain "wildcard2.dokku.me" + dokku domains:add $TEST_APP "wildcard1.dokku.me" + dokku domains:add $TEST_APP "wildcard2.dokku.me" deploy_app nodejs-express dokku@dokku.me:$TEST_APP custom_ssl_nginx_template assert_ssl_domain "wildcard1.dokku.me" @@ -27,7 +27,7 @@ teardown() { } @test "(nginx-vhosts) nginx:build-config (custom nginx template - no ssl)" { - add_domain "www.test.app.dokku.me" + dokku domains:add $TEST_APP "www.test.app.dokku.me" run deploy_app nodejs-express dokku@dokku.me:$TEST_APP custom_nginx_template echo "output: $output" echo "status: $status" @@ -53,7 +53,7 @@ teardown() { echo "status: $status" assert_success - add_domain "www.test.app.dokku.me" + dokku domains:add $TEST_APP "www.test.app.dokku.me" run deploy_app nodejs-express dokku@dokku.me:$TEST_APP custom_nginx_template echo "output: $output" echo "status: $status" diff --git a/tests/unit/nginx-vhosts_9.bats b/tests/unit/nginx-vhosts_9.bats index 552ba2785..45d7d66fc 100644 --- a/tests/unit/nginx-vhosts_9.bats +++ b/tests/unit/nginx-vhosts_9.bats @@ -154,8 +154,8 @@ teardown() { @test "(nginx-vhosts) nginx:build-config (with SSL and unrelated domain)" { setup_test_tls - add_domain "node-js-app.dokku.me" - add_domain "test.dokku.me" + dokku domains:add $TEST_APP "node-js-app.dokku.me" + dokku domains:add $TEST_APP "test.dokku.me" deploy_app dokku nginx:show-config $TEST_APP assert_ssl_domain "node-js-app.dokku.me" @@ -164,8 +164,8 @@ teardown() { @test "(nginx-vhosts) nginx:build-config (wildcard SSL)" { setup_test_tls wildcard - add_domain "wildcard1.dokku.me" - add_domain "wildcard2.dokku.me" + dokku domains:add $TEST_APP "wildcard1.dokku.me" + dokku domains:add $TEST_APP "wildcard2.dokku.me" deploy_app dokku nginx:show-config $TEST_APP assert_ssl_domain "wildcard1.dokku.me" diff --git a/tests/unit/test_helper.bash b/tests/unit/test_helper.bash index 6f86edeea..444280bdd 100644 --- a/tests/unit/test_helper.bash +++ b/tests/unit/test_helper.bash @@ -218,10 +218,6 @@ destroy_key() { rm -f /tmp/testkey* &>/dev/null || true } -add_domain() { - dokku domains:add "$TEST_APP" "$1" -} - # shellcheck disable=SC2119 check_urls() { local PATTERN="$1" @@ -288,10 +284,14 @@ assert_not_external_port() { assert_url() { url="$1" - run /bin/bash -c "dokku url $TEST_APP" + 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)" echo "output: $output" echo "status: $status" - echo "url: ${url}" assert_output "${url}" } @@ -299,9 +299,13 @@ assert_urls() { # shellcheck disable=SC2124 urls="$@" run /bin/bash -c "dokku urls $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 "urls: $(dokku urls $TEST_APP)" echo "output: $output" echo "status: $status" - echo "urls:" "$urls" assert_output "$urls" }