On 04/05/2011 09:08 AM, Ivana Hutarova Varekova wrote: > On 03/14/2011 05:24 PM, Jan Safranek wrote: >> Various tests for cgclassify tool, including error cases and testing with >> /etc/cgrules.conf. The tests will produce error messages to output, but it's >> expected, reaction of cgclassify to wrong input is being tested as well. >> >> Signed-off-by: Jan Safranek<jsafr...@redhat.com> > I have only minor problems with this patch otherwise it looks ok.
Thanks for the review! >> --- >> >> tests/tools/Makefile.am | 2 >> tests/tools/cgclassify/Makefile.am | 3 + >> tests/tools/cgclassify/cgclassify | 134 ++++++++++++++++++++++++ >> tests/tools/cgclassify/cgclassify-rules | 171 >> +++++++++++++++++++++++++++++++ >> tests/tools/cgclassify/simple.conf | 24 ++++ >> 5 files changed, 333 insertions(+), 1 deletions(-) >> create mode 100644 tests/tools/cgclassify/Makefile.am >> create mode 100755 tests/tools/cgclassify/cgclassify >> create mode 100755 tests/tools/cgclassify/cgclassify-rules >> create mode 100644 tests/tools/cgclassify/simple.conf >> >> diff --git a/configure.in b/configure.in >> index ba8e1b1..03b2731 100644 >> --- a/configure.in >> +++ b/configure.in >> @@ -196,6 +196,7 @@ AC_CONFIG_FILES([Makefile >> tests/tools/testenv.sh >> tests/tools/Makefile >> tests/tools/cgconfigparser/Makefile >> + tests/tools/cgclassify/Makefile >> src/Makefile >> src/daemon/Makefile >> src/tools/Makefile >> diff --git a/tests/tools/Makefile.am b/tests/tools/Makefile.am >> index 5c08525..4f2b1b0 100644 >> --- a/tests/tools/Makefile.am >> +++ b/tests/tools/Makefile.am >> @@ -1,2 +1,2 @@ >> -SUBDIRS = cgconfigparser >> +SUBDIRS = cgconfigparser cgclassify >> >> diff --git a/tests/tools/cgclassify/Makefile.am >> b/tests/tools/cgclassify/Makefile.am >> new file mode 100644 >> index 0000000..c504e7f >> --- /dev/null >> +++ b/tests/tools/cgclassify/Makefile.am >> @@ -0,0 +1,3 @@ >> +EXTRA_DIST = cgclassify cgclassify-rules simple.conf >> + >> +TESTS = cgclassify cgclassify-rules >> diff --git a/tests/tools/cgclassify/cgclassify >> b/tests/tools/cgclassify/cgclassify >> new file mode 100755 >> index 0000000..9560a15 >> --- /dev/null >> +++ b/tests/tools/cgclassify/cgclassify >> @@ -0,0 +1,134 @@ >> +#!/bin/bash >> +# >> +# Test cgclassify with various arguments, without /etc/cgrules.conf. >> +# cglassify is tested with exact destination group, multiple PIDs, groups >> +# specified by '*', multiple target groups, lot of PIDs on command line >> +# and various error cases. >> + >> +. `dirname $0`/../testenv.sh >> + >> +function checkpid() >> +{ >> + # check that given process is in given groups >> + local PID=$1 >> + # delete hierarchy number, ignore systemd >> + cat /proc/$PID/cgroup | sed 's/^[0-9]*://' | grep -v systemd> >> $TMP/pid-$PID.group >> + printf>$TMP/pid-$PID.expected "$2" >> + diff -u -w $TMP/pid-$PID.group $TMP/pid-$PID.expected >> + return $? >> +} >> + >> +function resetgroup() >> +{ >> + # move given processes back to root group >> + $TOOLSDIR/cgclassify -g "*:/" $* >> +} >> + >> +# prepare some hierarchy >> +$TOOLSDIR/cgconfigparser -l `prepare_config simple.conf` || \ >> + die "cannot parse simple.conf" >> + >> +# start few processes to torture >> +/bin/sleep 10000& >> +PID1=$! >> +/bin/sleep 10000& >> +PID2=$! >> +/bin/sleep 10000& >> +PID3=$! >> + >> +# STEP1: simple cgclassify to exact groups >> +$TOOLSDIR/cgclassify -g net_cls,cpu:common $PID1 || \ >> + die "STEP1: cgclassify PID1 failed" >> +$TOOLSDIR/cgclassify -g net_cls:net1 $PID2 || \ >> + die "STEP1: cgclassify PID2 failed" >> +$TOOLSDIR/cgclassify -g cpu:cpu1 $PID3 || \ >> + die "STEP1: cgclassify PID3 failed" >> + >> +checkpid $PID1 "net_cls,freezer:/common\ncpuacct,cpu:/common\n" || \ >> + die "STEP1: unexpected group of pid1" >> +checkpid $PID2 "net_cls,freezer:/net1\ncpuacct,cpu:/\n" || \ >> + die "STEP!: unexpected group of pid2" >> +checkpid $PID3 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \ >> + die "STEP!: unexpected group of pid3" >> + >> +# STEP2: try * and more PIDs >> +$TOOLSDIR/cgclassify -g "*:/" $PID1 $PID2 $PID3 || \ >> + die "cgclassify 2 failed" >> +checkpid $PID1 "net_cls,freezer:/\ncpuacct,cpu:/\n" || \ >> + die "STEP2: unexpected group of pid1" >> +checkpid $PID2 "net_cls,freezer:/\ncpuacct,cpu:/\n" || \ >> + die "STEP2: unexpected group of pid2" >> +checkpid $PID3 "net_cls,freezer:/\ncpuacct,cpu:/\n" || \ >> + die "STEP2: unexpected group of pid3" >> + >> +# STEP3: try different groups >> +resetgroup $PID1 $PID2 $PID3 >> +$TOOLSDIR/cgclassify -g cpu:cpu1 -g net_cls:net1 $PID1 >> +checkpid $PID1 "net_cls,freezer:/net1\ncpuacct,cpu:/cpu1\n" || \ >> + die "STEP3: unexpected group of pid1" >> + >> +# STEP4: different groups multiple times (tha last should win) >> +resetgroup $PID1 $PID2 $PID3 >> +$TOOLSDIR/cgclassify -g "*:/" -g cpu:common -g net_cls:common -g cpu:cpu1 >> -g net_cls:net1 $PID1 || \ >> + die "STEP4: cgclassify pid1 failed" >> +checkpid $PID1 "net_cls,freezer:/net1\ncpuacct,cpu:/cpu1\n" || \ >> + die "STEP4: unexpected group of pid1" >> +$TOOLSDIR/cgclassify -g "*:/" -g cpu:common -g net_cls:common -g cpu:cpu1 >> $PID2 || \ >> + die "STEP4: cgclassify pid2 failed" >> +checkpid $PID2 "net_cls,freezer:/common\ncpuacct,cpu:/cpu1\n" || \ >> + die "STEP4: unexpected group of pid2" >> + >> +# STEP5: some error cases > I preffer here to have the error messages redirected to /dev/null, the > output is less readable with them When the test goes wrong, there is no way how to analyze it without stdout and stderr. >> +# group does not exist >> +echo "Testing error cases, error messages will appear!" >> +$TOOLSDIR/cgclassify -g cpu:invalid_group $PID1&& \ >> + die "STEP5: cgclassify with invalig_group succeeded" >> +# parameter is not a PID >> +$TOOLSDIR/cgclassify -g cpu:/ xxx&& \ >> + die "STEP5: cgclassify with xxx pid succeeded" >> +# let's hope process 1234567 does not exist >> +$TOOLSDIR/cgclassify -g cpu:/ 1234567&& \ >> + die "STEP5: cgclassify with 1234567 succeeded" >> +# not-mounted controller >> +$TOOLSDIR/cgclassify -g xxx:/ $PID1&& \ >> + die "STEP5: cgclassify with xxx controller succeeded" >> +# no -g parameter >> +$TOOLSDIR/cgclassify -g $PID1&& \ >> + die "STEP5: cgclassify without -g succeeded" >> +# invalid -g format >> +$TOOLSDIR/cgclassify -g cpu/cpu1 $PID1&& \ >> + die "STEP5: cgclassify -g cpu/cpu1 succeeded" >> + >> +# some existing processes among unexisting >> +resetgroup $PID1 $PID2 $PID3 >> +$TOOLSDIR/cgclassify -g cpu,net_cls:common $PID1 1234567 $PID2 1234568 >> $PID3&& \ >> + die "STEP5: cgclassify with mixed processed succeeded" >> +checkpid $PID1 "net_cls,freezer:/common\ncpuacct,cpu:/common\n" || \ >> + die "STEP5: unexpected group of pid1" >> +checkpid $PID2 "net_cls,freezer:/common\ncpuacct,cpu:/common\n" || \ >> + die "STEP5: unexpected group of pid2" >> +checkpid $PID3 "net_cls,freezer:/common\ncpuacct,cpu:/common\n" || \ >> + die "STEP5: unexpected group of pid3" >> + >> +echo "End of error cases" >> + >> +# STEP6: *lot of* processes on command line >> +echo "Testing lot of arguments, this will take some time" >> +COUNT=1000 > > Not sure whether the variable is necessary it is used only one time I just think it's easier to find the number if it has a name. So, as result of this review, I take the liberty of letting the patch as it is now. >> +echo>$TMP/pids >> +( >> + for i in `seq $COUNT`; do >> + sleep 100000& >> + echo $!>>$TMP/pids >> + done >> +)> /dev/null >> +$TOOLSDIR/cgclassify -g net_cls,cpu:common `cat $TMP/pids` || \ >> + die "STEP6: cgclassify failed" >> + >> +kill `cat $TMP/pids` >> +sleep 1 # to settle down the sleep load - sigterm does not kill sleep >> immediatelly >> + >> +kill $PID1 $PID2 $PID3 >> +$TOOLSDIR/cgclear >> +cleanup >> +exit 0 >> diff --git a/tests/tools/cgclassify/cgclassify-rules >> b/tests/tools/cgclassify/cgclassify-rules >> new file mode 100755 >> index 0000000..b2b2cd8 >> --- /dev/null >> +++ b/tests/tools/cgclassify/cgclassify-rules >> @@ -0,0 +1,171 @@ >> +#!/bin/bash >> +# >> +# Test cgclassify with various /etc/cgrules.conf settings, like >> +# simple rules, multiple matching rules, using @groups, executable >> +# names and default rules. >> +# The test relies on testenv.sh to backup/restore /etc/cgrules.conf. >> +# >> + >> +. `dirname $0`/../testenv.sh >> + >> +# The test need sto start few processes with non-root UID/GID. Which should >> be >> +# used? >> +TESTUSER=nobody >> +TESTGROUP=nobody >> + >> +function checkpid() >> +{ >> + # check that given process is in given groups >> + local PID=$1 >> + # delete hierarchy number, ignore systemd >> + cat /proc/$PID/cgroup | sed 's/^[0-9]*://' | grep -v systemd> >> $TMP/pid-$PID.group >> + printf>$TMP/pid-$PID.expected "$2" >> + diff -u -w $TMP/pid-$PID.group $TMP/pid-$PID.expected >> + return $? >> +} >> + >> +function resetgroup() >> +{ >> + # move given processes back to root group >> + $TOOLSDIR/cgclassify -g "*:/" $* >> +} >> + >> +# prepare some hierarchy >> +$TOOLSDIR/cgconfigparser -l `prepare_config simple.conf` || \ >> + die "cannot parse simple.conf" >> + >> +# prepare specific process names >> +ln -s /bin/sleep $TMP/sleep1 >> +$TMP/sleep1 10000& >> +PID1=$! >> +ln -s /bin/sleep $TMP/sleep2 >> +$TMP/sleep2 10000& >> +PID2=$! >> + >> +# start some processes as $TESTUSER >> +chmod o+rwX $TMP >> +su $TESTUSER -s /bin/bash -c "$TMP/sleep1 10000"& >> +su $TESTUSER -s /bin/bash -c "$TMP/sleep2 10000"& >> +sleep 0.1 >> +NPID1=`ps h -u $TESTUSER | grep sleep1 | awk '{ print $1; }' | tail -n 1` >> +NPID2=`ps h -u $TESTUSER | grep sleep2 | awk '{ print $1; }' | tail -n 1` >> + >> +# STEP1: simple global rule >> +cat<<EOF>/etc/cgrules.conf >> +unused * / >> +* * common >> +EOF >> +$TOOLSDIR/cgclassify $PID1 >> +checkpid $PID1 "net_cls,freezer:/common\ncpuacct,cpu:/common\n" || \ >> + die "STEP1: unexpected group of pid1" >> +resetgroup $PID1 >> + >> +# STEP2: two destination groups >> +cat<<EOF>/etc/cgrules.conf >> +unused * / >> +* cpu cpu1 >> +% net_cls net1 >> +EOF >> +$TOOLSDIR/cgclassify $PID1 >> +checkpid $PID1 "net_cls,freezer:/net1\ncpuacct,cpu:/cpu1\n" || \ >> + die "STEP2: unexpected group of pid1" >> +resetgroup $PID1 >> + >> +# STEP3: two matching rules, only the first is executed >> +cat<<EOF>/etc/cgrules.conf >> +unused * / >> +* cpu cpu1 >> +* net_cls net1 >> +EOF >> +$TOOLSDIR/cgclassify $PID1 >> +checkpid $PID1 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \ >> + die "STEP3: unexpected group of pid1" >> +resetgroup $PID1 >> + >> +# STEP4: process name in a rule >> +cat<<EOF>/etc/cgrules.conf >> +unused * / >> +*:sleep1 cpu cpu1 >> +*:sleep2 net_cls net1 >> +EOF >> +$TOOLSDIR/cgclassify $PID1 >> +checkpid $PID1 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \ >> + die "STEP4: unexpected group of pid1" >> +$TOOLSDIR/cgclassify $PID2 >> +checkpid $PID2 "net_cls,freezer:/net1\ncpuacct,cpu:/\n" || \ >> + die "STEP4: unexpected group of pid2" >> +resetgroup $PID1 $PID2 >> + >> +# STEP5: full path >> +cat<<EOF>/etc/cgrules.conf >> +unused * / >> +*:$TMP/sleep1 cpu cpu1 >> +*:$TMP/sleep2 net_cls net1 >> +EOF >> +$TOOLSDIR/cgclassify $PID1 >> +checkpid $PID1 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \ >> + die "STEP5: unexpected group of pid1" >> +$TOOLSDIR/cgclassify $PID2 >> +checkpid $PID2 "net_cls,freezer:/net1\ncpuacct,cpu:/\n" || \ >> + die "STEP5: unexpected group of pid2" >> +resetgroup $PID1 $PID2 >> + >> +#STEP6: username >> +cat<<EOF>/etc/cgrules.conf >> +unused * / >> +$TESTUSER cpu cpu1 >> +* net_cls net1 >> +EOF >> +$TOOLSDIR/cgclassify $PID1 $NPID1 >> +checkpid $NPID1 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \ >> + die "STEP6: unexpected group of npid1" >> +checkpid $PID1 "net_cls,freezer:/net1\ncpuacct,cpu:/\n" || \ >> + die "STEP6: unexpected group of pid1" >> +resetgroup $PID1 $NPID1 >> + >> +#STEP7: username + processname >> +cat<<EOF>/etc/cgrules.conf >> +unused * / >> +$TESTUSER:$TMP/sleep1 cpu cpu1 >> +*:$TMP/sleep1 net_cls net1 >> +EOF >> +$TOOLSDIR/cgclassify $PID1 $NPID1 >> +checkpid $NPID1 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \ >> + die "STEP7: unexpected group of npid1" >> +checkpid $PID1 "net_cls,freezer:/net1\ncpuacct,cpu:/\n" || \ >> + die "STEP7: unexpected group of pid1" >> +resetgroup $PID1 $NPID1 >> + >> +#STEP8: groupname + processname >> +cat<<EOF>/etc/cgrules.conf >> +unused * / >> +@$TESTGROUP:$TMP/sleep1 cpu cpu1 >> +*:$TMP/sleep1 net_cls net1 >> +EOF >> +$TOOLSDIR/cgclassify $PID1 $NPID1 >> +checkpid $NPID1 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \ >> + die "STEP8: unexpected group of npid1" >> +checkpid $PID1 "net_cls,freezer:/net1\ncpuacct,cpu:/\n" || \ >> + die "STEP8: unexpected group of pid1" >> +resetgroup $PID1 $NPID1 >> + >> +#STEP9: processname + default >> +cat<<EOF>/etc/cgrules.conf >> +unused * / >> +*:$TMP/sleep1 cpu cpu1 >> +* net_cls net1 >> +EOF >> +$TOOLSDIR/cgclassify $PID1 $PID2 >> +checkpid $PID1 "net_cls,freezer:/\ncpuacct,cpu:/cpu1\n" || \ >> + die "STEP9: unexpected group of pid1" >> +checkpid $PID2 "net_cls,freezer:/net1\ncpuacct,cpu:/\n" || \ >> + die "STEP9: unexpected group of pid2" >> +resetgroup $PID1 $NPID1 >> + >> +kill -9 $PID1 $PID2 $NPID1 $NPID2 >> + >> +sleep 0.1 >> +$TOOLSDIR/cgclear >> + >> +cleanup >> +exit 0 >> diff --git a/tests/tools/cgclassify/simple.conf >> b/tests/tools/cgclassify/simple.conf >> new file mode 100644 >> index 0000000..07f8ccd >> --- /dev/null >> +++ b/tests/tools/cgclassify/simple.conf >> @@ -0,0 +1,24 @@ >> +# Two hierarchies, two controllers each: >> + >> +mount { >> + cpu = TMP/cgroup/cpu; >> + cpuacct = TMP/cgroup/cpu; >> + net_cls = TMP/cgroup/net; >> + freezer = TMP/cgroup/net; >> +} >> + >> +# One group common for all hierarchies: >> + >> +group common { >> + cpu {} >> + net_cls {} >> +} >> + >> +# Two separate groups: >> +group net1 { >> + net_cls{} >> +} >> + >> +group cpu1 { >> + cpu {} >> +} >> >> >> ------------------------------------------------------------------------------ >> Colocation vs. Managed Hosting >> A question and answer guide to determining the best fit >> for your organization - today and in the future. >> http://p.sf.net/sfu/internap-sfd2d >> _______________________________________________ >> Libcg-devel mailing list >> Libcg-devel@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/libcg-devel > > > ------------------------------------------------------------------------------ > Xperia(TM) PLAY > It's a major breakthrough. An authentic gaming > smartphone on the nation's most reliable network. > And it wants your games. > http://p.sf.net/sfu/verizon-sfdev > _______________________________________________ > Libcg-devel mailing list > Libcg-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/libcg-devel ------------------------------------------------------------------------------ Xperia(TM) PLAY It's a major breakthrough. An authentic gaming smartphone on the nation's most reliable network. And it wants your games. http://p.sf.net/sfu/verizon-sfdev _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel