From 306deaa0e2749dca9cc0b34bdbd7396428d62b8b Mon Sep 17 00:00:00 2001 From: Fabio Rehm Date: Fri, 29 Mar 2013 12:24:37 -0300 Subject: [PATCH] Add support for configuring rootfs path References #30 --- lib/vagrant-lxc/action/create.rb | 4 +++- lib/vagrant-lxc/config.rb | 9 ++++++++- lib/vagrant-lxc/container.rb | 6 +++--- lib/vagrant-lxc/container/cli.rb | 9 ++++++--- spec/unit/container/cli_spec.rb | 34 +++++++++++++++++++++----------- spec/unit/container_spec.rb | 4 +++- 6 files changed, 46 insertions(+), 20 deletions(-) diff --git a/lib/vagrant-lxc/action/create.rb b/lib/vagrant-lxc/action/create.rb index eba7b75..1cb8e9a 100644 --- a/lib/vagrant-lxc/action/create.rb +++ b/lib/vagrant-lxc/action/create.rb @@ -6,7 +6,9 @@ module Vagrant base_name = env[:root_path].basename.to_s base_name.gsub!(/[^-a-z0-9_]/i, "") - machine_id = env[:machine].provider.container.create(base_name, env[:machine].box.metadata) + target_rootfs_path = env[:machine].provider_config.target_rootfs_path + + machine_id = env[:machine].provider.container.create(base_name, target_rootfs_path, env[:machine].box.metadata) env[:machine].id = machine_id env[:just_created] = true @app.call env diff --git a/lib/vagrant-lxc/config.rb b/lib/vagrant-lxc/config.rb index bd923ac..4e5edb4 100644 --- a/lib/vagrant-lxc/config.rb +++ b/lib/vagrant-lxc/config.rb @@ -6,8 +6,15 @@ module Vagrant # @return [Array] attr_reader :start_opts + # Base directory to store container's rootfs + # + # Defaults to nil, which means it will be stored wherever the lxc template + # tells it to be stored + attr_accessor :target_rootfs_path + def initialize - @start_opts = [] + @start_opts = [] + @target_rootfs_path = nil end end end diff --git a/lib/vagrant-lxc/container.rb b/lib/vagrant-lxc/container.rb index 81639f0..31df834 100644 --- a/lib/vagrant-lxc/container.rb +++ b/lib/vagrant-lxc/container.rb @@ -36,10 +36,10 @@ module Vagrant end def rootfs_path - Pathname.new("#{base_path}/rootfs") + Pathname.new(base_path.join('config').read.match(/^lxc\.rootfs\s+=\s+(.+)$/)[1]) end - def create(base_name, metadata = {}) + def create(base_name, target_rootfs_path, metadata = {}) @logger.debug('Creating container using lxc-create...') @name = "#{base_name}-#{SecureRandom.hex(6)}" @@ -50,7 +50,7 @@ module Vagrant ) @cli.name = @name - @cli.create(metadata.fetch('template-name'), meta_opts) + @cli.create(metadata.fetch('template-name'), target_rootfs_path, meta_opts) @name end diff --git a/lib/vagrant-lxc/container/cli.rb b/lib/vagrant-lxc/container/cli.rb index e1ceaca..57a3deb 100644 --- a/lib/vagrant-lxc/container/cli.rb +++ b/lib/vagrant-lxc/container/cli.rb @@ -31,15 +31,18 @@ module Vagrant end end - def create(template, template_opts = {}) + def create(template, target_rootfs_path, template_opts = {}) extra = template_opts.to_a.flatten extra.unshift '--' unless extra.empty? + rootfs_args = target_rootfs_path ? + ['-B', 'dir', '--dir', target_rootfs_path] : + [] + run :create, - # lxc-create options '--template', template, '--name', @name, - *extra + *(rootfs_args + extra) end def destroy diff --git a/spec/unit/container/cli_spec.rb b/spec/unit/container/cli_spec.rb index aedf6e6..14f9b83 100644 --- a/spec/unit/container/cli_spec.rb +++ b/spec/unit/container/cli_spec.rb @@ -33,19 +33,31 @@ describe Vagrant::LXC::Container::CLI do subject { described_class.new(name) } before do - subject.stub(:run) - subject.create(template, template_args) + subject.stub(:run) { |*args| @run_args = args } + subject.create(template, rootfs, template_args) end - it 'issues a lxc-create with provided template, container name and hash of arguments' do - subject.should have_received(:run).with( - :create, - '--template', template, - '--name', name, - '--', - '--extra-param', 'param', - '--other', 'value' - ) + context 'when no rootfs is passed' do + let(:rootfs) { nil } + + it 'issues a lxc-create with provided template, container name and hash of arguments' do + subject.should have_received(:run).with( + :create, + '--template', template, + '--name', name, + '--', + '--extra-param', 'param', + '--other', 'value' + ) + end + end + + context 'when the rootfs is passed' do + let(:rootfs) { 'rootfs_path' } + + it 'issues a lxc-create with the right rootfs arguments' do + @run_args.join(' ').should =~ /-B dir --dir #{rootfs}/ + end end end diff --git a/spec/unit/container_spec.rb b/spec/unit/container_spec.rb index 6573e96..bf3c96c 100644 --- a/spec/unit/container_spec.rb +++ b/spec/unit/container_spec.rb @@ -37,6 +37,7 @@ describe Vagrant::LXC::Container do let(:suffix) { 'random-suffix' } let(:template_name) { 'template-name' } let(:rootfs_cache) { '/path/to/cache' } + let(:target_rootfs) { '/path/to/rootfs' } let(:public_key_path) { Vagrant.source_root.join('keys', 'vagrant.pub').expand_path.to_s } let(:cli) { fire_double('Vagrant::LXC::Container::CLI', :create => true, :name= => true) } @@ -44,13 +45,14 @@ describe Vagrant::LXC::Container do before do SecureRandom.stub(hex: suffix) - subject.create base_name, 'template-name' => template_name, 'rootfs-cache-path' => rootfs_cache, 'template-opts' => { '--foo' => 'bar'} + subject.create base_name, target_rootfs, 'template-name' => template_name, 'rootfs-cache-path' => rootfs_cache, 'template-opts' => { '--foo' => 'bar'} end it 'creates container with the right arguments' do cli.should have_received(:name=).with("#{base_name}-#{suffix}") cli.should have_received(:create).with( template_name, + target_rootfs, '--auth-key' => public_key_path, '--cache' => rootfs_cache, '--foo' => 'bar'