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