diff --git a/lib/kitchen/driver/vagrant.rb b/lib/kitchen/driver/vagrant.rb index 07428e7a..4504d53e 100644 --- a/lib/kitchen/driver/vagrant.rb +++ b/lib/kitchen/driver/vagrant.rb @@ -169,6 +169,13 @@ def winrm_transport? instance.transport.name.downcase =~ /win_?rm/ end + # Setting up the `cache_directory` to store omnibus packages in cache + # and share a local folder to that directory so that we don't pull them + # down every single time + def cache_directory + windows_os? ? "$env:TEMP\\omnibus\\cache" : "/tmp/omnibus/cache" + end + protected WEBSITE = "http://www.vagrantup.com/downloads.html".freeze @@ -248,6 +255,21 @@ def finalize_synced_folders! options || "nil" ] end + add_extra_synced_folders! + end + + # We would like to sync a local folder to the instance so we can + # take advantage of the packages that we might have in cache, + # therefore we wont download a package we already have + def add_extra_synced_folders! + if cache_directory + FileUtils.mkdir_p(local_kitchen_cache) + config[:synced_folders].push([ + local_kitchen_cache, + cache_directory, + "create: true" + ]) + end end # Truncates the length of `:vm_hostname` to 12 characters for @@ -389,6 +411,12 @@ def update_state(state) state[:rdp_port] = hash["RDPPort"] if hash["RDPPort"] end + # @return [String] full absolute path to the kitchen cache directory + # @api private + def local_kitchen_cache + @local_kitchen_cache ||= File.expand_path("~/.kitchen/cache") + end + # @return [String] full local path to the directory containing the # instance's Vagrantfile # @api private diff --git a/spec/kitchen/driver/vagrant_spec.rb b/spec/kitchen/driver/vagrant_spec.rb index b11f6952..46ffe314 100644 --- a/spec/kitchen/driver/vagrant_spec.rb +++ b/spec/kitchen/driver/vagrant_spec.rb @@ -147,6 +147,14 @@ def run_command(_cmd, options = {}) describe "configuration" do + let(:cache_directory_array) do + [ + File.expand_path("~/.kitchen/cache"), + "/tmp/omnibus/cache", + "create: true" + ] + end + %W[centos debian fedora opensuse ubuntu].each do |name| context "for known bento platform names starting with #{name}" do @@ -316,8 +324,8 @@ def run_command(_cmd, options = {}) expect(driver[:ssh]).to eq(:a => "b", :c => { :d => "e" }) end - it "sets :synced_folders to an empty array by default" do - expect(driver[:synced_folders]).to eq([]) + it "sets :synced_folders with the cache_directory by default" do + expect(driver[:synced_folders]).to eq([cache_directory_array]) end it "sets :synced_folders to a custom value" do @@ -326,7 +334,11 @@ def run_command(_cmd, options = {}) ] expect(driver[:synced_folders]).to eq([ - [File.expand_path("/host_path"), "/vm_path", "create: true, type: :nfs"] + [ + File.expand_path("/host_path"), + "/vm_path", "create: true, type: :nfs" + ], + cache_directory_array ]) end @@ -336,7 +348,8 @@ def run_command(_cmd, options = {}) ] expect(driver[:synced_folders]).to eq([ - [File.expand_path("/root/suitey-fooos-99"), "/vm_path", "stuff"] + [File.expand_path("/root/suitey-fooos-99"), "/vm_path", "stuff"], + cache_directory_array ]) end @@ -346,7 +359,8 @@ def run_command(_cmd, options = {}) ] expect(driver[:synced_folders]).to eq([ - [File.expand_path("/kroot/a"), "/vm_path", "stuff"] + [File.expand_path("/kroot/a"), "/vm_path", "stuff"], + cache_directory_array ]) end @@ -356,7 +370,8 @@ def run_command(_cmd, options = {}) ] expect(driver[:synced_folders]).to eq([ - [File.expand_path("/host_path"), "/vm_path", "nil"] + [File.expand_path("/host_path"), "/vm_path", "nil"], + cache_directory_array ]) end @@ -418,6 +433,14 @@ def run_command(_cmd, options = {}) context "for windows os_types" do + let(:win_cache_directory_array) do + [ + File.expand_path("~/.kitchen/cache"), + "$env:TEMP\\omnibus\\cache", + "create: true" + ] + end + before { allow(platform).to receive(:os_type).and_return("windows") } it "sets :vm_hostname to nil by default" do @@ -429,6 +452,21 @@ def run_command(_cmd, options = {}) expect(driver[:vm_hostname]).to eq("this-is-a--k") end + + it "sets :synced_folders with the cache_directory by default" do + expect(driver[:synced_folders]).to eq([win_cache_directory_array]) + end + + it "replaces %{instance_name} with instance name in :synced_folders" do + config[:synced_folders] = [ + ["/root/%{instance_name}", "/vm_path", "stuff"] + ] + + expect(driver[:synced_folders]).to eq([ + [File.expand_path("/root/suitey-fooos-99"), "/vm_path", "stuff"], + win_cache_directory_array + ]) + end end end