Compare commits

..

937 commits

Author SHA1 Message Date
a47660a1e5 Update 'README.md' 2023-02-03 19:28:15 +00:00
3575d65ffb Update 'README.md' 2023-02-03 19:08:48 +00:00
Glenn Y. Rolland
938a29ed96
Merge branch 'fgrehm:master' into master 2023-02-03 19:56:32 +01:00
Fabio
ff58ecd5f2
Update README.md 2022-11-24 20:41:12 -03:00
Fabio
df6b78c4ed
Update README.md 2022-11-24 20:40:54 -03:00
Fabio
4d53acb9fb
Update README.md 2022-11-24 20:40:34 -03:00
Fabio
b88d50fb68
Update README.md 2022-11-16 22:39:19 -03:00
4e3306ed74 Fix the 'eval: Address:: not found' error that may appear 2022-09-28 15:01:04 +02:00
Fabio Rehm
c167ac7f83
Make it clear that project is looking for maintainers
Ref https://github.com/fgrehm/vagrant-lxc/issues/492
2021-01-12 11:15:50 -03:00
Virgil Dupras
a112b072aa
Merge pull request #473 from ebobby/fix-redir3
Fix redir version fetching.
2018-09-26 19:53:14 -04:00
Francisco Soto
f750bf406c Fix redir version fetching.
"" || "something" doesn't really work. Have to check for the actual string
length to determine if got something or not out of the pipe.
2018-09-24 18:43:03 -07:00
Virgil Dupras
2a5510b34c Fix "vargant package" for LXC 2.1+ config format
New config format would be under `lxc.rootfs.path` and be prefixed by
`dir:`.
2018-07-24 12:23:25 -04:00
Virgil Dupras
a1aa60ded5 Remove supports_attach? and call to /sbin/halt
Hosts without support for lxc-attach are ancien and can always use old
versions of vagrant-lxc. To be able to move forward more easily, we
should be able to assume a functional `lxc-attach`.

As for `/sbin/halt`, I'm really not sure it's needed anymore. Let's see
if its removal causes problems.
2018-07-24 11:21:09 -04:00
Virgil Dupras
61c921ac6f Use require_relative everywhere in plugin entry point 2018-07-24 10:25:08 -04:00
Virgil Dupras
437b5e7a2e README: base boxes status update 2018-07-24 10:08:07 -04:00
Virgil Dupras
2c2630a788 Bump minimum requirements for next vagrant-lxc release (v1.5)
We now depend on vagrant 1.9+ and LXC 2.0+, following bundled version in
debian stretch.

Also, update Gemfile to target latest vagrant/vagrant-spec. It's too
complicated to test against old vagrant versions. Vagrant 1.8.x didn't
specify an upper bound for supported versions but vagrant 1.9 does
(<2.4). This breaks out CI testing matrix which tests against 2.3, 2.4
and 2.5.

So let's make our live easier and just test against the latest vagrant
version and try not to mistakenly drop support for our lowest supported
vagrant version...
2018-07-24 09:37:34 -04:00
Virgil Dupras
5a1f6ab2cb
Merge pull request #469 from worxli/feature-add-ssh-ip
Add config for container SSH IP
2018-07-23 06:27:50 -04:00
Lukas Bischofberger
f71de429a1 Add config for container ssh IP 2018-07-21 14:52:26 +02:00
Virgil Dupras
50cbe5a0d6 v1.4.2 2018-07-17 14:37:18 -04:00
Virgil Dupras
44eefd81fb Merge tag 'v1.4.1' 2018-07-17 14:34:58 -04:00
Virgil Dupras
a84f8b59bf redir: adjust failing tests 2018-07-04 15:00:46 -04:00
Virgil Dupras
c1dd7baf2a redir: start in foreground mode under v3.x
ref #467
2018-07-04 14:34:26 -04:00
Virgil Dupras
8a1e1863a7 redir: fix version parsing
At some point in v 3.x, it outputted version in stderr, then went back
to stdout...
2018-07-04 14:33:51 -04:00
Virgil Dupras
b812a6934a v1.4.1 2018-04-30 21:32:33 -04:00
Virgil Dupras
8cfe577b17 Fix LXC 3.0 compatibility with old boxes
Creating a new vagrant machine with a box created with an old LXC config
format would fail with LXC 3.0. We now update the LXC config of the box
itself before calling `lxc-create`.
2018-04-30 20:45:25 -04:00
Virgil Dupras
dd24cdc3d6 Fix incompatibility with LXC 3.0
LXC 3.0, unlike 2.1, doesn't support old configuration formats at all
and because our previous approach to handling old format was incomplete,
running `vagrant up` on a system with LXC 3.0 would fail, even if the
base box itself was made with modernized config.

This commit fixes this problem: is the box has a modern config, it's
going to be properly created and booted under LXC 3.0. It does so
without breaking the support for LXC < 2.1
2018-04-29 22:57:31 -04:00
Virgil Dupras
208edd49e5
Merge pull request #461 from nicolasleger/patch-1
[CI] Test against Ruby 2.5
2018-03-18 16:41:55 -04:00
Virgil Dupras
484b868100
Merge pull request #460 from lucaskanashiro/support_redir-3.x
Support the new redir 3.x command line interface
2018-03-18 16:41:18 -04:00
Nicolas Leger
b5f2a9006c
[CI] Test against Ruby 2.5 2018-03-15 14:52:34 +01:00
Lucas Kanashiro
2e20f96fec Support the new redir 3.x command line interface
Since redir 2.x upstream is not evolving it, Joachim Nilsson adopted it
and have started to work on it and publish a new command line interface
(check out https://github.com/troglobit/redir). The redir 3.1 is already
available in Debian and Ubuntu in their stable releases.
2018-03-12 13:09:06 -03:00
Virgil Dupras
d3409ace2a v1.4.0 2018-03-04 09:22:58 -05:00
Virgil Dupras
530a899467 Add support for unprivileged containers
fixes #312

I've also remove the "EXPERIMENTAL" flag to bridge support in the README.
It's been there long enough.
2018-02-17 21:53:16 -05:00
Virgil Dupras
9e215ae1a1 v1.3.1 2018-02-06 22:02:29 -05:00
Cam Cope
8fa42b1ab4
Merge pull request #456 from fgrehm/tmpfs-revival
Revert tmpfs mount removal
2018-02-04 00:04:39 -08:00
Virgil Dupras
2ae84fcc51 Revert tmpfs mount removal
To fix #406, I reverted the tmpfs mount we add at boot time. As we can
see in #455, it was a bad idea.

In addition to bringing back that mount, I've also added a
`tmpfs_mount_size` config that allows to change the size of the mount
from its default `2G`. It's also possible to disable the mount
altogether.

fixes #455
2018-02-02 16:02:17 -05:00
Virgil Dupras
582e3b368a halt: check that machine is running before attempting to clear tmpfiles
Otherwise, running `vagrant halt` on a stopped machine would make us
crash. Particularly annoying in multi-machines environments.

ref #406
2018-01-27 14:32:42 -05:00
Virgil Dupras
6738febaa2 v1.3.0 2018-01-20 13:29:46 -05:00
Virgil Dupras
49ebf3488e sudoers: fix typo
fixes #451
2018-01-15 21:17:36 -05:00
Virgil Dupras
bd42317ec2 Update README
Fixes #431
2018-01-15 08:25:27 -05:00
Virgil Dupras
1c27047f4b Remove tmpfs mount on /tmp and bring back /tmp cleanup on halt
fixes #406 because the `tmpfs` mount isn't needed anymore.

Careful considerations had to be taken because #68 mentions host-side
data loss when cleaning up `/tmp`. We mitigate this by ensuring that all
mounts under `/tmp` are unmounted before we proceed with our `rm -rf`
operation.

More context about this issue can be found in #360.
2018-01-13 23:00:46 -05:00
Virgil Dupras
fef11bf7ef Update README 2018-01-13 21:06:45 -05:00
Virgil Dupras
c74ddbf2fc create: with LXC 2.1+ run lxc-update-config on new boxes
When running with LXC 2.1+, ensure that our boxes have up-to-date config
keys by running the `lxc-update-config` utility that ships with LXC
2.1+.

When the command doesn't exist (LXC <2.1), we do nothing.

ref #445
2018-01-13 21:03:34 -05:00
Virgil Dupras
2b08ae199f driver: little cleanup after LXC 1.0+ requirement bump
The conditional `lxc-version` and `lxc-config` mechanisms aren't needed
anymore. They were for pre-1.0 LXC versions.
2018-01-13 20:34:41 -05:00
Virgil Dupras
aa777653f4 Use lxc-info instead of lxc-attach to retrieve container IP
`lxc-info -iH` to retrieve IP address was not available in early LXC
development but was there at LXC 1.0. Because we've bumped our minimum
LXC requirement to v1.0 recently, we can simplify the IP retrieval
process and also get rid of the `dnsmasq` fallback.
2018-01-13 15:53:28 -05:00
Virgil Dupras
7e1eb1d373 Change version to 1.3.0-dev 2018-01-13 15:30:39 -05:00
Virgil Dupras
4ff412e2d2 Fix travis for real this time
Sorry for the commit noise, I didn't think I'd need this much fiddling
and I don't have push-force privileges on the repo.
2018-01-13 09:06:45 -05:00
Virgil Dupras
bd4aa8167c Fix travis (again) 2018-01-13 08:56:17 -05:00
Virgil Dupras
2423464cdb Fix travis (again) 2018-01-13 08:54:06 -05:00
Virgil Dupras
0b5087f72e Fix travis builds 2018-01-13 08:43:00 -05:00
Virgil Dupras
c8801ba8b2
Merge pull request #447 from hsoft/unprivileged-template
lxc-template: make runnable by unprivileged users
2018-01-13 08:35:43 -05:00
Virgil Dupras
97b5882262 Refactoring: make SudoWrapper a bit more self-contained
By looking at the code, it seems that it was a goal to make the sudo
wrapper path configurable through the Vagrantfile, but it wasn't
effective and didn't make much sense (that kind of config is a per-host
config, not a per-guest one).

This caused the cause to be needlessly complex by giving the Provider
the responsibility of instanciating the wrapper. This commit gets rid of
that.

I didn't get rid of `sudo_wrapper` injection in `Driver` and
`Driver::CLI` constructors because they're needed for tests. I'm not
ready to tackle this yet.
2018-01-13 08:32:27 -05:00
Virgil Dupras
6eb7ec1a2e Bump Vagrant and LXC requirements 2018-01-13 08:32:27 -05:00
Virgil Dupras
fe7d638b35 Remove Gemfile.lock and properly lock stuff in Gemfile
No other vagrant plugin use `Gemfile.lock`. It doesn't feel right.

When removing it, however, we end up with many dependencies conflicts.
It then becomes necessary to freeze dependencies in `Gemfile`.
2018-01-13 08:32:27 -05:00
Virgil Dupras
f8a78e520b Adjust changelog for v1.2.4 2017-12-20 15:45:31 -05:00
Virgil Dupras
dbf2dfb8ff
Merge pull request #448 from hsoft/master
v1.2.4
2017-12-20 10:33:49 -05:00
Virgil Dupras
d3788f55f3
Merge pull request #449 from nicobrevin/nicobrevin-master
Fix for #336
2017-12-16 19:15:16 -05:00
Nick Griffiths
f224fc5ea5 Fix for #336:
Subprocessed being interrupted resulted in it looking
like those commands were executing successfully but with
zero output.  Interrupting the sudo prompt would result
in any command running in sudo returning nothing and looking
like it had succeeded.  There was some clean up code in
the lxc provider that nuked vagrant container state in
the .vagrant directory if it looked like the container no
longer existed based on the result of lxc-ls.  Interrupting
this check resulted in it looking like the container not
existing, resulting in the provider code nuking the lxc dir
in .vagrant.  Voila
2017-12-16 12:07:11 +13:00
Virgil Dupras
1c64ea1b2c v1.2.4 2017-12-12 11:02:57 -05:00
Fabio Rehm
b96ba86f72
Update CHANGELOG.md 2017-12-12 13:55:25 -02:00
Virgil Dupras
8b93206c18
Merge pull request #435 from brandon-rhodes/fix-umask
Avoid `Timed out` error when umask is 027 or 077
2017-12-11 19:35:22 -05:00
Virgil Dupras
e4c566ebc9
Merge pull request #421 from TobleMiner/lxc-template-option-fix
Fixes #420 (blaze it)
2017-12-11 17:21:00 -05:00
Virgil Dupras
d35ee4aed0
Merge pull request #410 from ChaosCloud/abk
vagrant-lxc-wrapper need to allow sudoer first-found binary path
2017-12-11 17:07:21 -05:00
Virgil Dupras
03c23d7df8 README: mention incompatibility with LXC v2.1
see #445
2017-12-11 14:51:09 -05:00
Virgil Dupras
10c53c54d7 Support alternative lxcpath in sudo wrapper
The previously hardcoded lxc path prevented the sudo wrapper from
working in environment with alternative `lxcpath`.

I had to move `sudo_wrapper` from `provider` to `LXC` because the
concept of "provider" is tied to a machine when a command sush as
`sudoers` is not.

Fixes #413 and #399
2017-12-11 11:48:19 -05:00
Virgil Dupras
2ce460bc30
Merge pull request #438 from fkleon/fix-sudoers-vagrant-1.9.x
Update pipework regexp for sudo wrapper
2017-12-11 10:20:36 -05:00
Virgil Dupras
553f1b5ed0 lxc-template: make runnable by unprivileged users
lxc-template needlessly require root privileges in two places:

1. lock file location for `flock`
2. failing on `tar` failure during rootfs extraction

For `flock`, it's not necessary that the lock file be in `/var/lock`, it
can be anywhere. Why not put it in `LXC_PATH`?

For the failing `tar` thing, that's because some device are created with
`mknod` which unprivileged users can't do. These device, however, are
not necessary for the container to run well. We can ignore `tar`'s error
exit code.

I replaced the exist code check by a check for the existence of
`/bin/true` in rootfs. I think that it's a good indication of whether
the rootfs was extracted.

Why am I making this change? Because I'd like to add support for
unprivileged containers in `vagrant-lxc` but it's kind of a big change
to make at once, so I thought I'd go incrementally.
2017-12-09 19:36:54 -05:00
Frederik Leonhardt
1f805f6deb Update pipework regexp for sudo wrapper
On Vagrant 1.9+ plugin gems are installed into a different folder, their path
containing the ruby version. This updates the regular expression whitelisting
the pipework script to reflect this change.
2017-02-09 15:55:32 +13:00
Brandon Rhodes
43aa9bfb3e Avoid Timed out error when umask is 027 or 077
If LXC commands are run with a restrictive umask like 027 or 077, then
the root directory of new containers will lack read `r` and access `x`
permission for non-root users.  The first failure to result from this
during `vagrant up` is that the SSH daemon cannot read the crucial file
`/home/vagrant/.ssh/authorized_keys` after it drops privileges to the
level of the `vagrant` user.  The result is the familiar:

```
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.
```

So we should make sure that we run all LXC commands with a umask that at
least does not prevent group and world `r` and `x` bits from being set
in newly created files and directories.
2017-01-29 13:53:09 -05:00
Cam Cope
851f58d42a v1.2.3 2016-12-20 20:20:38 -08:00
Cam Cope
fdb7222965 Fix bad version in Gemfile.lock 2016-12-20 20:20:07 -08:00
Cam Cope
4fd0635204 v.1.2.2 2016-12-20 20:08:47 -08:00
Cam Cope
ae18c05b2b Merge pull request #426 from fonsecas72/patch-1
Make fetch_ip_tries configurable
2016-11-11 12:33:18 -05:00
Hugo Fonseca
6d8580a294 default values goes to finalize 2016-11-11 08:34:42 +00:00
Hugo Fonseca
cac4910296 tries amount of fetching ip is now configurable 2016-11-09 14:38:05 +00:00
Hugo Fonseca
2d63603d85 Increase the re-tries amount 2016-11-07 15:34:48 +00:00
Cam Cope
a68a1de21f Merge pull request #423 from sergle/master
Load locale file only once
2016-10-21 00:54:57 -07:00
Sergey Leschenko
671bd55cea Make code similar to other providers 2016-10-20 13:39:33 +03:00
Sergey Leschenko
1c2208a30e Load locale file only once 2016-10-18 14:40:37 +03:00
Tobias Schramm
0cdd4d352c Fixes #420 (blaze it) 2016-08-22 22:27:00 +02:00
Cam Cope
62535b6465 Merge pull request #411 from ccope/preserve-xattrs
Preserve xattrs in container rootfs
2016-06-02 00:16:40 -07:00
Cam Cope
932a7808be Merge pull request #408 from swettk/master
Forward port latest pipework script
2016-05-30 16:35:59 -07:00
Cam Cope
9dd12bfcdf update dependencies in the README 2016-05-11 16:54:12 -07:00
Cam Cope
6dcf584b25 preserve xattrs 2016-05-11 16:54:12 -07:00
Robert Heinzmann
544c061e65 Fix handling of non-fatal lxc-stop return code
Fixes #405
2016-05-11 16:50:29 -07:00
AbhishekKr
848383e081 vagrant-lxc-wrapper need to allow sudoer first-found binary path
sudoer PATH may have different order than current user
2016-05-11 23:51:29 +05:30
Keith Swett
d4e5122c6c Forward port latest pipework script 2016-04-26 19:52:57 +00:00
Robin Gloster
aa5fb7a932 1.2.1 2015-09-24 14:14:26 +00:00
Franz Pletz
81d70d26d3 Merge pull request #393 from mayflower/fix-sudo-wrapper
fix sudo wrapper
2015-09-24 15:27:40 +02:00
Robin Gloster
4c969a6ae7 fix sudo wrapper 2015-09-23 18:15:28 +00:00
Franz Pletz
1fb64dbbdf Merge pull request #392 from danielhodder/improve-lxc-missing-message
Added lxc-create to the error message
2015-09-21 01:16:21 +02:00
danielh
d11b6f2dc7 Added lxc-create to the error message
Added the command that vagrant-lxc is actually trying to run when it can't find the lxc-create command
2015-09-20 15:30:09 +12:00
Fabio Rehm
ad39aa9645 Update README.md 2015-09-17 12:43:57 -03:00
Fabio Rehm
050c160de2 v1.2.0 2015-09-15 09:57:48 -03:00
Robin Gloster
3d924985dd Prepare 1.2.0 2015-09-14 09:33:25 +00:00
Robin Gloster
95bfdfd54d explicitly add overlayfs as backingstore to readme
fixes #351
2015-09-08 21:00:26 +00:00
Robin Gloster
25d10cd3bc fix shebang in pipework 2015-09-08 20:54:29 +00:00
Franz Pletz
86381bfeee Merge branch 'stucki-create-bridge-if-missing' (PR #380) 2015-08-28 15:01:30 +02:00
Michael Stucki
7c778dfb4d Fix warning message 2015-08-28 15:00:37 +02:00
Michael Stucki
9e5637a9fe Do not remove system bridge virbr0 2015-08-28 15:00:37 +02:00
Michael Stucki
3257bd25bb Fix variable name 2015-08-28 15:00:37 +02:00
Andriy
06bbc7a5ef Update gc_private_network_bridges.rb 2015-08-28 15:00:37 +02:00
Andriy
6136ebb966 Update driver.rb
Fixing https://github.com/fgrehm/vagrant-lxc/issues/353 issue
2015-08-28 15:00:37 +02:00
Cam Cope
9b70f3daab make /tmp a tmpfs 2015-08-28 14:58:16 +02:00
Cam Cope
2accd886fa remove /tmp cleanup, fixes lvm rootfs 2015-08-28 14:58:16 +02:00
Robin Gloster
993e430ccc Use /usr/bin/env CMD instead of hardcoded paths
This fixes commands that currently rely on hardcoded paths and break
on systems like NixOS that don't have all binaries in /usr/bin etc.
2015-08-28 14:58:16 +02:00
Robin Gloster
ea99d13f76 Fix test on NixOS
Tempfile can be created in /run, too.
2015-08-28 14:58:16 +02:00
Robin Gloster
fddd8cc257 Update gems to resolve dependencies on NixOS 2015-08-28 14:58:16 +02:00
Robin Gloster
611a86ce84 do not copy the lxc template instead use the full path 2015-08-28 14:58:16 +02:00
Robin Gloster
e5a55d1020 fix shebang in template 2015-08-28 14:58:16 +02:00
Antonio Terceiro
64f561073c forward_ports: bind to localhost only by default
This has been raised as security concern on vagrant itself, and fixed
there some time ago.
2015-08-28 14:58:16 +02:00
Franz Pletz
0c353598f8 Merge pull request #362 from ccope/halt-lvm-fix
remove /tmp cleanup command, fixes lvm rootfs
2015-08-28 14:50:51 +02:00
Franz Pletz
78ef85aa97 Merge pull request #383 from stucki/use-system-bridge
Use system bridge
2015-08-25 15:20:11 +02:00
Michael Stucki
366a98a052 Fix warning message 2015-08-25 15:13:03 +02:00
Michael Stucki
40ced9d3d1 Do not remove system bridge virbr0 2015-08-25 15:12:32 +02:00
Franz Pletz
bbff802b5d Merge pull request #376 from globin/nixos-current
NixOS compatibility
2015-08-25 14:53:03 +02:00
Michael Stucki
eb503e42fd Fix variable name 2015-08-25 14:38:44 +02:00
Andriy
5329e8837e Update gc_private_network_bridges.rb 2015-08-25 14:38:31 +02:00
Andriy
d2c032a073 Update driver.rb
Fixing https://github.com/fgrehm/vagrant-lxc/issues/353 issue
2015-08-25 14:38:28 +02:00
Michael Stucki
7eb3be37de driver.rb: Check for correct bridge device name 2015-08-25 10:20:21 +02:00
Michael Stucki
31bb4eadf9 Move away from using ifconfig to ip link for enabling / disabling bridge devices 2015-08-25 10:18:14 +02:00
Cam Cope
5fb0bcbcbc make /tmp a tmpfs 2015-08-17 17:43:45 -07:00
Cam Cope
eba671c54d remove /tmp cleanup, fixes lvm rootfs 2015-08-17 17:43:24 -07:00
Robin Gloster
4b78c04a47 Use /usr/bin/env CMD instead of hardcoded paths
This fixes commands that currently rely on hardcoded paths and break
on systems like NixOS that don't have all binaries in /usr/bin etc.
2015-08-02 10:15:55 +00:00
Robin Gloster
9c67e13fb8 Fix test on NixOS
Tempfile can be created in /run, too.
2015-08-02 10:15:55 +00:00
Robin Gloster
5cd32c76df Update gems to resolve dependencies on NixOS 2015-08-02 10:15:55 +00:00
Robin Gloster
2b91983cae do not copy the lxc template instead use the full path 2015-08-02 10:15:55 +00:00
Robin Gloster
64240323f0 fix shebang in template 2015-08-02 09:58:36 +00:00
Franz Pletz
6718fed241 Merge pull request #381 from terceiro/bind-localhost
forward_ports: bind to localhost only by default
2015-07-31 19:04:12 +02:00
Antonio Terceiro
81f2c13541 forward_ports: bind to localhost only by default
This has been raised as security concern on vagrant itself, and fixed
there some time ago.
2015-07-19 12:29:27 -03:00
Michael Stucki
c3508870fd Private networking: Create bridge if it is missing 2015-07-06 18:01:18 +02:00
Michael Stucki
fb661300e7 Move bridge_exists check into a function 2015-07-06 18:01:15 +02:00
Fabio Rehm
bb21906ec4 Update README.md 2015-05-08 19:49:30 -03:00
Fabio Rehm
0365ad4a17 Update CHANGELOG.md 2015-04-06 11:02:18 -03:00
Fabio Rehm
fd22ccc073 Update CHANGELOG.md 2015-04-06 10:59:57 -03:00
Fabio Rehm
52cca8e7f6 Merge pull request #355 from lfaraone/use-current-ruby
vagrant-lxc-wrapper: Use correct ruby interpreter
2015-04-06 10:58:53 -03:00
Fabio Rehm
55bbadef6f Merge pull request #352 from ccope/private_dhcp
Support private networking using DHCP
2015-04-06 10:56:38 -03:00
Fabio Rehm
f52df5df14 Update CHANGELOG.md 2015-04-06 10:54:36 -03:00
Fabio Rehm
8cb0afeb39 Merge pull request #357 from agriffis/fedora-host-selinux-ro
Mount the selinux sys dir read-only [GH-301]
2015-04-06 10:51:30 -03:00
Fabio Rehm
8ccafecd9e Update CHANGELOG.md 2015-04-06 10:30:27 -03:00
Fabio Rehm
497f750248 Merge pull request #361 from ccope/autocreate-mountpoint
move mountpoint creation to lxc template for lvm rootfs support
2015-04-06 10:27:18 -03:00
Cam Cope
caa3c53a8f move mountpoint creation to lxc template for lvm rootfs support 2015-04-05 17:46:22 -07:00
Aron Griffis
7d017ada1e Mount the selinux sys dir read-only [GH-301] 2015-03-24 17:42:11 -04:00
Luke Faraone
05fdb3e000 vagrant-lxc-wrapper: Use correct ruby interpreter
Previously, we hardcoded to using the ruby binary in /opt/vagrant[..].
On some systems, this path is incorrect, so instead we use the
path of the interpreter that is executing the `vagrant lxc sudoers`
command.
2015-03-19 16:22:00 -07:00
Cam Cope
5da3fc8be5 support containers with dhcp private networking 2015-03-08 19:58:29 -07:00
Fabio Rehm
c9cd671a32 Update README.md 2015-01-14 21:46:18 -02:00
Fabio Rehm
3b45b92d1a v1.1.0 2015-01-14 21:44:28 -02:00
Fabio Rehm
156bc015c8 Allow backingstore options to be used along with the sudo wrapper script [GH-310] 2015-01-14 21:07:35 -02:00
Fabio Rehm
fb23e606cc action/create: Trim automatically generated container names to 64 chars
Fixes GH-337
2015-01-11 21:30:11 -02:00
Fabio Rehm
ef06ea622e Remove blank file 2015-01-11 21:18:56 -02:00
Fabio Rehm
7a09375ae7 Update CHANGELOG 2015-01-11 21:18:03 -02:00
Fabio Rehm
f4b738ebd9 Minor tweaks to specs introduced by GH-329 2015-01-11 21:16:30 -02:00
Fabio Rehm
555499d04a Merge branch 'master' of https://github.com/pruby/vagrant-lxc into next
Closes GH-329
2015-01-11 21:06:46 -02:00
Fabio Rehm
447d0dfc42 Experimental support for private networking [GH-298] 2015-01-11 20:59:38 -02:00
Fabio Rehm
bf3a9a5039 action: Some more tweaks around private networking + new pipework code [GH-298] 2015-01-08 03:57:49 -02:00
Fabio Rehm
28bdbe371d Merge remote-tracking branch 'origin/private-networks' into next 2015-01-08 02:28:45 -02:00
Fabio Rehm
758703ea6b provider: Use full which path when checking whether the lxc-create command is available
Fixes GH-322
2015-01-08 02:26:25 -02:00
Fabio Rehm
01d53a783c sudoers: Treat 256 exit codes as errors
I ran into an issue locally where I didnt have lxc installed and some
commands were giving me back some false positives. Weird but this fixes
the problem I was facing.
2015-01-08 02:18:38 -02:00
Fabio Rehm
8b37056294 provider: Show an user friendly message when trying to use the plugin on non-Linux environments 2015-01-08 02:17:32 -02:00
Fabio Rehm
2a667b88b6 plugin: Give the provider a higher priority over Vagrant's builtin VBox provider 2015-01-08 00:55:19 -02:00
Fabio Rehm
2a48f366d4 Merge branch 'tempfile_problem' of https://github.com/stefan-langenmaier/vagrant-lxc into next 2015-01-08 02:07:02 +00:00
Fabio Rehm
92685472ec Update bundle 2015-01-08 01:48:34 +00:00
Fabio Rehm
67523019aa 👋 to support for Vagrant < 1.5 2015-01-07 23:48:10 -02:00
Tim Goddard
fe532525c8 Support for formatted overlayfs path spec when finding the root FS path
We're using snapshots in a CI set-up so that a Vagrant cluster can be built
once, then each push to the repository only checked as an incremental
update to the cluster. We copy each LXC VM to a master image, then re-create
the original names as snapshots.

This change corrects a method which assumes the LXC root path in the config
file is a simple directory name, which is only true for directory-backed
instances.

Conflicts:
	spec/unit/driver_spec.rb
2014-11-12 15:21:28 +13:00
Stefan Langenmaier
188a1eb089 uninitialized constant Tempfile 2014-11-05 08:50:46 -05:00
Fabio Rehm
622366bd64 Update README.md 2014-10-15 01:18:16 -03:00
Fabio Rehm
2f0eccb236 🔨 Fix the build 🔨 2014-10-15 01:14:52 -03:00
Fabio Rehm
71e210f683 v1.0.1 2014-10-15 01:04:37 -03:00
Fabio Rehm
186d453621 Prefix action to fetch containers IP with ssh so that vagrant does not lock around its execution
Closes GH-321
2014-10-15 01:02:52 -03:00
Fabio Rehm
80ca559258 Tweaks to get the changes introduced on GH-317 to work with the sudo wrapper 2014-10-15 01:01:43 -03:00
Fabio Rehm
b4a642bc8a Merge pull request #318 from rtkrruvinskiy/lock_race
Work around WaitForCommunicator lock race condition
2014-10-15 00:31:10 -03:00
Fabio Rehm
8421291c52 Merge pull request #317 from azomazo/detect_container_path_by_lxc_config
The path of storage containers taken from lxc-config, instead of using a constant
2014-10-15 00:30:53 -03:00
Ray Ruvinskiy
dc55c914e4 Work around WaitForCommunicator lock race condition
The LXC provider issues the "fetch_ip" action to look up the IP address
of the container as part of its "ssh_info" action.
Vagrant::LXC::Action.action_fetch_ip checks the machine state using
Builtin::IsState, which calls Vagrant::Machine.state, which also updates
the state in the machine index and acquires a machine index entry lock to do that.
A race condition ensues in WaitForCommunicator.call, where ready_thr tries
to acquire the machine index lock while running ssh_info, and states_thr tries
to acquire the same lock doing its own state look up (env[:machine].state.id).
If they both try to acquire the lock at the same time, one will fail, and
an exception will be raised.

Work around this issue by checking for the desired machine state (:running) in
Vagrant::LXC::Provider.ssh_info, which can get the state from
Vagrant::LXC::Provider.state, which in turn does not write out the state into
the index file and does not acquire the index entry lock.
2014-09-29 16:47:29 -04:00
Azamat Khudaygulov
f454924a59 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)
2014-09-23 16:07:03 +04:00
Fabio Rehm
e76a18185c 🎆 v1.0.0 🎆 2014-09-23 01:03:48 -03:00
Fabio Rehm
5fa6f0dd09 synced_folder: Emit vagrant-mounted upstart event when starting containers
Closes GH-302
2014-09-22 23:44:01 -03:00
Fabio Rehm
5e155ec02e 💣 post install message 2014-09-22 23:07:56 -03:00
Fabio Rehm
dd5a8d16d0 Update README 2014-09-22 23:07:39 -03:00
Fabio Rehm
8ffc9ef92a Remove version suffix from generated sudoers commands 2014-09-22 23:07:12 -03:00
Fabio Rehm
86b169d358 Update changelog 2014-09-22 22:52:33 -03:00
Fabio Rehm
46640fbd3d Merge pull request #311 from postster/postster/tarball-strip-components-option
lxc-template: add parameter strip-components
2014-09-22 22:44:29 -03:00
Fabio Rehm
e297ea52b2 Merge pull request #314 from fpletz/fix/box-update-check
Add check for box updates to start action
2014-09-22 22:43:57 -03:00
Franz Pletz
ec4a52559a Add check for box updates to start action
This action apparently needs to be added to every provider. See
lib/vagrant/plugins/providers/virtualbox/action.rb from the Vagrant
source for reference how the virtualbox provider is doing it.
2014-09-05 20:52:03 +02:00
Dan Post
96b2c7175a lxc-template: add parameter strip-components, as not all tarballs are created like ./rootfs/... 2014-08-25 11:57:54 -07:00
Fabio Rehm
3f7c7ecabf v1.0.0.alpha.3 2014-08-09 16:37:40 -03:00
Fabio Rehm
0a017e476d Add link to gitter chat 2014-08-09 16:20:08 -03:00
Fabio Rehm
80d54bb261 Fix the build 2014-07-24 21:58:04 -03:00
Fabio Rehm
aac8c31410 driver: Remove calls to in favor of Vagrant's built in graceful halt 2014-07-24 21:58:04 -03:00
Fabio Rehm
d0642c95fd command/sudoers: Move wrapper string out to a template and use the full path to the scripts in order to make things work properly across different distros
Closes GH-304
Closes GH-305
2014-07-24 21:58:04 -03:00
Fabio Rehm
d3b9d53097 driver/cli: Deal with namespaces args for lxc-attach when the sudo wrapper script is in place [GH-300] 2014-07-24 21:58:04 -03:00
Fabio Rehm
752fa9b4e5 action/fetch_ip_with_lxc_attach: Attach to the MOUNT namespace in order to fix GH-300 2014-07-24 21:58:04 -03:00
Fabio Rehm
95b18a5d5c Fix link to sudoers command
Closes GH-303
2014-07-04 10:42:06 -03:00
Fabio Rehm
89f3e98679 Document brctl dependency for private networks 2014-06-09 00:56:37 -03:00
Fabio Rehm
a3252c3593 Update warning about networks 2014-06-09 00:56:27 -03:00
Fabio Rehm
5232f2c7b1 Begin work on supporting private networks 2014-06-09 00:48:52 -03:00
Fabio Rehm
d22d6588f8 scripts/private-network: Indent code 2014-06-09 00:25:41 -03:00
Fabio Rehm
0bd071f95d scripts/private-network: Remove Docker specifics 2014-06-09 00:21:01 -03:00
Fabio Rehm
044322d70f Vendor pipework as scripts/private-network 2014-06-09 00:20:10 -03:00
Fabio Rehm
09f855dc76 command/sudoers: Remove Cmnd_Alias from sudoers file
Since the wrapper is versioned, we would end up having multiple `LXC`
command aliases, making `sudo` unusable:

```
>>> /etc/sudoers.d/vagrant-lxc-1-0-0-alpha-3-dev: Alias `LXC' already
>>> defined near line 2 <<<
sudo: parse error in /etc/sudoers.d/vagrant-lxc-1-0-0-alpha-3-dev near
line 2
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
```
2014-06-08 23:44:02 -03:00
Fabio Rehm
b4376ef995 command/sudoers: Use Vagrant's ruby for the sudoers file
This makes things work on systems that don't have a global ruby
installation in place and fix GH-289
2014-06-08 23:36:29 -03:00
Fabio Rehm
3e22f424e6 driver: Escape synced folders with spaces
Fix GH-291
2014-06-08 23:27:27 -03:00
Fabio Rehm
212d31543e Update bundle 2014-06-08 22:52:33 -03:00
Fabio Rehm
a284d66f9e Lets release another alpha before going to beta 2014-06-08 22:52:33 -03:00
Fabio Rehm
e52ba97b13 Update rspec 2014-06-08 22:52:33 -03:00
Fabio Rehm
235f268942 Backport some specs 2014-06-08 22:52:33 -03:00
Fabio Rehm
4cb28b88c6 Update CHANGELOG 2014-06-08 22:52:33 -03:00
Fabio Rehm
f49585db51 driver/cli: Improved lxc-attach check [GH-294] 2014-06-08 22:52:33 -03:00
Fabio Rehm
3fe6cc094e Merge pull request #294 from bkkrw/lxc-attach_support
Add fallback mechanism for platforms without attach support
2014-06-08 22:50:53 -03:00
Kristof Willaert
a4768c26ca 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.
2014-06-03 17:53:26 +02:00
Fabio Rehm
3a4c0ca79d Up dev version 2014-05-13 00:29:42 -03:00
Fabio Rehm
8eabac91d6 Move base boxes section up on README 2014-05-13 00:27:49 -03:00
Fabio Rehm
7bccdd2f71 v1.0.0.alpha.2 2014-05-13 00:25:53 -03:00
Fabio Rehm
be0b1a2abc Document backingstore option and highlight that it has to be set to "none" for old lxc versions [GH-277] 2014-05-13 00:16:30 -03:00
Fabio Rehm
2db9aa89a1 action/ip_from_dnsmasq: Handle nil container hwaddr value 2014-05-12 23:56:39 -03:00
Fabio Rehm
4d45a4082b lxc-template: Write rootfs config to container config file when the fallback kicks in
Fix GH-282
2014-05-12 23:54:51 -03:00
Fabio Rehm
d7935e55f3 action/boot: Bind mount /sys/fs/pstore to same path on containers to fix some apparmor issues when starting Ubuntu 14.04 containers
Fix GH-278
2014-05-12 23:27:14 -03:00
Fabio Rehm
9111261f79 driver: Do not show a stacktrace to the user if no network.hwaddr is present on container configs
This is enough to close GH-266 since Vagrant will take care of showing
an error informing the user that it was unable to connect to the
machine.
2014-05-12 23:21:41 -03:00
Fabio Rehm
c94e765391 Fix the build 2014-05-12 23:17:04 -03:00
Fabio Rehm
c580865ab2 driver: Fix lxc config customizations prunning [GH-279] 2014-05-12 23:06:45 -03:00
Fabio Rehm
1cf8ce50e4 command/sudoers: Fix whitelisting to take GH-277 into account 2014-05-12 23:05:42 -03:00
Fabio Rehm
638e134265 Update CHANGELOG 2014-05-12 22:48:49 -03:00
Fabio Rehm
8e9abe9129 Update bundle 2014-05-12 22:46:14 -03:00
Fabio Rehm
e1a29898a4 Merge pull request #283 from bkkrw/master
Make MAC address regex check case insensitive
2014-05-12 22:45:57 -03:00
Kristof Willaert
6b5c00089d Make MAC address regex check case insensitive
The regex check for the container MAC address presence in the
dnsmasq leases file is case sensitive. Dnsmasq outputs uppercase
addresses in the leases file.

As MAC addresses are generally considered case insensitive, it
makes sense to relax the regular expression check to allow for this.
2014-05-08 14:30:14 +02:00
Fabio Rehm
b210b260b1 lxc-template: Backport --rootfs fallback from old template [GH-282] 2014-05-07 17:34:00 -03:00
Fabio Rehm
3bd22955dd Update CHANGELOG 2014-05-04 20:56:01 -03:00
Fabio Rehm
5eef1524d7 driver: Use relative guest paths for synced folders
Closes GH-258
2014-05-04 20:52:00 -03:00
Fabio Rehm
b17fb7baa8 Fix broken specs 2014-05-04 20:50:04 -03:00
Fabio Rehm
856a847bc8 config: Switch default backingstore to "best" [GH-277] 2014-05-04 20:37:09 -03:00
Fabio Rehm
4c3143aa34 Merge branch 'backingstore_options' of https://github.com/tailhook/vagrant-lxc
Conflicts:
	lib/vagrant-lxc/config.rb
2014-05-03 23:42:39 -03:00
Fabio Rehm
529558e8b0 Update CHANGELOG 2014-05-03 23:38:21 -03:00
Fabio Rehm
7870d59184 Merge branch 'fix_mounts' of https://github.com/tailhook/vagrant-lxc 2014-05-03 23:36:23 -03:00
Fabio Rehm
9838d32c2d action/forward_ports: Merge port forwarding with sudo specs into a single file [GH-259] 2014-05-03 23:31:43 -03:00
Fabio Rehm
a0fe2f9cf0 action/clear_forwarded_ports: Fix privileged port detection and simplify code [GH-259] 2014-05-03 23:28:59 -03:00
Fabio Rehm
84bdb5cb22 Fix code indentation 2014-05-03 23:28:04 -03:00
Fabio Rehm
ee63d2b2ae Merge branch 'sudo-for-redir' of https://github.com/guerremdq/vagrant-lxc 2014-05-03 23:14:29 -03:00
Fabio Rehm
127b23c66c Update README 2014-05-03 23:11:37 -03:00
Fabio Rehm
1688a79efc Update CHANGELOG 2014-05-03 22:22:17 -03:00
Fabio Rehm
251dec55fe Merge branch 'master' of https://github.com/servebox/vagrant-lxc 2014-05-03 22:17:22 -03:00
Fabio Rehm
80171fcf90 Remove development environment as I havent used it neither updated on a long time 2014-05-03 21:09:50 -03:00
Fabio Rehm
9dbd5e409f Update bundle 2014-05-03 21:09:04 -03:00
guerremdq
b288c05921 Merge branch 'sudo-for-redir' of github.com:guerremdq/vagrant-lxc into sudo-for-redir 2014-04-29 00:02:55 -03:00
guerremdq
0b1fffc6e3 clean redir pid with sudo only if port is < than 1024 2014-04-29 00:02:16 -03:00
Cam Cope
a9248cb697 add backingstore parameters 2014-04-28 17:17:59 +03:00
Eric Hartmann
3b311ad840 Fix sudoers for multiple users 2014-04-23 17:49:04 +02:00
Eric Hartmann
2666f9e38d Fix argument parsing 2014-04-23 16:27:33 +02:00
Jef Mathiot
0eae5c0926 Removed unsecure calls to SudoWrapper#su_c. 2014-04-17 12:56:56 +02:00
Jef Mathiot
94e175dc07 sudoers command now creates a safe wrapper script.
Sudoers now creates a safe wrapper script that performs sanity checks on sudo :
* wrapper generated in /usr/local/bin (name includes version to allow multiple wrappers on the same system)
* sudoers command now generates a one-line file in /etc/sudoers.d
* SudoWrapper use the new wrapper
* Removed unused Config#validate method
2014-04-09 15:53:20 +02:00
Paul Colomiets
9f9cb1c791 Implement sorting of synced_folders
It's useful if you want to mount something inside /vagrant or if you
have some another mount in some synced folder.

This piece of code is extracted from virtualbox driver.
2014-04-09 16:16:56 +03:00
Fabio Rehm
47cf361b98 Up dev version 2014-04-06 18:52:19 -03:00
Fabio Rehm
8c6e9724bd Update release date on changelog and add instructions for installing the alpha version of the plugin 2014-04-06 18:45:49 -03:00
Fabio Rehm
bc6e2e9d7c v1.0.0.alpha.1 2014-04-04 16:28:57 -03:00
Fabio Rehm
b35e5dbb55 Update gemfile 2014-04-04 16:27:00 -03:00
Fabio Rehm
69ba4d8f70 Merge pull request #263 from Sicness/fix-readme
Fix the command vagrant box add in README.md
2014-04-01 15:44:07 -03:00
Anton Balashov
2260282a7c Fix the command vagrant box add in README.md
sicness@abalashov-nt /tmp $ vagrant box init precise64 http://bit.ly/vagrant-lxc-precise64-2013-10-23
Usage: vagrant box <command> [<args>]

Available subcommands:
     add
     list
     remove
     repackage

For help on any individual command run `vagrant box COMMAND -h`
sicness@abalashov-nt /tmp $ vagrant init precise64 http://bit.ly/vagrant-lxc-precise64-2013-10-23
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
2014-03-30 15:16:50 +04:00
idontdomath
d8d371984b enabled warning on the used environment for forward ports spec.
removed warn checks on test were the condition didn't apply.
2014-03-29 20:21:14 -03:00
Fabio Rehm
7e9d790f6a command/sudoers: Minor tweaks to make the generated file work with latest changes 2014-03-27 20:04:38 -03:00
Fabio Rehm
9b6d1bb117 Merge pull request #261 from fgrehm/extract-base-boxes-to-separate-repo
Extract base boxes to separate repo
2014-03-27 19:47:01 -03:00
Fabio Rehm
6508324d6d Update README 2014-03-27 19:44:33 -03:00
Facundo Guerrero
36b38b7664 add expect for warn message 2014-03-27 15:25:12 -03:00
Fabio Rehm
962d87b72e boxes: Move code out to https://github.com/fgrehm/vagrant-lxc-base-boxes 2014-03-25 00:26:42 -03:00
Fabio Rehm
457e75ca96 boxes: Almost done with extraction 2014-03-25 00:19:04 -03:00
Fabio Rehm
12df76752d Update contribution guidelines 2014-03-25 00:03:26 -03:00
Fabio Rehm
5d255dec30 boxes: Add license 2014-03-24 23:50:55 -03:00
Fabio Rehm
c13f4591b1 boxes: Preparation to extract to a separate repository 2014-03-24 23:50:55 -03:00
Fabio Rehm
328477172e command/sudoers: Add missing -p to mkdir command 2014-03-24 23:50:38 -03:00
guerremdq
697d8bde08 only use sudo with redir when port number is lower than 1024 2014-03-23 13:39:42 -03:00
Fabio Rehm
28bd6c87ef Merge pull request #260 from jefmathiot/master
Moved to Ruby >=1.9 hash syntax to improve readability
2014-03-21 21:29:53 -03:00
Jef Mathiot
5a56b72360 * Ruby >1.9 hash syntax
* Improved comment on Vagrant::Registry.keys
2014-03-22 00:58:36 +01:00
Fabio Rehm
77beb13906 Lets be nice with < 1.0.0 users 2014-03-21 20:17:52 -03:00
Fabio Rehm
c7c1d8a1c6 Update changelog 2014-03-21 20:13:43 -03:00
Fabio Rehm
8b1573c536 doc: Let everyone know about the new vagrant lxc sudoers command 2014-03-21 20:04:35 -03:00
Fabio Rehm
17a6a35c92 Remove Vagrantfile from project root
We already have one for development purposes on /development and
`Vagrant.require_plugin` has been deprecated on Vagrant 1.5+
2014-03-21 19:59:50 -03:00
Fabio Rehm
64de0fca3c command/sudoers: Mention what is the default value for the user and add a REFACTOR note 2014-03-21 19:53:49 -03:00
Fabio Rehm
02fefd10c0 command/sudoers: Nitpick
* Use Ruby 1.9+ hash syntax
* Use % as the BOXES placeholder as it is the same symbol used for I18n placeholders as well
2014-03-21 19:48:36 -03:00
Fabio Rehm
19bccc9ca5 ✂️ whitespace 2014-03-21 19:38:56 -03:00
Fabio Rehm
b7dbfc84af Merge branch 'master' of github.com:jefmathiot/vagrant-lxc
Conflicts:
	lib/vagrant-lxc/plugin.rb
2014-03-21 19:38:35 -03:00
Fabio Rehm
674e0cef4e I think it is safe to get rid of this by now 2014-03-21 19:32:16 -03:00
Fabio Rehm
c2d0e0a02c spec: Embrace rspec3 2014-03-21 19:31:34 -03:00
Fabio Rehm
41716e9100 synced_folder: Fix UI warn when group / owner are specified on Vagrantfile 2014-03-21 19:31:14 -03:00
Fabio Rehm
164afc7839 package: Nicely handle optional lxc-template on base boxes when packaging 2014-03-21 19:30:28 -03:00
Fabio Rehm
44ad630db7 boxes: Remove redundant lxc from intermediate container names 2014-03-21 19:27:13 -03:00
Fabio Rehm
dd31e1f74a boxes: Disable NFS client installation on Ubuntu 13.04 / 13.10 / 14.04
References GH-218
2014-03-21 17:51:02 -03:00
Fabio Rehm
a8a2f55f21 core: Update vagrant-spec.config 2014-03-21 17:47:49 -03:00
Fabio Rehm
9849426078 boxes: Add task for building a box for usage with acceptance specs 2014-03-21 17:47:32 -03:00
guerremdq
fd948f8552 Add sudo for redir 2014-03-20 17:01:45 -03:00
Jef Mathiot
8590c87132 Created an "lxc sudoers" command to create sudoers file for a given user (defaults to current one). 2014-03-16 18:59:18 +01:00
Fabio Rehm
2e2c2fad56 Convert specs to RSpec 2.99.0.beta2 syntax with Transpec
This conversion is done by Transpec 1.10.2 with the following command:
    transpec

* 46 conversions
    from: obj.should
      to: expect(obj).to

* 20 conversions
    from: obj.stub(:message)
      to: allow(obj).to receive(:message)

* 10 conversions
    from: == expected
      to: eq(expected)

* 6 conversions
    from: obj.should_receive(:message)
      to: expect(obj).to receive(:message)

* 5 conversions
    from: obj.should_not
      to: expect(obj).not_to

* 5 conversions
    from: Klass.any_instance.stub(:message) { |arg| }
      to: Klass.any_instance.stub(:message) { |instance, arg| }

* 5 conversions
    from: Klass.any_instance.stub(:message)
      to: allow_any_instance_of(Klass).to receive(:message)

* 1 conversion
    from: lambda { }.should
      to: expect { }.to
2014-03-14 11:38:54 -03:00
Fabio Rehm
60f3a67bb0 Make sure Vagrant::LXC.source_root is available to all specs 2014-03-14 11:34:46 -03:00
Fabio Rehm
2cdbf84848 I've tested this by hand and it will take us some effort to get rid of the excessive mocking I wrote 2014-03-14 11:21:45 -03:00
Fabio Rehm
eb274e879c Fix spec 2014-03-14 11:21:45 -03:00
Fabio Rehm
64fbe180f1 Update CHANGELOG.md 2014-03-14 10:58:05 -03:00
Fabio Rehm
ebdf50297f lxc-template: ensure /var/lock/subsys exists before creating lock 2014-03-14 00:32:47 -03:00
Fabio Rehm
4f49be03ad core: Make lxc-template optional [GH-254] 2014-03-14 00:32:03 -03:00
Fabio Rehm
da96e8c1a4 synced_folder: Fix mount_options on Vagrant 1.4+ 2014-03-14 00:21:21 -03:00
Fabio Rehm
d6a22c9f88 synced_folder: Warn in case :group or :owner are specified [GH-196] 2014-03-13 23:48:46 -03:00
Fabio Rehm
d0be2f3dbe Update CHANGELOG 2014-03-13 23:39:48 -03:00
Fabio Rehm
20d4547044 synced_folder: Support for mount_options 2014-03-13 23:36:15 -03:00
Fabio Rehm
623eb1570a This is no longer needed 2014-03-13 23:11:33 -03:00
Fabio Rehm
03907eeb62 Note GH-251 and GH-253 on CHANGELOG 2014-03-13 23:10:41 -03:00
Fabio Rehm
c9fe9e552e Merge branch 'master' of github.com:vorlock/vagrant-lxc 2014-03-13 23:07:55 -03:00
Fabio Rehm
ad63452651 Nitpick 2014-03-13 23:07:05 -03:00
Fabio Rehm
5df28390e2 Merge branch 'utsname-hostname' of github.com:fpletz/vagrant-lxc 2014-03-13 23:05:47 -03:00
Fabio Rehm
dfd93d087c action: Keep old behavior of erroring on vagrant ssh -c instead of just showing a message 2014-03-13 23:02:18 -03:00
Fabio Rehm
bfb9b6be73 Note GH-151 on CHANGELOG 2014-03-13 23:01:00 -03:00
Fabio Rehm
c69b1bd014 gemspec: Add post install message 2014-03-13 22:57:37 -03:00
Fabio Rehm
e3f0e6df32 Lock vagrant to 1.5.1 2014-03-13 22:51:28 -03:00
Franz Pletz
be12f11ced Set container utsname to configured hostname per default
Previously, the utsname of a machine was set to the vagrant machine ID.
As the utsname represents the hostname of the machine and is independent
from the name of the actual LXC container, the hostname that was
specified in the Vagrantfile should be used instead. If no hostname is
provided, the machine ID will be used like before.

Additionally, this will trigger the DHCP client in the container to send
the correct hostname to the DHCP server on the first request at boot.
Vagrant sets the configured hostname only after the network is up. If
for example automatic DNS updates are configured, the right DNS record
will be created every time.
2014-03-13 19:06:05 +01:00
Fabio Rehm
5b24cf6136 Add section about Vagrant 1.5 compatibility 2014-03-13 10:33:37 -03:00
Fabio Rehm
7e79d59365 core: Fix vagrant ssh [GH-252] 2014-03-13 09:42:39 -03:00
Marcin Kulisz
e84f9e2b4a Added dnsmasq leases file location for libvirt 2014-03-13 09:49:24 +00:00
Fabio Rehm
2f401b5b6c Update CHANGELOG 2014-03-13 01:12:54 -03:00
Fabio Rehm
f20f6aaa40 Merge pull request #249 from fgrehm/vagrant-1.5
Support for Vagrant 1.5
2014-03-13 01:03:06 -03:00
Fabio Rehm
14430908f8 🤘 Yeah baby, we are getting to 1.0 🤘 2014-03-13 00:57:37 -03:00
Fabio Rehm
c48261a5e5 Update bundle 2014-03-13 00:57:37 -03:00
Fabio Rehm
0aac50fa76 package: Add spec to check that the plugin does not blow up in case the new lxc-config file is not present 2014-03-13 00:57:37 -03:00
Fabio Rehm
165f647c2d This will be taken care later on 2014-03-13 00:57:37 -03:00
Fabio Rehm
38ae9441fc package: lxc-config should be included when repackaging boxes 2014-03-13 00:57:37 -03:00
Fabio Rehm
100d5223ce Disable Ruby 1.9.3 on travis and begin testing on 2.1.1 2014-03-13 00:57:37 -03:00
Fabio Rehm
61002b9bb8 core: Remove actions that check for containers statuses 2014-03-13 00:57:37 -03:00
Fabio Rehm
35741ba5c5 I think it is safe to remove this now \o/ 2014-03-13 00:57:37 -03:00
Fabio Rehm
803e446dc5 backports: Add IsState 2014-03-13 00:57:37 -03:00
Fabio Rehm
71b02ab511 We dont need to provide support for all versions on the 1.1.x series ;) 2014-03-13 00:57:37 -03:00
Fabio Rehm
9288d1e56c core: Enable paralelization for Vagrant 1.2+ only 2014-03-13 00:57:37 -03:00
Fabio Rehm
fb58d6c878 core: Get the plugin to work on Vagrant 1.4 nicely 2014-03-13 00:57:37 -03:00
Fabio Rehm
23e82594e1 backports: Add Action::Message 2014-03-13 00:57:36 -03:00
Fabio Rehm
5c6855eb4c backports: Alias HandleBoxUrl to HandleBox 2014-03-13 00:57:36 -03:00
Fabio Rehm
f2c1f70cc7 backports: Alias 1.5 new Vagrant::UI::Interface methods 2014-03-13 00:57:36 -03:00
Fabio Rehm
f67c6a1f31 Minor tweaks to accomodate acceptance specs 2014-03-13 00:57:36 -03:00
Fabio Rehm
35feb11367 core: Fix synced folder creation (AKA first bug caught with vagrant-spec)
Thanks @mitchellh!
2014-03-13 00:57:36 -03:00
Fabio Rehm
37ffd4e477 core: Getting ready to run vagrant-spec acceptance suite 2014-03-13 00:57:36 -03:00
Fabio Rehm
36f7daa528 💣 hand made sanity checks (vagrant-spec is coming in!) 2014-03-13 00:57:36 -03:00
Fabio Rehm
320a698f49 backports: Make it clear that it will only be extracted to a separate gem if theres enough interest 2014-03-13 00:57:36 -03:00
Fabio Rehm
bb8514b518 core: "Tag" ShareFolders action as backport functionality 2014-03-13 00:57:36 -03:00
Fabio Rehm
d5abb523de core: Implement support for built in synced folders and add required logic for NFS 2014-03-13 00:57:36 -03:00
Fabio Rehm
056e47d364 core: Introduce a public_address capability so that we can use vagrant share 2014-03-13 00:57:36 -03:00
Fabio Rehm
8f1b54395e core: Introduce a synced folder plugin for vagrant 1.4+ 2014-03-13 00:57:36 -03:00
Fabio Rehm
a0acc571b2 core: Use HandleBox in case Vagrant 1.5 is in use 2014-03-13 00:57:36 -03:00
Fabio Rehm
891403f10d backports: Add files for Vagrant 1.5 actions that will need to be backported 2014-03-13 00:57:36 -03:00
Fabio Rehm
fca401ac50 Remove unused locale 2014-03-13 00:57:36 -03:00
Fabio Rehm
4fbd7c0182 core: Move WaitForCommunicator to backports and make it generic 2014-03-13 00:57:36 -03:00
Fabio Rehm
f5661280bc core: Kick off a vagrant-backports lib with method for verifying vagrant version 2014-03-13 00:57:36 -03:00
Fabio Rehm
1072a42ed2 revert 2014-03-13 00:57:36 -03:00
Fabio Rehm
aef40d5b42 core: Fix tests to be rspec 3.0 compatible [GH-111] 2014-03-13 00:57:36 -03:00
Fabio Rehm
10599a5ba7 core: Temporary safety net 2014-03-13 00:57:36 -03:00
Fabio Rehm
40fd5a2faf core: Group vagrant plugins under the :plugins group on Vagrantfile
This is required so that vagrant 1.5 picks them up
2014-03-13 00:57:36 -03:00
Fabio Rehm
b5a0a8de6f core: Update rspec + vagrant, add vagrant-spec and remove rspec-spies / rspec-fire [GH-111] 2014-03-13 00:57:36 -03:00
Fabio Rehm
5422d272d2 Merge pull request #245 from fgrehm/base-boxes-updates
Base boxes revamp
2014-03-13 00:56:49 -03:00
Fabio Rehm
6fbe048175 Note the whole lot of chages made to base boxes 2014-03-13 00:54:09 -03:00
Fabio Rehm
2c0b2bd026 boxes: Update docs to match recent changes 2014-03-13 00:08:58 -03:00
Fabio Rehm
28c5df5132 boxes: Include NFS client on base boxes [closes GH-218] 2014-03-11 15:07:24 -03:00
Fabio Rehm
735475d333 Merge pull request #247 from fpletz/fix/base-template-bash-return
boxes: Return in bash is only allowed in functions
2014-03-11 11:02:24 -03:00
Franz Pletz
438ef64c25 boxes: Return in bash is only allowed in functions 2014-03-11 14:03:12 +01:00
Fabio Rehm
b0372a10c0 boxes: Remove old build-all script 2014-03-09 23:29:18 -03:00
Fabio Rehm
0ae0288af9 boxes: Fix make clean 2014-03-09 23:27:58 -03:00
Fabio Rehm
b82e86cb8e boxes: Fix locales for ubuntu and debian 2014-03-09 23:12:00 -03:00
Fabio Rehm
cfa1d2e02f boxes: Update lxc-template to use a file lock around rootfs extraction 2014-03-09 22:59:18 -03:00
Fabio Rehm
82b49b7242 boxes: Finish Debian conversion to new scripts 2014-03-09 22:56:49 -03:00
Fabio Rehm
4f5d95b7f3 boxes: Getting ready to build debians 2014-03-09 21:36:00 -03:00
Fabio Rehm
deac5930cc action/handle_box_metadata: Implement support for 1.0.0 base boxes 2014-03-09 21:21:39 -03:00
Fabio Rehm
d5faf1db66 boxes: Drop packages on boxes/output/TODAY for better organization 2014-03-09 21:21:39 -03:00
Fabio Rehm
02a65820bf boxes: Ensure .box is owned by the current user 2014-03-09 21:21:39 -03:00
Fabio Rehm
2c934d4ec4 boxes: Fix output logging 2014-03-09 21:21:39 -03:00
Fabio Rehm
d0939622a5 boxes: Disable salt on raring 2014-03-09 21:21:38 -03:00
Fabio Rehm
c7f5a567a9 boxes: Redirect puppet.deb wget to log file 2014-03-09 21:21:38 -03:00
Fabio Rehm
85d36bfd41 boxes: Implement make clean 2014-03-09 21:21:38 -03:00
Fabio Rehm
ff3baf1cd4 boxes: Improved output logging 2014-03-09 21:21:38 -03:00
Fabio Rehm
74cf06b148 boxes: Sleep for 5 seconds after starting the container so that is has some time to get its network ready 2014-03-09 21:21:38 -03:00
Fabio Rehm
2c7e6fb600 boxes: Move colors out to the UI file 2014-03-09 21:21:38 -03:00
Fabio Rehm
e69441a99b boxes: Improve CM handling 2014-03-09 21:21:38 -03:00
Fabio Rehm
7effe1f092 boxes: Support for building raring machines 2014-03-09 21:21:38 -03:00
Fabio Rehm
e598086913 boxes: Backport GH-92 2014-03-09 21:21:38 -03:00
Fabio Rehm
a7074545ed boxes: Ensure locales are properly set on debianoid boxes 2014-03-09 21:21:38 -03:00
Fabio Rehm
3ff6046228 boxes: Skip puppet installation on Ubuntu Trusty as it is not supported ATM 2014-03-09 21:21:38 -03:00
Fabio Rehm
cd23804046 boxes: Prevent puppet and chef from being reinstalled 2014-03-09 21:21:38 -03:00
Fabio Rehm
dbb6d1f131 boxes: Add missing public vagrant ssh key 2014-03-09 21:21:38 -03:00
Fabio Rehm
921e08bdb4 boxes: Get rid of old scripts 2014-03-09 21:21:38 -03:00
Fabio Rehm
1b8fb6137b Bring back support for installing provisioners on ubuntu base boxes 2014-03-09 21:21:38 -03:00
Fabio Rehm
8d3d84aef2 Finish basic version of the new ubuntu base boxes build 2014-03-09 21:21:38 -03:00
Fabio Rehm
f927f65ec1 Getting close to finish new structure for building ubuntu boxes 2014-03-09 21:21:38 -03:00
Fabio Rehm
4a18c7a05a Fix vagrant sudoers file permissions 2014-03-09 21:21:38 -03:00
Fabio Rehm
3b1055c843 New base box template 2014-03-09 21:21:38 -03:00
Fabio Rehm
420a49c870 Base box cleanup script and rootfs compression 2014-03-09 21:21:38 -03:00
Fabio Rehm
8fec240ae6 Improve UI for package and clean scripts 2014-03-09 21:21:38 -03:00
Fabio Rehm
bd9b2e8957 Install debian extras 2014-03-09 21:21:38 -03:00
Fabio Rehm
dce843db12 Improved base boxes scripts UI and implement prepare-vagrant-user.sh 2014-03-09 21:21:38 -03:00
Fabio Rehm
12bc88805a Implement download step 2014-03-09 21:21:38 -03:00
Fabio Rehm
f070e9ec5b Scaffold the new structure for building base boxes 2014-03-09 21:21:38 -03:00
Antonio Terceiro
1d28e3d213 boxes scripts: give real total sudo access
Without this, commands like `sudo -u $USER $COMMAND` will not work.
2014-03-09 21:21:32 -03:00
Laurent Vallar
1d3e3901c7 Support current LANG environment variable if any.
Signed-off-by: Laurent Vallar <val@zbla.net>
2014-03-09 21:20:55 -03:00
Laurent Vallar
773e717fd9 Enable bash-completion as it's installed
Signed-off-by: Laurent Vallar <val@zbla.net>
2014-03-09 21:20:55 -03:00
Abe Voelker
bba250255a Fix broken locale in Ubuntu boxes 2014-03-09 21:20:55 -03:00
Abe Voelker
9ed8f0c205 Fix apt-get error when building Ubuntu boxes 2014-03-09 21:20:51 -03:00
Darrell Hamilton
b7c29be732 comments reflect implementation 2014-03-09 21:19:55 -03:00
Darrell Hamilton
774e8175eb Complete NOPASSWD for vagrant
Previously, vagrant could not do everything with passwordless sudo.  Eg.
`sudo -u other-user ls` would ask for a sudo password, causing tools
like ansible to hang when trying to execute commands as another user.
2014-03-09 21:19:55 -03:00
Darrell Hamilton
ba2569c222 Only give vagrant NOPASSWD ALL 2014-03-09 21:19:55 -03:00
Adam Stokes
c2f4cfda4f Fix ppa support in ubuntu installs
Rather than determining what package to install on which series, just install
them both for the time being as they don't seem to conflict in any current
series.

Signed-off-by: Adam Stokes <adam.stokes@ubuntu.com>
2014-03-09 21:19:55 -03:00
Adam Stokes
7ef475c7e1 Include python-software-properties
For some reason I never had this in the common script and apt-add-repository
was not provided. This solves that.

Signed-off-by: Adam Stokes <adam.stokes@ubuntu.com>
2014-03-09 21:19:55 -03:00
Fabio Rehm
910a6c54ba Update vagrant-cachier 2014-02-27 01:12:50 -03:00
Fabio Rehm
4a84d95ff2 Up dev version 2014-02-26 22:01:29 -03:00
Fabio Rehm
d391e840cc Merge 0.8.0 2014-02-26 21:55:35 -03:00
Fabio Rehm
39a5946399 v0.8.0 2014-02-25 23:59:13 -03:00
Fabio Rehm
6704cd9869 Updated readme 2014-02-21 19:35:23 -03:00
Fabio Rehm
46e77bf9e5 Update CHANGELOG.md 2014-02-19 23:27:53 -03:00
Fabio Rehm
f8021b3f31 Merge pull request #225 from ccope/name-cleanup
remove naming cruft, clarify comment
2014-02-19 23:25:59 -03:00
Fabio Rehm
11cebb5bf7 Merge pull request #226 from ccope/flexible-mac-regex
Flexible mac address regex
2014-02-19 23:24:18 -03:00
Cam Cope
b5c7a50a74 match hwaddr lines with varying spaces 2014-02-19 18:25:45 -05:00
Cam Cope
186b01e192 remove naming cruft, clarify comment
Removed confusing leftover "use_machine_name" variable
Made comment about :container_name more clear
2014-02-18 03:05:14 -05:00
Fabio Rehm
44f00bd7ed Add spec to check if container state detection is case insentive [GH-217] 2014-02-12 01:47:23 -02:00
Fabio Rehm
005140099c Check for whether lxc is installed using lxc-create
Closes GH-214 and GH-211
2014-02-12 01:41:55 -02:00
Fabio Rehm
70a92132d7 I think the error is just on this specific kernel version... 2014-02-07 15:44:27 -02:00
Fabio Rehm
2fbbd56891 Making clear what's a bug free kernel
https://twitter.com/mzp/status/431634984256802816
2014-02-07 15:42:33 -02:00
Fabio Rehm
13e7ffedea Update CHANGELOG 2014-02-02 19:53:03 -02:00
Fabio Rehm
95e111c322 Merge branch 'master' of https://github.com/hiono/vagrant-lxc into next
Conflicts:
	lib/vagrant-lxc/driver/cli.rb
2014-02-02 19:50:58 -02:00
Fabio Rehm
5db318d26f Merge branch 'fixes' of https://github.com/attilabogar/vagrant-lxc into next 2014-02-02 19:49:24 -02:00
Fabio Rehm
6e7ab85dad Use a safer random name for containers (closes GH-192)
if the same vagrantfile is up'd in the same second in the same basedir
this caused a conflict
2014-02-02 19:43:51 -02:00
Fabio Rehm
7e00b96520 Show something meaningful to the user in case the container already exists [GH-132] 2014-02-02 19:27:08 -02:00
Fabio Rehm
786bb8a3fe Simplify code related to container naming [GH-132] 2014-02-02 18:37:06 -02:00
Fabio Rehm
e3b8ead93b Mention support for naming containers from Vagrantfiles on changelog 2014-02-02 18:08:13 -02:00
Fabio Rehm
2be86bb7d0 Up version for dev 2014-02-02 18:07:50 -02:00
Michael Owings
20a558097c README fix 2014-02-02 18:03:33 -02:00
Michael Owings
b34dd7d8e7 Allow two ways to name a container 2014-02-02 18:03:33 -02:00
Cam Cope
ffb573a7f1 allow setting the container name in the vagrantfile 2014-02-02 18:03:33 -02:00
Fabio Rehm
1083f100ad 🎆 New year 🎆 2014-01-02 00:51:27 -02:00
Hiro
6d7bf5d188 Merge branch 'release/0.7.0.1' 2013-12-24 18:55:57 +09:00
Hiro
a436e30214 fixed, case insensitive matching
lxc version: 1.0.0.alpha3
$ sudo lxc-info -n test_default-1387877096
Name:           test_default-1387877096
State:          RUNNING
....
2013-12-24 18:35:19 +09:00
Fabio Rehm
c19bc91e70 Update CHANGELOG 2013-12-17 22:59:56 -02:00
Fabio Rehm
6066d22ad9 Simplify check for whether lxc is installed [GH-186] 2013-12-17 22:59:32 -02:00
Fabio Rehm
0e759e681b Merge pull request #186 from vStone/bugfix/185-detect-lxc-different-root-path
Attempt to find the lxc-version command using sudo if not in default PATH (Fixes #195)
2013-12-17 16:55:34 -08:00
Fabio Rehm
c7fff4d935 Update link to new base box 2013-11-25 15:33:37 -02:00
Attila Bogár
d8a8dbaa9b fix long waiting time with centos 6.4 containers on ubuntu 13.10 host 2013-11-19 22:24:36 +00:00
Attila Bogár
e4e4551aea fix incompatibility issue with ppa:ubuntu-lxc/stable and ppa:ubuntu-lxc/daily 2013-11-19 22:23:25 +00:00
Jan Vansteenkiste
9b7491c2e8 Attempt to find the lxc-version command using sudo
... if lxc-version is not found in the efault PATH

Fixes #195
2013-11-12 13:38:50 +01:00
Fabio Rehm
6779556650 Add a TODO so that we can easily grep this 2013-11-11 20:44:02 -02:00
Fabio Rehm
324cddcb9d Bring back @gwillem comment from 2790261e58 regarding rootfs paths so we know what this "./." is about :) 2013-11-11 20:42:34 -02:00
Fabio Rehm
06d43df632 CHANGELOG tweak and missing info 2013-11-11 20:22:26 -02:00
Fabio Rehm
f7e62c0324 Update release date for 0.7.0 and add 0.7.1 section 2013-11-08 18:59:06 -02:00
Fabio Rehm
bf70156395 Update bundle 2013-11-08 18:57:07 -02:00
Fabio Rehm
6cba594f44 Up version for dev 2013-11-08 18:57:07 -02:00
Fabio Rehm
61f7b73f2a v0.7.0 2013-11-08 18:54:33 -02:00
Fabio Rehm
3d017ce3bd Convenience script for building all base boxes 2013-11-06 22:09:56 -02:00
Fabio Rehm
4a9e4b3394 Use new base boxes as dev VMs 2013-11-06 22:08:13 -02:00
Fabio Rehm
366d1dc3a5 Update README 2013-11-06 22:07:36 -02:00
Fabio Rehm
3215b99534 What we have in place is already enough for us to bump to 0.7.0 2013-11-06 21:42:59 -02:00
Fabio Rehm
afd302529c Enable parallelization [GH-152] 2013-11-06 21:40:32 -02:00
Fabio Rehm
b86b83eba1 Fix WarnNetworks action [GH-154] 2013-11-06 21:21:16 -02:00
Fabio Rehm
0e57cfc2b0 Remove unneeded .to_s 2013-11-06 21:06:25 -02:00
Fabio Rehm
6428da893b Add link to Troubleshooting section of the wiki to CONTRIBUTING.md
Closes GH-168
2013-11-06 21:03:45 -02:00
Fabio Rehm
bf6e4b5c89 Respect Vagrantfile options to disable forwarded port
Closes GH-149
2013-11-06 21:01:21 -02:00
Fabio Rehm
6b5db24a6b Better than a note on the readme is a warning for users about unsupported private / public networks :)
Closes GH-154
2013-11-06 20:40:08 -02:00
Fabio Rehm
c61ade8ef4 Nicely handle nil values for :host_ip when specifying forwarded ports
Fix GH-170
2013-11-06 20:25:46 -02:00
Fabio Rehm
f8bd5bf40a Update CHANGELOG 2013-11-06 20:11:02 -02:00
Fabio Rehm
c8f379c764 Fix various issues related to recent default permissions changes to /var/lib/lxc [GH-180] 2013-11-06 19:38:48 -02:00
Fabio Rehm
02f85e4e59 Couple of tweaks to acceptance specs
This will be eventually converted to Bats...
2013-11-06 01:11:38 -02:00
Fabio Rehm
1c5c73b08a Fix sudo wrapper logger name 2013-11-06 01:10:40 -02:00
Fabio Rehm
86083fbe36 Install psmisc on dev vm 2013-11-06 01:10:07 -02:00
Fabio Rehm
4a3d5d827e Switch back to official ubuntu raring image 2013-11-06 01:09:54 -02:00
Fabio Rehm
1d9af8f0af Update CHANGELOG 2013-11-06 01:08:05 -02:00
Fabio Rehm
24daffc92c Merge branch 'fix-vagrant-package' of github.com:gwillem/vagrant-lxc 2013-11-06 00:59:51 -02:00
Fabio Rehm
744b4331d7 Update bundle 2013-11-06 00:59:11 -02:00
Willem de Groot
2790261e58 included rootfs_path variable in tar command 2013-11-05 19:55:41 +01:00
Fabio Rehm
ecdf83e1c7 Mention GH-153 on README 2013-11-04 13:00:20 -02:00
Fabio Rehm
17ae9ac403 Lets have a look at some numbers 2013-11-01 11:27:56 -02:00
Willem de Groot
f52835cb58 Fix relative path issue used for vagrant package 2013-10-30 12:01:51 +01:00
Fabio Rehm
4ca375ec50 Gemfile.lock 2013-10-27 22:25:55 -02:00
Fabio Rehm
b5f21f268a Up version for dev 2013-10-27 22:19:27 -02:00
Fabio Rehm
5a6b2791e4 v0.6.4 2013-10-27 22:18:08 -02:00
Fabio Rehm
2b062487bc Hack in a fix for hosts that do not have lxc-shutdown around [GH-150] 2013-10-24 11:47:15 -02:00
Fabio Rehm
5833e262aa Merge pull request #167 from avokhmin/openmandriva
small refactoring, added scripts for Openmandriva
2013-10-23 17:57:47 -07:00
Fabio Rehm
9e3b371e11 Tweak lxc-template as an attempt to make it compatible with Ubuntu 13.10 [GH-150] 2013-10-22 22:31:26 -02:00
Vokhmin Alexey V
3375a9c40c small refactoring, added scripts for Openmandriva 2013-10-21 23:11:43 +04:00
Fabio Rehm
225af56227 Up version for dev 2013-10-12 17:03:26 -03:00
Fabio Rehm
a9d7dff53a v0.6.3 2013-10-12 17:01:49 -03:00
Fabio Rehm
86be628cf2 Merge pull request #162 from avokhmin/master
#157: FetchIpFromDnsmasqLeases returns []
2013-10-12 11:55:30 -07:00
Fabio Rehm
4c5f9c9e49 Merge pull request #163 from sephii/salt-debian
Fix salt install on debian boxes
2013-10-12 09:40:06 -07:00
Sylvain Fankhauser
0cb430a4ca Fix salt install on debian boxes 2013-10-12 15:50:13 +02:00
Vokhmin Alexey V
39515cc1da #157: small refactoring, updated specs 2013-10-12 02:15:12 +04:00
Vokhmin Alexey V
c5a89a54ce #157: Fixed: FetchIpFromDnsmasqLeases returns [] 2013-10-12 02:04:29 +04:00
Fabio Rehm
23e25c40ab Copy & paste is evil 2013-10-10 12:55:06 -03:00
Fabio Rehm
add4908912 Update CHANGELOG 2013-10-10 12:51:15 -03:00
Fabio Rehm
7bca20a166 Merge pull request #161 from optiflows/shared_disabled
Respect Vagrantfile options to disable synced folders
2013-10-10 08:50:36 -07:00
Guilhem Lettron
bdedae40b2 Respect Vagrantfile options to disable synced folders
fix #147
2013-10-10 11:53:10 +02:00
Fabio Rehm
79006095f5 Remove extra if 2013-10-03 13:35:17 -03:00
Fabio Rehm
0f1239a1e3 Bump dev version 2013-10-03 13:34:55 -03:00
Fabio Rehm
b928aa8901 v0.6.2 2013-10-03 13:28:38 -03:00
Fabio Rehm
c194b3a24a Fix lxc-attach --namespaces support detection and cache the result 2013-10-03 13:26:04 -03:00
Fabio Rehm
8bcb8b5328 Bumb dev version 2013-10-03 12:31:15 -03:00
Fabio Rehm
79aa4d8866 v0.6.1 2013-10-03 12:25:41 -03:00
Fabio Rehm
ca0d8d53a5 Fix broken specs 2013-10-03 10:38:42 -03:00
Fabio Rehm
f9dd5392ff Improve checking for support for fetching IP with lxc-attach [GH-118] 2013-09-28 22:37:31 -03:00
Fabio Rehm
a087023365 Update README 2013-09-28 12:01:12 -03:00
Fabio Rehm
175c40765a Fall back to dnsmasq leases file if not able to fetch IP with lxc-attach
Closes GH-118
2013-09-28 03:12:58 -03:00
Fabio Rehm
18bb9482d5 Nicely handles missing templates path (fixes GH-139) 2013-09-28 02:58:38 -03:00
Fabio Rehm
c76df6358c Add CONTRIBUTING.md
Closes GH-148
2013-09-28 02:11:10 -03:00
Fabio Rehm
6bbc7c5e91 Couple of tweaks on Vagrantfile used for acceptance testing 2013-09-28 01:47:34 -03:00
Fabio Rehm
a6c95bff50 Format code 2013-09-28 01:46:27 -03:00
Fabio Rehm
ecc862f6cb Log container's mac address to ease debugging 2013-09-28 01:46:26 -03:00
Fabio Rehm
bcfb7b3e00 Moar annotations 2013-09-28 01:46:26 -03:00
Fabio Rehm
cd53ad2efd Fix gempath for dev vms and consolidate provisioning with puppet 2013-09-28 01:46:25 -03:00
Fabio Rehm
019c23b74b Provision dev boxes with sudo wrapper script for testing 2013-09-28 01:25:33 -03:00
Fabio Rehm
0330ec55e1 Not using it 2013-09-28 01:25:08 -03:00
Fabio Rehm
a6bd483275 Run apt-get update prior to installing packages 2013-09-28 01:24:31 -03:00
Fabio Rehm
93ba8414bf Update README 2013-09-28 01:19:25 -03:00
Fabio Rehm
24b814122b Lock vagrant to 1.3.3 2013-09-28 01:09:47 -03:00
Fabio Rehm
d44d067ad8 Update CHANGELOG 2013-09-28 01:06:44 -03:00
Fabio Rehm
7511ee41f0 Just a reminder 2013-09-28 01:06:14 -03:00
Fabio Rehm
2e5e5920d7 Shortcuts! 2013-09-28 01:05:10 -03:00
Fabio Rehm
2116737989 Dont worry about machine state when waiting for communicator [GH-142] [GH-146] 2013-09-27 12:27:25 -03:00
Fabio Rehm
6b823e8dcb Support rootfs param on generic lxc-template 2013-09-27 12:24:21 -03:00
Fabio Rehm
9b20771bde Dont think we need these examples anymore 2013-09-21 01:33:23 -03:00
Fabio Rehm
6680858184 Improve logging and add some TODOs that have been around for a while 2013-09-21 01:32:15 -03:00
Fabio Rehm
518cd3cbe3 Add Saucy VBox dev VM 2013-09-21 01:30:15 -03:00
Fabio Rehm
aa8638ed20 Update Raring VBox dev VM 2013-09-21 01:29:18 -03:00
Fabio Rehm
d02a9d575f Ensures lxc templates are executable prior to running lxc-create
Closes #128
2013-09-21 01:28:03 -03:00
Fabio Rehm
bda01dbc4d Merge pull request #126 from fgrehm/126-base-boxes-revamp
Clean up base boxes creation scripts
2013-09-20 21:17:35 -07:00
Fabio Rehm
1af1c91d90 Update README 2013-09-21 01:08:16 -03:00
Fabio Rehm
d803119f50 Docs about base boxes 2013-09-21 00:32:20 -03:00
Fabio Rehm
2c0000b8cc Clean up after ourselves when building base boxes 2013-09-20 23:34:37 -03:00
Fabio Rehm
5f42f2b4dd Backport #91 2013-09-20 23:01:24 -03:00
Fabio Rehm
c49dfc59ea Minor tweaks for the base ubuntu box script 2013-09-20 22:12:26 -03:00
Fabio Rehm
22040ba4c2 Add script for building debian base boxes 2013-09-20 22:10:54 -03:00
Fabio Rehm
0f31b51e2d Embed vagrant key into builder script to avoid downloading it all the time 2013-09-19 18:58:06 -03:00
Fabio Rehm
2f3d1c27ce Assume that we are running the ubuntu base box builder with a local checkout + add date / time to box metadata.json 2013-09-19 18:41:23 -03:00
Fabio Rehm
50e82f61b1 Remove unused arguments from generic lxc template and introduce support for the rootfs param 2013-09-19 18:24:08 -03:00
Fabio Rehm
076a9e38df Bring back "generic" template that was accidentally removed 2013-09-19 18:16:05 -03:00
Fabio Rehm
e1f91efc3a apt-get upgrade when building base boxes 2013-09-19 18:14:09 -03:00
Fabio Rehm
7efef2a489 Just enough code to deal with building base ubuntu boxes with support for configuration management tools 2013-09-19 12:02:14 -03:00
Fabio Rehm
379b030f64 💣 old stuff 2013-09-19 01:41:02 -03:00
Fabio Rehm
37aeabbeff Add new bash script to build base ubuntu box 2013-09-18 22:52:47 -03:00
Fabio Rehm
03b262319f boxes/ubuntu: Configure vagrant user
This commit applies @smaftoul patch from https://gist.github.com/smaftoul/2d6fcf43b7c6545aa588/revisions
2013-09-18 22:19:01 -03:00
Fabio Rehm
61e7cbce42 boxes/ubuntu: create base container 2013-09-18 22:19:01 -03:00
Fabio Rehm
739e602794 %s/@LOCALSTATEDIR@/\/var/g 2013-09-18 22:19:01 -03:00
Fabio Rehm
a1c7a4ece0 Add ubuntu lxc template from staging (188e0ab60b/templates/lxc-ubuntu.in) 2013-09-18 22:19:01 -03:00
Fabio Rehm
dbc6c8b231 Scaffold new base boxes rake tasks and remove old files 2013-09-18 22:19:01 -03:00
Fabio Rehm
bcdb4ca5bd 💣 V2 boxes creation scripts 2013-09-18 22:19:01 -03:00
Fabio Rehm
4eb066a076 v0.6.0 2013-09-12 12:32:02 -03:00
Fabio Rehm
59c5a1e144 Add link to Debian host configuration instructions to the README 2013-09-12 12:32:02 -03:00
Fabio Rehm
3f99124117 Update README 2013-09-12 01:29:12 -03:00
Fabio Rehm
660fb3f6c4 Merge pull request #136 from fgrehm/136-updates-for-vagrant-1.3
Updates for Vagrant 1.3
2013-09-11 21:17:01 -07:00
Fabio Rehm
e4ee20c7ad Say hi to Vagrant 1.3+ 2013-09-12 01:14:57 -03:00
Fabio Rehm
cf73a843d0 Do not worry about transition to running state when starting a container, this is handled from outside 2013-09-12 01:12:07 -03:00
Fabio Rehm
791a93fe9e Make use of the new WaitForCommunicator action on boot 2013-09-12 01:10:11 -03:00
Fabio Rehm
1da7b60cd8 "Backport" vagrant 1.3+ WaitForCommunicator action 2013-09-11 22:33:22 -03:00
Fabio Rehm
f13806626c Use vagrant 1.3+ ProvisionerCleanup builtin action on destroy 2013-09-11 22:10:18 -03:00
Fabio Rehm
2064dbf05a Bump vagrant dependency 2013-09-11 21:44:41 -03:00
Fabio Rehm
7f3f7b1558 Rename plugin name to vagrant-lxc so that it is easier to check if it is installed with Vagrant.has_plugin? 2013-09-11 21:16:57 -03:00
Fabio Rehm
7bd738aa8e Update CHANGELOG.md 2013-09-10 17:39:06 -03:00
Fabio Rehm
05c472042d Merge pull request #140 from cwoac/remove_group_assumption
use uid/gid for chowns.
2013-09-10 13:37:44 -07:00
Oliver Matthews
e5790d3ad1 use uid/gid for chowns. 2013-09-10 20:57:51 +01:00
Fabio Rehm
ce3e061cae Better add a note about 1.3 compatibility while we don't handle GH-136 2013-09-10 14:04:06 -03:00
Fabio Rehm
2c32f1caa6 Add instructions to install additional packages required
Thanks @achaphiv for pointing out on https://github.com/fgrehm/vagrant-lxc/issues/134#issuecomment-24009687
2013-09-07 19:44:05 -03:00
Fabio Rehm
6a7535843f Lock vagrant to 1.2.7 for now 2013-08-30 19:23:31 -03:00
Fabio Rehm
ce581b426d Update bundle 2013-08-30 19:23:31 -03:00
Fabio Rehm
36b67f2d35 Update changelog 2013-08-30 19:23:31 -03:00
Holger Amann
5c53e52ea1 container's / must be compressed under 'rootfs' dir 2013-08-30 19:23:31 -03:00
Fabio Rehm
8fcb6d2a06 Update CHANGELOG.md 2013-08-11 19:53:10 -03:00
Fabio Rehm
5c6556f08b Merge pull request #131 from hamann/fix_box_compressing
error while compressing container's rootfs
2013-08-11 15:48:19 -07:00
Holger Amann
280702061d fix creating rootfs.tar.gz 2013-08-11 15:30:23 +02:00
Fabio Rehm
5ae82681cd Update README.md 2013-08-02 13:24:42 -03:00
Fabio Rehm
5eaf0a26bf Up version for development 2013-08-01 19:19:17 -03:00
Fabio Rehm
e615c55ad4 v0.5.0
[ci skip]
2013-08-01 19:13:46 -03:00
Fabio Rehm
a31b784377 Update README.md 2013-08-01 10:55:14 -03:00
Fabio Rehm
1f3d3ead92 Update CHANGELOG [ci skip] 2013-07-31 23:15:53 -03:00
Fabio Rehm
5b088ebd17 Update readme to reflect current behavior 2013-07-31 23:14:38 -03:00
Fabio Rehm
b5378c7c42 Add support for reading from Ubuntu's default /var/lib/misc/dnsmasq.lxcbr0.leases 2013-07-31 23:01:08 -03:00
Fabio Rehm
1ef2c5bcad Simplify dnsmasq leases lookup 2013-07-31 23:00:35 -03:00
Fabio Rehm
4bb70fb252 Moar debugging when trying to fetch the IP from dnsmasq leases 2013-07-31 23:00:20 -03:00
Fabio Rehm
b301ee8e0f Add warning about the sudo wrapper script 2013-07-31 22:48:00 -03:00
Fabio Rehm
2082a5a81d Remove some unused args and add pending specs so that we don't forget to test it 2013-07-31 22:35:49 -03:00
Fabio Rehm
c4429fa158 Remove pending spec 2013-07-31 22:15:18 -03:00
Fabio Rehm
5f102d3e10 First stab at persisting lxc customizations on config file instead of using lxc-start "-s" parameter 2013-07-29 12:12:41 -03:00
Fabio Rehm
251fe68035 Cache the output of Driver#version 2013-07-29 12:10:59 -03:00
Fabio Rehm
23f531b38c Remove duplicated Driver#base_path method 2013-07-29 12:10:25 -03:00
Fabio Rehm
0385a64d31 Replace ugly driver builder with a more intelligent approach
References #118
2013-07-29 12:08:24 -03:00
Fabio Rehm
b374bba4ec Update bundle 2013-07-28 19:45:22 -03:00
Fabio Rehm
ae7a3b0795 Update README 2013-07-28 19:43:41 -03:00
Fabio Rehm
e1f756cdc3 Remove memory swap limit from example Vagrantfile 2013-07-28 03:12:17 -03:00
Fabio Rehm
97f6edeed8 Error out if LXC is not installed
This is enough to close #11
2013-07-28 02:55:00 -03:00
Fabio Rehm
dee099ce96 Make use of vagrant's builtin action for handling forwarded port collisions
Closes #5
2013-07-28 02:39:11 -03:00
Fabio Rehm
7f58f7a26e Add support for logging redir output by setting REDIR_LOG env var
Closes #51
2013-07-28 02:30:17 -03:00
Fabio Rehm
14e8c41ee0 Avoid sudos for redir related stuff 2013-07-28 02:20:16 -03:00
Fabio Rehm
d62a053674 Add support for using a sudo wrapper script
Closes #90
2013-07-28 02:17:07 -03:00
Fabio Rehm
98f1df47a1 Do not attach forwarded ports to host's 127.0.0.1 by default
This is enough for us to bump to 0.5.0 and to close #76
2013-07-28 01:31:50 -03:00
Fabio Rehm
2dbfd23915 No need to use sudo to check if redir is installed 2013-07-27 20:44:36 -03:00
Fabio Rehm
d2e354839f Update changelog 2013-07-21 22:55:34 -03:00
Fabio Rehm
bff0f8019b Merge pull request #116 from battlemidget/salt-feature-1
Salt feature 1
2013-07-21 18:54:31 -07:00
Fabio Rehm
258c822a54 Add license to .gemspec
Fixes #114
2013-07-21 22:51:29 -03:00
Fabio Rehm
9058c5763c Update CHANGELOG 2013-07-21 22:48:28 -03:00
Fabio Rehm
681c490cdc Add Vagrantfile VM name to the container name
Closes #115
2013-07-21 22:46:44 -03:00
Fabio Rehm
e68e4f8f05 Support for specifying host interface/ip for binding redir
Closes #76
2013-07-21 22:45:07 -03:00
Adam Stokes
900db67d10 Merge branch 'master' of github.com:fgrehm/vagrant-lxc into salt-feature-1 2013-07-21 21:39:16 -04:00
Fabio Rehm
c7087a6802 Update changelog 2013-07-21 21:08:55 -03:00
Fabio Rehm
ee37b9e2e7 Merge branch 'check-for-redir' of https://github.com/zeroem/vagrant-lxc 2013-07-21 21:06:14 -03:00
Adam Stokes
9207ed49ba Append sources repository for any build-dep requirements
Signed-off-by: Adam Stokes <adam.stokes@ubuntu.com>
2013-07-21 18:35:01 -04:00
Adam Stokes
d2d131cefb Fix binary name for apt repository
Signed-off-by: Adam Stokes <adam.stokes@ubuntu.com>
2013-07-19 17:32:42 -04:00
Adam Stokes
5b5719295d Include saltstack support within custom lxc builds
Signed-off-by: Adam Stokes <adam.stokes@ubuntu.com>
2013-07-19 16:48:21 -04:00
Fabio Rehm
ef3b97dff8 Up version for development 2013-07-18 23:53:09 -03:00
Fabio Rehm
7ceed8d6d9 Update CHANGELOG.md 2013-07-18 21:18:45 -03:00
Fabio Rehm
72555fdeb5 Merge pull request #108 from fgrehm/0.4.0
Release 0.4.0
2013-07-18 16:52:35 -07:00
Darrell Hamilton
eb0854b6fb Test coverage for 'check for redir'
Includes a minor refactor allowing variation of the result of the system
call per test
2013-07-15 21:56:40 -07:00
Darrell Hamilton
17211387d0 stub out call to system 2013-07-15 11:30:40 -07:00
Darrell Hamilton
041f185395 Check for redir before booting the machine 2013-07-15 10:49:02 -07:00
Darrell Hamilton
a2a9cb99d1 repair whitespace 2013-07-14 22:50:14 -07:00
Darrell Hamilton
ad41c445a4 Check for redir before forwarding ports
Make a system call out to `which` to see if redir exists on the PATH
before trying to forward ports.  Raises a VagrantError if it does not.
2013-07-14 22:42:49 -07:00
Fabio Rehm
003de9476a v0.4.0 2013-07-13 14:03:25 -03:00
Fabio Rehm
494bc07e5f Fix broken spec 2013-07-13 14:02:13 -03:00
Fabio Rehm
e3597e08a7 Rollback rspec to 2.13.1
Lots of tests were failing and I'm not willing to dig into them right
now =/
2013-07-13 14:00:48 -03:00
Fabio Rehm
4598644143 Checking for specific error classes got deprecated on new rspec 2013-07-13 13:42:03 -03:00
Fabio Rehm
09208a0d28 mock/stub -> double 2013-07-13 13:41:39 -03:00
Fabio Rehm
c14ca57d17 fire_double was deprecated in favor of instance_double 2013-07-13 13:41:20 -03:00
Fabio Rehm
4bd6bffcb6 Use vagrant-omnibus to test Chef provisioning on example Vagrantfile 2013-07-12 20:38:38 -03:00
Fabio Rehm
0e66eb675b Enable NFS for vagrant-cachier 2013-07-12 20:27:39 -03:00
Fabio Rehm
4bbbb4cbf6 Enable vagrant-pristine for development boxes 2013-07-12 20:27:16 -03:00
Fabio Rehm
e504ce3e8d New boxes! 2013-07-12 14:25:24 -03:00
Fabio Rehm
e3665f88ae Update dependencies 2013-07-12 14:24:15 -03:00
Fabio Rehm
6c52ef8255 Ensure container's rootfs is set on config file
Makes our lives easier as we are able to just run a `lxc-start -n CONTAINER`
to check how things are doing without having to go through vagrant.
2013-07-12 01:29:13 -03:00
Fabio Rehm
78499202b6 Revert "Lets ensure the rootfs is always set before starting the container"
This reverts commit c6af4fab08 as it is
probably a better idea to have the rootfs config baked into the config
file so we can easily run a `lxc-start -n CONTAINER`
2013-07-12 01:21:27 -03:00
Fabio Rehm
b97081be0d Add missing locale key for stopped status
Fixes #97
2013-07-08 13:29:16 -03:00
Fabio Rehm
e4504090f8 Update CHANGELOG 2013-07-08 13:15:39 -03:00
Fabio Rehm
1348bb910b Tks to @stucki work on #92 there is no need to do this anymore :) 2013-07-08 13:13:47 -03:00
Fabio Rehm
3e73a85d52 Enable retries when fetching container state
Fixes #74
2013-07-08 13:05:43 -03:00
Fabio Rehm
b8b545c277 New boxes 2013-07-08 10:50:15 -03:00
Fabio Rehm
8dc0d09632 Chef installation is now disabled by default 2013-07-08 10:47:29 -03:00
Fabio Rehm
e10822df32 Require Vagrant code right on the beginning of base box building process so it fails early 2013-07-08 10:47:07 -03:00
Fabio Rehm
44bedfe7c6 Get rid of v3 namespaces for building boxes 2013-07-08 10:40:12 -03:00
Fabio Rehm
ecfa53970f Rename v3 boxes rakefile 2013-07-07 22:49:48 -03:00
Fabio Rehm
16c8ff9013 Remove support for building V3 base boxes with chef 2013-07-07 22:30:40 -03:00
Fabio Rehm
14c1ebfd7c Move base boxes docs out to wiki 2013-07-07 22:17:54 -03:00
Fabio Rehm
8006766691 Tks to @stucki work on #92 there is no need to do this anymore :) 2013-06-27 10:39:14 -03:00
Fabio Rehm
c3e6eb4e51 Manually apply #92 on new finalize script used to build V3 base boxes 2013-06-27 01:30:18 -03:00
Fabio Rehm
36f8472614 Update changelog 2013-06-27 01:26:47 -03:00
Fabio Rehm
198ef66cad Merge pull request #92 from stucki/issue-91
Fix IP address in Debian box templates
2013-06-26 21:24:39 -07:00
Fabio Rehm
288308ce91 Update CHANGELOG 2013-06-27 01:14:58 -03:00
Fabio Rehm
123c3afda4 According to semver, what we have so far means a new minor version 2013-06-27 01:08:20 -03:00
Fabio Rehm
027fa8a347 Merge pull request #89 from fgrehm/new-box-format
V3 base boxes
2013-06-26 21:04:28 -07:00
Fabio Rehm
83377bf8a4 Mention Chef support for Raring base boxes on CHANGELOG 2013-06-08 19:01:56 -03:00
Fabio Rehm
f3ff5c9f24 Remove hwaddr from base lxc.conf so that each container gets a different one when running the generic lxc template 2013-06-08 13:55:29 -03:00
Fabio Rehm
1c5727dd7b Remove dead code from debian finalize script 2013-06-08 02:41:43 -03:00
Fabio Rehm
8512c5ace7 Prevent vagrant package from blowing up 2013-06-08 02:07:56 -03:00
Fabio Rehm
51d26b00cd Clean up the mess I left behind 2013-06-08 02:01:50 -03:00
Fabio Rehm
a5eb824fa4 Extract script to finalize debian base boxes 2013-06-08 01:30:02 -03:00
Fabio Rehm
7bd9377fa6 Add missing mount points to base lxc config file 2013-06-08 01:26:32 -03:00
Fabio Rehm
433cf3f9df Add entry about new box format to the changelog 2013-06-08 01:16:25 -03:00
Fabio Rehm
dcc0ce281f Lets be clear about box version error 2013-06-08 01:13:51 -03:00
Fabio Rehm
b8d58d8a13 Add lxc.conf to box package 2013-06-08 01:02:28 -03:00
Fabio Rehm
e4e64d69eb TODO 2013-06-08 01:00:39 -03:00
Fabio Rehm
93003caec3 Better be cautious here 2013-06-08 01:00:21 -03:00
Fabio Rehm
e159a9b534 Looks like this is working... 2013-06-07 21:45:13 -03:00
Fabio Rehm
8e51384802 Extract script to finalize ubuntu boxes 2013-06-07 21:45:13 -03:00
Fabio Rehm
58435e3462 Remove dead code from common lxc template 2013-06-07 21:45:13 -03:00
Fabio Rehm
bb51a51ecb Enable chef for raring base boxes 2013-06-07 21:45:13 -03:00
Fabio Rehm
06f2063d53 Fix error message when building boxes 2013-06-07 21:32:48 -03:00
Michael Stucki
1bef25364a Update /etc/hosts for Ubuntu templates
Change the Ubuntu hosts file similar to Debian
2013-06-06 22:46:16 +02:00
Michael Stucki
70f3b90f6f Remove sed magic to set /etc/hosts for Debian templates
Hosts file is changed according to
http://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_hostname_resolution
2013-06-06 22:46:15 +02:00
Michael Stucki
1bb2bc244a Use 127.0.1.1 for local host name alias
Fixes #91
2013-06-06 22:46:07 +02:00
Fabio Rehm
d61d029333 Update README.md 2013-06-06 14:20:59 -03:00
Fabio Rehm
ed4a8ae729 Duplicate base boxes tasks and start versioning them too 2013-06-06 00:21:17 -03:00
Fabio Rehm
cb1f72923a Unleash V3 boxes! 2013-06-06 00:05:34 -03:00
Fabio Rehm
5c2973108b Support bundling lxc config files with base boxes 2013-06-06 00:04:59 -03:00
Fabio Rehm
75a2d0c65d Lets ensure the utsname is always set before starting the container 2013-06-06 00:03:37 -03:00
Fabio Rehm
c6af4fab08 Lets ensure the rootfs is always set before starting the container 2013-06-06 00:03:02 -03:00
Fabio Rehm
663ff1fc0d Add base lxc config file 2013-06-05 23:58:56 -03:00
Fabio Rehm
ba7bc580f5 Add new common metadata json file for v3 boxes 2013-06-05 23:58:56 -03:00
Fabio Rehm
aca88e2407 Extract a general purpose experimental lxc template 2013-06-05 23:58:56 -03:00
Fabio Rehm
5eb15d8667 Get rid of rootfs removal on lxc-templates
I'm not even sure why I added this but removing it fixes #81
2013-06-05 21:48:41 -03:00
Fabio Rehm
ba92ca171b README getting too big, moving all of this to the Wiki 2013-06-02 21:14:55 -03:00
Fabio Rehm
d9f5e672f4 Install vim and BTRFS on development boxes 2013-06-02 19:14:46 -03:00
Fabio Rehm
c2bf4229a3 Add wheezy vbox development box 2013-06-02 19:14:03 -03:00
Fabio Rehm
e0473a1567 Change URL to base squeeze vbox development box 2013-06-02 19:13:17 -03:00
Fabio Rehm
6d0dc0877b Update CHANGELOG.md 2013-05-31 19:28:51 -03:00
Fabio Rehm
c7f8611480 Update changelog 2013-05-31 01:21:05 -03:00
Fabio Rehm
0df24c795d Up version for development 2013-05-31 01:16:59 -03:00
Fabio Rehm
ea467db17c Merge pull request #82 from cduez/default_group
Fix default group on the rake task.
2013-05-30 21:14:36 -07:00
Cyril Duez
d7ab06df16 Use id to get the default group. 2013-05-30 19:56:16 +02:00
Fabio Rehm
709f09bdc9 Merge pull request #78 from aries1980/master
Extending TEMPLATES_PATH_LOOKUP
2013-05-28 09:16:26 -07:00
aries1980
5df2fc1c71 Directory lookup for templates exptended
More info: https://github.com/fgrehm/vagrant-lxc/issues/77
2013-05-25 09:15:25 +01:00
Fabio Rehm
46904874fe Update vagrant-cachier 2013-05-22 20:39:10 -03:00
Fabio Rehm
88440f6c62 README autumn cleaning 2013-05-17 20:31:00 -03:00
Fabio Rehm
035b87d0a7 Update changelog with 0.3.4 release date and proper version diff link 2013-05-17 18:54:10 -03:00
Fabio Rehm
86be140f86 Update Vagrantfile with vagrant-cachier auto detection 2013-05-17 18:50:25 -03:00
Fabio Rehm
4e53cc83fe Clean up Guardfile 2013-05-17 18:49:33 -03:00
Fabio Rehm
30b76899e3 Update bundle 2013-05-17 18:49:07 -03:00
Fabio Rehm
2f88a060c9 sed -i -e 's/\[#\([0-9]\+\)\]\[\]/[#\1](https:\/\/github.com\/fgrehm\/vagrant-lxc\/issues\/\1)/g' CHANGELOG.md 2013-05-08 21:28:58 -03:00
Fabio Rehm
b749ae20ab Update CHANGELOG 2013-05-08 21:19:58 -03:00
Fabio Rehm
f191e51443 Minor tweaks to README 2013-05-08 21:17:12 -03:00
Fabio Rehm
31c0d8d1a6 Fix link to base box on readme 2013-05-08 21:12:13 -03:00
Fabio Rehm
471c0ca158 v0.3.4 2013-05-08 21:09:02 -03:00
Fabio Rehm
95ca973801 Quick and dirty fix to run acceptance specs against debian boxes 2013-05-08 21:08:00 -03:00
Fabio Rehm
b190f45f45 Remove /tmp files after machine shutdown
Fixes #68
2013-05-08 20:13:19 -03:00
Fabio Rehm
2e55585eff Allow acceptance specs to be run against different boxes 2013-05-08 19:50:00 -03:00
Fabio Rehm
b086c4a38b Fix TestUI to work with Vagrant 1.2+ 2013-05-08 19:49:12 -03:00
Fabio Rehm
5aa5803a4c Replace "hand made cache plugin" with vagrant-cachier 2013-05-08 19:48:54 -03:00
Fabio Rehm
1382f6b14f Update example vagrantfile 2013-05-08 16:40:44 -03:00
Fabio Rehm
7c1a18dc1a Disable lxc.aa_profile for debian boxes for now
I'm not able to start debian containers with that config set
2013-05-08 15:43:01 -03:00
Fabio Rehm
0e6b14643f Support squeeze box as dev machine 2013-05-08 15:42:44 -03:00
Fabio Rehm
ed46b1cdfb New boxes! 2013-05-08 15:41:38 -03:00
Fabio Rehm
aa222974eb Set the hostname on /etc/hosts for debian boxes in case it is not set
For some reason Squeeze does not add that for us
2013-05-08 15:35:12 -03:00
Fabio Rehm
ebad7b1a07 Fix paswordless sudo for squeeze boxes
Closes #63
2013-05-08 15:33:35 -03:00
Fabio Rehm
a230a48411 Force container locales to be "en_US.UTF-8" regardless of host's $LANG 2013-05-08 15:30:51 -03:00
Fabio Rehm
8a8fd73351 Minor tweaks to download scripts for debian boxes download 2013-05-08 15:25:02 -03:00
Fabio Rehm
056c492dfc "Merge" in updates from ubuntu lxc template from Ubuntu Raring 2013-05-07 18:29:18 -03:00
Fabio Rehm
3cca168248 Stop container with lxc-stop if lxc-shutdown does not succeed 2013-05-07 11:07:35 -03:00
Fabio Rehm
7a069957d7 Major development Vagrantfile cleanup + enable vagrant-cachier 2013-05-07 10:15:54 -03:00
Fabio Rehm
5a48128dcf Add vagrant-cachier 2013-05-07 10:12:54 -03:00
Fabio Rehm
80d77828d8 Set debian boxes network hwaddr
Required by failback mechanism used to fetch container ip based on dnsmasq leases
2013-05-07 01:53:54 -03:00
Fabio Rehm
70f7aeb66a New boxes! 2013-05-06 16:21:06 -03:00
Fabio Rehm
3be5fb0abd Set lxc as the default provider on dev boxes 2013-05-06 16:17:12 -03:00
Fabio Rehm
ee498a2e29 Update dependencies 2013-05-06 16:16:32 -03:00
Fabio Rehm
e02b2d7b3c Environment::DEFAULT_HOME got deprecated on Vagrant 1.2+ 2013-05-06 16:11:04 -03:00
Fabio Rehm
f2be75a45d Pass in --force-yes when installing puppet on base boxes 2013-05-06 16:09:45 -03:00
Fabio Rehm
116fd68d41 New kernel for dev boxes! 2013-05-06 16:08:37 -03:00
Fabio Rehm
de8c8982c0 Fix link to rake task for building base debian boxes 2013-05-06 12:31:31 -03:00
Fabio Rehm
582fce124e Merge pull request #70 from fgrehm/debian-boxes
Debian boxes
2013-05-06 08:23:45 -07:00
Fabio Rehm
7d5f64b14c Update debian boxes info on readme 2013-05-06 12:23:02 -03:00
Fabio Rehm
9a731ec989 Proper base box cleanup 2013-05-06 10:45:31 -03:00
Fabio Rehm
0e066e7a1c Fix ubuntu lxc template 2013-05-05 12:54:01 -03:00
Fabio Rehm
495c6f6b3e Fix task to build base boxes 2013-05-05 12:46:52 -03:00
Fabio Rehm
878b701b65 Use debian release as hostname when creating debian boxes 2013-05-05 11:27:54 -03:00
Fabio Rehm
53484d3caf Add tasks for building all boxes 2013-05-05 11:11:49 -03:00
Fabio Rehm
2df893e4f4 Remove extra parameter for ubuntu lxc-template function 2013-05-05 11:09:57 -03:00
Fabio Rehm
72b06dfa69 Disable chef installation on sid base box 2013-05-05 11:07:39 -03:00
Fabio Rehm
cb665ecdd5 Add squeeze box
Closes #63
2013-05-05 11:06:27 -03:00
Fabio Rehm
f07179e582 Clean up box packaging rake task 2013-05-05 10:57:12 -03:00
Laurent Vallar
f141443564 Copy default lxc.cgroup.devices.allow from ubuntu template 2013-05-03 23:23:33 -03:00
Laurent Vallar
32ff855968 Avoid trouble when using lxc-console 2013-05-03 23:23:23 -03:00
Laurent Vallar
f6be69286e Create boxes/temp directory if none (regression fix) 2013-05-02 09:15:26 -03:00
Fabio Rehm
5cda7ded90 Update changelog 2013-05-02 00:45:08 -03:00
Fabio Rehm
acc5f055b7 Add note about soon to come Debian base boxes 2013-05-02 00:41:48 -03:00
Fabio Rehm
2de9e88190 Disable cfg engines by default when building base boxes 2013-05-02 00:41:13 -03:00
Fabio Rehm
37cf1e4e31 Disable /tmp cleanup on start for base debian boxes
References #68
2013-05-01 22:23:00 -03:00
Fabio Rehm
06a0d66616 "Merge" in code from debian lxc template that comes with Ubuntu 13.04 2013-05-01 22:01:59 -03:00
Fabio Rehm
4759adf143 Minor clean up for debian base boxes scripts 2013-05-01 18:33:54 -03:00
Fabio Rehm
1fe6537c93 Merge branch 'add_debian_box' of https://github.com/Val/vagrant-lxc into debian-boxes 2013-04-30 22:14:08 -03:00
Fabio Rehm
c9933a3add Add note about Vagrant 1.2+ VAGRANT_DEFAULT_PROVIDER to readme 2013-04-30 22:08:13 -03:00
Fabio Rehm
9da9cb7795 Up version for development 2013-04-30 22:07:53 -03:00
Laurent Vallar
d0fb7ef750 remove localepurge 2013-04-30 18:17:09 +02:00
Laurent Vallar
4707068d25 commenting LXC networking options (configured by vagrant) 2013-04-30 17:35:21 +02:00
Laurent Vallar
6736d34a99 Remove veth name definition 2013-04-30 17:14:30 +02:00
Laurent Vallar
199012e045 Fix interface name 'vethXXXX' too long (>15) 2013-04-30 16:36:09 +02:00
Laurent Vallar
224f73e0ff Support unstable release name for sid 2013-04-30 16:35:23 +02:00
Laurent Vallar
c5a316f1ae Make possible to symlink boxes/temp 2013-04-30 15:45:27 +02:00
Laurent Vallar
f27bbbb599 Fix silent install of Babushka 2013-04-30 15:44:42 +02:00
Laurent Vallar
4487ac5751 Add CA certificates (needed for curl/wget configuration engine download after downloading) 2013-04-29 16:17:46 +02:00
Laurent Vallar
624eb05afe Fix bug bypassing following configuration engine 2013-04-29 16:16:39 +02:00
Laurent Vallar
14bd12e4ce Wrong package name for ping tool 2013-04-29 15:26:06 +02:00
Laurent Vallar
a5fd547859 Non interactive babushka install 2013-04-29 15:25:48 +02:00
Laurent Vallar
14afc0b814 Fix $LANG support 2013-04-29 11:12:55 +02:00
Laurent Vallar
7f338da734 Add ping package to test networking after build 2013-04-29 11:12:42 +02:00
Fabio Rehm
22c8934633 Shameless plug 2013-04-28 16:31:36 -03:00
Laurent Vallar
9f7f1dd315 Add Debian wheezy/sid base box templates
Refactor boxes rake task

Create common directory for common installation scripts

Move Debian/Ubuntu common installation scripts
2013-04-25 17:54:54 +02:00
Fabio Rehm
95873537e1 Add missing entry to changelog for 0.3.3 2013-04-23 08:58:15 -03:00
Fabio Rehm
a6162d712c Move installation and usage up on README.md 2013-04-23 08:30:40 -03:00
Fabio Rehm
4712aa0792 v0.3.3 2013-04-23 08:25:52 -03:00
Fabio Rehm
04826af3c9 Install nginx on acceptance spec test container instead of apache to speed things up 2013-04-23 08:25:04 -03:00
Fabio Rehm
8c884a2e8c fork + exec = spawn 2013-04-23 08:03:29 -03:00
Fabio Rehm
2807f88212 Properly kill redir child processes
Fixes #59
2013-04-23 08:00:42 -03:00
Fabio Rehm
21c998f7f1 Add failing acceptance spec for #59 2013-04-23 07:55:01 -03:00
Fabio Rehm
3e46ed3c87 Add note about removed private network support on 0.3.0 to changelog
Tks to @fpletz for pointing out
2013-04-22 20:57:31 -03:00
Fabio Rehm
76c250a89c Remove version from 'What is currently supported?' section so that we don't need to keep it up to date 2013-04-22 20:52:53 -03:00
Fabio Rehm
8bd7cc1085 Remove reference to the arch command from README 2013-04-22 20:41:41 -03:00
Fabio Rehm
0cd93e8fb8 Lots of tweaks to development boxes 2013-04-22 02:49:35 -03:00
Fabio Rehm
cf8ee170b9 Add an Ubuntu raring box so we can test lxc 0.9
Looks like it is working fine, although there's room for improvement
since we can use the output of `lxc-ls --fancy' on 0.9 to get
container's ip, but should be enough to close #54
2013-04-22 01:56:01 -03:00
Fabio Rehm
b3254ad1e2 Update reference to lxc dev box 2013-04-22 01:54:49 -03:00
Fabio Rehm
aedaeb06da Fix port forwarding for example boxes 2013-04-22 01:42:24 -03:00
Fabio Rehm
7416c2e22f Update README 2013-04-22 01:38:54 -03:00
Fabio Rehm
5cc7f76df1 Multiple example boxes 2013-04-21 23:58:54 -03:00
Fabio Rehm
e3b16db8c9 Add "require time" so that Date.today works on 1.9.3 2013-04-21 23:46:21 -03:00
Fabio Rehm
2fd3db12f0 New boxes! 2013-04-21 23:42:41 -03:00
Fabio Rehm
f46af90ec3 Add support for disabling puppet and / or chef installation when building base boxes 2013-04-21 22:56:10 -03:00
Fabio Rehm
399ac72376 Update changelog 2013-04-21 22:36:11 -03:00
Fabio Rehm
7e6df6a141 Add task for building raring 64 boxes
Closes #56
2013-04-21 22:32:40 -03:00
Fabio Rehm
637db00e87 Add task for building precise 64 boxes
Closes #57
2013-04-21 22:32:04 -03:00
Fabio Rehm
4e136452cd Remove quantal64 specific code for building base boxes 2013-04-21 22:31:15 -03:00
Fabio Rehm
098e3a633d Switch arch usage to uname -m on base ubuntu lxc template
Fixes #53
2013-04-21 22:30:03 -03:00
Fabio Rehm
b95b43fe87 Finish ubuntu box "build abstraction" 2013-04-21 22:23:49 -03:00
Fabio Rehm
1561944967 Begin to rework box packaging tasks 2013-04-21 21:31:30 -03:00
Fabio Rehm
51367454e8 Ensure curl is installed on dev machines since the precise dev box does not come with it 2013-04-21 20:34:16 -03:00
Fabio Rehm
ad5422ece4 Add a similar projects section to README 2013-04-21 19:50:41 -03:00
Fabio Rehm
60841387c5 Configure precise box to use 1.5gb ram and 2 cpus 2013-04-21 18:59:36 -03:00
Fabio Rehm
c0121f5953 Enable NFS for VBox dev machines 2013-04-21 18:59:14 -03:00
Fabio Rehm
b97c27871d Remove reference to acceptance specs from README 2013-04-21 18:55:15 -03:00
Fabio Rehm
6f2068d5ec Merge pull request #20 from fgrehm/acceptance-tests
Write some initial acceptance specs
2013-04-21 14:54:17 -07:00
Fabio Rehm
b0490c8639 Clean up sanity check code 2013-04-21 18:49:26 -03:00
Fabio Rehm
7ce99c4e99 Add not about running acceptance specs to README 2013-04-21 18:47:42 -03:00
Fabio Rehm
8c7cfd7720 Clean up acceptance specs utilities 2013-04-21 18:47:15 -03:00
Fabio Rehm
6adebb695c Move acceptance spec "utility methods" out to an example group 2013-04-21 18:38:21 -03:00
Fabio Rehm
8c8c11f07c Move Vagrant::Machine monkey patch out to a spec support file 2013-04-21 18:27:32 -03:00
Fabio Rehm
3909a26ea3 Move unit specs example group related code to spec/unit/support 2013-04-21 18:13:34 -03:00
Fabio Rehm
e86edb7087 Extract acceptance specs test ui out to a separate file 2013-04-21 18:11:10 -03:00
Fabio Rehm
a1c19371c6 Prevent running acceptance specs from outside a dev machine 2013-04-21 18:04:43 -03:00
Fabio Rehm
ae46fff7c0 Sanity check for vagrant halt and destroy 2013-04-21 17:56:37 -03:00
Fabio Rehm
c1d841271b Run unit specs only by default during development 2013-04-21 17:09:23 -03:00
Fabio Rehm
7f6713e9bb 2 failed attempts to run acceptance specs on travis, let just not worry about that for now 2013-04-21 16:58:21 -03:00
Fabio Rehm
ba19285d53 Attempt to fix travis build 2013-04-21 16:50:40 -03:00
Fabio Rehm
48a344ab8c Mark some acceptance specs as pending for now 2013-04-21 16:45:42 -03:00
Fabio Rehm
c85de745b6 Clean up Guardfile 2013-04-21 16:43:35 -03:00
Fabio Rehm
8762a2d942 Redirect redir stdout to /dev/null 2013-04-20 20:03:36 -03:00
Fabio Rehm
af8e787cb2 Add acceptance specs for provisioning and port forwarding 2013-04-20 20:02:56 -03:00
Fabio Rehm
72bbfe42de Implement initial acceptance specs 2013-04-20 19:24:50 -03:00
Fabio Rehm
99bfe0fc4a Moar boilerplate for acceptance specs 2013-04-20 19:24:01 -03:00
Fabio Rehm
89ff86121f Cache apt packages used on acceptance specs to make them run faster 2013-04-20 19:17:51 -03:00
Fabio Rehm
cd19ca4eda Improve simplecov result merging 2013-04-20 17:40:27 -03:00
Fabio Rehm
f09e722691 Basic scaffolding for acceptance specs 2013-04-20 17:07:20 -03:00
Fabio Rehm
243701a3f8 Up version for development 2013-04-20 17:01:15 -03:00
Fabio Rehm
560f945b16 v0.3.2 2013-04-18 23:03:37 -03:00
Fabio Rehm
5679158ea1 Do not display port forwarding message in case no forwarded ports where set 2013-04-18 23:02:07 -03:00
Fabio Rehm
454edec6bb Bump version 2013-04-18 23:01:10 -03:00
Fabio Rehm
895c0ad58f v0.3.1 2013-04-18 22:47:33 -03:00
Fabio Rehm
62402db802 Add release dates to changelog 2013-04-18 18:50:48 -03:00
Fabio Rehm
face7316f6 Clean up changelog link to GH issues 2013-04-18 12:38:51 -03:00
Fabio Rehm
bea5873af8 Update changelog 2013-04-18 12:38:03 -03:00
Fabio Rehm
a12391638a Change logging to match lxc "verbiage"
This should make it clear that we are dealing with LXC containers and
not VBox VMs.
2013-04-18 03:27:27 -03:00
Fabio Rehm
10914d53b0 Add our own DestroyConfirm action 2013-04-18 03:11:36 -03:00
Fabio Rehm
ecc127321f Get rid of dependency on VBox provider for displaying some messages to the user 2013-04-18 03:01:01 -03:00
Fabio Rehm
3a458df621 Add a general purpose ui "messager" / "logger" Action 2013-04-18 03:01:01 -03:00
Fabio Rehm
b5cc9c0ac3 Update README.md 2013-04-17 20:23:17 -03:00
Fabio Rehm
75503a2902 Update README.md 2013-04-15 10:54:42 -03:00
Fabio Rehm
8629e4612a Merge pull request #52 from Gonzih/master
Updated README, added info about arch command
2013-04-15 06:44:31 -07:00
Max Gonzih
012f9cda54 add info that arch command is required to README
arch command is required by lxc-template, can be added using `uname -m`
2013-04-15 12:07:54 +03:00
Fabio Rehm
1ac9c70cc6 Attempt to enable code coverage on travis 2013-04-12 18:37:38 -03:00
Fabio Rehm
6c59cd2f53 Set up coveralls 2013-04-12 18:29:03 -03:00
Fabio Rehm
e87b923b8e New kernel! 2013-04-12 02:06:34 -03:00
Fabio Rehm
6e7490f16e Remove duplicated code 2013-04-10 18:56:33 -03:00
Fabio Rehm
e10d6863e9 Up version for development 2013-04-10 18:56:17 -03:00
Fabio Rehm
5508e031b7 v0.3.0 2013-04-10 03:28:09 -03:00
Fabio Rehm
f6bf58700e Update example and development box_urls to new version 2013-04-10 03:24:19 -03:00
Fabio Rehm
27b44c1466 Update vagrant .deb link 2013-04-10 03:19:21 -03:00
Fabio Rehm
c6248e8962 Remove apt cache from example Vagrantfile 2013-04-10 03:13:11 -03:00
Fabio Rehm
f1c23aa799 Update README 2013-04-10 03:12:10 -03:00
Fabio Rehm
b9715d2304 Update changelog 2013-04-10 02:43:32 -03:00
Fabio Rehm
2e14c974d7 Redirect redir stderr to /dev/null
Closes #51
2013-04-10 02:22:19 -03:00
Fabio Rehm
a9c4745b78 Hack in support for fetching container IPs from dnsmasq leases
Closes #49
2013-04-10 02:02:38 -03:00
Fabio Rehm
e4dd0620ce Revert "Remove custom Disconnect action"
This reverts commit a8825b0b28.

I'm still having issues with SSH connections, even with 1.1.5
2013-04-10 01:37:07 -03:00
Fabio Rehm
e4c74dadd2 Support lxc templates under /usr/lib/lxc/templates
Ubuntu Precise with lxc 0.7.5 keeps things on that folder
2013-04-10 01:09:39 -03:00
Fabio Rehm
0ce7629859 Do not ignore NFS shared folders, just share them 2013-04-10 00:48:42 -03:00
Fabio Rehm
116bde9655 Remove commented out actions that we wont implement 2013-04-10 00:09:45 -03:00
Fabio Rehm
6932749ac4 Remove unused var 2013-04-10 00:07:01 -03:00
Fabio Rehm
215756aca2 Clean up driver specs a bit 2013-04-10 00:05:22 -03:00
Fabio Rehm
a700d88783 Store shared folders customizations on a local array instead of messing up with provider configs 2013-04-10 00:05:22 -03:00
Fabio Rehm
7187556b6a Remove dependency on Config object to start containers 2013-04-09 23:53:01 -03:00
Fabio Rehm
c53f9456b7 Remove duplicated Driver#rootfs_path 2013-04-09 22:12:05 -03:00
Fabio Rehm
3ab6022138 Copy and paste is evil 2013-04-09 22:06:55 -03:00
Fabio Rehm
dd5c1b1c6b Add support for reading installed lxc version from cli object 2013-04-08 22:29:06 -03:00
Fabio Rehm
fd0c863f34 Properly handle invalid boxes 2013-04-08 22:06:38 -03:00
Fabio Rehm
a8825b0b28 Remove custom Disconnect action 2013-04-08 21:12:49 -03:00
Fabio Rehm
1eb7b52da9 💣 custom machine state class 2013-04-08 20:12:05 -03:00
Fabio Rehm
d4edab4979 Fix rootfs compression
* There is no need to adjust the rootfs to include the arch parameter anymore
* Uses tar instead of bsdtar to error output
2013-04-05 22:34:15 -03:00
Fabio Rehm
ed552b6af0 Driver#name -> Driver#container_name 2013-04-05 22:28:41 -03:00
Fabio Rehm
ee9bfa4189 Config#start_opts -> Config#customize 2013-04-05 22:10:49 -03:00
Fabio Rehm
2147ec0ba5 Move away from using ifconfig to ip addr for scanning container IPs
This was required since `ifconfig` is sensitive to localization.
Fixes #50
2013-04-05 22:10:49 -03:00
Fabio Rehm
670a43da00 Remove custom network action since we are not going to support it for a while 2013-04-05 22:10:49 -03:00
Fabio Rehm
04cdd1f3db Improved box metadata handling and container creation 2013-04-05 22:10:49 -03:00
Fabio Rehm
c0a3622413 Fix driver logger name 2013-04-05 22:10:49 -03:00
Fabio Rehm
14f769ee0d Remove support for setting target rootfs path 2013-04-05 22:10:48 -03:00
Fabio Rehm
514736bdd6 Rename old container references to driver 2013-04-05 22:10:48 -03:00
Fabio Rehm
082f7dc5d3 Rename Container to Driver 2013-04-05 22:10:48 -03:00
Fabio Rehm
4ebc691bda Fix custom I18n load path 2013-04-05 22:10:48 -03:00
Fabio Rehm
71057d0e0f Lock vagrant to 1.1.5 and update guard-rspec 2013-04-05 22:10:48 -03:00
Fabio Rehm
c433465432 Remove old comment 2013-04-05 22:10:48 -03:00
Fabio Rehm
4077feaca2 Update bundle 2013-04-05 22:10:48 -03:00
Fabio Rehm
164e57695e 💣 BaseAction 2013-04-05 22:10:48 -03:00
Fabio Rehm
0ad76b753a Add locale file to load path only when the provider is required 2013-04-05 22:10:48 -03:00
Fabio Rehm
1fcdc07a3a Remove crazy TODO note 2013-04-05 22:10:48 -03:00
Fabio Rehm
5081754665 Minor tweaks to quantal64 box packaging task 2013-04-05 22:10:48 -03:00
Fabio Rehm
a72421c225 Bump box version 2013-04-05 22:10:48 -03:00
Fabio Rehm
a23d38e263 Update Container#create to use the provided rootfs tarball 2013-04-05 22:10:48 -03:00
Fabio Rehm
efdcf035c3 Update HandleBoxMetadata action to not extract the rootfs and just set its path on metadata hash 2013-04-05 22:10:48 -03:00
Fabio Rehm
d0867c3c1d Update quantal64 package task to exclude files from new rootfs path 2013-04-05 22:10:48 -03:00
Fabio Rehm
783bc1fbc0 ignore quantal64 rootfs downloaded files on vim 2013-04-05 22:10:48 -03:00
Fabio Rehm
31a514f1f5 Change quantal64 lxc template to accept a rootfs tarball 2013-04-05 22:10:47 -03:00
Fabio Rehm
2edf16f980 gitignore quantal64 downloaded files 2013-04-05 22:10:47 -03:00
Fabio Rehm
77e9a9864a Remove temp files from quantal64 rootfs after downloading it 2013-04-05 22:10:40 -03:00
Fabio Rehm
666482304d Remove container architecture from quantal64 rootfs folder when building it 2013-04-05 22:10:14 -03:00
Fabio Rehm
4ea3395872 Revert "Use ubuntu mirrors for debootstrapping"
This reverts commit 8a3c68b240 and fixes #38

Conflicts:
	boxes/quantal64/download-ubuntu
2013-04-05 22:10:13 -03:00
Fabio Rehm
8ecb88a760 Add a precise64 box so that we can test lxc 0.7.5 2013-04-05 22:10:13 -03:00
Fabio Rehm
7626cda4e6 Up version for development 2013-04-04 23:00:09 -03:00
Fabio Rehm
6c654b5908 Fix link to usage with vbox 2013-03-31 18:22:57 -03:00
Fabio Rehm
152d4197ad v0.2.0 2013-03-31 13:29:50 -03:00
Fabio Rehm
2f546bc10c Update base box references 2013-03-31 13:29:50 -03:00
Fabio Rehm
aa69226e44 Merge pull request #4 from fgrehm/box-packaging
Box packaging
2013-03-30 15:29:58 -07:00
Fabio Rehm
ead9dd4980 Add missing I18n entry used on packaging 2013-03-30 19:23:32 -03:00
Fabio Rehm
edec52f004 HACK: Redirect rootfs extraction stderr to /dev/null as repackaged containers will output a lot of stuff (but it will still work fine :) 2013-03-30 19:23:06 -03:00
Fabio Rehm
23bb2e0733 Implement provider's package action 2013-03-30 19:19:38 -03:00
Fabio Rehm
0d9d80846e Add action to setup box package files 2013-03-30 19:18:52 -03:00
Fabio Rehm
9705483b21 Add action to compress container's rootfs 2013-03-30 19:18:05 -03:00
Fabio Rehm
08a949ab82 First stab at exporting container's rootfs 2013-03-30 19:17:13 -03:00
Fabio Rehm
37173cb8ee Change metadata's vagrant-lxc-version attribute to just version as it represents the metadata version and not the gem version itself 2013-03-30 19:14:31 -03:00
Fabio Rehm
fcaf98d669 Avoid vagrant user creation on quantal64 base box in case it has already been created 2013-03-30 16:54:58 -03:00
Fabio Rehm
b54dcdc57b Remove commented out actions that we wont implement 2013-03-30 16:54:46 -03:00
Fabio Rehm
31238039a8 Vagrant's synced_folder have IDs, not names 2013-03-30 16:40:33 -03:00
Fabio Rehm
6c8f9d695a Minor tweaks to example and development vagrantfiles 2013-03-29 13:50:21 -03:00
Fabio Rehm
8bc04707fa Add links to compare view on changelog 2013-03-29 13:50:21 -03:00
Fabio Rehm
846dc40d9b Up version for development 2013-03-29 13:50:20 -03:00
Fabio Rehm
e514f00487 Add a chef-solo recipe to example to prove it works 2013-03-29 13:50:20 -03:00
Fabio Rehm
3da1d20c38 Release 0.1.1 2013-03-29 12:48:00 -03:00
Fabio Rehm
b5b7fc76e3 Merge pull request #43 from fgrehm/v0.1.1
V0.1.1
2013-03-29 08:45:57 -07:00
Fabio Rehm
57e1394e70 Update CHANGELOG 2013-03-29 12:45:07 -03:00
Fabio Rehm
a168f3f74c Update README 2013-03-29 12:39:57 -03:00
Fabio Rehm
78f8393536 Update comment reference 2013-03-29 12:31:36 -03:00
Fabio Rehm
31f60022d8 Allow setting guest ssh port from Vagrantfile 2013-03-29 12:29:24 -03:00
Fabio Rehm
306deaa0e2 Add support for configuring rootfs path
References #30
2013-03-29 12:24:39 -03:00
Fabio Rehm
c7c54457ce Remove unused constant 2013-03-29 12:21:55 -03:00
Fabio Rehm
844e6d3463 Remove lefover from arp calls. Closes #42 2013-03-29 12:20:14 -03:00
Fabio Rehm
d0f662a8c4 Skip Vagrant's built in ssh redirect 2013-03-29 03:04:53 -03:00
Fabio Rehm
976a6ebed7 Sets container name based on vagrant root path
Closes #14
2013-03-29 02:25:42 -03:00
Fabio Rehm
a33b32c164 Speed up containers creation by removing unneded rsync call from lxc-template
Was able to drop project's "/example" `vagrant up` from 42s down to 29s

Closes #40
2013-03-29 02:07:38 -03:00
Fabio Rehm
b227d1b7cb 💣 Vagrant 1.0 support for development 2013-03-28 23:52:44 -03:00
Fabio Rehm
84f79869d5 Up version for development 2013-03-28 23:52:44 -03:00
Fabio Rehm
6416febb9c Remove explicit require_plugin from example 2013-03-28 16:42:04 -03:00
Fabio Rehm
a84cb346bb Update README.md 2013-03-27 10:16:42 -03:00
Fabio Rehm
007e1f23aa Update README.md 2013-03-27 09:18:35 -03:00
Fabio Rehm
769e0af57e v0.1.0 2013-03-27 02:39:57 -03:00
Fabio Rehm
e61bd73f13 Badges anyone? 2013-03-27 02:14:59 -03:00
Fabio Rehm
086bfe5ed1 Update vagrant installation link on readme to 1.1.4 2013-03-27 02:01:43 -03:00
Fabio Rehm
ad8d8cde81 Merge pull request #39 from fgrehm/port-forwarding
Port forwarding support using redir
2013-03-26 19:49:17 -07:00
Fabio Rehm
cb83681b26 Update readme with port forwarding info 2013-03-26 23:44:31 -03:00
Fabio Rehm
dcfd7347c6 Move i18n require up to spec_helper 2013-03-26 22:14:32 -03:00
Fabio Rehm
004ad783e3 Kill redir processes on machine halt 2013-03-26 22:14:31 -03:00
Fabio Rehm
399ab86d60 Add action for clearing forwarded ports 2013-03-26 22:14:31 -03:00
Fabio Rehm
0f3b99b376 Add port forwarding middleware to containers boot action 2013-03-26 22:14:31 -03:00
Fabio Rehm
dd99c56cda First stab at port forwarding with redir 2013-03-26 22:14:31 -03:00
Fabio Rehm
e9cb7b0bfb Install redir package on dev boxes (we'll use it for port forwarding) 2013-03-26 22:14:31 -03:00
Fabio Rehm
d9df348500 Update base quantal64 box references 2013-03-26 22:13:19 -03:00
Fabio Rehm
14bde8c1bd Remove note about chef not being supported on quantal64 box 2013-03-26 22:11:02 -03:00
Fabio Rehm
cc069a5caa Clean up quantal64 rootfs after building box 2013-03-26 22:05:41 -03:00
Fabio Rehm
b63ed73521 Install man-db and psmisc on base quantal64 box 2013-03-26 22:05:20 -03:00
Fabio Rehm
75e0502b1a Installs chef on base quantal64 box
Closes #37
2013-03-26 22:03:56 -03:00
Fabio Rehm
bdb8150a06 Install puppet 3.1.1 on base quantal64 box 2013-03-26 22:03:31 -03:00
Fabio Rehm
b4eb38e551 Update LXC::Action TODOs 2013-03-26 22:00:30 -03:00
Fabio Rehm
58ff80dfdd Prevent exec and fork on unit specs 2013-03-26 21:59:25 -03:00
Fabio Rehm
8e7c5b2e83 Eager loads plugin files in case we need to verify constant names on specs 2013-03-26 21:59:03 -03:00
Fabio Rehm
dc2d8f8572 Caches gem tarballs on dev boxes 2013-03-26 21:57:47 -03:00
Fabio Rehm
185b47dfc7 Change vagrant box provisioning to use 2 cpus 2013-03-26 21:56:52 -03:00
Fabio Rehm
0f0845b7d1 Add note about not checking if required dependencies are installed 2013-03-26 21:55:29 -03:00
Fabio Rehm
a6da7978ad Add Vagrant's require_plugin to README example 2013-03-26 21:53:28 -03:00
Fabio Rehm
0e6a00d8b7 Update dependencies 2013-03-26 17:29:35 -03:00
Fabio Rehm
59d9c3c892 Remove old comment 2013-03-25 20:32:42 -03:00
Fabio Rehm
e6f4c93e9c Up version for development 2013-03-19 11:33:27 -03:00
91 changed files with 4363 additions and 2424 deletions

6
.gitignore vendored
View file

@ -19,11 +19,13 @@ doc/
/tags
/gems.tags
/Gemfile.lock
.vagrant
/cache
/boxes/**/*.tar.gz
/boxes/quantal64/rootfs-amd64/
/boxes/**/partial/
/boxes/**/rootfs/
/boxes/temp/
/boxes/output/
/development/Vagrantfile

View file

@ -1,8 +1,10 @@
language: ruby
rvm:
- 1.9.3
- 2.0.0
matrix:
allow_failures:
- rvm: 2.0.0
- 2.2
- 2.3
- 2.4
- 2.5
install:
- gem install -v 1.12.5 bundler
- bundle _1.12.5_ install --jobs=3 --retry=3
script: "bundle exec rake ci"

2
.vimrc
View file

@ -1 +1 @@
set wildignore+=*/vagrant-1.1/*
set wildignore+=*/boxes/*/rootfs/*,*/boxes/*/partial/*

47
BOXES.md Normal file
View file

@ -0,0 +1,47 @@
# vagrant-lxc base boxes
Although the official documentation says it is only supported for VirtualBox
environments, you can use the [`vagrant package`](http://docs.vagrantup.com/v2/cli/package.html)
command to export a `.box` file from an existing vagrant-lxc container.
There is also a set of [bash scripts](https://github.com/fgrehm/vagrant-lxc-base-boxes)
that you can use to build base boxes as needed. By default it won't include any
provisioning tool and you can pick the ones you want by providing some environment
variables. Please refer to the [base boxes repository](https://github.com/fgrehm/vagrant-lxc-base-boxes)
for more information.
## "Anatomy" of a box
If you need to go deeper and build your scripts from scratch or if you are interested
on knowing what makes a base box for vagrant-lxc, here's what's needed:
### Expected `.box` contents
| FILE | REQUIRED? | DESCRIPTION |
| --- | --- | --- |
| `metadata.json` | Yes | Required by Vagrant |
| `rootfs.tar.gz` | Yes | Compressed container rootfs tarball (need to remeber to pass in `--numeric-owner` when creating it) |
| `lxc-template` | No, a ["generic script"](scripts/lxc-template) is provided by the plugin if it doesn't exist on the base box | Script responsible for creating and setting up the container (used with `lxc-create`). |
| `lxc-config` | No | Box specific configuration to be _appended_ to the system's generated container config file |
| `lxc.conf` | No | File passed in to `lxc-create -f` |
### metadata.json
```json
{
"provider": "lxc",
"version": "1.0.0",
"built-on": "Sat Sep 21 21:10:00 UTC 2013",
"template-opts": {
"--arch": "amd64",
"--release": "quantal"
}
}
```
| KEY | REQUIRED? | DESCRIPTION |
| --- | --- | --- |
| `provider` | Yes | Required by Vagrant |
| `version` | Yes | Tracks backward incompatibilities |
| `built-on` | No | Date / time when the box was packaged for the first time |
| `template-opts` | No | Extra options to be passed to the `lxc-template` script |

523
CHANGELOG.md Normal file
View file

@ -0,0 +1,523 @@
## [1.4.2](https://github.com/fgrehm/vagrant-lxc/compare/v1.4.1...v1.4.2) (Jul 17, 2018)
FIXES:
- Fix problems with `redir` 3.x command line. [[GH-467]]
## [1.4.1](https://github.com/fgrehm/vagrant-lxc/compare/v1.4.0...v1.4.1) (Apr 30, 2018)
FEATURES:
- Add support for LXC v3.0
- Add support for `redir` 3.x command line. [[GH-460]]
[GH-460]: https://github.com/fgrehm/vagrant-lxc/issues/460
## [1.4.0](https://github.com/fgrehm/vagrant-lxc/compare/v1.3.1...v1.4.0) (Mar 04, 2018)
FEATURES:
- Add support for unprivileged containers. [[GH-312]]
[GH-312]: https://github.com/fgrehm/vagrant-lxc/issues/312
## [1.3.1](https://github.com/fgrehm/vagrant-lxc/compare/v1.3.0...v1.3.1) (Fev 06, 2018)
FIXES:
- Fix problems with `tmpfs` fiddling in v1.3.0. [[GH-455]]
[GH-455]: https://github.com/fgrehm/vagrant-lxc/pull/455
## [1.3.0](https://github.com/fgrehm/vagrant-lxc/compare/v1.2.4...v1.3.0) (Jan 20, 2018)
FEATURES:
- lxc-template: make runnable by unprivileged users [[GH-447]]
- Use `lxc-info` instead of `lxc-attach` to retrieve container IP
- Add support for LXC v2.1+ [[GH-445]]
- Remove 2Gb limitation on `/tmp`. [[GH-406]]
OTHERS:
- Bump Vagrant requirements to v1.8+
- Bump LXC requirements to v1.0+
[GH-447]: https://github.com/fgrehm/vagrant-lxc/pull/447
[GH-445]: https://github.com/fgrehm/vagrant-lxc/pull/445
[GH-406]: https://github.com/fgrehm/vagrant-lxc/pull/406
## [1.2.4](https://github.com/fgrehm/vagrant-lxc/compare/v1.2.3...v1.2.4) (Dec 20, 2017)
BUGFIX:
- Support alternative `lxcpath` [[GH-413]]
- Update `pipework` regexp in sudo wrapper for Vagrant 1.9+ [[GH-438]]
- Work around restrictive `umask` values [[GH-435]]
- Make `--config` in `lxc-template` optional [[GH-421]]
- Fix sudo wrapper binpath construction logic [[GH-410]]
- Fix bug causing CTRL-C on `vagrant up` to destroy the VM [[GH-449]]
[GH-413]: https://github.com/fgrehm/vagrant-lxc/pull/413
[GH-438]: https://github.com/fgrehm/vagrant-lxc/pull/438
[GH-435]: https://github.com/fgrehm/vagrant-lxc/pull/435
[GH-421]: https://github.com/fgrehm/vagrant-lxc/pull/421
[GH-410]: https://github.com/fgrehm/vagrant-lxc/pull/410
[GH-449]: https://github.com/fgrehm/vagrant-lxc/pull/449
## [1.2.3](https://github.com/fgrehm/vagrant-lxc/compare/v1.2.2...v1.2.3) (Dec 20, 2016)
- Fix bug in Gemfile.lock
## [1.2.2](https://github.com/fgrehm/vagrant-lxc/compare/v1.2.1...v1.2.2) (Dec 20, 2016)
BUGFIX:
- Make the timeout for fetching container IP's configurable [[GH-426]]
- Load locale file only once [[GH-423]]
- Preserve xattrs in container filesystems [[GH-411]]
- Forward port latest pipework script [[GH-408]]
- Fix handling of non-fatal lxc-stop return code [[GH-405]]
[GH-426]: https://github.com/fgrehm/vagrant-lxc/pull/426
[GH-423]: https://github.com/fgrehm/vagrant-lxc/pull/423
[GH-411]: https://github.com/fgrehm/vagrant-lxc/pull/411
[GH-408]: https://github.com/fgrehm/vagrant-lxc/pull/408
[GH-405]: https://github.com/fgrehm/vagrant-lxc/pull/405
## [1.2.1](https://github.com/fgrehm/vagrant-lxc/compare/v1.2.0...v1.2.1) (Sep 24, 2015)
BUGFIX:
- Fix sudo Wrapper [[GH-393]]
[GH-393]: https://github.com/fgrehm/vagrant-lxc/pull/393
## [1.2.0](https://github.com/fgrehm/vagrant-lxc/compare/v1.1.0...v1.2.0) (Sep 15, 2015)
FEATURES:
- Support private networking using DHCP [[GH-352]]
[GH-352]: https://github.com/fgrehm/vagrant-lxc/pull/352
IMPROVEMENTS:
- Move mountpoint creation to lxc template for lvm rootfs support [[GH-361]] / [[GH-359]]
- Mount selinux sys dir read-only [[GH-357]] / [[GH-301]]
- Use correct ruby interpreter when generating sudoers file [[GH-355]]
- Fix shebangs to be more portable [[GH-376]]
- Fix removal of lxcbr0/virbr0 when using private networking [[GH-383]]
- Improve /tmp handling by using tmpfs [[GH-362]]
[GH-301]: https://github.com/fgrehm/vagrant-lxc/issues/301
[GH-355]: https://github.com/fgrehm/vagrant-lxc/pull/355
[GH-357]: https://github.com/fgrehm/vagrant-lxc/pull/357
[GH-359]: https://github.com/fgrehm/vagrant-lxc/issues/359
[GH-361]: https://github.com/fgrehm/vagrant-lxc/pull/361
[GH-376]: https://github.com/fgrehm/vagrant-lxc/pull/376
[GH-383]: https://github.com/fgrehm/vagrant-lxc/pull/383
[GH-362]: https://github.com/fgrehm/vagrant-lxc/pull/362
## [1.1.0](https://github.com/fgrehm/vagrant-lxc/compare/v1.0.1...v1.1.0) (Jan 14, 2015)
BACKWARDS INCOMPATIBILITIES:
- Support for Vagrant versions prior to 1.5 have been removed. The plugin now targets
Vagrant 1.7+ but it _might_ work on 1.5+.
FEATURES:
- New experimental support for private networking [[GH-298]] / [[GH-120]].
- Support for formatted overlayfs path [[GH-329]]
[GH-298]: https://github.com/fgrehm/vagrant-lxc/pull/298
[GH-120]: https://github.com/fgrehm/vagrant-lxc/issues/120
[GH-329]: https://github.com/fgrehm/vagrant-lxc/pull/329
IMPROVEMENTS:
- The provider will now have a higher priority over the VirtualBox provider
in case VirtualBox is installed alongside lxc dependecies.
- Show an user friendly message when trying to use the plugin on non-Linux
environments.
BUG FIXES:
- Allow backingstore options to be used along with the sudo wrapper script [[GH-310]]
- Trim automatically generated container names to 64 chars [[GH-337]]
[GH-337]: https://github.com/fgrehm/vagrant-lxc/issues/337
[GH-310]: https://github.com/fgrehm/vagrant-lxc/issues/310
## [1.0.1](https://github.com/fgrehm/vagrant-lxc/compare/v1.0.0...v1.0.1) (Oct 15, 2014)
IMPROVEMENTS:
- Avoid lock race condition when fetching container's IP [[GH-318]] and SSH execution [[GH-321]]
- Support for custom containers storage path by reading `lxc.lxcpath` [[GH-317]]
[GH-317]: https://github.com/fgrehm/vagrant-lxc/pull/317
[GH-318]: https://github.com/fgrehm/vagrant-lxc/pull/318
[GH-321]: https://github.com/fgrehm/vagrant-lxc/issues/321
## [1.0.0](https://github.com/fgrehm/vagrant-lxc/compare/v1.0.0.alpha.3...v1.0.0) (Sep 23, 2014)
DEPRECATIONS:
- Support to **all Vagrant versions prior to 1.5 are deprecated**, there is a
[small layer](lib/vagrant-backports) that ensures compatibility with versions
starting with 1.1.5 that will be removed on a future release.
- Official base boxes that were made available from http://bit.ly are no longer
supported and were removed from @fgrehm's Dropbox, please upgrade your Vagrant
and vagrant-lxc installation and use a base box from [VagrantCloud](https://vagrantcloud.com/search?provider=lxc)
BACKWARDS INCOMPATIBILITIES:
- Remove plugin version from config file name generated by the `vagrant lxc sudoers`
command. Manual removal of `/usr/local/bin/vagrant-lxc-wrapper-*` / `/etc/sudoers.d/vagrant-lxc-*`
files are required.
IMPROVEMENTS:
- `vagrant-mounted` upstart event is now emited on containers that support it [[GH-302]]
- Add support for specifying the `--strip-parameters` used by the [default template](scripts/lxc-template)
when extracting rootfs tarballs [[GH-311]]
[GH-302]: https://github.com/fgrehm/vagrant-lxc/issues/302
BUG FIXES:
- Check for outdated base boxes when starting containers [[GH-314]]
[GH-311]: https://github.com/fgrehm/vagrant-lxc/pull/311
[GH-314]: https://github.com/fgrehm/vagrant-lxc/pull/314
## [1.0.0.alpha.3](https://github.com/fgrehm/vagrant-lxc/compare/v1.0.0.alpha.2...v1.0.0.alpha.3) (Aug 9, 2014)
IMPROVEMENTS:
- Remove `lxc-shutdown` usage in favor of Vagrant's built in graceful halt
- Add fallback mechanism for platforms without `lxc-attach` support [[GH-294]]
[GH-294]: https://github.com/fgrehm/vagrant-lxc/pull/294
BUG FIXES:
- Figure out the real executable paths for whitelisted commands on the sudo
wrapper script instead of hardcoding Ubuntu paths [[GH-304]] / [[GH-305]]
- Attach to containers using the `MOUNT` namespace when attempting to fetch
container's IP [[GH-300]]
- Escape space characters for synced folders [[GH-291]]
- Use Vagrant's ruby on the sudoers file so that it works on systems that don't
have a global ruby installation [[GH-289]]
[GH-304]: https://github.com/fgrehm/vagrant-lxc/issues/304
[GH-305]: https://github.com/fgrehm/vagrant-lxc/issues/305
[GH-300]: https://github.com/fgrehm/vagrant-lxc/issues/300
[GH-291]: https://github.com/fgrehm/vagrant-lxc/issues/291
[GH-289]: https://github.com/fgrehm/vagrant-lxc/issues/289
## [1.0.0.alpha.2](https://github.com/fgrehm/vagrant-lxc/compare/v1.0.0.alpha.1...v1.0.0.alpha.2) (May 13, 2014)
BACKWARDS INCOMPATIBILITIES:
- The `sudo_wrapper` provider configuration was removed in favor of using the
secure wrapper generated by `vagrant lxc sudoers` [[GH-272]]
- Support for specifying backingstore parameters from `Vagrantfile`s for `lxc-create`
was added and it defaults to the `best` option. On older lxc versions that does not
support that value, it needs to be set to `none`.
FEATURES:
- Add support for specifying backingstore parameters from `Vagrantfile`s [[GH-277]]
IMPROVEMENTS:
- Make `dnsmasq` leases MAC address regex check case insensitive [[GH-283]]
- Use relative paths for `lxc.mount.entry` to avoid issues with `lxc-clone` [[GH-258]].
- Sort synced folders when mounting [[GH-271]]
- Privileged ports can now be forwarded with `sudo` [[GH-259]]
- The `vagrant lxc sudoers` generated sudoers configuration and wrapper script
are safer and properly whitelists the commands required by vagrant-lxc to run.
[[GH-272]] / [[GH-269]]
BUG FIXES:
- Fix `lxc-create` issues with pre 1.0.0 versions [[GH-282]]
[GH-283]: https://github.com/fgrehm/vagrant-lxc/pull/283
[GH-282]: https://github.com/fgrehm/vagrant-lxc/pull/282
[GH-269]: https://github.com/fgrehm/vagrant-lxc/issues/269
[GH-272]: https://github.com/fgrehm/vagrant-lxc/pull/272
[GH-259]: https://github.com/fgrehm/vagrant-lxc/pull/259
[GH-271]: https://github.com/fgrehm/vagrant-lxc/pull/271
[GH-277]: https://github.com/fgrehm/vagrant-lxc/pull/277
[GH-258]: https://github.com/fgrehm/vagrant-lxc/issues/258
## [1.0.0.alpha.1](https://github.com/fgrehm/vagrant-lxc/compare/v0.8.0...v1.0.0.alpha.1) (Apr 06, 2014)
DEPRECATIONS:
- Support to **all Vagrant versions prior to 1.5 are now deprecated**, there is a
[small layer](lib/vagrant-backports) that ensures compatibility with versions
starting with 1.1.5 but there is no guarantee that it will stick for too long.
- Boxes released prior to this version are now deprecated and won't be available
after the final 1.0.0 release.
- `--auth-key` argument is no longer provided to `lxc-template`. This will cause
all official base boxes prior to 09/28/2013 to break.
FEATURES:
- New `vagrant lxc sudoers` command for creating a policy for users in order to
avoid `sudo` passwords [[GH-237]] / [[GH-257]]
- Support for NFS and rsync synced folders.
- Support for synced folder mount options allowing for using read only synced
folders [[GH-193]]
[GH-237]: https://github.com/fgrehm/vagrant-lxc/issues/237
[GH-257]: https://github.com/fgrehm/vagrant-lxc/pull/257
[GH-193]: https://github.com/fgrehm/vagrant-lxc/issues/193
IMPROVEMENTS:
- `lxc-template` is now optional for base boxes and are bundled with the plugin,
allowing us to roll out updates without the need to rebuild boxes [[GH-254]]
- Set container's `utsname` to `config.vm.hostname` by default [[GH-253]]
- Added libvirt dnsmasq leases file to the lookup paths [[GH-251]]
- Improved compatibility with Vagrant 1.4 / 1.5 including the ability
to use `rsync` and `nfs` shared folders to work around synced folders
permission problems. More information can be found on the following
issues: [[GH-151]] [[GH-191]] [[GH-241]] [[GH-242]]
- Warn in case `:group` or `:owner` are specified for synced folders [[GH-196]]
- Acceptance specs are now powered by `vagrant-spec` [[GH-213]]
- Base boxes creation scripts were moved out to https://github.com/fgrehm/vagrant-lxc-base-boxes.
[GH-254]: https://github.com/fgrehm/vagrant-lxc/issues/254
[GH-196]: https://github.com/fgrehm/vagrant-lxc/issues/196
[GH-251]: https://github.com/fgrehm/vagrant-lxc/pull/251
[GH-253]: https://github.com/fgrehm/vagrant-lxc/pull/253
[GH-151]: https://github.com/fgrehm/vagrant-lxc/issues/151
[GH-213]: https://github.com/fgrehm/vagrant-lxc/issues/213
[GH-191]: https://github.com/fgrehm/vagrant-lxc/issues/191
[GH-241]: https://github.com/fgrehm/vagrant-lxc/issues/241
[GH-242]: https://github.com/fgrehm/vagrant-lxc/issues/242
## [0.8.0](https://github.com/fgrehm/vagrant-lxc/compare/v0.7.0...v0.8.0) (Feb 26, 2014)
FEATURES:
- Support for naming containers from Vagrantfiles [#132](https://github.com/fgrehm/vagrant-lxc/issues/132)
IMPROVEMENTS:
- Use a safer random name for containers [#152](https://github.com/fgrehm/vagrant-lxc/issues/152)
- Improve Ubuntu 13.10 compatibility [#190](https://github.com/fgrehm/vagrant-lxc/pull/190) / [#197](https://github.com/fgrehm/vagrant-lxc/pull/197)
- Improved mac address detection from lxc configs [#226](https://github.com/fgrehm/vagrant-lxc/pull/226)
BUG FIXES:
- Properly detect if lxc is installed on hosts that do not have `lxc-version` on their paths [#186](https://github.com/fgrehm/vagrant-lxc/issues/186)
## [0.7.0](https://github.com/fgrehm/vagrant-lxc/compare/v0.6.4...v0.7.0) (Nov 8, 2013)
IMPROVEMENTS:
- Support for `vagrant up` in parallel [#152](https://github.com/fgrehm/vagrant-lxc/issues/152)
- Warn users about unsupported private / public networking configs [#154](https://github.com/fgrehm/vagrant-lxc/issues/154)
- Respect Vagrantfile options to disable forwarded port [#149](https://github.com/fgrehm/vagrant-lxc/issues/149)
BUG FIXES:
- Nicely handle blank strings provided to `:host_ip` when specifying forwarded ports [#170](https://github.com/fgrehm/vagrant-lxc/issues/170)
- Fix "Permission denied" when starting/destroying containers after lxc
security update in Ubuntu [#180](https://github.com/fgrehm/vagrant-lxc/issues/180)
- Fix `vagrant package` [#172](https://github.com/fgrehm/vagrant-lxc/issues/172)
## [0.6.4](https://github.com/fgrehm/vagrant-lxc/compare/v0.6.3...v0.6.4) (Oct 27, 2013)
FEATURES:
- New script for building OpenMandriva base boxes [#167](https://github.com/fgrehm/vagrant-lxc/issues/167)
IMPROVEMENTS:
- Make `lxc-template` compatible with Ubuntu 13.10 [#150](https://github.com/fgrehm/vagrant-lxc/issues/150)
BUG FIXES:
- Fix force halt for hosts that do not have `lxc-shutdown` around (like Ubuntu 13.10) [#150](https://github.com/fgrehm/vagrant-lxc/issues/150)
## [0.6.3](https://github.com/fgrehm/vagrant-lxc/compare/v0.6.2...v0.6.3) (Oct 12, 2013)
IMPROVEMENTS:
- Respect Vagrantfile option to disable synced folders [#147](https://github.com/fgrehm/vagrant-lxc/issues/147)
BUG FIXES:
- Fix error raised when fetching container's IP with the sudo wrapper disabled [#157](https://github.com/fgrehm/vagrant-lxc/issues/157)
## [0.6.2](https://github.com/fgrehm/vagrant-lxc/compare/v0.6.1...v0.6.2) (Oct 03, 2013)
IMPROVEMENTS:
- Cache the result of `lxc-attach --namespaces` parameter support checking to
avoid excessive logging.
BUG FIXES:
- Fix detection of `lxc-attach --namespaces` parameter support checking.
## [0.6.1](https://github.com/fgrehm/vagrant-lxc/compare/v0.6.0...v0.6.1) (Oct 03, 2013)
IMPROVEMENTS:
- Fall back to `dnsmasq` leases file if not able to fetch IP with `lxc-attach` [#118](https://github.com/fgrehm/vagrant-lxc/issues/118)
- Make sure lxc templates are executable prior to `lxc-create` [#128](https://github.com/fgrehm/vagrant-lxc/issues/128)
- New base boxes with support for lxc 1.0+
BUG FIXES:
- Fix various issues related to detecting whether the container is running
and is "SSHable" [#142](https://github.com/fgrehm/vagrant-lxc/issues/142)
- Nicely handle missing templates path [#139](https://github.com/fgrehm/vagrant-lxc/issues/139)
## [0.6.0](https://github.com/fgrehm/vagrant-lxc/compare/v0.5.0...v0.6.0) (Sep 12, 2013)
IMPROVEMENTS:
- Compatibility with Vagrant 1.3+ [#136](https://github.com/fgrehm/vagrant-lxc/pull/136)
- Set plugin name to `vagrant-lxc` so that it is easier to check if the plugin is
installed with the newly added `Vagrant.has_plugin?`
BUG FIXES:
- Fix box package ownership on `vagrant package` [#140](https://github.com/fgrehm/vagrant-lxc/pull/140)
- Fix error while compressing container's rootfs under Debian hosts [#131](https://github.com/fgrehm/vagrant-lxc/issues/131) /
[#133](https://github.com/fgrehm/vagrant-lxc/issues/133)
## [0.5.0](https://github.com/fgrehm/vagrant-lxc/compare/v0.4.0...v0.5.0) (Aug 1, 2013)
BACKWARDS INCOMPATIBILITIES:
- To align with Vagrant's core behaviour, forwarded ports are no longer attached
to 127.0.0.1 and `redir`'s `--laddr` parameter is skipped in case the `:host_ip`
config is not provided, that means `redir` will listen on connections coming
from any of the host's IPs.
FEATURES:
- Add support for salt-minion and add latest dev release for ubuntu codenamed saucy [#116](https://github.com/fgrehm/vagrant-lxc/pull/116)
- Add support for using a sudo wrapper script [#90](https://github.com/fgrehm/vagrant-lxc/issues/90)
- `redir` will log to `/var/log/syslog` if `REDIR_LOG` env var is provided
IMPROVEMENTS:
- Error out if dependencies are not installed [#11](https://github.com/fgrehm/vagrant-lxc/issues/11) / [#112](https://github.com/fgrehm/vagrant-lxc/issues/112)
- Support for specifying host interface/ip for binding `redir` [#76](https://github.com/fgrehm/vagrant-lxc/issues/76)
- Add Vagrantfile VM name to the container name [#115](https://github.com/fgrehm/vagrant-lxc/issues/115)
- Properly handle forwarded port collisions [#5](https://github.com/fgrehm/vagrant-lxc/issues/5)
- Container's customizations are now written to the config file (usually
kept under `/var/lib/lxc/CONTAINER/config`) instead of passed in as a `-s`
parameter to `lxc-start`
## [0.4.0](https://github.com/fgrehm/vagrant-lxc/compare/v0.3.4...v0.4.0) (Jul 18, 2013)
FEATURES:
- New box format [#89](https://github.com/fgrehm/vagrant-lxc/issues/89)
BUG FIXES:
- Add translation for stopped status [#97](https://github.com/fgrehm/vagrant-lxc/issues/97)
- Enable retries when fetching container state [#74](https://github.com/fgrehm/vagrant-lxc/issues/74)
- Fix error when setting Debian boxes hostname from Vagrantfile [#91](https://github.com/fgrehm/vagrant-lxc/issues/91)
- BTRFS-friendly base boxes [#81](https://github.com/fgrehm/vagrant-lxc/issues/81)
- Extended templates path lookup [#77](https://github.com/fgrehm/vagrant-lxc/issues/77) (tks to @aries1980)
- Fix default group for packaged boxes tarballs on the rake task [#82](https://github.com/fgrehm/vagrant-lxc/issues/82) (tks to @cduez)
## [0.3.4](https://github.com/fgrehm/vagrant-lxc/compare/v0.3.3...v0.3.4) (May 08, 2013)
FEATURES:
- Support for building Debian boxes (tks to @Val)
- Support for installing babushka on base boxes (tks to @Val)
IMPROVEMENTS:
- Replace `lxc-wait` usage with a "[retry mechanism](https://github.com/fgrehm/vagrant-lxc/commit/3cca16824879731315dac32bc2df1c643f30d461#L2R88)" [#22](https://github.com/fgrehm/vagrant-lxc/issues/22)
- Remove `/tmp` files after the machine has been successfully shut down [#68](https://github.com/fgrehm/vagrant-lxc/issues/68)
- Clean up base boxes files after they've been configured, resulting in smaller packages
- Bump development dependency to Vagrant 1.2+ series
BUG FIXES:
- Issue a `lxc-stop` in case the container cannot shutdown gracefully [#72](https://github.com/fgrehm/vagrant-lxc/issues/72)
## [0.3.3](https://github.com/fgrehm/vagrant-lxc/compare/v0.3.2...v0.3.3) (April 23, 2013)
BUG FIXES:
- Properly kill `redir` child processes [#59](https://github.com/fgrehm/vagrant-lxc/issues/59)
- Use `uname -m` on base Ubuntu lxc-template [#53](https://github.com/fgrehm/vagrant-lxc/issues/53)
IMPROVEMENTS:
- Initial acceptance test suite
- New rake tasks for building Ubuntu precise and raring base amd64 boxes
## [0.3.2](https://github.com/fgrehm/vagrant-lxc/compare/v0.3.1...v0.3.2) (April 18, 2013)
- Do not display port forwarding message in case no forwarded ports were set
## [0.3.1](https://github.com/fgrehm/vagrant-lxc/compare/v0.3.0...v0.3.1) (April 18, 2013)
- Improved output to match lxc "verbiage"
## [0.3.0](https://github.com/fgrehm/vagrant-lxc/compare/v0.2.0...v0.3.0) (April 10, 2013)
BACKWARDS INCOMPATIBILITIES:
- Boxes `lxc-template` should support a `--tarball` parameter
- `start_opts` config was renamed to `customize`, please check the README for the expected parameters
- V1 boxes are no longer supported
- `target_rootfs_path` is no longer supported, just symlink `/var/lib/lxc` to the desired folder in case you want to point it to another partition
- Removed support for configuring private networks. It will come back at some point in the future but if you need it you should be able to set using `customize 'network.ipv4', '1.2.3.4/24'`
IMPROVEMENTS:
- lxc templates are removed from lxc template dir after container is created
- Treat NFS shared folders as a normal shared folder instead of ignoring it so we can share the same Vagrantfile with VBox environments
- Support for lxc 0.7.5 (tested on Ubuntu 12.04) [#49](https://github.com/fgrehm/vagrant-lxc/issues/49)
- Remove `/tmp` files when packaging quantal64 base box [#48](https://github.com/fgrehm/vagrant-lxc/issues/48)
- Avoid picking the best mirror on quantal64 base box [#38](https://github.com/fgrehm/vagrant-lxc/issues/38)
BUG FIXES:
- Redirect `redir`'s stderr output to `/dev/null` [#51](https://github.com/fgrehm/vagrant-lxc/issues/51)
- Switch from `ifconfig` to `ip` to grab container's IP to avoid localization issues [#50](https://github.com/fgrehm/vagrant-lxc/issues/50)
## [0.2.0](https://github.com/fgrehm/vagrant-lxc/compare/v0.1.1...v0.2.0) (March 30, 2013)
- Experimental box packaging (only tested with Ubuntu 64 base box)
## [0.1.1](https://github.com/fgrehm/vagrant-lxc/compare/v0.1.0...v0.1.1) (March 29, 2013)
- Removed support for development under Vagrant < 1.1
- Removed rsync from base quantal64 box to speed up containers creation [#40](https://github.com/fgrehm/vagrant-lxc/issues/40)
- Containers are now named after project's root dir [#14](https://github.com/fgrehm/vagrant-lxc/issues/14)
- Skip Vagrant's built in SSH redirect
- Allow setting rootfs from Vagrantfile [#30](https://github.com/fgrehm/vagrant-lxc/issues/30)
## [0.1.0](https://github.com/fgrehm/vagrant-lxc/compare/v0.0.3...v0.1.0) (March 27, 2013)
- Support for chef added to base quantal64 box
- Puppet upgraded to 3.1.1 on base quantal64 box
- Port forwarding support added [#6](https://github.com/fgrehm/vagrant-lxc/issues/6)
## Previous
The changelog began with version 0.1.0 so any changes prior to that
can be seen by checking the tagged releases and reading git commit
messages.

24
CONTRIBUTING.md Normal file
View file

@ -0,0 +1,24 @@
### Please read before contributing
* If you have an issue with base boxes, please create it on https://github.com/fgrehm/vagrant-lxc-base-boxes,
this repository is for the Vagrant plugin only.
* Try not to post questions in the issues tracker. I will probably answer you
but I'll most likely close the issue right away and will continue the discussion
with the issue closed. If you have any questions about the plugin, make sure
you go through the [Wiki](https://github.com/fgrehm/vagrant-lxc/wiki) pages
first (specially the [Troubleshooting Section](https://github.com/fgrehm/vagrant-lxc/wiki/Troubleshooting))
and if you still need answers please ask a question on [Stack Overflow](http://stackoverflow.com/questions/tagged/vagrant-lxc)
using the `vagrant` / `lxc` tag on it so that I get notified :)
* Please do a search on the issues tracker before submitting your issue to
check if it was already reported / fixed.
* When reporting a bug, please include **all** information that you can get
about your environment. Things like vagrant / vagrant-lxc / kernel / lxc /
distro versions, the list of plugins you have installed, a [gist](https://gist.github.com/)
with the output of running `VAGRANT_LOG=debug vagrant COMMAND`, the `Vagrantfile`
you are using and / or base box URL are really useful when tracking down what's
going on on your side of the globe and will get bonus points :)
Thanks!

25
Gemfile
View file

@ -1,24 +1,23 @@
source 'https://rubygems.org'
gemspec
group :development do
# We depend on Vagrant for development, but we don't add it as a
# gem dependency because we expect to be installed within the
# Vagrant environment itself using `vagrant plugin`.
gem 'vagrant', git: 'https://github.com/mitchellh/vagrant.git'
gem 'guard'
gem 'guard-rspec'
gem 'guard-bundler'
gem 'guard-ctags-bundler'
gem 'rb-inotify'
gem 'simplecov', require: false
end
group :development, :test do
gem 'rake'
gem 'rspec'
gem 'rspec-fire', require: 'rspec/fire'
gem 'rspec-spies', require: false
gem 'rake', '~> 10.4.2'
gem 'rspec', '~> 3.5.0'
gem 'coveralls', '~> 0.7.2', require: (ENV['COVERAGE'] == 'true')
gem 'vagrant-spec', git: 'https://github.com/mitchellh/vagrant-spec.git'
end
group :plugins do
acceptance = (ENV['ACCEPTANCE'] == 'true')
gem 'vagrant-cachier', git: 'https://github.com/fgrehm/vagrant-cachier.git', require: !acceptance
gem 'vagrant-pristine', git: 'https://github.com/fgrehm/vagrant-pristine.git', require: !acceptance
gem 'vagrant-omnibus', require: !acceptance
gemspec
end

View file

@ -1,94 +0,0 @@
GIT
remote: https://github.com/mitchellh/vagrant.git
revision: 327ca544efdd6a0d0988509152a369fdb09c904d
specs:
vagrant (1.1.1.dev)
childprocess (~> 0.3.7)
erubis (~> 2.7.0)
i18n (~> 0.6.0)
json (>= 1.5.1, < 1.8.0)
log4r (~> 1.1.9)
net-scp (~> 1.0.4)
net-ssh (~> 2.2.2)
PATH
remote: .
specs:
vagrant-lxc (0.0.3.dev)
GEM
remote: https://rubygems.org/
specs:
childprocess (0.3.9)
ffi (~> 1.0, >= 1.0.11)
coderay (1.0.9)
diff-lcs (1.2.1)
erubis (2.7.0)
ffi (1.4.0)
guard (1.6.2)
listen (>= 0.6.0)
lumberjack (>= 1.0.2)
pry (>= 0.9.10)
terminal-table (>= 1.4.3)
thor (>= 0.14.6)
guard-bundler (1.0.0)
bundler (~> 1.0)
guard (~> 1.1)
guard-ctags-bundler (0.1.6)
guard (>= 1.1)
guard-rspec (2.5.0)
guard (>= 1.1)
rspec (~> 2.11)
i18n (0.6.4)
json (1.7.7)
listen (0.7.3)
log4r (1.1.10)
lumberjack (1.0.2)
method_source (0.8.1)
multi_json (1.6.1)
net-scp (1.0.4)
net-ssh (>= 1.99.1)
net-ssh (2.2.2)
pry (0.9.12)
coderay (~> 1.0.5)
method_source (~> 0.8)
slop (~> 3.4)
rake (10.0.3)
rb-inotify (0.9.0)
ffi (>= 0.5.0)
rspec (2.13.0)
rspec-core (~> 2.13.0)
rspec-expectations (~> 2.13.0)
rspec-mocks (~> 2.13.0)
rspec-core (2.13.0)
rspec-expectations (2.13.0)
diff-lcs (>= 1.1.3, < 2.0)
rspec-fire (1.1.3)
rspec (~> 2.11)
rspec-mocks (2.13.0)
rspec-spies (2.1.3)
rspec (~> 2.0)
simplecov (0.7.1)
multi_json (~> 1.0)
simplecov-html (~> 0.7.1)
simplecov-html (0.7.1)
slop (3.4.3)
terminal-table (1.4.5)
thor (0.17.0)
PLATFORMS
ruby
DEPENDENCIES
guard
guard-bundler
guard-ctags-bundler
guard-rspec
rake
rb-inotify
rspec
rspec-fire
rspec-spies
simplecov
vagrant!
vagrant-lxc!

View file

@ -1,34 +1,7 @@
# A sample Guardfile
# More info at https://github.com/guard/guard#readme
guard 'bundler' do
watch('Gemfile')
watch(/^.+\.gemspec/)
end
guard 'ctags-bundler', :src_path => ["lib"] do
watch(/^(lib|spec\/support)\/.*\.rb$/)
watch('Gemfile.lock')
end
guard 'rspec' do
watch(%r{^spec/.+_spec\.rb$})
guard 'rspec', :spec_paths => ["spec/unit"] do
watch(%r{^spec/unit/.+_spec\.rb$})
watch(%r{^lib/vagrant-lxc/(.+)\.rb$}) { |m| "spec/unit/#{m[1]}_spec.rb" }
watch('spec/unit_helper.rb') { "spec/unit" }
watch('spec/spec_helper.rb') { "spec/" }
# Rails example
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
watch('config/routes.rb') { "spec/routing" }
watch('app/controllers/application_controller.rb') { "spec/controllers" }
# Capybara features specs
watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
# Turnip features and steps
watch(%r{^spec/acceptance/(.+)\.feature$})
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
watch('spec/spec_helper.rb') { "spec/unit" }
watch(%r{^spec/support/(.+)\.rb$}) { "spec/unit" }
end

View file

@ -1,4 +1,4 @@
Copyright (c) 2013 Fábio Rehm
Copyright (c) 2013-2014 Fábio Rehm
MIT License

268
README.md
View file

@ -1,174 +1,186 @@
🟢 We plan to support and maintain vagrant-lxc, as well as clean it up.<br/>
🟢 Please feel free to contribute Issues and pull requests.<br/>
🟢 P.S: Thanks [Fabio Rehm](https://fabiorehm.com) for the amazing initial project.
# vagrant-lxc
[![Build Status](https://travis-ci.org/fgrehm/vagrant-lxc.png?branch=master)](https://travis-ci.org/fgrehm/vagrant-lxc)
[![Build Status](https://travis-ci.org/fgrehm/vagrant-lxc.png?branch=master)](https://travis-ci.org/fgrehm/vagrant-lxc) [![Gem Version](https://badge.fury.io/rb/vagrant-lxc.png)](http://badge.fury.io/rb/vagrant-lxc) [![Code Climate](https://codeclimate.com/github/fgrehm/vagrant-lxc.png)](https://codeclimate.com/github/fgrehm/vagrant-lxc) [![Coverage Status](https://coveralls.io/repos/fgrehm/vagrant-lxc/badge.png?branch=master)](https://coveralls.io/r/fgrehm/vagrant-lxc) [![Gitter chat](https://badges.gitter.im/fgrehm/vagrant-lxc.png)](https://gitter.im/fgrehm/vagrant-lxc)
Highly experimental Linux Containers support for Vagrant 1.1.
[LXC](http://lxc.sourceforge.net/) provider for [Vagrant](http://www.vagrantup.com/) 1.9+
This is a Vagrant plugin that allows it to control and provision Linux Containers
as an alternative to the built in VirtualBox provider for Linux hosts. Check out
[this blog post](http://fabiorehm.com/blog/2013/04/28/lxc-provider-for-vagrant/)
to see it in action.
## Features
* Provides the same workflow as the Vagrant VirtualBox provider
* Port forwarding via [`redir`](https://github.com/troglobit/redir)
* Private networking via [`pipework`](https://github.com/jpetazzo/pipework)
## Requirements
* [Vagrant 1.9+](http://www.vagrantup.com/downloads.html)
* lxc >=2.1
* `redir` (if you are planning to use port forwarding)
* `brctl` (if you are planning to use private networks, on Ubuntu this means `apt-get install bridge-utils`)
The plugin is known to work better and pretty much out of the box on Ubuntu 14.04+
hosts and installing the dependencies on it basically means a
`apt-get install lxc lxc-templates cgroup-lite redir`. For setting up other
types of hosts please have a look at the [Wiki](https://github.com/fgrehm/vagrant-lxc/wiki).
If you are on a Mac or Windows machine, you might want to have a look at [this](http://the.taoofmac.com/space/HOWTO/Vagrant)
blog post for some ideas on how to set things up or check out [this other repo](https://github.com/fgrehm/vagrant-lxc-vbox-hosts)
for a set of Vagrant VirtualBox machines ready for vagrant-lxc usage.
## Dependencies
Vagrant >= 1.1.0, the `lxc` package and a Kernel [higher than 3.5.0-17.28](#help-im-unable-to-restart-containers),
which on Ubuntu 12.10 means something like:
```
sudo apt-get update && sudo apt-get dist-upgrade
sudo apt-get install lxc
wget "http://files.vagrantup.com/packages/67bd4d30f7dbefa7c0abc643599f0244986c38c8/vagrant_`uname -m`.deb" -O /tmp/vagrant.deb
sudo dpkg -i /tmp/vagrant.deb
```
## What is currently supported?
* Vagrant's `up`, `halt`, `reload`, `destroy`, and `ssh` commands
* Shared folders
* Provisioning with shell scripts and puppet (should work with chef but I [haven't had the chance](https://github.com/fgrehm/vagrant-lxc/issues/37) to set it up on the base box)
* Setting container's host name
*Please refer to the [closed issues](https://github.com/fgrehm/vagrant-lxc/issues?labels=&milestone=&page=1&state=closed)
for the most up to date list.*
## Current limitations
* Port forwarding does not work [yet](https://github.com/fgrehm/vagrant-lxc/issues/6)
* A hell lot of `sudo`s
* Only a [single ubuntu box supported](boxes), I'm still [figuring out what should go
on the .box file](https://github.com/fgrehm/vagrant-lxc/issues/4)
* "[works on my machine](https://github.com/fgrehm/vagrant-lxc/issues/20)" (TM)
* + bunch of other [core features](https://github.com/fgrehm/vagrant-lxc/issues?labels=core&milestone=&page=1&state=open)
and some known [bugs](https://github.com/fgrehm/vagrant-lxc/issues?labels=bug&page=1&state=open)
## Usage
Make sure you have [Vagrant 1.1](http://downloads.vagrantup.com/tags/v1.1.0) and run:
## Installation
```
vagrant plugin install vagrant-lxc
```
After that you can create a `Vagrantfile` like the one below and run `vagrant up --provider=lxc`:
## Quick start
```
vagrant init fgrehm/precise64-lxc
vagrant up --provider=lxc
```
_More information about skipping the `--provider` argument can be found at the
"DEFAULT PROVIDER" section of [Vagrant docs](https://docs.vagrantup.com/v2/providers/basic_usage.html)_
## Base boxes
Base boxes provided on Atlas haven't been refreshed for a good while and shouldn't be relied on.
Your best best is to build your boxes yourself. Some scripts to build your own are available at
[hsoft/vagrant-lxc-base-boxes](https://github.com/hsoft/vagrant-lxc-base-boxes).
If you want to build your own boxes, please have a look at [`BOXES.md`](https://github.com/fgrehm/vagrant-lxc/tree/master/BOXES.md)
for more information.
## Advanced configuration
You can modify container configurations from within your Vagrantfile using the
[provider block](http://docs.vagrantup.com/v2/providers/configuration.html):
```ruby
Vagrant.configure("2") do |config|
config.vm.box = "lxc-quantal64"
config.vm.box_url = 'http://dl.dropbox.com/u/13510779/lxc-quantal64-2013-03-10.box'
# Share an additional folder to the guest Container. The first argument
# is the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options.
config.vm.synced_folder "/tmp", "/host_tmp"
config.vm.box = "fgrehm/trusty64-lxc"
config.vm.provider :lxc do |lxc|
# Same as 'customize ["modifyvm", :id, "--memory", "1024"]' for VirtualBox
lxc.start_opts << 'lxc.cgroup.memory.limit_in_bytes=400M'
# Limits swap size
lxc.start_opts << 'lxc.cgroup.memory.memsw.limit_in_bytes=500M'
# Same effect as 'customize ["modifyvm", :id, "--memory", "1024"]' for VirtualBox
lxc.customize 'cgroup.memory.limit_in_bytes', '1024M'
end
# ... your puppet / chef / shell provisioner configs here ...
end
```
If you are on a mac or window host and still want to try this plugin out, you
can use the [same Vagrant VirtualBox machine I use for development](#using-virtualbox-and-vagrant-11-for-development).
vagrant-lxc will then write out `lxc.cgroup.memory.limit_in_bytes='1024M'` to the
container config file (usually kept under `/var/lib/lxc/<container>/config`)
prior to starting it.
For other configuration options, please check the [lxc.conf manpages](http://manpages.ubuntu.com/manpages/precise/man5/lxc.conf.5.html).
## Development
### Private Networks
If want to develop from your physical machine, just sing that same old song:
Starting with vagrant-lxc 1.1.0, there is some rudimentary support for configuring
[Private Networks](https://docs.vagrantup.com/v2/networking/private_network.html)
by leveraging the [pipework](https://github.com/jpetazzo/pipework) project.
```
git clone git://github.com/fgrehm/vagrant-lxc.git --recurse
cd vagrant-lxc
bundle install
bundle exec rake # to run all specs
On its current state, there is a requirement for setting the bridge name that
will be created and will allow your machine to comunicate with the container
For example:
```ruby
Vagrant.configure("2") do |config|
config.vm.network "private_network", ip: "192.168.2.100", lxc__bridge_name: 'vlxcbr1'
end
```
To build the provided quantal64 box:
Will create a new `veth` device for the container and will set up (or reuse)
a `vlxcbr1` bridge between your machine and the `veth` device. Once the last
vagrant-lxc container attached to the bridge gets `vagrant halt`ed, the plugin
will delete the bridge.
```
bundle exec rake boxes:quantal64:build
vagrant box add quantal64 boxes/output/lxc-quantal64.box
### Container naming
By default vagrant-lxc will attempt to generate a unique container name
for you. However, if the container name is important to you, you may use the
`container_name` attribute to set it explicitly from the `provider` block:
```ruby
Vagrant.configure("2") do |config|
config.vm.define "db" do |node|
node.vm.provider :lxc do |lxc|
lxc.container_name = :machine # Sets the container name to 'db'
lxc.container_name = 'mysql' # Sets the container name to 'mysql'
end
end
end
```
_Please note that there is a 64 chars limit and the container name will be
trimmed down to that to ensure we can always bring the container up.
### Using `vagrant-lxc` to develop itself
### Backingstore options
Yes! The gem has been [bootstrapped](http://en.wikipedia.org/wiki/Bootstrapping_(compilers)
and since you can boot a container from within another, after cloning the
project you can run the commands below from the host machine to get a container
ready for development:
Support for setting `lxc-create`'s backingstore option (`-B` and related) can be
specified from the provider block and it defaults to `best`, to change it:
```sh
# Required in order to allow nested containers to be started
sudo apt-get install apparmor-utils
sudo aa-complain /usr/bin/lxc-start
bundle install
cd development
ln -s Vagrantfile.1.1 Vagrantfile
bundle exec vagrant up lxc --provider=lxc
bundle exec vagrant ssh lxc
```ruby
Vagrant.configure("2") do |config|
config.vm.provider :lxc do |lxc|
lxc.backingstore = 'lvm' # or 'btrfs', 'overlayfs', ...
# lvm specific options
lxc.backingstore_option '--vgname', 'schroots'
lxc.backingstore_option '--fssize', '5G'
lxc.backingstore_option '--fstype', 'xfs'
end
end
```
That should result in a container ready to be `bundle exec vagrant ssh`ed.
Once you've SSH into the guest container, you'll be already on the project's root.
Keep in mind that you'll probably need to run `sudo aa-complain /usr/bin/lxc-start`
on the host whenever you want to hack on it, otherwise you won't be able to
start nested containers there to try things out.
## Unprivileged containers support
### Using VirtualBox and Vagrant 1.1 for development
Since v1.4.0, `vagrant-lxc` gained support for unprivileged containers. For now, since it's a new
feature, privileged containers are still the default, but you can have your `Vagrantfile` use
unprivileged containers with the `privileged` flag (which defaults to `true`). Example:
```
cd development
ln -s Vagrantfile.1.1 Vagrantfile
bundle exec vagrant up vbox
bundle exec vagrant reload vbox
bundle exec vagrant ssh vbox
```ruby
Vagrant.configure("2") do |config|
config.vm.provider :lxc do |lxc|
lxc.privileged = false
end
end
```
### Using VirtualBox and Vagrant 1.0 for development
For unprivileged containers to work with `vagrant-lxc`, you need a properly configured system. On
some distros, it can be somewhat of a challenge. Your journey to configuring your system can start
with [Stéphane Graber's blog post about it](https://stgraber.org/2014/01/17/lxc-1-0-unprivileged-containers/).
```
cd development
ln -s Vagrantfile.1.0 Vagrantfile
vagrant up
vagrant reload
vagrant ssh
```
## Avoiding `sudo` passwords
If you're not using unprivileged containers, this plugin requires **a lot** of `sudo`ing To work
around that, you can use the `vagrant lxc sudoers` command which will create a file under
`/etc/sudoers.d/vagrant-lxc` whitelisting all commands required by `vagrant-lxc` to run.
If you are interested on what will be generated by that command, please check
[this code](lib/vagrant-lxc/command/sudoers.rb).
## Protips
## More information
If you want to find out more about what's going on under the hood on vagrant,
prepend `VAGRANT_LOG=debug` to your `vagrant` commands. For `lxc-start`s
debugging set `LXC_START_LOG_FILE`:
```
LXC_START_LOG_FILE=/tmp/lxc-start.log VAGRANT_LOG=debug vagrant up
```
This will output A LOT of information on your terminal and some useful information
about `lxc-start` to `/tmp/lxc-start.log`.
Please refer the [wiki](https://github.com/fgrehm/vagrant-lxc/wiki).
## Help! I'm unable to restart containers!
## Problems / ideas?
It happened to me quite a few times in the past and it seems that it is related
to a bug on linux kernel, so make sure you are using a bug-free kernel
(>= 3.5.0-17.28). More information can be found on:
* https://bugzilla.kernel.org/show_bug.cgi?id=47181
* https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1021471
* https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1065434
Sometimes the dev boxes I'm using are not able to `lxc-start` containers
anymore. Most of the times it was an issue with the arguments [I provided](https://github.com/fgrehm/vagrant-lxc/blob/master/example/Vagrantfile#L14-L18)
to it (or a *buggy* kernel). If you run into that, rollback your changes
and try to `vagrant reload` the dev box. If it still doesn't work,
please file a bug at the [issue tracker](https://github.com/fgrehm/vagrant-lxc/issues).
Please review the [Troubleshooting](https://github.com/fgrehm/vagrant-lxc/wiki/Troubleshooting)
wiki page + [known bugs](https://github.com/fgrehm/vagrant-lxc/issues?labels=bug&page=1&state=open)
list if you have a problem and feel free to use the [issue tracker](https://github.com/fgrehm/vagrant-lxc/issues)
propose new functionality and / or report bugs.
## Contributing

View file

@ -1,5 +1,3 @@
Dir['./tasks/**/*.rake'].each { |f| load f }
require 'bundler/gem_tasks'
task :ci => ['spec:unit']

View file

@ -1,103 +0,0 @@
#!/bin/bash
# This is the code extracted from /usr/share/lxc/templates/lxc-ubuntu
# that comes with Ubuntu 12.10 which is responsible for downloading the
# rootfs files / packages
set -e
suggest_flush()
{
echo "Container upgrade failed. The container cache may be out of date,"
echo "in which case flushing the case (see -F in the hep output) may help."
}
cleanup()
{
rm -rf $cache/partial-$arch
rm -rf $cache/rootfs-$arch
}
write_sourceslist()
{
# $1 => path to the rootfs
# $2 => architecture we want to add
MIRROR=${MIRROR:-mirror://mirrors.ubuntu.com/mirrors.txt}
SECURITY_MIRROR=${SECURITY_MIRROR:-http://security.ubuntu.com/ubuntu}
cat >> "$1/etc/apt/sources.list" << EOF
deb $MIRROR ${release} main restricted universe multiverse
deb $MIRROR ${release}-updates main restricted universe multiverse
deb $SECURITY_MIRROR ${release}-security main restricted universe multiverse
EOF
}
download_ubuntu()
{
packages=vim,ssh,curl,wget,bash-completion,manpages,puppet
echo "installing packages: $packages"
trap cleanup EXIT SIGHUP SIGINT SIGTERM
# check the mini ubuntu was not already downloaded
mkdir -p "$cache/partial-$arch"
if [ $? -ne 0 ]; then
echo "Failed to create '$cache/partial-$arch' directory"
return 1
fi
# download a mini ubuntu into a cache
echo "Downloading ubuntu $release minimal ..."
if [ -n "$(which qemu-debootstrap)" ]; then
qemu-debootstrap --verbose --components=main,universe --arch=$arch --include=$packages $release $cache/partial-$arch $MIRROR
else
debootstrap --verbose --components=main,universe --arch=$arch --include=$packages $release $cache/partial-$arch $MIRROR
fi
if [ $? -ne 0 ]; then
echo "Failed to download the rootfs, aborting."
return 1
fi
# Serge isn't sure whether we should avoid doing this when
# $release == `distro-info -d`
echo "Installing updates"
> $cache/partial-$arch/etc/apt/sources.list
write_sourceslist $cache/partial-$arch/ $arch
chroot "$1/partial-${arch}" apt-get update
if [ $? -ne 0 ]; then
echo "Failed to update the apt cache"
return 1
fi
cat > "$1/partial-${arch}"/usr/sbin/policy-rc.d << EOF
#!/bin/sh
exit 101
EOF
chmod +x "$1/partial-${arch}"/usr/sbin/policy-rc.d
lxc-unshare -s MOUNT -- chroot "$1/partial-${arch}" apt-get dist-upgrade -y || { suggest_flush; false; }
rm -f "$1/partial-${arch}"/usr/sbin/policy-rc.d
chroot "$1/partial-${arch}" apt-get clean
mv "$1/partial-$arch" "$1/rootfs-$arch"
trap EXIT
trap SIGINT
trap SIGTERM
trap SIGHUP
echo "Download complete"
return 0
}
declare cache=`readlink -f .` \
arch=amd64 \
release=quantal
if [ -d "${cache}/rootfs-${arch}" ]; then
echo 'The rootfs cache has been downloaded already, please remove it if you want to update'
exit 1
fi
download_ubuntu $cache $arch $release

View file

@ -1,567 +0,0 @@
#!/bin/bash
# This is a modified version of /usr/share/lxc/templates/lxc-ubuntu
# that comes with Ubuntu 12.10 changed to suit vagrant-lxc needs
#
# template script for generating ubuntu container for LXC
#
# This script consolidates and extends the existing lxc ubuntu scripts
#
# Copyright © 2011 Serge Hallyn <serge.hallyn@canonical.com>
# Copyright © 2010 Wilhelm Meier
# Author: Wilhelm Meier <wilhelm.meier@fh-kl.de>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2, as
# published by the Free Software Foundation.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
set -e
if [ -r /etc/default/lxc ]; then
. /etc/default/lxc
fi
configure_ubuntu()
{
rootfs=$1
release=$3
hostname='quantal64'
# configure the network using the dhcp
cat <<EOF > $rootfs/etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
EOF
# set the hostname
cat <<EOF > $rootfs/etc/hostname
$hostname
EOF
# set minimal hosts
cat <<EOF > $rootfs/etc/hosts
127.0.0.1 localhost
127.0.1.1 $hostname
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
EOF
if [ ! -f $rootfs/etc/init/container-detect.conf ]; then
# suppress log level output for udev
sed -i "s/=\"err\"/=0/" $rootfs/etc/udev/udev.conf
# remove jobs for consoles 5 and 6 since we only create 4 consoles in
# this template
rm -f $rootfs/etc/init/tty{5,6}.conf
fi
chroot $rootfs useradd --create-home -s /bin/bash vagrant
echo "vagrant:vagrant" | chroot $rootfs chpasswd
return 0
}
# finish setting up the user in the container by injecting ssh key and
# adding sudo group membership.
# passed-in user is 'vagrant'
finalize_user()
{
user=$1
sudo_version=$(chroot $rootfs dpkg-query -W -f='${Version}' sudo)
if chroot $rootfs dpkg --compare-versions $sudo_version gt "1.8.3p1-1"; then
groups="sudo"
else
groups="sudo admin"
fi
for group in $groups; do
chroot $rootfs groupadd --system $group >/dev/null 2>&1 || true
chroot $rootfs adduser ${user} $group >/dev/null 2>&1 || true
done
chroot $rootfs cp /etc/sudoers /etc/sudoers.orig >/dev/null 2>&1 || true
chroot $rootfs sed -i -e 's/%sudo\s\+ALL=(ALL:ALL)\s\+ALL/%sudo ALL=NOPASSWD:ALL/g' /etc/sudoers >/dev/null 2>&1 || true
chroot $rootfs locale-gen en_US en_US.UTF-8 hu_HU hu_HU.UTF-8 >/dev/null 2>&1 || true
chroot $rootfs dpkg-reconfigure locales >/dev/null 2>&1 || true
if [ -n "$auth_key" -a -f "$auth_key" ]; then
u_path="/home/${user}/.ssh"
root_u_path="$rootfs/$u_path"
mkdir -p $root_u_path
cp $auth_key "$root_u_path/authorized_keys"
chroot $rootfs chown -R ${user}: "$u_path"
echo "Inserted SSH public key from $auth_key into /home/${user}/.ssh/authorized_keys"
fi
return 0
}
write_sourceslist()
{
# $1 => path to the rootfs
# $2 => architecture we want to add
# $3 => whether to use the multi-arch syntax or not
case $2 in
amd64|i386)
MIRROR=${MIRROR:-http://archive.ubuntu.com/ubuntu}
SECURITY_MIRROR=${SECURITY_MIRROR:-http://security.ubuntu.com/ubuntu}
;;
*)
MIRROR=${MIRROR:-http://ports.ubuntu.com/ubuntu-ports}
SECURITY_MIRROR=${SECURITY_MIRROR:-http://ports.ubuntu.com/ubuntu-ports}
;;
esac
if [ -n "$3" ]; then
cat >> "$1/etc/apt/sources.list" << EOF
deb [arch=$2] $MIRROR ${release} main restricted universe multiverse
deb [arch=$2] $MIRROR ${release}-updates main restricted universe multiverse
deb [arch=$2] $SECURITY_MIRROR ${release}-security main restricted universe multiverse
EOF
else
cat >> "$1/etc/apt/sources.list" << EOF
deb $MIRROR ${release} main restricted universe multiverse
deb $MIRROR ${release}-updates main restricted universe multiverse
deb $SECURITY_MIRROR ${release}-security main restricted universe multiverse
EOF
fi
}
copy_ubuntu()
{
cache=$1
arch=$2
rootfs=$3
# make a local copy of the miniubuntu
echo "Copying rootfs to $rootfs ..."
mkdir -p $rootfs
rsync -a $cache/rootfs-$arch/ $rootfs/ || return 1
return 0
}
install_ubuntu()
{
rootfs=$1
release=$2
cache=$3 # "/var/cache/lxc/$release"
mkdir -p /var/lock/subsys/
(
flock -x 200
if [ $? -ne 0 ]; then
echo "Cache repository is busy."
return 1
fi
echo "Copy $cache/rootfs-$arch to $rootfs ... "
copy_ubuntu $cache $arch $rootfs
if [ $? -ne 0 ]; then
echo "Failed to copy rootfs"
return 1
fi
return 0
) 200>/var/lock/subsys/lxc
return $?
}
copy_configuration()
{
path=$1
rootfs=$2
name=$3
arch=$4
release=$5
if [ $arch = "i386" ]; then
arch="i686"
fi
ttydir=""
if [ -f $rootfs/etc/init/container-detect.conf ]; then
ttydir=" lxc"
fi
# if there is exactly one veth network entry, make sure it has an
# associated hwaddr.
nics=`grep -e '^lxc\.network\.type[ \t]*=[ \t]*veth' $path/config | wc -l`
if [ $nics -eq 1 ]; then
grep -q "^lxc.network.hwaddr" $path/config || cat <<EOF >> $path/config
lxc.network.hwaddr = 00:16:3e:$(openssl rand -hex 3| sed 's/\(..\)/\1:/g; s/.$//')
EOF
fi
grep -q "^lxc.rootfs" $path/config 2>/dev/null || echo "lxc.rootfs = $rootfs" >> $path/config
cat <<EOF >> $path/config
lxc.utsname = $name
lxc.devttydir =$ttydir
lxc.tty = 4
lxc.pts = 1024
lxc.mount = $path/fstab
lxc.arch = $arch
lxc.cap.drop = sys_module mac_admin mac_override
lxc.pivotdir = lxc_putold
# uncomment the next line to run the container unconfined:
#lxc.aa_profile = unconfined
lxc.cgroup.devices.deny = a
# Allow any mknod (but not using the node)
lxc.cgroup.devices.allow = c *:* m
lxc.cgroup.devices.allow = b *:* m
# /dev/null and zero
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
# consoles
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
#lxc.cgroup.devices.allow = c 4:0 rwm
#lxc.cgroup.devices.allow = c 4:1 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rwm
#fuse
lxc.cgroup.devices.allow = c 10:229 rwm
#tun
lxc.cgroup.devices.allow = c 10:200 rwm
#full
lxc.cgroup.devices.allow = c 1:7 rwm
#hpet
lxc.cgroup.devices.allow = c 10:228 rwm
#kvm
lxc.cgroup.devices.allow = c 10:232 rwm
EOF
cat <<EOF > $path/fstab
proc proc proc nodev,noexec,nosuid 0 0
sysfs sys sysfs defaults 0 0
EOF
if [ $? -ne 0 ]; then
echo "Failed to add configuration"
return 1
fi
return 0
}
trim()
{
rootfs=$1
release=$2
# provide the lxc service
cat <<EOF > $rootfs/etc/init/lxc.conf
# fake some events needed for correct startup other services
description "Container Upstart"
start on startup
script
rm -rf /var/run/*.pid
rm -rf /var/run/network/*
/sbin/initctl emit stopped JOB=udevtrigger --no-wait
/sbin/initctl emit started JOB=udev --no-wait
end script
EOF
# fix buggus runlevel with sshd
cat <<EOF > $rootfs/etc/init/ssh.conf
# ssh - OpenBSD Secure Shell server
#
# The OpenSSH server provides secure shell access to the system.
description "OpenSSH server"
start on filesystem
stop on runlevel [!2345]
expect fork
respawn
respawn limit 10 5
umask 022
# replaces SSHD_OOM_ADJUST in /etc/default/ssh
oom never
pre-start script
test -x /usr/sbin/sshd || { stop; exit 0; }
test -e /etc/ssh/sshd_not_to_be_run && { stop; exit 0; }
test -c /dev/null || { stop; exit 0; }
mkdir -p -m0755 /var/run/sshd
end script
# if you used to set SSHD_OPTS in /etc/default/ssh, you can change the
# 'exec' line here instead
exec /usr/sbin/sshd
EOF
cat <<EOF > $rootfs/etc/init/console.conf
# console - getty
#
# This service maintains a console on tty1 from the point the system is
# started until it is shut down again.
start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]
respawn
exec /sbin/getty -8 38400 /dev/console
EOF
cat <<EOF > $rootfs/lib/init/fstab
# /lib/init/fstab: cleared out for bare-bones lxc
EOF
# reconfigure some services
if [ -z "$LANG" ]; then
chroot $rootfs locale-gen en_US.UTF-8
chroot $rootfs update-locale LANG=en_US.UTF-8
else
chroot $rootfs locale-gen $LANG
chroot $rootfs update-locale LANG=$LANG
fi
# remove pointless services in a container
chroot $rootfs /usr/sbin/update-rc.d -f ondemand remove
chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls u*.conf); do mv $f $f.orig; done'
chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls tty[2-9].conf); do mv $f $f.orig; done'
chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls plymouth*.conf); do mv $f $f.orig; done'
chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls hwclock*.conf); do mv $f $f.orig; done'
chroot $rootfs /bin/bash -c 'cd /etc/init; for f in $(ls module*.conf); do mv $f $f.orig; done'
# if this isn't lucid, then we need to twiddle the network upstart bits :(
if [ $release != "lucid" ]; then
sed -i 's/^.*emission handled.*$/echo Emitting lo/' $rootfs/etc/network/if-up.d/upstart
fi
}
post_process()
{
rootfs=$1
release=$2
trim_container=$3
if [ $trim_container -eq 1 ]; then
trim $rootfs $release
elif [ ! -f $rootfs/etc/init/container-detect.conf ]; then
# Make sure we have a working resolv.conf
cresolvonf="${rootfs}/etc/resolv.conf"
mv $cresolvonf ${cresolvonf}.lxcbak
cat /etc/resolv.conf > ${cresolvonf}
# for lucid, if not trimming, then add the ubuntu-virt
# ppa and install lxcguest
if [ $release = "lucid" ]; then
chroot $rootfs apt-get update
chroot $rootfs apt-get install --force-yes -y python-software-properties
chroot $rootfs add-apt-repository ppa:ubuntu-virt/ppa
fi
chroot $rootfs apt-get update
chroot $rootfs apt-get install --force-yes -y lxcguest
# Restore old resolv.conf
rm -f ${cresolvonf}
mv ${cresolvonf}.lxcbak ${cresolvonf}
fi
# If the container isn't running a native architecture, setup multiarch
if [ -x "$(ls -1 ${rootfs}/usr/bin/qemu-*-static 2>/dev/null)" ]; then
dpkg_version=$(chroot $rootfs dpkg-query -W -f='${Version}' dpkg)
if chroot $rootfs dpkg --compare-versions $dpkg_version ge "1.16.2"; then
chroot $rootfs dpkg --add-architecture ${hostarch}
else
mkdir -p ${rootfs}/etc/dpkg/dpkg.cfg.d
echo "foreign-architecture ${hostarch}" > ${rootfs}/etc/dpkg/dpkg.cfg.d/lxc-multiarch
fi
# Save existing value of MIRROR and SECURITY_MIRROR
DEFAULT_MIRROR=$MIRROR
DEFAULT_SECURITY_MIRROR=$SECURITY_MIRROR
# Write a new sources.list containing both native and multiarch entries
> ${rootfs}/etc/apt/sources.list
write_sourceslist $rootfs $arch "native"
MIRROR=$DEFAULT_MIRROR
SECURITY_MIRROR=$DEFAULT_SECURITY_MIRROR
write_sourceslist $rootfs $hostarch "multiarch"
# Finally update the lists and install upstart using the host architecture
chroot $rootfs apt-get update
chroot $rootfs apt-get install --force-yes -y --no-install-recommends upstart:${hostarch} mountall:${hostarch} iproute:${hostarch} isc-dhcp-client:${hostarch}
fi
# rmdir /dev/shm for containers that have /run/shm
# I'm afraid of doing rm -rf $rootfs/dev/shm, in case it did
# get bind mounted to the host's /run/shm. So try to rmdir
# it, and in case that fails move it out of the way.
if [ ! -L $rootfs/dev/shm ] && [ -d $rootfs/run/shm ] && [ -e $rootfs/dev/shm ]; then
mv $rootfs/dev/shm $rootfs/dev/shm.bak
ln -s /run/shm $rootfs/dev/shm
fi
}
usage()
{
cat <<EOF
$1 -h|--help [-a|--arch] [--trim] [-d|--debug]
[-F | --flush-cache] [-r|--release <release>] [ -S | --auth-key <keyfile>]
release: the ubuntu release (e.g. precise): defaults to host release on ubuntu, otherwise uses latest LTS
trim: make a minimal (faster, but not upgrade-safe) container
arch: the container architecture (e.g. amd64): defaults to host arch
auth-key: SSH Public key file to inject into container
EOF
return 0
}
options=$(getopt -o a:b:hp:r:xn:FS:d:C -l arch:,help,path:,release:,trim,name:,flush-cache,auth-key:,debug:,cache: -- "$@")
if [ $? -ne 0 ]; then
usage $(basename $0)
exit 1
fi
eval set -- "$options"
release=precise # Default to the last Ubuntu LTS release for non-Ubuntu systems
if [ -f /etc/lsb-release ]; then
. /etc/lsb-release
if [ "$DISTRIB_ID" = "Ubuntu" ]; then
release=$DISTRIB_CODENAME
fi
fi
arch=$(arch)
# Code taken from debootstrap
if [ -x /usr/bin/dpkg ] && /usr/bin/dpkg --print-architecture >/dev/null 2>&1; then
arch=`/usr/bin/dpkg --print-architecture`
elif type udpkg >/dev/null 2>&1 && udpkg --print-architecture >/dev/null 2>&1; then
arch=`/usr/bin/udpkg --print-architecture`
else
arch=$(arch)
if [ "$arch" = "i686" ]; then
arch="i386"
elif [ "$arch" = "x86_64" ]; then
arch="amd64"
elif [ "$arch" = "armv7l" ]; then
arch="armel"
fi
fi
debug=0
trim_container=0
hostarch=$arch
while true
do
case "$1" in
-h|--help) usage $0 && exit 0;;
-p|--path) path=$2; shift 2;;
-n|--name) name=$2; shift 2;;
-C|--cache) cache=$2; shift 2;;
-r|--release) release=$2; shift 2;;
-a|--arch) arch=$2; shift 2;;
-x|--trim) trim_container=1; shift 1;;
-S|--auth-key) auth_key=$2; shift 2;;
-d|--debug) debug=1; shift 1;;
--) shift 1; break ;;
*) break ;;
esac
done
if [ $debug -eq 1 ]; then
set -x
fi
if [ "$arch" == "i686" ]; then
arch=i386
fi
if [ $hostarch = "i386" -a $arch = "amd64" ]; then
echo "can't create amd64 container on i386"
exit 1
fi
if [ -z "$path" ]; then
echo "'path' parameter is required"
exit 1
fi
if [ "$(id -u)" != "0" ]; then
echo "This script should be run as 'root'"
exit 1
fi
# detect rootfs
config="$path/config"
if grep -q '^lxc.rootfs' $config 2>/dev/null ; then
rootfs=`grep 'lxc.rootfs =' $config | awk -F= '{ print $2 }'`
else
rootfs=$path/rootfs
fi
install_ubuntu $rootfs $release $cache
if [ $? -ne 0 ]; then
echo "failed to install ubuntu $release"
exit 1
fi
configure_ubuntu $rootfs $release
if [ $? -ne 0 ]; then
echo "failed to configure ubuntu $release for a container"
exit 1
fi
copy_configuration $path $rootfs $name $arch $release
if [ $? -ne 0 ]; then
echo "failed write configuration file"
exit 1
fi
post_process $rootfs $release $trim_container
finalize_user vagrant
echo ""
echo "##"
echo "# The default user is 'vagrant' with password 'vagrant'!"
echo "# Use the 'sudo' command to run tasks as root in the container."
echo "##"
echo ""

View file

@ -1,9 +0,0 @@
{
"provider": "lxc",
"vagrant-lxc-version": "0.0.1",
"template-opts": {
"--arch": "amd64",
"--release": "quantal"
}
}

View file

@ -1,36 +0,0 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
def local_cache(box_name)
cache_dir = File.join(File.expand_path(Vagrant::Environment::DEFAULT_HOME),
'cache',
'apt',
box_name)
partial_dir = File.join(cache_dir, 'partial')
FileUtils.mkdir_p(partial_dir) unless File.exists? partial_dir
cache_dir
end
Vagrant::Config.run do |config|
config.vm.box = "quantal64"
config.vm.box_url = "https://github.com/downloads/roderik/VagrantQuantal64Box/quantal64.box"
config.vm.host_name = 'lxc-dev-box'
cache_dir = local_cache(config.vm.box)
config.vm.share_folder "v-root", "/vagrant", "../"
config.vm.share_folder "v-cache", "/var/cache/apt/archives", cache_dir
if defined? VagrantVbguest::Config
config.vbguest.auto_update = false
config.vbguest.no_remote = true
end
config.vm.provision :shell, :path => 'shell-provisioning/upgrade-kernel'
config.vm.provision :puppet do |puppet|
puppet.manifests_path = "."
puppet.manifest_file = "site.pp"
# Pass DEBUG=1 to vagrant commands if you want to make some debugging noise
puppet.options << [ "--verbose", "--debug" ] if ENV["DEBUG"] == '1'
end
end

View file

@ -1,55 +0,0 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
def local_cache(box_name)
cache_dir = File.join(File.expand_path(Vagrant::Environment::DEFAULT_HOME),
'cache',
'apt',
box_name)
partial_dir = File.join(cache_dir, 'partial')
FileUtils.mkdir_p(partial_dir) unless File.exists? partial_dir
cache_dir
end
Vagrant.require_plugin 'vagrant-lxc'
Vagrant.configure("2") do |config|
config.vm.box = "quantal64"
config.vm.synced_folder "../", "/vagrant", name: 'vagrant-root'
cache_dir = local_cache(config.vm.box)
config.vm.synced_folder cache_dir, "/var/cache/apt/archives", name: "vagrant-cache"
config.vm.define :vbox do |vb_config|
vb_config.vm.box_url = "https://github.com/downloads/roderik/VagrantQuantal64Box/quantal64.box"
vb_config.vm.hostname = 'vbox'
vb_config.vm.provider :virtualbox do |vb|
# Configure VM to use 1.5gb of ram and 3 cpus
vb.customize [
"modifyvm", :id,
"--memory", '1536',
"--cpus", '4'
]
end
vb_config.vm.provision :shell, :path => 'shell-provisioning/upgrade-kernel'
end
config.vm.define :lxc do |lxc_config|
lxc_config.vm.hostname = 'lxc-dev-box'
lxc_config.vm.box_url = 'http://dl.dropbox.com/u/13510779/lxc-quantal64-2013-03-10.box'
lxc_config.vm.provider :lxc do |lxc|
# Required to boot nested containers
lxc.start_opts << 'lxc.aa_profile=unconfined'
end
end
config.vm.provision :puppet do |puppet|
puppet.manifests_path = "."
puppet.manifest_file = "site.pp"
puppet.options << [ '--verbose', '--debug' ]
end
end

View file

@ -1,37 +0,0 @@
###############################################################################
# This file has the same configs as the built in /etc/default/lxc on Ubuntu,
# we only changed IPs to 10.0.254.* to avoid collision with LXC default 10.0.3.*
# which is likely to be running from the host machine
###############################################################################
# MIRROR to be used by ubuntu template at container creation:
# Leaving it undefined is fine
#MIRROR="http://archive.ubuntu.com/ubuntu"
# or
#MIRROR="http://<host-ip-addr>:3142/archive.ubuntu.com/ubuntu"
# LXC_AUTO - whether or not to start containers symlinked under
# /etc/lxc/auto
LXC_AUTO="true"
# Leave USE_LXC_BRIDGE as "true" if you want to use lxcbr0 for your
# containers. Set to "false" if you'll use virbr0 or another existing
# bridge, or mavlan to your host's NIC.
USE_LXC_BRIDGE="true"
# If you change the LXC_BRIDGE to something other than lxcbr1, then
# you will also need to update your /etc/lxc/lxc.conf as well as the
# configuration (/var/lib/lxc/<container>/config) for any containers
# already created using the default config to reflect the new bridge
# name.
# If you have the dnsmasq daemon installed, you'll also have to update
# /etc/dnsmasq.d/lxc and restart the system wide dnsmasq daemon.
LXC_BRIDGE="lxcbr0"
LXC_ADDR="10.0.253.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.253.0/24"
LXC_DHCP_RANGE="10.0.253.2,10.0.253.254"
LXC_DHCP_MAX="253"
LXC_SHUTDOWN_TIMEOUT=120

View file

@ -1,37 +0,0 @@
###############################################################################
# This file has the same configs as the built in /etc/default/lxc on Ubuntu,
# we only changed IPs to 10.0.254.* to avoid collision with LXC default 10.0.3.*
# which is likely to be running from the host machine
###############################################################################
# MIRROR to be used by ubuntu template at container creation:
# Leaving it undefined is fine
#MIRROR="http://archive.ubuntu.com/ubuntu"
# or
#MIRROR="http://<host-ip-addr>:3142/archive.ubuntu.com/ubuntu"
# LXC_AUTO - whether or not to start containers symlinked under
# /etc/lxc/auto
LXC_AUTO="true"
# Leave USE_LXC_BRIDGE as "true" if you want to use lxcbr0 for your
# containers. Set to "false" if you'll use virbr0 or another existing
# bridge, or mavlan to your host's NIC.
USE_LXC_BRIDGE="true"
# If you change the LXC_BRIDGE to something other than lxcbr1, then
# you will also need to update your /etc/lxc/lxc.conf as well as the
# configuration (/var/lib/lxc/<container>/config) for any containers
# already created using the default config to reflect the new bridge
# name.
# If you have the dnsmasq daemon installed, you'll also have to update
# /etc/dnsmasq.d/lxc and restart the system wide dnsmasq daemon.
LXC_BRIDGE="lxcbr0"
LXC_ADDR="10.0.254.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.254.0/24"
LXC_DHCP_RANGE="10.0.254.2,10.0.254.254"
LXC_DHCP_MAX="253"
LXC_SHUTDOWN_TIMEOUT=120

View file

@ -1,14 +0,0 @@
#!/bin/bash
set -e
if [[ `uname -r` != "3.5.0-17-generic" ]]; then
exit 0
fi
echo 'An old kernel was found on the guest machine and it will be upgraded' 1>&2
echo 'Please reload the box after provisioning when finished' 1>&2
sudo apt-get update
sudo apt-get install linux-image-3.5.0-26-generic linux-headers-3.5.0-26-generic -y
sudo apt-get dist-upgrade -y
sudo apt-get autoremove -y

View file

@ -1,124 +0,0 @@
Exec { path => [ '/bin/', '/sbin/' , '/usr/bin/', '/usr/sbin/', '/usr/local/bin'] }
# Because I'm lazy ;)
exec {
'echo "alias be=\"bundle exec\"" >> /home/vagrant/.bashrc':
unless => 'grep -q "bundle exec" /home/vagrant/.bashrc';
'echo "cd /vagrant" >> /home/vagrant/.bashrc':
unless => 'grep -q "cd /vagrant" /home/vagrant/.bashrc';
}
# Overwrite LXC default configs
exec {
'config-lxc':
# We need to do this otherwise IPs will collide with the host's lxc dhcp server.
# If we install the package prior to setting this configs the container will go crazy.
command => "cp /vagrant/development/lxc-configs/${hostname} /etc/default/lxc"
;
}
# Install dependencies
package {
[ 'libffi-dev', 'bsdtar', 'exuberant-ctags', 'ruby1.9.1-dev', 'htop', 'git', 'build-essential' ]:
ensure => 'installed'
;
'lxc':
require => Exec['config-lxc']
;
'bundler':
ensure => 'installed',
provider => 'gem'
;
}
# Make sure we can create and boot nested containers
if $hostname == 'vbox' {
package { 'apparmor-utils': }
exec { 'aa-complain /usr/bin/lxc-start': }
}
# TMUX
package {
'tmux': ensure => 'installed';
}
# Allow gems to be installed on vagrant user home avoiding "sudo"s
# Tks to http://wiki.railsplayground.com/railsplayground/show/How+to+install+gems+and+non+root+user
file {
'/home/vagrant/gems':
ensure => directory,
owner => 'vagrant',
group => 'vagrant'
;
'/home/vagrant/.gemrc':
content => '
---
:verbose: true
gem: --no-ri --no-rdoc
:update_sources: true
:sources:
- http://gems.rubyforge.org
- http://gems.github.com
:backtrace: false
:bulk_threshold: 1000
:benchmark: false
gemhome: /home/vagrant/gems
gempath:
- /home/vagrant/gems
- /usr/local/lib/ruby/gems/1.8
'
}
exec {
'set-gem-paths':
command => 'cat << EOF >> /home/vagrant/.profile
export GEM_HOME=/home/vagrant/gems
export GEM_PATH=/home/vagrant/gems:/var/lib/gems/1.9.1
export PATH=$PATH:/home/vagrant/gems/bin
EOF',
unless => 'grep -q "GEM_HOME" /home/vagrant/.profile'
}
# Bundle!
exec {
'su -l vagrant -c "cd /vagrant && bundle install"':
# We are checking for guard-rspec here but it could be any gem...
unless => 'gem list guard | grep -q rspec',
cwd => '/vagrant',
require => [
Exec['set-gem-paths'],
File['/home/vagrant/gems', '/home/vagrant/.gemrc'],
Package['bundler']
]
}
# Setup vagrant default ssh key
file {
'/home/vagrant/.ssh':
ensure => directory,
owner => 'vagrant',
group => 'vagrant'
}
exec {
'download-private-key':
command => 'wget https://raw.github.com/mitchellh/vagrant/master/keys/vagrant -O /home/vagrant/.ssh/id_rsa',
creates => '/home/vagrant/.ssh/id_rsa',
require => File['/home/vagrant/.ssh'],
user => 'vagrant'
;
'wget https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub -O /home/vagrant/.ssh/id_rsa.pub':
creates => '/home/vagrant/.ssh/id_rsa.pub',
require => File['/home/vagrant/.ssh'],
user => 'vagrant'
;
}
file {
'/home/vagrant/.ssh/id_rsa':
ensure => 'present',
mode => '0600',
require => Exec['download-private-key']
}

42
example/Vagrantfile vendored
View file

@ -1,42 +0,0 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
def local_cache(box_name)
cache_dir = File.join(File.expand_path(Vagrant::Environment::DEFAULT_HOME),
'cache',
'apt',
box_name)
partial_dir = File.join(cache_dir, 'partial')
FileUtils.mkdir_p(partial_dir) unless File.exists? partial_dir
cache_dir
end
Vagrant.require_plugin 'vagrant-lxc'
Vagrant.configure("2") do |config|
config.vm.box = "quantal64"
config.vm.box_url = 'http://dl.dropbox.com/u/13510779/lxc-quantal64-2013-03-10.box'
config.vm.hostname = 'lxc-quantal64'
config.vm.synced_folder "/tmp", "/vagrant_data"
cache_dir = local_cache(config.vm.box)
config.vm.synced_folder cache_dir, "/var/cache/apt/archives"
config.vm.provider :lxc do |lxc|
lxc.start_opts << 'lxc.cgroup.memory.limit_in_bytes=400M'
lxc.start_opts << 'lxc.cgroup.memory.memsw.limit_in_bytes=500M'
end
config.vm.provision :shell, :inline => <<-SCRIPT
echo "Hi there I'm a shell script used for provisioning"
SCRIPT
config.vm.provision :puppet do |puppet|
puppet.module_path = "puppet/modules"
puppet.manifests_path = "puppet/manifests"
puppet.manifest_file = "site.pp"
# If you want to make some debugging noise
# puppet.options << [ '--verbose', '--debug' ]
end
end

View file

@ -1,5 +0,0 @@
Exec { path => [ '/bin/', '/sbin/' , '/usr/bin/', '/usr/sbin/'] }
notice "Hi there! puppet here"
require hello_world

View file

@ -1,3 +0,0 @@
class hello_world {
notice "Puppet module here. Things seem to be working just fine ;-)"
}

View file

@ -1,4 +1,10 @@
require "vagrant-lxc/version"
require "vagrant-lxc/plugin"
I18n.load_path << File.expand_path(File.dirname(__FILE__) + '/../locales/en.yml')
module Vagrant
module LXC
def self.source_root
@source_root ||= Pathname.new(File.dirname(__FILE__)).join('..').expand_path
end
end
end

View file

@ -1,84 +1,82 @@
require 'vagrant-lxc/action/base_action'
require 'vagrant-lxc/action/boot'
require 'vagrant-lxc/action/check_created'
require 'vagrant-lxc/action/check_running'
require 'vagrant-lxc/action/clear_forwarded_ports'
require 'vagrant-lxc/action/create'
require 'vagrant-lxc/action/created'
require 'vagrant-lxc/action/destroy'
require 'vagrant-lxc/action/disconnect'
require 'vagrant-lxc/action/destroy_confirm'
require 'vagrant-lxc/action/compress_rootfs'
require 'vagrant-lxc/action/fetch_ip_with_lxc_info'
require 'vagrant-lxc/action/forced_halt'
require 'vagrant-lxc/action/forward_ports'
require 'vagrant-lxc/action/gc_private_network_bridges'
require 'vagrant-lxc/action/handle_box_metadata'
require 'vagrant-lxc/action/is_running'
require 'vagrant-lxc/action/network'
require 'vagrant-lxc/action/share_folders'
require 'vagrant-lxc/action/prepare_nfs_settings'
require 'vagrant-lxc/action/prepare_nfs_valid_ids'
require 'vagrant-lxc/action/private_networks'
require 'vagrant-lxc/action/setup_package_files'
require 'vagrant-lxc/action/warn_networks'
module Vagrant
module LXC
module Action
# Shortcuts
Builtin = Vagrant::Action::Builtin
Builder = Vagrant::Action::Builder
# This action is responsible for reloading the machine, which
# brings it down, sucks in new configuration, and brings the
# machine back up with the new configuration.
def self.action_reload
Vagrant::Action::Builder.new.tap do |b|
# b.use CheckLXC
b.use Vagrant::Action::Builtin::Call, Created do |env1, b2|
if !env1[:result]
b2.use VagrantPlugins::ProviderVirtualBox::Action::MessageNotCreated
Builder.new.tap do |b|
b.use Builtin::Call, Builtin::IsState, :not_created do |env1, b2|
if env1[:result]
b2.use Builtin::Message, I18n.t("vagrant_lxc.messages.not_created")
next
end
b2.use Vagrant::Action::Builtin::ConfigValidate
b2.use Builtin::ConfigValidate
b2.use action_halt
b2.use action_start
end
end
end
# We could do this here as VirtualBox does, but at least for now its better
# to be explicit and have the full constant name in order to easily spot
# what we implemented and what is builtin on Vagrant.
#
# include Vagrant::Action::Builtin
# This action boots the VM, assuming the VM is in a state that requires
# a bootup (i.e. not saved).
def self.action_boot
Vagrant::Action::Builder.new.tap do |b|
# b.use ClearForwardedPorts
b.use Vagrant::Action::Builtin::Provision
b.use Vagrant::Action::Builtin::EnvSet, :port_collision_repair => true
# b.use PrepareForwardedPortCollisionParams
# b.use ClearSharedFolders
b.use ShareFolders
b.use Network
# b.use ForwardPorts
b.use Vagrant::Action::Builtin::SetHostname
# b.use SaneDefaults
# b.use Customize
Builder.new.tap do |b|
b.use Builtin::Provision
b.use Builtin::EnvSet, :port_collision_repair => true
b.use Builtin::HandleForwardedPortCollisions
b.use PrepareNFSValidIds
b.use Builtin::SyncedFolderCleanup
b.use Builtin::SyncedFolders
b.use PrepareNFSSettings
b.use Builtin::SetHostname
b.use WarnNetworks
b.use ForwardPorts
b.use PrivateNetworks
b.use Boot
b.use Builtin::WaitForCommunicator
end
end
# This action just runs the provisioners on the machine.
def self.action_provision
Vagrant::Action::Builder.new.tap do |b|
# b.use CheckLXC
b.use Vagrant::Action::Builtin::ConfigValidate
b.use Vagrant::Action::Builtin::Call, Created do |env1, b2|
if !env1[:result]
b2.use VagrantPlugins::ProviderVirtualBox::Action::MessageNotCreated
Builder.new.tap do |b|
b.use Builtin::ConfigValidate
b.use Builtin::Call, Builtin::IsState, :not_created do |env1, b2|
if env1[:result]
b2.use Builtin::Message, I18n.t("vagrant_lxc.messages.not_created")
next
end
b2.use Vagrant::Action::Builtin::Call, IsRunning do |env2, b3|
b2.use Builtin::Call, Builtin::IsState, :running do |env2, b3|
if !env2[:result]
b3.use VagrantPlugins::ProviderVirtualBox::Action::MessageNotRunning
b3.use Builtin::Message, I18n.t("vagrant_lxc.messages.not_running")
next
end
# b3.use CheckAccessible
b3.use Vagrant::Action::Builtin::Provision
b3.use Builtin::Provision
end
end
end
@ -87,13 +85,12 @@ module Vagrant
# This action starts a container, assuming it is already created and exists.
# A precondition of this action is that the container exists.
def self.action_start
Vagrant::Action::Builder.new.tap do |b|
# b.use CheckLXC
b.use Vagrant::Action::Builtin::ConfigValidate
b.use Vagrant::Action::Builtin::Call, IsRunning do |env, b2|
Builder.new.tap do |b|
b.use Builtin::ConfigValidate
b.use Builtin::BoxCheckOutdated
b.use Builtin::Call, Builtin::IsState, :running do |env, b2|
# If the VM is running, then our work here is done, exit
next if env[:result]
# TODO: Check if has been saved / frozen and resume
b2.use action_boot
end
end
@ -102,13 +99,12 @@ module Vagrant
# This action brings the machine up from nothing, including creating the
# container, configuring metadata, and booting.
def self.action_up
Vagrant::Action::Builder.new.tap do |b|
# b.use CheckLXC
b.use Vagrant::Action::Builtin::ConfigValidate
b.use Vagrant::Action::Builtin::Call, Created do |env, b2|
Builder.new.tap do |b|
b.use Builtin::ConfigValidate
b.use Builtin::Call, Builtin::IsState, :not_created do |env, b2|
# If the VM is NOT created yet, then do the setup steps
if !env[:result]
b2.use Vagrant::Action::Builtin::HandleBoxUrl
if env[:result]
b2.use Builtin::HandleBox
b2.use HandleBoxMetadata
b2.use Create
end
@ -120,18 +116,19 @@ module Vagrant
# This is the action that is primarily responsible for halting
# the virtual machine, gracefully or by force.
def self.action_halt
Vagrant::Action::Builder.new.tap do |b|
# b.use CheckLXC
b.use Vagrant::Action::Builtin::Call, Created do |env, b2|
Builder.new.tap do |b|
b.use Builtin::Call, Builtin::IsState, :not_created do |env, b2|
if env[:result]
b2.use Disconnect
b2.use Vagrant::Action::Builtin::Call, Vagrant::Action::Builtin::GracefulHalt, :stopped, :running do |env2, b3|
if !env2[:result] && env2[:machine].provider.state.running?
b3.use ForcedHalt
end
b2.use Builtin::Message, I18n.t("vagrant_lxc.messages.not_created")
next
end
b2.use ClearForwardedPorts
b2.use GcPrivateNetworkBridges
b2.use Builtin::Call, Builtin::GracefulHalt, :stopped, :running do |env2, b3|
if !env2[:result]
b3.use ForcedHalt
end
else
b2.use VagrantPlugins::ProviderVirtualBox::Action::MessageNotCreated
end
end
end
@ -140,49 +137,96 @@ module Vagrant
# This is the action that is primarily responsible for completely
# freeing the resources of the underlying virtual machine.
def self.action_destroy
Vagrant::Action::Builder.new.tap do |b|
# b.use CheckLXC
b.use Vagrant::Action::Builtin::Call, Created do |env1, b2|
if !env1[:result]
b2.use VagrantPlugins::ProviderVirtualBox::Action::MessageNotCreated
Builder.new.tap do |b|
b.use Builtin::Call, Builtin::IsState, :not_created do |env1, b2|
if env1[:result]
b2.use Builtin::Message, I18n.t("vagrant_lxc.messages.not_created")
next
end
# TODO: Implement our own DestroyConfirm
b2.use Vagrant::Action::Builtin::Call, VagrantPlugins::ProviderVirtualBox::Action::DestroyConfirm do |env2, b3|
b2.use Builtin::Call, DestroyConfirm do |env2, b3|
if env2[:result]
b3.use Vagrant::Action::Builtin::ConfigValidate
b3.use Vagrant::Action::Builtin::EnvSet, :force_halt => true
b3.use Builtin::ConfigValidate
b3.use Builtin::EnvSet, :force_halt => true
b3.use action_halt
b3.use Destroy
b3.use Builtin::ProvisionerCleanup
else
# TODO: Implement our own MessageWillNotDestroy
b3.use VagrantPlugins::ProviderVirtualBox::Action::MessageWillNotDestroy
b3.use Builtin::Message, I18n.t("vagrant_lxc.messages.will_not_destroy")
end
end
end
end
end
# This action packages the virtual machine into a single box file.
def self.action_package
Builder.new.tap do |b|
b.use Builtin::Call, Builtin::IsState, :not_created do |env1, b2|
if env1[:result]
b2.use Builtin::Message, I18n.t("vagrant_lxc.messages.not_created")
next
end
b2.use action_halt
b2.use CompressRootFS
b2.use SetupPackageFiles
b2.use Vagrant::Action::General::Package
end
end
end
# This action is called to read the IP of the container. The IP found
# is expected to be put into the `:machine_ip` key.
def self.action_ssh_ip
Builder.new.tap do |b|
b.use Builtin::Call, Builtin::ConfigValidate do |env, b2|
b2.use FetchIpWithLxcInfo
end
end
end
# This is the action that will exec into an SSH shell.
def self.action_ssh
Vagrant::Action::Builder.new.tap do |b|
# b.use CheckLXC
b.use CheckCreated
# b.use CheckAccessible
b.use CheckRunning
b.use Vagrant::Action::Builtin::SSHExec
Builder.new.tap do |b|
b.use Builtin::ConfigValidate
b.use Builtin::Call, Builtin::IsState, :not_created do |env, b2|
if env[:result]
b2.use Builtin::Message, I18n.t("vagrant_lxc.messages.not_created")
next
end
b2.use Builtin::Call, Builtin::IsState, :running do |env1, b3|
if !env1[:result]
b3.use Builtin::Message, I18n.t("vagrant_lxc.messages.not_running")
next
end
b3.use Builtin::SSHExec
end
end
end
end
# This is the action that will run a single SSH command.
def self.action_ssh_run
Vagrant::Action::Builder.new.tap do |b|
# b.use CheckLXC
b.use CheckCreated
# b.use CheckAccessible
b.use CheckRunning
b.use Vagrant::Action::Builtin::SSHRun
Builder.new.tap do |b|
b.use Builtin::ConfigValidate
b.use Builtin::Call, Builtin::IsState, :not_created do |env, b2|
if env[:result]
b2.use Builtin::Message, I18n.t("vagrant_lxc.messages.not_created")
next
end
b2.use Builtin::Call, Builtin::IsState, :running do |env1, b3|
if !env1[:result]
raise Vagrant::Errors::VMNotRunningError
next
end
b3.use Builtin::SSHRun
end
end
end
end
end

View file

@ -1,11 +0,0 @@
module Vagrant
module LXC
module Action
class BaseAction
def initialize(app, env)
@app = app
end
end
end
end
end

View file

@ -1,53 +1,44 @@
module Vagrant
module LXC
module Action
class Boot < BaseAction
def call(env)
@env = env
config = env[:machine].provider_config
# Allows this middleware to be called multiple times. We need to
# support this as base boxes might have after create scripts which
# require SSH access
unless env[:machine].state.running?
env[:ui].info I18n.t("vagrant.actions.vm.boot.booting")
env[:machine].provider.container.start(config)
raise Vagrant::Errors::VMFailedToBoot if !wait_for_boot
end
@app.call env
class Boot
def initialize(app, env)
@app = app
end
# Stolen from on VagrantPlugins::ProviderVirtualBox::Action::Boot
def wait_for_boot
@env[:ui].info I18n.t("vagrant.actions.vm.boot.waiting")
def call(env)
@env = env
driver = env[:machine].provider.driver
config = env[:machine].provider_config
@env[:machine].config.ssh.max_tries.to_i.times do |i|
if @env[:machine].communicate.ready?
@env[:ui].info I18n.t("vagrant.actions.vm.boot.ready")
return true
end
# Return true so that the vm_failed_to_boot error doesn't
# get shown
return true if @env[:interrupted]
# TODO: Find out if there is a command to check if the machine is
# starting, `lxc-monitor` shows this information, but I've
# never seen it on `lxc-info` which is what it is being used
# to determine container status
# If the VM is not starting or running, something went wrong
# and we need to show a useful error.
state = @env[:machine].provider.state.id
raise Vagrant::Errors::VMFailedToRun if state != :starting && state != :running
sleep 2 if !@env["vagrant.test"]
utsname = env[:machine].config.vm.hostname || env[:machine].id
if driver.supports_new_config_format
config.customize 'uts.name', utsname
else
config.customize 'utsname', utsname
end
@env[:ui].error I18n.t("vagrant.actions.vm.boot.failed")
false
# Fix apparmor issues when starting Ubuntu 14.04 containers
# See https://github.com/fgrehm/vagrant-lxc/issues/278 for more information
if Dir.exists?('/sys/fs/pstore')
config.customize 'mount.entry', '/sys/fs/pstore sys/fs/pstore none bind,optional 0 0'
end
# Make selinux read-only, see
# https://github.com/fgrehm/vagrant-lxc/issues/301
if Dir.exists?('/sys/fs/selinux')
config.customize 'mount.entry', '/sys/fs/selinux sys/fs/selinux none bind,ro 0 0'
end
if config.tmpfs_mount_size && !config.tmpfs_mount_size.empty?
# Make /tmp a tmpfs to prevent init scripts from nuking synced folders mounted in here
config.customize 'mount.entry', "tmpfs tmp tmpfs nodev,nosuid,size=#{config.tmpfs_mount_size} 0 0"
end
env[:ui].info I18n.t("vagrant_lxc.messages.starting")
driver.start(config.customizations)
@app.call env
end
end
end

View file

@ -1,17 +0,0 @@
module Vagrant
module LXC
module Action
class CheckCreated < BaseAction
def call(env)
unless env[:machine].state.created?
raise Vagrant::Errors::VMNotCreatedError
end
# Call the next if we have one (but we shouldn't, since this
# middleware is built to run with the Call-type middlewares)
@app.call(env)
end
end
end
end
end

View file

@ -1,17 +0,0 @@
module Vagrant
module LXC
module Action
class CheckRunning < BaseAction
def call(env)
unless env[:machine].state.running?
raise Vagrant::Errors::VMNotRunningError
end
# Call the next if we have one (but we shouldn't, since this
# middleware is built to run with the Call-type middlewares)
@app.call(env)
end
end
end
end
end

View file

@ -0,0 +1,56 @@
module Vagrant
module LXC
module Action
class ClearForwardedPorts
def initialize(app, env)
@app = app
@logger = Log4r::Logger.new("vagrant::lxc::action::clear_forwarded_ports")
end
def call(env)
@env = env
if redir_pids.any?
env[:ui].info I18n.t("vagrant.actions.vm.clear_forward_ports.deleting")
redir_pids.each do |pid|
next unless is_redir_pid?(pid[0])
@logger.debug "Killing pid #{pid[0]}"
if pid[1]
system "sudo pkill -TERM -P #{pid[0]}"
else
system "pkill -TERM -P #{pid[0]}"
end
end
@logger.info "Removing redir pids files"
remove_redir_pids
else
@logger.info "No redir pids found"
end
@app.call env
end
protected
def redir_pids
@redir_pids = Dir[@env[:machine].data_dir.join('pids').to_s + "/redir_*.pid"].map do |file|
port_number = File.basename(file).split(/[^\d]/).join
[ File.read(file).strip.chomp , Integer(port_number) <= 1024 ]
end
end
def is_redir_pid?(pid)
@logger.debug "Checking if #{pid} is a redir process with `ps -o cmd= #{pid}`"
`ps -o cmd= #{pid}`.strip.chomp =~ /redir/
end
def remove_redir_pids
Dir[@env[:machine].data_dir.join('pids').to_s + "/redir_*.pid"].each do |file|
File.delete file
end
end
end
end
end
end

View file

@ -0,0 +1,30 @@
require "fileutils"
module Vagrant
module LXC
module Action
class CompressRootFS
def initialize(app, env)
@app = app
end
def call(env)
raise Vagrant::Errors::VMPowerOffToPackage if env[:machine].provider.state.id != :stopped
env[:ui].info I18n.t("vagrant.actions.lxc.compressing_rootfs")
@rootfs = env['package.rootfs'] = env[:machine].provider.driver.compress_rootfs
@app.call env
recover # called to remove the rootfs tarball
end
def recover(*)
if @rootfs && File.exist?(@rootfs)
FileUtils.rm_rf(File.dirname @rootfs)
end
end
end
end
end
end

View file

@ -1,13 +1,64 @@
module Vagrant
module LXC
module Action
class Create < BaseAction
class Create
def initialize(app, env)
@app = app
end
def call(env)
machine_id = env[:machine].provider.container.create(env[:machine].box.metadata)
env[:machine].id = machine_id
env[:just_created] = true
config = env[:machine].provider_config
container_name = config.container_name
case container_name
when :machine
container_name = env[:machine].name.to_s
when String
# Nothing to do here, move along...
else
container_name = generate_container_name(env)
end
backingstore = config.backingstore
if backingstore.nil?
backingstore = config.privileged ? "best" : "dir"
end
driver = env[:machine].provider.driver
template_options = env[:lxc_template_opts]
if driver.supports_new_config_format
if env[:lxc_box_config]
driver.update_config_keys(env[:lxc_box_config])
end
else
template_options['--oldconfig'] = ''
end
driver.create(
container_name,
backingstore,
config.backingstore_options,
env[:lxc_template_src],
env[:lxc_template_config],
template_options
)
driver.update_config_keys
env[:machine].id = container_name
@app.call env
end
def generate_container_name(env)
container_name = "#{env[:root_path].basename}_#{env[:machine].name}"
container_name.gsub!(/[^-a-z0-9_]/i, "")
# milliseconds + random number suffix to allow for simultaneous
# `vagrant up` of the same box in different dirs
container_name << "_#{(Time.now.to_f * 1000.0).to_i}_#{rand(100000)}"
# Trim container name to 64 chars, keeping "randomness"
trim_point = container_name.size > 64 ? -64 : -(container_name.size)
container_name[trim_point..-1]
end
end
end
end

View file

@ -1,16 +0,0 @@
module Vagrant
module LXC
module Action
class Created < BaseAction
def call(env)
# Set the result to be true if the machine is created.
env[:result] = env[:machine].state.created?
# Call the next if we have one (but we shouldn't, since this
# middleware is built to run with the Call-type middlewares)
@app.call(env)
end
end
end
end
end

View file

@ -1,10 +1,14 @@
module Vagrant
module LXC
module Action
class Destroy < BaseAction
class Destroy
def initialize(app, env)
@app = app
end
def call(env)
env[:ui].info I18n.t("vagrant.actions.vm.destroy.destroying")
env[:machine].provider.container.destroy
env[:machine].provider.driver.destroy
env[:machine].id = nil
@app.call env
end

View file

@ -0,0 +1,17 @@
require "vagrant/action/builtin/confirm"
module Vagrant
module LXC
module Action
class DestroyConfirm < Vagrant::Action::Builtin::Confirm
def initialize(app, env)
force_key = :force_confirm_destroy
message = I18n.t("vagrant.commands.destroy.confirmation",
:name => env[:machine].name)
super(app, env, message, force_key)
end
end
end
end
end

View file

@ -1,14 +0,0 @@
module Vagrant
module LXC
module Action
class Disconnect < BaseAction
def call(env)
@app.call env
# FIXME: Vagrant >= 1.1.3 should not need this
# https://github.com/mitchellh/vagrant/compare/715539eac30bc9ae62ddbb6337d13f036f7b774d...ec1bae0#L2R128
env[:machine].instance_variable_set(:@communicator, nil)
end
end
end
end
end

View file

@ -0,0 +1,44 @@
module Vagrant
module LXC
module Action
class FetchIpWithLxcInfo
# Include this so we can use `Subprocess` more easily.
include Vagrant::Util::Retryable
def initialize(app, env)
@app = app
@logger = Log4r::Logger.new("vagrant::lxc::action::fetch_ip_with_lxc_info")
end
def call(env)
env[:machine_ip] ||= assigned_ip(env)
ensure
@app.call(env)
end
def assigned_ip(env)
config = env[:machine].provider_config
fetch_ip_tries = config.fetch_ip_tries
driver = env[:machine].provider.driver
ip = ''
return config.ssh_ip_addr if not config.ssh_ip_addr.nil?
retryable(:on => LXC::Errors::ExecuteError, :tries => fetch_ip_tries, :sleep => 3) do
unless ip = get_container_ip_from_ip_addr(driver)
# retry
raise LXC::Errors::ExecuteError, :command => "lxc-info"
end
end
ip
end
# From: https://github.com/lxc/lxc/blob/staging/src/python-lxc/lxc/__init__.py#L371-L385
def get_container_ip_from_ip_addr(driver)
output = driver.info '-iH'
if output =~ /^([0-9.]+)/
return $1.to_s
end
end
end
end
end
end

View file

@ -7,11 +7,9 @@ module Vagrant
end
def call(env)
if env[:machine].provider.state.running?
env[:ui].info I18n.t("vagrant.actions.vm.halt.force")
# TODO: Container#halt is kinda graceful as well, if it doesn't
# work we can issue a lxc-stop.
env[:machine].provider.container.halt
if env[:machine].provider.state.id == :running
env[:ui].info I18n.t("vagrant_lxc.messages.force_shutdown")
env[:machine].provider.driver.forced_halt
end
@app.call(env)

View file

@ -0,0 +1,121 @@
require 'open3'
module Vagrant
module LXC
module Action
class ForwardPorts
def initialize(app, env)
@app = app
@logger = Log4r::Logger.new("vagrant::lxc::action::forward_ports")
end
def call(env)
@env = env
# Get the ports we're forwarding
env[:forwarded_ports] = compile_forwarded_ports(env[:machine].config)
if @env[:forwarded_ports].any? and not redir_installed?
raise Errors::RedirNotInstalled
end
# Warn if we're port forwarding to any privileged ports
env[:forwarded_ports].each do |fp|
if fp[:host] <= 1024
env[:ui].warn I18n.t("vagrant.actions.vm.forward_ports.privileged_ports")
break
end
end
# Continue, we need the VM to be booted in order to grab its IP
@app.call env
if @env[:forwarded_ports].any?
env[:ui].info I18n.t("vagrant.actions.vm.forward_ports.forwarding")
forward_ports
end
end
def forward_ports
@env[:forwarded_ports].each do |fp|
message_attributes = {
# TODO: Add support for multiple adapters
:adapter => 'eth0',
:guest_port => fp[:guest],
:host_port => fp[:host]
}
# TODO: Remove adapter from logging
@env[:ui].info(I18n.t("vagrant.actions.vm.forward_ports.forwarding_entry",
message_attributes))
redir_pid = redirect_port(
fp[:host_ip],
fp[:host],
fp[:guest_ip] || @env[:machine].provider.ssh_info[:host],
fp[:guest]
)
store_redir_pid(fp[:host], redir_pid)
end
end
private
def compile_forwarded_ports(config)
mappings = {}
config.vm.networks.each do |type, options|
next if options[:disabled]
# TODO: Deprecate this behavior of "automagically" skipping ssh forwarded ports
if type == :forwarded_port && options[:id] != 'ssh'
if options.fetch(:host_ip, '').to_s.strip.empty?
options[:host_ip] = '127.0.0.1'
end
mappings[options[:host]] = options
end
end
mappings.values
end
def redirect_port(host_ip, host_port, guest_ip, guest_port)
if redir_version >= 3
params = %W( -n #{host_ip}:#{host_port} #{guest_ip}:#{guest_port} )
else
params = %W( --lport=#{host_port} --caddr=#{guest_ip} --cport=#{guest_port} )
params.unshift "--laddr=#{host_ip}" if host_ip
end
params << '--syslog' if ENV['REDIR_LOG']
if host_port < 1024
redir_cmd = "sudo redir #{params.join(' ')} 2>/dev/null"
else
redir_cmd = "redir #{params.join(' ')} 2>/dev/null"
end
@logger.debug "Forwarding port with `#{redir_cmd}`"
spawn redir_cmd
end
def store_redir_pid(host_port, redir_pid)
data_dir = @env[:machine].data_dir.join('pids')
data_dir.mkdir unless data_dir.directory?
data_dir.join("redir_#{host_port}.pid").open('w') do |pid_file|
pid_file.write(redir_pid)
end
end
def redir_version
stdout, stderr, _ = Open3.capture3 "redir --version"
# For some weird reason redir printed version information in STDERR prior to 3.2
version = stdout.empty? ? stderr : stdout
version.split('.')[0].to_i
end
def redir_installed?
system "which redir > /dev/null"
end
end
end
end
end

View file

@ -0,0 +1,47 @@
module Vagrant
module LXC
module Action
class GcPrivateNetworkBridges
def initialize(app, env)
@app = app
end
def call(env)
was_running = env[:machine].provider.state.id == :running
# Continue execution, we need the container to be stopped
@app.call(env)
was_running = was_running && env[:machine].provider.state.id != :running
if was_running && private_network_configured?(env[:machine].config)
private_network_configured?(env[:machine].config)
remove_bridges_that_are_not_in_use(env)
end
end
def private_network_configured?(config)
config.vm.networks.find do |type, _|
type.to_sym == :private_network
end
end
def remove_bridges_that_are_not_in_use(env)
env[:machine].config.vm.networks.find do |type, config|
next if type.to_sym != :private_network
bridge = config.fetch(:lxc__bridge_name)
driver = env[:machine].provider.driver
if ! driver.bridge_is_in_use?(bridge)
env[:ui].info I18n.t("vagrant_lxc.messages.remove_bridge", name: bridge)
unless ['lxcbr0', 'virbr0'].include? bridge
driver.remove_bridge(bridge)
end
end
end
end
end
end
end
end

View file

@ -2,44 +2,93 @@ module Vagrant
module LXC
module Action
# Prepare arguments to be used for lxc-create
class HandleBoxMetadata < BaseAction
LXC_TEMPLATES_PATH = Pathname.new("/usr/share/lxc/templates")
TEMP_PREFIX = "vagrant-lxc-rootfs-temp-"
class HandleBoxMetadata
SUPPORTED_VERSIONS = ['1.0.0', '2', '3']
def initialize(app, env)
super
@app = app
@logger = Log4r::Logger.new("vagrant::lxc::action::handle_box_metadata")
end
def call(env)
env[:ui].info I18n.t("vagrant.actions.vm.import.importing",
:name => env[:machine].box.name)
@env = env
@box = @env[:machine].box
rootfs_cache = Dir.mktmpdir(TEMP_PREFIX)
box = env[:machine].box
template_name = "vagrant-#{box.name}"
@env[:ui].info I18n.t("vagrant.actions.vm.import.importing",
:name => @env[:machine].box.name)
# Prepends "lxc-" to the template file so that `lxc-create` is able to find it
lxc_template_src = box.directory.join('lxc-template').to_s
unless File.exists?(lxc_template_src)
raise Errors::TemplateFileMissing.new name: box.name
@logger.info 'Validating box contents'
validate_box
@logger.info 'Setting box options on environment'
@env[:lxc_template_src] = template_src
@env[:lxc_template_opts] = template_opts
# FIXME: Remove support for pre 1.0.0 boxes
if box_version != '1.0.0'
@env[:ui].warn "WARNING: You are using a base box that has a format that has been deprecated, please upgrade to a new one."
@env[:lxc_template_opts].merge!(
'--auth-key' => Vagrant.source_root.join('keys', 'vagrant.pub').expand_path.to_s
)
end
dest = LXC_TEMPLATES_PATH.join("lxc-#{template_name}").to_s
@logger.debug('Copying LXC template into place')
system(%Q[sudo su root -c "cp #{lxc_template_src} #{dest}"])
@logger.debug('Extracting rootfs')
system(%Q[sudo su root -c "cd #{box.directory} && tar xfz rootfs.tar.gz -C #{rootfs_cache}"])
if template_config_file.exist?
@env[:lxc_box_config] = template_config_file.to_s
@env[:lxc_template_opts].merge!('--config' => template_config_file.to_s)
elsif old_template_config_file.exist?
@env[:lxc_box_config] = old_template_config_file.to_s
@env[:lxc_template_config] = old_template_config_file.to_s
end
box.metadata.merge!(
'template-name' => template_name,
'rootfs-cache-path' => rootfs_cache
@app.call env
end
def template_src
@template_src ||=
if (box_template = @box.directory.join('lxc-template')).exist?
box_template.to_s
else
Vagrant::LXC.source_root.join('scripts/lxc-template').to_s
end
end
def template_config_file
@template_config_file ||= @box.directory.join('lxc-config')
end
# TODO: Remove this once we remove compatibility for < 1.0.0 boxes
def old_template_config_file
@old_template_config_file ||= @box.directory.join('lxc.conf')
end
def template_opts
@template_opts ||= @box.metadata.fetch('template-opts', {}).dup.merge!(
'--tarball' => rootfs_tarball
)
end
@app.call(env)
def rootfs_tarball
@rootfs_tarball ||= @box.directory.join('rootfs.tar.gz').to_s
end
ensure
system %Q[sudo su root -c "rm -rf #{rootfs_cache}"]
def validate_box
unless SUPPORTED_VERSIONS.include? box_version
raise Errors::IncompatibleBox.new name: @box.name,
found: box_version,
supported: SUPPORTED_VERSIONS.join(', ')
end
unless File.exists?(template_src)
raise Errors::TemplateFileMissing.new name: @box.name
end
unless File.exists?(rootfs_tarball)
raise Errors::RootFSTarballMissing.new name: @box.name
end
end
def box_version
@box.metadata.fetch('version')
end
end
end

View file

@ -1,15 +0,0 @@
module Vagrant
module LXC
module Action
class IsRunning < BaseAction
def call(env)
env[:result] = env[:machine].state.running?
# Call the next if we have one (but we shouldn't, since this
# middleware is built to run with the Call-type middlewares)
@app.call(env)
end
end
end
end
end

View file

@ -1,21 +0,0 @@
module Vagrant
module LXC
module Action
class Network < BaseAction
def call(env)
# TODO: Validate network configuration prior to anything below
@env = env
env[:machine].config.vm.networks.each do |type, options|
# We only handle private networks
next if type != :private_network
env[:machine].provider_config.start_opts << "lxc.network.ipv4=#{options[:ip]}/24"
end
# Continue the middleware chain.
@app.call(env)
end
end
end
end
end

View file

@ -0,0 +1,64 @@
module Vagrant
module LXC
module Action
class PrepareNFSSettings
include Vagrant::Util::Retryable
def initialize(app, env)
@app = app
@logger = Log4r::Logger.new("vagrant::action::vm::nfs")
end
def call(env)
@machine = env[:machine]
@app.call(env)
# if using_nfs? # TODO: && !privileged_container?
# raise Errors::NfsWithoutPrivilegedError
# end
if using_nfs?
@logger.info("Using NFS, preparing NFS settings by reading host IP and machine IP")
add_ips_to_env!(env)
end
end
# We're using NFS if we have any synced folder with NFS configured. If
# we are not using NFS we don't need to do the extra work to
# populate these fields in the environment.
def using_nfs?
@machine.config.vm.synced_folders.any? { |_, opts| opts[:type] == :nfs }
end
# TODO:
# def privileged_container?
# @machine.provider.driver.privileged?(@machine.id)
# end
# Extracts the proper host and guest IPs for NFS mounts and stores them
# in the environment for the SyncedFolder action to use them in
# mounting.
#
# The ! indicates that this method modifies its argument.
def add_ips_to_env!(env)
provider = @machine.provider
host_ip = read_host_ip
machine_ip = provider.ssh_info[:host]
raise Vagrant::Errors::NFSNoHostonlyNetwork if !host_ip || !machine_ip
env[:nfs_host_ip] = host_ip
env[:nfs_machine_ip] = machine_ip
end
def read_host_ip
@machine.communicate.execute 'echo $SSH_CLIENT' do |buffer, output|
return output.chomp.split(' ')[0] if buffer == :stdout
end
end
end
end
end
end

View file

@ -0,0 +1,19 @@
module Vagrant
module LXC
module Action
class PrepareNFSValidIds
def initialize(app, env)
@app = app
@logger = Log4r::Logger.new("vagrant::action::vm::nfs")
end
def call(env)
machine = env[:machine]
env[:nfs_valid_ids] = machine.provider.driver.all_containers
@app.call(env)
end
end
end
end
end

View file

@ -0,0 +1,46 @@
module Vagrant
module LXC
module Action
class PrivateNetworks
def initialize(app, env)
@app = app
end
def call(env)
@app.call(env)
if private_network_configured?(env[:machine].config)
env[:ui].output(I18n.t("vagrant_lxc.messages.setup_private_network"))
configure_private_networks(env)
end
end
def private_network_configured?(config)
config.vm.networks.find do |type, _|
type.to_sym == :private_network
end
end
def configure_private_networks(env)
env[:machine].config.vm.networks.find do |type, config|
next if type.to_sym != :private_network
container_name = env[:machine].provider.driver.container_name
address_type = config[:type]
ip = config[:ip]
bridge_ip = config.fetch(:lxc__bridge_ip) { build_bridge_ip(ip) }
bridge = config.fetch(:lxc__bridge_name)
env[:machine].provider.driver.configure_private_network(bridge, bridge_ip, container_name, address_type, ip)
end
end
def build_bridge_ip(ip)
if ip
ip.sub(/^(\d+\.\d+\.\d+)\.\d+/, '\1.254')
end
end
end
end
end
end

View file

@ -0,0 +1,60 @@
require 'fileutils'
module Vagrant
module LXC
module Action
class SetupPackageFiles
def initialize(app, env)
@app = app
env["package.include"] ||= []
env["package.vagrantfile"] ||= nil
end
def call(env)
@env = env
create_package_temp_dir
move_rootfs_to_pkg_dir
copy_box_files_to_pkg_dir
@app.call env
recover # called to cleanup temp directory
end
def recover(*)
if @temp_dir && File.exist?(@temp_dir)
FileUtils.rm_rf(@temp_dir)
end
end
private
def create_package_temp_dir
@env[:ui].info I18n.t("vagrant.actions.vm.export.create_dir")
@temp_dir = @env["package.directory"] = @env[:tmp_path].join("container-export-#{Time.now.to_i.to_s}")
FileUtils.mkpath(@temp_dir)
end
def move_rootfs_to_pkg_dir
FileUtils.mv @env['package.rootfs'].to_s, @env['package.directory'].to_s
end
def copy_box_files_to_pkg_dir
box_dir = @env[:machine].box.directory
FileUtils.cp box_dir.join('metadata.json').to_s, @env['package.directory'].to_s
if (template = box_dir.join('lxc-template')).exist?
FileUtils.cp template.to_s, @env['package.directory'].to_s
end
if (conf = box_dir.join('lxc.conf')).exist?
FileUtils.cp conf.to_s, @env['package.directory'].to_s
end
if (conf = box_dir.join('lxc-config')).exist?
FileUtils.cp conf.to_s, @env['package.directory'].to_s
end
end
end
end
end
end

View file

@ -1,65 +0,0 @@
module Vagrant
module LXC
module Action
class ShareFolders < BaseAction
def call(env)
@env = env
prepare_folders
add_start_opts
@app.call env
end
# This method returns an actual list of VirtualBox shared
# folders to create and their proper path.
def shared_folders
{}.tap do |result|
@env[:machine].config.vm.synced_folders.each do |id, data|
# Ignore NFS shared folders
next if data[:nfs]
# This to prevent overwriting the actual shared folders data
result[id] = data.dup
end
end
end
# Prepares the shared folders by verifying they exist and creating them
# if they don't.
def prepare_folders
shared_folders.each do |id, options|
hostpath = Pathname.new(options[:hostpath]).expand_path(@env[:root_path])
if !hostpath.directory? && options[:create]
# Host path doesn't exist, so let's create it.
@logger.debug("Host path doesn't exist, creating: #{hostpath}")
begin
hostpath.mkpath
rescue Errno::EACCES
raise Vagrant::Errors::SharedFolderCreateFailed,
:path => hostpath.to_s
end
end
end
end
def add_start_opts
@env[:ui].info I18n.t("vagrant.actions.lxc.share_folders.preparing")
folders = []
shared_folders.each do |id, data|
folders << {
:name => id,
:hostpath => File.expand_path(data[:hostpath], @env[:root_path]),
:guestpath => data[:guestpath]
}
@env[:ui].info(I18n.t("vagrant.actions.vm.share_folders.mounting_entry",
:guest_path => data[:guestpath]))
end
config = @env[:machine].provider_config
@env[:machine].provider.container.share_folders(folders, config)
end
end
end
end
end

View file

@ -0,0 +1,25 @@
module Vagrant
module LXC
module Action
class WarnNetworks
def initialize(app, env)
@app = app
end
def call(env)
if public_network_configured?(env[:machine].config)
env[:ui].warn(I18n.t("vagrant_lxc.messages.warn_networks"))
end
@app.call(env)
end
def public_network_configured?(config)
config.vm.networks.find do |type, _|
type.to_sym == :public_network
end
end
end
end
end
end

View file

@ -0,0 +1,58 @@
module Vagrant
module LXC
module Command
class Root < Vagrant.plugin("2", :command)
def self.synopsis
'vagrant-lxc specific commands'
end
def initialize(argv, env)
@args, @sub_command, @sub_args = split_main_and_subcommand(argv)
@subcommands = Vagrant::Registry.new.tap do |registry|
registry.register(:sudoers) do
require_relative 'sudoers'
Sudoers
end
end
super(argv, env)
end
def execute
# Print the help
return help if @args.include?("-h") || @args.include?("--help")
klazz = @subcommands.get(@sub_command.to_sym) if @sub_command
return help unless klazz
@logger.debug("Executing command: #{klazz} #{@sub_args.inspect}")
# Initialize and execute the command class
klazz.new(@sub_args, @env).execute
end
def help
opts = OptionParser.new do |opts|
opts.banner = "Usage: vagrant lxc <subcommand> [<args>]"
opts.separator ""
opts.separator "Available subcommands:"
# REFACTOR Use @subcommands.keys.sort
# https://github.com/mitchellh/vagrant/commit/4194da19c60956f6e59239c0145f772be257e79d
keys = []
@subcommands.each { |key, value| keys << key }
keys.sort.each do |key|
opts.separator " #{key}"
end
opts.separator ""
opts.separator "For help on any individual subcommand run `vagrant lxc <subcommand> -h`"
end
@env.ui.info(opts.help, :prefix => false)
end
end
end
end
end

View file

@ -0,0 +1,97 @@
require 'tempfile'
require "vagrant-lxc/driver"
require "vagrant-lxc/sudo_wrapper"
module Vagrant
module LXC
module Command
class Sudoers < Vagrant.plugin("2", :command)
def initialize(argv, env)
super
@argv
@env = env
end
def execute
options = { user: ENV['USER'] }
opts = OptionParser.new do |opts|
opts.banner = "Usage: vagrant lxc sudoers"
opts.separator ""
opts.on('-u user', '--user user', String, "The user for which to create the policy (defaults to '#{options[:user]}')") do |u|
options[:user] = u
end
end
argv = parse_options(opts)
return unless argv
wrapper_path = SudoWrapper.dest_path
wrapper = create_wrapper!
sudoers = create_sudoers!(options[:user], wrapper_path)
su_copy([
{source: wrapper, target: wrapper_path, mode: "0555"},
{source: sudoers, target: sudoers_path, mode: "0440"}
])
end
def sudoers_path
"/etc/sudoers.d/vagrant-lxc"
end
private
# This requires vagrant 1.5.2+ https://github.com/mitchellh/vagrant/commit/3371c3716278071680af9b526ba19235c79c64cb
def create_wrapper!
lxc_base_path = Driver.new("").containers_path
wrapper = Tempfile.new('lxc-wrapper').tap do |file|
template = Vagrant::Util::TemplateRenderer.new(
'sudoers.rb',
:template_root => Vagrant::LXC.source_root.join('templates').to_s,
:cmd_paths => build_cmd_paths_hash,
:lxc_base_path => lxc_base_path,
:pipework_regex => "#{ENV['HOME']}/\.vagrant\.d/gems/(?:\\d+?\\.\\d+?\\.\\d+?/)?gems/vagrant-lxc.+/scripts/pipework"
)
file.puts template.render
end
wrapper.close
wrapper.path
end
def create_sudoers!(user, command)
sudoers = Tempfile.new('vagrant-lxc-sudoers').tap do |file|
file.puts "# Automatically created by vagrant-lxc"
file.puts "#{user} ALL=(root) NOPASSWD: #{command}"
end
sudoers.close
sudoers.path
end
def su_copy(files)
commands = files.map { |file|
[
"rm -f #{file[:target]}",
"cp #{file[:source]} #{file[:target]}",
"chown root:root #{file[:target]}",
"chmod #{file[:mode]} #{file[:target]}"
]
}.flatten
system "echo \"#{commands.join("; ")}\" | sudo sh"
end
def build_cmd_paths_hash
{}.tap do |hash|
%w( which cat mkdir cp chown chmod rm tar chown ip ifconfig brctl ).each do |cmd|
hash[cmd] = `sudo which #{cmd}`.strip
end
hash['lxc_bin'] = Pathname(`sudo which lxc-create`.strip).parent.to_s
hash['ruby'] = Gem.ruby
end
end
end
end
end
end

View file

@ -1,13 +1,76 @@
module Vagrant
module LXC
class Config < Vagrant.plugin("2", :config)
# An array of options to be passed to lxc-start when booting the machine.
# An array of container's configuration overrides to be provided to `lxc-start`.
#
# @return [Array]
attr_reader :start_opts
attr_reader :customizations
# A string that contains the backing store type used with lxc-create -B
attr_accessor :backingstore
# Optional arguments for the backing store, such as --fssize, --fstype, ...
#
# @return [Array]
attr_accessor :backingstore_options
# A string to explicitly set the container name. To use the vagrant
# machine name, set this to :machine
attr_accessor :container_name
# Size (as a string like '400M') of the tmpfs to mount at /tmp on boot.
# Set to false or nil to disable the tmpfs mount altogether. Defaults to '2G'.
attr_accessor :tmpfs_mount_size
attr_accessor :fetch_ip_tries
attr_accessor :ssh_ip_addr
# Whether the container needs to be privileged. Defaults to true (unprivileged containers
# is a very new feature in vagrant-lxc). If false, will try creating an unprivileged
# container. If it can't, will revert to the old "sudo wrapper" method to create a privileged
# container.
attr_accessor :privileged
def initialize
@start_opts = []
@customizations = []
@backingstore = UNSET_VALUE
@backingstore_options = []
@container_name = UNSET_VALUE
@tmpfs_mount_size = UNSET_VALUE
@fetch_ip_tries = UNSET_VALUE
@ssh_ip_addr = UNSET_VALUE
@privileged = UNSET_VALUE
end
# Customize the container by calling `lxc-start` with the given
# configuration overrides.
#
# For example, if you want to set the memory limit, you can use it
# like: config.customize 'cgroup.memory.limit_in_bytes', '400M'
#
# When `lxc-start`ing the container, vagrant-lxc will pass in
# "-s lxc.cgroup.memory.limit_in_bytes=400M" to it.
#
# @param [String] key Configuration key to override
# @param [String] value Configuration value to override
def customize(key, value)
@customizations << [key, value]
end
# Stores options for backingstores like lvm, btrfs, etc
def backingstore_option(key, value)
@backingstore_options << [key, value]
end
def finalize!
@container_name = nil if @container_name == UNSET_VALUE
@backingstore = nil if @backingstore == UNSET_VALUE
@existing_container_name = nil if @existing_container_name == UNSET_VALUE
@tmpfs_mount_size = '2G' if @tmpfs_mount_size == UNSET_VALUE
@fetch_ip_tries = 10 if @fetch_ip_tries == UNSET_VALUE
@ssh_ip_addr = nil if @ssh_ip_addr == UNSET_VALUE
@privileged = true if @privileged == UNSET_VALUE
end
end
end

View file

@ -1,124 +0,0 @@
require 'securerandom'
require "vagrant-lxc/errors"
require "vagrant-lxc/container/cli"
require "vagrant/util/retryable"
require "vagrant/util/subprocess"
module Vagrant
module LXC
class Container
# Root folder where containers are stored
CONTAINERS_PATH = '/var/lib/lxc'
# Default LXC configs
LXC_DEFAULTS_PATH = '/etc/default/lxc'
# Include this so we can use `Subprocess` more easily.
include Vagrant::Util::Retryable
# This is raised if the container can't be found when initializing it with
# a name.
class NotFound < StandardError; end
attr_reader :name
def initialize(name, cli = CLI.new(name))
@name = name
@cli = cli
@logger = Log4r::Logger.new("vagrant::provider::lxc::container")
end
def validate!
raise NotFound if @name && ! @cli.list.include?(@name)
end
def base_path
Pathname.new("#{CONTAINERS_PATH}/#{@name}")
end
def rootfs_path
Pathname.new("#{base_path}/rootfs")
end
def create(metadata = {})
@logger.debug('Creating container using lxc-create...')
@name = SecureRandom.hex(6)
public_key = Vagrant.source_root.join('keys', 'vagrant.pub').expand_path.to_s
meta_opts = metadata.fetch('template-opts', {}).merge(
'--auth-key' => public_key,
'--cache' => metadata.fetch('rootfs-cache-path')
)
@cli.name = @name
@cli.create(metadata.fetch('template-name'), meta_opts)
@name
end
def share_folders(folders, config)
folders.each do |folder|
guestpath = rootfs_path.join(folder[:guestpath].gsub(/^\//, ''))
unless guestpath.directory?
begin
system "sudo mkdir -p #{guestpath.to_s}"
rescue Errno::EACCES
raise Vagrant::Errors::SharedFolderCreateFailed,
:path => guestpath.to_s
end
end
config.start_opts << "lxc.mount.entry=#{folder[:hostpath]} #{guestpath} none bind 0 0"
end
end
def start(config)
@logger.info('Starting container...')
opts = config.start_opts.dup
if ENV['LXC_START_LOG_FILE']
extra = ['-o', ENV['LXC_START_LOG_FILE'], '-l', 'DEBUG']
end
@cli.transition_to(:running) { |c| c.start(opts, (extra || nil)) }
end
def halt
@logger.info('Shutting down container...')
# TODO: issue an lxc-stop if a timeout gets reached
@cli.transition_to(:stopped) { |c| c.shutdown }
end
def destroy
@cli.destroy
end
def state
if @name
@cli.state
end
end
def assigned_ip
ip = ''
retryable(:on => LXC::Errors::ExecuteError, :tries => 10, :sleep => 3) do
unless ip = get_container_ip_from_ifconfig
# retry
raise LXC::Errors::ExecuteError, :command => ['arp', '-n'].inspect
end
end
ip
end
def get_container_ip_from_ifconfig
output = @cli.attach '/sbin/ifconfig', '-v', 'eth0', namespaces: 'network'
if output =~ /\s+inet addr:([0-9.]+)\s+/
return $1.to_s
end
end
end
end
end

View file

@ -1,136 +0,0 @@
require "vagrant/util/retryable"
require "vagrant/util/subprocess"
require "vagrant-lxc/errors"
module Vagrant
module LXC
class Container
class CLI
attr_accessor :name
class TransitionBlockNotProvided < RuntimeError; end
# Include this so we can use `Subprocess` more easily.
include Vagrant::Util::Retryable
def initialize(name = nil)
@name = name
@logger = Log4r::Logger.new("vagrant::provider::lxc::container::cli")
end
def list
run(:ls).split(/\s+/).uniq
end
def state
if @name && run(:info, '--name', @name) =~ /^state:[^A-Z]+([A-Z]+)$/
$1.downcase.to_sym
elsif @name
:unknown
end
end
def create(template, template_opts = {})
extra = template_opts.to_a.flatten
extra.unshift '--' unless extra.empty?
run :create,
# lxc-create options
'--template', template,
'--name', @name,
*extra
end
def destroy
run :destroy, '--name', @name
end
def start(configs = [], extra_opts = [])
configs = configs.map { |conf| ["-s", conf] }.flatten
configs += extra_opts if extra_opts
run :start, '-d', '--name', @name, *configs
end
def shutdown
run :shutdown, '--name', @name
end
def attach(*cmd)
cmd = ['--'] + cmd
if cmd.last.is_a?(Hash)
opts = cmd.pop
namespaces = Array(opts[:namespaces]).map(&:upcase).join('|')
extra = ['--namespaces', namespaces] if namespaces
end
run :attach, '--name', @name, *((extra || []) + cmd)
end
def transition_to(state, &block)
raise TransitionBlockNotProvided unless block_given?
yield self
run :wait, '--name', @name, '--state', state.to_s.upcase
end
private
def run(command, *args)
execute('sudo', "lxc-#{command}", *args)
end
# TODO: Review code below this line, it was pretty much a copy and
# paste from VirtualBox base driver and has no tests
def execute(*command, &block)
# Get the options hash if it exists
opts = {}
opts = command.pop if command.last.is_a?(Hash)
tries = 0
tries = 3 if opts[:retryable]
sleep = opts.fetch(:sleep, 1)
# Variable to store our execution result
r = nil
retryable(:on => LXC::Errors::ExecuteError, :tries => tries, :sleep => sleep) do
# Execute the command
r = raw(*command, &block)
# If the command was a failure, then raise an exception that is
# nicely handled by Vagrant.
if r.exit_code != 0
if @interrupted
@logger.info("Exit code != 0, but interrupted. Ignoring.")
else
raise LXC::Errors::ExecuteError, :command => command.inspect
end
end
end
# Return the output, making sure to replace any Windows-style
# newlines with Unix-style.
r.stdout.gsub("\r\n", "\n")
end
def raw(*command, &block)
int_callback = lambda do
@interrupted = true
@logger.info("Interrupted.")
end
# Append in the options for subprocess
command << { :notify => [:stdout, :stderr] }
Vagrant::Util::Busy.busy(int_callback) do
Vagrant::Util::Subprocess.execute(*command, &block)
end
end
end
end
end
end

290
lib/vagrant-lxc/driver.rb Normal file
View file

@ -0,0 +1,290 @@
require "vagrant/util/retryable"
require "vagrant/util/subprocess"
require "vagrant-lxc/errors"
require "vagrant-lxc/driver/cli"
require "vagrant-lxc/sudo_wrapper"
require "etc"
require "tempfile"
module Vagrant
module LXC
class Driver
# This is raised if the container can't be found when initializing it with
# a name.
class ContainerNotFound < StandardError; end
# Default root folder where container configs are stored
attr_reader :container_name,
:customizations
def initialize(container_name, sudo_wrapper = nil, cli = nil, privileged: true)
@container_name = container_name
@sudo_wrapper = sudo_wrapper || SudoWrapper.new(privileged: privileged)
@cli = cli || CLI.new(@sudo_wrapper, container_name)
@logger = Log4r::Logger.new("vagrant::provider::lxc::driver")
@customizations = []
end
def validate!
raise ContainerNotFound if @container_name && ! @cli.list.include?(@container_name)
end
# Root folder where container configs are stored
def containers_path
@containers_path ||= @cli.config('lxc.lxcpath')
end
def all_containers
@cli.list
end
def base_path
Pathname.new("#{containers_path}/#{@container_name}")
end
def config_path
base_path.join('config').to_s
end
def rootfs_path
pathtype, path = config_string.match(/^lxc\.rootfs(?:\.path)?\s+=\s+(.+:)?(.+)$/)[1..2]
case pathtype
when 'overlayfs:'
# Split on colon (:), ignoring any colon escaped by an escape character ( \ )
# Pays attention to when the escape character is itself escaped.
_, overlay_path = config_entry.split(/(?<!\\)(?:\\\\)*:/)
if overlay_path
Pathname.new(overlay_path)
else
# Malformed: fall back to prior behaviour
Pathname.new(path)
end
else
Pathname.new(path)
end
end
def mac_address
return @mac_address if @mac_address
if config_string =~ /^lxc\.network\.hwaddr\s*+=\s*+(.+)$/
@mac_address = $1
end
end
def config_string
@sudo_wrapper.run('cat', config_path)
end
def create(name, backingstore, backingstore_options, template_path, config_file, template_options = {})
@cli.name = @container_name = name
@logger.debug "Creating container..."
@cli.create template_path, backingstore, backingstore_options, config_file, template_options
end
def share_folders(folders)
folders.each do |f|
share_folder(f[:hostpath], f[:guestpath], f.fetch(:mount_options, nil))
end
end
def share_folder(host_path, guest_path, mount_options = nil)
guest_path = guest_path.gsub(/^\//, '').gsub(' ', '\\\040')
mount_options = Array(mount_options || ['bind', 'create=dir'])
host_path = host_path.to_s.gsub(' ', '\\\040')
@customizations << ['mount.entry', "#{host_path} #{guest_path} none #{mount_options.join(',')} 0 0"]
end
def start(customizations)
@logger.info('Starting container...')
if ENV['LXC_START_LOG_FILE']
extra = ['-o', ENV['LXC_START_LOG_FILE'], '-l', 'DEBUG']
end
prune_customizations
write_customizations(customizations + @customizations)
@cli.start(extra)
end
def forced_halt
@logger.info('Shutting down container...')
@cli.transition_to(:stopped) { |c| c.stop }
end
def destroy
@cli.destroy
end
def attach(*command)
@cli.attach(*command)
end
def info(*command)
@cli.info(*command)
end
def configure_private_network(bridge_name, bridge_ip, container_name, address_type, ip)
@logger.info "Configuring network interface for #{container_name} using #{ip} and bridge #{bridge_name}"
if ip
ip += '/24'
end
if ! bridge_exists?(bridge_name)
if not bridge_ip
raise "Bridge is missing and no IP was specified!"
end
@logger.info "Creating the bridge #{bridge_name}"
cmd = [
'brctl',
'addbr',
bridge_name
]
@sudo_wrapper.run(*cmd)
end
if ! bridge_has_an_ip?(bridge_name)
if not bridge_ip
raise "Bridge has no IP and none was specified!"
end
@logger.info "Adding #{bridge_ip} to the bridge #{bridge_name}"
cmd = [
'ip',
'addr',
'add',
"#{bridge_ip}/24",
'dev',
bridge_name
]
@sudo_wrapper.run(*cmd)
@sudo_wrapper.run('ip', 'link', 'set', bridge_name, 'up')
end
cmd = [
Vagrant::LXC.source_root.join('scripts/pipework').to_s,
bridge_name,
container_name,
ip ||= "dhcp"
]
@sudo_wrapper.run(*cmd)
end
def bridge_has_an_ip?(bridge_name)
@logger.info "Checking whether the bridge #{bridge_name} has an IP"
`ip -4 addr show scope global #{bridge_name}` =~ /^\s+inet ([0-9.]+)\/[0-9]+\s+/
end
def bridge_exists?(bridge_name)
@logger.info "Checking whether bridge #{bridge_name} exists"
brctl_output = `ip link | egrep -q " #{bridge_name}:"`
$?.to_i == 0
end
def bridge_is_in_use?(bridge_name)
# REFACTOR: This method is **VERY** hacky
@logger.info "Checking if bridge #{bridge_name} is in use"
brctl_output = `brctl show #{bridge_name} 2>/dev/null | tail -n +2 | grep -q veth`
$?.to_i == 0
end
def remove_bridge(bridge_name)
if ['lxcbr0', 'virbr0'].include? bridge_name
@logger.info "Skipping removal of system bridge #{bridge_name}"
return
end
return unless bridge_exists?(bridge_name)
@logger.info "Removing bridge #{bridge_name}"
@sudo_wrapper.run('ip', 'link', 'set', bridge_name, 'down')
@sudo_wrapper.run('brctl', 'delbr', bridge_name)
end
def version
@version ||= @cli.version
end
def supports_new_config_format
Gem::Version.new(version) >= Gem::Version.new('2.1.0')
end
# TODO: This needs to be reviewed and specs needs to be written
def compress_rootfs
# TODO: Pass in tmpdir so we can clean up from outside
target_path = "#{Dir.mktmpdir}/rootfs.tar.gz"
@logger.info "Compressing '#{rootfs_path}' rootfs to #{target_path}"
@sudo_wrapper.run('tar', '--numeric-owner', '-cvzf', target_path, '-C',
rootfs_path.parent.to_s, "./#{rootfs_path.basename.to_s}")
@logger.info "Changing rootfs tarball owner"
user_details = Etc.getpwnam(Etc.getlogin)
@sudo_wrapper.run('chown', "#{user_details.uid}:#{user_details.gid}", target_path)
target_path
end
def state
if @container_name
@cli.state
end
end
def prune_customizations
# Use sed to just strip out the block of code which was inserted by Vagrant
@logger.debug 'Prunning vagrant-lxc customizations'
contents = config_string
contents.gsub! /^# VAGRANT-BEGIN(.|\s)*# VAGRANT-END\n/, ''
write_config(contents)
end
def update_config_keys(path = nil)
path = path || config_path
@cli.update_config(path)
rescue Errors::ExecuteError
# not on LXC 2.1+. Doesn't matter, ignore.
end
protected
def write_customizations(customizations)
customizations = customizations.map do |key, value|
"lxc.#{key}=#{value}"
end
customizations.unshift '# VAGRANT-BEGIN'
customizations << "# VAGRANT-END\n"
contents = config_string
contents << customizations.join("\n")
write_config(contents)
end
def write_config(contents)
confpath = base_path.join('config').to_s
begin
File.open(confpath, File::RDWR) do |file|
file.write contents
end
rescue
# We don't have permissions to write in the conf file. That's probably because it's a
# privileged container. Work around that through sudo_wrapper.
Tempfile.new('lxc-config').tap do |file|
file.chmod 0644
file.write contents
file.close
@sudo_wrapper.run 'cp', '-f', file.path, confpath
@sudo_wrapper.run 'chown', 'root:root', confpath
end
end
end
end
end
end

View file

@ -0,0 +1,152 @@
require "vagrant/util/retryable"
require "vagrant/util/subprocess"
require "vagrant-lxc/errors"
module Vagrant
module LXC
class Driver
class CLI
attr_accessor :name
class TransitionBlockNotProvided < RuntimeError; end
class TargetStateNotReached < RuntimeError
def initialize(target_state, state)
msg = "Target state '#{target_state}' not reached, currently on '#{state}'"
super(msg)
end
end
def initialize(sudo_wrapper, name = nil)
@sudo_wrapper = sudo_wrapper
@name = name
@logger = Log4r::Logger.new("vagrant::provider::lxc::container::cli")
end
def list
run(:ls).split(/\s+/).uniq
end
def version
return @version if @version
@version = run(:create, '--version')
if @version =~ /(lxc version:\s+|)(.+)\s*$/
@version = $2.downcase
else
# TODO: Raise an user friendly error
raise 'Unable to parse lxc version!'
end
end
def config(param)
run(:config, param).gsub("\n", '')
end
def update_config(path)
run('update-config', '-c', path)
end
def state
if @name && run(:info, '--name', @name, retryable: true) =~ /^state:[^A-Z]+([A-Z]+)$/i
$1.downcase.to_sym
elsif @name
:unknown
end
end
def create(template, backingstore, backingstore_options, config_file, template_opts = {})
if config_file
config_opts = ['-f', config_file]
end
extra = template_opts.to_a.flatten.reject { |elem| elem.empty? }
extra.unshift '--' unless extra.empty?
run :create,
'-B', backingstore,
'--template', template,
'--name', @name,
*(backingstore_options.to_a.flatten),
*(config_opts),
*extra
rescue Errors::ExecuteError => e
if e.stderr =~ /already exists/i
raise Errors::ContainerAlreadyExists, name: @name
else
raise
end
end
def destroy
run :destroy, '--name', @name
end
def start(options = [])
run :start, '-d', '--name', @name, *Array(options)
end
## lxc-stop will exit 2 if machine was already stopped
# Man Page:
# 2 The specified container exists but was not running.
def stop
begin
run :stop, '--name', @name
rescue LXC::Errors::ExecuteError => e
if e.exitcode == 2
@logger.debug "Machine already stopped, lxc-stop returned 2"
else
raise e
end
end
end
def attach(*cmd)
cmd = ['--'] + cmd
if cmd.last.is_a?(Hash)
opts = cmd.pop
namespaces = Array(opts[:namespaces]).map(&:upcase).join('|')
# HACK: The wrapper script should be able to handle this
if @sudo_wrapper.wrapper_path
namespaces = "'#{namespaces}'"
end
if namespaces
extra = ['--namespaces', namespaces]
end
end
run :attach, '--name', @name, *((extra || []) + cmd)
end
def info(*cmd)
run(:info, '--name', @name, *cmd)
end
def transition_to(target_state, tries = 30, timeout = 1, &block)
raise TransitionBlockNotProvided unless block_given?
yield self
while (last_state = self.state) != target_state && tries > 0
@logger.debug "Target state '#{target_state}' not reached, currently on '#{last_state}'"
sleep timeout
tries -= 1
end
unless last_state == target_state
# TODO: Raise an user friendly message
raise TargetStateNotReached.new target_state, last_state
end
end
private
def run(command, *args)
@sudo_wrapper.run("lxc-#{command}", *args)
end
end
end
end
end

View file

@ -1,12 +1,62 @@
require 'vagrant/errors'
module Vagrant
module LXC
module Errors
class ExecuteError < Vagrant::Errors::VagrantError
error_key(:lxc_execute_error)
attr_reader :stderr, :stdout, :exitcode
def initialize(message, *args)
super
if message.is_a?(Hash)
@stderr = message[:stderr]
@stdout = message[:stdout]
@exitcode = message[:exitcode]
end
end
end
# Raised when user interrupts a subprocess
class SubprocessInterruptError < Vagrant::Errors::VagrantError
error_key(:lxc_interrupt_error)
def initialize(message, *args)
super
end
end
class LxcLinuxRequired < Vagrant::Errors::VagrantError
error_key(:lxc_linux_required)
end
class LxcNotInstalled < Vagrant::Errors::VagrantError
error_key(:lxc_not_installed)
end
class ContainerAlreadyExists < Vagrant::Errors::VagrantError
error_key(:lxc_container_already_exists)
end
class CommandNotSupported < Vagrant::Errors::VagrantError
error_key(:lxc_command_not_supported)
end
# Box related errors
class TemplateFileMissing < Vagrant::Errors::VagrantError
error_key(:lxc_template_file_missing)
end
class TemplatesDirMissing < Vagrant::Errors::VagrantError
error_key(:lxc_templates_dir_missing)
end
class RootFSTarballMissing < Vagrant::Errors::VagrantError
error_key(:lxc_invalid_box_version)
end
class IncompatibleBox < Vagrant::Errors::VagrantError
error_key(:lxc_incompatible_box)
end
class RedirNotInstalled < Vagrant::Errors::VagrantError
error_key(:lxc_redir_not_installed)
end
end
end
end

View file

@ -1,25 +0,0 @@
module Vagrant
module LXC
class MachineState < Vagrant::MachineState
CREATED_STATES = %w( running stopped ).map!(&:to_sym)
def initialize(state_id)
short = state_id.to_s.gsub("_", " ")
long = I18n.t("vagrant.commands.status.#{state_id}")
super(state_id, short, long)
end
def created?
CREATED_STATES.include?(self.id)
end
def off?
self.id == :stopped
end
def running?
self.id == :running
end
end
end
end

View file

@ -1,23 +1,51 @@
require "vagrant"
require 'vagrant'
module Vagrant
module LXC
class Plugin < Vagrant.plugin("2")
name "Linux Containers (LXC) provider"
name "vagrant-lxc"
description <<-EOF
The LXC provider allows Vagrant to manage and control
LXC-based virtual machines.
EOF
provider(:lxc) do
require File.expand_path("../provider", __FILE__)
provider(:lxc, parallel: true, priority: 7) do
require_relative 'provider'
init!
Provider
end
command "lxc" do
require_relative 'command/root'
init!
Command::Root
end
config(:lxc, :provider) do
require File.expand_path("../config", __FILE__)
require_relative 'config'
init!
Config
end
synced_folder(:lxc) do
require_relative 'synced_folder'
SyncedFolder
end
provider_capability("lxc", "public_address") do
require_relative "provider/cap/public_address"
Provider::Cap::PublicAddress
end
protected
def self.init!
return if defined?(@_init)
I18n.load_path << File.expand_path(File.dirname(__FILE__) + '/../../locales/en.yml')
I18n.reload!
@_init = true
end
end
end
end

View file

@ -1,21 +1,37 @@
require "log4r"
require "vagrant-lxc/action"
require "vagrant-lxc/container"
require "vagrant-lxc/machine_state"
require "vagrant-lxc/driver"
module Vagrant
module LXC
class Provider < Vagrant.plugin("2", :provider)
attr_reader :container
attr_reader :driver
def self.usable?(raise_error=false)
if !Vagrant::Util::Platform.linux?
raise Errors::LxcLinuxRequired
end
true
end
def initialize(machine)
@logger = Log4r::Logger.new("vagrant::provider::lxc")
@machine = machine
ensure_lxc_installed!
machine_id_changed
end
def ensure_lxc_installed!
begin
SudoWrapper.new(privileged: @machine.provider_config.privileged).run("which", "lxc-create")
rescue Vagrant::LXC::Errors::ExecuteError
raise Errors::LxcNotInstalled
end
end
# If the machine ID changed, then we need to rebuild our underlying
# container.
def machine_id_changed
@ -23,9 +39,9 @@ module Vagrant
begin
@logger.debug("Instantiating the container for: #{id.inspect}")
@container = Container.new(id)
@container.validate!
rescue Container::NotFound
@driver = Driver.new(id, privileged: @machine.provider_config.privileged)
@driver.validate!
rescue Driver::ContainerNotFound
# The container doesn't exist, so we probably have a stale
# ID. Just clear the id out of the machine and reload it.
@logger.debug("Container not found! Clearing saved machine ID and reloading.")
@ -34,35 +50,46 @@ module Vagrant
end
end
# @see Vagrant::Plugin::V1::Provider#action
# @see Vagrant::Plugin::V2::Provider#action
def action(name)
# Attempt to get the action method from the Action class if it
# exists, otherwise return nil to show that we don't support the
# given action.
action_method = "action_#{name}"
# TODO: Rename to singular
return LXC::Action.send(action_method) if LXC::Action.respond_to?(action_method)
nil
end
# Returns the SSH info for accessing the Container.
def ssh_info
# If the Container is not created then we cannot possibly SSH into it, so
# If the Container is not running then we cannot possibly SSH into it, so
# we return nil.
return nil if state == :not_created
return nil if state.id != :running
# Run a custom action called "ssh_ip" which does what it says and puts
# the IP found into the `:machine_ip` key in the environment.
env = @machine.action("ssh_ip")
# If we were not able to identify the container's IP, we return nil
# here and we let Vagrant core deal with it ;)
return nil unless env[:machine_ip]
{
:host => @container.assigned_ip,
:port => 22 # @driver.ssh_port(@machine.config.ssh.guest_port)
:host => env[:machine_ip],
:port => @machine.config.ssh.guest_port
}
end
def state
state_id = nil
state_id = :not_created if !@container.name
state_id = @container.state if !state_id
state_id = :not_created if !@driver.container_name
state_id = @driver.state if !state_id
state_id = :unknown if !state_id
LXC::MachineState.new(state_id)
short = state_id.to_s.gsub("_", " ")
long = I18n.t("vagrant.commands.status.#{state_id}")
Vagrant::MachineState.new(state_id, short, long)
end
def to_s

View file

@ -0,0 +1,17 @@
module Vagrant
module LXC
class Provider
module Cap
module PublicAddress
def self.public_address(machine)
return nil if machine.state.id != :running
ssh_info = machine.ssh_info
return nil if !ssh_info
ssh_info[:host]
end
end
end
end
end
end

View file

@ -0,0 +1,104 @@
module Vagrant
module LXC
class SudoWrapper
# Include this so we can use `Subprocess` more easily.
include Vagrant::Util::Retryable
attr_reader :wrapper_path
def self.dest_path
"/usr/local/bin/vagrant-lxc-wrapper"
end
def initialize(privileged: true)
@wrapper_path = Pathname.new(SudoWrapper.dest_path).exist? && SudoWrapper.dest_path || nil
@privileged = privileged
@logger = Log4r::Logger.new("vagrant::lxc::sudo_wrapper")
end
def run(*command)
options = command.last.is_a?(Hash) ? command.last : {}
# Avoid running LXC commands with a restrictive umask.
# Otherwise disasters occur, like the container root directory
# having permissions `rwxr-x---` which prevents the `vagrant`
# user from accessing its own home directory; among other
# problems, SSH cannot then read `authorized_keys`!
old_mask = File.umask
File.umask(old_mask & 022) # allow all `r` and `x` bits
begin
if @privileged
if @wrapper_path && !options[:no_wrapper]
command.unshift @wrapper_path
execute *(['sudo'] + command)
else
execute *(['sudo', '/usr/bin/env'] + command)
end
else
execute *(['/usr/bin/env'] + command)
end
ensure
File.umask(old_mask)
end
end
private
# TODO: Review code below this line, it was pretty much a copy and
# paste from VirtualBox base driver and has no tests
def execute(*command, &block)
# Get the options hash if it exists
opts = {}
opts = command.pop if command.last.is_a?(Hash)
tries = 0
tries = 3 if opts[:retryable]
sleep = opts.fetch(:sleep, 1)
# Variable to store our execution result
r = nil
retryable(:on => LXC::Errors::ExecuteError, :tries => tries, :sleep => sleep) do
# Execute the command
r = raw(*command, &block)
# If the command was a failure, then raise an exception that is
# nicely handled by Vagrant.
if r.exit_code != 0
if @interrupted
raise LXC::Errors::SubprocessInterruptError, command.inspect
else
raise LXC::Errors::ExecuteError,
command: command.inspect, stderr: r.stderr, stdout: r.stdout, exitcode: r.exit_code
end
end
end
# Return the output, making sure to replace any Windows-style
# newlines with Unix-style.
stdout = r.stdout.gsub("\r\n", "\n")
if opts[:show_stderr]
{ :stdout => stdout, :stderr => r.stderr.gsub("\r\n", "\n") }
else
stdout
end
end
def raw(*command, &block)
int_callback = lambda do
@interrupted = true
@logger.info("Interrupted.")
end
# Append in the options for subprocess
command << { :notify => [:stdout, :stderr] }
Vagrant::Util::Busy.busy(int_callback) do
Vagrant::Util::Subprocess.execute(*command, &block)
end
end
end
end
end

View file

@ -0,0 +1,72 @@
module Vagrant
module LXC
class SyncedFolder < Vagrant.plugin("2", :synced_folder)
def usable?(machine)
# These synced folders only work if the provider is LXC
machine.provider_name == :lxc
end
def prepare(machine, folders, _opts)
machine.ui.output(I18n.t("vagrant.actions.lxc.share_folders.preparing"))
# short guestpaths first, so we don't step on ourselves
folders = folders.sort_by do |id, data|
if data[:guestpath]
data[:guestpath].length
else
# A long enough path to just do this at the end.
10000
end
end
folders.each do |id, data|
host_path = Pathname.new(File.expand_path(data[:hostpath], machine.env.root_path))
guest_path = data[:guestpath]
machine.env.ui.warn(I18n.t("vagrant_lxc.messages.warn_owner")) if data[:owner]
machine.env.ui.warn(I18n.t("vagrant_lxc.messages.warn_group")) if data[:group]
if !host_path.directory? && data[:create]
# Host path doesn't exist, so let's create it.
@logger.info("Host path doesn't exist, creating: #{host_path}")
begin
host_path.mkpath
rescue Errno::EACCES
raise Vagrant::Errors::SharedFolderCreateFailed,
:path => hostpath.to_s
end
end
mount_opts = data[:mount_options]
machine.provider.driver.share_folder(host_path, guest_path, mount_opts)
# Guest path specified, so mount the folder to specified point
machine.ui.detail(I18n.t("vagrant.actions.vm.share_folders.mounting_entry",
guestpath: data[:guestpath],
hostpath: data[:hostpath],
guest_path: data[:guestpath]))
end
end
def enable(machine, folders, _opts)
# Emit an upstart event if we can
return unless machine.communicate.test("test -x /sbin/initctl")
# short guestpaths first, so we don't step on ourselves
folders = folders.sort_by do |id, data|
if data[:guestpath]
data[:guestpath].length
else
# A long enough path to just do this at the end.
10000
end
end
folders.each do |id, data|
guest_path = data[:guestpath]
machine.communicate.sudo(
"/sbin/initctl emit --no-wait vagrant-mounted MOUNTPOINT=#{guest_path}")
end
end
end
end
end

View file

@ -1,5 +1,5 @@
module Vagrant
module LXC
VERSION = "0.0.3"
VERSION = "1.4.2"
end
end

View file

@ -1,17 +1,82 @@
en:
vagrant_lxc:
messages:
not_created: |-
The container hasn't been created yet.
not_running: |-
The container is not currently running.
will_not_destroy: |-
The container '%{name}' will not be destroyed, since the confirmation
was declined.
starting: |-
Starting container...
force_shutdown: |-
Forcing shutdown of container...
warn_networks: |-
Warning! The LXC provider doesn't support public networks, the settings
will be silently ignored.
warn_group: |-
Warning! The LXC provider doesn't support the :group parameter for synced
folders. It will be silently ignored.
warn_owner: |-
Warning! The LXC provider doesn't support the :owner parameter for synced
folders. It will be silently ignored.
setup_private_network: |-
Setting up private networks...
remove_bridge: |-
Removing bridge '%{name}'...
vagrant:
commands:
status:
stopped: |-
The container is currently stopped. Run `vagrant up` to bring it up again.
actions:
lxc:
compressing_rootfs: Compressing container's rootfs...
share_folders:
preparing: Setting up mount entries for shared folders...
errors:
lxc_interrupt_error: |-
Interrupted
lxc_execute_error: |-
There was an error executing %{command}
For more information on the failure, enable detailed logging by setting
the environment variable VAGRANT_LOG to DEBUG.
lxc_incompatible_box: |-
The base box you are trying to use is not compatible with the installed
vagrant-lxc version. Supported box versions are %{supported} but %{found} was found.
lxc_template_file_missing: |-
The template file used for creating the container was not found for %{name}
box.
lxc_templates_dir_missing: |-
Unable to identify lxc templates path.
Looked up under: %{paths}
lxc_linux_required: |-
The LXC provider only works on Linux. Please try to use
another provider.
lxc_not_installed: |-
The `lxc` package does not seem to be installed or `lxc-create` is not accessible on the PATH.
lxc_redir_not_installed: |-
`redir` is not installed or is not accessible on the PATH.
lxc_container_already_exists: |-
There is container on your system with the same name you've specified
on your Vagrantfile (%{name}), please choose a different one or
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}.

180
scripts/lxc-template Executable file
View file

@ -0,0 +1,180 @@
#!/usr/bin/env bash
# This is a modified version of /usr/share/lxc/templates/lxc-download
# that comes with ubuntu-lxc 1.0.0 stable from ppa changed to suit vagrant-lxc needs
#
# Copyright © 2014 Stéphane Graber <stgraber@ubuntu.com>
# Copyright © 2014 Fábio Rehm <fgrehm@gmail.com>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
# USA
set -eu
LXC_HOOK_DIR="/usr/share/lxc/hooks"
LXC_TEMPLATE_CONFIG="/usr/share/lxc/config"
LXC_MAPPED_GID=
LXC_MAPPED_UID=
LXC_NAME=
LXC_PATH=
LXC_ROOTFS=
LXC_TARBALL=
LXC_CONFIG=
LXC_USE_OLDCONFIG=
LXC_STRIP_COMPONENTS=2
usage() {
cat <<EOF
vagrant-lxc default template
Required arguments:
[ --tarball <path> ]: The full path of the rootfs tarball
Optional arguments:
[ --config ]: Configuration file to be used when building the container
[ --oldconfig ]: Use pre LXC 2.1 config format
[ -h | --help ]: This help message
LXC internal arguments (do not pass manually!):
[ --name <name> ]: The container name
[ --path <path> ]: The path to the container
[ --rootfs <rootfs> ]: The path to the container's rootfs
[ --mapped-uid <map> ]: A uid map (user namespaces)
[ --mapped-gid <map> ]: A gid map (user namespaces)
[ --strip-components <num> ]: Number of path components to strip from tarball
EOF
return 0
}
options=$(getopt -o h -l tarball:,config:,oldconfig,help:,name:,path:,rootfs:,mapped-uid:,mapped-gid:,strip-components: -- "$@")SS
if [ $? -ne 0 ]; then
usage $(basename $0)
exit 1
fi
eval set -- "$options"
while true
do
case "$1" in
-h|--help) usage $0 && exit 0;;
--config) LXC_CONFIG=$2; shift 2;;
--oldconfig) LXC_USE_OLDCONFIG=1; shift 1;;
--tarball) LXC_TARBALL=$2; shift 2;;
--name) LXC_NAME=$2; shift 2;;
--path) LXC_PATH=$2; shift 2;;
--rootfs) LXC_ROOTFS=$2; shift 2;;
--mapped-uid) LXC_MAPPED_UID=$2; shift 2;;
--mapped-gid) LXC_MAPPED_GID=$2; shift 2;;
--strip-components) LXC_STRIP_COMPONENTS=$2; shift 2;;
*) break;;
esac
done
if [ -z "${LXC_NAME}" ]; then
echo "'name' parameter is required"
exit 1
fi
if [ -z "${LXC_TARBALL}" ]; then
echo "'tarball' parameter is required"
exit 1
fi
if [ -z "${LXC_PATH}" ]; then
echo "'path' parameter is required"
exit 1
fi
# if $LXC_ROOTFS exists here, it was passed in with --rootfs
if [ -z "${LXC_ROOTFS}" ]; then
config=${LXC_PATH}/config
if grep -q '^lxc.rootfs' $config 2>/dev/null ; then
LXC_ROOTFS=`grep 'lxc.rootfs =' $config | awk -F= '{ print $2 }'`
else
LXC_ROOTFS=$LXC_PATH/rootfs
echo "lxc.rootfs = ${LXC_ROOTFS}" >> $config
fi
fi
# Unpack the rootfs
echo "Unpacking the rootfs"
(
flock -x 200
if [ $? -ne 0 ]; then
echo "Cache repository is busy."
exit 1
fi
mkdir -p ${LXC_ROOTFS}
(cd ${LXC_ROOTFS} && tar xfz ${LXC_TARBALL} --strip-components=${LXC_STRIP_COMPONENTS} --xattrs --xattrs-include=* || true)
if [ ! -f ${LXC_ROOTFS}/bin/true ]; then
echo "Failed to extract rootfs"
exit 1
fi
) 200>${LXC_PATH}/vagrant_lock
rm ${LXC_PATH}/vagrant_lock
mkdir -p ${LXC_ROOTFS}/dev/pts/
## Extract all the network config entries
sed -i -e "/lxc.network/{w ${LXC_PATH}/config-network" -e "d}" \
${LXC_PATH}/config
## Extract any other config entry
sed -i -e "/lxc./{w ${LXC_PATH}/config-auto" -e "d}" ${LXC_PATH}/config
## Add the container-specific config
echo "" >> ${LXC_PATH}/config
echo "##############################################" >> ${LXC_PATH}/config
echo "# Container specific configuration (automatically set)" >> ${LXC_PATH}/config
if [ -e "${LXC_PATH}/config-auto" ]; then
cat ${LXC_PATH}/config-auto >> ${LXC_PATH}/config
rm ${LXC_PATH}/config-auto
fi
if [ $LXC_USE_OLDCONFIG ]; then
echo "lxc.utsname = ${LXC_NAME}" >> ${LXC_PATH}/config
else
echo "lxc.uts.name = ${LXC_NAME}" >> ${LXC_PATH}/config
fi
## Re-add the previously removed network config
if [ -e "${LXC_PATH}/config-network" ]; then
echo "" >> ${LXC_PATH}/config
echo "##############################################" >> ${LXC_PATH}/config
echo "# Network configuration (automatically set)" >> ${LXC_PATH}/config
cat ${LXC_PATH}/config-network >> ${LXC_PATH}/config
rm ${LXC_PATH}/config-network
fi
if [ -n "${LXC_CONFIG}" ]; then
## Append the defaults
echo "" >> ${LXC_PATH}/config
echo "##############################################" >> ${LXC_PATH}/config
echo "# vagrant-lxc base box specific configuration" >> ${LXC_PATH}/config
cat ${LXC_CONFIG} >> ${LXC_PATH}/config
fi
# Empty section for lxc.customize calls from vagrantfile
echo "" >> ${LXC_PATH}/config
echo "##############################################" >> ${LXC_PATH}/config
echo "# vagrant-lxc container specific configuration" >> ${LXC_PATH}/config
exit 0

422
scripts/pipework Executable file
View file

@ -0,0 +1,422 @@
#!/bin/sh
# This code should (try to) follow Google's Shell Style Guide
# (https://google-styleguide.googlecode.com/svn/trunk/shell.xml)
set -e
case "$1" in
--wait)
WAIT=1
;;
esac
IFNAME=$1
# default value set further down if not set here
CONTAINER_IFNAME=
if [ "$2" = "-i" ]; then
CONTAINER_IFNAME=$3
shift 2
fi
if [ "$2" = "-l" ]; then
LOCAL_IFNAME=$3
shift 2
fi
GUESTNAME=$2
IPADDR=$3
MACADDR=$4
case "$MACADDR" in
*@*)
VLAN="${MACADDR#*@}"
VLAN="${VLAN%%@*}"
MACADDR="${MACADDR%%@*}"
;;
*)
VLAN=
;;
esac
# did they ask to generate a custom MACADDR?
# generate the unique string
case "$MACADDR" in
U:*)
macunique="${MACADDR#*:}"
# now generate a 48-bit hash string from $macunique
MACADDR=$(echo $macunique|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
;;
esac
[ "$IPADDR" ] || [ "$WAIT" ] || {
echo "Syntax:"
echo "pipework <hostinterface> [-i containerinterface] [-l localinterfacename] <guest> <ipaddr>/<subnet>[@default_gateway] [macaddr][@vlan]"
echo "pipework <hostinterface> [-i containerinterface] [-l localinterfacename] <guest> dhcp [macaddr][@vlan]"
echo "pipework route <guest> <route_command>"
echo "pipework --wait [-i containerinterface]"
exit 1
}
# Succeed if the given utility is installed. Fail otherwise.
# For explanations about `which` vs `type` vs `command`, see:
# http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212
# (Thanks to @chenhanxiao for pointing this out!)
installed () {
command -v "$1" >/dev/null 2>&1
}
# Google Styleguide says error messages should go to standard error.
warn () {
echo "$@" >&2
}
die () {
status="$1"
shift
warn "$@"
exit "$status"
}
# First step: determine type of first argument (bridge, physical interface...),
# Unless "--wait" is set (then skip the whole section)
if [ -z "$WAIT" ]; then
if [ -d "/sys/class/net/$IFNAME" ]
then
if [ -d "/sys/class/net/$IFNAME/bridge" ]; then
IFTYPE=bridge
BRTYPE=linux
elif installed ovs-vsctl && ovs-vsctl list-br|grep -q "^${IFNAME}$"; then
IFTYPE=bridge
BRTYPE=openvswitch
elif [ "$(cat "/sys/class/net/$IFNAME/type")" -eq 32 ]; then # InfiniBand IPoIB interface type 32
IFTYPE=ipoib
# The IPoIB kernel module is fussy, set device name to ib0 if not overridden
CONTAINER_IFNAME=${CONTAINER_IFNAME:-ib0}
PKEY=$VLAN
else IFTYPE=phys
fi
else
case "$IFNAME" in
br*)
IFTYPE=bridge
BRTYPE=linux
;;
ovs*)
if ! installed ovs-vsctl; then
die 1 "Need OVS installed on the system to create an ovs bridge"
fi
IFTYPE=bridge
BRTYPE=openvswitch
;;
route*)
IFTYPE=route
;;
dummy*)
IFTYPE=dummy
;;
*) die 1 "I do not know how to setup interface $IFNAME." ;;
esac
fi
fi
# Set the default container interface name to eth1 if not already set
CONTAINER_IFNAME=${CONTAINER_IFNAME:-eth1}
[ "$WAIT" ] && {
while true; do
# This first method works even without `ip` or `ifconfig` installed,
# but doesn't work on older kernels (e.g. CentOS 6.X). See #128.
grep -q '^1$' "/sys/class/net/$CONTAINER_IFNAME/carrier" && break
# This method hopefully works on those older kernels.
ip link ls dev "$CONTAINER_IFNAME" && break
sleep 1
done > /dev/null 2>&1
exit 0
}
[ "$IFTYPE" = bridge ] && [ "$BRTYPE" = linux ] && [ "$VLAN" ] && {
die 1 "VLAN configuration currently unsupported for Linux bridge."
}
[ "$IFTYPE" = ipoib ] && [ "$MACADDR" ] && {
die 1 "MACADDR configuration unsupported for IPoIB interfaces."
}
# Second step: find the guest (for now, we only support LXC containers)
while read _ mnt fstype options _; do
[ "$fstype" != "cgroup" ] && continue
echo "$options" | grep -qw devices || continue
CGROUPMNT=$mnt
done < /proc/mounts
[ "$CGROUPMNT" ] || {
die 1 "Could not locate cgroup mount point."
}
# Try to find a cgroup matching exactly the provided name.
N=$(find "$CGROUPMNT" -name "$GUESTNAME" | wc -l)
case "$N" in
0)
# If we didn't find anything, try to lookup the container with Docker.
if installed docker; then
RETRIES=3
while [ "$RETRIES" -gt 0 ]; do
DOCKERPID=$(docker inspect --format='{{ .State.Pid }}' "$GUESTNAME")
[ "$DOCKERPID" != 0 ] && break
sleep 1
RETRIES=$((RETRIES - 1))
done
[ "$DOCKERPID" = 0 ] && {
die 1 "Docker inspect returned invalid PID 0"
}
[ "$DOCKERPID" = "<no value>" ] && {
die 1 "Container $GUESTNAME not found, and unknown to Docker."
}
else
die 1 "Container $GUESTNAME not found, and Docker not installed."
fi
;;
1) true ;;
*) die 1 "Found more than one container matching $GUESTNAME." ;;
esac
# only check IPADDR if we are not in a route mode
[ "$IFTYPE" != route ] && {
case "$IPADDR" in
# Let's check first if the user asked for DHCP allocation.
dhcp|dhcp:*)
# Use Docker-specific strategy to run the DHCP client
# from the busybox image, in the network namespace of
# the container.
if ! [ "$DOCKERPID" ]; then
warn "You asked for a Docker-specific DHCP method."
warn "However, $GUESTNAME doesn't seem to be a Docker container."
warn "Try to replace 'dhcp' with another option?"
die 1 "Aborting."
fi
DHCP_CLIENT=${IPADDR%%:*}
;;
udhcpc|udhcpc:*|udhcpc-f|udhcpc-f:*|dhcpcd|dhcpcd:*|dhclient|dhclient:*|dhclient-f|dhclient-f:*)
DHCP_CLIENT=${IPADDR%%:*}
# did they ask for the client to remain?
DHCP_FOREGROUND=
[ "${DHCP_CLIENT: -2}" = '-f' ] && {
DHCP_FOREGROUND=true
}
DHCP_CLIENT=${DHCP_CLIENT%-f}
if ! installed "$DHCP_CLIENT"; then
die 1 "You asked for DHCP client $DHCP_CLIENT, but I can't find it."
fi
;;
# Alright, no DHCP? Then let's see if we have a subnet *and* gateway.
*/*@*)
GATEWAY="${IPADDR#*@}" GATEWAY="${GATEWAY%%@*}"
IPADDR="${IPADDR%%@*}"
;;
# No gateway? We need at least a subnet, anyway!
*/*) : ;;
# ... No? Then stop right here.
*)
warn "The IP address should include a netmask."
die 1 "Maybe you meant $IPADDR/24 ?"
;;
esac
}
# If a DHCP method was specified, extract the DHCP options.
if [ "$DHCP_CLIENT" ]; then
case "$IPADDR" in
*:*) DHCP_OPTIONS="${IPADDR#*:}" ;;
esac
fi
if [ "$DOCKERPID" ]; then
NSPID=$DOCKERPID
else
NSPID=$(head -n 1 "$(find "$CGROUPMNT" -name "$GUESTNAME" | head -n 1)/tasks")
[ "$NSPID" ] || {
# it is an alternative way to get the pid
NSPID=$(lxc-info -n "$GUESTNAME" | grep PID | grep -Eo '[0-9]+')
[ "$NSPID" ] || {
die 1 "Could not find a process inside container $GUESTNAME."
}
}
fi
# Check if an incompatible VLAN device already exists
[ "$IFTYPE" = phys ] && [ "$VLAN" ] && [ -d "/sys/class/net/$IFNAME.VLAN" ] && {
ip -d link show "$IFNAME.$VLAN" | grep -q "vlan.*id $VLAN" || {
die 1 "$IFNAME.VLAN already exists but is not a VLAN device for tag $VLAN"
}
}
[ ! -d /var/run/netns ] && mkdir -p /var/run/netns
rm -f "/var/run/netns/$NSPID"
ln -s "/proc/$NSPID/ns/net" "/var/run/netns/$NSPID"
# Check if we need to create a bridge.
[ "$IFTYPE" = bridge ] && [ ! -d "/sys/class/net/$IFNAME" ] && {
[ "$BRTYPE" = linux ] && {
(ip link add dev "$IFNAME" type bridge > /dev/null 2>&1) || (brctl addbr "$IFNAME")
ip link set "$IFNAME" up
}
[ "$BRTYPE" = openvswitch ] && {
ovs-vsctl add-br "$IFNAME"
}
}
[ "$IFTYPE" != "route" ] && [ "$IFTYPE" != "dummy" ] && MTU=$(ip link show "$IFNAME" | awk '{print $5}')
# If it's a bridge, we need to create a veth pair
[ "$IFTYPE" = bridge ] && {
if [ -z "$LOCAL_IFNAME" ]; then
LOCAL_IFNAME="v${CONTAINER_IFNAME}pl${NSPID}"
fi
GUEST_IFNAME="v${CONTAINER_IFNAME}pg${NSPID}"
# Does the link already exist?
if ip link show "$LOCAL_IFNAME" >/dev/null 2>&1; then
# link exists, is it in use?
if ip link show "$LOCAL_IFNAME" up | grep -q "UP"; then
echo "Link $LOCAL_IFNAME exists and is up"
exit 1
fi
# delete the link so we can re-add it afterwards
ip link del "$LOCAL_IFNAME"
fi
ip link add name "$LOCAL_IFNAME" mtu "$MTU" type veth peer name "$GUEST_IFNAME" mtu "$MTU"
case "$BRTYPE" in
linux)
(ip link set "$LOCAL_IFNAME" master "$IFNAME" > /dev/null 2>&1) || (brctl addif "$IFNAME" "$LOCAL_IFNAME")
;;
openvswitch)
if ! ovs-vsctl list-ports "$IFNAME" | grep -q "^${LOCAL_IFNAME}$"; then
ovs-vsctl add-port "$IFNAME" "$LOCAL_IFNAME" ${VLAN:+tag="$VLAN"}
fi
;;
esac
ip link set "$LOCAL_IFNAME" up
}
# If it's a physical interface, create a macvlan subinterface
[ "$IFTYPE" = phys ] && {
[ "$VLAN" ] && {
[ ! -d "/sys/class/net/${IFNAME}.${VLAN}" ] && {
ip link add link "$IFNAME" name "$IFNAME.$VLAN" mtu "$MTU" type vlan id "$VLAN"
}
ip link set "$IFNAME" up
IFNAME=$IFNAME.$VLAN
}
GUEST_IFNAME=ph$NSPID$CONTAINER_IFNAME
ip link add link "$IFNAME" dev "$GUEST_IFNAME" mtu "$MTU" type macvlan mode bridge
ip link set "$IFNAME" up
}
# If it's an IPoIB interface, create a virtual IPoIB interface (the IPoIB
# equivalent of a macvlan device)
#
# Note: no macvlan subinterface nor Ethernet bridge can be created on top of an
# IPoIB interface. InfiniBand is not Ethernet. IPoIB is an IP layer on top of
# InfiniBand, without an intermediate Ethernet layer.
[ "$IFTYPE" = ipoib ] && {
GUEST_IFNAME="${IFNAME}.${NSPID}"
# If a partition key is provided, use it
[ "$PKEY" ] && {
GUEST_IFNAME="${IFNAME}.${PKEY}.${NSPID}"
PKEY="pkey 0x$PKEY"
}
ip link add link "$IFNAME" name "$GUEST_IFNAME" type ipoib $PKEY
ip link set "$IFNAME" up
}
# If its a dummy interface, create a dummy interface.
[ "$IFTYPE" = dummy ] && {
GUEST_IFNAME=du$NSPID$CONTAINER_IFNAME
ip link add dev "$GUEST_IFNAME" type dummy
}
# If the `route` command was specified ...
if [ "$IFTYPE" = route ]; then
# ... discard the first two arguments and pass the rest to the route command.
shift 2
ip netns exec "$NSPID" ip route "$@"
else
# Otherwise, run normally.
ip link set "$GUEST_IFNAME" netns "$NSPID"
ip netns exec "$NSPID" ip link set "$GUEST_IFNAME" name "$CONTAINER_IFNAME"
[ "$MACADDR" ] && ip netns exec "$NSPID" ip link set dev "$CONTAINER_IFNAME" address "$MACADDR"
# When using any of the DHCP methods, we start a DHCP client in the
# network namespace of the container. With the 'dhcp' method, the
# client used is taken from the Docker busybox image (therefore
# requiring no specific client installed on the host). Other methods
# use a locally installed client.
case "$DHCP_CLIENT" in
dhcp)
docker run -d --net container:$GUESTNAME --cap-add NET_ADMIN \
busybox udhcpc -i "$CONTAINER_IFNAME" -x "hostname:$GUESTNAME" \
$DHCP_OPTIONS \
>/dev/null
;;
udhcpc)
DHCP_Q="-q"
[ "$DHCP_FOREGROUND" ] && {
DHCP_OPTIONS="$DHCP_OPTIONS -f"
}
ip netns exec "$NSPID" "$DHCP_CLIENT" -qi "$CONTAINER_IFNAME" \
-x "hostname:$GUESTNAME" \
-p "/var/run/udhcpc.$GUESTNAME.pid" \
$DHCP_OPTIONS
[ ! "$DHCP_FOREGROUND" ] && {
rm "/var/run/udhcpc.$GUESTNAME.pid"
}
;;
dhclient)
ip netns exec "$NSPID" "$DHCP_CLIENT" "$CONTAINER_IFNAME" \
-pf "/var/run/dhclient.$GUESTNAME.pid" \
-lf "/etc/dhclient/dhclient.$GUESTNAME.leases" \
$DHCP_OPTIONS
# kill dhclient after get ip address to prevent device be used after container close
[ ! "$DHCP_FOREGROUND" ] && {
kill "$(cat "/var/run/dhclient.$GUESTNAME.pid")"
rm "/var/run/dhclient.$GUESTNAME.pid"
}
;;
dhcpcd)
ip netns exec "$NSPID" "$DHCP_CLIENT" -q "$CONTAINER_IFNAME" -h "$GUESTNAME"
;;
"")
if installed ipcalc; then
eval "$(ipcalc -b $IPADDR)"
ip netns exec "$NSPID" ip addr add "$IPADDR" brd "$BROADCAST" dev "$CONTAINER_IFNAME"
else
ip netns exec "$NSPID" ip addr add "$IPADDR" dev "$CONTAINER_IFNAME"
fi
[ "$GATEWAY" ] && {
ip netns exec "$NSPID" ip route delete default >/dev/null 2>&1 && true
}
ip netns exec "$NSPID" ip link set "$CONTAINER_IFNAME" up
[ "$GATEWAY" ] && {
ip netns exec "$NSPID" ip route get "$GATEWAY" >/dev/null 2>&1 || \
ip netns exec "$NSPID" ip route add "$GATEWAY/32" dev "$CONTAINER_IFNAME"
ip netns exec "$NSPID" ip route replace default via "$GATEWAY"
}
;;
esac
# Give our ARP neighbors a nudge about the new interface
if installed arping; then
IPADDR=$(echo "$IPADDR" | cut -d/ -f1)
ip netns exec "$NSPID" arping -c 1 -A -I "$CONTAINER_IFNAME" "$IPADDR" > /dev/null 2>&1 || true
else
echo "Warning: arping not found; interface may not be immediately reachable"
fi
fi
# Remove NSPID to avoid `ip netns` catch it.
rm -f "/var/run/netns/$NSPID"
# vim: set tabstop=2 shiftwidth=2 softtabstop=2 expandtab :

26
spec/Vagrantfile vendored Normal file
View file

@ -0,0 +1,26 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.require_plugin 'vagrant-lxc'
Vagrant.require_plugin 'vagrant-cachier'
ENV['BOX_NAME'] ||= 'quantal64'
puts "Running vagrant commands using #{ENV['BOX_NAME']} box"
Vagrant.configure("2") do |config|
config.vm.box = ENV['BOX_NAME']
config.vm.hostname = 'lxc-test-box'
config.vm.box_url = ENV['BOX_URL']
config.vm.network :forwarded_port, guest: 80, host: 8080
config.cache.auto_detect = true
config.vm.provision :shell,
inline: 'mkdir -p /vagrant/tmp && echo -n "Provisioned" > /vagrant/tmp/provisioning'
config.vm.provision :shell,
inline: 'apt-get install apache2 -y'
config.vm.provision :shell, privileged: false,
inline: "if ! [ -f $HOME/original-box ]; then echo '#{ENV['BOX_NAME']}' > $HOME/original-box; fi"
end

View file

@ -1,18 +0,0 @@
eth0 Link encap:Ethernet HWaddr 00:16:3e:7c:dd:44
inet addr:10.0.3.109 Bcast:10.0.3.255 Mask:255.255.255.0
inet6 addr: fe80::216:3eff:fe7c:dd44/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:204 errors:0 dropped:0 overruns:0 frame:0
TX packets:203 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:29663 (29.6 KB) TX bytes:30168 (30.1 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:73 errors:0 dropped:0 overruns:0 frame:0
TX packets:73 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:34173 (34.1 KB) TX bytes:34173 (34.1 KB)

2
spec/fixtures/sample-ip-addr-output vendored Normal file
View file

@ -0,0 +1,2 @@
49: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 10.0.254.137/24 brd 10.0.254.255 scope global eth0

View file

@ -1,22 +1,19 @@
if ENV['COVERAGE']
require 'simplecov'
SimpleCov.start do
# This can probably go away once we stop using vagrant as submodule
add_filter { |source_file| source_file.filename =~ /\/spec\/support/ }
end
require 'coveralls'
SimpleCov.start { add_filter '/spec/' }
SimpleCov.merge_timeout 300
end
require 'bundler/setup'
require 'rspec-spies'
require 'i18n'
require 'vagrant-lxc'
Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each { |f| require f }
require 'rspec/fire'
RSpec::Fire.configure do |config|
config.verify_constant_names = ENV['VERIFY_CONSTANT_NAMES'] == '1'
end
RSpec.configure do |config|
config.treat_symbols_as_metadata_keys_with_true_values = true
config.run_all_when_everything_filtered = true
@ -27,4 +24,12 @@ RSpec.configure do |config|
# the seed, which is printed after each run.
# --seed 1234
config.order = 'random'
config.mock_with :rspec do |c|
c.yield_receiver_to_any_instance_implementation_blocks = true
end
config.expect_with :rspec do |c|
c.syntax = :expect
end
config.raise_errors_for_deprecations!
end

0
spec/support/.gitkeep Normal file
View file

View file

@ -1,28 +0,0 @@
module UnitExampleGroup
def self.included(base)
base.metadata[:type] = :unit
base.before do
Object.any_instance.stub(:system) { |*args, &block|
UnitExampleGroup.prevent_system_calls(*args, &block)
}
Object.any_instance.stub(:`) { |*args, &block|
UnitExampleGroup.prevent_system_calls(*args, &block)
}
require 'vagrant/util/subprocess'
Vagrant::Util::Subprocess.stub(:execute) { |*args, &block|
UnitExampleGroup.prevent_system_calls(*args, &block)
}
end
end
def self.prevent_system_calls(*args, &block)
args.pop if args.last.is_a?(Hash)
raise <<-MSG
Somehow your code under test is trying to execute a command on your system,
please stub it out or move your spec code to an acceptance spec.
Command: "#{args.join(' ')}"
MSG
end
end

View file

@ -0,0 +1,43 @@
require 'unit_helper'
require 'tmpdir'
require 'vagrant-lxc/action/clear_forwarded_ports'
describe Vagrant::LXC::Action::ClearForwardedPorts do
let(:app) { double(:app, call: true) }
let(:env) { {machine: machine, ui: double(info: true)} }
let(:machine) { double(:machine, data_dir: data_dir) }
let!(:data_dir) { Pathname.new(Dir.mktmpdir) }
let(:pids_dir) { data_dir.join('pids') }
let(:pid) { 'a-pid' }
let(:pid_cmd) { 'redir' }
subject { described_class.new(app, env) }
before do
pids_dir.mkdir
pids_dir.join('redir_1234.pid').open('w') { |f| f.write(pid) }
subject.stub(system: true, :` => pid_cmd)
subject.call(env)
end
after { FileUtils.rm_rf data_dir.to_s }
it 'removes all files under pid directory' do
expect(Dir[pids_dir.to_s + "/redir_*.pid"]).to be_empty
end
context 'with a valid redir pid' do
it 'kills known processes' do
expect(subject).to have_received(:system).with("pkill -TERM -P #{pid}")
end
end
context 'with an invalid pid' do
let(:pid_cmd) { 'sudo ls' }
it 'does not kill the process' do
expect(subject).not_to have_received(:system).with("pkill -TERM -P #{pid}")
end
end
end

View file

@ -0,0 +1,29 @@
require 'unit_helper'
require 'vagrant-lxc/plugin'
require 'vagrant-lxc/provider'
require 'vagrant-lxc/action/compress_rootfs'
describe Vagrant::LXC::Action::CompressRootFS do
let(:app) { double(:app, call: true) }
let(:env) { {machine: machine, ui: double(info: true)} }
let(:machine) { double(Vagrant::Machine, provider: provider) }
let(:provider) { double(Vagrant::LXC::Provider, driver: driver) }
let(:driver) { double(Vagrant::LXC::Driver, compress_rootfs: compressed_rootfs_path) }
let(:compressed_rootfs_path) { '/path/to/rootfs.tar.gz' }
subject { described_class.new(app, env) }
before do
provider.stub_chain(:state, :id).and_return(:stopped)
subject.call(env)
end
it "asks the driver to compress container's rootfs" do
expect(driver).to have_received(:compress_rootfs)
end
it 'sets export.temp_dir on action env' do
expect(env['package.rootfs']).to eq(compressed_rootfs_path)
end
end

View file

@ -0,0 +1,117 @@
require 'unit_helper'
require 'tmpdir'
require 'vagrant-lxc/provider'
require 'vagrant-lxc/action/forward_ports'
describe Vagrant::LXC::Action::ForwardPorts do
let(:app) { double(:app, call: true) }
let(:env) { {machine: machine, ui: double(info: true, warn: true)} }
let(:machine) { double(:machine) }
let!(:data_dir) { Pathname.new(Dir.mktmpdir) }
let(:provider) { double(Vagrant::LXC::Provider, ssh_info: {host: container_ip}) }
let(:host_ip) { '127.0.0.1' }
let(:host_port) { 8080 }
let(:guest_port) { 80 }
let(:container_ip) { '10.0.1.234' }
let(:pid) { 'a-pid' }
let(:forward_conf) { {guest: guest_port, host: host_port, host_ip: host_ip} }
let(:networks) { [[:other_config, {}], [:forwarded_port, forward_conf]] }
subject { described_class.new(app, env) }
before do
machine.stub_chain(:config, :vm, :networks).and_return(networks)
machine.stub(provider: provider, data_dir: data_dir)
subject.stub(redir_version: 3)
subject.stub(exec: true)
subject.stub(spawn: pid)
end
after { FileUtils.rm_rf data_dir.to_s }
it 'forwards ports using redir' do
subject.stub(system: true)
subject.call(env)
expect(subject).to have_received(:spawn).with(
"redir -n #{host_ip}:#{host_port} #{container_ip}:#{guest_port} 2>/dev/null"
)
end
it 'Uses 127.0.0.1 as default if host_ip is nil' do
forward_conf.delete(:host_ip)
subject.stub(system: true)
subject.call(env)
expect(subject).to have_received(:spawn).with(
"redir -n 127.0.0.1:#{host_port} #{container_ip}:#{guest_port} 2>/dev/null"
)
end
it 'Uses 127.0.0.1 by default if host_ip is a blank string' do
forward_conf[:host_ip] = ' '
subject.stub(system: true)
subject.call(env)
expect(subject).to have_received(:spawn).with(
"redir -n 127.0.0.1:#{host_port} #{container_ip}:#{guest_port} 2>/dev/null"
)
end
it "stores redir pids on machine's data dir" do
subject.stub(system: true)
subject.call(env)
pid_file = data_dir.join('pids', "redir_#{host_port}.pid").read
expect(pid_file).to eq(pid)
end
it 'allows disabling a previously forwarded port' do
forward_conf[:disabled] = true
subject.stub(system: true)
subject.call(env)
expect(subject).not_to have_received(:spawn)
end
it 'uses redir 2.x command line interface' do
subject.stub(system: true)
subject.stub(redir_version: 2)
subject.call(env)
expect(subject).to have_received(:spawn).with(
"redir --laddr=#{host_ip} --lport=#{host_port} --caddr=#{container_ip} --cport=#{guest_port} 2>/dev/null"
)
end
it 'raises RedirNotInstalled error if `redir` is not installed' do
subject.stub(system: false)
expect { subject.call(env) }.to raise_error(Vagrant::LXC::Errors::RedirNotInstalled)
end
context 'when a privileged port is used' do
let(:host_port) { 80 }
it 'forwards ports using redir' do
subject.stub(system: true)
subject.call(env)
expect(subject).to have_received(:spawn).with(
"sudo redir -n #{host_ip}:#{host_port} #{container_ip}:#{guest_port} 2>/dev/null"
)
end
it 'Uses 127.0.0.1 by default if host_ip is nil' do
forward_conf.delete(:host_ip)
subject.stub(system: true)
subject.call(env)
expect(subject).to have_received(:spawn).with(
"sudo redir -n 127.0.0.1:#{host_port} #{container_ip}:#{guest_port} 2>/dev/null"
)
end
it 'Uses 127.0.0.1 by default if host_ip is a blank string' do
forward_conf[:host_ip] = ' '
subject.stub(system: true)
subject.call(env)
expect(subject).to have_received(:spawn).with(
"sudo redir -n 127.0.0.1:#{host_port} #{container_ip}:#{guest_port} 2>/dev/null"
)
end
end
end

View file

@ -1,44 +1,126 @@
require 'unit_helper'
require 'vagrant-lxc/action/base_action'
require 'vagrant'
require 'vagrant-lxc/errors'
require 'vagrant-lxc/action/handle_box_metadata'
describe Vagrant::LXC::Action::HandleBoxMetadata do
let(:metadata) { {'template-opts' => {'--foo' => 'bar'}} }
let(:box) { mock(:box, name: 'box-name', metadata: metadata, directory: box_directory) }
let(:app) { double(:app, call: true) }
let(:env) { {machine: machine, ui: double(info: true, warn: true)} }
let(:machine) { double(:machine, box: box) }
let(:box) { double(:box, name: 'box-name', metadata: metadata, directory: box_directory) }
let(:box_directory) { Pathname.new('/path/to/box') }
let(:machine) { mock(:machine, box: box) }
let(:app) { mock(:app, call: true) }
let(:env) { {machine: machine, ui: stub(info: true)} }
let(:tmpdir) { '/tmp/rootfs/dir' }
let(:version) { '2' }
let(:metadata) { {'template-opts' => {'--foo' => 'bar'}, 'version' => version} }
let(:vagrant_key) { Vagrant.source_root.join('keys', 'vagrant.pub').expand_path.to_s }
subject { described_class.new(app, env) }
before do
Dir.stub(mktmpdir: tmpdir)
File.stub(exists?: true)
subject.stub(:system)
subject.call(env)
context 'with 1.0.0 box' do
let(:version) { '1.0.0' }
before do
File.stub(exists?: true)
# REFACTOR: This is pretty bad
subject.stub_chain(:template_config_file, :exist?).and_return(true)
subject.stub_chain(:template_config_file, :to_s).and_return(box_directory.join('lxc-config').to_s)
subject.call(env)
end
it 'sets the tarball argument for the template' do
expect(env[:lxc_template_opts]).to include(
'--tarball' => box_directory.join('rootfs.tar.gz').to_s
)
end
it 'sets the template --config parameter' do
expect(env[:lxc_template_opts]).to include(
'--config' => box_directory.join('lxc-config').to_s
)
end
it 'does not set the auth key argument for the template' do
expect(env[:lxc_template_opts]).not_to include(
'--auth-key' => vagrant_key
)
end
it 'sets the template options from metadata on env hash' do
expect(env[:lxc_template_opts]).to include(metadata['template-opts'])
end
xit 'sets the template source path on env hash' do
expect(env[:lxc_template_src]).to eq(box_directory.join('lxc-template').to_s)
end
it 'does not warn about deprecation' do
expect(env[:ui]).not_to have_received(:warn)
end
end
it 'creates a tmp directory to store rootfs-cache-path' do
metadata['rootfs-cache-path'].should == tmpdir
context 'with valid pre 1.0.0 box' do
before do
File.stub(exists?: true)
# REFACTOR: This is pretty bad
subject.stub_chain(:old_template_config_file, :exist?).and_return(true)
subject.stub_chain(:old_template_config_file, :to_s).and_return(box_directory.join('lxc.conf').to_s)
subject.call(env)
end
it 'sets the tarball argument for the template' do
expect(env[:lxc_template_opts]).to include(
'--tarball' => box_directory.join('rootfs.tar.gz').to_s
)
end
it 'sets the auth key argument for the template' do
expect(env[:lxc_template_opts]).to include(
'--auth-key' => vagrant_key
)
end
it 'sets the lxc config file parameter' do
expect(env[:lxc_template_config]).to eq(box_directory.join('lxc.conf').to_s)
end
it 'sets the template options from metadata on env hash' do
expect(env[:lxc_template_opts]).to include(metadata['template-opts'])
end
xit 'sets the template source path on env hash' do
expect(env[:lxc_template_src]).to eq(box_directory.join('lxc-template').to_s)
end
it 'warns about deprecation' do
expect(env[:ui]).to have_received(:warn)
end
end
it 'prepends vagrant and box name to template-name' do
metadata['template-name'].should == "vagrant-#{box.name}"
end
describe 'with invalid contents' do
before { File.stub(exists?: true) }
it 'copies box template file to the right folder' do
src = box_directory.join('lxc-template').to_s
dest = "/usr/share/lxc/templates/lxc-#{metadata['template-name']}"
it 'validates box versions' do
%w( 2 3 1.0.0 ).each do |v|
metadata['version'] = v
expect { subject.call(env) }.to_not raise_error
end
subject.should have_received(:system).
with("sudo su root -c \"cp #{src} #{dest}\"")
end
metadata['version'] = '1'
expect { subject.call(env) }.to raise_error
end
it 'extracts rootfs into a tmp folder' do
subject.should have_received(:system).
with(%Q[sudo su root -c "cd #{box_directory} && tar xfz rootfs.tar.gz -C #{tmpdir}"])
it 'raises an error if the rootfs tarball cant be found' do
allow(File).to receive(:exists?).with(box_directory.join('rootfs.tar.gz').to_s).and_return(false)
expect {
subject.call(env)
}.to raise_error(Vagrant::LXC::Errors::RootFSTarballMissing)
end
it 'does not raise an error if the lxc-template script cant be found' do
allow(File).to receive(:exists?).with(box_directory.join('lxc-template').to_s).and_return(false)
expect {
subject.call(env)
}.to_not raise_error
end
end
end

View file

@ -0,0 +1,83 @@
require 'unit_helper'
require 'vagrant-lxc/action/setup_package_files'
describe Vagrant::LXC::Action::SetupPackageFiles do
let(:app) { double(:app, call: true) }
let(:env) { {machine: machine, tmp_path: tmp_path, ui: double(info: true), 'package.rootfs' => rootfs_path} }
let(:machine) { double(Vagrant::Machine, box: box) }
let!(:tmp_path) { Pathname.new(Dir.mktmpdir) }
let(:box) { double(Vagrant::Box, directory: tmp_path.join('box')) }
let(:rootfs_path) { tmp_path.join('rootfs-amd64.tar.gz') }
subject { described_class.new(app, env) }
before do
box.directory.mkdir
files = %w( lxc-template metadata.json lxc.conf lxc-config ).map { |f| box.directory.join(f) }
(files + [rootfs_path]).each do |file|
file.open('w') { |f| f.puts file.to_s }
end
subject.stub(recover: true) # Prevents files from being removed on specs
end
after do
FileUtils.rm_rf(tmp_path.to_s)
end
context 'when all files exist' do
before { subject.call(env) }
it 'copies box lxc-template to package directory' do
expect(env['package.directory'].join('lxc-template')).to be_file
end
it 'copies metadata.json to package directory' do
expect(env['package.directory'].join('metadata.json')).to be_file
end
it 'copies box lxc.conf to package directory' do
expect(env['package.directory'].join('lxc-template')).to be_file
end
it 'copies box lxc-config to package directory' do
expect(env['package.directory'].join('lxc-config')).to be_file
end
it 'moves the compressed rootfs to package directory' do
expect(env['package.directory'].join(rootfs_path.basename)).to be_file
expect(env['package.rootfs']).not_to be_file
end
end
context 'when lxc-template file is not present' do
before do
box.directory.join('lxc-template').delete
end
it 'does not blow up' do
expect { subject.call(env) }.to_not raise_error
end
end
context 'when lxc.conf file is not present' do
before do
box.directory.join('lxc.conf').delete
end
it 'does not blow up' do
expect { subject.call(env) }.to_not raise_error
end
end
context 'when lxc-config file is not present' do
before do
box.directory.join('lxc-config').delete
end
it 'does not blow up' do
expect { subject.call(env) }.to_not raise_error
end
end
end

View file

@ -1,169 +0,0 @@
require 'unit_helper'
require 'vagrant'
require 'vagrant-lxc/container/cli'
describe Vagrant::LXC::Container::CLI do
describe 'list' do
let(:lxc_ls_out) { "dup-container\na-container dup-container" }
let(:exec_args) { @exec_args }
let(:result) { @result }
before do
subject.stub(:run).with(:ls).and_return(lxc_ls_out)
@result = subject.list
end
it 'grabs previously created containers from lxc-ls output' do
result.should be_an Enumerable
result.should include 'a-container'
result.should include 'dup-container'
end
it 'removes duplicates from lxc-ls output' do
result.uniq.should == result
end
end
describe 'create' do
let(:template) { 'quantal-64' }
let(:name) { 'quantal-container' }
let(:template_args) { { '--extra-param' => 'param', '--other' => 'value' } }
subject { described_class.new(name) }
before do
subject.stub(:run)
subject.create(template, 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'
)
end
end
describe 'destroy' do
let(:name) { 'a-container-for-destruction' }
subject { described_class.new(name) }
before do
subject.stub(:run)
subject.destroy
end
it 'issues a lxc-destroy with container name' do
subject.should have_received(:run).with(:destroy, '--name', name)
end
end
describe 'start' do
let(:name) { 'a-container' }
subject { described_class.new(name) }
before do
subject.stub(:run)
end
it 'starts container on the background' do
subject.start
subject.should have_received(:run).with(
:start,
'-d',
'--name', name
)
end
it 'uses provided hash to configure the container' do
subject.start(['lxc.config=value', 'lxc.other=value'])
subject.should have_received(:run).with(:start, '-d', '--name', name,
'-s', 'lxc.config=value',
'-s', 'lxc.other=value'
)
end
end
describe 'shutdown' do
let(:name) { 'a-running-container' }
subject { described_class.new(name) }
before do
subject.stub(:run)
subject.shutdown
end
it 'issues a lxc-shutdown with provided container name' do
subject.should have_received(:run).with(:shutdown, '--name', name)
end
end
describe 'state' do
let(:name) { 'a-container' }
subject { described_class.new(name) }
before do
subject.stub(:run).and_return("state: STOPPED\npid: 2")
end
it 'calls lxc-info with the right arguments' do
subject.state
subject.should have_received(:run).with(:info, '--name', name)
end
it 'maps the output of lxc-info status out to a symbol' do
subject.state.should == :stopped
end
end
describe 'attach' do
let(:name) { 'a-running-container' }
let(:command) { ['ls', 'cat /tmp/file'] }
let(:command_output) { 'folders list' }
subject { described_class.new(name) }
before do
subject.stub(run: command_output)
end
it 'calls lxc-attach with specified command' do
subject.attach(*command)
subject.should have_received(:run).with(:attach, '--name', name, '--', *command)
end
it 'supports a "namespaces" parameter' do
subject.attach *(command + [{namespaces: ['network', 'mount']}])
subject.should have_received(:run).with(:attach, '--name', name, '--namespaces', 'NETWORK|MOUNT', '--', *command)
end
end
describe 'transition block' do
let(:name) { 'a-running-container' }
subject { described_class.new(name) }
before { subject.stub(:run) }
it 'yields cli object' do
subject.stub(:shutdown)
subject.transition_to(:stopped) { |c| c.shutdown }
subject.should have_received(:shutdown)
end
it 'throws an exception if block is not provided' do
expect {
subject.transition_to(:running)
}.to raise_error(described_class::TransitionBlockNotProvided)
end
it 'waits for the expected container state using lxc-wait' do
subject.transition_to(:running) { }
subject.should have_received(:run).with(:wait, '--name', name, '--state', 'RUNNING')
end
end
end

View file

@ -1,143 +0,0 @@
require 'unit_helper'
require 'vagrant'
require 'vagrant-lxc/container'
describe Vagrant::LXC::Container do
let(:name) { nil }
subject { described_class.new(name) }
describe 'container name validation' do
let(:unknown_container) { described_class.new('unknown', cli) }
let(:valid_container) { described_class.new('valid', cli) }
let(:new_container) { described_class.new(nil) }
let(:cli) { fire_double('Vagrant::LXC::Container::CLI', list: ['valid']) }
it 'raises a NotFound error if an unknown container name gets provided' do
expect {
unknown_container.validate!
}.to raise_error(Vagrant::LXC::Container::NotFound)
end
it 'does not raise a NotFound error if a valid container name gets provided' do
expect {
valid_container.validate!
}.to_not raise_error(Vagrant::LXC::Container::NotFound)
end
it 'does not raise a NotFound error if nil is provider as name' do
expect {
new_container.validate!
}.to_not raise_error(Vagrant::LXC::Container::NotFound)
end
end
describe 'creation' do
let(:name) { 'random-container-name' }
let(:template_name) { 'template-name' }
let(:rootfs_cache) { '/path/to/cache' }
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) }
subject { described_class.new(name, cli) }
before do
SecureRandom.stub(hex: name)
subject.create '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(:create).with(
template_name,
'--auth-key' => public_key_path,
'--cache' => rootfs_cache,
'--foo' => 'bar'
)
end
end
describe 'destruction' do
let(:name) { 'container-name' }
let(:cli) { fire_double('Vagrant::LXC::Container::CLI', destroy: true) }
subject { described_class.new(name, cli) }
before { subject.destroy }
it 'delegates to cli object' do
cli.should have_received(:destroy)
end
end
describe 'start' do
let(:config) { mock(:config, start_opts: ['a=1', 'b=2']) }
let(:name) { 'container-name' }
let(:cli) { fire_double('Vagrant::LXC::Container::CLI', start: true) }
subject { described_class.new(name, cli) }
before do
cli.stub(:transition_to).and_yield(cli)
end
it 'starts container with configured lxc settings' do
cli.should_receive(:start).with(['a=1', 'b=2'], nil)
subject.start(config)
end
it 'expects a transition to running state to take place' do
cli.should_receive(:transition_to).with(:running)
subject.start(config)
end
end
describe 'halt' do
let(:name) { 'container-name' }
let(:cli) { fire_double('Vagrant::LXC::Container::CLI', shutdown: true) }
subject { described_class.new(name, cli) }
before do
cli.stub(:transition_to).and_yield(cli)
end
it 'delegates to cli shutdown' do
cli.should_receive(:shutdown)
subject.halt
end
it 'expects a transition to running state to take place' do
cli.should_receive(:transition_to).with(:stopped)
subject.halt
end
end
describe 'state' do
let(:name) { 'random-container-name' }
let(:cli_state) { :something }
let(:cli) { fire_double('Vagrant::LXC::Container::CLI', state: cli_state) }
subject { described_class.new(name, cli) }
it 'delegates to cli' do
subject.state.should == cli_state
end
end
describe 'assigned ip' do
# This ip is set on the sample-ifconfig-output fixture
let(:ip) { "10.0.3.109" }
let(:ifconfig_output) { File.read('spec/fixtures/sample-ifconfig-output') }
let(:name) { 'random-container-name' }
let(:cli) { fire_double('Vagrant::LXC::Container::CLI', :attach => ifconfig_output) }
subject { described_class.new(name, cli) }
context 'when ip for eth0 gets returned from lxc-attach call' do
it 'gets parsed from ifconfig output' do
subject.assigned_ip.should == ip
cli.should have_received(:attach).with('/sbin/ifconfig', '-v', 'eth0', namespaces: 'network')
end
end
end
end

View file

@ -0,0 +1,209 @@
require 'unit_helper'
require 'vagrant-lxc/sudo_wrapper'
require 'vagrant-lxc/driver/cli'
describe Vagrant::LXC::Driver::CLI do
let(:sudo_wrapper) { double(Vagrant::LXC::SudoWrapper, run: true, wrapper_path: nil) }
subject { described_class.new(sudo_wrapper) }
describe 'list' do
let(:lxc_ls_out) { "dup-container\na-container dup-container" }
let(:result) { @result }
before do
allow(subject).to receive(:run).with(:ls).and_return(lxc_ls_out)
@result = subject.list
end
it 'grabs previously created containers from lxc-ls output' do
expect(result).to be_an Enumerable
expect(result).to include 'a-container'
expect(result).to include 'dup-container'
end
it 'removes duplicates from lxc-ls output' do
expect(result.uniq).to eq(result)
end
end
describe 'version' do
before do
allow(subject).to receive(:run).with(:create, '--version').and_return(lxc_version_out)
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(:create, '--version').and_return(lxc_version_out)
end
describe 'lxc version after 1.x.x'do
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
let(:template) { 'quantal-64' }
let(:name) { 'quantal-container' }
let(:backingstore) { 'btrfs' }
let(:backingstore_opts) { [['--dir', '/tmp/foo'], ['--foo', 'bar']] }
let(:config_file) { 'config' }
let(:template_args) { { '--extra-param' => 'param', '--other' => 'value' } }
subject { described_class.new(sudo_wrapper, name) }
before do
allow(subject).to receive(:run) { |*args| @run_args = args }
end
it 'issues a lxc-create with provided template, container name and hash of arguments' do
subject.create(template, backingstore, backingstore_opts, config_file, template_args)
expect(subject).to have_received(:run).with(
:create,
'-B', backingstore,
'--template', template,
'--name', name,
*(backingstore_opts.flatten),
'-f', config_file,
'--',
'--extra-param', 'param',
'--other', 'value'
)
end
it 'wraps a low level error into something more meaningful in case the container already exists' do
allow(subject).to receive(:run) { raise Vagrant::LXC::Errors::ExecuteError, stderr: 'alreAdy Exists' }
expect {
subject.create(template, backingstore, backingstore_opts, config_file, template_args)
}.to raise_error(Vagrant::LXC::Errors::ContainerAlreadyExists)
end
end
describe 'destroy' do
let(:name) { 'a-container-for-destruction' }
subject { described_class.new(sudo_wrapper, name) }
before do
allow(subject).to receive(:run)
subject.destroy
end
it 'issues a lxc-destroy with container name' do
expect(subject).to have_received(:run).with(:destroy, '--name', name)
end
end
describe 'start' do
let(:name) { 'a-container' }
subject { described_class.new(sudo_wrapper, name) }
before do
allow(subject).to receive(:run)
end
it 'starts container on the background' do
subject.start
expect(subject).to have_received(:run).with(
:start,
'-d',
'--name', name
)
end
end
describe 'stop' do
let(:name) { 'a-running-container' }
subject { described_class.new(sudo_wrapper, name) }
before do
allow(subject).to receive(:run)
subject.stop
end
it 'issues a lxc-stop with provided container name' do
expect(subject).to have_received(:run).with(:stop, '--name', name)
end
end
describe 'state' do
let(:name) { 'a-container' }
subject { described_class.new(sudo_wrapper, name) }
before do
allow(subject).to receive(:run).and_return("state: STOPPED\npid: 2")
end
it 'calls lxc-info with the right arguments' do
subject.state
expect(subject).to have_received(:run).with(:info, '--name', name, retryable: true)
end
it 'maps the output of lxc-info status out to a symbol' do
expect(subject.state).to eq(:stopped)
end
it 'is not case sensitive' do
allow(subject).to receive(:run).and_return("StatE: STarTED\npid: 2")
expect(subject.state).to eq(:started)
end
end
describe 'attach' do
let(:name) { 'a-running-container' }
let(:command) { ['ls', 'cat /tmp/file'] }
let(:command_output) { 'folders list' }
subject { described_class.new(sudo_wrapper, name) }
before do
subject.stub(run: command_output)
end
it 'calls lxc-attach with specified command' do
subject.attach(*command)
expect(subject).to have_received(:run).with(:attach, '--name', name, '--', *command)
end
it 'supports a "namespaces" parameter' do
allow(subject).to receive(:run).with(:attach, '-h', :show_stderr => true).and_return({:stdout => '', :stderr => '--namespaces'})
subject.attach *(command + [{namespaces: ['network', 'mount']}])
expect(subject).to have_received(:run).with(:attach, '--name', name, '--namespaces', 'NETWORK|MOUNT', '--', *command)
end
end
describe 'transition block' do
before do
subject.stub(run: true, sleep: true, state: :stopped)
end
it 'yields a cli object' do
allow(subject).to receive(:shutdown)
subject.transition_to(:stopped) { |c| c.shutdown }
expect(subject).to have_received(:shutdown)
end
it 'throws an exception if block is not provided' do
expect {
subject.transition_to(:running)
}.to raise_error(described_class::TransitionBlockNotProvided)
end
skip 'waits for the expected container state'
end
end

257
spec/unit/driver_spec.rb Normal file
View file

@ -0,0 +1,257 @@
require 'unit_helper'
require 'vagrant-lxc/driver'
require 'vagrant-lxc/driver/cli'
require 'vagrant-lxc/sudo_wrapper'
describe Vagrant::LXC::Driver do
describe 'container name validation' do
let(:unknown_container) { described_class.new('unknown', nil, cli) }
let(:valid_container) { described_class.new('valid', nil, cli) }
let(:new_container) { described_class.new(nil, nil) }
let(:cli) { double(Vagrant::LXC::Driver::CLI, list: ['valid']) }
it 'raises a ContainerNotFound error if an unknown container name gets provided' do
expect {
unknown_container.validate!
}.to raise_error
end
it 'does not raise a ContainerNotFound error if a valid container name gets provided' do
expect {
valid_container.validate!
}.not_to raise_error
end
it 'does not raise a ContainerNotFound error if nil is provider as name' do
expect {
new_container.validate!
}.not_to raise_error
end
end
describe 'creation' do
let(:name) { 'container-name' }
let(:backingstore) { 'btrfs' }
let(:backingstore_opts) { [['--dir', '/tmp/foo'], ['--foo', 'bar']] }
let(:template_name) { 'auto-assigned-template-id' }
let(:template_path) { '/path/to/lxc-template-from-box' }
let(:template_opts) { {'--some' => 'random-option'} }
let(:config_file) { '/path/to/lxc-config-from-box' }
let(:rootfs_tarball) { '/path/to/cache/rootfs.tar.gz' }
let(:cli) { double(Vagrant::LXC::Driver::CLI, :create => true, :name= => true) }
subject { described_class.new(nil, nil, cli) }
before do
allow(subject).to receive(:import_template).and_yield(template_name)
subject.create name, backingstore, backingstore_opts, template_path, config_file, template_opts
end
it 'sets the cli object container name' do
expect(cli).to have_received(:name=).with(name)
end
it 'creates container with the right arguments' do
expect(cli).to have_received(:create).with(
template_path,
backingstore,
backingstore_opts,
config_file,
template_opts
)
end
end
describe 'destruction' do
let(:cli) { double(Vagrant::LXC::Driver::CLI, destroy: true) }
subject { described_class.new('name', nil, cli) }
before { subject.destroy }
it 'delegates to cli object' do
expect(cli).to have_received(:destroy)
end
end
describe 'start' do
let(:customizations) { [['a', '1'], ['b', '2']] }
let(:internal_customization) { ['internal', 'customization'] }
let(:cli) { double(Vagrant::LXC::Driver::CLI, start: true) }
let(:sudo) { double(Vagrant::LXC::SudoWrapper) }
subject { described_class.new('name', sudo, cli) }
before do
sudo.should_receive(:run).with('cat', '/var/lib/lxc/name/config').exactly(2).times.
and_return('# CONFIGURATION')
sudo.should_receive(:run).twice.with('cp', '-f', %r{/(run|tmp)/.*}, '/var/lib/lxc/name/config')
sudo.should_receive(:run).twice.with('chown', 'root:root', '/var/lib/lxc/name/config')
expect(cli).to receive(:config).with("lxc.lxcpath").and_return("/var/lib/lxc")
subject.customizations << internal_customization
subject.start(customizations)
end
it 'prunes previous customizations before writing'
it 'writes configurations to config file'
it 'starts container with configured customizations' do
expect(cli).to have_received(:start)
end
end
describe 'halt' do
let(:cli) { double(Vagrant::LXC::Driver::CLI, stop: true) }
subject { described_class.new('name', nil, cli) }
before do
allow(cli).to receive(:transition_to).and_yield(cli)
end
it 'delegates to cli stop' do
expect(cli).to receive(:stop)
subject.forced_halt
end
it 'expects a transition to running state to take place' do
expect(cli).to receive(:transition_to).with(:stopped)
subject.forced_halt
end
it 'attempts to force the container to stop in case a shutdown doesnt work' do
allow(cli).to receive(:shutdown).and_raise(Vagrant::LXC::Driver::CLI::TargetStateNotReached.new :target, :source)
expect(cli).to receive(:transition_to).with(:stopped)
expect(cli).to receive(:stop)
subject.forced_halt
end
end
describe 'state' do
let(:cli_state) { :something }
let(:cli) { double(Vagrant::LXC::Driver::CLI, state: cli_state) }
subject { described_class.new('name', nil, cli) }
it 'delegates to cli' do
expect(subject.state).to eq(cli_state)
end
end
describe 'containers_path' do
let(:cli) { double(Vagrant::LXC::Driver::CLI, config: cli_config_value) }
subject { described_class.new('name', nil, cli) }
describe 'lxc version after 1.x.x' do
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
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(:with_space_folder) { {guestpath: '/tmp/with space', hostpath: '/path/with space'} }
let(:folders) { [shared_folder, ro_rw_folder, with_space_folder] }
let(:expected_guest_path) { "vagrant" }
let(:sudo_wrapper) { double(Vagrant::LXC::SudoWrapper, run: true) }
let(:rootfs_path) { Pathname('/path/to/rootfs') }
subject { described_class.new('name', sudo_wrapper) }
describe "with fixed rootfs" do
before do
subject.stub(rootfs_path: Pathname('/path/to/rootfs'), system: true)
subject.share_folders(folders)
end
it 'adds a mount.entry to its local customizations' do
expect(subject.customizations).to include [
'mount.entry',
"#{shared_folder[:hostpath]} #{expected_guest_path} none bind,create=dir 0 0"
]
end
it 'supports additional mount options' do
expect(subject.customizations).to include [
'mount.entry',
"#{ro_rw_folder[:hostpath]} vagrant/ro_rw none ro,rw 0 0"
]
end
it 'supports directories with spaces' do
expect(subject.customizations).to include [
'mount.entry',
"/path/with\\040space tmp/with\\040space none bind,create=dir 0 0"
]
end
end
describe "with directory-based LXC config" do
let(:config_string) {
<<-ENDCONFIG.gsub(/^\s+/, '')
# Blah blah comment
lxc.mount.entry = proc proc proc nodev,noexec,nosuid 0 0
lxc.mount.entry = sysfs sys sysfs defaults 0 0
lxc.tty.max = 4
lxc.pty.max = 1024
lxc.rootfs.path = #{rootfs_path}
# VAGRANT-BEGIN
lxc.network.type=veth
lxc.network.name=eth1
# VAGRANT-END
ENDCONFIG
}
before do
subject { described_class.new('name', sudo_wrapper) }
subject.stub(config_string: config_string)
subject.share_folders(folders)
end
it 'adds a mount.entry to its local customizations' do
expect(subject.customizations).to include [
'mount.entry',
"#{shared_folder[:hostpath]} #{expected_guest_path} none bind,create=dir 0 0"
]
end
end
describe "with overlayfs-based LXC config" do
let(:config_string) {
<<-ENDCONFIG.gsub(/^\s+/, '')
# Blah blah comment
lxc.mount.entry = proc proc proc nodev,noexec,nosuid 0 0
lxc.mount.entry = sysfs sys sysfs defaults 0 0
lxc.tty.max = 4
lxc.pty.max = 1024
lxc.rootfs.path = overlayfs:/path/to/master/directory:#{rootfs_path}
# VAGRANT-BEGIN
lxc.network.type=veth
lxc.network.name=eth1
# VAGRANT-END
ENDCONFIG
}
before do
subject { described_class.new('name', sudo_wrapper) }
subject.stub(config_string: config_string)
subject.share_folders(folders)
end
it 'adds a mount.entry to its local customizations' do
expect(subject.customizations).to include [
'mount.entry',
"#{shared_folder[:hostpath]} #{expected_guest_path} none bind,create=dir 0 0"
]
end
end
end
end

View file

@ -1,39 +0,0 @@
require 'unit_helper'
require 'vagrant-lxc/machine_state'
describe Vagrant::LXC::MachineState do
describe 'short description' do
subject { described_class.new(:not_created) }
it 'is a humanized version of state id' do
subject.short_description.should == 'not created'
end
end
describe 'long description' do
subject { described_class.new(:short_name) }
before { I18n.stub(t: 'some really long description') }
it 'is a localized version of the state id' do
subject.long_description.should == 'some really long description'
I18n.should have_received(:t).with('vagrant.commands.status.short_name')
end
end
context 'when state id is :running' do
subject { described_class.new(:running) }
it { should be_created }
it { should be_running }
it { should_not be_off }
end
context 'when state id is :stopped' do
subject { described_class.new(:stopped) }
it { should be_created }
it { should be_off }
it { should_not be_running }
end
end

View file

@ -0,0 +1,38 @@
module UnitExampleGroup
def self.included(base)
base.metadata[:type] = :unit
base.before do
allow_any_instance_of(Object).to receive(:system) { |instance, *args, &block|
UnitExampleGroup.prevent_system_calls(*args, &block)
}
allow_any_instance_of(Object).to receive(:`) { |instance, *args, &block|
UnitExampleGroup.prevent_system_calls(*args, &block)
}
allow_any_instance_of(Object).to receive(:exec) { |instance, *args, &block|
UnitExampleGroup.prevent_system_calls(*args, &block)
}
allow_any_instance_of(Object).to receive(:fork) { |instance, *args, &block|
UnitExampleGroup.prevent_system_calls(*args, &block)
}
allow_any_instance_of(Object).to receive(:spawn) { |instance, *args, &block|
UnitExampleGroup.prevent_system_calls(*args, &block)
}
require 'vagrant/util/subprocess'
allow(Vagrant::Util::Subprocess).to receive(:execute) { |*args, &block|
UnitExampleGroup.prevent_system_calls(*args, &block)
}
end
end
def self.prevent_system_calls(*args, &block)
args.pop if args.last.is_a?(Hash)
raise <<-MSG
Somehow your code under test is trying to execute a command on your system,
please stub it out or move your spec code to an acceptance spec.
Block: #{block.inspect}
Command: "#{args.join(' ')}"
MSG
end
end

View file

@ -1,9 +1,17 @@
require 'spec_helper'
RSpec.configure do |config|
config.include RSpec::Fire
Dir[File.dirname(__FILE__) + "/unit/support/**/*.rb"].each { |f| require f }
if defined? SimpleCov
SimpleCov.command_name 'unit'
end
RSpec.configure do |config|
config.include UnitExampleGroup, :type => :unit, :example_group => {
:file_path => /\bspec\/unit\//
}
config.mock_with :rspec do |c|
c.yield_receiver_to_any_instance_implementation_blocks = true
end
end

View file

@ -1,17 +0,0 @@
namespace :boxes do
namespace :quantal64 do
desc 'Build Ubuntu Quantal 64 bits Vagrant LXC box'
task :build do
if File.exists?('./boxes/output/lxc-quantal64.box')
puts 'Box has been built already!'
exit 1
end
sh 'mkdir -p boxes/output'
sh 'cd boxes/quantal64 && sudo ./download-ubuntu'
sh 'rm -f boxes/quantal64/rootfs.tar.gz'
sh 'cd boxes/quantal64 && sudo tar --numeric-owner -czf rootfs.tar.gz ./rootfs-amd64/*'
sh "cd boxes/quantal64 && sudo chown #{ENV['USER']}:#{ENV['USER']} rootfs.tar.gz && tar -czf ../output/lxc-quantal64.box ./* --exclude=rootfs-amd64 --exclude=download-ubuntu"
end
end
end

View file

@ -1,12 +1,15 @@
begin
require 'rspec/core/rake_task'
require 'coveralls/rake/task'
# TODO: add 'spec:acceptance' and 'spec:integration' then they are in place
desc 'Run all specs'
task :spec => ['spec:unit']
task :spec => ['spec:set_coverage', 'spec:unit', 'spec:acceptance']
desc 'Default task which runs all specs with code coverage enabled'
task :default => ['spec:set_coverage', 'spec']
task :default => ['spec:set_coverage', 'spec:unit']
Coveralls::RakeTask.new
task :ci => ['spec:set_coverage', 'spec:unit', 'coveralls:push']
rescue LoadError; end
namespace :spec do
@ -14,17 +17,24 @@ namespace :spec do
ENV['COVERAGE'] = 'true'
end
def types
dirs = Dir['./spec/**/*_spec.rb'].map { |f| f.sub(/^\.\/(spec\/\w+)\/.*/, '\\1') }.uniq
Hash[dirs.map { |d| [d.split('/').last, d] }]
desc 'Run acceptance specs using vagrant-spec'
task :acceptance do
components = %w(
basic
network/forwarded_port
synced_folder
synced_folder/nfs
synced_folder/rsync
provisioner/shell
provisioner/puppet
provisioner/chef-solo
package
).map{|s| "provider/lxc/#{s}" }
sh "export ACCEPTANCE=true && bundle exec vagrant-spec test --components=#{components.join(' ')}"
end
types.each do |type, dir|
desc "Run the code examples in #{dir}"
RSpec::Core::RakeTask.new(type) do |t|
# Tells rspec-fire to verify if constants used really exist
ENV['VERIFY_CONSTANT_NAMES'] = '1'
t.pattern = "./#{dir}/**/*_spec.rb"
end
desc "Run unit specs with rspec"
RSpec::Core::RakeTask.new(:unit) do |t|
t.pattern = "./unit/**/*_spec.rb"
end
end

129
templates/sudoers.rb.erb Normal file
View file

@ -0,0 +1,129 @@
#!<%= cmd_paths['ruby'] %>
# Automatically created by vagrant-lxc
class Whitelist
class << self
def add(command, *args)
list[command] ||= []
list[command] << args
end
def add_regex(regex, *args)
regex_list << [regex, [args]]
end
def list
@list ||= {}
end
def regex_list
@regex_list ||= []
end
def allowed(command)
list[command] || allowed_regex(command) || []
end
def allowed_regex(command)
found = regex_list.find { |r| r[0] =~ command }
return found[1] if found
end
def run!(argv)
begin
command, args = `which #{argv.shift}`.chomp, argv || []
check!(command, args)
system "#{command} #{args.join(" ")}"
exit_code = $?.to_i
exit_code = 1 if exit_code == 256
exit exit_code
rescue => e
STDERR.puts e.message
exit 1
end
end
private
def check!(command, args)
allowed(command).each do |checks|
return if valid_args?(args, checks)
end
raise_invalid(command, args)
end
def valid_args?(args, checks)
return false unless valid_length?(args, checks)
check = nil
args.each_with_index do |provided, i|
check = checks[i] unless check == '**'
return false unless match?(provided, check)
end
true
end
def valid_length?(args, checks)
args.length == checks.length || checks.last == '**'
end
def match?(arg, check)
check == '**' || check.is_a?(Regexp) && !!check.match(arg) || arg == check
end
def raise_invalid(command, args)
raise "Invalid arguments for command #{command}, " <<
"provided args: #{args.inspect}"
end
end
end
base = "<%= lxc_base_path %>"
base_path = %r{\A#{base}/.*\z}
##
# Commands from provider.rb
# - Check lxc is installed
Whitelist.add '<%= cmd_paths['which'] %>', /\Alxc-\w+\z/
##
# Commands from driver.rb
# - Container config file
Whitelist.add '<%= cmd_paths['cat'] %>', base_path
# - Shared folders
Whitelist.add '<%= cmd_paths['mkdir'] %>', '-p', base_path
# - Container config customizations and pruning
Whitelist.add '<%= cmd_paths['cp'] %>', '-f', %r{/tmp/.*}, base_path
Whitelist.add '<%= cmd_paths['chown'] %>', 'root:root', base_path
# - Packaging
Whitelist.add '<%= cmd_paths['tar'] %>', '--numeric-owner', '-cvzf', %r{/tmp/.*/rootfs.tar.gz}, '-C', base_path, './rootfs'
Whitelist.add '<%= cmd_paths['chown'] %>', /\A\d+:\d+\z/, %r{\A/tmp/.*/rootfs\.tar\.gz\z}
# - Private network script and commands
Whitelist.add '<%= cmd_paths['ip'] %>', 'addr', 'add', /(\d+|\.)+\/24/, 'dev', /.+/
Whitelist.add '<%= cmd_paths['ip'] %>', 'link', 'set', /.+/, /(up|down)/
Whitelist.add '<%= cmd_paths['brctl'] %>', /(addbr|delbr)/, /.+/
Whitelist.add_regex %r{<%= pipework_regex %>}, '**'
##
# Commands from driver/cli.rb
Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-version'
Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-ls'
Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-info', '--name', /.*/
Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-info', '--name', /.*/, '-iH'
Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-create', '-B', /.*/, '--template', /.*/, '--name', /.*/, '**'
Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-create', '--version'
Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-destroy', '--name', /.*/
Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-start', '-d', '--name', /.*/, '**'
Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-stop', '--name', /.*/
Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-shutdown', '--name', /.*/
Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-attach', '--name', /.*/, '**'
Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-attach', '-h'
Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-config', 'lxc.lxcpath'
Whitelist.add '<%= cmd_paths['lxc_bin'] %>/lxc-update-config', '-c', /.*/
##
# Commands from driver/action/remove_temporary_files.rb
Whitelist.add '<%= cmd_paths['rm'] %>', '-rf', %r{\A#{base}/.*/rootfs/tmp/.*}
# Watch out for stones
Whitelist.run!(ARGV)

View file

@ -10,6 +10,7 @@ Gem::Specification.new do |gem|
gem.email = ["fgrehm@gmail.com"]
gem.description = %q{Linux Containers provider for Vagrant}
gem.summary = gem.description
gem.license = 'MIT'
gem.homepage = "https://github.com/fgrehm/vagrant-lxc"
gem.files = `git ls-files`.split($/)

24
vagrant-spec.config.rb Normal file
View file

@ -0,0 +1,24 @@
# FIXME: Figure out why this doesn't work
if ENV['COVERAGE'] == 'true'
require 'simplecov'
require 'coveralls'
SimpleCov.start { add_filter '/spec/' }
SimpleCov.command_name 'acceptance'
end
if ENV['BOX_PATH'] == nil
latest = ENV.fetch('LATEST_BOXES','2014-03-21')
release = ENV.fetch('RELEASE', 'acceptance')
local_path ="#{File.expand_path("../", __FILE__)}/boxes/output/#{latest}/vagrant-lxc-#{release}-amd64.box"
if File.exists?(local_path)
ENV['BOX_PATH'] = local_path
else
raise 'Set $BOX_PATH to the latest released boxes'
end
end
Vagrant::Spec::Acceptance.configure do |c|
c.component_paths << "spec/acceptance"
c.provider 'lxc', box: ENV['BOX_PATH'], features: ['!suspend']
end