blob: ff5d49d02b1764f61642042b992e7c2586bd52e1 [file] [log] [blame]
#! /bin/sh
################################################################################
## ##
## Copyright (c) 2009 FUJITSU LIMITED ##
## ##
## This program is free software; you can redistribute it and#or modify ##
## it under the terms of the GNU General Public License as published by ##
## the Free Software Foundation; either version 2 of the License, or ##
## (at your option) any later version. ##
## ##
## This program 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 General Public License ##
## for more details. ##
## ##
## You should have received a copy of the GNU General Public License ##
## along with this program; if not, write to the Free Software ##
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ##
## ##
## Author: Shi Weihua <shiwh@cn.fujitsu.com> ##
## ##
################################################################################
subsystem_str=""
exist_subsystem()
{
checksubsystem=""
case "$#" in
"0" )
checksubsystem=$subsystem_str
;;
"1" )
checksubsystem=$1
;;
"*" )
if [ "$#" -gt "1" ]; then
exit -1
fi
;;
esac
if [ "$checksubsystem" = "" ]; then
exit -1
fi
exist=`grep -w $checksubsystem /proc/cgroups | cut -f1`;
if [ "$exist" = "" ]; then
exit 9
fi
}
get_subsystem()
{
case $subsystem in
"1" )
subsystem_str="debug";
exist_subsystem;
;;
"2" )
subsystem_str="cpuset";
exist_subsystem;
;;
"3" )
subsystem_str="ns";
exist_subsystem;
;;
"4" )
subsystem_str="cpu"
exist_subsystem;
;;
"5" )
subsystem_str="cpuacct";
exist_subsystem;
;;
"6" )
subsystem_str="memory";
exist_subsystem;
;;
"7" )
subsystem_str="all";
;;
"8" )
subsystem_str=""
;;
"9" )
subsystem_str="debug,debug";
exist_subsystem "debug";
;;
"10" )
subsystem_str="abc";
;;
"11" )
subsystem_str="freezer";
exist_subsystem;
;;
"12" )
subsystem_str="devices";
exist_subsystem;
;;
* )
return -1
;;
esac
}
get_remount_use()
{
case $remount_use in
"1" )
remount_use_str="";
;;
"2" )
remount_use_str="remount";
;;
* )
return -1
;;
esac
}
get_noprefix_use()
{
case $noprefix_use in
"1" )
noprefix_use_str="";
;;
"2" )
if [ $subsystem -ne 2 ]; then
return -1
fi
noprefix_use_str="noprefix";
;;
* )
return -1
;;
esac
}
get_release_agent_para()
{
case $release_agent_para in
"1" )
release_agent_para_str="";
;;
"2" )
release_agent_para_str=" ";
;;
"3" )
release_agent_para_str="/root/cgroup_fj_release_agent";
;;
"4" )
release_agent_para_str="cgroup_fj_release_agent";
;;
"5" )
release_agent_para_str="/sbin/cgroup_fj_release_agent";
;;
"6" )
release_agent_para_str="/root/cgroup_fj_release_agent";
;;
"7" )
release_agent_para_str="/sbin/abc";
;;
"8" )
release_agent_para_str="/sbin/cgroup_fj_release_agent";
;;
* )
return -1
;;
esac
}
get_notify_on_release()
{
case $notify_on_release in
"1" )
notify_on_release_str="0";
;;
"2" )
notify_on_release_str="1";
;;
"3" )
notify_on_release_str="2";
;;
"4" )
notify_on_release_str="-1";
;;
"5" )
notify_on_release_str="0ddd";
;;
"6" )
notify_on_release_str="1ddd";
;;
"7" )
notify_on_release_str="ddd1";
;;
* )
return -1
;;
esac
}
get_release_agent()
{
case $release_agent_echo in
"1" )
release_agent_str="";
;;
"2" )
release_agent_str="/root/cgroup_fj_release_agent";
;;
"3" )
release_agent_str="cgroup_fj_release_agent";
;;
"4" )
release_agent_str="/sbin/cgroup_fj_release_agent";
;;
"5" )
release_agent_str="/root/cgroup_fj_release_agent";
;;
"6" )
release_agent_str="/sbin/abc";
;;
"7" )
release_agent_str="/sbin/cgroup_fj_release_agent";
;;
* )
return -1
;;
esac
}
# check the exit status, and exit or echo info.
# exit status expectted value echo info exit or not
# 0 0 no no
# 0 1 yes yes
# not 0 0 yes yes
# not 0 1 no no
do_exit()
{
if [ "$#" -ne "3" ]; then
echo "ERROR: exit failed,your parameter is wrong..Exiting test" >> $LOGFILE
exit -1
fi
exit_here=$1
expectted=$2
exit_status=$3
if [ $exit_status -eq 0 ] ;then
if [ $expectted -lt 1 ]; then
echo " against with expectted" >> $LOGFILE
if [ $exit_here -ge 1 ]; then
cleanup;
exit -1
fi
fi
else
if [ $expectted -ge 1 ]; then
echo " against with expectted" >> $LOGFILE
if [ $exit_here -ge 1 ]; then
cleanup;
exit -1
fi
else
if [ $exit_here -ge 1 ]; then
cleanup;
exit 0
fi
fi
fi
}
do_echo()
{
if [ "$#" -ne "4" ]; then
echo "ERROR: echo failed,your parameter is wrong..Exiting test" >> $LOGFILE
exit -1
fi
exit_here=$1
expectted=$2
value=$3
target=$4
if [ $no_debug -ne 1 ]; then
if [ $expectted -ge 1 ]; then
echo "\"echo $value > $target\" (expectted: success)" >> $LOGFILE
else
echo "\"echo $value > $target\" (expectted: fail)" >> $LOGFILE
fi
fi
`echo $value > $target` >> $LOGFILE 2>&1
do_exit $exit_here $expectted $?;
}
do_mkdir()
{
if [ "$#" -ne "3" ] && [ "$#" -ne "4" ]; then
echo "ERROR: mkdir failed,your parameter is wrong..Exiting test" >> $LOGFILE
exit -1
fi
exit_here=$1
expectted=$2
target=$3
parents=0
if [ "$#" -eq "4" ] && [ "$4" -ne 0 ]; then
parents=1
fi
if [ $no_debug -ne 1 ]; then
if [ $expectted -ge 1 ]; then
echo "\"mkdir $target\" (expectted: success)" >> $LOGFILE
else
echo "\"mkdir $target\" (expectted: fail)" >> $LOGFILE
fi
fi
if [ $parents -ne "1" ] && [ -e $target ]; then
do_rmdir $exit_here 1 $target
fi
if [ $parents -ne "1" ]; then
mkdir $target >> $LOGFILE 2>&1
else
mkdir -p $target >> $LOGFILE 2>&1
fi
do_exit $exit_here $expectted $?;
}
do_rmdir()
{
if [ "$#" -lt "3" ]; then
echo "ERROR: rmdir failed,your parameter is wrong..Exiting test" >> $LOGFILE
exit -1
fi
exit_here=$1
expectted=$2
target=$3
if ! [ -e $target ]; then
echo "INFO: $target is not exist" >> $LOGFILE
return
fi
if [ $no_debug -ne 1 ]; then
if [ $expectted -ge 1 ]; then
echo "\"rmdir $target\" (expectted: success)" >> $LOGFILE
else
echo "\"rmdir $target\" (expectted: fail)" >> $LOGFILE
fi
fi
rmdir $3 $4 $5 >> $LOGFILE 2>&1
do_exit $exit_here $expectted $?;
}
do_mount()
{
if [ "$#" -ne "4" ] && [ "$#" -ne "5" ] ; then
echo "ERROR: mount failed,your parameter is wrong..Exiting test" >> $LOGFILE
exit -1
fi
exit_here=$1
expectted=$2
para_o=$3
target=$4
something="cgroup"
if [ "$#" -eq "5" ]; then
something=$5
fi
if [ $no_debug -ne 1 ]; then
if [ $expectted -ge 1 ]; then
echo "\"mount -t cgroup $para_o $something $target\" (expectted: success)" >> $LOGFILE
else
echo "\"mount -t cgroup $para_o $something $target\" (expectted: fail)" >> $LOGFILE
fi
fi
mount -t cgroup $para_o $something $target >> $LOGFILE 2>&1
do_exit $exit_here $expectted $?;
}
do_umount()
{
if [ "$#" -ne "3" ]; then
echo "ERROR: umount failed,your parameter is wrong..Exiting test" >> $LOGFILE
exit -1
fi
exit_here=$1
expectted=$2
target=$3
if [ $no_debug -ne 1 ]; then
if [ $expectted -ge 1 ]; then
echo "\"umount $target\" (expectted: success)" >> $LOGFILE
else
echo "\"umount $target\" (expectted: fail)" >> $LOGFILE
fi
fi
umount $target >> $LOGFILE 2>&1
do_exit $exit_here $expectted $?;
}
do_mv()
{
if [ "$#" -ne "4" ]; then
echo "ERROR: mv failed,your parameter is wrong..Exiting test" >> $LOGFILE
exit -1
fi
exit_here=$1
expectted=$2
source=$3
target=$4
if [ $no_debug -ne 1 ]; then
if [ $expectted -ge 1 ]; then
echo "\"mv $source $target\" (expectted: success)" >> $LOGFILE
else
echo "\"mv $source $target\" (expectted: fail)" >> $LOGFILE
fi
fi
mv $source $target >> $LOGFILE 2>&1
do_exit $exit_here $expectted $?;
}
do_kill()
{
if [ "$#" -ne "4" ]; then
echo "ERROR: kill failed,your parameter is wrong..Exiting test" >> $LOGFILE
exit -1
fi
exit_here=$1
expectted=$2
signo=$3
pid=$4
if ! [ -e /proc/$pid/ ];then
return
fi
if [ $no_debug -ne 1 ]; then
if [ $expectted -ge 1 ]; then
echo "\"kill -$signo $pid\" (expectted: success)" >> $LOGFILE
else
echo "\"kill -$signo $pid\" (expectted: fail)" >> $LOGFILE
fi
fi
kill -s $signo $pid >> $LOGFILE 2>&1
do_exit $exit_here $expectted $?;
}
setup()
{
if [ -e /dev/cgroup ]; then
cleanup;
fi
do_mkdir 1 1 /dev/cgroup
if [ -e $TESTROOT/cgroup_fj_release_agent ]
then
cp -f $TESTROOT/cgroup_fj_release_agent /sbin
chmod a+x /sbin/cgroup_fj_release_agent
cp -f $TESTROOT/cgroup_fj_release_agent /root
chmod a+x /root/cgroup_fj_release_agent
else
echo "ERROR: $TESTROOT/cgroup_fj_release_agent isn't exist..Exiting test" >> $LOGFILE
exit -1;
fi
if [ $release_agent_para -eq 8 ] || [ $release_agent_echo -eq 7 ]; then
chmod a-x /sbin/cgroup_fj_release_agent
fi
if [ -e $TESTROOT/cgroup_fj_proc ]
then
chmod a+x $TESTROOT/cgroup_fj_proc
else
echo "ERROR: $TESTROOT/cgroup_fj_proc isn't exist..Exiting test" >> $LOGFILE
exit -1;
fi
}
cleanup()
{
if [ $no_debug -ne 1 ]; then
echo "INFO: we now cleanup ..." >> $LOGFILE
fi
export LANG=en_US.UTF-8
rm -f /sbin/cgroup_fj_release_agent 2>/dev/null
rm -f /root/cgroup_fj_release_agent 2>/dev/null
killall -9 cgroup_fj_proc 1>/dev/null 2>&1;
if [ -e /dev/cgroup/subgroup_1 ]; then
cat /dev/cgroup/subgroup_1/tasks > $TMPFILE
nlines=`cat $TMPFILE | wc -l`
for i in `seq 1 $nlines`
do
cur_pid=`sed -n "$i""p" $TMPFILE`
if [ -e /proc/$cur_pid/ ];then
do_echo 0 1 "$cur_pid" /dev/cgroup/tasks
fi
done
do_rmdir 0 1 /dev/cgroup/subgroup_*
fi
if [ -e $TMPFILE ]; then
rm -f $TMPFILE 2>/dev/null
fi
mount_str="`mount -l | grep /dev/cgroup`"
if [ "$mount_str" != "" ]; then
do_umount 0 1 /dev/cgroup
fi
if [ -e /dev/cgroup ]; then
do_rmdir 0 1 /dev/cgroup
fi
}
reclaim_foundling()
{
if ! [ -e /dev/cgroup/subgroup_1 ]; then
return
fi
foundlings=0
cat `find /dev/cgroup/subgroup_* -name "tasks"` > $TMPFILE
nlines=`cat "$TMPFILE" | wc -l`
for k in `seq 1 $nlines`
do
cur_pid=`sed -n "$k""p" $TMPFILE`
if [ -e /proc/$cur_pid/ ];then
echo "ERROR: pid $cur_pid reclaimed"
do_echo 0 1 "$cur_pid" "/dev/cgroup/tasks"
: $((foundlings += 1))
fi
done
if [ $foundlings -ne 0 ]; then
echo "ERROR: some processes lost in subgroups's tasks, now they are reclaimed."
fi
}
mkdir_subgroup()
{
if ! [ -e /dev/cgroup ]; then
echo "ERROR: /dev/cgroup isn't exist..Exiting test" >> $LOGFILE
exit -1;
fi
do_mkdir 1 1 /dev/cgroup/subgroup_1
}
mount_cgroup ()
{
expectted=1
PARAMETER_O="";
if [ $subsystem -eq 10 ]; then
expectted=0
fi
if [ "$subsystem_str" != "" ]; then
PARAMETER_O="$subsystem_str"
fi
if [ "$noprefix_use_str" != "" ]; then
if [ "$PARAMETER_O" != "" ]; then
PARAMETER_O="$PARAMETER_O"",""$noprefix_use_str"
else
PARAMETER_O="$noprefix_use_str"
fi
fi
if [ "$release_agent_para_str" != "" ]; then
if [ "$PARAMETER_O" != "" ]; then
PARAMETER_O="$PARAMETER_O"",release_agent=""$release_agent_para_str"
else
PARAMETER_O="release_agent=""$release_agent_para_str"
fi
fi
if [ "$remount_use_str" != "" ]; then
if [ "$PARAMETER_O" != "" ]; then
do_mount 1 1 "-o$PARAMETER_O" /dev/cgroup
PARAMETER_O="$PARAMETER_O"",""$remount_use_str"
else
do_mount 1 1 "" /dev/cgroup
PARAMETER_O="$remount_use_str"
fi
sleep 1
fi
if [ "$PARAMETER_O" != "" ]; then
PARAMETER_O="-o""$PARAMETER_O"
fi
do_mount 1 $expectted "$PARAMETER_O" /dev/cgroup
}
check_para()
{
get_subsystem;
ret1=$?
get_remount_use;
ret2=$?
get_noprefix_use;
ret3=$?
get_release_agent_para;
ret4=$?
get_notify_on_release;
ret5=$?
get_release_agent;
ret6=$?
if [ $ret1 -ne 0 ] || [ $ret2 -ne 0 ] || [ $ret3 -ne 0 ] || [ $ret4 -ne 0 ] || [ $ret5 -ne 0 ] || [ $ret6 -ne 0 ]
then
echo "ERROR: Wrong inputed parameter..Exiting test" >> $LOGFILE
return -1
fi
return 0
}