Merge master branch into xs5.7.
authorBen Pfaff <blp@nicira.com>
Wed, 18 Nov 2009 22:26:55 +0000 (14:26 -0800)
committerBen Pfaff <blp@nicira.com>
Wed, 18 Nov 2009 22:26:55 +0000 (14:26 -0800)
Conflicts:
xenserver/README
xenserver/automake.mk
xenserver/etc_xensource_scripts_vif
xenserver/usr_share_vswitch_scripts_dump-vif-details
xenserver/vswitch-xen.spec

12 files changed:
xenserver/README
xenserver/automake.mk
xenserver/etc_init.d_vswitch
xenserver/etc_logrotate.d_vswitch
xenserver/etc_udev_xen-backend.rules [new file with mode: 0644]
xenserver/etc_xapi.d_plugins_vswitch-cfg-update
xenserver/etc_xensource_scripts_vif
xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py
xenserver/usr_share_vswitch_scripts_dump-vif-details [deleted file]
xenserver/usr_share_vswitch_scripts_sysconfig.template
xenserver/usr_share_vswitch_scripts_vif-on-internal-bridge [new file with mode: 0755]
xenserver/vswitch-xen.spec

index ff692fd..9240910 100644 (file)
@@ -30,6 +30,10 @@ files are:
         vswitch-related shell functions for the administrator's
         convenience.
 
+    etc_udev_xen-backend.rules
+
+        udev rules for invoking the XenServer "vif" and "tap" scripts.
+
     etc_xapi.d_plugins_vswitch-cfg-update
 
         xapi plugin script to update the cache of configuration items
@@ -44,12 +48,6 @@ files are:
 
         vswitch-aware replacement for Citrix script of the same name.
 
-    root_vswitch_scripts_dump-vif-details
-
-        Script to retrieve extended information about VIFs that are
-        needed by the controller.  This is called by the "vif" script,
-        which is run when virtual interfaces are added and removed.
-
     usr_share_vswitch_scripts_refresh-xs-network-uuids
 
         Script to refresh bridge.<bridge>.xs-network-uuids keys, which
index 221925c..73cc590 100644 (file)
@@ -11,6 +11,7 @@ EXTRA_DIST += \
        xenserver/etc_init.d_vswitch-xapi-update \
        xenserver/etc_logrotate.d_vswitch \
        xenserver/etc_profile.d_vswitch.sh \
+       xenserver/etc_udev_xen-backend.rules \
        xenserver/etc_xapi.d_plugins_vswitch-cfg-update \
        xenserver/etc_xensource_scripts_vif \
        xenserver/opt_xensource_libexec_interface-reconfigure \
@@ -18,6 +19,6 @@ EXTRA_DIST += \
        xenserver/usr_sbin_brctl \
        xenserver/usr_sbin_xen-bugtool \
        xenserver/usr_share_vswitch_scripts_sysconfig.template \
-       xenserver/usr_share_vswitch_scripts_dump-vif-details \
+       xenserver/usr_share_vswitch_scripts_vif-on-internal-bridge \
        xenserver/usr_share_vswitch_scripts_refresh-xs-network-uuids \
        xenserver/vswitch-xen.spec
index bd621c1..8847550 100755 (executable)
@@ -24,8 +24,8 @@
 test -e /etc/sysconfig/vswitch && . /etc/sysconfig/vswitch
 
 # General config variables in /etc/sysconfig/vswitch
-: ${ENABLE_BRCOMPAT:=y}
-: ${ENABLE_FAKE_PROC_NET:=y}
+: ${ENABLE_BRCOMPAT:=n}
+: ${ENABLE_FAKE_PROC_NET:=n}
 : ${FORCE_COREFILES:=y}
 
 # Config variables specific to ovs-vswitchd
@@ -89,7 +89,7 @@ function insert_modules_if_required {
         action "Inserting llc module" modprobe llc
         action "Inserting openvswitch module" modprobe openvswitch_mod
     fi
-    if [ -n "$BRCOMPATD_PIDFILE" ] && ! lsmod | grep -q "brcompat_mod"; then
+    if [ "$ENABLE_BRCOMPAT" = "y" ] && [ -n "$BRCOMPATD_PIDFILE" ] && ! lsmod | grep -q "brcompat_mod"; then
         action "Inserting brcompat module" modprobe brcompat_mod
     fi
 }
