(2.9) Refactor NIC configuration scripts
authorDimitris Aragiorgis <dimara@grnet.gr>
Wed, 26 Jun 2013 14:38:16 +0000 (17:38 +0300)
committerDimitris Aragiorgis <dimara@grnet.gr>
Tue, 17 Dec 2013 10:46:26 +0000 (12:46 +0200)
Add new script vif-ganeti that could be used instead of
default vif-bridge in order NIC customization can be more
flexible.

Extract common code from kvm-ifup and insert it in a new
file net-common that is being sourced by kvm-ifup and
vif-ganeti and located under package lib dir (/usr/lib/ganeti/).

Install vif-ganeti properly with make under /usr/lib/ganeti too.

Signed-off-by: Dimitris Aragiorgis <dimara@grnet.gr>
Signed-off-by: Thomas Thrainer <thomasth@google.com>
Reviewed-by: Thomas Thrainer <thomasth@google.com>

.gitignore
Makefile.am
tools/kvm-ifup.in
tools/net-common.in [new file with mode: 0644]
tools/vif-ganeti.in [new file with mode: 0755]

index eb953d3..fdd50d7 100644 (file)
 /tools/ensure-dirs
 /tools/users-setup
 /tools/vcluster-setup
+/tools/vif-ganeti
+/tools/net-common
 /tools/node-cleanup
 /tools/node-daemon-setup
 /tools/prepare-node-join
index e060963..2f4051d 100644 (file)
@@ -195,6 +195,8 @@ CLEANFILES = \
        $(man_MANS) \
        $(manhtml) \
        tools/kvm-ifup \
+       tools/vif-ganeti \
+       tools/net-common \
        tools/users-setup \
        tools/vcluster-setup \
        stamp-directories \
@@ -937,6 +939,8 @@ nodist_pkglib_python_scripts = \
 myexeclib_SCRIPTS = \
        daemons/daemon-util \
        tools/kvm-ifup \
+       tools/vif-ganeti \
+       tools/net-common \
        $(pkglib_python_scripts) \
        $(HS_MYEXECLIB_PROGS)
 
@@ -972,6 +976,8 @@ EXTRA_DIST = \
        devel/upload \
        devel/webserver \
        tools/kvm-ifup.in \
+       tools/vif-ganeti.in \
+       tools/net-common.in \
        tools/vcluster-setup.in \
        $(docinput) \
        doc/html \
@@ -1382,6 +1388,14 @@ tools/kvm-ifup: tools/kvm-ifup.in $(REPLACE_VARS_SED)
        sed -f $(REPLACE_VARS_SED) < $< > $@
        chmod +x $@
 
