Add fallback mechanism for platforms without attach support

Some platforms (most notably CentOS and RHEL) use a kernel without
'attach' support. This patch detects this absence and falls back
to the alternative ways of doing things like detection of IP address
and halting the container.
It does so by running the command "true" through lxc-attach.
This commit is contained in:
Kristof Willaert 2014-06-03 17:53:26 +02:00
parent 3a4c0ca79d
commit a4768c26ca
3 changed files with 26 additions and 3 deletions

View file

@ -197,8 +197,14 @@ module Vagrant
def self.action_fetch_ip
Builder.new.tap do |b|
b.use Builtin::ConfigValidate
b.use FetchIpWithLxcAttach
b.use FetchIpFromDnsmasqLeases
b.use Builtin::Call, Builtin::IsState, :running do |env, b2|
if env[:result]
b2.use FetchIpWithLxcAttach if env[:machine].provider.driver.supports_attach?
b2.use FetchIpFromDnsmasqLeases
else
b2.use Builtin::Message, I18n.t("vagrant_lxc.messages.not_running")
end
end
end
end

View file

@ -113,6 +113,10 @@ module Vagrant
@cli.destroy
end
def supports_attach?
@cli.supports_attach?
end
def attach(*command)
@cli.attach(*command)
end

View file

@ -77,7 +77,7 @@ module Vagrant
end
def stop
attach '/sbin/halt'
attach '/sbin/halt' if supports_attach?
run :stop, '--name', @name
end
@ -126,6 +126,19 @@ module Vagrant
end
end
def supports_attach?
unless defined?(@supports_attach)
begin
@supports_attach = true
run(:attach, '--name', @name, 'true')
rescue LXC::Errors::ExecuteError
@supports_attach = false
end
end
return @supports_attach
end
private
def run(command, *args)