@@ -273,7 +273,9 @@ function start {
     fi
 
     start_vswitchd
-    start_brcompatd
+    if [ "${ENABLE_BRCOMPAT}" = "y" ] ; then
+        start_brcompatd
+    fi
     reload_vswitchd  # ensures ovs-vswitchd has fully read config file.
     touch /var/lock/subsys/vswitch
 }
@@ -315,7 +317,12 @@ case "$1" in
         ;;
     status)
         status -p ovs-vswitchd.pid ovs-vswitchd
-        status -p ovs-brcompatd.pid ovs-brcompatd
+        rc=$?
+        if [ $rc -eq 0 ] && [ "$ENABLE_BRCOMPAT" = "y" ] ; then
+            status -p ovs-brcompatd.pid ovs-brcompatd
+            rc=$?
+        fi
+        exit $rc
         ;;
     version)
         /usr/sbin/ovs-vswitchd -V
index 6366c67..3186e10 100644 (file)
@@ -7,6 +7,7 @@
 
 /var/log/ovs-vswitchd.log /var/log/ovs-brcompatd.log {
        sharedscripts
+       missingok
        postrotate
        # Tell ovs-vswitchd and ovs-brcompatd to reopen their log files
        /sbin/service vswitch reload
diff --git a/xenserver/etc_udev_xen-backend.rules b/xenserver/etc_udev_xen-backend.rules
new file mode 100644 (file)
index 0000000..a67e868
--- /dev/null
@@ -0,0 +1,10 @@
+SUBSYSTEM=="xen-backend", KERNEL=="tap*", RUN+="/etc/xensource/scripts/tap $env{ACTION}"
+SUBSYSTEM=="xen-backend", KERNEL=="vbd*", RUN+="/etc/xensource/scripts/block $env{ACTION}"
+
+SUBSYSTEM=="xen-backend", KERNEL=="vif*", RUN+="/etc/xensource/scripts/vif $env{ACTION} vif"
+SUBSYSTEM=="net",         KERNEL=="tap*", RUN+="/etc/xensource/scripts/vif $env{ACTION} tap"
+
+KERNEL=="evtchn", NAME="xen/%k"
+
+# blktap devices created by blktapctrl
+KERNEL=="blktap[0-9]*", OPTIONS="ignore_device"
index 7472d1b..4db8cc3 100755 (executable)
@@ -47,7 +47,7 @@ def update(session, args):
         raise XenAPIPlugin.Failure("MORE_THAN_ONE_POOL_FOR_HOST", [])
     pool = session.xenapi.pool.get_record(pools[0])
     try:
-        controller = pool["other_config"]["vSwitchController"]
+        controller = pool["vswitch_controller"]
     except KeyError, e:
         controller = ""
     currentController = vswitchCurrentController()
index c649e92..cede29c 100755 (executable)
@@ -25,24 +25,15 @@ cfg_mod="/usr/bin/ovs-cfg-mod"
 vsctl="/usr/bin/ovs-vsctl"
 dump_vif_details="/usr/share/vswitch/scripts/dump-vif-details"
 service="/sbin/service"
-
-TYPE=`echo ${XENBUS_PATH} | cut -f 2 -d '/'`
-DOMID=`echo ${XENBUS_PATH} | cut -f 3 -d '/'`
-DEVID=`echo ${XENBUS_PATH} | cut -f 4 -d '/'`
-
-XAPI=/xapi/${DOMID}/hotplug/${TYPE}/${DEVID}
-HOTPLUG=/xapi/${DOMID}/hotplug/${TYPE}/${DEVID}
-PRIVATE=/xapi/${DOMID}/private/${TYPE}/${DEVID}
-BRCTL=/usr/sbin/brctl
-IP=/sbin/ip
-
+IP="/sbin/ip"
+vif_on_internal_bridge="/usr/share/vswitch/scripts/vif-on-internal-bridge"
 
 handle_promiscuous()
 {
-    local arg=$(xenstore-read "${PRIVATE}/other-config/promiscuous")
+    local arg=$(xenstore-read "${PRIVATE}/other-config/promiscuous" 2>/dev/null)
     if [ $? -eq 0 -a -n "${arg}" ] ; then
         case "${arg}" in 
-            true|on) logger -t script-vif "${vif}: Promiscuous ports are not supported via vSwitch." ;;
+            true|on) logger -t script-vif "${dev}: Promiscuous ports are not supported via vSwitch." ;;
             *) ;;
         esac
     fi
