Compare commits

...

153 commits

Author SHA1 Message Date
0cc4a27f32 Update 'README.md' 2023-02-21 10:29:07 +00:00
Fabio
7e885eb8a4
Update README.md 2022-12-05 19:16:19 -03:00
Fabio
39bd2a8704
Update README.md 2022-12-05 19:16:03 -03:00
Fabio
e4cc2f91a4
Update README.md 2022-11-22 18:14:16 -03:00
Fabio
ceb4d98a22
Update README.md 2022-11-22 18:14:02 -03:00
Roman Mohr
a0cdcb05a2 Merge pull request #180 from rmohr/dnf
dnf plugin
2016-11-22 16:10:02 +01:00
Roman Mohr
fad6bbf6a0 Yum is replaced by DNF in newer Fedora releases
Check if yum is really present on a 'redhat' machine.  Only if it is,
enable the Yum bucket. The same for DNF since older versions of CentOS
and Fedora do not ship DNF.
2016-09-26 14:03:23 +02:00
Roman Mohr
5141e1305a Add support for DNF
If the folder `/car/cache/dnf` is present, the content will be cached
like in the Yum plugin.

A possible configuration to enable it:

Vagrant.configure(2) do |config|
   config.vm.box = "fedora/24-cloud-base"
  if Vagrant.has_plugin?("vagrant-cachier")
    config.cache.scope = :machine
    config.cache.auto_detect = false
    config.cache.enable :dnf
  end
end
2016-09-23 12:10:29 +02:00
Fabio Rehm
959ac6fbcc Update README.md 2016-07-18 23:01:42 -07:00
Fabio Rehm
da0eff6a71 Merge pull request #165 from legal90/parallels
Announce compatibility with Parallels provider
2015-11-20 10:06:56 -02:00
Mikhail Zholobov
c42420ec7c Announce compatibility with Parallels provider 2015-11-19 23:14:37 +02:00
Mehran Kholdi
8615b7495e Merge pull request #154 from BayanGroup/master
Add pip cache bucket
2015-07-28 10:21:39 +04:30
AmirAli Moinfar
6deb452f0d Add documentation for caching pip packages 2015-07-05 14:44:27 +04:30
AmirAli Moinfar
1c3fcd2768 Add support for caching pip packages
These directories are chached for pip packages:
$HOME/.cache/pip/http
$HOME/.cache/pip/wheels
2015-07-05 13:56:18 +04:30
Patrick Connolly
40dddfb368 v1.2.1 2015-07-03 14:51:55 -04:00
Patrick Connolly
dd32f2472e Add chef_zero provisioner support. 2015-06-03 13:45:22 -04:00
Fabio Rehm
3b18f4a5ec Update README.md 2015-05-08 19:50:53 -03:00
Fabio Rehm
2c2411721b Merge pull request #141 from strzibny/fix-spelling
Fix spelling
2015-04-07 08:46:26 -03:00
Josef Stribny
92b95824ba Fix spelling 2015-04-07 09:19:26 +02:00
Fabio Rehm
2bb7f21273 v1.2.0 2015-01-14 23:11:54 -02:00
Fabio Rehm
00e2d858da Merge branch 'vagrant_1-7-1_fix' of https://github.com/Yserz/vagrant-cachier
Conflicts:
	lib/vagrant-cachier/cap/linux/chef_file_cache_path.rb
