test: test external namespace support

Adapt netns_ext tests to also work with pid namespaces and move it from
test/others/netns_ext/ to test/others/ns_ext/.

Also enable ns_ext tests in Travis runs.

Signed-off-by: Adrian Reber <areber@redhat.com>
This commit is contained in:
Adrian Reber 2020-05-06 08:04:45 +00:00 committed by Andrei Vagin
parent ad7237ed4e
commit 27b13b2fe1
6 changed files with 85 additions and 42 deletions

View file

@ -211,4 +211,7 @@ ip net add test
# libcriu testing
make -C test/others/libcriu run
# external namespace testing
make -C test/others/ns_ext run
make -C test/others/shell-job

View file

@ -1,2 +0,0 @@
run:
./run.sh

View file

@ -1,40 +0,0 @@
#!/bin/bash
set -e
CRIU=../../../criu/criu
setsid unshare -n bash -c 'unshare -n sh _run.sh pidfile2 & unshare -n sh _run.sh pidfile3 & ip link add xxx type veth && ip link add mymacvlan1 link xxx type macvlan mode bridge && . _run.sh pidfile' < /dev/zero &> output &
sleep 1
while :; do
test -f pidfile && test -f pidfile2 && break;
sleep 0.1
done
pid=$(cat pidfile)
pid2=$(cat pidfile2)
touch test_netns
mount --bind /proc/$pid/ns/net test_netns
touch test_netns2
mount --bind /proc/$pid2/ns/net test_netns2
mkdir -p images
ino=$(ls -iL test_netns | awk '{ print $1 }')
ino2=$(ls -iL test_netns2 | awk '{ print $1 }')
exec 33< test_netns
exec 34< test_netns2
$CRIU dump -t $pid -o dump.log -D images --external net[$ino]:test_netns --external net[$ino2]:test_netns2
cat images/dump.log | grep -B 5 Error || echo ok
$CRIU restore -o restore.log -D images --inherit-fd fd[33]:test_netns --inherit-fd fd[34]:test_netns2 -d
cat images/restore.log | grep -B 5 Error || echo ok
new_ino=$(ls -iL /proc/$pid/ns/net | awk '{ print $1 }')
new_ino2=$(ls -iL /proc/$pid2/ns/net | awk '{ print $1 }')
[ "$ino" -ne "$new_ino" ] && {
echo FAIL
exit 1
}
[ "$ino2" -ne "$new_ino2" ] && {
echo FAIL
exit 1
}
echo PASS
exit 0

View file

@ -0,0 +1,7 @@
run:
./run.sh net
./run.sh pid
clean:
rm -rf images output pidfile pidfile2 pidfile3
.PHONY: clean run

View file

@ -1,3 +1,4 @@
ip link set up dev lo
echo $$ > $1
while :; do
sleep 1

74
test/others/ns_ext/run.sh Executable file
View file

@ -0,0 +1,74 @@
#!/bin/bash
set -x
if [[ "$1" == "pid" ]]; then
NS=pid
else
NS=net
fi
MNT1=test_ns1
MNT2=test_ns2
trap "cleanup" QUIT TERM INT HUP EXIT
function cleanup()
{
kill -9 $pid $pid2
sleep 0.5
umount -lf $MNT1 $MNT2 || :
rm -f $MNT1 $MNT2
rm -f pidfile pidfile2 pidfile3
}
CRIU=../../../criu/criu
if [[ "$NS" == "net" ]]; then
setsid unshare -n bash -c 'unshare -n sh _run.sh pidfile2 & unshare -n sh _run.sh pidfile3 & ip link add xxx type veth && ip link add mymacvlan1 link xxx type macvlan mode bridge && . _run.sh pidfile' < /dev/zero &> output &
elif [[ "$NS" == "pid" ]]; then
RND1=$RANDOM
RND2=$RANDOM
setsid unshare -p -f setsid bash -c "setsid sh _run.sh pidfile2 $RND2 & . _run.sh pidfile $RND1" < /dev/zero &> output &
fi
sleep 1
while :; do
test -f pidfile && test -f pidfile2 && break;
sleep 0.1
done
if [[ "$NS" == "net" ]]; then
pid=$(cat pidfile)
pid2=$(cat pidfile2)
elif [[ "$NS" == "pid" ]]; then
pid2=$(pgrep -f ". _run.sh pidfile $RND1" -n)
pid=$(pgrep -f "sh _run.sh pidfile2 $RND2" -n)
fi
touch $MNT1
mount --bind /proc/$pid/ns/$NS $MNT1
touch $MNT2
mount --bind /proc/$pid2/ns/$NS $MNT2
mkdir -p images
ino=$(ls -iL $MNT1 | awk '{ print $1 }')
ino2=$(ls -iL $MNT2 | awk '{ print $1 }')
exec 33< $MNT1
exec 34< $MNT2
$CRIU dump -v4 -t $pid -o dump.log -D images --external $NS[$ino]:test_ns --external $NS[$ino2]:test_ns2
cat images/dump.log | grep -B 5 Error || echo ok
$CRIU restore -v4 -o restore.log -D images --inherit-fd fd[33]:test_ns --inherit-fd fd[34]:test_ns2 -d
cat images/restore.log | grep -B 5 Error || echo ok
if [[ "$NS" == "pid" ]]; then
pid=$(pgrep -f "^sh _run.sh pidfile2 $RND2")
fi
new_ino=$(ls -iL /proc/$pid/ns/$NS | awk '{ print $1 }')
new_ino2=$(ls -iL /proc/$pid2/ns/$NS | awk '{ print $1 }')
[ "$ino" != "$new_ino" ] && {
echo FAIL
exit 1
}
[ "$ino2" != "$new_ino2" ] && {
echo FAIL
exit 1
}
echo PASS
exit 0