+tools/vif-ganeti: tools/vif-ganeti.in $(REPLACE_VARS_SED)
+       sed -f $(REPLACE_VARS_SED) < $< > $@
+       chmod +x $@
+
+tools/net-common: tools/net-common.in $(REPLACE_VARS_SED)
+       sed -f $(REPLACE_VARS_SED) < $< > $@
+       chmod +x $@
+
 tools/users-setup: Makefile $(userspecs)
        set -e; \
        { echo '#!/bin/sh'; \
index e506d73..5a53cee 100644 (file)
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 # 02110-1301, USA.
 
-@SHELL_ENV_INIT@
-
-if [ -z "$INTERFACE" ]; then
-  echo "No network interface specified"
-  exit 1
-fi
-
-if [ -z "$MODE" ]; then
-  echo "MODE not specified"
-  exit 1
-fi
+source @PKGLIBDIR@/net-common
 
 # Execute the user-supplied network script, if applicable
 if [ -x "$CONF_DIR/kvm-vif-bridge" ]; then
   exec $CONF_DIR/kvm-vif-bridge
 fi
 
-if [ "$MODE" = "bridged" ]; then
-  # Fix the autogenerated MAC to have the first octet set to "fe"
-  # to discourage the bridge from using the TAP dev's MAC
-  FIXED_MAC=$(ip link show $INTERFACE | \
-    awk '{if ($1 == "link/ether") printf("fe%s",substr($2,3,15))}')
-  ip link set $INTERFACE address $FIXED_MAC
-
-  ip link set $INTERFACE up
-  ip link set $INTERFACE mtu $(</sys/class/net/${BRIDGE}/mtu)
-
-  # Connect the interface to the bridge
-  brctl addif $BRIDGE $INTERFACE
-
-elif [ "$MODE" = "openvswitch" ]; then
-  ovs-vsctl add-port ${LINK} $INTERFACE
-
-else
-  ip link set $INTERFACE up
-
-  if [ -z "$IP" ]; then
-    echo "Routed NIC but no IP address specified"
-    exit 1
-  fi
-
-  # Route traffic targeted at the IP to the interface
-  if [ -n "$LINK" ]; then
-    while ip rule del dev $INTERFACE; do :; done
-    ip rule add dev $INTERFACE table $LINK
-    ip route replace $IP table $LINK proto static dev $INTERFACE
-
-  else
-    ip route replace $IP proto static dev $INTERFACE
-  fi
-
-  # Allow routing and arp proxying, or ndp proxying (IPv6)
-  if [ -d "/proc/sys/net/ipv4/conf/$INTERFACE" ]; then
-    echo 1 > /proc/sys/net/ipv4/conf/$INTERFACE/proxy_arp
-    echo 1 > /proc/sys/net/ipv4/conf/$INTERFACE/forwarding
-  fi
-
-  if [ -d "/proc/sys/net/ipv6/conf/$INTERFACE" ]; then
-    echo 1 > /proc/sys/net/ipv6/conf/$INTERFACE/proxy_ndp
-    echo 1 > /proc/sys/net/ipv6/conf/$INTERFACE/forwarding
-  fi
-fi
+check
+setup_bridge
+setup_ovs
+setup_route
diff --git a/tools/net-common.in b/tools/net-common.in
new file mode 100644 (file)
index 0000000..ee412bd
--- /dev/null
@@ -0,0 +1,97 @@
+#!/bin/bash
+#
+
+# Copyright (C) 2011, 2012, 2013 Google Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+@SHELL_ENV_INIT@
+
+function check {
+
+  if [ -z "$INTERFACE" ]; then
+    echo "No network interface specified"
+    exit 1
+  fi
+
+  if [ -z "$MODE" ]; then
+    echo "MODE not specified"
+    exit 1
+  fi
+
+}
+
+function fix_mac {
+
+  # Fix the autogenerated MAC to have the first octet set to "fe"
+  # to discourage the bridge from using the TAP dev's MAC
+  FIXED_MAC=$(ip link show $INTERFACE | \
+    awk '{if ($1 == "link/ether") printf("fe%s",substr($2,3,15))}')
+  # in case of a vif (xen_netback device) this action is not allowed
+  ip link set $INTERFACE address $FIXED_MAC || true
+
+}
+
+function setup_bridge {
+
+  if [ "$MODE" = "bridged" ]; then
+    fix_mac
+    ip link set $INTERFACE up
+    ip link set $INTERFACE mtu $(</sys/class/net/${BRIDGE}/mtu)
+
+    # Connect the interface to the bridge
+    brctl addif $BRIDGE $INTERFACE
+  fi
+
+}
+
+function setup_ovs {
+  if [ "$MODE" = "openvswitch" ]; then
+    ovs-vsctl add-port ${LINK} $INTERFACE
+  fi
+}
+
+function setup_route {
+  if [ "$MODE" = "openvswitch" ]; then
+    ip link set $INTERFACE up
+
+    if [ -z "$IP" ]; then
+      echo "Routed NIC but no IP address specified"
+      exit 1
+    fi
+
+    # Route traffic targeted at the IP to the interface
+    if [ -n "$LINK" ]; then
+      while ip rule del dev $INTERFACE; do :; done
+      ip rule add dev $INTERFACE table $LINK
+      ip route replace $IP table $LINK proto static dev $INTERFACE
+
+    else
+      ip route replace $IP proto static dev $INTERFACE
+    fi
+
+    # Allow routing and arp proxying, or ndp proxying (IPv6)
+    if [ -d "/proc/sys/net/ipv4/conf/$INTERFACE" ]; then
+      echo 1 > /proc/sys/net/ipv4/conf/$INTERFACE/proxy_arp
+      echo 1 > /proc/sys/net/ipv4/conf/$INTERFACE/forwarding
+    fi
+
+    if [ -d "/proc/sys/net/ipv6/conf/$INTERFACE" ]; then
+      echo 1 > /proc/sys/net/ipv6/conf/$INTERFACE/proxy_ndp
+      echo 1 > /proc/sys/net/ipv6/conf/$INTERFACE/forwarding
+    fi
+  fi
+}
diff --git a/tools/vif-ganeti.in b/tools/vif-ganeti.in
new file mode 100755 (executable)
index 0000000..99b2460
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/bash
+#
+
+# Copyright (C) 2011, 2012, 2013 Google Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+
+if [ -x "@XEN_CONFIG_DIR@/scripts/vif-custom" ]; then
+       exec @XEN_CONFIG_DIR@/scripts/vif-custom $*
+fi
+
+source @PKGLIBDIR@/net-common
+
+dir=$(dirname "$0")
+. "$dir"/vif-common.sh
+
+# taken from older vif-common.sh
+dev=$vif
+dev_=${dev#vif}
+domid=${dev_%.*}
+devid=${dev_#*.}
+domname=$(xm domname $domid)
+
+NIC_DIR=$RUN_DIR/xen-hypervisor/nic
+INTERFACE=$dev
+INSTANCE=$domname
+
+source $NIC_DIR/$domname/$devid
+
+setup_bridge
+setup_ovs
+setup_route
+
+success