diff --git a/Gemfile.lock b/Gemfile.lock index 4f05fdf..ffc6056 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,26 +1,26 @@ GIT remote: git://github.com/fgrehm/vagrant-global-status.git - revision: 860a7ce70ff4596621af492e47eace5631f47324 + revision: a0295400a0e47756cbcb8f97ed9f4449b1fb6b56 specs: - vagrant-global-status (0.1.0) + vagrant-global-status (0.1.1) GIT remote: git://github.com/fgrehm/vagrant-lxc.git - revision: 5ae82681cdedaf2a6f778e005dd65014fc7c2cec + revision: 225af5622767059708278db29d42941e93d41994 specs: - vagrant-lxc (0.5.1.dev) + vagrant-lxc (0.6.4.dev) GIT remote: git://github.com/fgrehm/vagrant-pristine.git - revision: 5c400d7850fc5f98d9601b59f4c3bd74818650de + revision: 4638491786943bfbf6f115b1fc379f069963fe46 specs: - vagrant-pristine (0.2.0) + vagrant-pristine (0.3.0) GIT remote: git://github.com/mitchellh/vagrant.git - revision: 16002d03c07f842a23497543129fa99f40f2bbc0 + revision: 57e95323b6600b146167f0f14f83b22dd31dd03f specs: - vagrant (1.2.8.dev) + vagrant (1.3.6.dev) childprocess (~> 0.3.7) erubis (~> 2.7.0) i18n (~> 0.6.0) @@ -56,7 +56,7 @@ GEM erubis (2.7.0) ffi (1.9.0) highline (1.6.19) - i18n (0.6.4) + i18n (0.6.5) ipaddress (0.8.0) json (1.7.7) librarian (0.1.0) @@ -97,7 +97,7 @@ GEM thor (0.18.1) vagrant-librarian-chef (0.1.2) librarian-chef - vagrant-omnibus (1.1.0) + vagrant-omnibus (1.1.2) yajl-ruby (1.1.0) PLATFORMS diff --git a/lib/vagrant-cachier/action/clean.rb b/lib/vagrant-cachier/action/clean.rb index 84702d0..a2015bf 100644 --- a/lib/vagrant-cachier/action/clean.rb +++ b/lib/vagrant-cachier/action/clean.rb @@ -1,3 +1,5 @@ +require 'timeout' + module VagrantPlugins module Cachier class Action @@ -8,29 +10,54 @@ module VagrantPlugins end def call(env) - @env = env + @env = env + @machine = env[:machine] - if env[:machine].state.id == :running && symlinks.any? + if symlinks.any? env[:ui].info I18n.t('vagrant_cachier.cleanup') - symlinks.each do |symlink| - remove_symlink symlink + if sshable? + symlinks.each do |symlink| + remove_symlink symlink + end end - File.delete env[:machine].data_dir.join('cache_dirs').to_s + File.delete @machine.data_dir.join('cache_dirs').to_s end @app.call env end + def sshable? + return if @machine.state.id != :running + + # By default Vagrant will keep trying [1] to ssh connect to the VM for + # a long and we've got to prevent that from happening, so we just wait + # a few seconds and assume that the VM is halted / unresponsive and we + # carry on if it times out. + # [1] - https://github.com/mitchellh/vagrant/blob/57e95323b6600b146167f0f14f83b22dd31dd03f/plugins/communicators/ssh/communicator.rb#L185-L200 + begin + Timeout.timeout(35) do + while true + return true if @machine.communicate.ready? + sleep 0.5 + end + end + rescue Timeout::Error + @env[:ui].warn(I18n.t('vagrant_cachier.unable_to_ssh')) + end + + return false + end + def symlinks # TODO: Check if file exists instead of a blank rescue - @symlinks ||= @env[:machine].data_dir.join('cache_dirs').read.split rescue [] + @symlinks ||= @machine.data_dir.join('cache_dirs').read.split rescue [] end def remove_symlink(symlink) - if @env[:machine].communicate.test("test -L #{symlink}") + if @machine.communicate.test("test -L #{symlink}") @logger.debug "Removing symlink for '#{symlink}'" - @env[:machine].communicate.sudo("unlink #{symlink}") + @machine.communicate.sudo("unlink #{symlink}") end end end diff --git a/locales/en.yml b/locales/en.yml index b54004d..b8147ad 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -11,6 +11,8 @@ en: '%{current_path}' and it will be moved to '%{new_path}' as it is the new path for keeping machine scoped cache dirs starting with the 0.3.0 version of the plugin. + unable_to_ssh: |- + vagrant-cachier was unable to SSH into the VM to remove symlinks! vagrant: errors: multiple_provider_specific_cache_dirs_found: |-