From c75149fb9fb62bb5a8cec07774f4624c5e34999b Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Fri, 28 Jan 2022 20:17:49 -0500 Subject: [PATCH 1/6] feat: add support for clearing all nginx proxy entries in a single go --- plugins/nginx-vhosts/proxy-clear-config | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) 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 "$@" From 3b0bf4d8f2add786b300df5f55895dc31d1db1eb Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Fri, 28 Jan 2022 20:18:36 -0500 Subject: [PATCH 2/6] feat: use --all flag for clearing proxy config during ps:restore Without this, we might end up with one or more apps that still have a proxy config. --- plugins/ps/functions.go | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) 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 From 7136da1aa57ddc30ba28f7e94b8c103fe3d6c797 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Fri, 28 Jan 2022 20:26:49 -0500 Subject: [PATCH 3/6] feat: add a command to clear all proxy configs Closes #5002 --- plugins/proxy/proxy.go | 5 ++ plugins/proxy/src/subcommands/subcommands.go | 6 ++ plugins/proxy/subcommands.go | 13 ++++ tests/unit/proxy.bats | 62 ++++++++++++++++++++ 4 files changed, 86 insertions(+) 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/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/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" From ecea1488e129f1da8aebaba6f46faf37028448c1 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Fri, 28 Jan 2022 20:28:43 -0500 Subject: [PATCH 4/6] fix: ignore errors clearing proxy configs If one fails to rebuild for whatever reason, just continue onward. --- plugins/ps/ps.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) { From 4e5ae25d5f6ac7307414008ff7a276e9d516f757 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Fri, 28 Jan 2022 21:31:13 -0500 Subject: [PATCH 5/6] fix: generate clear-config subcommand --- plugins/proxy/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 00d11b8440d779c3005f3255695abfd39ec061e8 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Fri, 28 Jan 2022 21:32:58 -0500 Subject: [PATCH 6/6] docs: document proxy:clear-config --- docs/networking/proxy-management.md | 19 +++++++++++++++++++ plugins/proxy/src/commands/commands.go | 3 ++- 2 files changed, 21 insertions(+), 1 deletion(-) 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/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