@@ -51,35 +42,86 @@ handle_promiscuous()
 handle_ethtool()
 {
     local opt=$1
-    local arg=$(xenstore-read "${PRIVATE}/other-config/ethtool-${opt}")
+    local arg=$(xenstore-read "${PRIVATE}/other-config/ethtool-${opt}" 2>/dev/null)
     if [ $? -eq 0 -a -n "${arg}" ] ; then
         case "${arg}" in
-            true|on)   /sbin/ethtool -K "${vif}" "${opt}" on ;;
-            false|off) /sbin/ethtool -K "${vif}" "${opt}" off ;;
-            *) logger -t scripts-vif "Unknown ethtool argument ${opt}=${arg} on ${vif}/${VIFUUID}" ;;
+            true|on)   /sbin/ethtool -K "${dev}" "${opt}" on ;;
+            false|off) /sbin/ethtool -K "${dev}" "${opt}" off ;;
+            *) logger -t scripts-vif "Unknown ethtool argument ${opt}=${arg} on ${dev}/${VIFUUID}" ;;
         esac
     fi
 }
 
 handle_mtu()
 {
-    local mtu=$(xenstore-read "${PRIVATE}/MTU")
+    local mtu=$(xenstore-read "${PRIVATE}/MTU" 2>/dev/null)
     if [ $? -eq 0 -a -n "${mtu}" ]; then
-       echo "${mtu}" > /sys/class/net/${vif}/mtu
+       echo "${mtu}" > /sys/class/net/${dev}/mtu
     fi
 }
 
+handle_vif_details()
+{
+    local vif_details=
+    local net_uuid=$(xenstore-read "${PRIVATE}/network-uuid" 2>/dev/null)
+    if [ -n "${net_uuid}" ] ; then
+       vif_details="$vif_details --add=port.${dev}.net-uuid=${net_uuid}"
+    fi
+
+    local address=$(xenstore-read "/local/domain/$DOMID/device/vif/$DEVID/mac" 2>/dev/null)
+    if [ -n "${address}" ] ; then
+       vif_details="$vif_details --add=port.${dev}.vif-mac=${address}"
+    fi
+
+    local vif_uuid=$(xenstore-read "${PRIVATE}/vif-uuid" 2>/dev/null)
+    if [ -n "${vif_uuid}" ] ; then
+       vif_details="$vif_details --add=port.${dev}.vif-uuid=${vif_uuid}"
+    fi
+
+    local vm=$(xenstore-read "/local/domain/$DOMID/vm" 2>/dev/null)
+    if [ $? -eq 0 -a -n "${vm}" ] ; then
+       local vm_uuid=$(xenstore-read "$vm/uuid" 2>/dev/null)
+    fi
+    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}
+}
+
 add_to_bridge()
 {
     local address=$(xenstore-read "${PRIVATE}/bridge-MAC")
     if [ $? -ne 0 -o -z "${address}" ]; then
        logger -t scripts-vif "Failed to read ${PRIVATE}/bridge-MAC from xenstore"
+       exit 1
     fi
     local bridge=$(xenstore-read "${PRIVATE}/bridge")
     if [ $? -ne 0 -o -z "${bridge}" ]; then
        logger -t scripts-vif "Failed to read ${PRIVATE}/bridge from xenstore"
+       exit 1
     fi
-    logger -t scripts-vif "Adding ${vif} to ${bridge} with address ${address}"
+    logger -t scripts-vif "Adding ${dev} to ${bridge} with address ${address}"
 
     local VLAN_ID=$($vsctl br-to-vlan $bridge)
     local vid=
@@ -88,59 +130,90 @@ add_to_bridge()
        vid="--add=vlan.${vif}.tag=${VLAN_ID}"
     fi
 
-    ${IP} link set "${vif}" down                        || logger -t scripts-vif "Failed to ip link set ${vif} down"
-    ${IP} link set "${vif}" arp off                     || logger -t scripts-vif "Failed to ip link set ${vif} arp off"
-    ${IP} link set "${vif}" multicast off               || logger -t scripts-vif "Failed to ip link set ${vif} multicast off"
-    ${IP} link set "${vif}" address "${address}"        || logger -t scripts-vif "Failed to ip link set ${vif} address ${address}"
-    ${IP} addr flush "${vif}"                           || logger -t scripts-vif "Failed to ip addr flush ${vif}"
-
-    local vif_details=$($dump_vif_details $DOMID $DEVID)
-    if [ $? -ne 0 -o -z "${vif_details}" ]; then
-           logger -t scripts-vif "Failed to retrieve vif details for vswitch"
+    if [ "$type" = "vif" ] ; then
+       local vif_details=$(handle_vif_details)
     fi
 
+    ${IP} link set "${dev}" down                        || logger -t scripts-vif "Failed to ip link set ${dev} down"
+    ${IP} link set "${dev}" arp off                     || logger -t scripts-vif "Failed to ip link set ${dev} arp off"
+    ${IP} link set "${dev}" multicast off               || logger -t scripts-vif "Failed to ip link set ${dev} multicast off"
+    ${IP} link set "${dev}" address "${address}"        || logger -t scripts-vif "Failed to ip link set ${dev} address ${address}"
+    ${IP} addr flush "${dev}"                           || logger -t scripts-vif "Failed to ip addr flush ${dev}"
+
     $cfg_mod -F /etc/ovs-vswitchd.conf \
-        --del-match="bridge.*.port=$vif" \
-        --del-match="vlan.$vif.trunks=*" \
-        --del-match="vlan.$vif.tag=*" \
-        --del-match="port.$vif.[!0-9]*" \
-        --add="bridge.$bridge.port=$vif" \
+        --del-match="bridge.*.port=${dev}" \
+        --del-match="vlan.${dev}.trunks=*" \
+        --del-match="vlan.${dev}.tags=*" \
+        --del-match="port.${dev}.[!0-9]*" \
+        --add="bridge.$bridge.port=${dev}" \
         $vid $vif_details -c 
     $service vswitch reload
 
-    ${IP} link set "${vif}" up                          || logger -t scripts-vif "Failed to ip link set ${vif} up"
+    ${IP} link set "${dev}" up                          || logger -t scripts-vif "Failed to ip link set ${dev} up"
 }
 