2015-01-14 23:04:32 -02:00
Fabio Rehm
e227077008 Merge branch 'patch-1' of https://github.com/cassianoleal/vagrant-cachier 2015-01-14 23:03:29 -02:00
Fabio Rehm
050e9ea464 Merge branch 'cache-chef-gems' of https://github.com/jperville/vagrant-cachier 2015-01-14 23:02:34 -02:00
Fabio Rehm
f09af37533 Update bundle 2015-01-14 23:02:15 -02:00
cassiano
c6d4e57554 Do not modify Vagrant core object
Using [Array#keep_if](http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-keep_if) on a Vagrant core object can lead to unpredictable behaviour down the line as it modifies the object instead of creating a new one.

An example of such interference is described on https://github.com/cassianoleal/vagrant-butcher/issues/57. The problem with `keep_if` was identified by @sethvargo on this issue: https://github.com/mitchellh/vagrant/issues/5060#issuecomment-68107995
2014-12-25 18:33:34 +01:00
Michael K
15b0039467 Use provisioner type attribute
Vagrant changed the provisioner name attribute to type in version 1.7.1.
2014-12-22 21:08:56 +01:00
Julien Pervillé
4647721f85 Add support for caching chef gems (in /opt/chef/embedded). 2014-10-29 13:09:22 +06:30
Fabio Rehm
9f6b615e84 v1.1.0 2014-10-15 01:28:54 -03:00
Fabio Rehm
1ccdbbeb48 Move bower docs to buckets dir 2014-10-15 01:25:38 -03:00
Fabio Rehm
21f475212c Update bundle 2014-10-15 01:22:11 -03:00
Fabio Rehm
837003ed48 Merge pull request #125 from slecache/bower
Add support for Bower
2014-10-15 01:16:26 -03:00
Fabio Rehm
babc7e09ff Merge pull request #124 from neerolyte/composer_home_resolution
Resolve $HOME even if VM spits bogus new lines
2014-10-15 01:15:51 -03:00
Sebastien Lecacheur
1fe3e15c64 Fix Bower menu link in the docs 2014-10-07 00:07:19 +02:00
Sébastien LECACHEUR
973d5d1a8f Add support for Bower 2014-10-04 01:34:44 +02:00
David Schoen
e9f4df338a Resolve $HOME even if VM spits bogus new lines
Fixes issue #122
2014-09-28 16:03:51 +10:00
Fabio Rehm
b2b0d98dfa 💣 post install message 2014-09-22 22:24:54 -03:00
Fabio Rehm
1333041059 Bump version to 1.0 along with an update to dev dependencies 2014-09-22 22:22:03 -03:00
Fabio Rehm
7acbc815cf Add link to gitter to readme 2014-08-09 16:21:12 -03:00
Fabio Rehm
137bb91eec Add link to gitter chat on docs 2014-08-09 16:16:44 -03:00
Fabio Rehm
25f5582e20 v0.9.0 2014-08-09 16:07:57 -03:00
Fabio Rehm
25b5fa0285 Merge branch 'use_image_for_bucket_name_with_docker' of https://github.com/jbarbuto/vagrant-cachier 2014-08-09 15:39:12 -03:00
Fabio Rehm
4ab1640e7e Add notice about yum bucket and windows hosts (closes GH-117) 2014-08-09 15:36:22 -03:00
John Barbuto
b7b3bcb3ed Check if image is set with docker provider
If build_dir is set instead for building images on demand, there's no way to
know what to set the bucket name to, except perhaps parsing it from Dockerfile.
2014-07-24 23:25:36 -07:00
John Barbuto
c7c47782cb Use image for bucket name with docker, if box is unset
This allows multiple machines using the image to share the cache
and avoids the following error:

    /Applications/Vagrant/embedded/lib/ruby/2.0.0/pathname.rb:389:in
    `initialize': no implicit conversion of nil into String (TypeError)
2014-07-22 22:54:19 -07:00
Fabio Rehm
d94f08a048 v0.8.0 (aka 1.0.0 release candidate) 2014-07-20 23:02:04 -03:00
Fabio Rehm
1a1b108c23 Disable apt-lists bucket for windows hosts
Fixes GH-106
2014-07-20 22:55:32 -03:00
Fabio Rehm
2b6a07d000 Skip chmod 777 for cache bucket root for smb synced folders
Closes GH-107
2014-07-20 22:14:19 -03:00
Fabio Rehm
f8314aba52 Update CHANGELOG 2014-07-20 21:13:50 -03:00
Fabio Rehm
871f317ba6 Set composer cache bucket ownership to the configured SSH user 2014-07-20 21:13:35 -03:00
Fabio Rehm
44aa6a6c54 Remove unecessary logic to skip parent folder creation when preparing bucket symlinks 2014-07-20 21:12:28 -03:00
Fabio Rehm
c4db3c1ef4 Use $HOME/.composer/cache as the root for the composer bucket
Fixes GH-89
2014-07-20 21:11:20 -03:00
Fabio Rehm
4265f58985 Remove some TODOs that have been around for way too long and havent been an issue for a long time 2014-07-20 20:52:31 -03:00
Fabio Rehm
2b00036484 Update CHANGELOG 2014-07-20 20:36:50 -03:00
Fabio Rehm
82fe74a888 👋 to the deprecated enable_nfs config 2014-07-20 20:36:32 -03:00
Fabio Rehm
5f4a7f1967 Make use of the Vagrantfile configured base box name instead of getting it from the Box object (which might be nil)
Closes GH-86
2014-07-20 20:34:14 -03:00
Fabio Rehm
183b2b55d8 Remove unused locale 2014-07-20 20:28:12 -03:00
Fabio Rehm
2cc7b837db Lets keep this code as it is 2014-07-20 20:15:47 -03:00
Fabio Rehm
2b8a281e8a Whitespace 2014-07-20 20:13:36 -03:00
Fabio Rehm
d885c901b9 Up development version 2014-07-20 20:01:28 -03:00
Fabio Rehm
6bca147fb9 Use vagrant cloud base boxes for sanity checks 2014-07-20 19:59:27 -03:00
Fabio Rehm
228cae4a9a Remove Vagrant.require_plugin from sanity checks 2014-07-20 19:58:57 -03:00
Fabio Rehm
e6826e6864 Update bundle 2014-07-20 19:25:55 -03:00
Fabio Rehm
2c51c7e636 Merge pull request #112 from glensc/patch-1
fix cache path
2014-07-04 10:23:30 -03:00
Elan Ruusamäe
5dbd5511fa fix cache path
the path used seems to be `/tmp/vagrant-cache`. at least in 0.7.2
2014-07-04 15:53:44 +03:00
Fabio Rehm
bbd1e9c901 Make sure people know that synced_folder_opts are optional
I came across a blog post somewhere saying that this was required but I
can't find the link right now.
2014-06-23 18:01:01 -03:00
Fabio Rehm
5598824558 Update compatible providers list 2014-06-23 18:00:32 -03:00
Fabio Rehm
6f275353b8 Update README.md 2014-05-13 21:24:48 -03:00
Fabio Rehm
6e160ba4cb v0.7.2 2014-05-08 10:06:51 -03:00
Fabio Rehm
f545717587 Merge pull request #104 from berendt/add_missing_cloud_providers
added missing cloud providers
2014-05-08 10:06:08 -03:00
Christian Berendt
f65a1217e9 added missing cloud providers 2014-05-07 20:50:06 +02:00
Fabio Rehm
3997e2abc7 v0.7.1 2014-05-04 23:20:28 -03:00
Fabio Rehm
364876d8e9 Update bundle 2014-05-04 23:01:24 -03:00
Gustavo L. de M. Chaves
8ac8d7f6f6 Fix multi generic bucket set up
The previously documented way to specify multiple generic buckets
doesn't work because vagrant-cachier can't enable a bucket type more
than once.

Here we generalize the configs hash that the generic bucket gets making
it possible to specify multiple buckets with a single hash. The
documentation is changed accordingly.

Note that we keep it backwards compatible for single generic bucket
specification.

Issue: https://github.com/fgrehm/vagrant-cachier/issues/99
2014-04-16 09:04:49 -03:00
Fabio Rehm
184330dfb4 v0.7.0 2014-04-06 22:30:11 -03:00
Fabio Rehm
ff5dd72c73 Download a specific version of vagrant-cachier tarball instead of master so that it can be cached properly 2014-04-06 22:28:15 -03:00
Fabio Rehm
7aea5a0ab0 Replace java cookbook usage with a simple remote_file cookbook to simplify testing 2014-04-06 22:23:27 -03:00
Fabio Rehm
f10a2d488e Minor tweaks to the dev vagrantfile 2014-04-06 22:08:57 -03:00
Fabio Rehm
12f121e6e4 Properly fix GH-96 2014-04-06 21:47:24 -03:00
Fabio Rehm
20373aa0d7 Fix GH-96 2014-04-06 21:34:58 -03:00
Fabio Rehm
0f3d79e1bc Switch to ruby 1.9+ hash syntax on generic bucket docs 2014-04-06 21:30:34 -03:00
Fabio Rehm
5d9c433326 Add link to generic buckets docs to menu 2014-04-06 21:29:31 -03:00
Fabio Rehm
155821448f Tweak Gemfile for vagrant 1.5+ 2014-04-06 21:28:27 -03:00
Fabio Rehm
890f7c4a56 Update changelog 2014-04-06 21:28:09 -03:00
Fabio Rehm
04102aac8e Some more tweaking to generic bucket docs [GH-94] 2014-04-06 21:27:44 -03:00
Fabio Rehm
a4c5f05263 Add missing end to generic bucket and remove capability method [GH-94] 2014-04-06 21:27:06 -03:00
Fabio Rehm
8d48dacf24 Skip bucket auto detection in case the bucket can't be auto detected [GH-94] 2014-04-06 21:25:58 -03:00
Fabio Rehm
2a17bc4f1d Minor tweaks to generic bucket docs [GH-94] 2014-04-06 21:05:13 -03:00
Fabio Rehm
ffd6c514dd Merge branch 'generic-bucket' of https://github.com/gnustavo/vagrant-cachier 2014-04-06 21:02:56 -03:00
Fabio Rehm
b28da3ab26 Up version to 0.7.0 as we will add a new feature to the plugin 2014-04-06 21:02:37 -03:00
Fabio Rehm
ff2bc00ee3 Update bundle 2014-04-06 21:02:15 -03:00
Gustavo L. de M. Chaves
a63156e482 Implement generic bucket
This bucket must be explicitly enabled and may be useful for users
wanting a generic caching mechanism that they can use directly instead
of via some predefined packaging system.

For instance, this enables one to implement a cache for packages
downloaded via wget or curl.
2014-03-23 22:29:23 -03:00
Fabio Rehm
2df1e31940 Update bundle 2014-02-27 01:12:35 -03:00
Fabio Rehm
2faa661546 Up dev version 2014-02-26 22:05:35 -03:00
Fabio Rehm
ede55cdfaf v0.6.0 2014-02-26 22:03:22 -03:00
Fabio Rehm
33dee6419a Minor dev Vagrantfile tweaks 2014-02-26 22:03:22 -03:00
Fabio Rehm
ec96099e25 Change arch dev box url 2014-02-26 22:03:22 -03:00
Fabio Rehm
4bb48baf40 Add docker-provider as compatible provider (next version will be) and remove vagrant-libvirt + vagrant-kvm as I'm not sure if it really works there yet 2014-02-26 22:03:22 -03:00
Fabio Rehm
f968e2d458 Improve check for whether we should warm up the cache or not 2014-02-26 22:03:22 -03:00
Fabio Rehm
2db38dfa6e Remove unused var 2014-02-26 22:03:22 -03:00
Fabio Rehm
b8394f7e6a Ensure apt partial dirs are created _after_ the symlink is in place, otherwise we would not be able to properly detect whether a bucket is empty or not 2014-02-26 22:03:22 -03:00
Fabio Rehm
ac4243d85e Warm up empty buckets with Guest VM files 2014-02-26 22:03:22 -03:00
Fabio Rehm
09966efc26 Clean up the development environment 2014-02-26 22:03:22 -03:00
Fabio Rehm
5d617f2c48 Bump java cookbook used on dev VM 2014-02-26 22:03:22 -03:00
Fabio Rehm
ae85e996ed Update CHANGELOG 2014-02-26 22:03:22 -03:00
Fabio Rehm
2a63617e75 Ensure /tmp/vagrant-cache exists before chmodding it 2014-02-26 22:03:22 -03:00
Fabio Rehm
01bef9f407 Fix npm bucket
npm is the only bucket that uses this method
2014-02-26 22:03:22 -03:00
Fabio Rehm
07df936e4a Note GH-85 on CHANGELOG 2014-02-26 22:03:22 -03:00
Fabio Rehm
b4d12be2e5 Add docs for apt-lists bucket 2014-02-26 22:03:22 -03:00
Fabio Rehm
437ba6a4cf ⚠️ Massive refactoring of buckets code ⚠️
Doing this is kinda irresponsible because we don't have any unit testing
in place but I've had enough of copy & pasting things around. Although it
doesn't make the codebase GREAT, I believe it'll reach a _nice_ status :)

Thanks to those changes I realized that skipping configuration of
buckets that have already been configured was easier than I thought and
should be enough to close GH-85 \o/
2014-02-26 22:03:22 -03:00
Fabio Rehm
1c2116f317 Support for offline provisioning of apt-packages by caching /var/lib/apt/lists [GH-84] 2014-02-26 22:03:22 -03:00
Fabio Rehm
1fa46ca2d4 Do not attempt chmods when the plugin is disabled 2014-02-26 22:03:21 -03:00
Fabio Rehm
8d6c7c62da Handle nil value for synced_folder_opts 2014-02-26 22:03:21 -03:00
Fabio Rehm
0dd1b20053 chmod /tmp/vagrant-cache on guest VM to 777 to work around some permission issues as explained on GH-74 2014-02-26 22:03:21 -03:00
Fabio Rehm
59887560ed Trigger plugin activation by setting cache scope [GH-17] 2014-02-26 22:03:21 -03:00
Fabio Rehm
849374e0d1 Fix example of removing buckets from machine scoped dirs [GH-82] 2014-02-26 22:03:21 -03:00
Fabio Rehm
aaff51fda8 Update usage docs 2014-02-26 22:03:21 -03:00
Fabio Rehm
509872e91b Forgot to update this to reflect whats going on under the hood 2014-02-26 22:03:21 -03:00
Fabio Rehm
29a4c3c45e http://tom.preston-werner.com/2010/08/23/readme-driven-development.html 2014-02-26 22:03:21 -03:00
Fabio Rehm
2296d35251 According to @miurahr on GH-81 we are compatible with vagrant-kvm \o/ 2014-02-26 22:03:21 -03:00
Fabio Rehm
7d7f048dfb We dont have any provider specific code on around anymore so it should be compatible with any "non-cloud provider" 2014-02-26 22:03:21 -03:00
Fabio Rehm
6bf733d8ed Github have analytics now, lets not worry about bitdeli 2014-02-26 22:03:21 -03:00
Fabio Rehm
6df1efd0ba Update CHANGELOG 2014-02-26 22:03:21 -03:00
Teemu Matilainen
a8f05e4b11 Fix usage examples 2014-02-26 22:03:21 -03:00
Fabio Rehm
ea88562145 Sorry about that, was testing GH-45 2014-02-26 22:03:21 -03:00
Fabio Rehm
0106155a0f Disable the plugin on machines backed by cloud providers (fix GH-45) 2014-02-26 22:03:21 -03:00
Fabio Rehm
09d65c4a3c Ooops 2014-02-26 22:03:21 -03:00
Fabio Rehm
8a4b911678 Extract plugin hooks and capabilities out to separate files 2014-02-26 22:03:21 -03:00
Fabio Rehm
b65438007d Update CHANGELOG 2014-02-26 22:03:21 -03:00
Fabio Rehm
ca8764f938 Add support for disabling the plugin [GH-72] 2014-02-26 22:03:21 -03:00
Fabio Rehm
6908b94609 Improved logging 2014-02-26 22:03:21 -03:00
Fabio Rehm
2f75ffe692 Clean up InstallBuckets action a bit 2014-02-26 22:03:21 -03:00
Fabio Rehm
0f533a9b30 💣 monkey patch on Builtin::Provision action \o/ (closes GH-60) 2014-02-26 22:03:21 -03:00
Fabio Rehm
aa793367b7 Extract cachier's root bucket directory creation out to a separate action [GH-60] 2014-02-26 22:03:21 -03:00
Fabio Rehm
e01a78138a Blow up if using vagrant < 1.4.0 2014-02-26 22:03:21 -03:00
Fabio Rehm
daf7488bbc Update CHANGELOG 2014-02-26 22:03:20 -03:00
Fabio Rehm
d823a97cb8 When specifying NFS synced folders we need to use a symbol (fix GH-76) 2014-02-26 22:03:20 -03:00
Fabio Rehm
4ffb47f838 Display enable_nfs deprecation warning only once 2014-02-26 22:03:20 -03:00
Fabio Rehm
e4f6dd69e4 Display a warning using Vagrant's UI in case enable_nfs is set 2014-02-26 22:03:20 -03:00
Fabio Rehm
fccd43d8e2 Lock vagrant to 1.4.3 2014-02-26 22:03:20 -03:00
Fabio Rehm
8ae667ead9 Mention synced_folder_opts on CHANGELOG 2014-02-26 22:03:20 -03:00
Fabio Rehm
cdf13d3f70 Mark config.enable_nfs as deprecated 2014-02-26 22:03:20 -03:00
Fabio Rehm
3b83867427 Replace enable_nfs and sync_opts config with synced_folder_opts 2014-02-26 22:03:20 -03:00
Fabio Rehm
9c7b02b3ac Update docs to reflect what's going to be implemented 2014-02-26 22:03:20 -03:00
Fabio Rehm
ed6c76dedf We'll probably forget to update these guys, better do it now :) 2014-02-26 22:03:20 -03:00
Fabio Rehm
1541f35ef8 This is no longer needed 2014-02-26 22:03:20 -03:00
Fabio Rehm
98c211590c After 5 months I believe it is safe to get rid of this code 2014-02-26 22:03:20 -03:00
Fabio Rehm
5ff8d1013a We'll drop support for Vagrant < 1.4, that means we should be bumping to 0.6.0 2014-02-26 22:03:20 -03:00
Fabio Rehm
1bc96e77d3 Update bundle 2014-02-26 22:03:20 -03:00
Erno Aapa
4668f1d486 Support for extra synced_folder options
Added ability to pass extra synced_folder options through new
config.cache.sync_opts -configuration.
2014-02-26 22:03:20 -03:00
Teemu Matilainen
12f7963d1f Merge pull request #75 from tuminoid/patch-1
README.md - conditional plugin specific configs
2014-01-08 04:31:38 -08:00
Tuomo Tanskanen
949df52a26 Documentation: conditional plugin specific configs
Wrap plugin specific configs into has_plugin checks to avoid breakage when Vagrantfile is shared and/or plugin is removed (for testing/development).
2014-01-08 06:45:52 +02:00
Fabio Rehm
5342a7ce33 🎆 New year 🎆 2014-01-02 00:51:05 -02:00
Fabio Rehm
50f4536ff7 Up version for development 2013-12-20 11:56:14 -02:00
66 changed files with 1290 additions and 647 deletions

1
.gitignore vendored
View file

@ -15,4 +15,3 @@ test/tmp
test/version_tmp test/version_tmp
tmp tmp
.vagrant .vagrant
development/cookbooks

View file

@ -1,3 +1,144 @@
## [1.2.1](https://github.com/fgrehm/vagrant-cachier/compare/v1.2.0...v1.2.1) (July 3, 2015)
IMPROVEMENTS:
- Add chef\_zero support to chef bucket [[GH-153]]
[GH-153]: https://github.com/fgrehm/vagrant-cachier/issues/153
## [1.2.0](https://github.com/fgrehm/vagrant-cachier/compare/v1.1.0...v1.2.0) (Jan 14, 2015)
FEATURES:
- [Chef Gems bucket](http://fgrehm.viewdocs.io/vagrant-cachier/buckets/chef_rubygems) [[GH-129]]
[GH-129]: https://github.com/fgrehm/vagrant-cachier/pull/129
BUG FIXES:
- Fix provisioner resolution on Vagrant 1.7+ [[GH-133]] / [[GH-134]]
- Do not modify Vagrant core object, preventing unpredictable behavior [[GH-135]]
[GH-133]: https://github.com/fgrehm/vagrant-cachier/issues/133
[GH-134]: https://github.com/fgrehm/vagrant-cachier/pull/134
[GH-135]: https://github.com/fgrehm/vagrant-cachier/pull/135
## [1.1.0](https://github.com/fgrehm/vagrant-cachier/compare/v1.0.0...v1.1.0) (Oct 15, 2014)
FEATURES:
- [Bower bucket](http://fgrehm.viewdocs.io/vagrant-cachier/buckets/bower) [[GH-125]]
[GH-125]: https://github.com/fgrehm/vagrant-cachier/pull/125
IMPROVEMENTS:
- Resolve $HOME even if VM spits bogus new lines [[GH-122]] / [[GH-124]]
[GH-122]: https://github.com/fgrehm/vagrant-cachier/issues/122
[GH-124]: https://github.com/fgrehm/vagrant-cachier/pull/124
## [1.0.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.9.0...v1.0.0) (Sep 22, 2014)
Public API is considered stable.
## [0.9.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.8.0...v0.9.0) (Aug 9, 2014)
FEATURES:
- Suport for caching packages for Docker containers that doesn't have a base box specified [[GH-116]]
[GH-116]: https://github.com/fgrehm/vagrant-cachier/pull/116
## [0.8.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.7.2...v0.8.0) (Jul 20, 2014)
BACKWARDS INCOMPATIBILITIES:
- Removed deprecated `config.enable_nfs` config.
- Changed composer cache bucket to use `$HOME/.composer/cache` [[GH-89]]
IMPROVEMENTS:
- Set composer cache bucket ownership to the configured SSH user.
BUG FIXES:
- Automatically disable apt-lists bucket when a Windows host is detected [[GH-106]]
- Skip `chmod 777` for `smb` mounted folders [[GH-107]]
- Do not error if base box has been removed and `:box` is configured as the cache scope [[GH-86]]
[GH-86]: https://github.com/fgrehm/vagrant-cachier/issues/86
[GH-89]: https://github.com/fgrehm/vagrant-cachier/issues/89
[GH-106]: https://github.com/fgrehm/vagrant-cachier/issues/106
[GH-107]: https://github.com/fgrehm/vagrant-cachier/issues/107
## [0.7.2](https://github.com/fgrehm/vagrant-cachier/compare/v0.7.1...v0.7.2) (May 08, 2014)
IMPROVEMENTS:
- Add `azure`, `brightbox`, `cloudstack`, `vcloud` and `vsphere` to the list
of known cloud providers [[GH-104]]
[GH-104]: https://github.com/fgrehm/vagrant-cachier/pull/104
## [0.7.1](https://github.com/fgrehm/vagrant-cachier/compare/v0.7.0...v0.7.1) (May 04, 2014)
BUG FIXES:
- Fix support for using multiple generic buckets [[GH-101]]
[GH-101]: https://github.com/fgrehm/vagrant-cachier/pull/101
## [0.7.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.6.0...v0.7.0) (Apr 06, 2014)
FEATURES:
- ["Generic" cache bucket](http://fgrehm.viewdocs.io/vagrant-cachier/buckets/generic) [[GH-94]] / [[GH-4]].
BUG FIXES:
- Fix apt-cacher bucket undefined method error [[GH-96]]
[GH-94]: https://github.com/fgrehm/vagrant-cachier/pull/94
[GH-4]: https://github.com/fgrehm/vagrant-cachier/issues/4
[GH-96]: https://github.com/fgrehm/vagrant-cachier/issues/96
## [0.6.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.5.1...v0.6.0) (Feb 26, 2014)
BACKWARDS INCOMPATIBILITIES:
- Plugin activation is now triggered by the `cache.scope` config and that config
is now required. Previous versions of the plugin had it set to `:box` but
there is no consensus whether `:box` and `:machine` is better. This is to
highlight that you need to think about the caching strategy you are going
to use. For more information and to discuss this move please check [GH-17](https://github.com/fgrehm/vagrant-cachier/issues/17).
- Because `cache.scope` is now a requirement and in order to reduce the amount of
configuration required by the plugin, we enabled automatic bucket detection by
default. To revert to the old behavior you can disable it globally from your
`~/.vagrant.d/Vagrantfile`.
- Support for Vagrant < 1.4 is gone, please use a previous plugin version if
you are running Vagrant 1.2 / 1.3
- Automatic handling of multiple machine scoped cache dirs from versions
prior to 0.3.0 of this plugin was removed.
- Support for `enable_nfs` has been deprecated and will be removed on 0.7.0,
please use `cache.synced_folder_opts = {type: :nfs}` instead.
FEATURES:
- Warm up cache buckets with files available on guest in case bucket is empty
- Support for offline provisioning of apt-packages by caching `/var/lib/apt/lists` [GH-84]
- Support for specifying custom cache bucket synced folder opts
- Support to force disabe the plugin [GH-72]
- Automatically disable the plugin for cloud providers [GH-45]
- Skip configuration of buckets that have been configured already [GH-85]
BUG FIXES:
- Properly fix NFS support for Vagrant 1.4+ [GH-76]
## [0.5.1](https://github.com/fgrehm/vagrant-cachier/compare/v0.5.0...v0.5.1) (Dec 20, 2013) ## [0.5.1](https://github.com/fgrehm/vagrant-cachier/compare/v0.5.0...v0.5.1) (Dec 20, 2013)
BUG FIXES: BUG FIXES:

17
Gemfile
View file

@ -1,14 +1,13 @@
source 'https://rubygems.org' source 'https://rubygems.org'
# Specify your gem's dependencies in vagrant-cachier.gemspec
gemspec
group :development do group :development do
gem 'vagrant', github: 'mitchellh/vagrant' gem 'vagrant', github: 'mitchellh/vagrant', tag: 'v1.7.2'
gem 'vagrant-lxc', github: 'fgrehm/vagrant-lxc'
gem 'vagrant-pristine', github: 'fgrehm/vagrant-pristine'
gem 'vagrant-global-status', github: 'fgrehm/vagrant-global-status'
gem 'vagrant-librarian-chef'
gem 'vagrant-omnibus'
gem 'rake' gem 'rake'
end end
group :plugins do
gemspec
gem 'vagrant-lxc', github: 'fgrehm/vagrant-lxc'
gem 'vagrant-pristine', github: 'fgrehm/vagrant-pristine'
gem 'vagrant-omnibus'
end

View file

@ -1,104 +1,119 @@
GIT
remote: git://github.com/fgrehm/vagrant-global-status.git
revision: a0295400a0e47756cbcb8f97ed9f4449b1fb6b56
specs:
vagrant-global-status (0.1.1)
GIT GIT
remote: git://github.com/fgrehm/vagrant-lxc.git remote: git://github.com/fgrehm/vagrant-lxc.git
revision: 225af5622767059708278db29d42941e93d41994 revision: c9cd671a32f730fff4b6e4fdd3687a531af0663c
specs: specs:
vagrant-lxc (0.6.4.dev) vagrant-lxc (1.1.0)
GIT GIT
remote: git://github.com/fgrehm/vagrant-pristine.git remote: git://github.com/fgrehm/vagrant-pristine.git
revision: 4638491786943bfbf6f115b1fc379f069963fe46 revision: 503dbc47848c81d0fbfa6840491856f518d244a1
specs: specs:
vagrant-pristine (0.3.0) vagrant-pristine (0.3.0)
GIT GIT
remote: git://github.com/mitchellh/vagrant.git remote: git://github.com/mitchellh/vagrant.git
revision: 57e95323b6600b146167f0f14f83b22dd31dd03f revision: 1cd667b243f4a263cd5322b6455165cc676b6f7f
tag: v1.7.2
specs: specs:
vagrant (1.3.6.dev) vagrant (1.7.2)
childprocess (~> 0.3.7) bundler (>= 1.5.2, < 1.8.0)
childprocess (~> 0.5.0)
erubis (~> 2.7.0) erubis (~> 2.7.0)
hashicorp-checkpoint (~> 0.1.1)
i18n (~> 0.6.0) i18n (~> 0.6.0)
log4r (~> 1.1.9) listen (~> 2.8.0)
log4r (~> 1.1.9, < 1.1.11)
net-scp (~> 1.1.0) net-scp (~> 1.1.0)
net-ssh (~> 2.6.6) net-sftp (~> 2.1)
net-ssh (>= 2.6.6, < 2.10.0)
nokogiri (= 1.6.3.1)
rb-kqueue (~> 0.2.0)
rest-client (>= 1.6.0, < 2.0)
wdm (~> 0.1.0)
winrm (~> 1.1.3)
PATH PATH
remote: . remote: .
specs: specs:
vagrant-cachier (0.5.1)
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
archive-tar-minitar (0.5.2) akami (1.2.2)
chef (11.6.0) gyoku (>= 0.4.0)
erubis nokogiri
highline (>= 1.6.9) builder (3.2.2)
json (>= 1.4.4, <= 1.7.7) celluloid (0.16.0)
mixlib-authentication (>= 1.3.0) timers (~> 4.0.0)
mixlib-cli (~> 1.3.0) childprocess (0.5.5)
mixlib-config (>= 1.1.2)
mixlib-log (>= 1.3.0)
mixlib-shellout
net-ssh (~> 2.6)
net-ssh-multi (~> 1.1.0)
ohai (>= 0.6.0)
rest-client (>= 1.0.4, < 1.7.0)
yajl-ruby (~> 1.1)
childprocess (0.3.9)
ffi (~> 1.0, >= 1.0.11) ffi (~> 1.0, >= 1.0.11)
erubis (2.7.0) erubis (2.7.0)
ffi (1.9.0) ffi (1.9.6)
highline (1.6.19) gssapi (1.0.3)
i18n (0.6.5) ffi (>= 1.0.1)
ipaddress (0.8.0) gyoku (1.2.2)
json (1.7.7) builder (>= 2.1.2)
librarian (0.1.0) hashicorp-checkpoint (0.1.4)
highline hitimes (1.2.2)
thor (~> 0.15) httpclient (2.6.0.1)
librarian-chef (0.0.1) httpi (0.9.7)
archive-tar-minitar (>= 0.5.2) rack
chef (>= 0.10) i18n (0.6.11)
librarian (~> 0.1.0) listen (2.8.5)
celluloid (>= 0.15.2)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9)
little-plugger (1.1.3)
log4r (1.1.10) log4r (1.1.10)
mime-types (1.23) logging (1.8.2)
mixlib-authentication (1.3.0) little-plugger (>= 1.1.3)
mixlib-log multi_json (>= 1.8.4)
mixlib-cli (1.3.0) mime-types (2.4.3)
mixlib-config (1.1.2) mini_portile (0.6.0)
mixlib-log (1.6.0) multi_json (1.10.1)
mixlib-shellout (1.2.0)
net-scp (1.1.2) net-scp (1.1.2)
net-ssh (>= 2.6.5) net-ssh (>= 2.6.5)
net-ssh (2.6.8) net-sftp (2.1.2)
net-ssh-gateway (1.2.0)
net-ssh (>= 2.6.5) net-ssh (>= 2.6.5)
net-ssh-multi (1.1) net-ssh (2.9.2)
net-ssh (>= 2.1.4) netrc (0.10.2)
net-ssh-gateway (>= 0.99.0) nokogiri (1.6.3.1)
ohai (6.18.0) mini_portile (= 0.6.0)
ipaddress nori (1.1.5)
mixlib-cli rack (1.6.0)
mixlib-config rake (10.4.2)
mixlib-log rb-fsevent (0.9.4)
mixlib-shellout rb-inotify (0.9.5)
systemu ffi (>= 0.5.0)
yajl-ruby rb-kqueue (0.2.3)
rake (10.1.0) ffi (>= 0.5.0)
rest-client (1.6.7) rest-client (1.7.2)
mime-types (>= 1.16) mime-types (>= 1.16, < 3.0)
systemu (2.5.2) netrc (~> 0.7)
thor (0.18.1) rubyntlm (0.1.1)
vagrant-librarian-chef (0.1.2) savon (0.9.5)
librarian-chef akami (~> 1.0)
vagrant-omnibus (1.1.2) builder (>= 2.1.2)
yajl-ruby (1.1.0) gyoku (>= 0.4.0)
httpi (~> 0.9)
nokogiri (>= 1.4.0)
nori (~> 1.0)
wasabi (~> 1.0)
timers (4.0.1)
hitimes
uuidtools (2.1.5)
vagrant-omnibus (1.4.1)
wasabi (1.0.0)
nokogiri (>= 1.4.0)
wdm (0.1.0)
winrm (1.1.3)
gssapi (~> 1.0.0)
httpclient (~> 2.2, >= 2.2.0.2)
logging (~> 1.6, >= 1.6.1)
nokogiri (~> 1.5)
rubyntlm (~> 0.1.1)
savon (= 0.9.5)
uuidtools (~> 2.1.2)
PLATFORMS PLATFORMS
ruby ruby
@ -107,8 +122,9 @@ DEPENDENCIES
rake rake
vagrant! vagrant!
vagrant-cachier! vagrant-cachier!
vagrant-global-status!
vagrant-librarian-chef
vagrant-lxc! vagrant-lxc!
vagrant-omnibus vagrant-omnibus
vagrant-pristine! vagrant-pristine!
BUNDLED WITH
1.10.4

View file

@ -1,4 +1,4 @@
Copyright (c) 2013 Fabio Rehm Copyright (c) 2013-2014 Fabio Rehm
MIT License MIT License

View file

@ -1,15 +1,22 @@
🟢 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-cachier # vagrant-cachier
[![Gem Version](https://badge.fury.io/rb/vagrant-cachier.png)](http://badge.fury.io/rb/vagrant-cachier) [![Gitter chat](https://badges.gitter.im/fgrehm/vagrant-cachier.png)](https://gitter.im/fgrehm/vagrant-cachier)
A [Vagrant](http://www.vagrantup.com/) plugin that helps you reduce the amount of A [Vagrant](http://www.vagrantup.com/) plugin that helps you reduce the amount of
coffee you drink while waiting for boxes to be provisioned by sharing a common coffee you drink while waiting for boxes to be provisioned by sharing a common
package cache among similiar VM instances. Kinda like [vagrant-apt_cache](https://github.com/avit/vagrant-apt_cache) package cache among similar VM instances. Kinda like [vagrant-apt_cache](https://github.com/avit/vagrant-apt_cache)
or [this magical snippet](http://gist.github.com/juanje/3797297) but targetting or [this magical snippet](http://gist.github.com/juanje/3797297) but targeting
multiple package managers and Linux distros. multiple package managers and Linux distros.
## Installation ## Installation
Make sure you have Vagrant 1.2+ and run: Make sure you have Vagrant 1.4+ and run:
``` ```
vagrant plugin install vagrant-cachier vagrant plugin install vagrant-cachier
@ -17,15 +24,27 @@ vagrant plugin install vagrant-cachier
## Quick start ## Quick start
The easiest way to set things up is just to enable [cache buckets auto detection](http://fgrehm.viewdocs.io/vagrant-cachier/usage)
from within your `Vagrantfile`:
```ruby ```ruby
Vagrant.configure("2") do |config| Vagrant.configure("2") do |config|
config.vm.box = 'your-box' config.vm.box = 'your-box'
config.cache.auto_detect = true if Vagrant.has_plugin?("vagrant-cachier")
# If you are using VirtualBox, you might want to enable NFS for shared folders # Configure cached packages to be shared between instances of the same base box.
# config.cache.enable_nfs = true # More info on http://fgrehm.viewdocs.io/vagrant-cachier/usage
config.cache.scope = :box
# OPTIONAL: If you are using VirtualBox, you might want to use that to enable
# NFS for shared folders. This is also very useful for vagrant-libvirt if you
# want bi-directional sync
config.cache.synced_folder_opts = {
type: :nfs,
# The nolock option can be useful for an NFSv3 client that wants to avoid the
# NLM sideband protocol. Without this option, apt-get might hang if it tries
# to lock files needed for /var/cache/* operations. All of this can be avoided
# by using NFSv4 everywhere. Please note that the tcp option is not the default.
mount_options: ['rw', 'vers=3', 'tcp', 'nolock']
}
# For more information please check http://docs.vagrantup.com/v2/synced-folders/basic_usage.html
end
end end
``` ```
@ -33,12 +52,19 @@ For more information please read the documentation available at
http://fgrehm.viewdocs.io/vagrant-cachier. http://fgrehm.viewdocs.io/vagrant-cachier.
## Compatible providers ## Providers that are known to work
* Vagrant's built in VirtualBox provider * Vagrant's built in VirtualBox and Docker providers
* [vagrant-lxc](https://github.com/fgrehm/vagrant-lxc) * [vagrant-lxc](https://github.com/fgrehm/vagrant-lxc)
* [VMware providers](http://www.vagrantup.com/vmware) with NFS enabled (See * [VMware providers](http://www.vagrantup.com/vmware) with NFS enabled (See
[GH-24](https://github.com/fgrehm/vagrant-cachier/issues/24) for more info) [GH-24](https://github.com/fgrehm/vagrant-cachier/issues/24) for more info)
* [vagrant-parallels](https://github.com/Parallels/vagrant-parallels)
* [vagrant-libvirt](https://github.com/pradels/vagrant-libvirt)
* [vagrant-kvm](https://github.com/adrahon/vagrant-kvm)
* _[Let us know if it is compatible with other providers!](https://github.com/fgrehm/vagrant-cachier/issues/new)_
_Please note that as of v0.6.0 the plugin will automatically disable any
previously defined configs for [cloud providers](lib/vagrant-cachier/plugin.rb#L19-22)_
## Contributing ## Contributing
@ -48,5 +74,3 @@ http://fgrehm.viewdocs.io/vagrant-cachier.
3. Commit your changes (`git commit -am 'Add some feature'`) 3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`) 4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request 5. Create new Pull Request
[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/fgrehm/vagrant-cachier/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

View file

@ -1,11 +1,7 @@
SITE SITE
remote: http://community.opscode.com/api/v1 remote: http://community.opscode.com/api/v1
specs: specs:
chef_handler (1.1.4) java (1.19.2)
java (1.12.0)
windows (>= 0.0.0)
windows (1.10.0)
chef_handler (>= 0.0.0)
DEPENDENCIES DEPENDENCIES
java (>= 0) java (>= 0)

View file

@ -1,127 +1,132 @@
# -*- mode: ruby -*- # -*- mode: ruby -*-
# vi: set ft=ruby : # vi: set ft=ruby :
Vagrant.require_plugin 'vagrant-cachier'
Vagrant.require_plugin 'vagrant-librarian-chef'
Vagrant.require_plugin 'vagrant-lxc'
Vagrant.require_plugin 'vagrant-omnibus'
Vagrant.require_plugin 'vagrant-pristine'
Vagrant.configure("2") do |config| Vagrant.configure("2") do |config|
config.vm.synced_folder "../", "/vagrant", id: 'vagrant-root' config.vm.synced_folder "../", "/vagrant", id: 'vagrant-root'
config.cache.scope = :machine config.cache.scope = :machine
config.cache.auto_detect = true config.cache.auto_detect = true
config.cache.enable_nfs = true config.cache.synced_folder_opts = { type: :nfs }
config.omnibus.chef_version = :latest config.vm.provider :virtualbox do |vb|
config.vm.provision :chef_solo do |chef| vb.customize [ "modifyvm", :id, "--memory", 256, "--cpus", "1" ]
chef.add_recipe "java::oracle"
chef.json = {
:java => {
:oracle => {
:accept_oracle_download_terms => true
}
}
}
end end
# Installs RVM config.vm.provider :lxc do |lxc|
config.vm.provision :shell, inline: ' lxc.customize 'aa_profile', 'unconfined'
if ! [ -d /home/vagrant/.rvm ]; then end
HOME=/home/vagrant su -p vagrant -l -c "curl -L https://get.rvm.io | bash -s stable"
fi
'
# Here we have the RVM cache bucket configured, so we install 2.0.0
config.vm.provision :shell, inline: '
if ! [ -d /home/vagrant/.rvm/rubies/ruby-1.9.3* ]; then
HOME=/home/vagrant su -p vagrant -l -c "rvm install 1.9.3 && rvm use 1.9.3 --default"
fi
'
config.vm.provision :shell, inline: '
if ! [ -d /home/vagrant/.nvm ]; then
apt-get install git -y
HOME=/home/vagrant su -p vagrant -l -c "
curl https://raw.github.com/creationix/nvm/master/install.sh | sh
"
fi
'
config.vm.provision :shell, inline: '
if ! [ -d /home/vagrant/.nvm/v0.10* ]; then
HOME=/home/vagrant su -p vagrant -l -c "
nvm install 0.10
nvm alias default 0.10
"
fi
'
configure_private_network = lambda do |node, suffix| configure_private_network = lambda do |node, suffix|
node.vm.network :private_network, ip: "192.168.50.#{suffix}" node.vm.network :private_network, ip: "192.168.50.#{suffix}"
end end
debian_like_configs = lambda do |debian| initial_debian_setup = lambda do |debian, git_pkg = 'git'|
# Here we have the RubyGems cache bucket configured to the right path, so we debian.vm.provision :shell, inline: "apt-get update && apt-get install -y #{git_pkg} php5-cli curl wget htop"
# bundle the project end
debian.vm.provision :shell, inline: '
sudo apt-get install -y git php5-cli install_nvm_and_rvm = lambda do |node|
HOME=/home/vagrant su -p vagrant -l -c "cd /vagrant && bundle" # Installs RVM
node.vm.provision :shell, inline: '
if ! [ -d /home/vagrant/.rvm ]; then
HOME=/home/vagrant su -p vagrant -l -c "curl -L https://get.rvm.io | bash -s stable"
fi
'
# Here we have the RVM cache bucket configured, so we install 2.0.0
node.vm.provision :shell, inline: '
if ! [ -d /home/vagrant/.rvm/rubies/ruby-2.0.0* ]; then
HOME=/home/vagrant su -p vagrant -l -c "rvm install 2.0.0 && rvm use 2.0.0 --default"
fi
'
node.vm.provision :shell, inline: '
if ! [ -d /home/vagrant/.nvm ]; then
apt-get install git -y
HOME=/home/vagrant su -p vagrant -l -c "
curl https://raw.github.com/creationix/nvm/master/install.sh | sh
"
fi
'
node.vm.provision :shell, inline: '
if ! [ -d /home/vagrant/.nvm/v0.10* ]; then
HOME=/home/vagrant su -p vagrant -l -c "
nvm install 0.10
nvm alias default 0.10
"
fi
' '
end end
config.vm.define :ubuntu do |ubuntu| config.vm.define :ubuntu do |ubuntu|
ubuntu.vm.box = "quantal64" ubuntu.vm.box = "raring64"
debian_like_configs.call ubuntu ubuntu.vm.provider :lxc do |_, override|
override.vm.box = 'fgrehm/raring64-lxc'
end
configure_private_network.call ubuntu, 10 configure_private_network.call ubuntu, 10
initial_debian_setup.call(ubuntu)
install_nvm_and_rvm.call(ubuntu)
ubuntu.omnibus.chef_version = :latest
ubuntu.vm.provision :chef_solo do |chef|
chef.add_recipe "cachier::default"
end
end end
config.vm.define :lucid do |lucid| config.vm.define :lucid do |lucid|
lucid.vm.box = "lucid64" lucid.vm.box = "lucid64"
debian_like_configs.call lucid # Disable NFS
lucid.cache.synced_folder_opts = { }
configure_private_network.call lucid, 11 configure_private_network.call lucid, 11
initial_debian_setup.call(lucid, 'git-core')
install_nvm_and_rvm.call(lucid)
end end
config.vm.define :debian do |debian| config.vm.define :debian do |debian|
debian.vm.box = "squeeze64" debian.vm.box = "squeeze64"
debian.vm.box_url = 'http://f.willianfernandes.com.br/vagrant-boxes/DebianSqueeze64.box' debian.vm.box_url = 'http://f.willianfernandes.com.br/vagrant-boxes/DebianSqueeze64.box'
debian_like_configs.call debian
configure_private_network.call debian, 12 configure_private_network.call debian, 12
initial_debian_setup.call(debian)
install_nvm_and_rvm.call(debian)
end end
config.vm.define :centos do |centos| config.vm.define :centos do |centos|
centos.vm.box = 'centos6_64' centos.vm.box = 'centos6_64'
centos.vm.box_url = 'http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130309.box' centos.vm.box_url = 'http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130309.box'
configure_private_network.call centos, 13 configure_private_network.call centos, 13
# Here we have the RubyGems cache bucket configured to the right path, so we
# bundle the project
centos.vm.provision :shell, inline: ' centos.vm.provision :shell, inline: '
yum install -y libffi-devel ruby-devel git (
HOME=/home/vagrant su -p vagrant -l -c "cd /vagrant && bundle"' mkdir -p /tmp/epel
cd /tmp/epel
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm
)
yum install -y libffi-devel ruby-devel git
'
centos.vm.provision :shell, inline: 'gem install bundler'
end end
config.vm.define :arch do |arch| config.vm.define :arch do |arch|
arch.vm.box = 'arch64' arch.vm.box = 'arch64'
arch.vm.box_url = 'http://vagrant.pouss.in/archlinux_2012-07-02.box' arch.vm.box_url = 'https://dl.dropboxusercontent.com/u/6750592/Arch_Linux_2013.11_x64.box'
configure_private_network.call arch, 14 # Disable NFS
arch.vm.provision :shell, inline: ' arch.cache.synced_folder_opts = { }
pacman -Syu --noconfirm libffi git
HOME=/home/vagrant su -p vagrant -l -c "cd /vagrant && bundle"' arch.vm.provision :shell, inline: 'pacman -Syu --noconfirm libffi git ruby && gem install bundler'
end end
# Please note that we are not able to install chef on the VM, so when bringing
# this up we should always pass in `--provision-with=shell`
#
# TODO: Find out how to install chef on this or other box or find one that has
# it pre installed
config.vm.define :opensuse do |suse| config.vm.define :opensuse do |suse|
suse.vm.box = 'opensuse-12' suse.vm.box = 'opensuse-12'
suse.vm.box_url = 'http://sourceforge.net/projects/opensusevagrant/files/12.3/opensuse-12.3-64.box/download' suse.vm.box_url = 'http://sourceforge.net/projects/opensusevagrant/files/12.3/opensuse-12.3-64.box/download'
configure_private_network.call suse, 15 # Disable NFS
suse.cache.enable_nfs = false suse.cache.synced_folder_opts = { }
# This seems to not be working
suse.omnibus.chef_version = nil
suse.vm.provision :shell, inline: 'time zypper install -y git' suse.vm.provision :shell, inline: 'time zypper install -y git'
end end
end end

View file

@ -0,0 +1,4 @@
zip_filepath = "#{Chef::Config['file_cache_path']}/vagrant-cachier.tar.gz"
zip_url = "https://github.com/fgrehm/vagrant-cachier/archive/v0.6.0.tar.gz"
remote_file(zip_filepath) { source zip_url }

27
docs/buckets/apt-lists.md Normal file
View file

@ -0,0 +1,27 @@
# APT lists
Used by Debian-like Linux distros, will get configured under guest's `/var/lib/apt/lists`.
As explained on [Wikipedia](http://en.wikipedia.org/wiki/Advanced_Packaging_Tool#Files),
`/var/lib/apt/lists` is the "storage area for state information for each package
resource specified in sources.list". By enabling this bucket, `apt` will be able
to install cached packages without hitting the remote repositories for the main
package lists, [being particularly useful when developing offline](https://github.com/fgrehm/vagrant-cachier/pull/84#issue-27311414).
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-debian-box'
config.cache.enable :apt_lists
end
```
## Heads up!
This bucket is automatically disabled for Windows hosts, please have a look at
the following issues for more information:
* https://github.com/fgrehm/vagrant-cachier/issues/106
* https://github.com/fgrehm/vagrant-cachier/issues/109
* https://github.com/fgrehm/vagrant-cachier/issues/113

13
docs/buckets/bower.md Normal file
View file

@ -0,0 +1,13 @@
# [Bower](http://bower.io/)
Compatible with probably any type of linux guest distro, will cache guests'
`$HOME/.cache/bower` if bower is detected.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box-with-bower-installed'
config.cache.enable :bower
end
```

View file

@ -0,0 +1,18 @@
# Chef RubyGems
When a Chef installation is detected, this bucket caches its embedded gems.
Most of these gems are part of the Chef omnibus package but sometimes cookbooks
need to install extra gems to run within the context of a Chef recipe using the
`chef_gem` resource.
The embedded Chef gem location is returned by running the
`/opt/chef/embedded/bin/gem env gemdir` command.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box-using-chef-provisioner'
config.cache.enable :chef_gem
end
```

View file

@ -1,7 +1,7 @@
# [Composer](http://getcomposer.org/) # [Composer](http://getcomposer.org/)
Compatible with probably any type of linux guest distro, will cache guests' Compatible with probably any type of linux guest distro, will cache guests'
`$HOME/.composer` if PHP is detected. `$HOME/.composer/cache` if PHP is detected.
To manually enable it: To manually enable it:

20
docs/buckets/dnf.md Normal file
View file

@ -0,0 +1,20 @@
# DNF
Used by Fedora guests, will get configured under guest's `/var/cache/dnf`. It will
also [make sure](lib/vagrant-cachier/bucket/dnf.rb#L20) that `keepcache` is set to
`1` on guest's `/etc/dnf/dnf.conf`.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-fedora-box'
config.cache.enable :dnf
end
```
### :warning: Notice about Windows hosts :warning:
In case this bucket is enabled and a Windows host is in use, you might see an
ugly stacktrace as described on [this comment](https://github.com/fgrehm/vagrant-cachier/issues/117#issuecomment-50548393)
if some DNF repository is not available during provisioning.

46
docs/buckets/generic.md Normal file
View file

@ -0,0 +1,46 @@
# Generic
This bucket is never enabled by default. You have to enable it explicitly like
this:
```ruby
Vagrant.configure("2") do |config|
config.cache.enable :generic, { :cache_dir => "/var/cache/some" }
end
```
The `:cache_dir` parameter is required. It specifies the directory on the guest
that will be cached under the "/tmp/vagrant-cache/generic" bucket.
You may enable more than one generic bucket by giving them different names,
like this:
```ruby
Vagrant.configure("2") do |config|
config.cache.enable :generic, {
"one" => { cache_dir: "/var/cache/one" },
"two" => { cache_dir: "/var/cache/two" },
}
end
```
In this case you get two buckets called "one" and "two" under the guest's
`/tmp/vagrant-cache` directory.
The Generic bucket is useful if you want to implement a caching mechanism by
hand. For instance, if you want to cache your wget downloads under
`/var/cache/wget` you can do this:
```ruby
Vagrant.configure("2") do |config|
config.cache.enable :generic, {
"wget" => { cache_dir: "/var/cache/wget" },
}
end
```
Then, you invoke wget like this:
```sh
wget -N -P /var/cache/wget URL
```

15
docs/buckets/pip.md Normal file
View file

@ -0,0 +1,15 @@
# [pip](https://pip.pypa.io/)
Compatible with probably any type of linux guest distro, will hook into pip's
http and wheels cache directory under `$HOME/.cache/pip/http` and `$HOME/.cache/pip/wheels` as
the default SSH user (usually `vagrant`) on your guest.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box-with-pip-installed'
config.cache.enable :pip
end
```

View file

@ -12,3 +12,9 @@ Vagrant.configure("2") do |config|
config.cache.enable :yum config.cache.enable :yum
end end
``` ```
### :warning: Notice about Windows hosts :warning:
In case this bucket is enabled and a Windows host is in use, you might see an
ugly stacktrace as described on [this comment](https://github.com/fgrehm/vagrant-cachier/issues/117#issuecomment-50548393)
if some Yum repository is not available during provisioning.

View file

@ -11,7 +11,7 @@ Regarding configurations, right now the plugin does not make any assumptions for
you and you have to configure things properly from your `Vagrantfile`. In other you and you have to configure things properly from your `Vagrantfile`. In other
words, _the plugin is disabled by default_. words, _the plugin is disabled by default_.
Cache buckets will always be available from `/tmp/vagrant-cachier` on your guest and Cache buckets will always be available from `/tmp/vagrant-cache` on your guest and
the appropriate folders will get symlinked to the right path _after_ the machine is the appropriate folders will get symlinked to the right path _after_ the machine is
up but _right before_ it gets provisioned. We _could_ potentially do it on one go up but _right before_ it gets provisioned. We _could_ potentially do it on one go
and share bucket's folders directly to the right path if we were only using VirtualBox and share bucket's folders directly to the right path if we were only using VirtualBox
@ -20,12 +20,11 @@ _as part of_ the boot process (synced folders are actually `lxc-start` parameter
and as of now we are not able to get some information that this plugin requires and as of now we are not able to get some information that this plugin requires
about the guest machine / container before it is actually up and running. about the guest machine / container before it is actually up and running.
Under the hood, the plugin will monkey patch `Vagrant::Builtin::Provision` and Under the hood, the plugin will hook into Vagrant in order to set things up for each
will set things up for each configured cache bucket _before and after_ running each configured cache bucket _before and after_ running each defined provisioner. Before
defined provisioner. Before halting the machine, it will also revert the changes halting the machine, it will also revert the changes required to set things up by
required to set things up by hooking into calls to `Vagrant::Builtin::GracefulHalt` hooking into calls to `Vagrant::Builtin::GracefulHalt` so that you can repackage
so that you can repackage the machine for others to use without requiring users to the machine for others to use without requiring users to install the plugin as well.
install the plugin as well.
Please keep in mind that this plugin won't do magic, if you are compiling things Please keep in mind that this plugin won't do magic, if you are compiling things
during provisioning or manually downloading packages outside of a bucket you during provisioning or manually downloading packages outside of a bucket you

View file

@ -9,7 +9,7 @@ multiple package managers and Linux distros.
## Installation ## Installation
Make sure you have Vagrant 1.2+ and run: Make sure you have Vagrant 1.4+ and run:
``` ```
vagrant plugin install vagrant-cachier vagrant plugin install vagrant-cachier
@ -23,21 +23,40 @@ from within your `Vagrantfile`:
```ruby ```ruby
Vagrant.configure("2") do |config| Vagrant.configure("2") do |config|
config.vm.box = 'your-box' config.vm.box = 'your-box'
config.cache.auto_detect = true if Vagrant.has_plugin?("vagrant-cachier")
# If you are using VirtualBox, you might want to enable NFS for shared folders # Configure cached packages to be shared between instances of the same base box.
# config.cache.enable_nfs = true # More info on the "Usage" link above
config.cache.scope = :box
# OPTIONAL: If you are using VirtualBox, you might want to use that to enable
# NFS for shared folders. This is also very useful for vagrant-libvirt if you
# want bi-directional sync
config.cache.synced_folder_opts = {
type: :nfs,
# The nolock option can be useful for an NFSv3 client that wants to avoid the
# NLM sideband protocol. Without this option, apt-get might hang if it tries
# to lock files needed for /var/cache/* operations. All of this can be avoided
# by using NFSv4 everywhere. Please note that the tcp option is not the default.
mount_options: ['rw', 'vers=3', 'tcp', 'nolock']
}
end
end end
``` ```
For more information please check out the links on the menu above. For more information please check out the links on the menu above.
## Compatible providers ## Providers that are known to work
* Vagrant's built in VirtualBox provider * Vagrant's built in VirtualBox provider
* [vagrant-lxc](https://github.com/fgrehm/vagrant-lxc) * [vagrant-lxc](https://github.com/fgrehm/vagrant-lxc)
* [VMware providers](http://www.vagrantup.com/vmware) with NFS enabled (See * [VMware providers](http://www.vagrantup.com/vmware) with NFS enabled (See
[GH-24](https://github.com/fgrehm/vagrant-cachier/issues/24) for more info) [GH-24](https://github.com/fgrehm/vagrant-cachier/issues/24) for more info)
* [vagrant-libvirt](https://github.com/pradels/vagrant-libvirt)
* [vagrant-kvm](https://github.com/adrahon/vagrant-kvm)
_Please note that as of v0.6.0 the plugin will automatically disable any
previously defined configs for [cloud providers](lib/vagrant-cachier/plugin.rb#L19-22)_
## Contributing ## Contributing

View file

@ -82,21 +82,30 @@
<li class="dropdown"> <li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Available Buckets <span class="caret"></span></a> <a class="dropdown-toggle" data-toggle="dropdown" href="#">Available Buckets <span class="caret"></span></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a tabindex="-1" href="buckets/generic">Generic</a></li>
<li><a tabindex="-1" href="buckets/apt">APT</a></li> <li><a tabindex="-1" href="buckets/apt">APT</a></li>
<li><a tabindex="-1" href="buckets/apt-lists">apt-lists</a></li>
<li><a tabindex="-1" href="buckets/apt-cacher">apt-cacher</a></li> <li><a tabindex="-1" href="buckets/apt-cacher">apt-cacher</a></li>
<li><a tabindex="-1" href="buckets/chef">Chef</a></li> <li><a tabindex="-1" href="buckets/chef">Chef</a></li>
<li><a tabindex="-1" href="buckets/chef_rubygems">Chef Gems</a></li>
<li><a tabindex="-1" href="buckets/composer">Composer</a></li> <li><a tabindex="-1" href="buckets/composer">Composer</a></li>
<li><a tabindex="-1" href="buckets/dnf">DNF</a></li>
<li><a tabindex="-1" href="buckets/bower">Bower</a></li>
<li><a tabindex="-1" href="buckets/pacman">Pacman</a></li> <li><a tabindex="-1" href="buckets/pacman">Pacman</a></li>
<li><a tabindex="-1" href="buckets/npm">npm</a></li> <li><a tabindex="-1" href="buckets/npm">npm</a></li>
<li><a tabindex="-1" href="buckets/rubygems">RubyGems</a></li> <li><a tabindex="-1" href="buckets/rubygems">RubyGems</a></li>
<li><a tabindex="-1" href="buckets/rvm">rvm</a></li> <li><a tabindex="-1" href="buckets/rvm">rvm</a></li>
<li><a tabindex="-1" href="buckets/yum">Yum</a></li> <li><a tabindex="-1" href="buckets/yum">Yum</a></li>
<li><a tabindex="-1" href="buckets/zypper">Zypper</a></li> <li><a tabindex="-1" href="buckets/zypper">Zypper</a></li>
<li><a tabindex="-1" href="buckets/pip">pip</a></li>
</ul> </ul>
</li> </li>
<li> <li>
<a href="development">Development</a> <a href="development">Development</a>
</li> </li>
<li>
<li><a href="https://gitter.im/fgrehm/vagrant-cachier" target="_blank">Chat</li>
</li>
</ul> </ul>
<ul class="nav navbar-nav navbar-right visible-md visible-lg"> <ul class="nav navbar-nav navbar-right visible-md visible-lg">

View file

@ -1,51 +1,46 @@
# Usage # Usage
## Auto detect supported cache buckets ## Being nice to others
This is the easiest way to get started with plugin. By adding the code below to It is a good practice to wrap plugin specific configuration with `has_plugin?` checks
your `Vagrantfile` you can enable automatic detection of supported cache _buckets_: so the user's Vagrantfiles do not break if `vagrant-cachier` is uninstalled or
the Vagrantfile is shared with people that don't have the plugin installed:
```ruby ```ruby
Vagrant.configure("2") do |config| Vagrant.configure("2") do |config|
# ... # ...
config.cache.auto_detect = true if Vagrant.has_plugin?("vagrant-cachier")
# ... vagrant-cachier configs ...
end
end end
``` ```
This will make vagrant-cachier do its best to find out what is supported on the
guest machine and will set buckets accordingly.
## Enable buckets as needed
If for whatever reason you need to have a fined grained control over what buckets
are configured, you can do so by "cherry picking" them on your `Vagrantfile`:
```ruby
Vagrant.configure("2") do |config|
config.cache.enable :apt
config.cache.enable :gem
end
```
_Please refer to the "Available Buckets" menu above to find out which buckets
are supported._
## Cache scope ## Cache scope
By default downloaded packages will get stored on a folder scoped to base boxes This is the only required configuration for the plugin to work and should be present
under your `$HOME/.vagrant.d/cache`. The idea is to leverage the cache by allowing on your project's specific `Vagrantfile` or on your `~/.vagrant.d/Vagrantfile` in
downloaded packages to be reused across projects. So, if your `Vagrantfile` has order to enable it.
something like:
### `:box` scope
By setting `cache.scope` to `:box`, downloaded packages will get stored on a folder
scoped to base boxes under your `~/.vagrant.d/cache`. The idea is to leverage the
cache by allowing downloaded packages to be reused across projects. So, if your
`Vagrantfile` has something like:
```ruby ```ruby
Vagrant.configure("2") do |config| Vagrant.configure("2") do |config|
config.vm.box = 'some-box' config.vm.box = 'some-box'
config.cache.auto_detect = true if Vagrant.has_plugin?("vagrant-cachier")
config.cache.scope = :box
end
end end
``` ```
The cached files will be stored under `$HOME/.vagrant.d/cache/some-box`. The cached files will be stored under `$HOME/.vagrant.d/cache/some-box`.
### `:machine` scope
If you are on a [multi VM environment](http://docs.vagrantup.com/v2/multi-machine/index.html), If you are on a [multi VM environment](http://docs.vagrantup.com/v2/multi-machine/index.html),
there is a huge chance that you'll end up having issues by sharing the same bucket there is a huge chance that you'll end up having issues by sharing the same bucket
across different machines. For example, if you `apt-get install` from two machines across different machines. For example, if you `apt-get install` from two machines
@ -56,13 +51,71 @@ to be based on machines:
```ruby ```ruby
Vagrant.configure("2") do |config| Vagrant.configure("2") do |config|
config.vm.box = 'some-box' config.vm.box = 'some-box'
config.cache.scope = :machine if Vagrant.has_plugin?("vagrant-cachier")
config.cache.scope = :machine
end
end end
``` ```
This will tell vagrant-cachier to download packages to `.vagrant/machines/<machine-name>/cache` This will tell vagrant-cachier to download packages to `.vagrant/machines/<machine-name>/cache`
on your current project directory. on your current project directory.
## Cache buckets automatic detection
This is the easiest way to get started with plugin and is enabled by default.
Under the hood, `vagrant-cachier` does its best to find out what is supported on the
guest machine and will set buckets accordingly.
If you want that behavior to be disabled, you can set `cache.auto_detect` to `false`
from your Vagrantfile:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box'
if Vagrant.has_plugin?("vagrant-cachier")
config.cache.scope = :machine # or :box
config.cache.auto_detect = false
end
end
```
## Enable buckets as needed
If for whatever reason you need to have a fined grained control over what buckets
are configured, you can do so by "cherry picking" them on your `Vagrantfile`:
```ruby
Vagrant.configure("2") do |config|
config.cache.auto_detect = false
config.cache.enable :apt
config.cache.enable :gem
end
```
_Please refer to the "Available Buckets" menu above to find out which buckets
are supported._
## Custom cache buckets synced folders options
For fine grained control over the cache bucket synced folder options you can use
the `synced_folder_opts` config. That's useful if, for example, you are using
VirtualBox and want to enable NFS for improved performance:
```ruby
Vagrant.configure("2") do |config|
config.cache.synced_folder_opts = {
type: :nfs,
# The nolock option can be useful for an NFSv3 client that wants to avoid the
# NLM sideband protocol. Without this option, apt-get might hang if it tries
# to lock files needed for /var/cache/* operations. All of this can be avoided
# by using NFSv4 everywhere. Please note that the tcp option is not the default.
mount_options: ['rw', 'vers=3', 'tcp', 'nolock']
}
end
```
Please referer to http://docs.vagrantup.com/v2/synced-folders/basic_usage.html for
more information about the supported parameters.
## Finding out disk space used by buckets ## Finding out disk space used by buckets
@ -95,5 +148,5 @@ the code below if you are on a Linux machine:
$ rm -rf $HOME/.vagrant.d/cache/<box-name>/<optional-bucket-name> $ rm -rf $HOME/.vagrant.d/cache/<box-name>/<optional-bucket-name>
# scope = :machine # scope = :machine
$ rm -rf .vagrant/cache/<box-name>/<optional-bucket-name> $ rm -rf .vagrant/machines/<machine-name>/cache/<optional-bucket-name>
``` ```

View file

@ -56,7 +56,7 @@ module VagrantPlugins
def remove_symlink(symlink) def remove_symlink(symlink)
if @machine.communicate.test("test -L #{symlink}") if @machine.communicate.test("test -L #{symlink}")
@logger.debug "Removing symlink for '#{symlink}'" @logger.info "Removing symlink for '#{symlink}'"
@machine.communicate.sudo("unlink #{symlink}") @machine.communicate.sudo("unlink #{symlink}")
end end
end end

View file

@ -0,0 +1,67 @@
require 'timeout'
module VagrantPlugins
module Cachier
class Action
class ConfigureBucketRoot
def initialize(app, env)
@app = app
@logger = Log4r::Logger.new("vagrant::cachier::action::clean")
end
def call(env)
@env = env
if !env[:cache_buckets_folder_configured] && env[:machine].config.cache.enabled?
setup_buckets_folder
env[:cache_buckets_folder_configured] = true
end
@app.call env
end
def setup_buckets_folder
FileUtils.mkdir_p(cache_root.to_s) unless cache_root.exist?
synced_folder_opts = {id: "vagrant-cache"}
synced_folder_opts.merge!(@env[:machine].config.cache.synced_folder_opts || {})
@env[:machine].config.vm.synced_folder cache_root, '/tmp/vagrant-cache', synced_folder_opts
@env[:cache_dirs] = []
end
def cache_root
@cache_root ||= case @env[:machine].config.cache.scope.to_sym
when :box
@box_name = box_name
# Box is optional with docker provider
if @box_name.nil? && @env[:machine].provider_name.to_sym == :docker
@image_name = image_name
# Use the image name if it's set
if @image_name
bucket_name = @image_name.gsub(':', '-')
else
raise "Cachier plugin only supported with docker provider when image is used"
end
else
bucket_name = @box_name
end
@env[:home_path].join('cache', bucket_name)
when :machine
@env[:machine].data_dir.parent.join('cache')
else
raise "Unknown cache scope: '#{@env[:machine].config.cache.scope}'"
end
end
def box_name
@env[:machine].config.vm.box
end
def image_name
@env[:machine].provider_config.image
end
end
end
end
end

View file

@ -1,64 +0,0 @@
require_relative '../errors'
module VagrantPlugins
module Cachier
class Action
class EnsureSingleCacheRoot
def initialize(app, env)
@app = app
end
def call(env)
@env = env
# If the cache is scoped to boxes or the existing cache dirs are not
# provider specific, there's nothing we need to do
if cache_scoped_to_machine? && provider_specific_cache_dirs.any?
ensure_single_cache_root_exists!
end
@app.call(env)
end
def cache_scoped_to_machine?
@env[:machine].config.cache.enabled? &&
@env[:machine].config.cache.scope.to_sym == :machine
end
def ensure_single_cache_root_exists!
if provider_specific_cache_dirs.size > 1
cache_dirs = provider_specific_cache_dirs.map do |dir|
" - #{dir.to_s.gsub(/^#{@env[:root_path]}\//, '')}"
end
machine_path = @env[:machine].data_dir.parent.to_s.gsub(/^#{@env[:root_path]}\//, '')
raise Cachier::Errors::MultipleProviderSpecificCacheDirsFound,
machine: @env[:machine].name,
machine_path: machine_path,
dirs: cache_dirs.join("\n")
else
current_path = provider_specific_cache_dirs.first.to_s.gsub(/^#{@env[:root_path]}\//, '')
new_path = @env[:machine].data_dir.parent.join('cache')
FileUtils.rm_rf new_path.to_s if new_path.directory?
new_path = new_path.to_s.gsub(/^#{@env[:root_path]}\//, '')
# If we got here there is a single provider specific cacher dir, so
# let's be nice with users and just fix it ;)
@env[:ui].warn I18n.t('vagrant_cachier.will_fix_machine_cache_dir',
current_path: current_path,
new_path: new_path)
FileUtils.mv current_path, new_path
end
end
def provider_specific_cache_dirs
return @provider_specific_cache_dirs if @provider_specific_cache_dirs
# By default data_dir points to ./.vagrant/machines/<NAME>/<PROVIDER>,
# so we go one directory up
machine_dir = @env[:machine].data_dir.parent
@provider_specific_cache_dirs = Pathname.glob(machine_dir.join('*/cache'))
end
end
end
end
end

View file

@ -0,0 +1,66 @@
require_relative '../bucket'
module VagrantPlugins
module Cachier
class Action
class InstallBuckets
def initialize(app, env, opts = {})
@app = app
@logger = Log4r::Logger.new("vagrant::cachier::action::clean")
@opts = opts
end
def call(env)
@app.call(env)
return unless env[:machine].config.cache.enabled?
chmod_bucket_root(env[:machine]) if @opts[:chmod]
configure_cache_buckets(env)
end
def chmod_bucket_root(machine)
machine.communicate.sudo 'mkdir -p /tmp/vagrant-cache'
# https://github.com/fgrehm/vagrant-cachier/issues/107
if ! smb_synced_folder_enabled?(machine)
@logger.info "'chmod'ing bucket root dir to 777..."
machine.communicate.sudo 'chmod 777 /tmp/vagrant-cache'
end
end
def configure_cache_buckets(env)
if env[:machine].config.cache.auto_detect
Bucket.auto_detect(env)
end
return unless env[:machine].config.cache.buckets.any?
env[:ui].info 'Configuring cache buckets...'
cache_config = env[:machine].config.cache
cache_config.buckets.each do |bucket_name, configs|
@logger.info "Installing #{bucket_name} with configs #{configs.inspect}"
Bucket.install(bucket_name, env, configs)
end
data_file = env[:machine].data_dir.join('cache_dirs')
data_file.open('w') { |f| f.print env[:cache_dirs].uniq.join("\n") }
end
def smb_synced_folder_enabled?(machine)
synced_folder_opts = machine.config.cache.synced_folder_opts
synced_folder_opts ||= {}
# If smb was explicitly enabled
if synced_folder_opts[:type] && synced_folder_opts[:type].to_s == 'smb'
return true
elsif machine.provider_name.to_sym == :hyperv
# If the provider in use is hyperv, the default synced folder is 'smb'
# unless specified
return synced_folder_opts[:type] == nil
end
end
end
end
end
end

View file

@ -8,7 +8,7 @@ module VagrantPlugins
def self.auto_detect(env) def self.auto_detect(env)
@buckets.each do |bucket| @buckets.each do |bucket|
if env[:machine].guest.capability?(bucket.capability) if bucket.respond_to?(:capability) && env[:machine].guest.capability?(bucket.capability)
env[:machine].config.cache.enable bucket.bucket_name env[:machine].config.cache.enable bucket.bucket_name
end end
end end
@ -29,6 +29,60 @@ module VagrantPlugins
@env = env @env = env
@configs = configs @configs = configs
end end
def machine
@env[:machine]
end
def guest
machine.guest
end
def comm
machine.communicate
end
# TODO: "merge" symlink and user_symlink methods
def symlink(guest_path, bucket_path = "/tmp/vagrant-cache/#{@name}")
return if @env[:cache_dirs].include?(guest_path)
@env[:cache_dirs] << guest_path
comm.execute("mkdir -p #{bucket_path}")
unless symlink?(guest_path)
comm.sudo("mkdir -p `dirname #{guest_path}`")
if empty_dir?(bucket_path) && !empty_dir?(guest_path)
# Warm up cache with guest machine data
comm.sudo("shopt -s dotglob && mv #{guest_path}/* #{bucket_path}")
end
comm.sudo("rm -rf #{guest_path}")
comm.sudo("ln -s #{bucket_path} #{guest_path}")
end
end
def user_symlink(guest_path)
return if @env[:cache_dirs].include?(guest_path)
@env[:cache_dirs] << guest_path
bucket_path = "/tmp/vagrant-cache/#{@name}"
comm.execute("mkdir -p #{bucket_path}")
unless symlink?(guest_path)
comm.execute("mkdir -p `dirname #{guest_path}`")
if empty_dir?(bucket_path) && !empty_dir?(guest_path)
# Warm up cache with guest machine data
comm.execute("shopt -s dotglob && mv #{guest_path}/* #{bucket_path}")
end
comm.execute("rm -rf #{guest_path}")
comm.execute("ln -s #{bucket_path} #{guest_path}")
end
end
def empty_dir?(path)
not comm.test("test \"$(ls -A #{path} 2>/dev/null)\"")
end
def symlink?(path)
comm.test("test -L #{path}")
end
end end
end end
end end
@ -36,10 +90,16 @@ end
require_relative "bucket/apt" require_relative "bucket/apt"
require_relative "bucket/chef" require_relative "bucket/chef"
require_relative "bucket/gem" require_relative "bucket/gem"
require_relative "bucket/chef_gem"
require_relative "bucket/pacman" require_relative "bucket/pacman"
require_relative "bucket/yum" require_relative "bucket/yum"
require_relative "bucket/dnf"
require_relative "bucket/rvm" require_relative "bucket/rvm"
require_relative "bucket/apt_cacher" require_relative "bucket/apt_cacher"
require_relative "bucket/apt_lists"
require_relative "bucket/composer" require_relative "bucket/composer"
require_relative "bucket/bower"
require_relative "bucket/npm" require_relative "bucket/npm"
require_relative "bucket/zypper" require_relative "bucket/zypper"
require_relative "bucket/generic"
require_relative "bucket/pip"

View file

@ -7,22 +7,13 @@ module VagrantPlugins
end end
def install def install
machine = @env[:machine]
guest = machine.guest
if guest.capability?(:apt_cache_dir) if guest.capability?(:apt_cache_dir)
guest_path = guest.capability(:apt_cache_dir) guest_path = guest.capability(:apt_cache_dir)
@env[:cache_dirs] << guest_path return if @env[:cache_dirs].include?(guest_path)
machine.communicate.tap do |comm| symlink(guest_path)
comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}/partial") comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}/partial")
unless comm.test("test -L #{guest_path}")
comm.sudo("rm -rf #{guest_path}")
comm.sudo("mkdir -p `dirname #{guest_path}`")
comm.sudo("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
end
end
else else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'APT') @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'APT')
end end

View file

@ -9,24 +9,13 @@ module VagrantPlugins
end end
def install def install
machine = @env[:machine]
guest = machine.guest
if guest.capability?(:apt_cacher_dir) if guest.capability?(:apt_cacher_dir)
if guest_path = guest.capability(:apt_cacher_dir) if guest_path = guest.capability(:apt_cacher_dir)
if machine.config.cache.enable_nfs synced_folder_type = (machine.config.cache.synced_folder_opts || {})[:type]
@env[:cache_dirs] << guest_path if synced_folder_type && synced_folder_type.to_sym == :nfs
symlink(guest_path)
machine.communicate.tap do |comm|
comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}")
unless comm.test("test -L #{guest_path}")
comm.sudo("rm -rf #{guest_path}")
comm.sudo("mkdir -p `dirname #{guest_path}`")
comm.sudo("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
end
end
else else
@env[:ui].info I18n.t('vagrant_cachier.nfs_required', bucket: 'apt-cacher') @env[:ui].warn I18n.t('vagrant_cachier.nfs_required', bucket: 'apt-cacher')
end end
end end
else else

View file

@ -0,0 +1,28 @@
module VagrantPlugins
module Cachier
class Bucket
class AptLists < Bucket
def self.capability
:apt_lists_dir
end
def install
# Apt lists bucket can't be used on windows hosts
# https://github.com/fgrehm/vagrant-cachier/issues/106
return if Vagrant::Util::Platform.windows?
if guest.capability?(:apt_lists_dir)
guest_path = guest.capability(:apt_lists_dir)
return if @env[:cache_dirs].include?(guest_path)
symlink(guest_path)
comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}/partial")
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'apt-lists')
end
end
end
end
end
end

View file

@ -0,0 +1,21 @@
module VagrantPlugins
module Cachier
class Bucket
class Bower < Bucket
def self.capability
:bower_path
end
def install
if guest.capability?(:bower_path)
if bower_path = guest.capability(:bower_path)
user_symlink(bower_path)
end
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Bower')
end
end
end
end
end
end

View file

@ -7,22 +7,9 @@ module VagrantPlugins
end end
def install def install
machine = @env[:machine]
guest = machine.guest
if guest.capability?(:chef_file_cache_path) if guest.capability?(:chef_file_cache_path)
guest_path = guest.capability(:chef_file_cache_path) guest_path = guest.capability(:chef_file_cache_path)
symlink(guest_path) if guest_path
@env[:cache_dirs] << guest_path
machine.communicate.tap do |comm|
comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}")
unless comm.test("test -L #{guest_path}")
comm.sudo("rm -rf #{guest_path}")
comm.sudo("mkdir -p `dirname #{guest_path}`")
comm.sudo("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
end
end
else else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Chef') @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Chef')
end end

View file

@ -0,0 +1,25 @@
module VagrantPlugins
module Cachier
class Bucket
class ChefGem < Bucket
def self.capability
:chef_gemdir
end
def install
if guest.capability?(:chef_gemdir)
if gemdir_path = guest.capability(:chef_gemdir)
prefix = gemdir_path.split('/').last
bucket_path = "/tmp/vagrant-cache/#{@name}/#{prefix}"
gem_cache_path = "#{gemdir_path}/cache"
symlink(gem_cache_path, bucket_path)
end
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'ChefRubyGems')
end
end
end
end
end
end

