vagrant-cachier 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +19 -0
- data/Gemfile +5 -2
- data/Gemfile.lock +70 -10
- data/README.md +20 -11
- data/development/Cheffile +6 -0
- data/development/Cheffile.lock +12 -0
- data/development/Vagrantfile +15 -0
- data/lib/vagrant-cachier/action/clean.rb +39 -0
- data/lib/vagrant-cachier/action/ensure_single_cache_root.rb +63 -0
- data/lib/vagrant-cachier/bucket.rb +1 -0
- data/lib/vagrant-cachier/bucket/apt.rb +1 -2
- data/lib/vagrant-cachier/bucket/chef.rb +33 -0
- data/lib/vagrant-cachier/bucket/gem.rb +1 -2
- data/lib/vagrant-cachier/bucket/pacman.rb +1 -2
- data/lib/vagrant-cachier/bucket/rvm.rb +1 -2
- data/lib/vagrant-cachier/bucket/yum.rb +1 -2
- data/lib/vagrant-cachier/cap/linux/chef_file_cache_path.rb +31 -0
- data/lib/vagrant-cachier/config.rb +14 -0
- data/lib/vagrant-cachier/errors.rb +9 -0
- data/lib/vagrant-cachier/plugin.rb +30 -9
- data/lib/vagrant-cachier/provision_ext.rb +68 -0
- data/lib/vagrant-cachier/version.rb +1 -1
- data/locales/en.yml +20 -0
- metadata +11 -3
- data/lib/vagrant-cachier/action.rb +0 -90
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d005d0ebd01b54b6648f88f5c3f1a5f103147f1
|
4
|
+
data.tar.gz: 40b706c52c2111de471c191c2a16aff8cfa7f2ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2bdb5ddeb225925825c14cc82e79fb21864ca9b969ce0689d98e6cd21196d920ab31f88568bbdc7c5dc07613f036baf751d6809760cc1dc9eb1cd6f5d9ac86d
|
7
|
+
data.tar.gz: b00798e93230d7f3c2ddd364d3d584575e68ded7ebe0b47ede21ac9ebc11fb7ecd9f25b665acc8ed26111b4ecef7d3983658949153d3edd40d79220c0054b7f0
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
## [0.3.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.2.0...v0.3.0) (Aug 5, 2013)
|
2
|
+
|
3
|
+
BACKWARDS INCOMPATIBILITIES:
|
4
|
+
|
5
|
+
- Machine scoped cache dirs are now kept on `.vagrant/machines/MACHINE/cache`
|
6
|
+
to allow downloaded packages to be reused between providers. If a single cache
|
7
|
+
directory exists, the plugin will automatically move it to the right place,
|
8
|
+
if multiple directories are found, it will halt execution and will error out,
|
9
|
+
letting the user know what has to be done in order to fix things.
|
10
|
+
|
11
|
+
FEATURES:
|
12
|
+
|
13
|
+
- Add `file_cache_path` support for Chef. [GH-14]
|
14
|
+
- Reconfigure buckets before each provisioner. [GH-26] / [GH-32]
|
15
|
+
|
16
|
+
IMPROVEMENTS:
|
17
|
+
|
18
|
+
- Don't error out if a bucket is configured for a non-capable guest. [GH-27]
|
19
|
+
|
1
20
|
## [0.2.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.1.0...v0.2.0) (July 10, 2013)
|
2
21
|
|
3
22
|
FEATURES:
|
data/Gemfile
CHANGED
@@ -4,7 +4,10 @@ source 'https://rubygems.org'
|
|
4
4
|
gemspec
|
5
5
|
|
6
6
|
group :development do
|
7
|
-
gem 'vagrant',
|
8
|
-
gem 'vagrant-lxc',
|
7
|
+
gem 'vagrant', github: 'mitchellh/vagrant'
|
8
|
+
gem 'vagrant-lxc', github: 'fgrehm/vagrant-lxc'
|
9
|
+
gem 'vagrant-pristine', github: 'fgrehm/vagrant-pristine'
|
10
|
+
gem 'vagrant-librarian-chef'
|
11
|
+
gem 'vagrant-omnibus'
|
9
12
|
gem 'rake'
|
10
13
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,18 +1,23 @@
|
|
1
1
|
GIT
|
2
2
|
remote: git://github.com/fgrehm/vagrant-lxc.git
|
3
|
-
revision:
|
3
|
+
revision: 5ae82681cdedaf2a6f778e005dd65014fc7c2cec
|
4
4
|
specs:
|
5
|
-
vagrant-lxc (0.
|
5
|
+
vagrant-lxc (0.5.1.dev)
|
6
|
+
|
7
|
+
GIT
|
8
|
+
remote: git://github.com/fgrehm/vagrant-pristine.git
|
9
|
+
revision: 5c400d7850fc5f98d9601b59f4c3bd74818650de
|
10
|
+
specs:
|
11
|
+
vagrant-pristine (0.2.0)
|
6
12
|
|
7
13
|
GIT
|
8
14
|
remote: git://github.com/mitchellh/vagrant.git
|
9
|
-
revision:
|
15
|
+
revision: 16002d03c07f842a23497543129fa99f40f2bbc0
|
10
16
|
specs:
|
11
|
-
vagrant (1.2.
|
17
|
+
vagrant (1.2.8.dev)
|
12
18
|
childprocess (~> 0.3.7)
|
13
19
|
erubis (~> 2.7.0)
|
14
20
|
i18n (~> 0.6.0)
|
15
|
-
json (>= 1.5.1, < 1.8.0)
|
16
21
|
log4r (~> 1.1.9)
|
17
22
|
net-scp (~> 1.1.0)
|
18
23
|
net-ssh (~> 2.6.6)
|
@@ -20,22 +25,74 @@ GIT
|
|
20
25
|
PATH
|
21
26
|
remote: .
|
22
27
|
specs:
|
23
|
-
vagrant-cachier (0.
|
28
|
+
vagrant-cachier (0.3.0)
|
24
29
|
|
25
30
|
GEM
|
26
31
|
remote: https://rubygems.org/
|
27
32
|
specs:
|
33
|
+
archive-tar-minitar (0.5.2)
|
34
|
+
chef (11.6.0)
|
35
|
+
erubis
|
36
|
+
highline (>= 1.6.9)
|
37
|
+
json (>= 1.4.4, <= 1.7.7)
|
38
|
+
mixlib-authentication (>= 1.3.0)
|
39
|
+
mixlib-cli (~> 1.3.0)
|
40
|
+
mixlib-config (>= 1.1.2)
|
41
|
+
mixlib-log (>= 1.3.0)
|
42
|
+
mixlib-shellout
|
43
|
+
net-ssh (~> 2.6)
|
44
|
+
net-ssh-multi (~> 1.1.0)
|
45
|
+
ohai (>= 0.6.0)
|
46
|
+
rest-client (>= 1.0.4, < 1.7.0)
|
47
|
+
yajl-ruby (~> 1.1)
|
28
48
|
childprocess (0.3.9)
|
29
49
|
ffi (~> 1.0, >= 1.0.11)
|
30
50
|
erubis (2.7.0)
|
31
|
-
ffi (1.
|
51
|
+
ffi (1.9.0)
|
52
|
+
highline (1.6.19)
|
32
53
|
i18n (0.6.4)
|
54
|
+
ipaddress (0.8.0)
|
33
55
|
json (1.7.7)
|
56
|
+
librarian (0.1.0)
|
57
|
+
highline
|
58
|
+
thor (~> 0.15)
|
59
|
+
librarian-chef (0.0.1)
|
60
|
+
archive-tar-minitar (>= 0.5.2)
|
61
|
+
chef (>= 0.10)
|
62
|
+
librarian (~> 0.1.0)
|
34
63
|
log4r (1.1.10)
|
35
|
-
|
64
|
+
mime-types (1.23)
|
65
|
+
mixlib-authentication (1.3.0)
|
66
|
+
mixlib-log
|
67
|
+
mixlib-cli (1.3.0)
|
68
|
+
mixlib-config (1.1.2)
|
69
|
+
mixlib-log (1.6.0)
|
70
|
+
mixlib-shellout (1.2.0)
|
71
|
+
net-scp (1.1.2)
|
72
|
+
net-ssh (>= 2.6.5)
|
73
|
+
net-ssh (2.6.8)
|
74
|
+
net-ssh-gateway (1.2.0)
|
36
75
|
net-ssh (>= 2.6.5)
|
37
|
-
net-ssh (
|
38
|
-
|
76
|
+
net-ssh-multi (1.1)
|
77
|
+
net-ssh (>= 2.1.4)
|
78
|
+
net-ssh-gateway (>= 0.99.0)
|
79
|
+
ohai (6.18.0)
|
80
|
+
ipaddress
|
81
|
+
mixlib-cli
|
82
|
+
mixlib-config
|
83
|
+
mixlib-log
|
84
|
+
mixlib-shellout
|
85
|
+
systemu
|
86
|
+
yajl-ruby
|
87
|
+
rake (10.1.0)
|
88
|
+
rest-client (1.6.7)
|
89
|
+
mime-types (>= 1.16)
|
90
|
+
systemu (2.5.2)
|
91
|
+
thor (0.18.1)
|
92
|
+
vagrant-librarian-chef (0.1.2)
|
93
|
+
librarian-chef
|
94
|
+
vagrant-omnibus (1.1.0)
|
95
|
+
yajl-ruby (1.1.0)
|
39
96
|
|
40
97
|
PLATFORMS
|
41
98
|
ruby
|
@@ -44,4 +101,7 @@ DEPENDENCIES
|
|
44
101
|
rake
|
45
102
|
vagrant!
|
46
103
|
vagrant-cachier!
|
104
|
+
vagrant-librarian-chef
|
47
105
|
vagrant-lxc!
|
106
|
+
vagrant-omnibus
|
107
|
+
vagrant-pristine!
|
data/README.md
CHANGED
@@ -36,10 +36,8 @@ For more information about available buckets, please see the [configuration sect
|
|
36
36
|
|
37
37
|
* Vagrant's built in VirtualBox provider
|
38
38
|
* [vagrant-lxc](https://github.com/fgrehm/vagrant-lxc)
|
39
|
-
|
40
|
-
|
41
|
-
as well but I haven't tried yet._
|
42
|
-
|
39
|
+
* [VMware providers](http://www.vagrantup.com/vmware) with NFS enabled (See
|
40
|
+
[GH-24](https://github.com/fgrehm/vagrant-cachier/issues/24) for more info)
|
43
41
|
|
44
42
|
## How does it work?
|
45
43
|
|
@@ -48,12 +46,12 @@ configure things properly from your `Vagrantfile`. Please have a look at
|
|
48
46
|
the [available cache buckets](#available-cache-buckets) section below for more
|
49
47
|
information.
|
50
48
|
|
51
|
-
Under the hood, the plugin will
|
52
|
-
|
53
|
-
|
54
|
-
to set things up by hooking into calls to
|
55
|
-
that you can repackage the machine for others
|
56
|
-
install the plugin as well.
|
49
|
+
Under the hood, the plugin will monkey patch `Vagrant::Builtin::Provision` and
|
50
|
+
will set things up for each configured cache bucket before running each defined
|
51
|
+
provisioner and after all provisioners are done. Before halting the machine,
|
52
|
+
it will revert the changes required to set things up by hooking into calls to
|
53
|
+
`Vagrant::Builtin::GracefulHalt` so that you can repackage the machine for others
|
54
|
+
to use without requiring users to install the plugin as well.
|
57
55
|
|
58
56
|
Cache buckets will be available from `/tmp/vagrant-cachier` on your guest and
|
59
57
|
the appropriate folders will get symlinked to the right path _after_ the machine is
|
@@ -168,6 +166,18 @@ end
|
|
168
166
|
|
169
167
|
Used by Arch Linux, will get configured under guest's `/var/cache/pacman/pkg`.
|
170
168
|
|
169
|
+
#### Chef
|
170
|
+
|
171
|
+
```ruby
|
172
|
+
Vagrant.configure("2") do |config|
|
173
|
+
config.vm.box = 'some-box-using-chef-provisioner'
|
174
|
+
config.cache.enable :chef
|
175
|
+
end
|
176
|
+
```
|
177
|
+
|
178
|
+
When a Chef provisioner is detected, this bucket caches the default
|
179
|
+
`file_cache_path` directory, `/var/chef/cache`. Requires Vagrant 1.2.4+.
|
180
|
+
|
171
181
|
#### RubyGems
|
172
182
|
|
173
183
|
```ruby
|
@@ -183,7 +193,6 @@ folder under the result of running `gem env gemdir` as the default SSH user (usu
|
|
183
193
|
it is already installed before enabling the bucket, otherwise you won't benefit
|
184
194
|
from this plugin.
|
185
195
|
|
186
|
-
|
187
196
|
#### RVM
|
188
197
|
|
189
198
|
```ruby
|
data/development/Vagrantfile
CHANGED
@@ -2,7 +2,10 @@
|
|
2
2
|
# vi: set ft=ruby :
|
3
3
|
|
4
4
|
Vagrant.require_plugin 'vagrant-cachier'
|
5
|
+
Vagrant.require_plugin 'vagrant-librarian-chef'
|
5
6
|
Vagrant.require_plugin 'vagrant-lxc'
|
7
|
+
Vagrant.require_plugin 'vagrant-omnibus'
|
8
|
+
Vagrant.require_plugin 'vagrant-pristine'
|
6
9
|
|
7
10
|
Vagrant.configure("2") do |config|
|
8
11
|
config.vm.synced_folder "../", "/vagrant", id: 'vagrant-root'#, nfs: true
|
@@ -15,6 +18,18 @@ Vagrant.configure("2") do |config|
|
|
15
18
|
vb.vm.network :private_network, ip: "192.168.50.123"
|
16
19
|
end
|
17
20
|
|
21
|
+
config.omnibus.chef_version = :latest
|
22
|
+
config.vm.provision :chef_solo do |chef|
|
23
|
+
chef.add_recipe "java::oracle"
|
24
|
+
chef.json = {
|
25
|
+
:java => {
|
26
|
+
:oracle => {
|
27
|
+
:accept_oracle_download_terms => true
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
18
33
|
debian_like_configs = lambda do |debian|
|
19
34
|
debian.vm.provision :shell, inline: '
|
20
35
|
if ! (which bundle > /dev/null); then
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Cachier
|
3
|
+
class Action
|
4
|
+
class Clean
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
@logger = Log4r::Logger.new("vagrant::cachier::action::clean")
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
@env = env
|
12
|
+
|
13
|
+
if env[:machine].state.id == :running && symlinks.any?
|
14
|
+
env[:ui].info I18n.t('vagrant_cachier.cleanup')
|
15
|
+
symlinks.each do |symlink|
|
16
|
+
remove_symlink symlink
|
17
|
+
end
|
18
|
+
|
19
|
+
File.delete env[:machine].data_dir.join('cache_dirs').to_s
|
20
|
+
end
|
21
|
+
|
22
|
+
@app.call env
|
23
|
+
end
|
24
|
+
|
25
|
+
def symlinks
|
26
|
+
# TODO: Check if file exists instead of a blank rescue
|
27
|
+
@symlinks ||= @env[:machine].data_dir.join('cache_dirs').read.split rescue []
|
28
|
+
end
|
29
|
+
|
30
|
+
def remove_symlink(symlink)
|
31
|
+
if @env[:machine].communicate.test("test -L #{symlink}")
|
32
|
+
@logger.debug "Removing symlink for '#{symlink}'"
|
33
|
+
@env[:machine].communicate.sudo("unlink #{symlink}")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require_relative '../errors'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Cachier
|
5
|
+
class Action
|
6
|
+
class EnsureSingleCacheRoot
|
7
|
+
def initialize(app, env)
|
8
|
+
@app = app
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
@env = env
|
13
|
+
|
14
|
+
# If the cache is scoped to boxes or the existing cache dirs are not
|
15
|
+
# provider specific, there's nothing we need to do
|
16
|
+
if cache_scoped_to_machine? && provider_specific_cache_dirs.any?
|
17
|
+
ensure_single_cache_root_exists!
|
18
|
+
end
|
19
|
+
|
20
|
+
@app.call(env)
|
21
|
+
end
|
22
|
+
|
23
|
+
def cache_scoped_to_machine?
|
24
|
+
@env[:machine].config.cache.scope.to_sym == :machine
|
25
|
+
end
|
26
|
+
|
27
|
+
def ensure_single_cache_root_exists!
|
28
|
+
if provider_specific_cache_dirs.size > 1
|
29
|
+
cache_dirs = provider_specific_cache_dirs.map do |dir|
|
30
|
+
" - #{dir.to_s.gsub(/^#{@env[:root_path]}\//, '')}"
|
31
|
+
end
|
32
|
+
machine_path = @env[:machine].data_dir.parent.to_s.gsub(/^#{@env[:root_path]}\//, '')
|
33
|
+
raise Cachier::Errors::MultipleProviderSpecificCacheDirsFound,
|
34
|
+
machine: @env[:machine].name,
|
35
|
+
machine_path: machine_path,
|
36
|
+
dirs: cache_dirs.join("\n")
|
37
|
+
else
|
38
|
+
current_path = provider_specific_cache_dirs.first.to_s.gsub(/^#{@env[:root_path]}\//, '')
|
39
|
+
new_path = @env[:machine].data_dir.parent.join('cache')
|
40
|
+
FileUtils.rm_rf new_path.to_s if new_path.directory?
|
41
|
+
|
42
|
+
new_path = new_path.to_s.gsub(/^#{@env[:root_path]}\//, '')
|
43
|
+
# If we got here there is a single provider specific cacher dir, so
|
44
|
+
# let's be nice with users and just fix it ;)
|
45
|
+
@env[:ui].warn I18n.t('vagrant_cachier.will_fix_machine_cache_dir',
|
46
|
+
current_path: current_path,
|
47
|
+
new_path: new_path)
|
48
|
+
FileUtils.mv current_path, new_path
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def provider_specific_cache_dirs
|
53
|
+
return @provider_specific_cache_dirs if @provider_specific_cache_dirs
|
54
|
+
|
55
|
+
# By default data_dir points to ./.vagrant/machines/<NAME>/<PROVIDER>,
|
56
|
+
# so we go one directory up
|
57
|
+
machine_dir = @env[:machine].data_dir.parent
|
58
|
+
@provider_specific_cache_dirs = Pathname.glob(machine_dir.join('*/cache'))
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -24,8 +24,7 @@ module VagrantPlugins
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
else
|
27
|
-
|
28
|
-
raise "You've configured an APT cache for a guest machine that does not support it!"
|
27
|
+
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'APT')
|
29
28
|
end
|
30
29
|
end
|
31
30
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Cachier
|
3
|
+
class Bucket
|
4
|
+
class Chef < Bucket
|
5
|
+
def self.capability
|
6
|
+
:chef_file_cache_path
|
7
|
+
end
|
8
|
+
|
9
|
+
def install
|
10
|
+
machine = @env[:machine]
|
11
|
+
guest = machine.guest
|
12
|
+
|
13
|
+
if guest.capability?(:chef_file_cache_path)
|
14
|
+
guest_path = guest.capability(:chef_file_cache_path)
|
15
|
+
|
16
|
+
@env[:cache_dirs] << guest_path
|
17
|
+
|
18
|
+
machine.communicate.tap do |comm|
|
19
|
+
comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}")
|
20
|
+
unless comm.test("test -L #{guest_path}")
|
21
|
+
comm.sudo("rm -rf #{guest_path}")
|
22
|
+
comm.sudo("mkdir -p `dirname #{guest_path}`")
|
23
|
+
comm.sudo("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
else
|
27
|
+
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Chef')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -29,8 +29,7 @@ module VagrantPlugins
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
else
|
32
|
-
|
33
|
-
raise "You've configured a RubyGems cache for a guest machine that does not support it!"
|
32
|
+
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'RubyGems')
|
34
33
|
end
|
35
34
|
end
|
36
35
|
end
|
@@ -24,8 +24,7 @@ module VagrantPlugins
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
else
|
27
|
-
|
28
|
-
raise "You've configured a Pacman cache for a guest machine that does not support it!"
|
27
|
+
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Pacman')
|
29
28
|
end
|
30
29
|
end
|
31
30
|
end
|
@@ -29,8 +29,7 @@ module VagrantPlugins
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
else
|
32
|
-
|
33
|
-
raise "You've configured a RVM cache for a guest machine that does not support it!"
|
32
|
+
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'RVM')
|
34
33
|
end
|
35
34
|
end
|
36
35
|
end
|
@@ -27,8 +27,7 @@ module VagrantPlugins
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
else
|
30
|
-
|
31
|
-
raise "You've configured a Yum cache for a guest machine that does not support it!"
|
30
|
+
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Yum')
|
32
31
|
end
|
33
32
|
end
|
34
33
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Cachier
|
3
|
+
module Cap
|
4
|
+
module Linux
|
5
|
+
module ChefFileCachePath
|
6
|
+
def self.chef_provisioner?(machine)
|
7
|
+
provisioners = machine.config.vm.provisioners
|
8
|
+
chef_provisioners = [:chef_solo, :chef_client]
|
9
|
+
compat_provisioners = provisioners.keep_if { |p| chef_provisioners.include? p.name }
|
10
|
+
|
11
|
+
if compat_provisioners.size > 1
|
12
|
+
raise "One machine is using multiple chef provisioners, which is unsupported."
|
13
|
+
end
|
14
|
+
|
15
|
+
using_chef = compat_provisioners.empty? ? false : true
|
16
|
+
|
17
|
+
using_chef
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.chef_file_cache_path(machine)
|
21
|
+
chef_file_cache_path = nil
|
22
|
+
# TODO: Determine paths rather than using default.
|
23
|
+
chef_file_cache_path = '/var/chef/cache' if chef_provisioner?(machine)
|
24
|
+
|
25
|
+
return chef_file_cache_path
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -4,6 +4,8 @@ module VagrantPlugins
|
|
4
4
|
attr_accessor :scope, :auto_detect, :enable_nfs
|
5
5
|
attr_reader :buckets
|
6
6
|
|
7
|
+
ALLOWED_SCOPES = %w( box machine )
|
8
|
+
|
7
9
|
def initialize
|
8
10
|
@scope = UNSET_VALUE
|
9
11
|
@auto_detect = UNSET_VALUE
|
@@ -14,6 +16,18 @@ module VagrantPlugins
|
|
14
16
|
(@buckets ||= {})[bucket] = opts
|
15
17
|
end
|
16
18
|
|
19
|
+
def validate(machine)
|
20
|
+
errors = _detected_errors
|
21
|
+
|
22
|
+
if enabled? && ! ALLOWED_SCOPES.include?(@scope.to_s)
|
23
|
+
errors << I18n.t('vagrant_cachier.unknown_cache_scope',
|
24
|
+
allowed: ALLOWED_SCOPES.inspect,
|
25
|
+
cache_scope: @scope)
|
26
|
+
end
|
27
|
+
|
28
|
+
{ "vagrant cachier" => errors }
|
29
|
+
end
|
30
|
+
|
17
31
|
def finalize!
|
18
32
|
return unless enabled?
|
19
33
|
|
@@ -1,3 +1,11 @@
|
|
1
|
+
require_relative 'provision_ext'
|
2
|
+
Vagrant::Action::Builtin::Provision.class_eval do
|
3
|
+
include VagrantPlugins::Cachier::ProvisionExt
|
4
|
+
end
|
5
|
+
|
6
|
+
# Add our custom translations to the load path
|
7
|
+
I18n.load_path << File.expand_path("../../../locales/en.yml", __FILE__)
|
8
|
+
|
1
9
|
module VagrantPlugins
|
2
10
|
module Cachier
|
3
11
|
class Plugin < Vagrant.plugin('2')
|
@@ -18,6 +26,11 @@ module VagrantPlugins
|
|
18
26
|
Cap::Linux::RvmPath
|
19
27
|
end
|
20
28
|
|
29
|
+
guest_capability 'linux', 'chef_file_cache_path' do
|
30
|
+
require_relative 'cap/linux/chef_file_cache_path'
|
31
|
+
Cap::Linux::ChefFileCachePath
|
32
|
+
end
|
33
|
+
|
21
34
|
guest_capability 'debian', 'apt_cache_dir' do
|
22
35
|
require_relative 'cap/debian/apt_cache_dir'
|
23
36
|
Cap::Debian::AptCacheDir
|
@@ -33,19 +46,27 @@ module VagrantPlugins
|
|
33
46
|
Cap::Arch::PacmanCacheDir
|
34
47
|
end
|
35
48
|
|
36
|
-
|
37
|
-
|
38
|
-
|
49
|
+
# TODO: This should be generic, we don't want to hard code every single
|
50
|
+
# possible provider action class that Vagrant might have
|
51
|
+
ensure_single_cache_root = lambda do |hook|
|
52
|
+
require_relative 'action/ensure_single_cache_root'
|
53
|
+
hook.before VagrantPlugins::ProviderVirtualBox::Action::Boot, Action::EnsureSingleCacheRoot
|
54
|
+
|
55
|
+
if defined?(Vagrant::LXC)
|
56
|
+
# TODO: Require just the boot action file once its "require dependencies" are sorted out
|
57
|
+
require 'vagrant-lxc/action'
|
58
|
+
hook.before Vagrant::LXC::Action::Boot, Action::EnsureSingleCacheRoot
|
59
|
+
end
|
39
60
|
end
|
40
|
-
action_hook '
|
41
|
-
action_hook '
|
61
|
+
action_hook 'ensure-single-cache-root-exists-on-up', :machine_action_up, &ensure_single_cache_root
|
62
|
+
action_hook 'ensure-single-cache-root-exists-on-reload', :machine_action_reload, &ensure_single_cache_root
|
42
63
|
|
43
64
|
clean_action_hook = lambda do |hook|
|
44
|
-
require_relative 'action'
|
45
|
-
hook.before Vagrant::Action::Builtin::GracefulHalt,
|
65
|
+
require_relative 'action/clean'
|
66
|
+
hook.before Vagrant::Action::Builtin::GracefulHalt, Action::Clean
|
46
67
|
end
|
47
|
-
action_hook 'remove-guest-symlinks-on-
|
48
|
-
action_hook 'remove-guest-symlinks-on-
|
68
|
+
action_hook 'remove-guest-symlinks-on-halt', :machine_action_halt, &clean_action_hook
|
69
|
+
action_hook 'remove-guest-symlinks-on-package', :machine_action_package, &clean_action_hook
|
49
70
|
end
|
50
71
|
end
|
51
72
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require_relative 'bucket'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Cachier
|
5
|
+
module ProvisionExt
|
6
|
+
def self.included(base)
|
7
|
+
base.class_eval do
|
8
|
+
def cachier_debug(msg)
|
9
|
+
@logger.debug "[CACHIER] #{msg}"
|
10
|
+
end
|
11
|
+
|
12
|
+
alias :old_call :call
|
13
|
+
def call(env)
|
14
|
+
return old_call(env) unless env[:machine].config.cache.enabled?
|
15
|
+
|
16
|
+
@env = env
|
17
|
+
|
18
|
+
FileUtils.mkdir_p(cache_root.to_s) unless cache_root.exist?
|
19
|
+
|
20
|
+
nfs_flag = env[:machine].config.cache.enable_nfs
|
21
|
+
env[:machine].config.vm.synced_folder cache_root, '/tmp/vagrant-cache', id: "vagrant-cache", nfs: nfs_flag
|
22
|
+
|
23
|
+
env[:cache_dirs] = []
|
24
|
+
|
25
|
+
old_call(env)
|
26
|
+
|
27
|
+
configure_cache_buckets
|
28
|
+
end
|
29
|
+
|
30
|
+
alias :old_run_provisioner :run_provisioner
|
31
|
+
def run_provisioner(*args)
|
32
|
+
configure_cache_buckets
|
33
|
+
old_run_provisioner(*args)
|
34
|
+
end
|
35
|
+
|
36
|
+
def configure_cache_buckets
|
37
|
+
if @env[:machine].config.cache.auto_detect
|
38
|
+
Bucket.auto_detect(@env)
|
39
|
+
end
|
40
|
+
|
41
|
+
return unless @env[:machine].config.cache.buckets.any?
|
42
|
+
|
43
|
+
@env[:ui].info 'Configuring cache buckets...'
|
44
|
+
cache_config = @env[:machine].config.cache
|
45
|
+
cache_config.buckets.each do |bucket_name, configs|
|
46
|
+
cachier_debug "Installing #{bucket_name} with configs #{configs.inspect}"
|
47
|
+
Bucket.install(bucket_name, @env, configs)
|
48
|
+
end
|
49
|
+
|
50
|
+
data_file = @env[:machine].data_dir.join('cache_dirs')
|
51
|
+
data_file.open('w') { |f| f.print @env[:cache_dirs].uniq.join("\n") }
|
52
|
+
end
|
53
|
+
|
54
|
+
def cache_root
|
55
|
+
@cache_root ||= case @env[:machine].config.cache.scope.to_sym
|
56
|
+
when :box
|
57
|
+
@env[:home_path].join('cache', @env[:machine].box.name)
|
58
|
+
when :machine
|
59
|
+
@env[:machine].data_dir.parent.join('cache')
|
60
|
+
else
|
61
|
+
raise "Unknown cache scope: '#{@env[:machine].config.cache.scope}'"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/locales/en.yml
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
en:
|
2
|
+
vagrant_cachier:
|
3
|
+
cleanup: |-
|
4
|
+
Removing cache buckets symlinks...
|
5
|
+
skipping_bucket: |-
|
6
|
+
Skipping %{bucket} cache bucket as the guest machine does not support it
|
7
|
+
unknown_cache_scope: |-
|
8
|
+
Unknown cache scope '%{cache_scope}' (allowed scopes: %{allowed})
|
9
|
+
will_fix_machine_cache_dir: |-
|
10
|
+
A vagrant-cachier provider specific cache dir was found under
|
11
|
+
'%{current_path}' and it will be moved to
|
12
|
+
'%{new_path}' as it is the new path for keeping machine
|
13
|
+
scoped cache dirs starting with the 0.3.0 version of the plugin.
|
14
|
+
vagrant:
|
15
|
+
errors:
|
16
|
+
multiple_provider_specific_cache_dirs_found: |-
|
17
|
+
There are multiple provider specific cache dirs for the '%{machine}' machine:
|
18
|
+
%{dirs}
|
19
|
+
Please move one of them up to `%{machine_path}/cache` and remove the others
|
20
|
+
before bringing the machine up again.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-cachier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fabio Rehm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-08-05 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Speed up vagrant boxes provisioning
|
14
14
|
email:
|
@@ -24,23 +24,31 @@ files:
|
|
24
24
|
- LICENSE.txt
|
25
25
|
- README.md
|
26
26
|
- Rakefile
|
27
|
+
- development/Cheffile
|
28
|
+
- development/Cheffile.lock
|
27
29
|
- development/Vagrantfile
|
28
30
|
- lib/vagrant-cachier.rb
|
29
|
-
- lib/vagrant-cachier/action.rb
|
31
|
+
- lib/vagrant-cachier/action/clean.rb
|
32
|
+
- lib/vagrant-cachier/action/ensure_single_cache_root.rb
|
30
33
|
- lib/vagrant-cachier/bucket.rb
|
31
34
|
- lib/vagrant-cachier/bucket/apt.rb
|
35
|
+
- lib/vagrant-cachier/bucket/chef.rb
|
32
36
|
- lib/vagrant-cachier/bucket/gem.rb
|
33
37
|
- lib/vagrant-cachier/bucket/pacman.rb
|
34
38
|
- lib/vagrant-cachier/bucket/rvm.rb
|
35
39
|
- lib/vagrant-cachier/bucket/yum.rb
|
36
40
|
- lib/vagrant-cachier/cap/arch/pacman_cache_dir.rb
|
37
41
|
- lib/vagrant-cachier/cap/debian/apt_cache_dir.rb
|
42
|
+
- lib/vagrant-cachier/cap/linux/chef_file_cache_path.rb
|
38
43
|
- lib/vagrant-cachier/cap/linux/gemdir.rb
|
39
44
|
- lib/vagrant-cachier/cap/linux/rvm_path.rb
|
40
45
|
- lib/vagrant-cachier/cap/redhat/yum_cache_dir.rb
|
41
46
|
- lib/vagrant-cachier/config.rb
|
47
|
+
- lib/vagrant-cachier/errors.rb
|
42
48
|
- lib/vagrant-cachier/plugin.rb
|
49
|
+
- lib/vagrant-cachier/provision_ext.rb
|
43
50
|
- lib/vagrant-cachier/version.rb
|
51
|
+
- locales/en.yml
|
44
52
|
- vagrant-cachier.gemspec
|
45
53
|
homepage: https://github.com/fgrehm/vagrant-cachier
|
46
54
|
licenses:
|
@@ -1,90 +0,0 @@
|
|
1
|
-
require_relative 'bucket'
|
2
|
-
|
3
|
-
module VagrantPlugins
|
4
|
-
module Cachier
|
5
|
-
class Action
|
6
|
-
class Install
|
7
|
-
def initialize(app, env)
|
8
|
-
@app = app
|
9
|
-
@logger = Log4r::Logger.new("vagrant::cachier::action::install")
|
10
|
-
end
|
11
|
-
|
12
|
-
def call(env)
|
13
|
-
return @app.call(env) unless env[:machine].config.cache.enabled?
|
14
|
-
|
15
|
-
@env = env
|
16
|
-
|
17
|
-
FileUtils.mkdir_p(cache_root.to_s) unless cache_root.exist?
|
18
|
-
|
19
|
-
nfs_flag = env[:machine].config.cache.enable_nfs
|
20
|
-
env[:machine].config.vm.synced_folder cache_root, '/tmp/vagrant-cache', id: "vagrant-cache", nfs: nfs_flag
|
21
|
-
|
22
|
-
@app.call env
|
23
|
-
|
24
|
-
env[:cache_dirs] = []
|
25
|
-
|
26
|
-
if env[:machine].config.cache.auto_detect
|
27
|
-
Bucket.auto_detect(env)
|
28
|
-
end
|
29
|
-
|
30
|
-
if env[:machine].config.cache.buckets.any?
|
31
|
-
env[:ui].info 'Configuring cache buckets...'
|
32
|
-
cache_config = env[:machine].config.cache
|
33
|
-
cache_config.buckets.each do |bucket_name, configs|
|
34
|
-
@logger.debug "Installing #{bucket_name} with configs #{configs.inspect}"
|
35
|
-
Bucket.install(bucket_name, env, configs)
|
36
|
-
end
|
37
|
-
|
38
|
-
data_file = env[:machine].data_dir.join('cache_dirs')
|
39
|
-
data_file.open('w') { |f| f.print env[:cache_dirs].join("\n") }
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def cache_root
|
44
|
-
@cache_root ||= case @env[:machine].config.cache.scope
|
45
|
-
when :box
|
46
|
-
@env[:home_path].join('cache', @env[:machine].box.name)
|
47
|
-
when :machine
|
48
|
-
@env[:machine].data_dir.join('cache')
|
49
|
-
else
|
50
|
-
raise "Unknown cache scope: '#{@env[:machine].config.cache.scope}'"
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
class Clean
|
56
|
-
def initialize(app, env)
|
57
|
-
@app = app
|
58
|
-
@logger = Log4r::Logger.new("vagrant::cachier::action::clean")
|
59
|
-
end
|
60
|
-
|
61
|
-
def call(env)
|
62
|
-
@env = env
|
63
|
-
|
64
|
-
if env[:machine].state.id == :running && symlinks.any?
|
65
|
-
env[:ui].info 'Removing cache buckets symlinks...'
|
66
|
-
symlinks.each do |symlink|
|
67
|
-
remove_symlink symlink
|
68
|
-
end
|
69
|
-
|
70
|
-
File.delete env[:machine].data_dir.join('cache_dirs').to_s
|
71
|
-
end
|
72
|
-
|
73
|
-
@app.call env
|
74
|
-
end
|
75
|
-
|
76
|
-
def symlinks
|
77
|
-
# TODO: Check if file exists instead of a blank rescue
|
78
|
-
@symlinks ||= @env[:machine].data_dir.join('cache_dirs').read.split rescue []
|
79
|
-
end
|
80
|
-
|
81
|
-
def remove_symlink(symlink)
|
82
|
-
if @env[:machine].communicate.test("test -L #{symlink}")
|
83
|
-
@logger.debug "Removing symlink for '#{symlink}'"
|
84
|
-
@env[:machine].communicate.sudo("unlink #{symlink}")
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|