Message ID | 20230112122426.3759938-5-roberto.sassu@huaweicloud.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Support testing with UML kernel | expand |
On 1/12/23 07:24, Roberto Sassu wrote: > From: Roberto Sassu <roberto.sassu@huawei.com> > > Add the new functions _run_user_mode(), _exit_user_mode(), > _init_user_mode() and _cleanup_user_mode() to run the tests inside a system > booted with the UML kernel. > > A typical structure of a script with tests is: > > trap cleanup SIGINT SIGTERM SIGSEGV EXIT > > _cleanup() { > <test cleanup> > } > > cleanup() { > _cleanup_user_mode _cleanup > _report_exit_and_cleanup > } > > <tests implementations> > > _run_user_mode ../linux $PWD/$(basename $0) "env_var1=$env_var1 ..." > > _exit_user_mode ../linux > > _init_user_mode > > <tests init> > > <tests call> > > If the UML_MODE environment variable is not set to 1, ignore the UML kernel > execution and initialization requests, and perform the cleanup in the > current environment. Ignore the same also if the script is already run in > the UML environment, to avoid loops. Instead, for cleanup, do it only in > the UML environment and skip it in the host environment. > > Signal to the host environment failures of tests run in the UML environment > with an unclean shutdown of the UML kernel. > > Add haveged and systemd as dependencies for the tests in ci/fedora.sh, > respectively for initializing the random number generator and for shutting > down the system in the environment created by the UML kernel. > > Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com> > --- > ci/fedora.sh | 4 ++- > tests/functions.sh | 79 +++++++++++++++++++++++++++++++++++++++++++++- > 2 files changed, 81 insertions(+), 2 deletions(-) > > diff --git a/ci/fedora.sh b/ci/fedora.sh > index e60de7981c60..198034a34e3c 100755 > --- a/ci/fedora.sh > +++ b/ci/fedora.sh > @@ -45,7 +45,9 @@ yum -y install \ > vim-common \ > wget \ > which \ > - zstd > + zstd \ > + haveged \ > + systemd > > yum -y install docbook5-style-xsl || true > yum -y install swtpm || true > diff --git a/tests/functions.sh b/tests/functions.sh > index 8f6f02dfcd95..98829d94fae1 100755 > --- a/tests/functions.sh > +++ b/tests/functions.sh > @@ -267,6 +267,16 @@ _report_exit_and_cleanup() { > [ $testsfail -gt 0 ] && echo -n "$RED" || echo -n "$NORM" > echo " FAIL: $testsfail" > echo "$NORM" > + # Signal failure to UML caller with an unclean shutdown. > + if [ -n "$UML_MODE" ] && [ "$UML_MODE" -eq 1 ] && [ $$ -eq 1 ]; then > + if [ -z "$(which poweroff)" ]; then > + echo "Warning: cannot properly shutdown system" > + fi > + > + if [ $testsfail -eq 0 ]; then > + poweroff -f > + fi > + fi > if [ $testsfail -gt 0 ]; then > exit "$FAIL" > elif [ $testspass -gt 0 ]; then > @@ -312,4 +322,71 @@ _softhsm_teardown() { > rm -rf "${SOFTHSM_SETUP_CONFIGDIR}" > unset SOFTHSM_SETUP_CONFIGDIR SOFTHSM2_CONF PKCS11_KEYURI \ > EVMCTL_ENGINE OPENSSL_ENGINE OPENSSL_KEYFORM > -} > \ No newline at end of file > +} > + > +# Syntax: _run_user_mode <UML binary> <init> <additional kernel parameters> > +_run_user_mode() { > + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then > + return > + fi > + > + if [ $$ -eq 1 ]; then > + return > + fi > + > + expect_pass $1 rootfstype=hostfs rw init=$2 quiet mem=256M $3 > +} > + > +# Syntax: _exit_user_mode <UML binary> > +_exit_user_mode() { > + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then > + return > + fi > + > + if [ $$ -eq 1 ]; then > + return > + fi > + > + if [ -f "$1" ]; then > + exit $OK > + fi > +} > + > +# Syntax: _init_user_mode > +_init_user_mode() { > + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then > + return > + fi > + > + if [ $$ -ne 1 ]; then > + return > + fi > + > + mount -t proc proc /proc > + mount -t sysfs sysfs /sys > + mount -t securityfs securityfs /sys/kernel/security > + > + if [ -n "$(which haveged 2> /dev/null)" ]; then > + $(which haveged) -w 1024 &> /dev/null > + fi What's different when it's missing? > + > + pushd $PWD > /dev/null > +} > + > +# Syntax: _cleanup_user_mode <cleanup function> > +_cleanup_user_mode() { > + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then > + $1 > + return > + fi > + > + if [ $$ -ne 1 ]; then > + return > + fi > + > + $1 > + > + umount /sys/kernel/security > + umount /sys > + umount /proc > +} Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
On Thu, 2023-01-12 at 10:00 -0500, Stefan Berger wrote: > On 1/12/23 07:24, Roberto Sassu wrote: > > From: Roberto Sassu <roberto.sassu@huawei.com> > > > > Add the new functions _run_user_mode(), _exit_user_mode(), > > _init_user_mode() and _cleanup_user_mode() to run the tests inside a system > > booted with the UML kernel. > > > > A typical structure of a script with tests is: > > > > trap cleanup SIGINT SIGTERM SIGSEGV EXIT > > > > _cleanup() { > > <test cleanup> > > } > > > > cleanup() { > > _cleanup_user_mode _cleanup > > _report_exit_and_cleanup > > } > > > > <tests implementations> > > > > _run_user_mode ../linux $PWD/$(basename $0) "env_var1=$env_var1 ..." > > > > _exit_user_mode ../linux > > > > _init_user_mode > > > > <tests init> > > > > <tests call> > > > > If the UML_MODE environment variable is not set to 1, ignore the UML kernel > > execution and initialization requests, and perform the cleanup in the > > current environment. Ignore the same also if the script is already run in > > the UML environment, to avoid loops. Instead, for cleanup, do it only in > > the UML environment and skip it in the host environment. > > > > Signal to the host environment failures of tests run in the UML environment > > with an unclean shutdown of the UML kernel. > > > > Add haveged and systemd as dependencies for the tests in ci/fedora.sh, > > respectively for initializing the random number generator and for shutting > > down the system in the environment created by the UML kernel. > > > > Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com> > > --- > > ci/fedora.sh | 4 ++- > > tests/functions.sh | 79 +++++++++++++++++++++++++++++++++++++++++++++- > > 2 files changed, 81 insertions(+), 2 deletions(-) > > > > diff --git a/ci/fedora.sh b/ci/fedora.sh > > index e60de7981c60..198034a34e3c 100755 > > --- a/ci/fedora.sh > > +++ b/ci/fedora.sh > > @@ -45,7 +45,9 @@ yum -y install \ > > vim-common \ > > wget \ > > which \ > > - zstd > > + zstd \ > > + haveged \ > > + systemd > > > > yum -y install docbook5-style-xsl || true > > yum -y install swtpm || true > > diff --git a/tests/functions.sh b/tests/functions.sh > > index 8f6f02dfcd95..98829d94fae1 100755 > > --- a/tests/functions.sh > > +++ b/tests/functions.sh > > @@ -267,6 +267,16 @@ _report_exit_and_cleanup() { > > [ $testsfail -gt 0 ] && echo -n "$RED" || echo -n "$NORM" > > echo " FAIL: $testsfail" > > echo "$NORM" > > + # Signal failure to UML caller with an unclean shutdown. > > + if [ -n "$UML_MODE" ] && [ "$UML_MODE" -eq 1 ] && [ $$ -eq 1 ]; then > > + if [ -z "$(which poweroff)" ]; then > > + echo "Warning: cannot properly shutdown system" > > + fi > > + > > + if [ $testsfail -eq 0 ]; then > > + poweroff -f > > + fi > > + fi > > if [ $testsfail -gt 0 ]; then > > exit "$FAIL" > > elif [ $testspass -gt 0 ]; then > > @@ -312,4 +322,71 @@ _softhsm_teardown() { > > rm -rf "${SOFTHSM_SETUP_CONFIGDIR}" > > unset SOFTHSM_SETUP_CONFIGDIR SOFTHSM2_CONF PKCS11_KEYURI \ > > EVMCTL_ENGINE OPENSSL_ENGINE OPENSSL_KEYFORM > > -} > > \ No newline at end of file > > +} > > + > > +# Syntax: _run_user_mode <UML binary> <init> <additional kernel parameters> > > +_run_user_mode() { > > + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then > > + return > > + fi > > + > > + if [ $$ -eq 1 ]; then > > + return > > + fi > > + > > + expect_pass $1 rootfstype=hostfs rw init=$2 quiet mem=256M $3 > > +} > > + > > +# Syntax: _exit_user_mode <UML binary> > > +_exit_user_mode() { > > + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then > > + return > > + fi > > + > > + if [ $$ -eq 1 ]; then > > + return > > + fi > > + > > + if [ -f "$1" ]; then > > + exit $OK > > + fi > > +} > > + > > +# Syntax: _init_user_mode > > +_init_user_mode() { > > + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then > > + return > > + fi > > + > > + if [ $$ -ne 1 ]; then > > + return > > + fi > > + > > + mount -t proc proc /proc > > + mount -t sysfs sysfs /sys > > + mount -t securityfs securityfs /sys/kernel/security > > + > > + if [ -n "$(which haveged 2> /dev/null)" ]; then > > + $(which haveged) -w 1024 &> /dev/null > > + fi > > What's different when it's missing? The boot time is longer, if I remember correctly. Thanks Roberto > > + > > + pushd $PWD > /dev/null > > +} > > + > > +# Syntax: _cleanup_user_mode <cleanup function> > > +_cleanup_user_mode() { > > + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then > > + $1 > > + return > > + fi > > + > > + if [ $$ -ne 1 ]; then > > + return > > + fi > > + > > + $1 > > + > > + umount /sys/kernel/security > > + umount /sys > > + umount /proc > > +} > > Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
diff --git a/ci/fedora.sh b/ci/fedora.sh index e60de7981c60..198034a34e3c 100755 --- a/ci/fedora.sh +++ b/ci/fedora.sh @@ -45,7 +45,9 @@ yum -y install \ vim-common \ wget \ which \ - zstd + zstd \ + haveged \ + systemd yum -y install docbook5-style-xsl || true yum -y install swtpm || true diff --git a/tests/functions.sh b/tests/functions.sh index 8f6f02dfcd95..98829d94fae1 100755 --- a/tests/functions.sh +++ b/tests/functions.sh @@ -267,6 +267,16 @@ _report_exit_and_cleanup() { [ $testsfail -gt 0 ] && echo -n "$RED" || echo -n "$NORM" echo " FAIL: $testsfail" echo "$NORM" + # Signal failure to UML caller with an unclean shutdown. + if [ -n "$UML_MODE" ] && [ "$UML_MODE" -eq 1 ] && [ $$ -eq 1 ]; then + if [ -z "$(which poweroff)" ]; then + echo "Warning: cannot properly shutdown system" + fi + + if [ $testsfail -eq 0 ]; then + poweroff -f + fi + fi if [ $testsfail -gt 0 ]; then exit "$FAIL" elif [ $testspass -gt 0 ]; then @@ -312,4 +322,71 @@ _softhsm_teardown() { rm -rf "${SOFTHSM_SETUP_CONFIGDIR}" unset SOFTHSM_SETUP_CONFIGDIR SOFTHSM2_CONF PKCS11_KEYURI \ EVMCTL_ENGINE OPENSSL_ENGINE OPENSSL_KEYFORM -} \ No newline at end of file +} + +# Syntax: _run_user_mode <UML binary> <init> <additional kernel parameters> +_run_user_mode() { + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then + return + fi + + if [ $$ -eq 1 ]; then + return + fi + + expect_pass $1 rootfstype=hostfs rw init=$2 quiet mem=256M $3 +} + +# Syntax: _exit_user_mode <UML binary> +_exit_user_mode() { + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then + return + fi + + if [ $$ -eq 1 ]; then + return + fi + + if [ -f "$1" ]; then + exit $OK + fi +} + +# Syntax: _init_user_mode +_init_user_mode() { + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then + return + fi + + if [ $$ -ne 1 ]; then + return + fi + + mount -t proc proc /proc + mount -t sysfs sysfs /sys + mount -t securityfs securityfs /sys/kernel/security + + if [ -n "$(which haveged 2> /dev/null)" ]; then + $(which haveged) -w 1024 &> /dev/null + fi + + pushd $PWD > /dev/null +} + +# Syntax: _cleanup_user_mode <cleanup function> +_cleanup_user_mode() { + if [ -z "$UML_MODE" ] || [ "$UML_MODE" -ne 1 ]; then + $1 + return + fi + + if [ $$ -ne 1 ]; then + return + fi + + $1 + + umount /sys/kernel/security + umount /sys + umount /proc +}