View file

@ -7,22 +7,9 @@ module VagrantPlugins
end end
def install def install
machine = @env[:machine]
guest = machine.guest
if guest.capability?(:composer_path) if guest.capability?(:composer_path)
if composer_path = guest.capability(:composer_path) if composer_path = guest.capability(:composer_path)
bucket_path = "/tmp/vagrant-cache/#{@name}" user_symlink(composer_path)
@env[:cache_dirs] << composer_path
machine.communicate.tap do |comm|
comm.execute("mkdir -p #{bucket_path}")
unless comm.test("test -L #{composer_path}")
comm.sudo("rm -rf #{composer_path}")
comm.sudo("ln -s #{bucket_path} #{composer_path}")
end
end
end end
else else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Composer') @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Composer')

View file

@ -0,0 +1,27 @@
module VagrantPlugins
module Cachier
class Bucket
class Dnf < Bucket
def self.capability
:dnf_cache_dir
end
def install
if guest.capability?(:dnf_cache_dir)
if guest_path = guest.capability(:dnf_cache_dir)
return if @env[:cache_dirs].include?(guest_path)
# Ensure caching is enabled
comm.sudo("sed -i '/keepcache=/d' /etc/dnf/dnf.conf")
comm.sudo("sed -i '/^[main]/a keepcache=1' /etc/dnf/dnf.conf")
symlink(guest_path)
end
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'DNF')
end
end
end
end
end
end