-echo Called as "$@" "$TYPE" "$DOMID" "$DEVID" | logger -t scripts-vif
-case "$1" in
-online)
-       handle_ethtool rx
-       handle_ethtool tx
-       handle_ethtool sg
-       handle_ethtool tso
-       handle_ethtool ufo
-       handle_ethtool gso
+type=$2
 
-       handle_mtu
-       add_to_bridge
-       handle_promiscuous
+case ${type} in
+    vif)
+       DOMID=`echo ${XENBUS_PATH} | cut -f 3 -d '/'`
+       DEVID=`echo ${XENBUS_PATH} | cut -f 4 -d '/'`
+       dev=vif${DOMID}.${DEVID}
+       ;;
+    tap)
+       dev=$INTERFACE
+       DOMID=`echo ${dev#tap} | cut -f 1 -d '.'`
+       DEVID=`echo ${dev#tap} | cut -f 2 -d '.'`
+       ;;
+    *)  
+       logger -t scripts-vif "unknown interface type ${type}"
+       exit 1
+       ;;
+esac
 
-       xenstore-write "${HOTPLUG}/vif" "${vif}"
-       xenstore-write "${HOTPLUG}/hotplug" "online"
+XAPI=/xapi/${DOMID}/hotplug/vif/${DEVID}
+HOTPLUG=/xapi/${DOMID}/hotplug/vif/${DEVID}
+PRIVATE=/xapi/${DOMID}/private/vif/${DEVID}
 
-       # xs-xen.pq.hq:91e986b8e49f netback-wait-for-hotplug
-       xenstore-write "/local/domain/0/backend/vif/${DOMID}/${DEVID}/hotplug-status" "connected"
+echo Called as "$@" "$DOMID" "$DEVID" | logger -t scripts-vif
+case "$1" in
+online)
+       if [ "${type}" = "vif" ] ; then
+           handle_ethtool rx
+           handle_ethtool tx
+           handle_ethtool sg
+           handle_ethtool tso
+           handle_ethtool ufo
+           handle_ethtool gso
+
+           handle_mtu
+           add_to_bridge
+           handle_promiscuous
+
+           xenstore-write "${HOTPLUG}/vif" "${dev}"
+           xenstore-write "${HOTPLUG}/hotplug" "online"
+
+           # xs-xen.pq.hq:91e986b8e49f netback-wait-for-hotplug
+           xenstore-write "/local/domain/0/backend/vif/${DOMID}/${DEVID}/hotplug-status" "connected"
+       fi
+       ;;
 
