feat: implement proxy:report command

Also deprecate `proxy:default` in favor of `proxy:report`

Refs #2356
This commit is contained in:
Jose Diaz-Gonzalez
2017-02-20 21:41:19 -07:00
parent e441594981
commit 0e899cdd13
5 changed files with 132 additions and 8 deletions

View File

@@ -3,19 +3,21 @@
> New as of 0.5.0, Enhanced in 0.6.0
```
proxy <app> # Show proxy settings for app
proxy:disable <app> # Disable proxy for app
proxy:enable <app> # Enable proxy for app
proxy:ports <app> # List proxy port mappings for app
proxy:ports-add <app> <scheme>:<host-port>:<container-port> [<scheme>:<host-port>:<container-port>...] # Set proxy port mappings for app
proxy:ports-clear <app> # Clear all proxy port mappings for app
proxy:ports-remove <app> <host-port> [<host-port>|<scheme>:<host-port>:<container-port>...] # Unset proxy port mappings for app
proxy:report [<app>] [<flag>] # Displays a proxy report for one or more apps
proxy:set <app> <proxy-type> # Set proxy type for app
```
In Dokku 0.5.0, port proxying was decoupled from the `nginx-vhosts` plugin into the proxy plugin. Dokku 0.6.0 introduced the ability to map host ports to specific container ports. In the future this will allow other proxy software - such as HAProxy or Caddy - to be used in place of nginx.
## Container network interface binding
## Usage
### Container network interface binding
> New as of 0.5.0
@@ -58,7 +60,51 @@ CONTAINER ID IMAGE COMMAND CREATED
d6499edb0edb dokku/node-js-app:latest "/bin/bash -c '/star About a minute ago Up About a minute 0.0.0.0:49153->5000/tcp node-js-app.web.1
```
## Proxy port mapping
### Displaying proxy reports about an app
> New as of 0.8.1
You can get a report about the app's proxy status using the `proxy:report` command:
```shell
dokku proxy:report
```
```
=====> node-js-app proxy information
Proxy enabled: true
Proxy type: nginx
Proxy port map: http:80:5000 https:443:5000
=====> python-sample proxy information
Proxy enabled: true
Proxy type: nginx
Proxy port map: http:80:5000
=====> ruby-sample proxy information
Proxy enabled: true
Proxy type: nginx
Proxy port map: http:80:5000
```
You can run the command for a specific app also.
```shell
dokku proxy:report node-js-app
```
```
=====> node-js-app proxy information
Proxy enabled: true
Proxy type: nginx
Proxy port map: http:80:5000 https:443:5000
```
You can pass flags which will output only the value of the specific information you want. For example:
```shell
dokku proxy:report node-js-app --proxy-type
```
### Proxy port mapping
> New as of 0.6.0
@@ -141,7 +187,7 @@ By default, buildpack apps and dockerfile apps **without** explicitly exposed po
> Note: This default behavior **will not** be automatically changed on subsequent pushes and must be manipulated with the `proxy:ports-*` syntax detailed above.
## Proxy Port Scheme
#### Proxy Port Scheme
The proxy port scheme is as follows:

View File

@@ -14,6 +14,7 @@ case "$1" in
proxy:ports-clear <app>, Clear all proxy port mappings for app
proxy:ports-add <app> <scheme>:<host-port>:<container-port> [<scheme>:<host-port>:<container-port>...], Set proxy port mappings for app
proxy:ports-remove <app> <host-port> [<host-port>|<scheme>:<host-port>:<container-port>...], Unset proxy port mappings for app
proxy:report [<app>] [<flag>], Displays a proxy report for one or more apps
proxy:set <app> <proxy-type>, Set proxy type for app
help_content
}

View File

@@ -24,10 +24,16 @@ get_app_proxy_type() {
echo "$APP_PROXY_TYPE"
}
get_app_proxy_port_map() {
declare desc="return a list of configured port mappings"
local APP="$1"; local PROXY_PORT_MAP="$(config_get "$APP" DOKKU_PROXY_PORT_MAP || true)"
echo "$PROXY_PORT_MAP"
}
list_app_proxy_ports() {
declare desc="list proxy port mappings for an app"
local APP="$1"; verify_app_name "$APP"
local PROXY_PORT_MAP="$(config_get "$APP" DOKKU_PROXY_PORT_MAP || true)"
local PROXY_PORT_MAP="$(get_app_proxy_port_map "$APP")"
if [[ -n "$PROXY_PORT_MAP" ]]; then
dokku_log_info1_quiet "Port mappings for $APP"
@@ -45,7 +51,7 @@ filter_app_proxy_ports() {
declare desc="list proxy port mappings for an app that start with a particular scheme and a host port"
local APP="$1"; verify_app_name "$APP"
local SCHEME="$2" HOST_PORT="$3"
local PROXY_PORT_MAP="$(config_get "$APP" DOKKU_PROXY_PORT_MAP || true)"
local PROXY_PORT_MAP="$(get_app_proxy_port_map "$APP")"
if [[ -n "$PROXY_PORT_MAP" ]]; then
local port_map
@@ -62,7 +68,7 @@ filter_app_proxy_ports() {
add_proxy_ports() {
declare desc="add proxy port mappings from an app"
local APP="$1"
local PROXY_PORT_MAP="$(config_get "$APP" DOKKU_PROXY_PORT_MAP || true)"
local PROXY_PORT_MAP="$(get_app_proxy_port_map "$APP")"
shift 1
local INPUT_PORTS="$*"
@@ -78,7 +84,7 @@ add_proxy_ports() {
remove_proxy_ports() {
declare desc="remove specific proxy port mappings from an app"
local APP="$1"
local PROXY_PORT_MAP="$(config_get "$APP" DOKKU_PROXY_PORT_MAP || true)"
local PROXY_PORT_MAP="$(get_app_proxy_port_map "$APP")"
local RE_PORT='^[0-9]+$'
shift 1

View File

@@ -12,6 +12,7 @@ proxy_main_cmd() {
local APPS="$1"
fi
dokku_log_warn "Deprecated: Please use proxy:report"
dokku_col_log_info1_quiet "App Name" "Proxy Type"
local app
for app in $APPS; do

View File

@@ -0,0 +1,70 @@
#!/usr/bin/env bash
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/proxy/functions"
fn-proxy-enabled() {
declare APP="$1"
local PROXY_ENABLED=false
if [[ "$(is_app_proxy_enabled "$APP")" == "true" ]]; then
PROXY_ENABLED=true
fi
echo "$PROXY_ENABLED"
}
proxy_report_single_app() {
local APP="$1"; local APP_DIR="$DOKKU_ROOT/$APP"; local INFO_FLAG="$2"
if [[ "$INFO_FLAG" == "true" ]]; then
INFO_FLAG=""
fi
verify_app_name "$APP"
local flag_map=(
"--proxy-enabled: $(fn-proxy-enabled "$APP")"
"--proxy-type: $(get_app_proxy_type "$APP")"
"--proxy-port-map: $(get_app_proxy_port_map "$APP")"
)
if [[ -z "$INFO_FLAG" ]]; then
dokku_log_info2 "$APP proxy information"
for flag in "${flag_map[@]}"; do
key="$(echo "${flag#--}" | cut -f1 -d' ' | tr - ' ')"
dokku_log_verbose "$(printf "%-20s %-25s" "${key^}" "${flag#*: }")"
done
else
local match=false; local value_exists=false
for flag in "${flag_map[@]}"; do
valid_flags="${valid_flags} $(echo "$flag" | cut -d':' -f1)"
if [[ "$flag" == "${INFO_FLAG}:"* ]]; then
value=${flag#*: }
size="${#value}"
if [[ "$size" -ne 0 ]]; then
echo "$value" && match=true && value_exists=true
else
match=true
fi
fi
done
if [[ "$match" == "true" ]]; then
[[ "$value_exists" == "true" ]] || dokku_log_fail "not deployed"
else
dokku_log_fail "Invalid flag passed, valid flags:${valid_flags}"
fi
fi
}
proxy_report_cmd() {
declare desc="displays a proxy report for one or more apps"
local cmd="proxy:report"
local INSTALLED_APPS=$(dokku_apps); local APP
if [[ -z $2 ]]; then
for APP in $INSTALLED_APPS; do
proxy_report_single_app "$APP" "true"
done
else
proxy_report_single_app "$2" "$3"
fi
}
proxy_report_cmd "$@"