View file

@ -7,26 +7,13 @@ module VagrantPlugins
end end
def install def install
machine = @env[:machine]
guest = machine.guest
if guest.capability?(:gemdir) if guest.capability?(:gemdir)
if gemdir_path = guest.capability(:gemdir) if gemdir_path = guest.capability(:gemdir)
prefix = gemdir_path.split('/').last prefix = gemdir_path.split('/').last
bucket_path = "/tmp/vagrant-cache/#{@name}/#{prefix}" bucket_path = "/tmp/vagrant-cache/#{@name}/#{prefix}"
machine.communicate.tap do |comm| gem_cache_path = "#{gemdir_path}/cache"
comm.execute("mkdir -p #{bucket_path}")
gem_cache_path = "#{gemdir_path}/cache" symlink(gem_cache_path, bucket_path)
@env[:cache_dirs] << gem_cache_path
unless comm.test("test -L #{gem_cache_path}")
comm.sudo("rm -rf #{gem_cache_path}")
comm.sudo("mkdir -p `dirname #{gem_cache_path}`")
comm.sudo("ln -s #{bucket_path} #{gem_cache_path}")
end
end
end end
else else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'RubyGems') @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'RubyGems')

View file

@ -0,0 +1,26 @@
module VagrantPlugins
module Cachier
class Bucket
class Generic < Bucket
def install
# First we normalize the @configs hash as a hash of hashes
if @configs.has_key?(:cache_dir)
@configs = { @name => @configs }
end
# Now we iterate through all generic buckets's configurations and
# set them up.
@configs.each do |key, conf|
if conf.has_key?(:cache_dir)
symlink(conf[:cache_dir], "/tmp/vagrant-cache/#{key}")
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: "Generic[#{key}]")
end
end
end
end
end
end
end

