Jason Antman
2012-Mar-29 15:17 UTC
[Puppet Users] python script to find cycles in relationship graph "dot" file
In the hopes that it may be as useful to someone else as it was to me: I wrote up a simple little Python script that uses the NetworkX package (http://networkx.lanl.gov/) and Pydot (http://code.google.com/p/pydot/) to automatically identify cycles in the .dot graph files produced by Puppet (when run with --graph or "graph = true"). It takes the name of a dot file (expanded_relationships.dot will probably be the best) and prints on stdout any cycles found in the graph, as lists of nodes, one cycle per line. For the one complex dependency cycle that prompted me to write this (the "Could not apply complete catalog: Found dependency cycles in the following relationships:" error listed a chain of 35 relationships), one run of this script allowed me to identify the common resource that was causing the loop, and gave me a pretty good idea of where it was defined (going by what the dependencies looked like). It would''ve been pretty difficult to do this in the 14000x500px PNG generated by dot. For the expanded_relationships.dot input (with 99 nodes), it gives output something like: [''File[foreman-report.rb]'', ''File[puppet.conf]'', ''Service[puppet]'', ''File[foreman-report.rb]''] [''Package[puppet-server]'', ''File[puppet.conf]'', ''Service[puppet]'', ''File[foreman-proxy-settings.yml]'', ''Service[foreman-proxy]'', ''Package[puppet-server]''] [''Package[puppet-server]'', ''File[puppet.conf]'', ''Service[puppet]'', ''Package[foreman-proxy]'', ''File[foreman-proxy-settings.yml]'', ''Package[puppet-server]''] [''Package[puppet-server]'', ''File[puppet.conf]'', ''Service[puppet]'', ''File[/var/lib/puppet/yaml/foreman]'', ''Package[puppet-server]''] [''File[/etc/puppet/node.rb]'', ''File[puppet.conf]'', ''Service[puppet]'', ''File[/etc/puppet/node.rb]''] [''File[puppet.conf]'', ''Service[puppet]'', ''File[foreman-proxy-settings.yml]'', ''Service[foreman-proxy]'', ''File[puppet.conf]''] [''File[puppet.conf]'', ''Service[puppet]'', ''User[foreman-proxy]'', ''File[puppet.conf]''] ... snip ... The script itself, link to SVN, notes on using it, etc. are at: http://blog.jasonantman.com/2012/03/python-script-to-find-dependency-cycles-in-graphviz-dot-files/ I''ve only run on Fedora/CentOS, but those only needed python, plus the python-networkx, graphviz-python, and pydot packages. Hope it''s useful to someone else as well. -Jason Antman -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com. To unsubscribe from this group, send email to puppet-users+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.