class Kitchen::Provisioner::SandboxBerksEnv
Internal object to manage sandbox preparation for Chef Zero Berkshelf Environment.
@author Mario Santos <mario.rf.santos@gmail.com> @api private
Public Instance Methods
cookbook_versions(json_path)
click to toggle source
Gets the cookbook version restrictions from a chef environment
@param [String] chef environment path @return [Hash] cookbook versions @api private
# File lib/kitchen/provisioner/sandbox_berks_env.rb, line 63 def cookbook_versions(json_path) info("Using environment from '#{json_path}'") JSON.parse(File.read(json_path.to_s))['cookbook_versions'] end
environments_path_from_git(repo)
click to toggle source
Fetches a git repo to a temporary directory
@param args [String] git repo @return [String] the environments_path directory @api private
# File lib/kitchen/provisioner/sandbox_berks_env.rb, line 51 def environments_path_from_git(repo) info("Fetching chef environments from repo '#{repo}'...") tmpenv_dir = Dir.mktmpdir('environments-') Git.clone(repo, 'chef_env', :path => tmpenv_dir, :depth => 1) "#{tmpenv_dir}/chef_env" end
lock_berksfile(berksfile, cookbook_versions)
click to toggle source
Locks the cookbook versions into Berksfile.lock
@param [Berksfile] berksfile to lock @param [Hash] cookbook versions @api private
# File lib/kitchen/provisioner/sandbox_berks_env.rb, line 73 def lock_berksfile(berksfile, cookbook_versions) ::Berkshelf.ui.mute do info("Resolving dependency graph with Berkshelf #{::Berkshelf::VERSION}...") berksfile.install unless cookbook_versions.nil? berksfile.lockfile.graph.each do |graphitem| version = cookbook_versions[graphitem.name] unless version.nil? || berksfile.has_dependency?(graphitem.name) info("Adding Berkshelf dependency: #{graphitem.name} (#{version})") berksfile.add_dependency(graphitem.name, version) end end # update the lockfile berksfile.update berksfile.lockfile.graph.update(berksfile.install) berksfile.lockfile.update(berksfile.dependencies) berksfile.lockfile.save end end end
resolve_with_berkshelf()
click to toggle source
Performs a Berkshelf cookbook resolution inside a common mutex.
@api private
# File lib/kitchen/provisioner/sandbox_berks_env.rb, line 16 def resolve_with_berkshelf # Load Berksfile berks = ::Berkshelf::Berksfile.from_file(berksfile) chef_environment = config[:client_rb][:environment] # skip if the environment was not specified unless chef_environment.nil? unless config[:environments_repo].nil? config[:environments_path] = environments_path_from_git(config[:environments_repo]) end info("Loading chef environment '#{chef_environment}'...") lock_berksfile(berks, cookbook_versions("#{config[:environments_path]}/#{chef_environment}.json")) end Kitchen.mutex.synchronize do info("Resolving cookbook dependencies with Berkshelf #{::Berkshelf::VERSION}...") debug("Using Berksfile from #{berksfile}") ::Berkshelf.ui.mute do if ::Berkshelf::Berksfile.method_defined?(:vendor) # Berkshelf 3.0 requires the directory to not exist FileUtils.rm_rf(tmpbooks_dir) berks.vendor(tmpbooks_dir) else berks.install(path => tmpbooks_dir) end end end end