Shared folder action uses new system abstraction

This commit is contained in:
Mitchell Hashimoto 2010-04-25 02:08:59 -07:00
parent 95938c652d
commit 0736f8582d
6 changed files with 12 additions and 106 deletions

View File

@ -20,9 +20,7 @@ module Vagrant
@runner.env.ssh.execute do |ssh| @runner.env.ssh.execute do |ssh|
shared_folders.each do |name, hostpath, guestpath| shared_folders.each do |name, hostpath, guestpath|
logger.info "-- #{name}: #{guestpath}" logger.info "-- #{name}: #{guestpath}"
ssh.exec!("sudo mkdir -p #{guestpath}") @runner.system.mount_shared_folder(ssh, name, guestpath)
mount_folder(ssh, name, guestpath)
ssh.exec!("sudo chown #{Vagrant.config.ssh.username} #{guestpath}")
end end
end end
end end
@ -49,32 +47,6 @@ module Vagrant
@runner.vm.save @runner.vm.save
end end
def mount_folder(ssh, name, guestpath, sleeptime=5)
# Note: This method seems pretty OS-specific and could also use
# some configuration options. For now its duct tape and "works"
# but should be looked at in the future.
# Determine the permission string to attach to the mount command
perms = []
perms << "uid=#{@runner.env.config.vm.shared_folder_uid}"
perms << "gid=#{@runner.env.config.vm.shared_folder_gid}"
perms = " -o #{perms.join(",")}" if !perms.empty?
attempts = 0
while true
result = ssh.exec!("sudo mount -t vboxsf#{perms} #{name} #{guestpath}") do |ch, type, data|
# net/ssh returns the value in ch[:result] (based on looking at source)
ch[:result] = !!(type == :stderr && data =~ /No such device/i)
end
break unless result
attempts += 1
raise ActionException.new(:vm_mount_fail) if attempts >= 10
sleep sleeptime
end
end
end end
end end
end end

View File

@ -35,7 +35,7 @@ module Vagrant
# Returns an array of {Vagrant::VM} objects which are currently # Returns an array of {Vagrant::VM} objects which are currently
# active. # active.
def vms def vms
list.collect { |uuid| Vagrant::VM.find(uuid) }.compact list.collect { |uuid| Vagrant::VM.find(uuid, env) }.compact
end end
# Returns an array of UUIDs filtered so each is verified to exist. # Returns an array of UUIDs filtered so each is verified to exist.

View File

@ -20,7 +20,7 @@ module Vagrant
@env = env @env = env
@vm = vm @vm = vm
load_system! load_system! unless @env.nil?
end end
def load_system! def load_system!

View File

