class Spiceweasel::ExtractLocal

models the existing Chef repository as a manifest

Public Class Methods

grab_name_from_path(path) click to toggle source
# File lib/spiceweasel/extract_local.rb, line 97
def self.grab_name_from_path(path)
  name = path.split('/').last.split('.')
  name.pop if name.length > 1
  name.join('.')
end
parse_berkshelf(objects) click to toggle source
# File lib/spiceweasel/extract_local.rb, line 89
def self.parse_berkshelf(objects)
  if File.file?('./Berksfile')
    objects['berksfile'] = nil
    berksfile = Berksfile.new(objects['berksfile'])
  end
  berksfile
end
parse_data_bags() click to toggle source
# File lib/spiceweasel/extract_local.rb, line 63
def self.parse_data_bags
  data_bags = []
  Dir.glob('data_bags/*').each do |data_bag_full_path|
    next unless File.directory?(data_bag_full_path)
    data_bag = data_bag_full_path.split('/').last
    Spiceweasel::Log.debug("dir_ext: data_bag: '#{data_bag}'")
    data_bag_items = []
    Dir.glob("#{data_bag_full_path}/*.{rb,json}").each do |data_bag_item_full_path|
      Spiceweasel::Log.debug("dir_ext: data_bag: '#{data_bag}':'#{data_bag_item_full_path}'")
      data_bag_items << grab_name_from_path(data_bag_item_full_path)
    end if File.directory?(data_bag_full_path)
    data_bags << { data_bag => { 'items' => data_bag_items.sort } }
  end
  data_bags
end
parse_objects() click to toggle source
# File lib/spiceweasel/extract_local.rb, line 26
def self.parse_objects # rubocop:disable CyclomaticComplexity
  objects = {}

  # BERKSHELF
  berksfile = parse_berkshelf(objects)

  # COOKBOOKS
  cookbooks = berksfile ? resolve_cookbooks(berksfile.cookbook_list) : resolve_cookbooks
  objects['cookbooks'] = cookbooks.sort_by { |c| [c.keys[0]] } unless cookbooks.empty?

  # ROLES
  parse_roles(objects)

  # ENVIRONMENTS
  environments = []
  Dir.glob('environments/*.{rb,json}').each do |environment_full_path|
    environment = grab_name_from_path(environment_full_path)
    Spiceweasel::Log.debug("dir_ext: environment: '#{environment}'")
    environments << { environment => nil }
  end
  objects['environments'] = environments.sort_by { |e| [e.keys[0]] } unless environments.empty?

  # DATA BAGS
  data_bags = parse_data_bags
  objects['data bags'] = data_bags.sort_by { |d| [d.keys[0]] } unless data_bags.empty?

  # NODES
  # TODO: Cant use this yet as node_list.rb doesnt support node from file syntax but expects the node info to be part of the objects passed in
  # nodes = []
  # Dir.glob("nodes/*.{rb,json}").each do |node_full_path|
  #   node = self.grab_name_from_path(node_full_path)
  #   nodes  << {node => nil}
  # end
  # objects['nodes'] = nodes unless nodes.empty?
  objects
end
parse_roles(objects) click to toggle source
# File lib/spiceweasel/extract_local.rb, line 79
def self.parse_roles(objects)
  roles = []
  Dir.glob('roles/*.{rb,json}').each do |role_full_path|
    role = grab_name_from_path(role_full_path)
    Spiceweasel::Log.debug("dir_ext: role: '#{role}'")
    roles << { role => nil }
  end
  objects['roles'] = roles.sort_by { |r| [r.keys[0]] } unless roles.nil? || roles.empty?
end
resolve_cookbooks(berkshelf_cookbooks = {}) click to toggle source
# File lib/spiceweasel/extract_local.rb, line 103
def self.resolve_cookbooks(berkshelf_cookbooks = {})
  require 'solve'
  loader = Chef::CookbookLoader.new(Spiceweasel::Config[:cookbook_dir])
  loader.load_cookbooks
  books = loader.cookbooks_by_name
  graph = Solve::Graph.new
  cblist = []
  # push in the berkshelf cookbooks to cover any other deps
  berkshelf_cookbooks.each do |name, version|
    Spiceweasel::Log.debug("dir_ext:berks: #{name} #{version}")
    graph.artifact(name, version)
  end
  books.each do |name, cb|
    Spiceweasel::Log.debug("dir_ext: #{name} #{cb.version}")
    artifact = graph.artifact(name, cb.version)
    cblist.push([name, cb.version])
    cb.metadata.dependencies.each do |dep_name, dep_version|
      artifact.depends(dep_name, dep_version)
    end
  end
  # get the cookbooks and their versions, map to cookbook hash format
  begin
    cookbooks = []
    Solve.it!(graph, cblist).each { |k, v| cookbooks.push(k => { 'version' => v  }) }
  rescue Solve::Errors::NoSolutionError
    STDERR.puts 'ERROR: There are missing cookbook dependencies, please check your metadata.rb files.'
    exit(-1)
  end
  # remove any cookbooks managed by berkshelf
  cookbooks.delete_if { |x| berkshelf_cookbooks.keys.member?(x.keys[0]) }
end