The path of storage containers taken from lxc-config, instead of using a constant for lxc>=1.0.0.
* for lxc to 1.0.0 using constant Vagrant::LXC::Driver::DEFAULT_CONTAINERS_PATH * change method Vagrant::LXC::Driver::CLI#version to call lxc-create if lxc-version command not exists (to lxc version 1.0.0)
This commit is contained in:
parent
e76a18185c
commit
f454924a59
6 changed files with 107 additions and 10 deletions
|
@ -13,8 +13,8 @@ module Vagrant
|
||||||
# a name.
|
# a name.
|
||||||
class ContainerNotFound < StandardError; end
|
class ContainerNotFound < StandardError; end
|
||||||
|
|
||||||
# Root folder where container configs are stored
|
# Default root folder where container configs are stored
|
||||||
CONTAINERS_PATH = '/var/lib/lxc'
|
DEFAULT_CONTAINERS_PATH = '/var/lib/lxc'
|
||||||
|
|
||||||
attr_reader :container_name,
|
attr_reader :container_name,
|
||||||
:customizations
|
:customizations
|
||||||
|
@ -31,12 +31,17 @@ module Vagrant
|
||||||
raise ContainerNotFound if @container_name && ! @cli.list.include?(@container_name)
|
raise ContainerNotFound if @container_name && ! @cli.list.include?(@container_name)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Root folder where container configs are stored
|
||||||
|
def containers_path
|
||||||
|
@containers_path ||= @cli.support_config_command? ? @cli.config('lxc.lxcpath') : DEFAULT_CONTAINERS_PATH
|
||||||
|
end
|
||||||
|
|
||||||
def all_containers
|
def all_containers
|
||||||
@cli.list
|
@cli.list
|
||||||
end
|
end
|
||||||
|
|
||||||
def base_path
|
def base_path
|
||||||
Pathname.new("#{CONTAINERS_PATH}/#{@container_name}")
|
Pathname.new("#{containers_path}/#{@container_name}")
|
||||||
end
|
end
|
||||||
|
|
||||||
def rootfs_path
|
def rootfs_path
|
||||||
|
|
|
@ -28,14 +28,24 @@ module Vagrant
|
||||||
end
|
end
|
||||||
|
|
||||||
def version
|
def version
|
||||||
if run(:version) =~ /lxc version:\s+(.+)\s*$/
|
return @version if @version
|
||||||
$1.downcase
|
@version = support_version_command? ? run(:version) : run(:create, '--version')
|
||||||
|
if @version =~ /(lxc version:\s+|)(.+)\s*$/
|
||||||
|
@version = $2.downcase
|
||||||
else
|
else
|
||||||
# TODO: Raise an user friendly error
|
# TODO: Raise an user friendly error
|
||||||
raise 'Unable to parse lxc version!'
|
raise 'Unable to parse lxc version!'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def config(param)
|
||||||
|
if support_config_command?
|
||||||
|
run(:config, param).gsub("\n", '')
|
||||||
|
else
|
||||||
|
raise Errors::CommandNotSupported, name: 'config', available_version: '> 1.x.x', version: version
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def state
|
def state
|
||||||
if @name && run(:info, '--name', @name, retryable: true) =~ /^state:[^A-Z]+([A-Z]+)$/i
|
if @name && run(:info, '--name', @name, retryable: true) =~ /^state:[^A-Z]+([A-Z]+)$/i
|
||||||
$1.downcase.to_sym
|
$1.downcase.to_sym
|
||||||
|
@ -134,6 +144,17 @@ module Vagrant
|
||||||
return @supports_attach
|
return @supports_attach
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def support_config_command?
|
||||||
|
version[0].to_i >= 1
|
||||||
|
end
|
||||||
|
|
||||||
|
def support_version_command?
|
||||||
|
@sudo_wrapper.run('which', 'lxc-version')
|
||||||
|
return true
|
||||||
|
rescue Vagrant::LXC::Errors::ExecuteError
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def run(command, *args)
|
def run(command, *args)
|
||||||
|
|
|
@ -26,6 +26,10 @@ module Vagrant
|
||||||
error_key(:lxc_container_already_exists)
|
error_key(:lxc_container_already_exists)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class CommandNotSupported < Vagrant::Errors::VagrantError
|
||||||
|
error_key(:lxc_command_not_supported)
|
||||||
|
end
|
||||||
|
|
||||||
# Box related errors
|
# Box related errors
|
||||||
class TemplateFileMissing < Vagrant::Errors::VagrantError
|
class TemplateFileMissing < Vagrant::Errors::VagrantError
|
||||||
error_key(:lxc_template_file_missing)
|
error_key(:lxc_template_file_missing)
|
||||||
|
|
|
@ -66,3 +66,7 @@ en:
|
||||||
There is container on your system with the same name you've specified
|
There is container on your system with the same name you've specified
|
||||||
on your Vagrantfile (%{name}), please choose a different one or
|
on your Vagrantfile (%{name}), please choose a different one or
|
||||||
run `lxc-destroy --name %{name}` and try again.
|
run `lxc-destroy --name %{name}` and try again.
|
||||||
|
|
||||||
|
lxc_command_not_supported: |-
|
||||||
|
Command (lxc-%{command}) not supported in version %{version}.
|
||||||
|
This command is available with version %{available_version}.
|
||||||
|
|
|
@ -29,17 +29,55 @@ describe Vagrant::LXC::Driver::CLI do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'version' do
|
describe 'version' do
|
||||||
let(:lxc_version_out) { "lxc version: 0.x.y-rc1\n" }
|
|
||||||
|
|
||||||
before do
|
before do
|
||||||
allow(subject).to receive(:run).with(:version).and_return(lxc_version_out)
|
allow(subject).to receive(:run).with(:version).and_return(lxc_version_out)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'lxc version before 1.x.x' do
|
||||||
|
let(:lxc_version_out) { "lxc version: 0.x.y-rc1\n" }
|
||||||
|
|
||||||
it 'parses the version from the output' do
|
it 'parses the version from the output' do
|
||||||
expect(subject.version).to eq('0.x.y-rc1')
|
expect(subject.version).to eq('0.x.y-rc1')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'lxc version after 1.x.x' do
|
||||||
|
let(:lxc_version_out) { "1.0.0\n" }
|
||||||
|
|
||||||
|
it 'parses the version from the output' do
|
||||||
|
expect(subject.version).to eq('1.0.0')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'config' do
|
||||||
|
before do
|
||||||
|
allow(subject).to receive(:run).with(:config, 'lxc.lxcpath').and_return(lxc_config_out)
|
||||||
|
allow(subject).to receive(:run).with(:version).and_return(lxc_version_out)
|
||||||
|
allow(subject).to receive(:run).with(:create, '--version').and_return(lxc_version_out)
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'lxc version before 1.x.x' do
|
||||||
|
let(:support_version_command?) { true }
|
||||||
|
let(:lxc_config_out) { "/var/lib/lxc\n" }
|
||||||
|
let(:lxc_version_out) { "lxc version: 0.x.y-rc1\n" }
|
||||||
|
|
||||||
|
it 'not supported' do
|
||||||
|
expect{subject.config('lxc.lxcpath')}.to raise_error(Vagrant::LXC::Errors::CommandNotSupported)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'lxc version before after 1.x.x'do
|
||||||
|
let(:support_version_command?) { false }
|
||||||
|
let(:lxc_config_out) { "/var/lib/lxc\n" }
|
||||||
|
let(:lxc_version_out) { "1.0.0\n" }
|
||||||
|
|
||||||
|
it 'parser the lxc.lxcpath value' do
|
||||||
|
expect(subject.config('lxc.lxcpath')).not_to end_with("\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe 'create' do
|
describe 'create' do
|
||||||
let(:template) { 'quantal-64' }
|
let(:template) { 'quantal-64' }
|
||||||
let(:name) { 'quantal-container' }
|
let(:name) { 'quantal-container' }
|
||||||
|
|
|
@ -89,7 +89,7 @@ describe Vagrant::LXC::Driver do
|
||||||
describe 'start' do
|
describe 'start' do
|
||||||
let(:customizations) { [['a', '1'], ['b', '2']] }
|
let(:customizations) { [['a', '1'], ['b', '2']] }
|
||||||
let(:internal_customization) { ['internal', 'customization'] }
|
let(:internal_customization) { ['internal', 'customization'] }
|
||||||
let(:cli) { double(Vagrant::LXC::Driver::CLI, start: true) }
|
let(:cli) { double(Vagrant::LXC::Driver::CLI, start: true, support_config_command?: false) }
|
||||||
let(:sudo) { double(Vagrant::LXC::SudoWrapper) }
|
let(:sudo) { double(Vagrant::LXC::SudoWrapper) }
|
||||||
|
|
||||||
subject { described_class.new('name', sudo, cli) }
|
subject { described_class.new('name', sudo, cli) }
|
||||||
|
@ -99,6 +99,7 @@ describe Vagrant::LXC::Driver do
|
||||||
and_return('# CONFIGURATION')
|
and_return('# CONFIGURATION')
|
||||||
sudo.should_receive(:run).twice.with('cp', '-f', %r{/tmp/.*}, '/var/lib/lxc/name/config')
|
sudo.should_receive(:run).twice.with('cp', '-f', %r{/tmp/.*}, '/var/lib/lxc/name/config')
|
||||||
sudo.should_receive(:run).twice.with('chown', 'root:root', '/var/lib/lxc/name/config')
|
sudo.should_receive(:run).twice.with('chown', 'root:root', '/var/lib/lxc/name/config')
|
||||||
|
|
||||||
subject.customizations << internal_customization
|
subject.customizations << internal_customization
|
||||||
subject.start(customizations)
|
subject.start(customizations)
|
||||||
end
|
end
|
||||||
|
@ -150,6 +151,30 @@ describe Vagrant::LXC::Driver do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'containers_path' do
|
||||||
|
let(:cli) { double(Vagrant::LXC::Driver::CLI, config: cli_config_value, support_config_command?: cli_support_config_command_value) }
|
||||||
|
|
||||||
|
subject { described_class.new('name', nil, cli) }
|
||||||
|
|
||||||
|
describe 'lxc version before 1.x.x' do
|
||||||
|
let(:cli_support_config_command_value) { false }
|
||||||
|
let(:cli_config_value) { '/var/lib/lxc' }
|
||||||
|
|
||||||
|
it 'delegates to cli' do
|
||||||
|
expect(subject.containers_path).to eq(cli_config_value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'lxc version after 1.x.x' do
|
||||||
|
let(:cli_support_config_command_value) { true }
|
||||||
|
let(:cli_config_value) { '/etc/lxc' }
|
||||||
|
|
||||||
|
it 'delegates to cli' do
|
||||||
|
expect(subject.containers_path).to eq(cli_config_value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe 'folder sharing' do
|
describe 'folder sharing' do
|
||||||
let(:shared_folder) { {guestpath: '/vagrant', hostpath: '/path/to/host/dir'} }
|
let(:shared_folder) { {guestpath: '/vagrant', hostpath: '/path/to/host/dir'} }
|
||||||
let(:ro_rw_folder) { {guestpath: '/vagrant/ro_rw', hostpath: '/path/to/host/dir', mount_options: ['ro', 'rw']} }
|
let(:ro_rw_folder) { {guestpath: '/vagrant/ro_rw', hostpath: '/path/to/host/dir', mount_options: ['ro', 'rw']} }
|
||||||
|
|
Loading…
Reference in a new issue