[ovs-dev] [PATCH] xenserver: Set network-uuid for internal bridges

Justin Pettit jpettit at nicira.com
Wed Oct 28 18:16:55 UTC 2009


The "citrix" branch contains a script called dump-vif-details that would
write detailed information about the vifs into ovs-vswitchd.conf.
Additionally, it would add the network-uuid information for internal
bridges, since the interface-reconfigure script that normally takes care
of this is not called on internal bridges.  The Midnight Ride release
no longer needs to call dump-vif-details, but the functionality to write
the network-uuid for internal bridges was not put elsewhere.  This
commit addresses that.

It introduces the vif-on-internal-bridge script, which is a hack until a
more appropriate method, such XAPI writing out the information to
xenstore, becomes available.

Bug #2208
---
 xenserver/automake.mk                              |    1 +
 xenserver/etc_xensource_scripts_vif                |   22 ++++++++
 ...sr_share_vswitch_scripts_vif-on-internal-bridge |   56 ++++++++++++++++++++
 xenserver/vswitch-xen.spec                         |    3 +
 4 files changed, 82 insertions(+), 0 deletions(-)
 create mode 100755 xenserver/usr_share_vswitch_scripts_vif-on-internal-bridge

diff --git a/xenserver/automake.mk b/xenserver/automake.mk
index 691d379..be0530e 100644
--- a/xenserver/automake.mk
+++ b/xenserver/automake.mk
@@ -19,4 +19,5 @@ EXTRA_DIST += \
 	xenserver/usr_sbin_brctl \
 	xenserver/usr_sbin_xen-bugtool \
 	xenserver/usr_share_vswitch_scripts_sysconfig.template \
+	xenserver/usr_share_vswitch_scripts_vif-on-internal-bridge \
 	xenserver/vswitch-xen.spec
diff --git a/xenserver/etc_xensource_scripts_vif b/xenserver/etc_xensource_scripts_vif
index 033e001..fcb86de 100755
--- a/xenserver/etc_xensource_scripts_vif
+++ b/xenserver/etc_xensource_scripts_vif
@@ -16,6 +16,7 @@ vsctl="/usr/bin/ovs-vsctl"
 dump_vif_details="/usr/share/vswitch/scripts/dump-vif-details"
 service="/sbin/service"
 IP="/sbin/ip"
+vif_on_internal_bridge="/usr/share/vswitch/scripts/vif-on-internal-bridge"
 
 handle_promiscuous()
 {
@@ -74,6 +75,27 @@ handle_vif_details()
     if [ -n "${vm_uuid}" ] ; then
 	vif_details="$vif_details --add=port.${dev}.vm-uuid=${vm_uuid}"
     fi
+
+    # vNetManager needs to know the network UUID(s) associated with
+    # each datapath.  Normally interface-reconfigure adds them, but
+    # interface-reconfigure never gets called for internal networks
+    # (xapi does the addbr ioctl internally), so we have to do it
+    # here instead for internal networks.  This is only acceptable
+    # because xapi is lazy about creating internal networks: it
+    # only creates one just before it adds the first vif to it.
+    # There may still be a brief delay between the initial
+    # ovs-vswitchd connection to vNetManager and setting this
+    # configuration variable, but vNetManager can tolerate that.
+    local internal=$(${vif_on_internal_bridge} ${DOMID} ${DEVID})
+    if [ $internal = "true" ]; then
+        local bridge=$(xenstore-read "${PRIVATE}/bridge" 2>/dev/null)
+        local net_uuid=$(xenstore-read "${PRIVATE}/network-uuid" 2>/dev/null)
+        local key="bridge.${bridge}.xs-network-uuids"
+
+        vif_details="$vif_details --del-match=${key}=*"
+        vif_details="$vif_details --add=${key}=${net_uuid}"
+    fi
+
     echo ${vif_details}
 }
 
diff --git a/xenserver/usr_share_vswitch_scripts_vif-on-internal-bridge b/xenserver/usr_share_vswitch_scripts_vif-on-internal-bridge
new file mode 100755
index 0000000..dd1ee6a
--- /dev/null
+++ b/xenserver/usr_share_vswitch_scripts_vif-on-internal-bridge
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+#
+# Script to determine whether a vif is on an internal bridge 
+
+# Copyright (C) 2009 Nicira Networks, Inc.
+#
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved.  This file is offered as-is,
+# without warranty of any kind.
+
+import sys
+import XenAPI
+import xen.lowlevel.xs
+
+# Query XenStore for the opaque reference of this vif
+def get_vif_ref(domid, devid):
+    xenstore = xen.lowlevel.xs.xs()
+    t = xenstore.transaction_start()
+    vif_ref = xenstore.read(t, '/xapi/%s/private/vif/%s/ref' % (domid, devid))
+    xenstore.transaction_end(t)
+    return vif_ref
+
+# Query XAPI for the information we need using the vif's opaque reference
+def dump_vif_info(domid, devid, vif_ref):
+    try:
+        session = XenAPI.xapi_local()
+        session.xenapi.login_with_password("root", "")
+        vif_rec = session.xenapi.VIF.get_record(vif_ref)
+        net_rec = session.xenapi.network.get_record(vif_rec["network"])
+
+        if len(net_rec['PIFs']) == 0:
+            sys.stdout.write("true\n")
+        else:
+            sys.stdout.write("false\n")
+       
+    finally:
+        session.xenapi.session.logout()
+
+if __name__ == '__main__':
+    if (len(sys.argv) != 3):
+        sys.stderr.write("ERROR: %s <domid> <devid>\n" % sys.argv[0])
+        sys.exit(1)
+
+    domid = sys.argv[1]
+    devid = sys.argv[2]
+
+    vif_ref = get_vif_ref(domid, devid)
+    if not vif_ref:
+        sys.stderr.write("ERROR: Could not find interface vif%s.%s\n"
+                % (domid, devid))
+        sys.exit(1)
+
+    dump_vif_info(domid, devid, vif_ref)
+    sys.exit(0)
+
diff --git a/xenserver/vswitch-xen.spec b/xenserver/vswitch-xen.spec
index 63996d1..9492011 100644
--- a/xenserver/vswitch-xen.spec
+++ b/xenserver/vswitch-xen.spec
@@ -71,6 +71,8 @@ install -m 755 xenserver/opt_xensource_libexec_interface-reconfigure \
              $RPM_BUILD_ROOT/usr/share/vswitch/scripts/interface-reconfigure
 install -m 755 xenserver/etc_xensource_scripts_vif \
              $RPM_BUILD_ROOT/usr/share/vswitch/scripts/vif
+install -m 755 xenserver/usr_share_vswitch_scripts_vif-on-internal-bridge \
+             $RPM_BUILD_ROOT/usr/share/vswitch/scripts/vif-on-internal-bridge
 install -m 755 xenserver/usr_sbin_xen-bugtool \
              $RPM_BUILD_ROOT/usr/share/vswitch/scripts/xen-bugtool
 install -m 755 xenserver/usr_sbin_brctl \
@@ -313,6 +315,7 @@ fi
 /usr/share/vswitch/scripts/XSFeatureVSwitch.py
 /usr/share/vswitch/scripts/brctl
 /usr/share/vswitch/scripts/sysconfig.template
+/usr/share/vswitch/scripts/vif-on-internal-bridge
 /usr/share/vswitch/scripts/xen-backend.rules
 # Following two files are generated automatically by rpm.  We don't
 # really need them and they won't be used on the XenServer, but there
-- 
1.6.4





More information about the dev mailing list