/usr/bin/lxc-test-usernic is in lxc-tests 1.0.3-0ubuntu3.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | #!/bin/bash
# lxc: linux Container library
# Authors:
# Serge Hallyn <serge.hallyn@ubuntu.com>
#
# This is a test script for the lxc-user-nic program
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# This library 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
# Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
# This test assumes an Ubuntu host
DONE=0
LXC_USER_NIC="/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic"
cleanup() {
(
set +e
lxc-stop -n usernic-c1 -k
lxc-destroy -n usernic-c1
sed -i '/usernic-user/d' /run/lxc/nics /etc/lxc/lxc-usernet
ifconfig usernic-br0 down
ifconfig usernic-br1 down
brctl delbr usernic-br0
brctl delbr usernic-br1
run_cmd "lxc-stop -n b1 -k"
pkill -u $(id -u usernic-user) -9
rm -rf /tmp/usernic-test /home/usernic-user /run/user/$(id -u usernic-user)
deluser usernic-user
) >/dev/null 2>&1
if [ "$DONE" = "1" ]; then
echo "PASS"
exit 0
fi
echo "FAIL"
exit 1
}
run_cmd() {
sudo -i -u usernic-user \
env http_proxy=${http_proxy:-} https_proxy=${https_proxy:-} \
XDG_RUNTIME_DIR=/run/user/$(id -u usernic-user) $*
}
ARCH=i386
if type dpkg >/dev/null 2>&1; then
ARCH=$(dpkg --print-architecture)
fi
set -eu
trap cleanup EXIT SIGHUP SIGINT SIGTERM
# create a test user
deluser usernic-user || true
useradd usernic-user
sudo mkdir -p /home/usernic-user
sudo chown usernic-user /home/usernic-user
usermod -v 910000-919999 -w 910000-919999 usernic-user
mkdir -p /home/usernic-user/.config/lxc/
cat > /home/usernic-user/.config/lxc/default.conf << EOF
lxc.network.type = empty
lxc.id_map = u 0 910000 10000
lxc.id_map = g 0 910000 10000
EOF
if [ -e /sys/fs/cgroup/cgmanager/sock ]; then
for d in $(grep -v ^# /proc/cgroups | awk '{print $1}'); do
dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock \
--type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.Create \
string:$d string:usernic-user >/dev/null
dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock \
--type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.Chown \
string:$d string:usernic-user int32:$(id -u usernic-user) int32:$(id -g usernic-user) >/dev/null
dbus-send --print-reply --address=unix:path=/sys/fs/cgroup/cgmanager/sock \
--type=method_call /org/linuxcontainers/cgmanager org.linuxcontainers.cgmanager0_0.MovePid \
string:$d string:usernic-user int32:$$ >/dev/null
done
else
for d in /sys/fs/cgroup/*; do
[ ! -d $d/lxctest ] && mkdir $d/lxctest
chown -R usernic-user $d/lxctest
echo $$ > $d/lxctest/tasks
done
fi
mkdir -p /run/user/$(id -u usernic-user)
chown -R usernic-user /run/user/$(id -u usernic-user) /home/usernic-user
# Create two test bridges
brctl addbr usernic-br0
brctl addbr usernic-br1
ifconfig usernic-br0 0.0.0.0 up
ifconfig usernic-br1 0.0.0.0 up
ARCH=i386
if type dpkg >/dev/null 2>&1; then
ARCH=$(dpkg --print-architecture)
fi
# Create three containers
run_cmd "lxc-create -t download -n b1 -- -d ubuntu -r trusty -a $ARCH"
run_cmd "lxc-start -n b1 -d"
p1=$(run_cmd "lxc-info -n b1 -p -H")
# Assign one veth, should fail as no allowed entries yet
if run_cmd "$LXC_USER_NIC $p1 veth usernic-br0 xx1"; then
echo "FAIL: able to create nic with no entries"
exit 1
fi
# Give him a quota of two
touch /etc/lxc/lxc-usernet
sed -i '/^usernic-user/d' /etc/lxc/lxc-usernet
echo "usernic-user veth usernic-br0 2" >> /etc/lxc/lxc-usernet
# Assign one veth to second bridge, should fail
if run_cmd "$LXC_USER_NIC $p1 veth usernic-br1 xx1"; then
echo "FAIL: able to create nic with no entries"
exit 1
fi
# Assign two veths, should succeed
if ! run_cmd "$LXC_USER_NIC $p1 veth usernic-br0 xx2"; then
echo "FAIL: unable to create first nic"
exit 1
fi
if ! run_cmd "$LXC_USER_NIC $p1 veth usernic-br0 xx3"; then
echo "FAIL: unable to create second nic"
exit 1
fi
# Assign one more veth, should fail.
if run_cmd "$LXC_USER_NIC $p1 veth usernic-br0 xx4"; then
echo "FAIL: able to create third nic"
exit 1
fi
# Shut down and restart the container, should be able to assign more nics
run_cmd "lxc-stop -n b1 -k"
run_cmd "lxc-start -n b1 -d"
p1=$(run_cmd "lxc-info -n b1 -p -H")
if ! run_cmd "$LXC_USER_NIC $p1 veth usernic-br0 xx5"; then
echo "FAIL: unable to create nic after destroying the old"
cleanup 1
fi
run_cmd "lxc-stop -n b1 -k"
# Create a root-owned ns
lxc-create -t busybox -n usernic-c1
lxc-start -n usernic-c1 -d
p2=$(lxc-info -n usernic-c1 -p -H)
# assign veth to it - should fail
if run_cmd "$LXC_USER_NIC $p2 veth usernic-br0 xx6"; then
echo "FAIL: able to attach nic to root-owned container"
cleanup 1
fi
echo "All tests passed"
DONE=1
|