diff --git a/docs/networking/proxy-management.md b/docs/networking/proxy-management.md index d7f5fe21d34..1b51633dc62 100644 --- a/docs/networking/proxy-management.md +++ b/docs/networking/proxy-management.md @@ -4,6 +4,7 @@ ``` proxy:build-config [--parallel count] [--all|] # (Re)builds config for given app +proxy:clear-config [--all|] # Clears config for given app proxy:disable [--parallel count] [--all|] # Disable proxy for app proxy:enable [--parallel count] [--all|] # Enable proxy for app proxy:report [] [] # Displays a proxy report for one or more apps @@ -40,6 +41,24 @@ Finally, the number of parallel workers may be automatically set to the number o dokku proxy:build-config --all --parallel -1 ``` +### Clearing the generated proxy config + +> New as of 0.27.0 + +Generated proxy configurations can also be cleared using the `proxy:clear-config` command. + +```shell +dokku proxy:clear-config node-js-app +``` + +All apps may have their proxy config cleared by using the `--all` flag. + +```shell +dokku proxy:clear-config --all +``` + +Clearing a proxy configuration has different effects depending on the proxy plugin in use. Consul the documentation for your proxy implementation for further details. + ### Displaying proxy reports for an app > New as of 0.8.1 diff --git a/plugins/nginx-vhosts/proxy-clear-config b/plugins/nginx-vhosts/proxy-clear-config index f00aea5d38a..a870ae1bcde 100755 --- a/plugins/nginx-vhosts/proxy-clear-config +++ b/plugins/nginx-vhosts/proxy-clear-config @@ -4,9 +4,8 @@ set -eo pipefail source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions" source "$PLUGIN_AVAILABLE_PATH/nginx-vhosts/internal-functions" -trigger-nginx-vhosts-proxy-clear-config() { - declare desc="clear nginx config for proxy app containers from command line" - declare trigger="proxy-clear-config" +fn-trigger-nginx-vhosts-proxy-clear-config-app() { + declare desc="clears the proxy config for a single app" declare APP="$1" [[ -z "$APP" ]] && dokku_log_fail "Please specify an app to run the command on" @@ -16,4 +15,22 @@ trigger-nginx-vhosts-proxy-clear-config() { fi } +trigger-nginx-vhosts-proxy-clear-config() { + declare desc="clear nginx config for proxy app containers from command line" + declare trigger="proxy-clear-config" + declare APP="$1" + + if [[ "$APP" == "--all" ]]; then + exit_code="0" + for app in $(dokku_apps); do + if ! fn-trigger-nginx-vhosts-proxy-clear-config-app "$app"; then + exit_code="$?" + fi + done + return "$exit_code" + fi + + fn-trigger-nginx-vhosts-proxy-clear-config-app "$APP" +} + trigger-nginx-vhosts-proxy-clear-config "$@" diff --git a/plugins/proxy/Makefile b/plugins/proxy/Makefile index ed3e6f0365c..21cc25c91fd 100644 --- a/plugins/proxy/Makefile +++ b/plugins/proxy/Makefile @@ -1,4 +1,4 @@ -SUBCOMMANDS = subcommands/build-config subcommands/disable subcommands/enable subcommands/ports subcommands/ports-add subcommands/ports-clear subcommands/ports-remove subcommands/ports-set subcommands/report subcommands/set +SUBCOMMANDS = subcommands/build-config subcommands/clear-config subcommands/disable subcommands/enable subcommands/ports subcommands/ports-add subcommands/ports-clear subcommands/ports-remove subcommands/ports-set subcommands/report subcommands/set TRIGGERS = triggers/proxy-is-enabled triggers/proxy-type triggers/post-certs-remove triggers/post-certs-update triggers/report BUILD = commands subcommands triggers PLUGIN_NAME = proxy diff --git a/plugins/proxy/proxy.go b/plugins/proxy/proxy.go index 817602cea46..ec87bf48c5e 100644 --- a/plugins/proxy/proxy.go +++ b/plugins/proxy/proxy.go @@ -32,6 +32,11 @@ func BuildConfig(appName string) error { return common.PlugnTrigger("proxy-build-config", []string{appName}...) } +// ClearConfig clears the proxy config for the specified app +func ClearConfig(appName string) error { + return common.PlugnTrigger("proxy-clear-config", []string{appName}...) +} + // Disable disables proxy implementations for the specified app func Disable(appName string) error { if !IsAppProxyEnabled(appName) { diff --git a/plugins/proxy/src/commands/commands.go b/plugins/proxy/src/commands/commands.go index d2622eb9b03..e2f6c016a81 100644 --- a/plugins/proxy/src/commands/commands.go +++ b/plugins/proxy/src/commands/commands.go @@ -18,7 +18,8 @@ Manage the proxy integration for an app Additional commands:` helpContent = ` - proxy:build-config , (Re)builds config for a given app + proxy:build-config [--parallel count] [--all|], (Re)builds config for a given app + proxy:clear-config [--all|], Clears config for a given app proxy:disable , Disable proxy for app proxy:enable , Enable proxy for app proxy:ports , List proxy port mappings for app diff --git a/plugins/proxy/src/subcommands/subcommands.go b/plugins/proxy/src/subcommands/subcommands.go index d0a8b3960aa..c25db395ccb 100644 --- a/plugins/proxy/src/subcommands/subcommands.go +++ b/plugins/proxy/src/subcommands/subcommands.go @@ -25,6 +25,12 @@ func main() { args.Parse(os.Args[2:]) appName := args.Arg(0) err = proxy.CommandBuildConfig(appName, *allApps, *parallelCount) + case "clear-config": + args := flag.NewFlagSet("proxy:clear-config", flag.ExitOnError) + allApps := args.Bool("all", false, "--all: build-config for all apps") + args.Parse(os.Args[2:]) + appName := args.Arg(0) + err = proxy.CommandClearConfig(appName, *allApps) case "disable": args := flag.NewFlagSet("proxy:disable", flag.ExitOnError) allApps := args.Bool("all", false, "--all: disable proxy for all apps") diff --git a/plugins/proxy/subcommands.go b/plugins/proxy/subcommands.go index 44a035f2640..1dcb66558a5 100644 --- a/plugins/proxy/subcommands.go +++ b/plugins/proxy/subcommands.go @@ -21,6 +21,19 @@ func CommandBuildConfig(appName string, allApps bool, parallelCount int) error { return BuildConfig(appName) } +// CommandClearConfig clears config for a given app +func CommandClearConfig(appName string, allApps bool) error { + if allApps { + return ClearConfig("--all") + } + + if err := common.VerifyAppName(appName); err != nil { + return err + } + + return ClearConfig(appName) +} + // CommandDisable disables the proxy for app via command line func CommandDisable(appName string, allApps bool, parallelCount int) error { if allApps { diff --git a/plugins/ps/functions.go b/plugins/ps/functions.go index e62bffbed19..ea9aed9b5d9 100644 --- a/plugins/ps/functions.go +++ b/plugins/ps/functions.go @@ -218,16 +218,8 @@ func removeProcfile(appName string) error { } func restorePrep() error { - apps, err := common.DokkuApps() - if err != nil { - common.LogWarn(err.Error()) - return nil - } - - for _, appName := range apps { - if err := common.PlugnTrigger("proxy-clear-config", []string{appName}...); err != nil { - return fmt.Errorf("Error clearing proxy config: %s", err) - } + if err := common.PlugnTrigger("proxy-clear-config", []string{"--all"}...); err != nil { + return fmt.Errorf("Error clearing proxy config: %s", err) } return nil diff --git a/plugins/ps/ps.go b/plugins/ps/ps.go index bc9f7569c20..5f7aac83f4a 100644 --- a/plugins/ps/ps.go +++ b/plugins/ps/ps.go @@ -99,7 +99,7 @@ func Restore(appName string) error { common.LogInfo1("Clearing potentially invalid proxy configuration") if err := common.PlugnTrigger("proxy-clear-config", []string{appName}...); err != nil { - return fmt.Errorf("Error clearing proxy config: %s", err) + common.LogWarn(fmt.Sprintf("Error clearing proxy config: %s", err)) } if !common.IsDeployed(appName) { diff --git a/tests/unit/proxy.bats b/tests/unit/proxy.bats index 6b2188961a8..8aef61c86f9 100644 --- a/tests/unit/proxy.bats +++ b/tests/unit/proxy.bats @@ -28,6 +28,68 @@ teardown() { assert_output "$help_output" } +@test "(proxy) proxy:build-config/clear-config" { + run deploy_app + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "test -f $DOKKU_ROOT/$TEST_APP/nginx.conf" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "rm -f $DOKKU_ROOT/$TEST_APP/nginx.conf" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "test -f $DOKKU_ROOT/$TEST_APP/nginx.conf" + echo "output: $output" + echo "status: $status" + assert_failure + + run /bin/bash -c "dokku proxy:build-config $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "test -f $DOKKU_ROOT/$TEST_APP/nginx.conf" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku proxy:clear-config $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "test -f $DOKKU_ROOT/$TEST_APP/nginx.conf" + echo "output: $output" + echo "status: $status" + assert_failure + + run /bin/bash -c "dokku proxy:build-config $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "test -f $DOKKU_ROOT/$TEST_APP/nginx.conf" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku proxy:clear-config --all" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "test -f $DOKKU_ROOT/$TEST_APP/nginx.conf" + echo "output: $output" + echo "status: $status" + assert_failure +} + @test "(proxy) proxy:enable/disable" { deploy_app assert_nonssl_domain "${TEST_APP}.dokku.me"