Merge pull request #46 from fgrehm/8-fix-force-halt-when-nonresponsive
Fix GH-8
This commit is contained in:
commit
fa8c59a16c
3 changed files with 47 additions and 18 deletions
20
Gemfile.lock
20
Gemfile.lock
|
@ -1,26 +1,26 @@
|
||||||
GIT
|
GIT
|
||||||
remote: git://github.com/fgrehm/vagrant-global-status.git
|
remote: git://github.com/fgrehm/vagrant-global-status.git
|
||||||
revision: 860a7ce70ff4596621af492e47eace5631f47324
|
revision: a0295400a0e47756cbcb8f97ed9f4449b1fb6b56
|
||||||
specs:
|
specs:
|
||||||
vagrant-global-status (0.1.0)
|
vagrant-global-status (0.1.1)
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
remote: git://github.com/fgrehm/vagrant-lxc.git
|
remote: git://github.com/fgrehm/vagrant-lxc.git
|
||||||
revision: 5ae82681cdedaf2a6f778e005dd65014fc7c2cec
|
revision: 225af5622767059708278db29d42941e93d41994
|
||||||
specs:
|
specs:
|
||||||
vagrant-lxc (0.5.1.dev)
|
vagrant-lxc (0.6.4.dev)
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
remote: git://github.com/fgrehm/vagrant-pristine.git
|
remote: git://github.com/fgrehm/vagrant-pristine.git
|
||||||
revision: 5c400d7850fc5f98d9601b59f4c3bd74818650de
|
revision: 4638491786943bfbf6f115b1fc379f069963fe46
|
||||||
specs:
|
specs:
|
||||||
vagrant-pristine (0.2.0)
|
vagrant-pristine (0.3.0)
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
remote: git://github.com/mitchellh/vagrant.git
|
remote: git://github.com/mitchellh/vagrant.git
|
||||||
revision: 16002d03c07f842a23497543129fa99f40f2bbc0
|
revision: 57e95323b6600b146167f0f14f83b22dd31dd03f
|
||||||
specs:
|
specs:
|
||||||
vagrant (1.2.8.dev)
|
vagrant (1.3.6.dev)
|
||||||
childprocess (~> 0.3.7)
|
childprocess (~> 0.3.7)
|
||||||
erubis (~> 2.7.0)
|
erubis (~> 2.7.0)
|
||||||
i18n (~> 0.6.0)
|
i18n (~> 0.6.0)
|
||||||
|
@ -56,7 +56,7 @@ GEM
|
||||||
erubis (2.7.0)
|
erubis (2.7.0)
|
||||||
ffi (1.9.0)
|
ffi (1.9.0)
|
||||||
highline (1.6.19)
|
highline (1.6.19)
|
||||||
i18n (0.6.4)
|
i18n (0.6.5)
|
||||||
ipaddress (0.8.0)
|
ipaddress (0.8.0)
|
||||||
json (1.7.7)
|
json (1.7.7)
|
||||||
librarian (0.1.0)
|
librarian (0.1.0)
|
||||||
|
@ -97,7 +97,7 @@ GEM
|
||||||
thor (0.18.1)
|
thor (0.18.1)
|
||||||
vagrant-librarian-chef (0.1.2)
|
vagrant-librarian-chef (0.1.2)
|
||||||
librarian-chef
|
librarian-chef
|
||||||
vagrant-omnibus (1.1.0)
|
vagrant-omnibus (1.1.2)
|
||||||
yajl-ruby (1.1.0)
|
yajl-ruby (1.1.0)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
require 'timeout'
|
||||||
|
|
||||||
module VagrantPlugins
|
module VagrantPlugins
|
||||||
module Cachier
|
module Cachier
|
||||||
class Action
|
class Action
|
||||||
|
@ -8,29 +10,54 @@ module VagrantPlugins
|
||||||
end
|
end
|
||||||
|
|
||||||
def call(env)
|
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')
|
env[:ui].info I18n.t('vagrant_cachier.cleanup')
|
||||||
symlinks.each do |symlink|
|
if sshable?
|
||||||
remove_symlink symlink
|
symlinks.each do |symlink|
|
||||||
|
remove_symlink symlink
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
File.delete env[:machine].data_dir.join('cache_dirs').to_s
|
File.delete @machine.data_dir.join('cache_dirs').to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
@app.call env
|
@app.call env
|
||||||
end
|
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
|
def symlinks
|
||||||
# TODO: Check if file exists instead of a blank rescue
|
# 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
|
end
|
||||||
|
|
||||||
def remove_symlink(symlink)
|
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}'"
|
@logger.debug "Removing symlink for '#{symlink}'"
|
||||||
@env[:machine].communicate.sudo("unlink #{symlink}")
|
@machine.communicate.sudo("unlink #{symlink}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,6 +11,8 @@ en:
|
||||||
'%{current_path}' and it will be moved to
|
'%{current_path}' and it will be moved to
|
||||||
'%{new_path}' as it is the new path for keeping machine
|
'%{new_path}' as it is the new path for keeping machine
|
||||||
scoped cache dirs starting with the 0.3.0 version of the plugin.
|
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:
|
vagrant:
|
||||||
errors:
|
errors:
|
||||||
multiple_provider_specific_cache_dirs_found: |-
|
multiple_provider_specific_cache_dirs_found: |-
|
||||||
|
|
Loading…
Reference in a new issue