From 07e6d0e7078297a3b3c98ea1413b79157a2329ea Mon Sep 17 00:00:00 2001 From: Seth Vargo Date: Sat, 18 Jun 2016 15:06:20 -0400 Subject: [PATCH] guests/bsd: Centralize logic for halting guests --- plugins/guests/{netbsd => bsd}/cap/halt.rb | 4 +-- plugins/guests/bsd/plugin.rb | 5 +++ plugins/guests/darwin/cap/halt.rb | 4 ++- plugins/guests/freebsd/cap/halt.rb | 16 --------- plugins/guests/freebsd/plugin.rb | 5 --- plugins/guests/netbsd/plugin.rb | 5 --- plugins/guests/openbsd/cap/halt.rb | 16 --------- plugins/guests/openbsd/plugin.rb | 5 --- .../guests/{freebsd => bsd}/cap/halt_test.rb | 21 +++++------ .../plugins/guests/darwin/cap/halt_test.rb | 36 +++++++++++++++++++ 10 files changed, 57 insertions(+), 60 deletions(-) rename plugins/guests/{netbsd => bsd}/cap/halt.rb (75%) delete mode 100644 plugins/guests/freebsd/cap/halt.rb delete mode 100644 plugins/guests/openbsd/cap/halt.rb rename test/unit/plugins/guests/{freebsd => bsd}/cap/halt_test.rb (52%) create mode 100644 test/unit/plugins/guests/darwin/cap/halt_test.rb diff --git a/plugins/guests/netbsd/cap/halt.rb b/plugins/guests/bsd/cap/halt.rb similarity index 75% rename from plugins/guests/netbsd/cap/halt.rb rename to plugins/guests/bsd/cap/halt.rb index 3638bd223..004bf222b 100644 --- a/plugins/guests/netbsd/cap/halt.rb +++ b/plugins/guests/bsd/cap/halt.rb @@ -1,10 +1,10 @@ module VagrantPlugins - module GuestNetBSD + module GuestBSD module Cap class Halt def self.halt(machine) begin - machine.communicate.sudo("/sbin/shutdown -p -h now") + machine.communicate.sudo("/sbin/shutdown -p -h now", shell: "sh") rescue IOError # Do nothing, because it probably means the machine shut down # and SSH connection was lost. diff --git a/plugins/guests/bsd/plugin.rb b/plugins/guests/bsd/plugin.rb index 6d8e245a8..c83a3a454 100644 --- a/plugins/guests/bsd/plugin.rb +++ b/plugins/guests/bsd/plugin.rb @@ -11,6 +11,11 @@ module VagrantPlugins Guest end + guest_capability(:bsd, :halt) do + require_relative "cap/halt" + Cap::Halt + end + guest_capability(:bsd, :insert_public_key) do require_relative "cap/public_key" Cap::PublicKey diff --git a/plugins/guests/darwin/cap/halt.rb b/plugins/guests/darwin/cap/halt.rb index 6575f1c93..f48778ee2 100644 --- a/plugins/guests/darwin/cap/halt.rb +++ b/plugins/guests/darwin/cap/halt.rb @@ -4,7 +4,9 @@ module VagrantPlugins class Halt def self.halt(machine) begin - machine.communicate.sudo("shutdown -h now") + # Darwin does not support the `-p` option like the rest of the + # BSD-based guests, so it needs its own cap. + machine.communicate.sudo("/sbin/shutdown -h now") rescue IOError # Do nothing because SSH connection closed and it probably # means the VM just shut down really fast. diff --git a/plugins/guests/freebsd/cap/halt.rb b/plugins/guests/freebsd/cap/halt.rb deleted file mode 100644 index 237c942bb..000000000 --- a/plugins/guests/freebsd/cap/halt.rb +++ /dev/null @@ -1,16 +0,0 @@ -module VagrantPlugins - module GuestFreeBSD - module Cap - class Halt - def self.halt(machine) - begin - machine.communicate.sudo("shutdown -p now", { shell: "sh" }) - rescue IOError - # Do nothing because SSH connection closed and it probably - # means the VM just shut down really fast. - end - end - end - end - end -end diff --git a/plugins/guests/freebsd/plugin.rb b/plugins/guests/freebsd/plugin.rb index 129b9bd3c..e6311e2f6 100644 --- a/plugins/guests/freebsd/plugin.rb +++ b/plugins/guests/freebsd/plugin.rb @@ -21,11 +21,6 @@ module VagrantPlugins Cap::ConfigureNetworks end - guest_capability(:freebsd, :halt) do - require_relative "cap/halt" - Cap::Halt - end - guest_capability(:freebsd, :rsync_install) do require_relative "cap/rsync" Cap::RSync diff --git a/plugins/guests/netbsd/plugin.rb b/plugins/guests/netbsd/plugin.rb index 904a1a3b5..a75cbc083 100644 --- a/plugins/guests/netbsd/plugin.rb +++ b/plugins/guests/netbsd/plugin.rb @@ -21,11 +21,6 @@ module VagrantPlugins Cap::ConfigureNetworks end - guest_capability(:netbsd, :halt) do - require_relative "cap/halt" - Cap::Halt - end - guest_capability(:netbsd, :rsync_install) do require_relative "cap/rsync" Cap::RSync diff --git a/plugins/guests/openbsd/cap/halt.rb b/plugins/guests/openbsd/cap/halt.rb deleted file mode 100644 index 3b44d9b0c..000000000 --- a/plugins/guests/openbsd/cap/halt.rb +++ /dev/null @@ -1,16 +0,0 @@ -module VagrantPlugins - module GuestOpenBSD - module Cap - class Halt - def self.halt(machine) - begin - machine.communicate.sudo("shutdown -p -h now") - rescue IOError - # Do nothing, because it probably means the machine shut down - # and SSH connection was lost. - end - end - end - end - end -end diff --git a/plugins/guests/openbsd/plugin.rb b/plugins/guests/openbsd/plugin.rb index 821c99195..94881feda 100644 --- a/plugins/guests/openbsd/plugin.rb +++ b/plugins/guests/openbsd/plugin.rb @@ -21,11 +21,6 @@ module VagrantPlugins Cap::ConfigureNetworks end - guest_capability(:openbsd, :halt) do - require_relative "cap/halt" - Cap::Halt - end - guest_capability(:openbsd, :rsync_install) do require_relative "cap/rsync" Cap::RSync diff --git a/test/unit/plugins/guests/freebsd/cap/halt_test.rb b/test/unit/plugins/guests/bsd/cap/halt_test.rb similarity index 52% rename from test/unit/plugins/guests/freebsd/cap/halt_test.rb rename to test/unit/plugins/guests/bsd/cap/halt_test.rb index e44de83d6..3ec6ddbc0 100644 --- a/test/unit/plugins/guests/freebsd/cap/halt_test.rb +++ b/test/unit/plugins/guests/bsd/cap/halt_test.rb @@ -1,11 +1,10 @@ require_relative "../../../../base" -describe "VagrantPlugins::GuestFreeBSD::Cap::Halt" do - let(:described_class) do - VagrantPlugins::GuestFreeBSD::Plugin +describe "VagrantPlugins::GuestBSD::Cap::Halt" do + let(:caps) do + VagrantPlugins::GuestBSD::Plugin .components - .guest_capabilities[:freebsd] - .get(:halt) + .guest_capabilities[:bsd] end let(:machine) { double("machine") } @@ -20,15 +19,17 @@ describe "VagrantPlugins::GuestFreeBSD::Cap::Halt" do end describe ".halt" do + let(:cap) { caps.get(:halt) } + it "runs the shutdown command" do - comm.expect_command("shutdown -p now") - described_class.halt(machine) + comm.expect_command("/sbin/shutdown -p -h now") + cap.halt(machine) end - it "does not raise an IOError" do - comm.stub_command("shutdown -p now", raise: IOError) + it "ignores an IOError" do + comm.stub_command("/sbin/shutdown -p -h now", raise: IOError) expect { - described_class.halt(machine) + cap.halt(machine) }.to_not raise_error end end diff --git a/test/unit/plugins/guests/darwin/cap/halt_test.rb b/test/unit/plugins/guests/darwin/cap/halt_test.rb new file mode 100644 index 000000000..0cce2836e --- /dev/null +++ b/test/unit/plugins/guests/darwin/cap/halt_test.rb @@ -0,0 +1,36 @@ +require_relative "../../../../base" + +describe "VagrantPlugins::GuestDarwin::Cap::Halt" do + let(:caps) do + VagrantPlugins::GuestDarwin::Plugin + .components + .guest_capabilities[:darwin] + end + + let(:machine) { double("machine") } + let(:comm) { VagrantTests::DummyCommunicator::Communicator.new(machine) } + + before do + allow(machine).to receive(:communicate).and_return(comm) + end + + after do + comm.verify_expectations! + end + + describe ".halt" do + let(:cap) { caps.get(:halt) } + + it "runs the shutdown command" do + comm.expect_command("/sbin/shutdown -h now") + cap.halt(machine) + end + + it "ignores an IOError" do + comm.stub_command("/sbin/shutdown -h now", raise: IOError) + expect { + cap.halt(machine) + }.to_not raise_error + end + end +end