NFS options to configure mapall UID/GID. Vagrant can also detect this automatically (default)

This commit is contained in:
Mitchell Hashimoto 2010-07-15 23:02:31 -07:00
parent 736f032995
commit 46c462d322
6 changed files with 78 additions and 3 deletions

View File

@ -35,6 +35,9 @@ Vagrant::Config.run do |config|
config.unison.crontab_entry_file = "/tmp/vagrant-unison-crontab"
config.unison.log_file = "/tmp/v-unison-log-%s"
config.nfs.map_uid = :auto
config.nfs.map_gid = :auto
# TODO fix these
# config.vm.sync_opts = "-terse -group -owner -batch -silent"
# config.vm.sync_script = "/tmp/sync"

View File

@ -32,6 +32,7 @@ module Vagrant
extract_folders
if !folders.empty?
prepare_folders
clear_nfs_exports(env)
export_folders
end
@ -73,6 +74,36 @@ module Vagrant
end
end
# Prepares the settings for the NFS folders, such as setting the
# options on the NFS folders.
def prepare_folders
@folders = @folders.inject({}) do |acc, data|
key, opts = data
opts[:nfs] = {} if !opts.is_a?(Hash)
opts[:map_uid] = prepare_permission(:uid, opts)
opts[:map_gid] = prepare_permission(:gid, opts)
acc[key] = opts
acc
end
end
# Prepares the UID/GID settings for a single folder.
def prepare_permission(perm, opts)
key = "map_#{perm}".to_sym
return nil if opts.has_key?(key) && opts[key].nil?
# The options on the hash get priority, then the default
# values
value = opts[key] || @env["config"].nfs.send(key)
return value if value != :auto
# Get UID/GID from folder if we've made it this far
# (value == :auto)
stat = File.stat(opts[:hostpath])
return stat.send(perm)
end
# Uses the host class to export the folders via NFS. This typically
# involves adding a line to `/etc/exports` for this VM, but it is
# up to the host class to define the specific behavior.

View File

@ -86,6 +86,11 @@ module Vagrant
attr_accessor :log_file
end
class NFSConfig < Base
attr_accessor :map_uid
attr_accessor :map_gid
end
class VMConfig < Base
include Util::StackedProcRunner
@ -216,6 +221,7 @@ module Vagrant
# Setup default configures
configures :package, PackageConfig
configures :nfs, NFSConfig
configures :ssh, SSHConfig
configures :unison, UnisonConfig
configures :vm, VMConfig

View File

@ -1,3 +1,3 @@
# VAGRANT-BEGIN: <%= uuid %>
<% folders.each do |name, opts| %><%= opts[:hostpath] %> <%= ip %><% end %>
<% folders.each do |name, opts| %><%= opts[:hostpath] %> <%= ip %><% if opts[:map_uid] %> -mapall=<%= opts[:map_uid] %><% end %><% end %>
# VAGRANT-END: <%= uuid %>

View File

@ -37,7 +37,7 @@ class NFSVMActionTest < Test::Unit::TestCase
setup do
@instance.stubs(:folders).returns([:a])
[:clear_nfs_exports, :extract_folders, :export_folders, :mount_folders].each do |meth|
[:clear_nfs_exports, :extract_folders, :prepare_folders, :export_folders, :mount_folders].each do |meth|
@instance.stubs(meth)
end
end
@ -45,6 +45,7 @@ class NFSVMActionTest < Test::Unit::TestCase
should "call the proper sequence and succeed" do
seq = sequence('seq')
@instance.expects(:extract_folders).in_sequence(seq)
@instance.expects(:prepare_folders).in_sequence(seq)
@instance.expects(:clear_nfs_exports).with(@env).in_sequence(seq)
@instance.expects(:export_folders).in_sequence(seq)
@app.expects(:call).with(@env).in_sequence(seq)
@ -57,6 +58,7 @@ class NFSVMActionTest < Test::Unit::TestCase
seq = sequence('seq')
@instance.expects(:extract_folders).in_sequence(seq)
@instance.expects(:prepare_folders).never
@instance.expects(:export_folders).never
@instance.expects(:clear_nfs_exports).never
@app.expects(:call).with(@env).in_sequence(seq)
@ -69,6 +71,7 @@ class NFSVMActionTest < Test::Unit::TestCase
seq = sequence('seq')
@instance.expects(:extract_folders).in_sequence(seq)
@instance.expects(:prepare_folders).in_sequence(seq)
@instance.expects(:clear_nfs_exports).in_sequence(seq)
@instance.expects(:export_folders).in_sequence(seq)
@app.expects(:call).never
@ -111,6 +114,38 @@ class NFSVMActionTest < Test::Unit::TestCase
end
end
context "preparing UID/GID" do
setup do
@stat = mock("stat")
File.stubs(:stat).returns(@stat)
end
should "return nil if the perm is not set" do
assert_nil @instance.prepare_permission(:uid, {:gid => 7})
end
should "return nil if the perm explicitly says nil" do
assert_nil @instance.prepare_permission(:uid, {:uid => nil})
end
should "return the set value if it is set" do
assert_equal 7, @instance.prepare_permission(:gid, {:map_gid => 7})
end
should "return the global config value if set and not explicitly set on folder" do
@env.env.config.nfs.map_gid = 12
assert_equal 12, @instance.prepare_permission(:gid, {})
end
should "return the stat result of the hostpath if :auto" do
opts = { :hostpath => "foo", :map_uid => :auto }
File.expects(:stat).with(opts[:hostpath]).returns(@stat)
@stat.stubs(:uid).returns(24)
assert_equal 24, @instance.prepare_permission(:uid, opts)
end
end
context "exporting folders" do
setup do
@instance.stubs(:folders).returns({})

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.authors = ["Mitchell Hashimoto", "John Bender"]
s.date = %q{2010-07-14}
s.date = %q{2010-07-15}
s.default_executable = %q{vagrant}
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"]