meta-flow: Correctly set destination MAC in mf_set_flow_value().
[sliver-openvswitch.git] / ovsdb / ovsdb-dot.in
index 3a9d9b0..85c126d 100755 (executable)
@@ -1,6 +1,8 @@
 #! @PYTHON@
 
 from datetime import date
+import ovs.db.error
+import ovs.db.schema
 import getopt
 import os
 import re
@@ -8,32 +10,54 @@ import sys
 
 argv0 = sys.argv[0]
 
-def printEdge(tableName, baseType, label):
-    if baseType.refTable:
+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
-        if baseType.refType == 'weak':
+        options['label'] = '"%s%s"' % (label, arity)
+        if baseType.ref_type == 'weak':
             options['constraint'] = 'false'
+            options['style'] = 'dotted'
         print "\t%s -> %s [%s];" % (
             tableName,
-            baseType.refTable,
+            baseType.ref_table_name,
             ', '.join(['%s=%s' % (k,v) for k,v in options.items()]))
 
 def schemaToDot(schemaFile):
-    schema = DbSchema.fromJson(ovs.json.from_file(schemaFile))
+    schema = ovs.db.schema.DbSchema.from_json(ovs.json.from_file(schemaFile))
 
     print "digraph %s {" % schema.name
+    print '\tsize="6.5,4";'
+    print '\tmargin="0";'
+    print "\tnode [shape=box];"
+    print "\tedge [dir=none, arrowhead=none, arrowtail=none];"
     for tableName, table in schema.tables.iteritems():
-        print '\tsize="6.5,4";'
-        print '\tmargin="0";'
-        print "\tnode [shape=box];"
-        print "\t%s;" % tableName
+        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():
@@ -65,15 +89,15 @@ if __name__ == "__main__":
                 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])
-        
-    except Error, e:
+
+    except ovs.db.error.Error, e:
         sys.stderr.write("%s: %s\n" % (argv0, e.msg))
         sys.exit(1)