class KnifeGraph::Graph

Public Instance Methods

run() click to toggle source
# File lib/chef/knife/graph.rb, line 24
def run
  if config[:environment] and not Chef::Environment.list.find { |e, url| e == config[:environment] }
    raise "Environment '#{config[:environment]}' not found"
  end

  graph = ::Graph.new

  Chef::Role.list.each do |r, url|
    r_node = "role:#{r}"

    graph.node(r_node, r)
    graph.square << graph.node(r_node)

    role = Chef::Role.load(r)

    role.run_list_for(config[:environment]).recipe_names.each do |recipe|
      graph.edge r_node, "recipe:#{recipe}"
      graph.node("recipe:#{recipe}", recipe)
    end

    role.run_list_for(config[:environment]).role_names.each do |role_name|
      role_node = "role:#{role_name}"
      graph.node(role_node, role_name)
      graph.square << graph.node(role_node)
      graph.edge r_node, role_node
    end
  end

  # Graph dot data
  dot_str = graph.to_s

  # Determine the requested output type
  output_type = if config[:output] == '-'
                  config[:type]
                else
                  File.extname(config[:output]).split('.').last
                end

  # Determine the right output
  if output_type == 'dot'
    graph_data = dot_str
  else
    dot = Mixlib::ShellOut.new("dot -T#{output_type}", :input => dot_str)
    graph_data = dot.run_command.stdout
  end

  # Write the data to STDOUT or file
  if config[:output] == '-'
    print graph_data
  else
    File.open config[:output], 'w' do |f|
      f.print graph_data
    end
  end

  if config[:verbosity] > 0 and config[:output] != '-'
    ui.info("Generated #{config[:output]} for environment #{config[:environment] ? config[:environment] : '_default'}")
  end
end