vagrant-cachier 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +59 -34
  5. data/LICENSE.txt +1 -1
  6. data/README.md +27 -10
  7. data/development/Cheffile.lock +1 -5
  8. data/development/Vagrantfile +81 -71
  9. data/docs/buckets/apt-lists.md +18 -0
  10. data/docs/how-does-it-work.md +5 -6
  11. data/docs/index.md +24 -5
  12. data/docs/template.html +1 -0
  13. data/docs/usage.md +81 -28
  14. data/lib/vagrant-cachier/action/clean.rb +1 -1
  15. data/lib/vagrant-cachier/action/configure_bucket_root.rb +46 -0
  16. data/lib/vagrant-cachier/action/install_buckets.rb +47 -0
  17. data/lib/vagrant-cachier/bucket.rb +55 -0
  18. data/lib/vagrant-cachier/bucket/apt.rb +3 -12
  19. data/lib/vagrant-cachier/bucket/apt_cacher.rb +1 -13
  20. data/lib/vagrant-cachier/bucket/apt_lists.rb +24 -0
  21. data/lib/vagrant-cachier/bucket/chef.rb +1 -14
  22. data/lib/vagrant-cachier/bucket/composer.rb +1 -14
  23. data/lib/vagrant-cachier/bucket/gem.rb +4 -17
  24. data/lib/vagrant-cachier/bucket/npm.rb +1 -14
  25. data/lib/vagrant-cachier/bucket/pacman.rb +1 -14
  26. data/lib/vagrant-cachier/bucket/rvm.rb +4 -17
  27. data/lib/vagrant-cachier/bucket/yum.rb +4 -15
  28. data/lib/vagrant-cachier/bucket/zypper.rb +4 -15
  29. data/lib/vagrant-cachier/cap/debian/apt_lists_dir.rb +13 -0
  30. data/lib/vagrant-cachier/capabilities.rb +64 -0
  31. data/lib/vagrant-cachier/config.rb +35 -10
  32. data/lib/vagrant-cachier/hooks.rb +27 -0
  33. data/lib/vagrant-cachier/plugin.rb +12 -80
  34. data/lib/vagrant-cachier/version.rb +1 -1
  35. data/locales/en.yml +3 -7
  36. data/vagrant-cachier.gemspec +11 -1
  37. metadata +20 -12
  38. data/lib/vagrant-cachier/action/ensure_single_cache_root.rb +0 -64
  39. data/lib/vagrant-cachier/errors.rb +0 -9
  40. data/lib/vagrant-cachier/provision_ext.rb +0 -74
@@ -9,22 +9,10 @@ module VagrantPlugins
9
9
  end
10
10
 
11
11
  def install
12
- machine = @env[:machine]
13
- guest = machine.guest
14
-
15
12
  if guest.capability?(:apt_cacher_dir)
16
13
  if guest_path = guest.capability(:apt_cacher_dir)
17
14
  if machine.config.cache.enable_nfs
18
- @env[:cache_dirs] << guest_path
19
-
20
- machine.communicate.tap do |comm|
21
- comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}")
22
- unless comm.test("test -L #{guest_path}")
23
- comm.sudo("rm -rf #{guest_path}")
24
- comm.sudo("mkdir -p `dirname #{guest_path}`")
25
- comm.sudo("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
26
- end
27
- end
15
+ symlink(guest_path)
28
16
  else
29
17
  @env[:ui].info I18n.t('vagrant_cachier.nfs_required', bucket: 'apt-cacher')
30
18
  end
@@ -0,0 +1,24 @@
1
+ module VagrantPlugins
2
+ module Cachier
3
+ class Bucket
4
+ class AptLists < Bucket
5
+ def self.capability
6
+ :apt_lists_dir
7
+ end
8
+
9
+ def install
10
+ if guest.capability?(:apt_lists_dir)
11
+ guest_path = guest.capability(:apt_lists_dir)
12
+
13
+ return if @env[:cache_dirs].include?(guest_path)
14
+
15
+ symlink(guest_path)
16
+ comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}/partial")
17
+ else
18
+ @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'apt-lists')
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -7,22 +7,9 @@ module VagrantPlugins
7
7
  end
8
8
 
9
9
  def install
10
- machine = @env[:machine]
11
- guest = machine.guest
12
-
13
10
  if guest.capability?(:chef_file_cache_path)
14
11
  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
12
+ symlink(guest_path) if guest_path
26
13
  else
27
14
  @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Chef')
28
15
  end
@@ -7,22 +7,9 @@ module VagrantPlugins
7
7
  end
8
8
 
9
9
  def install
10
- machine = @env[:machine]
11
- guest = machine.guest
12
-
13
10
  if guest.capability?(:composer_path)
14
11
  if composer_path = guest.capability(:composer_path)
