From 4647721f855fbdc77f8bd9730792e14de217add1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Pervill=C3=A9?= Date: Wed, 29 Oct 2014 12:24:12 +0630 Subject: [PATCH] Add support for caching chef gems (in /opt/chef/embedded). --- docs/buckets/chef_rubygems.md | 18 ++++++++++++++ lib/vagrant-cachier/bucket.rb | 1 + lib/vagrant-cachier/bucket/chef_gem.rb | 25 ++++++++++++++++++++ lib/vagrant-cachier/cap/linux/chef_gemdir.rb | 20 ++++++++++++++++ lib/vagrant-cachier/capabilities.rb | 5 ++++ 5 files changed, 69 insertions(+) create mode 100644 docs/buckets/chef_rubygems.md create mode 100644 lib/vagrant-cachier/bucket/chef_gem.rb create mode 100644 lib/vagrant-cachier/cap/linux/chef_gemdir.rb 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