Skip to content

Commit cef6232

Browse files
authored
Merge pull request #649 from mihalicyn/stable-6.0-compat-test
github: add lxcfs live upgrade compatibility test (stable-6.0)
2 parents d837e79 + 4513e82 commit cef6232

File tree

3 files changed

+218
-0
lines changed

3 files changed

+218
-0
lines changed

.github/workflows/tests.yml

+63
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,66 @@ jobs:
9393
run: |
9494
echo 1 | sudo tee /sys/fs/cgroup/cpuset/cgroup.clone_children || true
9595
sudo -E PATH="${PATH}" LD_LIBRARY_PATH="${LD_LIBRARY_PATH}" build/tests/main.sh
96+
97+
live-upgrade-compatibility:
98+
name: Live upgrade test
99+
strategy:
100+
fail-fast: false
101+
matrix:
102+
compiler:
103+
- gcc
104+
- clang
105+
os:
106+
- ubuntu-22.04
107+
runs-on: ${{ matrix.os }}
108+
steps:
109+
- name: Checkout code
110+
uses: actions/checkout@v2
111+
112+
- name: Install dependencies
113+
run: |
114+
sudo add-apt-repository universe
115+
sudo apt-get update -qq
116+
sudo apt-get install -qq gcc clang
117+
sudo apt-get install -qq libfuse3-dev uuid-runtime
118+
sudo apt-get install -qq python3 python3-setuptools
119+
sudo pip3 install meson==0.55.1 ninja
120+
121+
- name: Compiler version
122+
env:
123+
CC: ${{ matrix.compiler }}
124+
run: |
125+
${CC} --version
126+
127+
- name: Build PR head version
128+
env:
129+
CC: ${{ matrix.compiler }}
130+
run: |
131+
meson setup -Ddocs=false -Dtests=true -Dinit-script=systemd -Dprefix=/usr -Db_sanitize=address,undefined build/
132+
meson compile -C build
133+
134+
- name: Build upstream head version
135+
env:
136+
CC: ${{ matrix.compiler }}
137+
run: |
138+
git clone -b stable-6.0 https://github.com/lxc/lxcfs.git ../upstream-lxcfs
139+
cd ../upstream-lxcfs
140+
meson setup -Ddocs=false -Dtests=true -Dinit-script=systemd -Dprefix=/usr -Db_sanitize=address,undefined build/
141+
meson compile -C build
142+
143+
- name: Test
144+
env:
145+
CC: ${{ matrix.compiler }}
146+
WORKSPACE_PATH: ${{ github.workspace }}
147+
run: |
148+
UPSTREAM_LXCFS_TREE=$(realpath ${WORKSPACE_PATH}/../upstream-lxcfs)
149+
NEW_LXCFS_TREE="${WORKSPACE_PATH}"
150+
151+
echo "${NEW_LXCFS_TREE}"
152+
echo "${UPSTREAM_LXCFS_TREE}"
153+
154+
cd $UPSTREAM_LXCFS_TREE
155+
[ -f build/tests/live-upgrade-test.sh ] || exit 0
156+
157+
echo 1 | sudo tee /sys/fs/cgroup/cpuset/cgroup.clone_children || true
158+
sudo -E PATH="${PATH}" LD_LIBRARY_PATH="${LD_LIBRARY_PATH}" build/tests/live-upgrade-test.sh "${NEW_LXCFS_TREE}"

tests/live-upgrade-test.sh.in

