9c4c6cabc21bb464e510390af3e7741edff38c8b
[groupbasedpolicy.git] / util / dockerTestOfOverlay / ovswork.sh
1 #!/bin/bash
2 set -e
3
4 BRIDGE=$1
5 GUESTNAME=$2
6 IPADDR=$3
7 BROADCAST=$4
8 GWADDR=$5
9 MAC=$6
10 OF_PORT=$7
11 VLANTAG=$8
12
13 [ "$IPADDR" ] || {
14     echo "Syntax:"
15     echo "pipework <hostinterface> <guest> <ipaddr>/<subnet> <broadcast> <gateway> [vlan tag]"
16     exit 1
17 }
18
19 # Step 1: Find the guest (for now, we only support LXC containers)
20 while read dev mnt fstype options dump fsck
21 do
22     [ "$fstype" != "cgroup" ] && continue
23     echo $options | grep -qw devices || continue
24     CGROUPMNT=$mnt
25 done < /proc/mounts
26
27 [ "$CGROUPMNT" ] || {
28     echo "Could not locate cgroup mount point."
29     exit 1
30 }
31
32 N=$(find "$CGROUPMNT" -name "$GUESTNAME*" | wc -l)
33 case "$N" in
34     0)
35         echo "Could not find any container matching $GUESTNAME."
36         exit 1
37         ;;
38     1)
39         true
40         ;;
41     *)
42         echo "Found more than one container matching $GUESTNAME."
43         exit 1
44         ;;
45 esac
46
47 NSPID=$(head -n 1 $(find "$CGROUPMNT" -name "$GUESTNAME*" | head -n 1)/tasks)
48 [ "$NSPID" ] || {
49     echo "Could not find a process inside container $GUESTNAME."
50     exit 1
51 }
52
53 # Step 2: Prepare the working directory
54 mkdir -p /var/run/netns
55 rm -f /var/run/netns/$NSPID
56 ln -s /proc/$NSPID/ns/net /var/run/netns/$NSPID
57
58 # Step 3: Creating virtual interfaces
59 LOCAL_IFNAME=vethl$NSPID
60 GUEST_IFNAME=vethg$NSPID
61 ip link add name $LOCAL_IFNAME type veth peer name $GUEST_IFNAME
62 ip link set $LOCAL_IFNAME up
63
64 # Step 4: Adding the virtual interface to the bridge
65 ip link set $GUEST_IFNAME netns $NSPID
66 if [ "$VLANTAG" ]
67 then
68         ovs-vsctl add-port $BRIDGE $LOCAL_IFNAME tag=$VLANTAG -- set Interface $LOCAL_IFNAME ofport_request=$OF_PORT
69 else
70         ovs-vsctl add-port $BRIDGE $LOCAL_IFNAME -- set Interface $LOCAL_IFNAME ofport_request=$OF_PORT
71 fi
72
73 # Step 5: Configure netwroking within the container
74 ip netns exec $NSPID ip link set $GUEST_IFNAME name eth0
75 ip netns exec $NSPID ip addr add $IPADDR broadcast $BROADCAST dev eth0
76 ip netns exec $NSPID ifconfig eth0 hw ether $MAC 
77 ip netns exec $NSPID ip addr add 127.0.0.1 dev lo
78 ip netns exec $NSPID ip link set eth0 up
79 ip netns exec $NSPID ip link set lo up
80 ip netns exec $NSPID ip route add default via $GWADDR