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