ovs_cv_dot=yes
else
ovs_cv_dot=no
- fi])])
-
-dnl Check whether to build E-R diagrams.
-AC_DEFUN([OVS_CHECK_ER_DIAGRAMS],
- [AC_REQUIRE([OVS_CHECK_DOT])
- AC_REQUIRE([OVS_CHECK_PYTHON])
- AC_CACHE_CHECK(
- [whether to build E-R diagrams for database],
- [ovs_cv_er_diagrams],
- [if test $ovs_cv_dot != no && test $ovs_cv_python != no; then
- ovs_cv_er_diagrams=yes
- else
- ovs_cv_er_diagrams=no
fi])
- AM_CONDITIONAL([BUILD_ER_DIAGRAMS], [test $ovs_cv_er_diagrams = yes])])
+ AM_CONDITIONAL([HAVE_DOT], [test "$ovs_cv_dot" = yes])])
dnl Checks for pyuic4.
AC_DEFUN([OVS_CHECK_PYUIC4],
mv $@.tmp $@
# vswitch E-R diagram
-if BUILD_ER_DIAGRAMS
-$(srcdir)/vswitchd/vswitch.pic: ovsdb/ovsdb-dot.in ovsdb/dot2pic \
- vswitchd/vswitch.ovsschema
- $(OVSDB_DOT) $(srcdir)/vswitchd/vswitch.ovsschema \
- | dot -T plain \
- | $(srcdir)/ovsdb/dot2pic \
- > $@.tmp
- mv $@.tmp $@
+#
+# There are two complications here. First, if "python" or "dot" is not
+# available, then we have to just use the existing diagram. Second, different
+# "dot" versions produce slightly different output for the same input, but we
+# don't want to gratuitously change vswitch.pic if someone tweaks the schema in
+# some minor way that doesn't affect the table structure. To avoid that we
+# store a checksum of vswitch.gv in vswitch.pic and only regenerate vswitch.pic
+# if vswitch.gv actually changes.
+$(srcdir)/vswitchd/vswitch.gv: ovsdb/ovsdb-dot.in vswitchd/vswitch.ovsschema
+if HAVE_PYTHON
+ $(OVSDB_DOT) $(srcdir)/vswitchd/vswitch.ovsschema > $@
+else
+ touch $@
+endif
+$(srcdir)/vswitchd/vswitch.pic: $(srcdir)/vswitchd/vswitch.gv ovsdb/dot2pic
+if HAVE_DOT
+ sum=`cksum < $(srcdir)/vswitchd/vswitch.gv`; \
+ if grep "$$sum" $@ >/dev/null 2>&1; then \
+ echo "vswitch.gv unchanged, not regenerating vswitch.pic"; \
+ touch $@; \
+ else \
+ echo "regenerating vswitch.pic"; \
+ (echo ".\\\" Generated from vswitch.gv with cksum \"$$sum\""; \
+ dot -T plain < $(srcdir)/vswitchd/vswitch.gv \
+ | $(srcdir)/ovsdb/dot2pic) > $@; \
+ fi
else
-$(srcdir)/vswitchd/vswitch.pic: ovsdb/ovsdb-dot.in vswitchd/vswitch.ovsschema
touch $@
endif
-EXTRA_DIST += vswitchd/vswitch.pic
+EXTRA_DIST += vswitchd/vswitch.gv vswitchd/vswitch.pic
# vswitch schema documentation
EXTRA_DIST += vswitchd/vswitch.xml
--- /dev/null
+digraph Open_vSwitch {
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ Bridge;
+ Bridge -> sFlow [label="sflow"];
+ Bridge -> Mirror [label="mirrors"];
+ Bridge -> Port [label="ports"];
+ Bridge -> Controller [label="controller"];
+ Bridge -> NetFlow [label="netflow"];
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ QoS;
+ QoS -> Queue [label="queues value"];
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ Monitor;
+ Monitor -> Maintenance_Point [label="remote_mps"];
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ sFlow;
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ Open_vSwitch;
+ Open_vSwitch -> Bridge [label="bridges"];
+ Open_vSwitch -> Capability [label="capabilities value"];
+ Open_vSwitch -> SSL [label="ssl"];
+ Open_vSwitch -> Manager [label="manager_options"];
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ Controller;
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ Queue;
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ SSL;
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ Manager;
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ Capability;
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ Mirror;
+ Mirror -> Port [constraint=false, label="select_src_port"];
+ Mirror -> Port [constraint=false, label="output_port"];
+ Mirror -> Port [constraint=false, label="select_dst_port"];
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ Interface;
+ Interface -> Monitor [label="monitor"];
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ NetFlow;
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ Maintenance_Point;
+ size="6.5,4";
+ margin="0";
+ node [shape=box];
+ edge [dir=none, arrowhead=none, arrowtail=none];
+ Port;
+ Port -> QoS [label="qos"];
+ Port -> Interface [label="interfaces"];
+}