@ -3,6 +3,7 @@ require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
class SharedFoldersActionTest < Test::Unit::TestCase class SharedFoldersActionTest < Test::Unit::TestCase
setup do setup do
@runner, @vm, @action = mock_action(Vagrant::Actions::VM::SharedFolders) @runner, @vm, @action = mock_action(Vagrant::Actions::VM::SharedFolders)
@runner.stubs(:system).returns(Vagrant::Systems::Linux.new(@vm))
end end
def stub_shared_folders def stub_shared_folders
@ -96,80 +97,11 @@ class SharedFoldersActionTest < Test::Unit::TestCase
mount_seq = sequence("mount_seq") mount_seq = sequence("mount_seq")
ssh = mock("ssh") ssh = mock("ssh")
@folders.each do |name, hostpath, guestpath| @folders.each do |name, hostpath, guestpath|
ssh.expects(:exec!).with("sudo mkdir -p #{guestpath}").in_sequence(mount_seq) @runner.system.expects(:mount_shared_folder).with(ssh, name, guestpath).in_sequence(mount_seq)
@action.expects(:mount_folder).with(ssh, name, guestpath).in_sequence(mount_seq)
ssh.expects(:exec!).with("sudo chown #{@runner.env.config.ssh.username} #{guestpath}").in_sequence(mount_seq)
end end
@runner.env.ssh.expects(:execute).yields(ssh) @runner.env.ssh.expects(:execute).yields(ssh)
@action.after_boot @action.after_boot
end end
end end
context "mounting the main folder" do
setup do
@ssh = mock("ssh")
@name = "foo"
@guestpath = "bar"
@sleeptime = 0
@limit = 10
@success_return = false
end
def mount_folder
@action.mount_folder(@ssh, @name, @guestpath, @sleeptime)
end
should "execute the proper mount command" do
@ssh.expects(:exec!).with("sudo mount -t vboxsf -o uid=#{@runner.env.config.ssh.username},gid=#{@runner.env.config.ssh.username} #{@name} #{@guestpath}").returns(@success_return)
mount_folder
end
should "test type of text and text string to detect error" do
data = mock("data")
data.expects(:[]=).with(:result, !@success_return)
@ssh.expects(:exec!).yields(data, :stderr, "No such device").returns(@success_return)
mount_folder
end
should "test type of text and test string to detect success" do
data = mock("data")
data.expects(:[]=).with(:result, @success_return)
@ssh.expects(:exec!).yields(data, :stdout, "Nothing such device").returns(@success_return)
mount_folder
end
should "raise an ActionException if the command fails constantly" do
@ssh.expects(:exec!).times(@limit).returns(!@success_return)
assert_raises(Vagrant::Actions::ActionException) {
mount_folder
}
end
should "not raise any exception if the command succeeded" do
@ssh.expects(:exec!).once.returns(@success_return)
assert_nothing_raised {
mount_folder
}
end
should "add uid AND gid to mount" do
uid = "foo"
gid = "bar"
env = mock_environment do |config|
config.vm.shared_folder_uid = uid
config.vm.shared_folder_gid = gid
end
@runner.expects(:env).twice.returns(env)
@ssh.expects(:exec!).with("sudo mount -t vboxsf -o uid=#{uid},gid=#{gid} #{@name} #{@guestpath}").returns(@success_return)
mount_folder
end
end
end end

View File

@ -70,7 +70,7 @@ class ActiveListTest < Test::Unit::TestCase
results = [] results = []
@the_list.each do |item| @the_list.each do |item|
result = mock("result-#{item}") result = mock("result-#{item}")
Vagrant::VM.expects(:find).with(item).returns(result).in_sequence(new_seq) Vagrant::VM.expects(:find).with(item, @env).returns(result).in_sequence(new_seq)
results << result results << result
end end

View File