+add)
+       if [ "${type}" = "tap" ] ; then
+           add_to_bridge
+       fi
        ;;
+
 remove)
-       xenstore-rm "${HOTPLUG}/hotplug"
-       vif=vif${DOMID}.${DEVID}
-       logger -t scripts-vif "${vif} has been removed"
+       if [ "${type}" = "vif" ] ;then
+           xenstore-rm "${HOTPLUG}/hotplug"
+       fi
+       logger -t scripts-vif "${dev} has been removed"
        $cfg_mod -vANY:console:emer -F /etc/ovs-vswitchd.conf \
-           --del-match="bridge.*.port=${vif}" \
-           --del-match="vlan.${vif}.trunks=*" \
-           --del-match="vlan.${vif}.tag=*" \
-           --del-match="port.${vif}.[!0-9]*" -c
+           --del-match="bridge.*.port=${dev}" \
+           --del-match="vlan.${dev}.trunks=*" \
+           --del-match="vlan.${dev}.tag=*" \
+           --del-match="port.${dev}.[!0-9]*" -c
        $service vswitch reload
        ;;
 esac
index 31a48c3..fb3e6b0 100644 (file)
@@ -102,7 +102,7 @@ class VSwitchControllerDialogue(Dialogue):
         self.hostsUpdated = 0
         pool = data.GetPoolForThisHost()
         if pool is not None:
-            self.controller = pool.get("other_config", {}).get("vSwitchController", "")
+            self.controller = pool.get("vswitch_controller", "")
         else:
             self.controller = ""
 
@@ -111,8 +111,6 @@ class VSwitchControllerDialogue(Dialogue):
                       lambda: self.getController()),
             ChoiceDef(Lang("Delete pool-wide controller"),
                       lambda: self.deleteController()),
-            ChoiceDef(Lang("Resync server controller config"),
-                      lambda: self.syncController()),
 #             ChoiceDef(Lang("Restart ovs-vswitchd"),
 #                       lambda: self.restartService("vswitch")),
 #             ChoiceDef(Lang("Restart ovs-brcompatd"),
@@ -211,56 +209,26 @@ class VSwitchControllerDialogue(Dialogue):
         except Exception, e:
             Layout.Inst().PushDialogue(InfoDialogue(Lang("Controller deletion failed")))
 
-    def syncController(self):
-        Layout.Inst().PopDialogue()
-        Layout.Inst().TransientBanner(Lang("Resyncing controller setting..."))
-        try:
-            Task.Sync(lambda s: self._updateThisServer(s))
-            Layout.Inst().PushDialogue(InfoDialogue(Lang("Resyncing controller config successful")))
-        except Exception, e:
-            Layout.Inst().PushDialogue(InfoDialogue(Lang("Resyncing controller config failed")))
-
     def SetController(self, ip):
         self.hostsInPool = 0
         self.hostsUpdated = 0
-        Task.Sync(lambda s: self._modifyPoolConfig(s, "vSwitchController", ip))
-        # Should be done asynchronously, maybe with an external script?
-        Task.Sync(lambda s: self._updateActiveServers(s))
+        Task.Sync(lambda s: self._modifyPoolConfig(s, ip or ""))
 
