vagrant-lxc 0.3.4 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +34 -14
- data/Gemfile +5 -4
- data/Gemfile.lock +33 -21
- data/Guardfile +4 -15
- data/README.md +76 -158
- data/boxes/common/lxc-template +229 -0
- data/boxes/common/lxc.conf +49 -0
- data/boxes/common/metadata.json +4 -0
- data/boxes/debian/finalize +195 -0
- data/boxes/debian/lxc-template +13 -9
- data/boxes/ubuntu/finalize +368 -0
- data/boxes/ubuntu/lxc-template +1 -2
- data/development/Vagrantfile +10 -6
- data/development/site.pp +1 -1
- data/example/Vagrantfile +13 -22
- data/lib/vagrant-lxc/action/boot.rb +2 -0
- data/lib/vagrant-lxc/action/create.rb +1 -0
- data/lib/vagrant-lxc/action/handle_box_metadata.rb +15 -2
- data/lib/vagrant-lxc/action/setup_package_files.rb +3 -0
- data/lib/vagrant-lxc/driver.rb +4 -2
- data/lib/vagrant-lxc/driver/cli.rb +7 -2
- data/lib/vagrant-lxc/errors.rb +2 -2
- data/lib/vagrant-lxc/version.rb +1 -1
- data/locales/en.yml +9 -1
- data/spec/Vagrantfile +1 -4
- data/spec/acceptance/sanity_check_spec.rb +1 -4
- data/spec/unit/action/clear_forwarded_ports_spec.rb +4 -3
- data/spec/unit/action/compress_rootfs_spec.rb +5 -5
- data/spec/unit/action/forward_ports_spec.rb +5 -5
- data/spec/unit/action/handle_box_metadata_spec.rb +5 -5
- data/spec/unit/action/setup_package_files_spec.rb +32 -14
- data/spec/unit/driver/cli_spec.rb +4 -2
- data/spec/unit/driver_spec.rb +13 -11
- data/tasks/boxes.rake +26 -96
- data/tasks/boxes.v2.rake +181 -0
- metadata +8 -2
data/development/site.pp
CHANGED
@@ -24,7 +24,7 @@ exec {
|
|
24
24
|
# Install dependencies
|
25
25
|
package {
|
26
26
|
[ 'libffi-dev', 'bsdtar', 'exuberant-ctags', 'ruby1.9.1-dev', 'htop', 'git',
|
27
|
-
'build-essential', 'redir', 'curl' ]:
|
27
|
+
'build-essential', 'redir', 'curl', 'vim', 'btrfs-tools' ]:
|
28
28
|
ensure => 'installed'
|
29
29
|
;
|
30
30
|
|
data/example/Vagrantfile
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
# Not really needed, but useful while developing so that vagrant picks it up
|
5
5
|
Vagrant.require_plugin 'vagrant-lxc'
|
6
|
+
Vagrant.require_plugin 'vagrant-omnibus'
|
6
7
|
|
7
8
|
Vagrant.configure("2") do |config|
|
8
9
|
config.vm.synced_folder "/tmp", "/vagrant_data"
|
@@ -22,35 +23,25 @@ echo "Hi there I'm a shell script used for provisioning"
|
|
22
23
|
puppet.manifest_file = "site.pp"
|
23
24
|
end
|
24
25
|
|
25
|
-
config.vm.provision :chef_solo do |chef|
|
26
|
-
chef.add_recipe "hello-world"
|
27
|
-
chef.log_level = :debug
|
28
|
-
end
|
29
|
-
|
30
26
|
port = 8080
|
31
|
-
releases = %w(precise quantal raring)
|
27
|
+
releases = %w(precise quantal raring wheezy squeeze sid)
|
32
28
|
releases.each do |release|
|
33
29
|
config.vm.define(release) do |lxc_config|
|
34
30
|
lxc_config.vm.box = "#{release}64"
|
35
|
-
lxc_config.vm.box_url = "http://dl.dropbox.com/u/13510779/lxc-#{release}-amd64-2013-
|
36
|
-
lxc_config.vm.network :forwarded_port, guest: 80, host: (port += 1)
|
31
|
+
lxc_config.vm.box_url = "http://dl.dropbox.com/u/13510779/lxc-#{release}-amd64-2013-07-12.box"
|
37
32
|
# Uncomment if you want to try out a box built locally
|
38
|
-
# lxc_config.vm.box_url = "../boxes/output/lxc-#{release}
|
33
|
+
# lxc_config.vm.box_url = "../boxes/output/lxc-#{release}-amd64-2013-07-12.box"
|
34
|
+
lxc_config.vm.network :forwarded_port, guest: 80, host: (port += 1)
|
39
35
|
lxc_config.vm.hostname = "lxc-#{release}64-example"
|
40
|
-
end
|
41
|
-
end
|
42
36
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
# lxc_config.vm.box_url = "../boxes/output/lxc-#{release}64.box"
|
52
|
-
# Does not work yet:
|
53
|
-
# lxc_config.vm.hostname = "lxc-#{release}64-example"
|
37
|
+
if %w(precise quantal raring squeeze).include? release
|
38
|
+
lxc_config.omnibus.chef_version = :latest
|
39
|
+
|
40
|
+
lxc_config.vm.provision :chef_solo do |chef|
|
41
|
+
chef.add_recipe "hello-world"
|
42
|
+
chef.log_level = :debug
|
43
|
+
end
|
44
|
+
end
|
54
45
|
end
|
55
46
|
end
|
56
47
|
end
|
@@ -11,6 +11,8 @@ module Vagrant
|
|
11
11
|
|
12
12
|
config = env[:machine].provider_config
|
13
13
|
|
14
|
+
config.customize 'utsname', env[:machine].id
|
15
|
+
|
14
16
|
env[:ui].info I18n.t("vagrant_lxc.messages.starting")
|
15
17
|
env[:machine].provider.driver.start(config.customizations)
|
16
18
|
raise Vagrant::Errors::VMFailedToBoot if !wait_for_boot
|
@@ -3,6 +3,7 @@ module Vagrant
|
|
3
3
|
module Action
|
4
4
|
# Prepare arguments to be used for lxc-create
|
5
5
|
class HandleBoxMetadata
|
6
|
+
SUPPORTED_VERSIONS = [2, 3]
|
6
7
|
def initialize(app, env)
|
7
8
|
@app = app
|
8
9
|
@logger = Log4r::Logger.new("vagrant::lxc::action::handle_box_metadata")
|
@@ -22,6 +23,10 @@ module Vagrant
|
|
22
23
|
@env[:lxc_template_opts] = template_opts
|
23
24
|
@env[:lxc_template_src] = template_src
|
24
25
|
|
26
|
+
if template_config_file.exist?
|
27
|
+
@env[:lxc_template_config] = template_config_file.to_s
|
28
|
+
end
|
29
|
+
|
25
30
|
@app.call env
|
26
31
|
end
|
27
32
|
|
@@ -29,9 +34,15 @@ module Vagrant
|
|
29
34
|
@template_src ||= @box.directory.join('lxc-template').to_s
|
30
35
|
end
|
31
36
|
|
37
|
+
def template_config_file
|
38
|
+
@template_config_file ||= @box.directory.join('lxc.conf')
|
39
|
+
end
|
40
|
+
|
32
41
|
def template_opts
|
33
42
|
@template_opts ||= @box.metadata.fetch('template-opts', {}).dup.merge!(
|
34
43
|
'--tarball' => rootfs_tarball,
|
44
|
+
# TODO: Deprecate this, the rootfs should be ready for vagrant-lxc
|
45
|
+
# SSH access at this point
|
35
46
|
'--auth-key' => Vagrant.source_root.join('keys', 'vagrant.pub').expand_path.to_s
|
36
47
|
)
|
37
48
|
end
|
@@ -41,8 +52,10 @@ module Vagrant
|
|
41
52
|
end
|
42
53
|
|
43
54
|
def validate_box
|
44
|
-
|
45
|
-
raise Errors::
|
55
|
+
unless SUPPORTED_VERSIONS.include? @box.metadata.fetch('version').to_i
|
56
|
+
raise Errors::IncompatibleBox.new name: @box.name,
|
57
|
+
found: @box.metadata.fetch('version').to_i,
|
58
|
+
supported: SUPPORTED_VERSIONS.join(' and ')
|
46
59
|
end
|
47
60
|
|
48
61
|
unless File.exists?(template_src)
|
@@ -45,6 +45,9 @@ module Vagrant
|
|
45
45
|
box_dir = @env[:machine].box.directory
|
46
46
|
FileUtils.cp box_dir.join('lxc-template').to_s, @env['package.directory'].to_s
|
47
47
|
FileUtils.cp box_dir.join('metadata.json').to_s, @env['package.directory'].to_s
|
48
|
+
if (conf = box_dir.join('lxc.conf')).exist?
|
49
|
+
FileUtils.cp conf.to_s, @env['package.directory'].to_s
|
50
|
+
end
|
48
51
|
end
|
49
52
|
end
|
50
53
|
end
|
data/lib/vagrant-lxc/driver.rb
CHANGED
@@ -33,12 +33,12 @@ module Vagrant
|
|
33
33
|
Pathname.new(base_path.join('config').read.match(/^lxc\.rootfs\s+=\s+(.+)$/)[1])
|
34
34
|
end
|
35
35
|
|
36
|
-
def create(name, template_path, template_options = {})
|
36
|
+
def create(name, template_path, config_file, template_options = {})
|
37
37
|
@cli.name = @container_name = name
|
38
38
|
|
39
39
|
import_template(template_path) do |template_name|
|
40
40
|
@logger.debug "Creating container..."
|
41
|
-
@cli.create template_name, template_options
|
41
|
+
@cli.create template_name, config_file, template_options
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -131,6 +131,8 @@ module Vagrant
|
|
131
131
|
TEMPLATES_PATH_LOOKUP = %w(
|
132
132
|
/usr/share/lxc/templates
|
133
133
|
/usr/lib/lxc/templates
|
134
|
+
/usr/lib64/lxc/templates
|
135
|
+
/usr/local/lib/lxc/templates
|
134
136
|
)
|
135
137
|
def templates_path
|
136
138
|
return @templates_path if @templates_path
|
@@ -39,20 +39,25 @@ module Vagrant
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def state
|
42
|
-
if @name && run(:info, '--name', @name) =~ /^state:[^A-Z]+([A-Z]+)$/
|
42
|
+
if @name && run(:info, '--name', @name, retryable: true) =~ /^state:[^A-Z]+([A-Z]+)$/
|
43
43
|
$1.downcase.to_sym
|
44
44
|
elsif @name
|
45
45
|
:unknown
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
def create(template, template_opts = {})
|
49
|
+
def create(template, config_file, template_opts = {})
|
50
|
+
if config_file
|
51
|
+
config_opts = ['-f', config_file]
|
52
|
+
end
|
53
|
+
|
50
54
|
extra = template_opts.to_a.flatten
|
51
55
|
extra.unshift '--' unless extra.empty?
|
52
56
|
|
53
57
|
run :create,
|
54
58
|
'--template', template,
|
55
59
|
'--name', @name,
|
60
|
+
*(config_opts),
|
56
61
|
*extra
|
57
62
|
end
|
58
63
|
|
data/lib/vagrant-lxc/errors.rb
CHANGED
@@ -14,8 +14,8 @@ module Vagrant
|
|
14
14
|
class RootFSTarballMissing < Vagrant::Errors::VagrantError
|
15
15
|
error_key(:lxc_invalid_box_version)
|
16
16
|
end
|
17
|
-
class
|
18
|
-
error_key(:
|
17
|
+
class IncompatibleBox < Vagrant::Errors::VagrantError
|
18
|
+
error_key(:lxc_incompatible_box)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
data/lib/vagrant-lxc/version.rb
CHANGED
data/locales/en.yml
CHANGED
@@ -17,8 +17,12 @@ en:
|
|
17
17
|
force_shutdown: |-
|
18
18
|
Forcing shutdown of container...
|
19
19
|
|
20
|
-
# TODO: Review messages below
|
21
20
|
vagrant:
|
21
|
+
commands:
|
22
|
+
status:
|
23
|
+
stopped: |-
|
24
|
+
The container is currently stopped. Run `vagrant up` to bring it up again.
|
25
|
+
|
22
26
|
actions:
|
23
27
|
lxc:
|
24
28
|
compressing_rootfs: Compressing container's rootfs...
|
@@ -33,6 +37,10 @@ en:
|
|
33
37
|
For more information on the failure, enable detailed logging by setting
|
34
38
|
the environment variable VAGRANT_LOG to DEBUG.
|
35
39
|
|
40
|
+
lxc_incompatible_box: |-
|
41
|
+
The base box you are trying to use is not compatible with the installed
|
42
|
+
vagrant-lxc version. Supported box versions are %{supported} but %{found} was found.
|
43
|
+
|
36
44
|
lxc_template_file_missing: |-
|
37
45
|
The template file used for creating the container was not found for %{name}
|
38
46
|
box.
|
data/spec/Vagrantfile
CHANGED
@@ -8,10 +8,7 @@ ENV['BOX_NAME'] ||= 'quantal64'
|
|
8
8
|
|
9
9
|
Vagrant.configure("2") do |config|
|
10
10
|
config.vm.box = ENV['BOX_NAME']
|
11
|
-
|
12
|
-
unless %w( squeeze64 wheezy64 sid64 ).include? config.vm.box
|
13
|
-
config.vm.hostname = 'lxc-test-box'
|
14
|
-
end
|
11
|
+
config.vm.hostname = 'lxc-test-box'
|
15
12
|
|
16
13
|
config.cache.enable :apt
|
17
14
|
|
@@ -20,10 +20,7 @@ describe 'Sanity check' do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it "is able to be SSH'ed" do
|
23
|
-
|
24
|
-
# HACK:
|
25
|
-
expected = ENV['BOX_NAME'].gsub(/64$/, '') if %w( squeeze64 wheezy64 sid64 ).include? ENV['BOX_NAME']
|
26
|
-
expect(vagrant_ssh('hostname')).to eq expected
|
23
|
+
expect(vagrant_ssh('hostname')).to eq 'lxc-test-box'
|
27
24
|
end
|
28
25
|
|
29
26
|
it 'mounts shared folders with the right permissions' do
|
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'unit_helper'
|
2
2
|
|
3
|
+
require 'tmpdir'
|
3
4
|
require 'vagrant-lxc/action/clear_forwarded_ports'
|
4
5
|
|
5
6
|
describe Vagrant::LXC::Action::ClearForwardedPorts do
|
6
|
-
let(:app) {
|
7
|
-
let(:env) { {machine: machine, ui:
|
8
|
-
let(:machine) {
|
7
|
+
let(:app) { double(:app, call: true) }
|
8
|
+
let(:env) { {machine: machine, ui: double(info: true)} }
|
9
|
+
let(:machine) { double(:machine, data_dir: data_dir) }
|
9
10
|
let!(:data_dir) { Pathname.new(Dir.mktmpdir) }
|
10
11
|
let(:pids_dir) { data_dir.join('pids') }
|
11
12
|
let(:pid) { 'a-pid' }
|
@@ -3,11 +3,11 @@ require 'unit_helper'
|
|
3
3
|
require 'vagrant-lxc/action/compress_rootfs'
|
4
4
|
|
5
5
|
describe Vagrant::LXC::Action::CompressRootFS do
|
6
|
-
let(:app) {
|
7
|
-
let(:env) { {machine: machine, ui:
|
8
|
-
let(:machine) {
|
9
|
-
let(:provider) {
|
10
|
-
let(:driver) {
|
6
|
+
let(:app) { double(:app, call: true) }
|
7
|
+
let(:env) { {machine: machine, ui: double(info: true)} }
|
8
|
+
let(:machine) { instance_double('Vagrant::Machine', provider: provider) }
|
9
|
+
let(:provider) { instance_double('Vagrant::LXC::Provider', driver: driver) }
|
10
|
+
let(:driver) { instance_double('Vagrant::LXC::Driver', compress_rootfs: compressed_rootfs_path) }
|
11
11
|
let(:compressed_rootfs_path) { '/path/to/rootfs.tar.gz' }
|
12
12
|
|
13
13
|
subject { described_class.new(app, env) }
|
@@ -3,15 +3,15 @@ require 'unit_helper'
|
|
3
3
|
require 'vagrant-lxc/action/forward_ports'
|
4
4
|
|
5
5
|
describe Vagrant::LXC::Action::ForwardPorts do
|
6
|
-
let(:app) {
|
7
|
-
let(:env) { {machine: machine, ui:
|
8
|
-
let(:machine) {
|
6
|
+
let(:app) { double(:app, call: true) }
|
7
|
+
let(:env) { {machine: machine, ui: double(info: true)} }
|
8
|
+
let(:machine) { double(:machine) }
|
9
9
|
let!(:data_dir) { Pathname.new(Dir.mktmpdir) }
|
10
10
|
let(:networks) { [[:other_config, {}], [:forwarded_port, {guest: guest_port, host: host_port}]] }
|
11
11
|
let(:host_port) { 8080 }
|
12
12
|
let(:guest_port) { 80 }
|
13
|
-
let(:provider) {
|
14
|
-
let(:driver) {
|
13
|
+
let(:provider) { instance_double('Vagrant::LXC::Provider', driver: driver) }
|
14
|
+
let(:driver) { instance_double('Vagrant::LXC::Driver', assigned_ip: container_ip) }
|
15
15
|
let(:container_ip) { '10.0.1.234' }
|
16
16
|
let(:pid) { 'a-pid' }
|
17
17
|
|
@@ -5,10 +5,10 @@ require 'vagrant-lxc/errors'
|
|
5
5
|
require 'vagrant-lxc/action/handle_box_metadata'
|
6
6
|
|
7
7
|
describe Vagrant::LXC::Action::HandleBoxMetadata do
|
8
|
-
let(:app) {
|
9
|
-
let(:env) { {machine: machine, ui:
|
10
|
-
let(:machine) {
|
11
|
-
let(:box) {
|
8
|
+
let(:app) { double(:app, call: true) }
|
9
|
+
let(:env) { {machine: machine, ui: double(info: true)} }
|
10
|
+
let(:machine) { double(:machine, box: box) }
|
11
|
+
let(:box) { double(:box, name: 'box-name', metadata: metadata, directory: box_directory) }
|
12
12
|
let(:box_directory) { Pathname.new('/path/to/box') }
|
13
13
|
let(:version) { '2' }
|
14
14
|
let(:metadata) { {'template-opts' => {'--foo' => 'bar'}, 'version' => version} }
|
@@ -50,7 +50,7 @@ describe Vagrant::LXC::Action::HandleBoxMetadata do
|
|
50
50
|
metadata['version'] = '1'
|
51
51
|
expect {
|
52
52
|
subject.call(env)
|
53
|
-
}.to raise_error(Vagrant::LXC::Errors::
|
53
|
+
}.to raise_error(Vagrant::LXC::Errors::IncompatibleBox)
|
54
54
|
end
|
55
55
|
|
56
56
|
it 'raises an error if the rootfs tarball cant be found' do
|
@@ -3,39 +3,57 @@ require 'unit_helper'
|
|
3
3
|
require 'vagrant-lxc/action/setup_package_files'
|
4
4
|
|
5
5
|
describe Vagrant::LXC::Action::SetupPackageFiles do
|
6
|
-
let(:app) {
|
7
|
-
let(:env) { {machine: machine, tmp_path: tmp_path, ui:
|
8
|
-
let(:machine) {
|
6
|
+
let(:app) { double(:app, call: true) }
|
7
|
+
let(:env) { {machine: machine, tmp_path: tmp_path, ui: double(info: true), 'package.rootfs' => rootfs_path} }
|
8
|
+
let(:machine) { instance_double('Vagrant::Machine', box: box) }
|
9
9
|
let!(:tmp_path) { Pathname.new(Dir.mktmpdir) }
|
10
|
-
let(:box) {
|
10
|
+
let(:box) { instance_double('Vagrant::Box', directory: tmp_path.join('box')) }
|
11
11
|
let(:rootfs_path) { tmp_path.join('rootfs-amd64.tar.gz') }
|
12
12
|
|
13
13
|
subject { described_class.new(app, env) }
|
14
14
|
|
15
15
|
before do
|
16
16
|
box.directory.mkdir
|
17
|
-
|
17
|
+
files = %w( lxc-template metadata.json lxc.conf ).map { |f| box.directory.join(f) }
|
18
|
+
(files + [rootfs_path]).each do |file|
|
18
19
|
file.open('w') { |f| f.puts file.to_s }
|
19
20
|
end
|
20
21
|
|
21
22
|
subject.stub(recover: true) # Prevents files from being removed on specs
|
22
|
-
subject.call(env)
|
23
23
|
end
|
24
24
|
|
25
25
|
after do
|
26
26
|
FileUtils.rm_rf(tmp_path.to_s)
|
27
27
|
end
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
context 'when all files exist' do
|
30
|
+
before { subject.call(env) }
|
31
|
+
|
32
|
+
it 'copies box lxc-template to package directory' do
|
33
|
+
env['package.directory'].join('lxc-template').should be_file
|
34
|
+
end
|
32
35
|
|
33
|
-
|
34
|
-
|
36
|
+
it 'copies metadata.json to package directory' do
|
37
|
+
env['package.directory'].join('metadata.json').should be_file
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'copies box lxc.conf to package directory' do
|
41
|
+
env['package.directory'].join('lxc-template').should be_file
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'moves the compressed rootfs to package directory' do
|
45
|
+
env['package.directory'].join(rootfs_path.basename).should be_file
|
46
|
+
env['package.rootfs'].should_not be_file
|
47
|
+
end
|
35
48
|
end
|
36
49
|
|
37
|
-
|
38
|
-
|
39
|
-
|
50
|
+
context 'when lxc.conf file is not present' do
|
51
|
+
before do
|
52
|
+
box.directory.join('lxc.conf').delete
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'does not blow up' do
|
56
|
+
expect { subject.call(env) }.to_not raise_error
|
57
|
+
end
|
40
58
|
end
|
41
59
|
end
|
@@ -38,13 +38,14 @@ describe Vagrant::LXC::Driver::CLI do
|
|
38
38
|
describe 'create' do
|
39
39
|
let(:template) { 'quantal-64' }
|
40
40
|
let(:name) { 'quantal-container' }
|
41
|
+
let(:config_file) { 'config' }
|
41
42
|
let(:template_args) { { '--extra-param' => 'param', '--other' => 'value' } }
|
42
43
|
|
43
44
|
subject { described_class.new(name) }
|
44
45
|
|
45
46
|
before do
|
46
47
|
subject.stub(:run) { |*args| @run_args = args }
|
47
|
-
subject.create(template, template_args)
|
48
|
+
subject.create(template, config_file, template_args)
|
48
49
|
end
|
49
50
|
|
50
51
|
it 'issues a lxc-create with provided template, container name and hash of arguments' do
|
@@ -52,6 +53,7 @@ describe Vagrant::LXC::Driver::CLI do
|
|
52
53
|
:create,
|
53
54
|
'--template', template,
|
54
55
|
'--name', name,
|
56
|
+
'-f', config_file,
|
55
57
|
'--',
|
56
58
|
'--extra-param', 'param',
|
57
59
|
'--other', 'value'
|
@@ -124,7 +126,7 @@ describe Vagrant::LXC::Driver::CLI do
|
|
124
126
|
|
125
127
|
it 'calls lxc-info with the right arguments' do
|
126
128
|
subject.state
|
127
|
-
subject.should have_received(:run).with(:info, '--name', name)
|
129
|
+
subject.should have_received(:run).with(:info, '--name', name, retryable: true)
|
128
130
|
end
|
129
131
|
|
130
132
|
it 'maps the output of lxc-info status out to a symbol' do
|