diff --git a/docs/buckets/chef_rubygems.md b/docs/buckets/chef_rubygems.md new file mode 100644 index 0000000..1c0e976 --- /dev/null +++ b/docs/buckets/chef_rubygems.md @@ -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 +``` diff --git a/lib/vagrant-cachier/bucket.rb b/lib/vagrant-cachier/bucket.rb index 0bf6294..ac4e76b 100644 --- a/lib/vagrant-cachier/bucket.rb +++ b/lib/vagrant-cachier/bucket.rb @@ -90,6 +90,7 @@ end require_relative "bucket/apt" require_relative "bucket/chef" require_relative "bucket/gem" +require_relative "bucket/chef_gem" require_relative "bucket/pacman" require_relative "bucket/yum" require_relative "bucket/rvm" diff --git a/lib/vagrant-cachier/bucket/chef_gem.rb b/lib/vagrant-cachier/bucket/chef_gem.rb new file mode 100644 index 0000000..07e9d5a --- /dev/null +++ b/lib/vagrant-cachier/bucket/chef_gem.rb @@ -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 diff --git a/lib/vagrant-cachier/cap/linux/chef_gemdir.rb b/lib/vagrant-cachier/cap/linux/chef_gemdir.rb new file mode 100644 index 0000000..019f1a0 --- /dev/null +++ b/lib/vagrant-cachier/cap/linux/chef_gemdir.rb @@ -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 diff --git a/lib/vagrant-cachier/capabilities.rb b/lib/vagrant-cachier/capabilities.rb index 0b3d06a..277ff37 100644 --- a/lib/vagrant-cachier/capabilities.rb +++ b/lib/vagrant-cachier/capabilities.rb @@ -6,6 +6,11 @@ module VagrantPlugins 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