-    def _modifyPoolConfig(self, session, key, value):
+    def _modifyPoolConfig(self, session, value):
         """Modify pool configuration.
 
-        If value == None then delete key, otherwise set key to value."""
+        If value == None then delete configuration, otherwise set to value."""
         pools = session.xenapi.pool.get_all()
         # We assume there is only ever one pool...
         if len(pools) == 0:
-            log.error("No pool for host.")
-            raise XenAPIPlugin.Failure("NO_POOL_FOR_HOST", [])
+            XSLogFatal(Lang("No pool found for host."))
+            return
         if len(pools) > 1:
-            log.error("More than one pool for host.")
-            raise XenAPIPlugin.Failure("MORE_THAN_ONE_POOL_FOR_HOST", [])
-        session.xenapi.pool.remove_from_other_config(pools[0], key)
-        if value != None:
-            session.xenapi.pool.add_to_other_config(pools[0], key, value)
+            XSLogFatal(Lang("More than one pool for host."))
+            return
+        session.xenapi.pool.set_vswitch_controller(value)
         Data.Inst().Update()
 
-    def _updateActiveServers(self, session):
-        hosts = session.xenapi.host.get_all()
-        self.hostsUpdated = 0
-        self.hostsInPool = len(hosts)
-        self.UpdateFields()
-        for host in hosts:
-            Layout.Inst().TransientBanner("Updating host %d out of %d" 
-                    % (self.hostsUpdated + 1, self.hostsInPool))
-            session.xenapi.host.call_plugin(host, "vswitch-cfg-update", "update", {})
-            self.hostsUpdated = self.hostsUpdated + 1
-
-    def _updateThisServer(self, session):
-        data = Data.Inst()
-        host = data.host.opaqueref()
-        session.xenapi.host.call_plugin(host, "vswitch-cfg-update", "update", {})
-
-
 class XSFeatureVSwitch:
 
     @classmethod
@@ -278,7 +246,7 @@ class XSFeatureVSwitch:
 
         pool = data.GetPoolForThisHost()
         if pool is not None:
-            dbController = pool.get("other_config", {}).get("vSwitchController", "")
+            dbController = pool.get("vswitch_controller", "")
         else:
             dbController = ""
 
@@ -295,8 +263,8 @@ class XSFeatureVSwitch:
         inPane.NewLine()
         inPane.AddStatusField(Lang("ovs-vswitchd status", 20),
                               VSwitchService.Inst("vswitch", "ovs-vswitchd").status())
-        inPane.AddStatusField(Lang("ovs-brcompatd status", 20),
-                              VSwitchService.Inst("vswitch", "ovs-brcompatd").status())
+        #inPane.AddStatusField(Lang("ovs-brcompatd status", 20),
+        #                      VSwitchService.Inst("vswitch", "ovs-brcompatd").status())
 
         inPane.AddKeyHelpField( {
             Lang("<Enter>") : Lang("Reconfigure"),
@@ -320,5 +288,6 @@ class XSFeatureVSwitch:
             }
         )
 
-# Register this plugin when module is imported
-XSFeatureVSwitch().Register()
+# Register this plugin when module is imported, IFF vswitchd is running
+if os.path.exists('/var/run/ovs-vswitchd.pid'):
+    XSFeatureVSwitch().Register()
diff --git a/xenserver/usr_share_vswitch_scripts_dump-vif-details b/xenserver/usr_share_vswitch_scripts_dump-vif-details
deleted file mode 100755 (executable)
index 7ce8bf7..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/usr/bin/python
-#
-# Script to retrieve extended information about VIFs that are
-# needed by the controller.  This is called by the "vif" script,
-# which is run when virtual interfaces are added and removed.
-
-# 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):
-       vif_info = []
-       session = XenAPI.xapi_local()
-       session.xenapi.login_with_password("root", "")
-       try: 
-               vif_rec = session.xenapi.VIF.get_record(vif_ref)
-               net_rec = session.xenapi.network.get_record(vif_rec["network"])
-               vm_uuid = session.xenapi.VM.get_uuid(vif_rec["VM"])
-
-               # Data to allow vNetManager to associate VIFs with xapi data
-               add_port = '--add=port.vif%s.%s' % (domid, devid)
-               vif_info.append('%s.net-uuid=%s' % (add_port, net_rec["uuid"]))
-               vif_info.append('%s.vif-mac=%s' % (add_port, vif_rec["MAC"]))
-               vif_info.append('%s.vif-uuid=%s' % (add_port, vif_rec["uuid"]))
-               vif_info.append('%s.vm-uuid=%s' % (add_port, vm_uuid))
-
-               # 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.
-               if not net_rec['PIFs']:
-                       key = 'bridge.%s.xs-network-uuids' % net_rec['bridge']
-                       value = net_rec['uuid']
-                       vif_info.append('--del-match=%s=*' % key)
-                       vif_info.append('--add=%s=%s' % (key, value))
-       finally:
-               session.xenapi.session.logout()
-       print ' '.join(vif_info)
-       
-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)
index 3209477..2b3f8e7 100644 (file)
@@ -9,13 +9,13 @@
 
 # ENABLE_BRCOMPAT: If 'y' than emulate linux bridging interfaces
 #    using the brcompat kernel module and ovs-brcompatd daemon
-# ENABLE_BRCOMPAT=y
+# ENABLE_BRCOMPAT=n
 
 # ENABLE_FAKE_PROC_NET: If 'y' then emulate linux bonding and vlan
 #    files in /proc as if the bonding and vlan demultiplexing done in
 #    ovs-vswitchd were being implemented using existing Linux mechanisms.
 #    This is useful in some cases when replacing existing solutions.
-# ENABLE_FAKE_PROC_NET=y
+# ENABLE_FAKE_PROC_NET=n
 
 # FORCE_COREFILES: If 'y' then core files will be enabled.
 # FORCE_COREFILES=y
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 (executable)
index 0000000..dd1ee6a
--- /dev/null
@@ -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)
+
index d8e32e4..e177f37 100644 (file)
@@ -71,8 +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_dump-vif-details \
-               $RPM_BUILD_ROOT/usr/share/vswitch/scripts/dump-vif-details
+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_share_vswitch_scripts_refresh-xs-network-uuids \
                $RPM_BUILD_ROOT/usr/share/vswitch/scripts/refresh-xs-network-uuids
 install -m 755 xenserver/usr_sbin_xen-bugtool \
@@ -81,6 +81,8 @@ install -m 755 xenserver/usr_sbin_brctl \
              $RPM_BUILD_ROOT/usr/share/vswitch/scripts/brctl
 install -m 755 xenserver/usr_share_vswitch_scripts_sysconfig.template \
          $RPM_BUILD_ROOT/usr/share/vswitch/scripts/sysconfig.template
+install -m 644 xenserver/etc_udev_xen-backend.rules \
+        $RPM_BUILD_ROOT/usr/share/vswitch/scripts/xen-backend.rules
 install -m 644 \
         xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py \
                $RPM_BUILD_ROOT/usr/share/vswitch/scripts/XSFeatureVSwitch.py
@@ -123,6 +125,7 @@ ca141d60061dcfdade73e75abc6529b5  /usr/sbin/brctl
 b8e9835862ef1a9cec2a3f477d26c989  /etc/xensource/scripts/vif
 51970ad613a3996d5997e18e44db47da  /opt/xensource/libexec/interface-reconfigure
 5654c8c36699fcc8744ca9cd5b855414  /usr/sbin/xen-bugtool
+883820a78723ee21340f31099b18f18e  /etc/udev/xen-backend.rules
 EOF
     then
         printf "\nVerified host scripts from XenServer 5.5.0.\n\n"
@@ -131,6 +134,7 @@ ca141d60061dcfdade73e75abc6529b5  /usr/sbin/brctl
 b8e9835862ef1a9cec2a3f477d26c989  /etc/xensource/scripts/vif
 ce451d3c985fd1db6497a363f0d9dedb  /opt/xensource/libexec/interface-reconfigure
 2b53f500431fcba5276c896e9e4281b9  /usr/sbin/xen-bugtool
+883820a78723ee21340f31099b18f18e  /etc/udev/xen-backend.rules
 EOF
     then
         printf "\nVerified host scripts from XenServer 5.5.900.\n\n"
@@ -211,7 +215,8 @@ for f in \
     /opt/xensource/libexec/interface-reconfigure \
     /etc/xensource/scripts/vif \
     /usr/sbin/xen-bugtool \
-    /usr/sbin/brctl
+    /usr/sbin/brctl \
+    /etc/udev/xen-backend.rules
 do
     s=$(basename "$f")
     t=$(readlink "$f")
@@ -270,7 +275,8 @@ if [ "$1" = "0" ]; then     # $1 = 1 for upgrade
         /opt/xensource/libexec/interface-reconfigure \
         /etc/xensource/scripts/vif \
         /usr/sbin/xen-bugtool \
-        /usr/sbin/brctl
+        /usr/sbin/brctl \
+        /etc/udev/xen-backend.rules
     do
         s=$(basename "$f")
         if [ ! -f "/usr/lib/vswitch/xs-original/$s" ]; then
@@ -305,7 +311,6 @@ fi
 /etc/profile.d/vswitch.sh
 /lib/modules/%{xen_version}/kernel/net/vswitch/openvswitch_mod.ko
 /lib/modules/%{xen_version}/kernel/net/vswitch/brcompat_mod.ko
-/usr/share/vswitch/scripts/dump-vif-details
 /usr/share/vswitch/scripts/refresh-xs-network-uuids
 /usr/share/vswitch/scripts/interface-reconfigure
 /usr/share/vswitch/scripts/vif
@@ -313,6 +318,8 @@ 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
 # isn't an obvious place to get rid of them since they are generated