-
Notifications
You must be signed in to change notification settings - Fork 1
/
ceph-plumb.sh
executable file
·88 lines (75 loc) · 2.02 KB
/
ceph-plumb.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/bin/bash
set -e
BRIDGE=$1
GUESTNAME=$2
IPADDR=$3
BROADCAST=$4
#GWADDR=$5
#VLANTAG=$6
VLANTAG=$5
[ "$IPADDR" ] || {
echo "Syntax:"
echo "ceph-plumb.sh <hostinterface> <guest> <ipaddr>/<subnet> <broadcast> [vlan tag]"
exit 1
}
# Step : Find the full guestname
GUESTNAME=`docker inspect --format='{{.ID}}' $GUESTNAME`
[ "$GUESTNAME" ] || {
echo "Could not find a running container $GUESTNAME."
exit 1
}
# Step : 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 "$GUESTNAME*" | wc -l)
case "$N" in
0)
echo "Could not find any container matching $GUESTNAME."
exit 1
;;
1)
true
;;
*)
echo "Found more than one container matching $GUESTNAME."
exit 1
;;
esac
NSPID=$(head -n 1 $(find "$CGROUPMNT" -name "$GUESTNAME*" | head -n 1)/tasks)
[ "$NSPID" ] || {
echo "Could not find a process inside container $GUESTNAME."
exit 1
}
# Step : Extend /etc/hosts
[ -f conf/hosts ] && {
cp conf/hosts /var/lib/docker/containers/$GUESTNAME/hosts
}
# Step : Prepare the working directory
mkdir -p /var/run/netns
rm -f /var/run/netns/$NSPID
ln -s /proc/$NSPID/ns/net /var/run/netns/$NSPID
# Step : Creating virtual interfaces
LOCAL_IFNAME=vethl$NSPID
GUEST_IFNAME=vethg$NSPID
ip link add name $LOCAL_IFNAME type veth peer name $GUEST_IFNAME
ip link set $LOCAL_IFNAME up
# Step : Adding the virtual interface to the bridge
ip link set $GUEST_IFNAME netns $NSPID
if [ "$VLANTAG" ]
then
/usr/bin/ovs-vsctl add-port $BRIDGE $LOCAL_IFNAME tag=$VLANTAG
else
/usr/bin/ovs-vsctl add-port $BRIDGE $LOCAL_IFNAME
fi
# Step : Configure netwroking within the container
ip netns exec $NSPID ip link set $GUEST_IFNAME name eth1
ip netns exec $NSPID ip addr add $IPADDR broadcast $BROADCAST dev eth1
ip netns exec $NSPID ip link set eth1 up