module OVSImager
class DotWriter
def initialize(fname)
@fname = fname
@dot = File.open(fname, 'w')
@dot.puts 'graph interfaces {'
@dot.puts ' compound=true'
@dot.puts ' node [shape=rect]'
@dot_peers = []
end
def escape(name)
name.to_s.gsub('-', '_')
end
def mark2color(mark)
{'<' => 'red', '>' => 'pink', '*' => 'yellow'}[mark]
end
def finish(pngname)
@dot.puts @dot_peers.join "\n"
@dot.puts '}'
@dot.close
@dot = nil
system("dot -Tpng \"#{@fname}\" -o \"#{pngname}\"")
end
# For OVSVS & LinuxBridge
def br_begin(name, br_type)
@dot.puts " subgraph cluster_br__#{escape(name)} {"
@dot.puts " label = \"#{br_type}Bridge #{name}\""
end
def br_iface(name, mark, dump, inet, tag, peer, remote=nil)
fill = mark ? "fillcolor=#{mark2color(mark)},style=filled," : ''
label = "#{name}
#{inet.join(',')}"
if tag or remote
label += "
#{tag}#{remote && remote.gsub('>','>')}"
end
if dump
label += " "
if dump[0] && dump[2] && dump[0] == dump[3] && dump[1] == dump[2]
label += "
[#{dump[0]} <-> #{dump[1]}]"
else
label += "
[#{dump[0]} --> #{dump[1]}]" if dump[0]
label += "
[#{dump[3]} <-- #{dump[2]}]" if dump[2]
end
end
label += " "
@dot.puts " #{escape(name)} [#{fill}label=<#{label}>]"
if peer && name <= peer
@dot_peers << " #{escape(name)} -- #{escape(peer)}"
end
end
def br_end
@dot.puts " }"
end
# For IPNetNS
def ns_begin(name)
@dot.puts " subgraph cluster_ns__#{escape(name)} {"
@dot.puts " label = \"Namespace\\n#{name}\""
@dot.puts " style = \"filled\""
@dot.puts " fillcolor = \"#eeeeee\""
@dot.puts " ns__#{escape(name)} " +
"[label=\"\",style=invis,width=0,height=0,margin=0]"
@nsname = name
end
def ns_br_iface(name)
@dot_peers << " #{escape(name)} -- ns__#{escape(@nsname)} " +
"[style=dashed,lhead=cluster_ns__#{escape(@nsname)}]"
end
def ns_iface(name, mark, dump, inet, tag, peer)
br_iface(name, mark, dump, inet, tag, peer)
# @dot.puts " #{escape(name)} -- #{escape(@last)} [style=invis]" if @last
# @last = name
end
def ns_end
@dot.puts ' }'
end
end
end