guests/linux: Mount NFS in one command

This commit is contained in:
Seth Vargo 2016-06-05 15:03:12 -04:00
parent e2b7e28082
commit 837713c2d1
No known key found for this signature in database
GPG Key ID: 905A90C2949E8787
2 changed files with 94 additions and 12 deletions

View File

@ -7,13 +7,17 @@ module VagrantPlugins
extend Vagrant::Util::Retryable
def self.mount_nfs_folder(machine, ip, folders)
comm = machine.communicate
commands = []
folders.each do |name, opts|
# Expand the guest path so we can handle things like "~/vagrant"
expanded_guest_path = machine.guest.capability(
:shell_expand_guest_path, opts[:guestpath])
# Do the actual creating and mounting
machine.communicate.sudo("mkdir -p #{expanded_guest_path}")
commands << "mkdir -p '#{expanded_guest_path}'"
# Mount
hostpath = opts[:hostpath].dup
@ -26,18 +30,18 @@ module VagrantPlugins
mount_opts = opts[:mount_options].dup
end
mount_command = "mount -o '#{mount_opts.join(",")}' #{ip}:'#{hostpath}' #{expanded_guest_path}"
retryable(on: Vagrant::Errors::LinuxNFSMountFailed, tries: 8, sleep: 3) do
machine.communicate.sudo(mount_command,
error_class: Vagrant::Errors::LinuxNFSMountFailed)
end
commands << "mount -o #{mount_opts.join(",")} '#{ip}:#{hostpath}' '#{expanded_guest_path}'"
# Emit an upstart event if we can
machine.communicate.sudo <<-SCRIPT
if command -v /sbin/init &>/dev/null && /sbin/init --version | grep upstart &>/dev/null; then
/sbin/initctl emit --no-wait vagrant-mounted MOUNTPOINT='#{expanded_guest_path}'
fi
SCRIPT
# Emit a mount event
commands << <<-EOH.gsub(/^ {14}/, '')
if command -v /sbin/init &>/dev/null && /sbin/init --version | grep upstart &>/dev/null; then
/sbin/initctl emit --no-wait vagrant-mounted MOUNTPOINT='#{expanded_guest_path}'
fi
EOH
end
retryable(on: Vagrant::Errors::LinuxNFSMountFailed, tries: 8, sleep: 3) do
comm.sudo(commands.join("\n"), error_class: Vagrant::Errors::LinuxNFSMountFailed)
end
end
end

View File

@ -0,0 +1,78 @@
require_relative "../../../../base"
describe "VagrantPlugins::GuestLinux::Cap::MountNFS" do
let(:caps) do
VagrantPlugins::GuestLinux::Plugin
.components
.guest_capabilities[:linux]
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 ".mount_nfs_folder" do
let(:cap) { caps.get(:mount_nfs_folder) }
let(:ip) { "1.2.3.4" }
let(:hostpath) { "/host" }
let(:guestpath) { "/guest" }
before do
allow(machine).to receive(:guest).and_return(
double("capability", capability: guestpath)
)
end
it "mounts the folder" do
folders = {
"/vagrant-nfs" => {
type: :nfs,
guestpath: "/guest",
hostpath: "/host",
}
}
cap.mount_nfs_folder(machine, ip, folders)
expect(comm.received_commands[0]).to match(/mkdir -p '#{guestpath}'/)
expect(comm.received_commands[0]).to match(/'1.2.3.4:#{hostpath}' '#{guestpath}'/)
end
it "mounts with options" do
folders = {
"/vagrant-nfs" => {
type: :nfs,
guestpath: "/guest",
hostpath: "/host",
nfs_version: 2,
nfs_udp: true,
}
}
cap.mount_nfs_folder(machine, ip, folders)
expect(comm.received_commands[0]).to match(/mount -o vers=2,udp/)
end
it "emits an event" do
folders = {
"/vagrant-nfs" => {
type: :nfs,
guestpath: "/guest",
hostpath: "/host",
}
}
cap.mount_nfs_folder(machine, ip, folders)
expect(comm.received_commands[0]).to include(
"/sbin/initctl emit --no-wait vagrant-mounted MOUNTPOINT='#{guestpath}'")
end
end
end