Skip to content

Commit

Permalink
test: test external namespace support
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
adrianreber committed May 7, 2020
1 parent 6ad42d7 commit 8fa75e7
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 42 deletions.
3 changes: 3 additions & 0 deletions scripts/travis/travis-tests
Original file line number Diff line number Diff line change
Expand Up @@ -196,4 +196,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
2 changes: 0 additions & 2 deletions test/others/netns_ext/Makefile

This file was deleted.

40 changes: 0 additions & 40 deletions test/others/netns_ext/run.sh

This file was deleted.

7 changes: 7 additions & 0 deletions test/others/ns_ext/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
run:
./run.sh net
./run.sh pid

clean:
rm -rf images output pidfile pidfile2 pidfile3
.PHONY: clean run
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
ip link set up dev lo
echo $$ > $1
while :; do
sleep 1
Expand Down
74 changes: 74 additions & 0 deletions test/others/ns_ext/run.sh
Original file line number Diff line number Diff line change
@@ -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
unshare -p -f 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

0 comments on commit 8fa75e7

Please sign in to comment.