From 5356f31e2efd4df027344178ec223761f536df53 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 19 Feb 2023 16:30:18 +0100 Subject: [PATCH] Remove also removes accessories but requires confirmation --- lib/mrsk/cli/main.rb | 15 ++++++++++++--- test/cli/main_test.rb | 23 +++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/lib/mrsk/cli/main.rb b/lib/mrsk/cli/main.rb index 3e1381a1..352e7f30 100644 --- a/lib/mrsk/cli/main.rb +++ b/lib/mrsk/cli/main.rb @@ -135,9 +135,12 @@ class Mrsk::Cli::Main < Mrsk::Cli::Base desc "remove", "Remove Traefik, app, accessories, and registry session from servers" option :confirmed, aliases: "-y", type: :boolean, default: false, desc: "Proceed without confirmation question" def remove - invoke "mrsk:cli:traefik:remove" - invoke "mrsk:cli:app:remove" - invoke "mrsk:cli:registry:logout" + if options[:confirmed] || ask(remove_confirmation_question, limited_to: %w( y N ), default: "N") == "y" + invoke "mrsk:cli:traefik:remove", [], options.without(:confirmed) + invoke "mrsk:cli:app:remove", [], options.without(:confirmed) + invoke "mrsk:cli:accessory:remove", [ "all" ] + invoke "mrsk:cli:registry:logout", [], options.without(:confirmed) + end end desc "version", "Show MRSK version" @@ -175,4 +178,10 @@ class Mrsk::Cli::Main < Mrsk::Cli::Base on(host) { container_names = capture_with_info(*MRSK.app.list_container_names).split("\n") } Array(container_names).include?(container_name) end + + def remove_confirmation_question + "This will remove all containers and images. " + + (MRSK.config.accessories.any? ? "Including #{MRSK.config.accessories.collect(&:name).to_sentence}. " : "") + + "Are you sure?" + end end diff --git a/test/cli/main_test.rb b/test/cli/main_test.rb index e2df308c..69a67f41 100644 --- a/test/cli/main_test.rb +++ b/test/cli/main_test.rb @@ -25,6 +25,29 @@ class CliMainTest < CliTestCase end end + test "remove with confirmation" do + run_command("remove", "-y").tap do |output| + assert_match /docker container stop traefik/, output + assert_match /docker container prune -f --filter label=org.opencontainers.image.title=Traefik/, output + assert_match /docker image prune -a -f --filter label=org.opencontainers.image.title=Traefik/, output + + assert_match /docker ps -q --filter label=service=app | xargs docker stop/, output + assert_match /docker container prune -f --filter label=service=app/, output + assert_match /docker image prune -a -f --filter label=service=app/, output + + assert_match /docker container stop app-mysql/, output + assert_match /docker container prune -f --filter label=service=app-mysql/, output + assert_match /docker image prune -a -f --filter label=service=app-mysql/, output + assert_match /rm -rf app-mysql/, output + + assert_match /docker container stop app-redis/, output + assert_match /docker container prune -f --filter label=service=app-redis/, output + assert_match /docker image prune -a -f --filter label=service=app-redis/, output + assert_match /rm -rf app-redis/, output + + assert_match /docker logout/, output + end + end private def run_command(*command)