View file

@ -7,22 +7,9 @@ module VagrantPlugins
end end
def install def install
machine = @env[:machine]
guest = machine.guest
if guest.capability?(:npm_cache_dir) if guest.capability?(:npm_cache_dir)
guest_path = guest.capability(:npm_cache_dir) guest_path = guest.capability(:npm_cache_dir)
user_symlink(guest_path) if guest_path
@env[:cache_dirs] << guest_path
machine.communicate.tap do |comm|
comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}")
unless comm.test("test -L #{guest_path}")
comm.execute("rm -rf #{guest_path}")
comm.execute("mkdir -p `dirname #{guest_path}`")
comm.execute("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
end
end
else else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'npm') @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'npm')
end end

View file

@ -7,22 +7,9 @@ module VagrantPlugins
end end
def install def install
machine = @env[:machine]
guest = machine.guest
if guest.capability?(:pacman_cache_dir) if guest.capability?(:pacman_cache_dir)
guest_path = guest.capability(:pacman_cache_dir) guest_path = guest.capability(:pacman_cache_dir)
symlink(guest_path)
@env[:cache_dirs] << guest_path
machine.communicate.tap do |comm|
comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}")
unless comm.test("test -L #{guest_path}")
comm.sudo("rm -rf #{guest_path}")
comm.sudo("mkdir -p `dirname #{guest_path}`")
comm.sudo("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
end
end
else else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Pacman') @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Pacman')
end end

