Integration tests for GBP and GBP-SFC
[integration/test.git] / csit / suites / groupbasedpolicy / common_scripts / ovswork.sh
diff --git a/csit/suites/groupbasedpolicy/common_scripts/ovswork.sh b/csit/suites/groupbasedpolicy/common_scripts/ovswork.sh
new file mode 100644 (file)
index 0000000..28e0862
--- /dev/null
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+set -e
+
+BRIDGE=$1
+GUEST_ID=$2
+IPADDR=$3
+BROADCAST=$4
+GWADDR=$5
+MAC=$6
+GUESTNAME=$7
+VLANTAG=$8
+
+[ "$IPADDR" ] || {
+    echo "Syntax:"
+    echo "pipework <bridge> <guest-id> <ipaddr>/<subnet> <broadcast> <gateway> <mac> <guestname> [vlan tag]"
+    exit 1
+}
+
+# Step 1: Find the guest (for now, we only support LXC containers)
+while read dev mnt fstype options dump fsck
+do
+    [ "$fstype" != "cgroup" ] && continue
+    echo $options | grep -qw devices || continue
+    CGROUPMNT=$mnt
+done < /proc/mounts
+
+[ "$CGROUPMNT" ] || {
+    echo "Could not locate cgroup mount point."
+    exit 1
+}
+
+N=$(find "$CGROUPMNT" -name "$GUEST_ID*" | wc -l)
+case "$N" in
+    0)
+    echo "Could not find any container matching $GUEST_ID"
+    exit 1
+    ;;
+    1)
+    true
+    ;;
+    *)
+    echo "Found more than one container matching $GUEST_ID"
+    exit 1
+    ;;
+esac
+
+NSPID=$(head -n 1 $(find "$CGROUPMNT" -name "$GUEST_ID*" | head -n 1)/tasks)
+[ "$NSPID" ] || {
+    echo "Could not find a process inside container $GUEST_ID"
+    exit 1
+}
+
+# Step 2: Prepare the working directory
+sudo mkdir -p /var/run/netns
+sudo rm -f /var/run/netns/$NSPID
+sudo ln -s /proc/$NSPID/ns/net /var/run/netns/$NSPID
+
+# Step 3: Creating virtual interfaces
+LOCAL_IFNAME=vethl-$GUESTNAME #$NSPID
+GUEST_IFNAME=vethg-$GUESTNAME #$NSPID
+sudo ip link add name $LOCAL_IFNAME type veth peer name $GUEST_IFNAME
+sudo ip link set $LOCAL_IFNAME up
+
+# Step 4: Adding the virtual interface to the bridge
+sudo ip link set $GUEST_IFNAME netns $NSPID
+if [ "$VLANTAG" ]
+then
+    sudo ovs-vsctl add-port $BRIDGE $LOCAL_IFNAME tag=$VLANTAG
+    echo $LOCAL_IFNAME
+else
+    sudo ovs-vsctl add-port $BRIDGE $LOCAL_IFNAME
+    echo $LOCAL_IFNAME
+fi
+
+# Step 5: Configure networking within the container
+sudo ip netns exec $NSPID ip link set $GUEST_IFNAME name eth0
+sudo ip netns exec $NSPID ip addr add $IPADDR broadcast $BROADCAST dev eth0
+sudo ip netns exec $NSPID ifconfig eth0 hw ether $MAC
+sudo ip netns exec $NSPID ip addr add 127.0.0.1 dev lo
+sudo ip netns exec $NSPID ip link set eth0 up
+sudo ip netns exec $NSPID ip link set lo up
+sudo ip netns exec $NSPID ip route add default via $GWADDR
+