+143
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
#!/bin/sh
2+
# SPDX-License-Identifier: LGPL-2.1+
3+
4+
set -eu
5+
[ -n "${DEBUG:-}" ] && set -x
6+
7+
[ $(id -u) -eq 0 ]
8+
9+
NEW_LXCFS_TREE=$1
10+
11+
echo "LXCFS trees:"
12+
pwd
13+
echo "${NEW_LXCFS_TREE}"
14+
15+
# Run lxcfs testsuite
16+
export LXCFSDIR=$(mktemp -d)
17+
pidfile=$(mktemp)
18+
export LXCFSPID=-1
19+
20+
cmdline=$(realpath $0)
21+
dirname=$(dirname ${cmdline})
22+
23+
FAILED=1
24+
UNSHARE=1
25+
cleanup() {
26+
echo "=> Cleaning up"
27+
set +e
28+
if [ $LXCFSPID -ne -1 ]; then
29+
kill -9 $LXCFSPID
30+
fi
31+
if [ ${LXCFSDIR} != "/var/lib/lxcfs" ]; then
32+
umount -l ${LXCFSDIR}
33+
rmdir ${LXCFSDIR}
34+
fi
35+
rm -f ${pidfile}
36+
if [ ${FAILED} -eq 1 ]; then
37+
echo "=> FAILED at $TESTCASE"
38+
exit 1
39+
fi
40+
echo "=> PASSED"
41+
exit 0
42+
}
43+
44+
TESTCASE="setup"
45+
lxcfs="{{LXCFS_BUILD_ROOT}}/lxcfs"
46+
47+
if [ -x ${lxcfs} ]; then
48+
if [ -n "${LD_LIBRARY_PATH:-}" ]; then
49+
export LD_LIBRARY_PATH="{{LXCFS_BUILD_ROOT}}:${LD_LIBRARY_PATH}"
50+
else
51+
export LD_LIBRARY_PATH="{{LXCFS_BUILD_ROOT}}"
52+
fi
53+
echo "=> Spawning ${lxcfs} ${LXCFSDIR}"
54+
${lxcfs} --enable-cgroup -p ${pidfile} ${LXCFSDIR} &
55+
LXCFSPID=$!
56+
else
57+
UNSHARE=0
58+
LXCFSPID=$(cat "{{RUNTIME_PATH}}/lxcfs.pid")
59+
echo "=> Re-using host lxcfs"
60+
rmdir $LXCFSDIR
61+
export LXCFSDIR=/var/lib/lxcfs
62+
fi
63+
64+
trap cleanup EXIT HUP INT TERM
65+
66+
count=1
67+
while ! mountpoint -q $LXCFSDIR; do
68+
sleep 1s
69+
if [ $count -gt 5 ]; then
70+
echo "lxcfs failed to start"
71+
false
72+
fi
73+
count=$((count+1))
74+
done
75+
76+
RUNTEST() {
77+
echo ""
78+
echo "=> Running ${TESTCASE}"
79+
80+
if [ "${UNSHARE:-1}" != "0" ]; then
81+
unshare -fmp --mount-proc $*
82+
else
83+
$*
84+
fi
85+
}
86+
87+
RUNTESTS() {
88+
TESTCASE="Stress readdir"
89+
RUNTEST ${dirname}/test_readdir
90+
TESTCASE="test_proc"
91+
RUNTEST ${dirname}/test_proc
92+
TESTCASE="test_cgroup"
93+
RUNTEST ${dirname}/test_cgroup
94+
TESTCASE="test_read_proc.sh"
95+
RUNTEST ${dirname}/test_read_proc.sh
96+
TESTCASE="cpusetrange"
97+
RUNTEST ${dirname}/test-cpusetrange
98+
TESTCASE="meminfo hierarchy"
99+
RUNTEST ${dirname}/test_meminfo_hierarchy.sh
100+
101+
TESTCASE="SIGUSR2 virtualization mode switching"
102+
echo "==> Switching to non-virtualization mode"
103+
kill -USR2 $LXCFSPID
104+
RUNTEST ${dirname}/test_sigusr2.sh
105+
echo "==> Switching to virtualization mode"
106+
kill -USR2 $LXCFSPID
107+
}
108+
109+
echo ""
110+
echo "=> Running tests BEFORE reload"
111+
RUNTESTS
112+
113+
TESTCASE="liblxcfs reloading (with upgrade)"
114+
115+
rm -f /tmp/lxcfs-iwashere
116+
117+
echo "==> Ensure that lxcfs is functional BEFORE reload"
118+
cat ${LXCFSDIR}/proc/uptime
119+
120+
libdir="{{LXCFS_BUILD_ROOT}}"
121+
122+
[ ! -f /tmp/lxcfs-iwashere ]
123+
rm -f ${libdir}/liblxcfs.so ${libdir}/liblxcfs.la
124+
cp ${NEW_LXCFS_TREE}/build/liblxcfstest.so ${libdir}/liblxcfs.so
125+
126+
echo "==> Reload liblxcfs"
127+
kill -USR1 $LXCFSPID
128+
sleep 1
129+
130+
echo "==> Ensure that lxcfs is functional AFTER reload"
131+
cat ${LXCFSDIR}/proc/uptime
132+
sleep 1
133+
[ -f /tmp/lxcfs-iwashere ]
134+
135+
echo ""
136+
echo "=> Running tests AFTER reload"
137+
RUNTESTS
138+
139+
# Check for any defunct processes - children we didn't reap
140+
n=`ps -ef | grep lxcfs | grep defunct | wc -l`
141+
[ $n = 0 ]
142+
143+
FAILED=0

tests/meson.build

+12
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,18 @@ test_programs += custom_target(
1212
'@OUTPUT@',
1313
])
1414

15+
test_programs += custom_target(
16+
'live-upgrade-test.sh',
17+
build_by_default: want_tests != false,
18+
input: 'live-upgrade-test.sh.in',
19+
output: 'live-upgrade-test.sh',
20+
command: [
21+
meson_render_jinja2,
22+
config_h,
23+
'@INPUT@',
24+
'@OUTPUT@',
25+
])
26+
1527
test_programs += custom_target(
1628
'test_cgroup',
1729
build_by_default: want_tests != false,

0 commit comments

Comments
 (0)