View file

@ -0,0 +1,22 @@
module VagrantPlugins
module Cachier
class Bucket
class Pip < Bucket
def self.capability
:pip_cache_dir
end
def install
if guest.capability?(:pip_cache_dir)
if guest_path = guest.capability(:pip_cache_dir)
symlink("#{guest_path}/http", "/tmp/vagrant-cache/#{@name}/http")
symlink("#{guest_path}/wheels", "/tmp/vagrant-cache/#{@name}/wheels")
end
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'pip')
end
end
end
end
end
end

View file

@ -7,26 +7,13 @@ module VagrantPlugins
end end
def install def install
machine = @env[:machine]
guest = machine.guest
if guest.capability?(:rvm_path) if guest.capability?(:rvm_path)
if rvm_path = guest.capability(:rvm_path) if rvm_path = guest.capability(:rvm_path)
prefix = rvm_path.split('/').last prefix = rvm_path.split('/').last
bucket_path = "/tmp/vagrant-cache/#{@name}/#{prefix}" bucket_path = "/tmp/vagrant-cache/#{@name}/#{prefix}"
machine.communicate.tap do |comm| rvm_cache_path = "#{rvm_path}/archives"
comm.execute("mkdir -p #{bucket_path}")
rvm_cache_path = "#{rvm_path}/archives" symlink(rvm_cache_path, bucket_path)
@env[:cache_dirs] << rvm_cache_path
unless comm.test("test -L #{rvm_cache_path}")
comm.sudo("rm -rf #{rvm_cache_path}")
comm.sudo("mkdir -p `dirname #{rvm_cache_path}`")
comm.sudo("ln -s #{bucket_path} #{rvm_cache_path}")
end
end
end end
else else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'RVM') @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'RVM')