15
- bucket_path = "/tmp/vagrant-cache/#{@name}"
16
- @env[:cache_dirs] << composer_path
17
-
18
- machine.communicate.tap do |comm|
19
- comm.execute("mkdir -p #{bucket_path}")
20
-
21
- unless comm.test("test -L #{composer_path}")
22
- comm.sudo("rm -rf #{composer_path}")
23
- comm.sudo("ln -s #{bucket_path} #{composer_path}")
24
- end
25
- end
12
+ symlink(composer_path, create_parent: false)
26
13
  end
27
14
  else
28
15
  @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Composer')
@@ -7,26 +7,13 @@ module VagrantPlugins
7
7
  end
8
8
 
9
9
  def install
10
- machine = @env[:machine]
11
- guest = machine.guest
12
-
13
10
  if guest.capability?(:gemdir)
14
11
  if gemdir_path = guest.capability(:gemdir)
15
- prefix = gemdir_path.split('/').last
16
- bucket_path = "/tmp/vagrant-cache/#{@name}/#{prefix}"
17
- machine.communicate.tap do |comm|
18
- comm.execute("mkdir -p #{bucket_path}")
19
-
20
- gem_cache_path = "#{gemdir_path}/cache"
21
-
22
- @env[:cache_dirs] << gem_cache_path
12
+ prefix = gemdir_path.split('/').last
13
+ bucket_path = "/tmp/vagrant-cache/#{@name}/#{prefix}"
14
+ gem_cache_path = "#{gemdir_path}/cache"
23
15
 
24
- unless comm.test("test -L #{gem_cache_path}")
25
- comm.sudo("rm -rf #{gem_cache_path}")
26
- comm.sudo("mkdir -p `dirname #{gem_cache_path}`")
27
- comm.sudo("ln -s #{bucket_path} #{gem_cache_path}")
28
- end
29
- end
16
+ symlink(gem_cache_path, bucket_path)
30
17
  end
31
18
  else
32
19
  @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'RubyGems')
@@ -7,22 +7,9 @@ module VagrantPlugins
7
7
  end
8
8
 
9
9
  def install
10
- machine = @env[:machine]
11
- guest = machine.guest
12
-
13
10
  if guest.capability?(:npm_cache_dir)
14
11
  guest_path = guest.capability(:npm_cache_dir)
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.execute("rm -rf #{guest_path}")
22
- comm.execute("mkdir -p `dirname #{guest_path}`")
23
- comm.execute("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
24
- end
25
- end
12
+ user_symlink(guest_path) if guest_path
26
13
  else
27
14
  @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'npm')
28
15
  end
@@ -7,22 +7,9 @@ module VagrantPlugins
7
7
  end
8
8
 
9
9
  def install
10
- machine = @env[:machine]
11
- guest = machine.guest
12
-
13
10
  if guest.capability?(:pacman_cache_dir)
14
11
  guest_path = guest.capability(:pacman_cache_dir)
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
12
+ symlink(guest_path)
26
13
  else
27
14
  @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Pacman')
28
15
  end
@@ -7,26 +7,13 @@ module VagrantPlugins
7
7
  end
8
8
 
9
9
  def install
10
- machine = @env[:machine]
11
- guest = machine.guest
12
-
13
10
  if guest.capability?(:rvm_path)
14
11
  if rvm_path = guest.capability(:rvm_path)
15
- prefix = rvm_path.split('/').last
16
- bucket_path = "/tmp/vagrant-cache/#{@name}/#{prefix}"
17
- machine.communicate.tap do |comm|
18
- comm.execute("mkdir -p #{bucket_path}")
19
-
20
- rvm_cache_path = "#{rvm_path}/archives"
21
-
22
- @env[:cache_dirs] << rvm_cache_path
12
+ prefix = rvm_path.split('/').last
13
+ bucket_path = "/tmp/vagrant-cache/#{@name}/#{prefix}"
14
+ rvm_cache_path = "#{rvm_path}/archives"
23
15
 
24
- unless comm.test("test -L #{rvm_cache_path}")
25
- comm.sudo("rm -rf #{rvm_cache_path}")
26
- comm.sudo("mkdir -p `dirname #{rvm_cache_path}`")
27
- comm.sudo("ln -s #{bucket_path} #{rvm_cache_path}")
28
- end
29
- end
16
+ symlink(rvm_cache_path, bucket_path)
30
17
  end
31
18
  else
32
19
  @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'RVM')
@@ -7,25 +7,14 @@ module VagrantPlugins
7
7
  end
8
8
 
9
9
  def install
10
- machine = @env[:machine]
11
- guest = machine.guest
12
-
13
10
  if guest.capability?(:yum_cache_dir)
14
11
  guest_path = guest.capability(:yum_cache_dir)