@ -9,7 +9,7 @@ Gem::Specification.new do |s|
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version= s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
s.authors = ["Mitchell Hashimoto", "John Bender"] s.authors = ["Mitchell Hashimoto", "John Bender"]
s.date = %q{2010-04-24} s.date = %q{2010-04-25}
s.default_executable = %q{vagrant} s.default_executable = %q{vagrant}
s.description = %q{Vagrant is a tool for building and distributing virtualized development environments.} s.description = %q{Vagrant is a tool for building and distributing virtualized development environments.}
s.email = ["mitchell.hashimoto@gmail.com", "john.m.bender@gmail.com"] s.email = ["mitchell.hashimoto@gmail.com", "john.m.bender@gmail.com"]
@ -68,7 +68,6 @@ Gem::Specification.new do |s|
"lib/vagrant/commands/box/list.rb", "lib/vagrant/commands/box/list.rb",
"lib/vagrant/commands/box/remove.rb", "lib/vagrant/commands/box/remove.rb",
"lib/vagrant/commands/destroy.rb", "lib/vagrant/commands/destroy.rb",
"lib/vagrant/commands/down.rb",
"lib/vagrant/commands/halt.rb", "lib/vagrant/commands/halt.rb",
"lib/vagrant/commands/init.rb", "lib/vagrant/commands/init.rb",
"lib/vagrant/commands/package.rb", "lib/vagrant/commands/package.rb",
@ -89,8 +88,11 @@ Gem::Specification.new do |s|
"lib/vagrant/provisioners/chef_server.rb", "lib/vagrant/provisioners/chef_server.rb",
"lib/vagrant/provisioners/chef_solo.rb", "lib/vagrant/provisioners/chef_solo.rb",
"lib/vagrant/ssh.rb", "lib/vagrant/ssh.rb",
"lib/vagrant/systems/base.rb",
"lib/vagrant/systems/linux.rb",
"lib/vagrant/util.rb", "lib/vagrant/util.rb",
"lib/vagrant/util/errors.rb", "lib/vagrant/util/errors.rb",
"lib/vagrant/util/glob_loader.rb",
"lib/vagrant/util/platform.rb", "lib/vagrant/util/platform.rb",
"lib/vagrant/util/progress_meter.rb", "lib/vagrant/util/progress_meter.rb",
"lib/vagrant/util/stacked_proc_runner.rb", "lib/vagrant/util/stacked_proc_runner.rb",
@ -137,7 +139,6 @@ Gem::Specification.new do |s|
"test/vagrant/commands/box/list_test.rb", "test/vagrant/commands/box/list_test.rb",
"test/vagrant/commands/box/remove_test.rb", "test/vagrant/commands/box/remove_test.rb",
"test/vagrant/commands/destroy_test.rb", "test/vagrant/commands/destroy_test.rb",
"test/vagrant/commands/down_test.rb",
"test/vagrant/commands/halt_test.rb", "test/vagrant/commands/halt_test.rb",
"test/vagrant/commands/init_test.rb", "test/vagrant/commands/init_test.rb",
"test/vagrant/commands/package_test.rb", "test/vagrant/commands/package_test.rb",
@ -158,6 +159,7 @@ Gem::Specification.new do |s|
"test/vagrant/provisioners/chef_solo_test.rb", "test/vagrant/provisioners/chef_solo_test.rb",
"test/vagrant/provisioners/chef_test.rb", "test/vagrant/provisioners/chef_test.rb",
"test/vagrant/ssh_test.rb", "test/vagrant/ssh_test.rb",
"test/vagrant/systems/linux_test.rb",
"test/vagrant/util/errors_test.rb", "test/vagrant/util/errors_test.rb",
"test/vagrant/util/progress_meter_test.rb", "test/vagrant/util/progress_meter_test.rb",
"test/vagrant/util/stacked_proc_runner_test.rb", "test/vagrant/util/stacked_proc_runner_test.rb",
@ -207,7 +209,6 @@ Gem::Specification.new do |s|
"test/vagrant/commands/box/list_test.rb", "test/vagrant/commands/box/list_test.rb",
"test/vagrant/commands/box/remove_test.rb", "test/vagrant/commands/box/remove_test.rb",
"test/vagrant/commands/destroy_test.rb", "test/vagrant/commands/destroy_test.rb",
"test/vagrant/commands/down_test.rb",
"test/vagrant/commands/halt_test.rb", "test/vagrant/commands/halt_test.rb",
"test/vagrant/commands/init_test.rb", "test/vagrant/commands/init_test.rb",
"test/vagrant/commands/package_test.rb", "test/vagrant/commands/package_test.rb",
@ -228,6 +229,7 @@ Gem::Specification.new do |s|
"test/vagrant/provisioners/chef_solo_test.rb", "test/vagrant/provisioners/chef_solo_test.rb",
"test/vagrant/provisioners/chef_test.rb", "test/vagrant/provisioners/chef_test.rb",
"test/vagrant/ssh_test.rb", "test/vagrant/ssh_test.rb",
"test/vagrant/systems/linux_test.rb",
"test/vagrant/util/errors_test.rb", "test/vagrant/util/errors_test.rb",
"test/vagrant/util/progress_meter_test.rb", "test/vagrant/util/progress_meter_test.rb",
"test/vagrant/util/stacked_proc_runner_test.rb", "test/vagrant/util/stacked_proc_runner_test.rb",