View file

@ -7,24 +7,14 @@ module VagrantPlugins
end end
def install def install
machine = @env[:machine]
guest = machine.guest
if guest.capability?(:yum_cache_dir) if guest.capability?(:yum_cache_dir)
guest_path = guest.capability(:yum_cache_dir) if guest_path = guest.capability(:yum_cache_dir)
return if @env[:cache_dirs].include?(guest_path)
@env[:cache_dirs] << guest_path
machine.communicate.tap do |comm|
# Ensure caching is enabled # Ensure caching is enabled
comm.sudo("sed -i 's/keepcache=0/keepcache=1/g' /etc/yum.conf") comm.sudo("sed -i 's/keepcache=0/keepcache=1/g' /etc/yum.conf")
comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}") symlink(guest_path)
unless comm.test("test -L #{guest_path}")
comm.sudo("rm -rf #{guest_path}")
comm.sudo("mkdir -p `dirname #{guest_path}`")
comm.sudo("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
end
end end
else else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Yum') @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Yum')

View file

@ -7,25 +7,14 @@ module VagrantPlugins
end end
def install def install
machine = @env[:machine]
guest = machine.guest
if guest.capability?(:zypper_cache_dir) if guest.capability?(:zypper_cache_dir)
guest_path = guest.capability(:zypper_cache_dir) guest_path = guest.capability(:zypper_cache_dir)
return if @env[:cache_dirs].include?(guest_path)
@env[:cache_dirs] << guest_path # Ensure caching is enabled
comm.sudo("zypper modifyrepo --keep-packages --all")
machine.communicate.tap do |comm| symlink(guest_path)
# Ensure caching is enabled
comm.sudo("zypper modifyrepo --keep-packages --all")
comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}")
unless comm.test("test -L #{guest_path}")
comm.sudo("rm -rf #{guest_path}")
comm.sudo("mkdir -p `dirname #{guest_path}`")
comm.sudo("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
end
end
else else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Zypper') @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Zypper')
end end

View file

@ -4,7 +4,6 @@ module VagrantPlugins
module Arch module Arch
module PacmanCacheDir module PacmanCacheDir
def self.pacman_cache_dir(machine) def self.pacman_cache_dir(machine)
# TODO: Find out if there is a config file we can read from
'/var/cache/pacman/pkg' '/var/cache/pacman/pkg'
end end
end end

View file

@ -4,7 +4,6 @@ module VagrantPlugins
module Debian module Debian
module AptCacheDir module AptCacheDir
def self.apt_cache_dir(machine) def self.apt_cache_dir(machine)
# TODO: Find out if there is a config file we can read from
'/var/cache/apt/archives' '/var/cache/apt/archives'
end end
end end

View file

@ -0,0 +1,13 @@
module VagrantPlugins
module Cachier
module Cap
module Debian
module AptListsDir
def self.apt_lists_dir(machine)
'/var/lib/apt/lists'
end
end
end
end
end
end

View file

@ -0,0 +1,20 @@
module VagrantPlugins
module Cachier
module Cap
module Linux
module BowerPath
def self.bower_path(machine)
bower_path = nil
machine.communicate.tap do |comm|
return unless comm.test('which bower')
comm.execute 'echo $HOME' do |buffer, output|
bower_path = output.chomp if buffer == :stdout
end
end
return "#{bower_path}/.cache/bower"
end
end
end
end
end
end

View file

@ -5,8 +5,8 @@ module VagrantPlugins
module ChefFileCachePath module ChefFileCachePath
def self.chef_provisioner?(machine) def self.chef_provisioner?(machine)
provisioners = machine.config.vm.provisioners provisioners = machine.config.vm.provisioners
chef_provisioners = [:chef_solo, :chef_client] chef_provisioners = [:chef_solo, :chef_client, :chef_zero]
compat_provisioners = provisioners.keep_if { |p| chef_provisioners.include? p.name } compat_provisioners = provisioners.select { |p| chef_provisioners.include? p.name || p.type }
if compat_provisioners.size > 1 if compat_provisioners.size > 1
raise "One machine is using multiple chef provisioners, which is unsupported." raise "One machine is using multiple chef provisioners, which is unsupported."
@ -19,7 +19,6 @@ module VagrantPlugins
def self.chef_file_cache_path(machine) def self.chef_file_cache_path(machine)
chef_file_cache_path = nil chef_file_cache_path = nil
# TODO: Determine paths rather than using default.
chef_file_cache_path = '/var/chef/cache' if chef_provisioner?(machine) chef_file_cache_path = '/var/chef/cache' if chef_provisioner?(machine)
return chef_file_cache_path return chef_file_cache_path

View file

@ -0,0 +1,20 @@
module VagrantPlugins
module Cachier
module Cap
module Linux
module ChefGemdir
def self.chef_gemdir(machine)
gemdir = nil
machine.communicate.tap do |comm|
return unless comm.test('test -f /opt/chef/embedded/bin/gem')
comm.execute '/opt/chef/embedded/bin/gem env gemdir' do |buffer, output|
gemdir = output.chomp if buffer == :stdout
end
end
return gemdir
end
end
end
end
end
end

View file

@ -7,11 +7,14 @@ module VagrantPlugins
composer_path = nil composer_path = nil
machine.communicate.tap do |comm| machine.communicate.tap do |comm|
return unless comm.test('which php') return unless comm.test('which php')
# on some VMs an extra new line seems to come out, so we loop over
# the output just in case
composer_path = ''
comm.execute 'echo $HOME' do |buffer, output| comm.execute 'echo $HOME' do |buffer, output|
composer_path = output.chomp if buffer == :stdout composer_path += output.chomp if buffer == :stdout
end end
end end
return "#{composer_path}/.composer" return "#{composer_path}/.composer/cache"
end end
end end
end end

View file

@ -0,0 +1,20 @@
module VagrantPlugins
module Cachier
module Cap
module Linux
module PipCacheDir
def self.pip_cache_dir(machine)
pip_cache_dir = nil
machine.communicate.tap do |comm|
return unless comm.test('which pip')
comm.execute 'echo $HOME' do |buffer, output|
pip_cache_dir = output.chomp if buffer == :stdout
end
end
return "#{pip_cache_dir}/.cache/pip"
end
end
end
end
end
end

View file

@ -0,0 +1,18 @@
module VagrantPlugins
module Cachier
module Cap
module RedHat
module DnfCacheDir
def self.dnf_cache_dir(machine)
dnf_cache_dir = nil
machine.communicate.tap do |comm|
return unless comm.test('which dnf')
dnf_cache_dir = '/var/cache/dnf'
end
return dnf_cache_dir
end
end
end
end
end
end

View file

@ -4,8 +4,13 @@ module VagrantPlugins
module RedHat module RedHat
module YumCacheDir module YumCacheDir
def self.yum_cache_dir(machine) def self.yum_cache_dir(machine)
# TODO: Find out if there is a config file we can read from yum_cache_dir = nil
'/var/cache/yum' machine.communicate.tap do |comm|
# In case yum is only forwarding to dnf do not cache
return unless not comm.test('yum --version 2>&1 | grep /usr/bin/dnf')
yum_cache_dir = '/var/cache/yum'
end
return yum_cache_dir
end end
end end
end end

View file

@ -4,7 +4,6 @@ module VagrantPlugins
module SuSE module SuSE
module ZypperCacheDir module ZypperCacheDir
def self.zypper_cache_dir(machine) def self.zypper_cache_dir(machine)
# TODO: Find out if there is a config file we can read from
'/var/cache/zypp/packages' '/var/cache/zypp/packages'
end end
end end

View file

@ -0,0 +1,84 @@
module VagrantPlugins
module Cachier
class Plugin < Vagrant.plugin('2')
guest_capability 'linux', 'gemdir' do
require_relative 'cap/linux/gemdir'
Cap::Linux::Gemdir
end
guest_capability 'linux', 'chef_gemdir' do
require_relative 'cap/linux/chef_gemdir'
Cap::Linux::ChefGemdir
end
guest_capability 'linux', 'rvm_path' do
require_relative 'cap/linux/rvm_path'
Cap::Linux::RvmPath
end
guest_capability 'linux', 'composer_path' do
require_relative 'cap/linux/composer_path'
Cap::Linux::ComposerPath
end
guest_capability 'linux', 'bower_path' do
require_relative 'cap/linux/bower_path'
Cap::Linux::BowerPath
end
guest_capability 'linux', 'chef_file_cache_path' do
require_relative 'cap/linux/chef_file_cache_path'
Cap::Linux::ChefFileCachePath
end
guest_capability 'linux', 'npm_cache_dir' do
require_relative 'cap/linux/npm_cache_dir'
Cap::Linux::NpmCacheDir
end
guest_capability 'linux', 'pip_cache_dir' do
require_relative 'cap/linux/pip_cache_dir'
Cap::Linux::PipCacheDir
end
guest_capability 'debian', 'apt_cache_dir' do
require_relative 'cap/debian/apt_cache_dir'
Cap::Debian::AptCacheDir
end
guest_capability 'debian', 'apt_cacher_dir' do
require_relative 'cap/debian/apt_cacher_dir'
Cap::Debian::AptCacherDir
end
guest_capability 'debian', 'apt_lists_dir' do
require_relative 'cap/debian/apt_lists_dir'
Cap::Debian::AptListsDir
end
guest_capability 'redhat', 'yum_cache_dir' do
require_relative 'cap/redhat/yum_cache_dir'
Cap::RedHat::YumCacheDir
end
guest_capability 'redhat', 'dnf_cache_dir' do
require_relative 'cap/redhat/dnf_cache_dir'
Cap::RedHat::DnfCacheDir
end
guest_capability 'suse', 'yum_cache_dir' do
# Disable Yum on suse guests
end
guest_capability 'arch', 'pacman_cache_dir' do
require_relative 'cap/arch/pacman_cache_dir'
Cap::Arch::PacmanCacheDir
end
guest_capability 'suse', 'zypper_cache_dir' do
require_relative 'cap/suse/zypper_cache_dir'
Cap::SuSE::ZypperCacheDir
end
end
end
end

View file