12
+ return if @env[:cache_dirs].include?(guest_path)
15
13
 
16
- @env[:cache_dirs] << guest_path
17
-
18
- machine.communicate.tap do |comm|
19
- # Ensure caching is enabled
20
- comm.sudo("sed -i 's/keepcache=0/keepcache=1/g' /etc/yum.conf")
14
+ # Ensure caching is enabled
15
+ comm.sudo("sed -i 's/keepcache=0/keepcache=1/g' /etc/yum.conf")
21
16
 
22
- comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}")
23
- unless comm.test("test -L #{guest_path}")
24
- comm.sudo("rm -rf #{guest_path}")
25
- comm.sudo("mkdir -p `dirname #{guest_path}`")
26
- comm.sudo("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
27
- end
28
- end
17
+ symlink(guest_path)
29
18
  else
30
19
  @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Yum')
31
20
  end
@@ -7,25 +7,14 @@ module VagrantPlugins
7
7
  end
8
8
 
9
9
  def install
10
- machine = @env[:machine]
11
- guest = machine.guest
12
-
13
10
  if guest.capability?(:zypper_cache_dir)
14
11
  guest_path = guest.capability(:zypper_cache_dir)
12
+ return if @env[:cache_dirs].include?(guest_path)
15
13
 
16
- @env[:cache_dirs] << guest_path
17
-
18
- machine.communicate.tap do |comm|
19
- # Ensure caching is enabled
20
- comm.sudo("zypper modifyrepo --keep-packages --all")
14
+ # Ensure caching is enabled
15
+ comm.sudo("zypper modifyrepo --keep-packages --all")
21
16
 
22
- comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}")
23
- unless comm.test("test -L #{guest_path}")
24
- comm.sudo("rm -rf #{guest_path}")
25
- comm.sudo("mkdir -p `dirname #{guest_path}`")
26
- comm.sudo("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
27
- end
28
- end
17
+ symlink(guest_path)
29
18
  else
30
19
  @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Zypper')
31
20
  end
@@ -0,0 +1,13 @@
1
+ module VagrantPlugins
2
+ module Cachier
3
+ module Cap
4
+ module Debian
5
+ module AptListsDir
6
+ def self.apt_lists_dir(machine)
7
+ '/var/lib/apt/lists'
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,64 @@
1
+ module VagrantPlugins
2
+ module Cachier
3
+ class Plugin < Vagrant.plugin('2')
4
+ guest_capability 'linux', 'gemdir' do
5
+ require_relative 'cap/linux/gemdir'
6
+ Cap::Linux::Gemdir
7
+ end
8
+
9
+ guest_capability 'linux', 'rvm_path' do
10
+ require_relative 'cap/linux/rvm_path'
11
+ Cap::Linux::RvmPath
12
+ end
13
+
14
+ guest_capability 'linux', 'composer_path' do
15
+ require_relative 'cap/linux/composer_path'
16
+ Cap::Linux::ComposerPath
17
+ end
18
+
19
+ guest_capability 'linux', 'chef_file_cache_path' do
20
+ require_relative 'cap/linux/chef_file_cache_path'
21
+ Cap::Linux::ChefFileCachePath
22
+ end
23
+
24
+ guest_capability 'linux', 'npm_cache_dir' do
25
+ require_relative 'cap/linux/npm_cache_dir'
26
+ Cap::Linux::NpmCacheDir
27
+ end
28
+
29
+ guest_capability 'debian', 'apt_cache_dir' do
30
+ require_relative 'cap/debian/apt_cache_dir'
31
+ Cap::Debian::AptCacheDir
32
+ end
33
+
34
+ guest_capability 'debian', 'apt_cacher_dir' do
35
+ require_relative 'cap/debian/apt_cacher_dir'
36
+ Cap::Debian::AptCacherDir
37
+ end
38
+
39
+ guest_capability 'debian', 'apt_lists_dir' do
40
+ require_relative 'cap/debian/apt_lists_dir'
41
+ Cap::Debian::AptListsDir
42
+ end
43
+
44
+ guest_capability 'redhat', 'yum_cache_dir' do
45
+ require_relative 'cap/redhat/yum_cache_dir'
46
+ Cap::RedHat::YumCacheDir
47
+ end
48
+
49
+ guest_capability 'suse', 'yum_cache_dir' do
50
+ # Disable Yum on suse guests
51
+ end
52
+
53
+ guest_capability 'arch', 'pacman_cache_dir' do
54
+ require_relative 'cap/arch/pacman_cache_dir'
55
+ Cap::Arch::PacmanCacheDir
56
+ end
57
+
58
+ guest_capability 'suse', 'zypper_cache_dir' do
59
+ require_relative 'cap/suse/zypper_cache_dir'
60
+ Cap::SuSE::ZypperCacheDir
61
+ end
62
+ end
63
+ end
64
+ end
@@ -1,24 +1,39 @@
1
1
  module VagrantPlugins
2
2
  module Cachier
3
3
  class Config < Vagrant.plugin(2, :config)
4
- attr_accessor :scope, :auto_detect, :enable_nfs
4
+ attr_accessor :scope, :auto_detect, :synced_folder_opts
5
5
  attr_reader :buckets
6
6
 
7
7
  ALLOWED_SCOPES = %w( box machine )
8
8
 
9
9
  def initialize
10
- @scope = UNSET_VALUE
10
+ @scope = UNSET_VALUE
11
11
  @auto_detect = UNSET_VALUE
12
- @enable_nfs = UNSET_VALUE
12
+ @synced_folder_opts = UNSET_VALUE
13
+ @ui = Vagrant::UI::Colored.new
13
14
  end
14
15
 
15
16
  def enable(bucket, opts = {})
16
17
  (@buckets ||= {})[bucket] = opts
17
18
  end
18
19
 
20
+ def enable_nfs=(value)
21
+ @ui.warn "The `enable_nfs` config for vagrant-cachier has been deprecated " \
22
+ "and will be removed on 0.7.0, please use " \
23
+ "`synced_folder_opts = { type: :nfs }` instead.\n"
24
+
25
+ @synced_folder_opts = { type: :nfs } if value
26
+ end
27
+
19
28
  def validate(machine)
20
29
  errors = _detected_errors
21
30
 
31
+ if enabled? && backed_by_cloud_provider?(machine)
32
+ machine.ui.warn(I18n.t('vagrant_cachier.backed_by_cloud_provider',
33
+ provider: machine.provider_name))
34
+ disable!
35
+ end
36
+
22
37
  if enabled? && ! ALLOWED_SCOPES.include?(@scope.to_s)
23
38
  errors << I18n.t('vagrant_cachier.unknown_cache_scope',
24
39
  allowed: ALLOWED_SCOPES.inspect,
@@ -28,18 +43,28 @@ module VagrantPlugins
28
43
  { "vagrant cachier" => errors }
29
44
  end
30
45
 
46
+ def enabled?
47
+ return @enabled unless @enabled.nil?
48
+
49
+ @enabled = @scope != UNSET_VALUE
50
+ end
51
+
52
+ def disable!
53
+ @enabled = false
54
+ end
55
+
31
56
  def finalize!
32
57
  return unless enabled?
33
58
 
34
- @scope = :box if @scope == UNSET_VALUE
35
- @auto_detect = false if @auto_detect == UNSET_VALUE
36
- @enable_nfs = false if @enable_nfs == UNSET_VALUE
37
- @buckets = @buckets ? @buckets.dup : {}
59
+ @auto_detect = true if @auto_detect == UNSET_VALUE
60
+ @synced_folder_opts = nil if @synced_folder_opts == UNSET_VALUE
61
+ @buckets = @buckets ? @buckets.dup : {}
38
62
  end
39
63
 
40
- def enabled?
41
- @enabled ||= @auto_detect != UNSET_VALUE ||
42
- @buckets != nil
64
+ private
65
+
66
+ def backed_by_cloud_provider?(machine)
67
+ CLOUD_PROVIDERS.include?(machine.provider_name.to_s)
43
68
  end
44
69
  end
45
70
  end
@@ -0,0 +1,27 @@
1
+ module VagrantPlugins
2
+ module Cachier
3
+ class Plugin < Vagrant.plugin('2')
4
+ action_hook VagrantPlugins::Cachier::Plugin::ALL_ACTIONS do |hook|
5
+ require_relative 'action/configure_bucket_root'
6
+ require_relative 'action/install_buckets'
7
+
8
+ hook.before Vagrant::Action::Builtin::Provision, Action::ConfigureBucketRoot
9
+ # This will do the initial buckets installation
10
+ hook.after Vagrant::Action::Builtin::Provision, Action::InstallBuckets, chmod: true
11
+ end
12
+
13
+ # This ensure buckets are reconfigured after provisioners runs
14
+ action_hook :provisioner_run do |hook|
15
+ require_relative 'action/install_buckets'
16
+ hook.after :run_provisioner, Action::InstallBuckets
17
+ end
18
+
19
+ clean_action_hook = lambda do |hook|
20
+ require_relative 'action/clean'
21
+ hook.before Vagrant::Action::Builtin::GracefulHalt, Action::Clean
22
+ end
23
+ action_hook 'remove-guest-symlinks-on-halt', :machine_action_halt, &clean_action_hook
24
+ action_hook 'remove-guest-symlinks-on-package', :machine_action_package, &clean_action_hook
25
+ end
26
+ end
27
+ end