Setting tag sliver-openvswitch-2.2.90-1
[sliver-openvswitch.git] / xenserver / etc_xensource_scripts_vif
index fe85205..78434fb 100755 (executable)
@@ -25,16 +25,6 @@ IP="/sbin/ip"
 
 vsctl="/usr/bin/ovs-vsctl"
 
-# XAPI before build 29381 (approximately) did not provide some of the
-# data in XenStore that we rely on.
-. /etc/xensource-inventory
-if test "$PRODUCT_VERSION" = "5.5.0" || test "${BUILD_NUMBER%[a-z]}" -le 26131
-then
-    xs550=true
-else
-    xs550=false
-fi
-
 handle_promiscuous()
 {
     local arg=$(xenstore-read "${PRIVATE}/other-config/promiscuous" 2>/dev/null)
@@ -92,46 +82,22 @@ handle_vswitch_vif_details()
         local vm_uuid=$(xenstore-read "$vm/uuid" 2>/dev/null)
     fi
     if [ -n "${vm_uuid}" ] ; then
-        set_vif_external_id "vm-uuid" "${vm_uuid}"
+        set_vif_external_id "xs-vm-uuid" "${vm_uuid}"
     fi
 
     local vif_uuid=$(xenstore-read "${PRIVATE}/vif-uuid" 2>/dev/null)
-    if $xs550 && [ -z "${vif_uuid}" ] && [ -n "${vm_uuid}" ]; then
-        vif_uuid=$(xe vif-list --minimal vm-uuid="${vm_uuid}" device=$DEVID)
-    fi
     if [ -n "${vif_uuid}" ] ; then
-        set_vif_external_id "vif-uuid" "${vif_uuid}"
+       set_vif_external_id "xs-vif-uuid" "${vif_uuid}"
     fi
 
     local vif_details=
     local net_uuid=$(xenstore-read "${PRIVATE}/network-uuid" 2>/dev/null)
-    if $xs550 && [ -z "${net_uuid}" ] && [ -n "${vif_uuid}" ]; then
-        net_uuid=$(xe vif-param-get uuid="${vif_uuid}" param-name=network-uuid)
-    fi
     if [ -n "${net_uuid}" ] ; then
-        set_vif_external_id "network-uuid" "${net_uuid}"
+       set_vif_external_id "xs-network-uuid" "${net_uuid}"
     fi
-
     local address=$(xenstore-read "/local/domain/$DOMID/device/vif/$DEVID/mac" 2>/dev/null)
     if [ -n "${address}" ] ; then
-        set_vif_external_id "vif-mac" "${address}"
-    fi
-
-    if $xs550; then
-        # vNetManager needs to know the network UUID(s) associated with each
-        # datapath.  Normally interface-reconfigure adds them, but XAPI does
-        # not use interface-reconfigure for internal networks. Instead, XAPI
-        # calls 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 bridge=$1
-        if [ -n "${net_uuid}" ] ; then
-            logger -t scripts-vif "${bridge} network-uuids ${net_uuid}"
-            echo "-- br-set-external-id $bridge network-uuids ${net_uuid}"
-        fi
+        set_vif_external_id "attached-mac" "${address}"
     fi
 }
 
@@ -165,7 +131,7 @@ add_to_bridge()
             local vif_details=$(handle_vswitch_vif_details $bridge)
         fi
 
-        $vsctl -- --if-exists del-port $dev -- add-port $bridge $dev $vif_details
+        $vsctl --timeout=30 -- --if-exists del-port $dev -- add-port $bridge $dev $vif_details
         ;;
     esac
         
@@ -179,14 +145,35 @@ remove_from_bridge()
         # Nothing to do
         ;;
     openvswitch)
-        # If ovs-brcompatd is running, it might already have deleted the
-        # port.  Use --if-exists to suppress the error that would otherwise
-        # arise in that case.
-        $vsctl -- --if-exists del-port $dev
+        $vsctl --timeout=30 -- del-port $dev
         ;;
     esac
 }
 
+call_hook_script() {
+    local domid=$1
+    local action=$2
+    # Call the VIF hotplug hook if present
+    if [ -x /etc/xapi.d/vif-hotplug ]; then
+        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
+            logger -t scripts-vif "VM UUID ${vm_uuid}"
+        fi
+
+        local vif_uuid=$(xenstore-read "${PRIVATE}/vif-uuid" 2>/dev/null)
+        if [ -n "${vif_uuid}" ] ; then
+            logger -t scripts-vif "VIF UUID ${vif_uuid}"
+        fi
+        if [ -n "${vif_uuid}" -a -n "${vm_uuid}" ] ; then
+            logger -t scripts-vif "Calling VIF hotplug hook for VM ${vm_uuid}, VIF ${vif_uuid}"
+            /etc/xapi.d/vif-hotplug -action "${action}" -vifuuid "${vif_uuid}" -vmuuid "${vm_uuid}"
+        fi
+    fi
+}
+
 NETWORK_MODE=$(cat /etc/xensource/network.conf)
 ACTION=$1
 
@@ -208,8 +195,13 @@ esac
 
 case ${TYPE} in
     vif)
-        DOMID=`echo ${XENBUS_PATH} | cut -f 3 -d '/'`
-        DEVID=`echo ${XENBUS_PATH} | cut -f 4 -d '/'`
+        if [ -z ${XENBUS_PATH} ]; then
+            DOMID=$3
+            DEVID=$4
+        else
+            DOMID=`echo ${XENBUS_PATH} | cut -f 3 -d '/'`
+            DEVID=`echo ${XENBUS_PATH} | cut -f 4 -d '/'`
+        fi
         dev=vif${DOMID}.${DEVID}
         ;;
     tap)
@@ -247,6 +239,7 @@ online)
 
         # xs-xen.pq.hq:91e986b8e49f netback-wait-for-hotplug
         xenstore-write "/local/domain/0/backend/vif/${DOMID}/${DEVID}/hotplug-status" "connected"
+        call_hook_script $DOMID "${ACTION}"
     fi
     ;;
 
@@ -259,8 +252,14 @@ add)
 remove)
     if [ "${TYPE}" = "vif" ] ;then
         xenstore-rm "${HOTPLUG}/hotplug"
+        call_hook_script $DOMID "${ACTION}"
     fi
     logger -t scripts-vif "${dev} has been removed"
     remove_from_bridge
     ;;
+
+move)
+    if [ "${TYPE}" = "vif" ] ;then
+        add_to_bridge
+    fi
 esac