Class: Chef::Knife::Depgraph

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

Instance Method Summary collapse

Instance Method Details

#runObject



33
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
70
71
72
73
74
# File 'lib/chef/knife/depgraph.rb', line 33

def run
  unless name_args.size == 1
    ui.err(opt_parser)
    exit 1
  end

  node_name = name_args.first

  node = Chef::Node.load(node_name)
  environment ||= node.chef_environment
  cookbooks = node.run_list.run_list_items

  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.err("Solving [#{cookbooks.join(', ')}] in #{environment} environment")
  solution = solve_cookbooks(environment, cookbooks)

  dep_graph = {}

  solution.sort.each do |name, cb|
    dep_graph[name] = {
      "version" => cb.version,
      "deps" => cb..dependencies
    }
  end

  ui.msg( Chef::JSONCompat.to_json_pretty(dep_graph) )

end

#solve_cookbooks(environment, cookbooks) ⇒ Object



76
77
78
# File 'lib/chef/knife/depgraph.rb', line 76

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