@ -1,15 +1,16 @@
module VagrantPlugins module VagrantPlugins
module Cachier module Cachier
class Config < Vagrant.plugin(2, :config) class Config < Vagrant.plugin(2, :config)
attr_accessor :scope, :auto_detect, :enable_nfs attr_accessor :scope, :auto_detect, :synced_folder_opts
attr_reader :buckets attr_reader :buckets
ALLOWED_SCOPES = %w( box machine ) ALLOWED_SCOPES = %w( box machine )
def initialize def initialize
@scope = UNSET_VALUE @scope = UNSET_VALUE
@auto_detect = UNSET_VALUE @auto_detect = UNSET_VALUE
@enable_nfs = UNSET_VALUE @synced_folder_opts = UNSET_VALUE
@ui = Vagrant::UI::Colored.new
end end
def enable(bucket, opts = {}) def enable(bucket, opts = {})
@ -19,6 +20,12 @@ module VagrantPlugins
def validate(machine) def validate(machine)
errors = _detected_errors errors = _detected_errors
if enabled? && backed_by_cloud_provider?(machine)
machine.ui.warn(I18n.t('vagrant_cachier.backed_by_cloud_provider',
provider: machine.provider_name))
disable!
end
if enabled? && ! ALLOWED_SCOPES.include?(@scope.to_s) if enabled? && ! ALLOWED_SCOPES.include?(@scope.to_s)
errors << I18n.t('vagrant_cachier.unknown_cache_scope', errors << I18n.t('vagrant_cachier.unknown_cache_scope',
allowed: ALLOWED_SCOPES.inspect, allowed: ALLOWED_SCOPES.inspect,
@ -28,18 +35,28 @@ module VagrantPlugins
{ "vagrant cachier" => errors } { "vagrant cachier" => errors }
end end
def enabled?
return @enabled unless @enabled.nil?
@enabled = @scope != UNSET_VALUE
end
def disable!
@enabled = false
end
def finalize! def finalize!
return unless enabled? return unless enabled?
@scope = :box if @scope == UNSET_VALUE @auto_detect = true if @auto_detect == UNSET_VALUE
@auto_detect = false if @auto_detect == UNSET_VALUE @synced_folder_opts = nil if @synced_folder_opts == UNSET_VALUE
@enable_nfs = false if @enable_nfs == UNSET_VALUE @buckets = @buckets ? @buckets.dup : {}
@buckets = @buckets ? @buckets.dup : {}
end end
def enabled? private
@enabled ||= @auto_detect != UNSET_VALUE ||
@buckets != nil def backed_by_cloud_provider?(machine)
CLOUD_PROVIDERS.include?(machine.provider_name.to_s)
end end
end end
end end

View file

@ -1,9 +0,0 @@
module VagrantPlugins
module Cachier
module Errors
class MultipleProviderSpecificCacheDirsFound < Vagrant::Errors::VagrantError
error_key(:multiple_provider_specific_cache_dirs_found)
end
end
end
end

View file

@ -0,0 +1,27 @@
module VagrantPlugins
module Cachier
class Plugin < Vagrant.plugin('2')
action_hook VagrantPlugins::Cachier::Plugin::ALL_ACTIONS do |hook|
require_relative 'action/configure_bucket_root'
require_relative 'action/install_buckets'
hook.before Vagrant::Action::Builtin::Provision, Action::ConfigureBucketRoot
# This will do the initial buckets installation
hook.after Vagrant::Action::Builtin::Provision, Action::InstallBuckets, chmod: true
end
# This ensure buckets are reconfigured after provisioners runs
action_hook :provisioner_run do |hook|
require_relative 'action/install_buckets'
hook.after :run_provisioner, Action::InstallBuckets
end
clean_action_hook = lambda do |hook|
require_relative 'action/clean'
hook.before Vagrant::Action::Builtin::GracefulHalt, Action::Clean
end
action_hook 'remove-guest-symlinks-on-halt', :machine_action_halt, &clean_action_hook
action_hook 'remove-guest-symlinks-on-package', :machine_action_package, &clean_action_hook
end
end
end

View file

@ -1,6 +1,5 @@
require_relative 'provision_ext' unless Gem::Requirement.new('>= 1.4.0').satisfied_by?(Gem::Version.new(Vagrant::VERSION))
Vagrant::Action::Builtin::Provision.class_eval do raise 'vagrant-cachier requires Vagrant >= 1.4.0 in order to work!'
include VagrantPlugins::Cachier::ProvisionExt
end end
# Add our custom translations to the load path # Add our custom translations to the load path
@ -10,87 +9,19 @@ module VagrantPlugins
module Cachier module Cachier
class Plugin < Vagrant.plugin('2') class Plugin < Vagrant.plugin('2')
name 'vagrant-cachier' name 'vagrant-cachier'
config 'cache' do config 'cache' do
require_relative "config" require_relative "config"
Config Config
end end
guest_capability 'linux', 'gemdir' do
require_relative 'cap/linux/gemdir'
Cap::Linux::Gemdir
end
guest_capability 'linux', 'rvm_path' do
require_relative 'cap/linux/rvm_path'
Cap::Linux::RvmPath
end
guest_capability 'linux', 'composer_path' do
require_relative 'cap/linux/composer_path'
Cap::Linux::ComposerPath
end
guest_capability 'linux', 'chef_file_cache_path' do
require_relative 'cap/linux/chef_file_cache_path'
Cap::Linux::ChefFileCachePath
end
guest_capability 'linux', 'npm_cache_dir' do
require_relative 'cap/linux/npm_cache_dir'
Cap::Linux::NpmCacheDir
end
guest_capability 'debian', 'apt_cache_dir' do
require_relative 'cap/debian/apt_cache_dir'
Cap::Debian::AptCacheDir
end
guest_capability 'debian', 'apt_cacher_dir' do
require_relative 'cap/debian/apt_cacher_dir'
Cap::Debian::AptCacherDir
end
guest_capability 'redhat', 'yum_cache_dir' do
require_relative 'cap/redhat/yum_cache_dir'
Cap::RedHat::YumCacheDir
end
guest_capability 'suse', 'yum_cache_dir' do
# Disable Yum on suse guests
end
guest_capability 'arch', 'pacman_cache_dir' do
require_relative 'cap/arch/pacman_cache_dir'
Cap::Arch::PacmanCacheDir
end
guest_capability 'suse', 'zypper_cache_dir' do
require_relative 'cap/suse/zypper_cache_dir'
Cap::SuSE::ZypperCacheDir
end
# TODO: This should be generic, we don't want to hard code every single
# possible provider action class that Vagrant might have
ensure_single_cache_root = lambda do |hook|
require_relative 'action/ensure_single_cache_root'
hook.before VagrantPlugins::ProviderVirtualBox::Action::Boot, Action::EnsureSingleCacheRoot
if defined?(Vagrant::LXC)
# TODO: Require just the boot action file once its "require dependencies" are sorted out
require 'vagrant-lxc/action'
hook.before Vagrant::LXC::Action::Boot, Action::EnsureSingleCacheRoot
end
end
action_hook 'ensure-single-cache-root-exists-on-up', :machine_action_up, &ensure_single_cache_root
action_hook 'ensure-single-cache-root-exists-on-reload', :machine_action_reload, &ensure_single_cache_root
clean_action_hook = lambda do |hook|
require_relative 'action/clean'
hook.before Vagrant::Action::Builtin::GracefulHalt, Action::Clean
end
action_hook 'remove-guest-symlinks-on-halt', :machine_action_halt, &clean_action_hook
action_hook 'remove-guest-symlinks-on-package', :machine_action_package, &clean_action_hook
end end
# Keep an eye on https://github.com/mitchellh/vagrant/wiki/Available-Vagrant-Plugins#wiki-providers
# for more.
CLOUD_PROVIDERS = %w( aws cloudstack digitalocean hp joyent openstack rackspace
softlayer proxmox managed azure brightbox cloudstack vcloud
vsphere )
end end
end end
require_relative "hooks"
require_relative "capabilities"

View file

@ -1,74 +0,0 @@
require_relative 'bucket'
module VagrantPlugins
module Cachier
module ProvisionExt
def self.included(base)
base.class_eval do
def cachier_debug(msg)
@logger.debug "[CACHIER] #{msg}"
end
alias :old_call :call
def call(env)
@env = env
return old_call(env) unless env[:machine].config.cache.enabled?
FileUtils.mkdir_p(cache_root.to_s) unless cache_root.exist?
synced_folder_opts = {id: "vagrant-cache"}
if env[:machine].config.cache.enable_nfs
# REFACTOR: Drop the `nfs: true` argument once we drop support for Vagrant < 1.4
synced_folder_opts.merge!({ nfs: true, type: 'nfs' })
end
env[:machine].config.vm.synced_folder cache_root, '/tmp/vagrant-cache', synced_folder_opts
env[:cache_dirs] = []
old_call(env)
configure_cache_buckets
end
alias :old_run_provisioner :run_provisioner
def run_provisioner(*args)
configure_cache_buckets
old_run_provisioner(*args)
end
def configure_cache_buckets
return unless @env[:machine].config.cache.enabled?
if @env[:machine].config.cache.auto_detect
Bucket.auto_detect(@env)
end
return unless @env[:machine].config.cache.buckets.any?
@env[:ui].info 'Configuring cache buckets...'
cache_config = @env[:machine].config.cache
cache_config.buckets.each do |bucket_name, configs|
cachier_debug "Installing #{bucket_name} with configs #{configs.inspect}"
Bucket.install(bucket_name, @env, configs)
end
data_file = @env[:machine].data_dir.join('cache_dirs')
data_file.open('w') { |f| f.print @env[:cache_dirs].uniq.join("\n") }
end
def cache_root
@cache_root ||= case @env[:machine].config.cache.scope.to_sym
when :box
@env[:home_path].join('cache', @env[:machine].box.name)
when :machine
@env[:machine].data_dir.parent.join('cache')
else
raise "Unknown cache scope: '#{@env[:machine].config.cache.scope}'"
end
end
end
end
end
end
end

View file

@ -1,5 +1,5 @@
module VagrantPlugins module VagrantPlugins
module Cachier module Cachier
VERSION = "0.5.1" VERSION = "1.2.1"
end end
end end

View file

@ -8,18 +8,9 @@ en:
Unknown cache scope '%{cache_scope}' (allowed scopes: %{allowed}) Unknown cache scope '%{cache_scope}' (allowed scopes: %{allowed})
nfs_required: |- nfs_required: |-
The '%{bucket}' cache bucket requires NFS to be enabled, please add The '%{bucket}' cache bucket requires NFS to be enabled, please add
`config.cache.enable_nfs = true` to your Vagrantfile. `config.cache.synced_folder_opts = {type: :nfs}` to your Vagrantfile.
will_fix_machine_cache_dir: |-
A vagrant-cachier provider specific cache dir was found under
'%{current_path}' and it will be moved to
'%{new_path}' as it is the new path for keeping machine
scoped cache dirs starting with the 0.3.0 version of the plugin.
unable_to_ssh: |- unable_to_ssh: |-
vagrant-cachier was unable to SSH into the VM to remove symlinks! vagrant-cachier was unable to SSH into the VM to remove symlinks!
vagrant: backed_by_cloud_provider: |-
errors: The machine is backed by a cloud provider (%{provider}), caching
multiple_provider_specific_cache_dirs_found: |- will be disabled.
There are multiple provider specific cache dirs for the '%{machine}' machine:
%{dirs}
Please move one of them up to `%{machine_path}/cache` and remove the others
before bringing the machine up again.

View file

@ -1,10 +1,14 @@
Vagrant.require_plugin 'vagrant-cachier'
Vagrant.require_plugin 'vagrant-lxc'
Vagrant.configure("2") do |config| Vagrant.configure("2") do |config|
config.vm.provider :virtualbox do |_, override|
override.vm.box = "chef/ubuntu-14.04"
end
config.vm.provider :lxc do |_, override|
override.vm.box = "fgrehm/trusty64-lxc"
end
config.cache.auto_detect = true config.cache.auto_detect = true
config.cache.scope = :machine config.cache.scope = :machine
config.vm.box = 'precise64'
config.vm.box_url = 'http://files.vagrantup.com/precise64.box'
config.vm.provision :shell, inline: 'apt-get update && apt-get install -y git' config.vm.provision :shell, inline: 'apt-get update && apt-get install -y git'
end end

View file

@ -1,8 +1,12 @@
Vagrant.require_plugin 'vagrant-cachier'
Vagrant.require_plugin 'vagrant-lxc'
Vagrant.configure("2") do |config| Vagrant.configure("2") do |config|
config.vm.provider :virtualbox do |_, override|
override.vm.box = "chef/ubuntu-14.04"
end
config.vm.provider :lxc do |_, override|
override.vm.box = "fgrehm/trusty64-lxc"
end
config.cache.auto_detect = true config.cache.auto_detect = true
config.vm.box = 'precise64'
config.vm.box_url = 'http://files.vagrantup.com/precise64.box'
config.vm.provision :shell, inline: 'echo Hello!' config.vm.provision :shell, inline: 'echo Hello!'
end end

View file

@ -1,6 +1,8 @@
Vagrant.require_plugin 'vagrant-cachier'
Vagrant.require_plugin 'vagrant-lxc'
Vagrant.configure("2") do |config| Vagrant.configure("2") do |config|
config.vm.box = 'precise64' config.vm.provider :virtualbox do |_, override|
config.vm.box_url = 'http://files.vagrantup.com/precise64.box' override.vm.box = "chef/ubuntu-14.04"
end
config.vm.provider :lxc do |_, override|
override.vm.box = "fgrehm/trusty64-lxc"
end
end end

View file

@ -1,7 +1,10 @@
Vagrant.require_plugin 'vagrant-cachier'
Vagrant.require_plugin 'vagrant-lxc'
Vagrant.configure("2") do |config| Vagrant.configure("2") do |config|
config.vm.box = 'precise64' config.vm.provider :virtualbox do |_, override|
config.vm.box_url = 'http://files.vagrantup.com/precise64.box' override.vm.box = "chef/ubuntu-14.04"
end
config.vm.provider :lxc do |_, override|
override.vm.box = "fgrehm/trusty64-lxc"
end
config.vm.provision :shell, inline: 'echo Hello!' config.vm.provision :shell, inline: 'echo Hello!'
end end

View file

@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
spec.version = VagrantPlugins::Cachier::VERSION spec.version = VagrantPlugins::Cachier::VERSION
spec.authors = ["Fabio Rehm"] spec.authors = ["Fabio Rehm"]
spec.email = ["fgrehm@gmail.com"] spec.email = ["fgrehm@gmail.com"]
spec.description = %q{Speed up vagrant boxes provisioning} spec.description = %q{Caffeine reducer}
spec.summary = spec.description spec.summary = spec.description
spec.homepage = "https://github.com/fgrehm/vagrant-cachier" spec.homepage = "https://github.com/fgrehm/vagrant-cachier"
spec.license = "MIT" spec.license = "MIT"