#!/bin/bash
# lxc: linux Container library
# Authors:
# Serge Hallyn <serge.hallyn@ubuntu.com>
# 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
# At the moment this only tests cgroup automount. Testing proc and
# sys automounts would be worthwhile.
[ -f /proc/self/ns/cgroup ] && exit 0
# cgmanager doesn't do the same cgroup filesystem mounting
cgm ping && exit 0
set -ex
cleanup() {
set +e
rmdir /sys/fs/cgroup/freezer/xx
lxc-destroy -n lxc-test-automount -f
if [ $PHASE != "done" ]; then
echo "automount test failed at $PHASE"
exit 1
fi
echo "automount test passed"
exit 0
}
PHASE=setup
trap cleanup EXIT
rmdir /sys/fs/cgroup/freezer/xx || true
lxc-destroy -n lxc-test-automount -f || true
lxc-create -t busybox -n lxc-test-automount
PHASE=no-cgroup
echo "Starting phase $PHASE"
config=/var/lib/lxc/lxc-test-automount/config
sed -i '/lxc.mount.auto/d' $config
echo "lxc.mount.auto = proc:mixed sys:mixed" >> $config
lxc-start -n lxc-test-automount
pid=`lxc-info -n lxc-test-automount -p -H`
cg=`awk -F: '/freezer/ { print $3 }' /proc/$pid/cgroup`
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer || notfound=1
[ $notfound -ne 0 ]
# Tests are as follows:
# 1. check that freezer controller is mounted
# 2. check that it is cgroupfs for cgroup-full (/cgroup.procs exists) or
# tmpfs for cgroup
# 3. check that root cgroup dir is readonly or not (try mkdir)
# 4. check that the container's cgroup dir is readonly or not
# 5. check that the container's cgroup dir is cgroupfs (/cgroup.procs exists)
lxc-stop -n lxc-test-automount -k
PHASE=cgroup:mixed
echo "Starting phase $PHASE"
sed -i '/lxc.mount.auto/d' $config
echo "lxc.mount.auto = cgroup:mixed proc:mixed sys:mixed" >> $config
lxc-start -n lxc-test-automount
pid=`lxc-info -n lxc-test-automount -p -H`
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer || notfound=1
[ $notfound -ne 1 ]
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer/cgroup.procs || notfound=1
[ $notfound -ne 0 ]
ro=0
mkdir /proc/$pid/root/sys/fs/cgroup/freezer/xx || ro=1
[ $ro -ne 0 ]
ro=0
mkdir /proc/$pid/root/sys/fs/cgroup/freezer/$cg/xx || ro=1
[ $ro -ne 1 ]
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer/$cg/cgroup.procs || notfound=1
[ $notfound -ne 1 ]
lxc-stop -n lxc-test-automount -k
PHASE=cgroup:ro
echo "Starting phase $PHASE"
sed -i '/lxc.mount.auto/d' $config
echo "lxc.mount.auto = cgroup:ro proc:mixed sys:mixed" >> $config
lxc-start -n lxc-test-automount
pid=`lxc-info -n lxc-test-automount -p -H`
cg=`awk -F: '/freezer/ { print $3 }' /proc/$pid/cgroup`
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer || notfound=1
[ $notfound -ne 1 ]
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer/cgroup.procs || notfound=1
[ $notfound -ne 0 ]
ro=0
mkdir /proc/$pid/root/sys/fs/cgroup/freezer/xx || ro=1
[ $ro -ne 0 ]
ro=0
mkdir /proc/$pid/root/sys/fs/cgroup/freezer/$cg/xx || ro=1
[ $ro -ne 1 ]
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer/$cg/cgroup.procs || notfound=1
[ $notfound -ne 1 ]
lxc-stop -n lxc-test-automount -k
PHASE=cgroup:rw
echo "Starting phase $PHASE"
sed -i '/lxc.mount.auto/d' $config
echo "lxc.mount.auto = cgroup:rw proc:mixed sys:mixed" >> $config
lxc-start -n lxc-test-automount
pid=`lxc-info -n lxc-test-automount -p -H`
cg=`awk -F: '/freezer/ { print $3 }' /proc/$pid/cgroup`
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer || notfound=1
[ $notfound -ne 1 ]
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer/cgroup.procs || notfound=1
[ $notfound -ne 0 ]
ro=0
mkdir /proc/$pid/root/sys/fs/cgroup/freezer/xx || ro=1
[ $ro -ne 1 ]
rmdir /proc/$pid/root/sys/fs/cgroup/freezer/xx
ro=0
mkdir /proc/$pid/root/sys/fs/cgroup/freezer/$cg/xx || ro=1
[ $ro -ne 1 ]
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer/$cg/cgroup.procs || notfound=1
[ $notfound -ne 1 ]
# cgroup-full
lxc-stop -n lxc-test-automount -k
PHASE=cgroup-full:mixed
echo "Starting phase $PHASE"
sed -i '/lxc.mount.auto/d' $config
echo "lxc.mount.auto = cgroup-full:mixed proc:mixed sys:mixed" >> $config
lxc-start -n lxc-test-automount
pid=`lxc-info -n lxc-test-automount -p -H`
cg=`awk -F: '/freezer/ { print $3 }' /proc/$pid/cgroup`
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer || notfound=1
[ $notfound -ne 1 ]
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer/cgroup.procs || notfound=1
[ $notfound -ne 1 ]
ro=0
mkdir /proc/$pid/root/sys/fs/cgroup/freezer/xx || ro=1
[ $ro -ne 0 ]
ro=0
mkdir /proc/$pid/root/sys/fs/cgroup/freezer/$cg/xx || ro=1
[ $ro -ne 1 ]
rmdir /proc/$pid/root/sys/fs/cgroup/freezer/$cg/xx
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer/$cg/cgroup.procs || notfound=1
[ $notfound -ne 1 ]
lxc-stop -n lxc-test-automount -k
PHASE=cgroup-full:ro
echo "Starting phase $PHASE"
sed -i '/lxc.mount.auto/d' $config
echo "lxc.mount.auto = cgroup-full:ro proc:mixed sys:mixed" >> $config
lxc-start -n lxc-test-automount
pid=`lxc-info -n lxc-test-automount -p -H`
cg=`awk -F: '/freezer/ { print $3 }' /proc/$pid/cgroup`
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer || notfound=1
[ $notfound -ne 1 ]
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer/cgroup.procs || notfound=1
[ $notfound -ne 1 ]
ro=0
mkdir /proc/$pid/root/sys/fs/cgroup/freezer/xx || ro=1
[ $ro -ne 0 ]
ro=0
mkdir /proc/$pid/root/sys/fs/cgroup/freezer/$cg/xy || ro=1
[ $ro -ne 0 ]
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer/$cg/cgroup.procs || notfound=1
[ $notfound -ne 1 ]
lxc-stop -n lxc-test-automount -k
PHASE=cgroup-full:rw
echo "Starting phase $PHASE"
sed -i '/lxc.mount.auto/d' $config
echo "lxc.mount.auto = cgroup-full:rw proc:mixed sys:mixed" >> $config
lxc-start -n lxc-test-automount
pid=`lxc-info -n lxc-test-automount -p -H`
cg=`awk -F: '/freezer/ { print $3 }' /proc/$pid/cgroup`
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer || notfound=1
[ $notfound -ne 1 ]
notfound=0
stat /proc/$pid/root/sys/fs/cgroup/freezer/cgroup.procs || notfound=1
[ $notfound -ne 1 ]
ro=0
mkdir /proc/$pid/root/sys/fs/cgroup/freezer/xx || ro=1
[ $ro -ne 1 ]
rmdir /proc/$pid/root/sys/fs/cgroup/freezer/xx
ro=0
mkdir /proc/$pid/root/sys/fs/cgroup/freezer/$cg/xx || ro=1
[ $ro -ne 1 ]
notfound=0
/proc/$pid/root/sys/fs/cgroup/freezer/$cg/cgroup.procs || notfound=1
[ $notfound -eq 1 ]
PHASE=done