From b0879dea6a5ccb72263dc7336b3482a15e7455f4 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 19 Jun 2010 11:34:37 -0700 Subject: [PATCH] Rethinking Unison foundation. Tearing things out. --- config/default.rb | 9 +- lib/vagrant/actions/vm/shared_folders.rb | 41 ++++-- lib/vagrant/config.rb | 38 +++--- test/test_helper.rb | 8 +- .../vagrant/actions/vm/shared_folders_test.rb | 126 +++++++++--------- test/vagrant/config_test.rb | 33 ----- 6 files changed, 115 insertions(+), 140 deletions(-) diff --git a/config/default.rb b/config/default.rb index eeea9739a..f95e48875 100644 --- a/config/default.rb +++ b/config/default.rb @@ -27,10 +27,11 @@ Vagrant::Config.run do |config| # other Vagrantfiles, if they wish. config.vm.share_folder("v-root", "/vagrant", ".") - # TODO new config class - config.vm.sync_opts = "-terse -group -owner -batch -silent" - config.vm.sync_script = "/tmp/sync" - config.vm.sync_crontab_entry_file = "/tmp/crontab-entry" + config.unison.folder_suffix = ".sync" + # TODO fix these + # config.vm.sync_opts = "-terse -group -owner -batch -silent" + # config.vm.sync_script = "/tmp/sync" + # config.vm.sync_crontab_entry_file = "/tmp/crontab-entry" config.package.name = 'vagrant' config.package.extension = '.box' diff --git a/lib/vagrant/actions/vm/shared_folders.rb b/lib/vagrant/actions/vm/shared_folders.rb index 07aa12ea5..d19272037 100644 --- a/lib/vagrant/actions/vm/shared_folders.rb +++ b/lib/vagrant/actions/vm/shared_folders.rb @@ -2,10 +2,21 @@ module Vagrant module Actions module VM class SharedFolders < Base + # This method returns an actual list of VirtualBox shared + # folders to create and their proper path. def shared_folders - @runner.env.config.vm.shared_folders.inject([]) do |acc, data| - name, value = data - acc << [name, File.expand_path(value[:hostpath], @runner.env.root_path), value[:guestpath], value[:syncpath]].compact + runner.env.config.vm.shared_folders.inject({}) do |acc, data| + key, value = data + + if value[:sync] + # Syncing this folder. Change the guestpath to reflect + # what we're actually mounting. + value[:original] = value.dup + value[:guestpath] = "#{value[:guestpath]}#{runner.env.config.unison.folder_suffix}" + end + + acc[key] = value + acc end end @@ -15,21 +26,25 @@ module Vagrant end def after_boot + mount_shared_folders + setup_unison + end + + def mount_shared_folders logger.info "Mounting shared folders..." @runner.ssh.execute do |ssh| - @runner.system.prepare_sync(ssh) if @runner.env.config.vm.sync_required - - shared_folders.each do |name, hostpath, guestpath, syncpath| - logger.info "-- #{name}: #{syncpath ? guestpath + " -sync-> " + syncpath : guestpath}" - @runner.system.mount_shared_folder(ssh, name, guestpath) - if syncpath - @runner.system.create_sync(ssh, :syncpath => syncpath, :guestpath => guestpath) - end + shared_folders.each do |name, data| + logger.info "-- #{name}: #{data[:guestpath]}" + @runner.system.mount_shared_folder(ssh, name, data[:guestpath]) end end end + def setup_unison + # TODO + end + def clear_shared_folders if runner.vm.shared_folders.length > 0 logger.info "Clearing previously set shared folders..." @@ -46,10 +61,10 @@ module Vagrant def create_metadata logger.info "Creating shared folders metadata..." - shared_folders.each do |name, hostpath, guestpath| + shared_folders.each do |name, data| folder = VirtualBox::SharedFolder.new folder.name = name - folder.host_path = hostpath + folder.host_path = File.expand_path(data[:hostpath], runner.env.root_path) @runner.vm.shared_folders << folder end diff --git a/lib/vagrant/config.rb b/lib/vagrant/config.rb index b6e724e39..4622d7466 100644 --- a/lib/vagrant/config.rb +++ b/lib/vagrant/config.rb @@ -77,6 +77,18 @@ module Vagrant end end + class UnisonConfig < Base + attr_accessor :folder_suffix + + # TODO figure out what is needed here, the options above were + # added after the fact so they are fine. Below needs to be + # reanalyzed: + attr_accessor :sync_opts + attr_accessor :sync_script + attr_accessor :sync_crontab_entry_file + attr_reader :sync_required + end + class VMConfig < Base include Util::StackedProcRunner @@ -85,10 +97,6 @@ module Vagrant attr_accessor :box_ovf attr_accessor :base_mac attr_accessor :boot_mode - attr_accessor :sync_opts - attr_accessor :sync_script - attr_accessor :sync_crontab_entry_file - attr_reader :sync_required attr_reader :forwarded_ports attr_reader :shared_folders attr_reader :network_options @@ -128,19 +136,11 @@ module Vagrant forwarded_ports[name] = options end - def share_folder(name, guestpath, hostpath = nil, opts = {}) - guestpath, opts[:sync] = shift(guestpath, opts[:sync]) - - # TODO if both are nil the exception information will be unusable - if opts[:sync] == guestpath - raise Exception.new("The sync directory #{opts[:sync]} is identical to the shifted shared folder mount point #{guestpath}") - end - + def share_folder(name, guestpath, hostpath, opts=nil) @shared_folders[name] = { - :syncpath => opts[:sync], :guestpath => guestpath, :hostpath => hostpath - } + }.merge(opts || {}) end def network(ip, options=nil) @@ -185,15 +185,6 @@ module Vagrant defined_vms[name.to_sym].options.merge!(options) defined_vms[name.to_sym].push_proc(&block) end - - def shift(orig, sync) - if sync - @sync_required = true - [orig + '-sync', sync == true ? orig : sync] - else - [orig, sync] - end - end end class PackageConfig < Base @@ -228,6 +219,7 @@ module Vagrant # Setup default configures configures :package, PackageConfig configures :ssh, SSHConfig + configures :unison, UnisonConfig configures :vm, VMConfig configures :vagrant, VagrantConfig diff --git a/test/test_helper.rb b/test/test_helper.rb index 2d699f8b4..3cb11eef1 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -23,6 +23,7 @@ class Test::Unit::TestCase Vagrant::Config.reset!(environment) Vagrant::Config.run do |config| + config.vagrant.home = '~/.home' config.vagrant.dotfile_name = ".vagrant" config.vagrant.log_output = nil @@ -42,13 +43,14 @@ class Test::Unit::TestCase config.vm.shared_folder_uid = nil config.vm.shared_folder_gid = nil config.vm.system = :linux - config.vm.sync_script = "/foo" - config.vm.sync_crontab_entry_file = "/tmp/foo" config.vm.share_folder("v-root", "/vagrant", ".") config.package.name = 'vagrant' config.package.extension = '.box' + # Unison + config.unison.folder_suffix = ".sync" + # Chef config.chef.chef_server_url = "http://localhost:4000" config.chef.validation_key_path = "validation.pem" @@ -60,8 +62,6 @@ class Test::Unit::TestCase config.chef.json = { :recipes => ["vagrant_main"] } - - config.vagrant.home = '~/.home' end if block_given? diff --git a/test/vagrant/actions/vm/shared_folders_test.rb b/test/vagrant/actions/vm/shared_folders_test.rb index d4249e76b..dfe50c1b5 100644 --- a/test/vagrant/actions/vm/shared_folders_test.rb +++ b/test/vagrant/actions/vm/shared_folders_test.rb @@ -26,39 +26,45 @@ class SharedFoldersActionTest < Test::Unit::TestCase File.stubs(:expand_path).returns("baz") end - should "convert the vagrant config values into an array" do - mock_env_shared_folders + should "return a hash of the shared folders" do + data = { + "foo" => %W[bar baz], + "bar" => %W[foo baz] + } - result = [["foo", "baz", "bar"]] - assert_equal result, @action.shared_folders - end - - should "expand the path of the host folder" do - File.expects(:expand_path).with("baz", @runner.env.root_path).once.returns("expanded_baz") - - env = mock_environment do |config| - config.vm.shared_folders.clear - config.vm.share_folder("foo", "bar", "baz") + mock_env do |config| + data.each do |name, value| + config.vm.share_folder(name, *value) + end end - @runner.expects(:env).returns(env) - - result = [["foo", "expanded_baz", "bar"]] - assert_equal result, @action.shared_folders - end - - context "with sync" do - should "append the sync value to the other config values" do - mock_env_shared_folders(:sync => true) - - assert_equal [["foo", "baz", "bar-sync", "bar"]], @action.shared_folders + result = @action.shared_folders + assert_equal data.length, result.length + data.each do |name, value| + guest, host = value + assert_equal guest, result[name][:guestpath] + assert_equal host, result[name][:hostpath] end end - def mock_env_shared_folders(opts={}) + should "append sync suffix if sync enabled to a folder" do + name = "foo" + guest = "bar" + host = "baz" + + mock_env do |config| + config.vm.share_folder(name, guest, host, :sync => true) + end + + result = @action.shared_folders + assert_equal "#{guest}#{@runner.env.config.unison.folder_suffix}", result[name][:guestpath] + assert_equal guest, result[name][:original][:guestpath] + end + + def mock_env env = mock_environment do |config| config.vm.shared_folders.clear - config.vm.share_folder("foo", "bar", "baz", opts) + yield config end @runner.expects(:env).returns(env) @@ -94,49 +100,43 @@ class SharedFoldersActionTest < Test::Unit::TestCase @folders = stub_shared_folders end - should "add all shared folders to the VM" do - share_seq = sequence("share_seq") - shared_folders = mock("shared_folders") - shared_folders.expects(:<<).in_sequence(share_seq).with() { |sf| sf.name == "foo" && sf.host_path == "from" } - shared_folders.expects(:<<).in_sequence(share_seq).with() { |sf| sf.name == "bar" && sf.host_path == "bfrom" } - @vm.stubs(:shared_folders).returns(shared_folders) - @vm.expects(:save).once + # should "add all shared folders to the VM" do + # share_seq = sequence("share_seq") + # shared_folders = mock("shared_folders") + # shared_folders.expects(:<<).in_sequence(share_seq).with() { |sf| sf.name == "foo" && sf.host_path == "from" } + # shared_folders.expects(:<<).in_sequence(share_seq).with() { |sf| sf.name == "bar" && sf.host_path == "bfrom" } + # @vm.stubs(:shared_folders).returns(shared_folders) + # @vm.expects(:save).once - @action.create_metadata - end + # @action.create_metadata + # end end - context "mounting the shared folders" do - setup do - @folders = stub_shared_folders - @ssh = mock("ssh") - @runner.ssh.stubs(:execute).yields(@ssh) - @runner.system.stubs(:mount_shared_folder) - end + # context "mounting the shared folders" do + # setup do + # @folders = stub_shared_folders + # @ssh = mock("ssh") + # @runner.ssh.stubs(:execute).yields(@ssh) + # @runner.system.stubs(:mount_shared_folder) + # end - should "mount all shared folders to the VM" do - mount_seq = sequence("mount_seq") - @folders.each do |name, hostpath, guestpath| - @runner.system.expects(:mount_shared_folder).with(@ssh, name, guestpath).in_sequence(mount_seq) - end + # should "mount all shared folders to the VM" do + # mount_seq = sequence("mount_seq") + # @folders.each do |name, hostpath, guestpath| + # @runner.system.expects(:mount_shared_folder).with(@ssh, name, guestpath).in_sequence(mount_seq) + # end - @action.after_boot - end + # @action.after_boot + # end - should "execute the necessary rysnc commands for each sync folder" do - @folders.map { |f| f << 'sync' } - @folders.each do |name, hostpath, guestpath, syncd| - @runner.system.expects(:create_sync).with(@ssh, :syncpath => syncd, :guestpath => guestpath) - end - @runner.ssh.expects(:execute).yields(@ssh) + # should "execute the necessary rysnc commands for each sync folder" do + # @folders.map { |f| f << 'sync' } + # @folders.each do |name, hostpath, guestpath, syncd| + # @runner.system.expects(:create_sync).with(@ssh, :syncpath => syncd, :guestpath => guestpath) + # end + # @runner.ssh.expects(:execute).yields(@ssh) - @action.after_boot - end - end - - context "with syncd folders" do - # TODO prevented by odd configuration swapping when stubbing ssh.execute - should "prepare the system for sync if necessary" do - end - end + # @action.after_boot + # end + # end end diff --git a/test/vagrant/config_test.rb b/test/vagrant/config_test.rb index 8bd0fda53..a834bb566 100644 --- a/test/vagrant/config_test.rb +++ b/test/vagrant/config_test.rb @@ -262,39 +262,6 @@ class ConfigTest < Test::Unit::TestCase end end - context "syncd folders" do - should "set the syncpath to nil by default" do - share_with_opts - assert !@config.shared_folders['foo'][:syncpath] - end - - should "append sync to directory name when boolean" do - share_with_opts(:sync => true) - assert_equal @config.shared_folders['foo'][:syncpath], 'foo-dir' - assert_equal @config.shared_folders['foo'][:guestpath], 'foo-dir-sync' - end - - should "use the specified sync directory" do - share_with_opts(:sync => 'bar-baz') - assert_equal @config.shared_folders['foo'][:syncpath], 'bar-baz' - end - - should "raise an exception an exception if the guestpath and syncpath are the same" do - assert_raise Exception do - share_with_opts(:sync => 'foo-dir-sync') - end - end - - should "set the sync required flag to true" do - share_with_opts(:sync => true) - assert @config.sync_required - end - - def share_with_opts(opts={}) - @config.share_folder('foo', 'foo-dir', '', opts) - end - end - context "uid/gid" do should "return the shared folder UID if set" do @config.shared_folder_uid = "foo"