Class: Chef::Knife::Solve

Inherits:
Chef::Knife show all
Defined in:
lib/chef/knife/solve.rb

Instance Method Summary collapse

Instance Method Details

#runObject



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/chef/knife/solve.rb', line 34

def run
  environment = config[:environment]
  cookbooks = name_args.map {|item| item.to_s.split(/,/) }.flatten.each{|item| item.strip! }
  cookbooks.delete_if {|item| item.empty? }
  if config[:node]
    node = Chef::Node.load(config[:node])
    environment ||= node.chef_environment
    cookbooks += node.run_list.run_list_items
  end
  environment ||= '_default'
  cookbooks = cookbooks.map do |arg|
    arg = arg.to_s
    if arg.include?('[')
      run_list = [Chef::RunList::RunListItem.new(arg)]
      expansion = Chef::RunList::RunListExpansionFromAPI.new(environment, run_list, rest)
      expansion.expand
      expansion.recipes
    else
      arg # Just a plain name
    end
  end.flatten.map do |arg|
    # I don't think this is strictly speaking required, but do it anyway
    arg.split('@').first.split('::').first
  end
  ui.info("Solving [#{cookbooks.join(', ')}] in #{environment} environment")
  solution = solve_cookbooks(environment, cookbooks)
  solution.sort.each do |name, cb|
    # Newer Chef doesn't auto-inflate the object.
    version = if cb.is_a?(Hash)
      cb['version']
    else
      cb.version
    end
    msg("#{name} #{version}")
  end
end

#solve_cookbooks(environment, cookbooks) ⇒ Object



71
72
73
# File 'lib/chef/knife/solve.rb', line 71

def solve_cookbooks(environment, cookbooks)
  rest.post_rest("/environments/#{environment}/cookbook_versions", 'run_list' => cookbooks)
end