X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=ovsdb%2Fovsdb-dot.in;h=134ce2269cdb3d775e580614f2d5897af2fb3a84;hb=HEAD;hp=cea89879d3c9d34e2a7725152e7c51d93bced53d;hpb=fca64c1292812ebea45433b104b9549a02ea268d;p=cascardo%2Fovs.git diff --git a/ovsdb/ovsdb-dot.in b/ovsdb/ovsdb-dot.in index cea89879d..134ce2269 100755 --- a/ovsdb/ovsdb-dot.in +++ b/ovsdb/ovsdb-dot.in @@ -10,33 +10,55 @@ import sys argv0 = sys.argv[0] -def printEdge(tableName, baseType, label): - if baseType.ref_table: +def printEdge(tableName, type, baseType, label): + if baseType.ref_table_name: + if type.n_min == 0: + if type.n_max == 1: + arity = "?" + elif type.n_max == sys.maxint: + arity = "*" + else: + arity = "{,%d}" % type.n_max + elif type.n_min == 1: + if type.n_max == 1: + arity = "" + elif type.n_max == sys.maxint: + arity = "+" + else: + arity = "{1,%d}" % type.n_max + options = {} - options['label'] = '"%s"' % label + options['label'] = '"%s%s"' % (label, arity) if baseType.ref_type == 'weak': - options['constraint'] = 'false' + options['style'] = 'dotted' print "\t%s -> %s [%s];" % ( tableName, - baseType.ref_table, + baseType.ref_table_name, ', '.join(['%s=%s' % (k,v) for k,v in options.items()])) -def schemaToDot(schemaFile): +def schemaToDot(schemaFile, arrows): schema = ovs.db.schema.DbSchema.from_json(ovs.json.from_file(schemaFile)) print "digraph %s {" % schema.name - for tableName, table in schema.tables.iteritems(): - print '\tsize="6.5,4";' - print '\tmargin="0";' - print "\tnode [shape=box];" + print '\trankdir=LR;' + print '\tsize="6.5,4";' + print '\tmargin="0";' + print "\tnode [shape=box];" + if not arrows: print "\tedge [dir=none, arrowhead=none, arrowtail=none];" - print "\t%s;" % tableName + for tableName, table in schema.tables.iteritems(): + options = {} + if table.is_root: + options['style'] = 'bold' + print "\t%s [%s];" % ( + tableName, + ', '.join(['%s=%s' % (k,v) for k,v in options.items()])) for columnName, column in table.columns.iteritems(): if column.type.value: - printEdge(tableName, column.type.key, "%s key" % columnName) - printEdge(tableName, column.type.value, "%s value" % columnName) + printEdge(tableName, column.type, column.type.key, "%s key" % columnName) + printEdge(tableName, column.type, column.type.value, "%s value" % columnName) else: - printEdge(tableName, column.type.key, columnName) + printEdge(tableName, column.type, column.type.key, columnName) print "}"; def usage(): @@ -47,6 +69,7 @@ usage: %(argv0)s [OPTIONS] SCHEMA where SCHEMA is an OVSDB schema in JSON format The following options are also available: + --no-arrows omit arrows from diagram -h, --help display this help message -V, --version display version information\ """ % {'argv0': argv0} @@ -56,26 +79,30 @@ if __name__ == "__main__": try: try: options, args = getopt.gnu_getopt(sys.argv[1:], 'hV', - ['help', 'version']) + ['no-arrows', + 'help', 'version',]) except getopt.GetoptError, geo: sys.stderr.write("%s: %s\n" % (argv0, geo.msg)) sys.exit(1) + arrows = True for key, value in options: - if key in ['-h', '--help']: + if key == '--no-arrows': + arrows = False + elif key in ['-h', '--help']: usage() elif key in ['-V', '--version']: print "ovsdb-dot (Open vSwitch) @VERSION@" else: sys.exit(0) - + if len(args) != 1: sys.stderr.write("%s: exactly 1 non-option argument required " "(use --help for help)\n" % argv0) sys.exit(1) - schemaToDot(args[0]) - + schemaToDot(args[0], arrows) + except ovs.db.error.Error, e: sys.stderr.write("%s: %s\n" % (argv0, e.msg)) sys.exit(1)