testsuite: cleanup qemu machines left running

Message ID 20240823052706.25962-1-ubely@ilbers.de
State Superseded, archived
Headers show
Series testsuite: cleanup qemu machines left running | expand

Commit Message

Uladzimir Bely Aug. 23, 2024, 5:26 a.m. UTC
Parameter "keep=True" in `vm_start` function allows to share the same
qemu process between different tests.

In case the machine is forgotten to be closed by the last test or in
case avocado skips some tests (due to internal error or other reason)
such qemu processes stay running after the testsuite completed.

This change allows to terminate these processes.

Signed-off-by: Uladzimir Bely <ubely@ilbers.de>
---
 scripts/ci_build.sh  |  5 ++++-
 testsuite/cleanup.py | 26 ++++++++++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100755 testsuite/cleanup.py

Comments

Anton Mikanovich Aug. 23, 2024, 9:30 a.m. UTC | #1
23/08/2024 08:26, Uladzimir Bely wrote:
> Parameter "keep=True" in `vm_start` function allows to share the same
> qemu process between different tests.
>
> In case the machine is forgotten to be closed by the last test or in
> case avocado skips some tests (due to internal error or other reason)
> such qemu processes stay running after the testsuite completed.
>
> This change allows to terminate these processes.
>
> Signed-off-by: Uladzimir Bely <ubely@ilbers.de>
> ---
>   scripts/ci_build.sh  |  5 ++++-
>   testsuite/cleanup.py | 26 ++++++++++++++++++++++++++
>   2 files changed, 30 insertions(+), 1 deletion(-)
>   create mode 100755 testsuite/cleanup.py
>
> diff --git a/scripts/ci_build.sh b/scripts/ci_build.sh
> index 0aa2403d..b643b5a6 100755
> --- a/scripts/ci_build.sh
> +++ b/scripts/ci_build.sh
> @@ -147,4 +147,7 @@ set -x
>   
>   avocado ${VERBOSE} run "${TESTSUITE_DIR}/citest.py" \
>       -t "${TAGS}" --max-parallel-tasks=1 --disable-sysinfo \
> -    ${SSTATE} ${TIMEOUT}
> +    ${SSTATE} ${TIMEOUT} \
> +    || true
Why not just 'set +e' before avocado call?
> +
> +python3 ${TESTSUITE_DIR}/cleanup.py
> diff --git a/testsuite/cleanup.py b/testsuite/cleanup.py
> new file mode 100755
> index 00000000..c81397d2
> --- /dev/null
> +++ b/testsuite/cleanup.py
> @@ -0,0 +1,26 @@
> +#!/usr/bin/env python3
> +
> +import os
> +import pickle
> +import signal
> +
> +build_dir = os.path.join(os.path.dirname(__file__), '..', 'build')
> +
> +vm_dict_file = f"{build_dir}/vm_dict_file"
> +vm_dict = {}
> +
> +if os.path.isfile(vm_dict_file):
> +    with open(vm_dict_file, 'rb') as f:
> +        data = f.read()
> +        if data:
> +            vm_dict = pickle.loads(data)
> +
> +for vm in vm_dict:
> +    pid = vm_dict[vm][0]
> +    name = vm_dict[vm][1][0]
> +    print(f"Killing {name} process with pid {pid}", end ="... ")
> +    try:
> +        os.kill(pid, signal.SIGKILL)
> +        print("OK")
> +    except ProcessLookupError:
> +        print("Not found")

Patch

diff --git a/scripts/ci_build.sh b/scripts/ci_build.sh
index 0aa2403d..b643b5a6 100755
--- a/scripts/ci_build.sh
+++ b/scripts/ci_build.sh
@@ -147,4 +147,7 @@  set -x
 
 avocado ${VERBOSE} run "${TESTSUITE_DIR}/citest.py" \
     -t "${TAGS}" --max-parallel-tasks=1 --disable-sysinfo \
-    ${SSTATE} ${TIMEOUT}
+    ${SSTATE} ${TIMEOUT} \
+    || true
+
+python3 ${TESTSUITE_DIR}/cleanup.py
diff --git a/testsuite/cleanup.py b/testsuite/cleanup.py
new file mode 100755
index 00000000..c81397d2
--- /dev/null
+++ b/testsuite/cleanup.py
@@ -0,0 +1,26 @@ 
+#!/usr/bin/env python3
+
+import os
+import pickle
+import signal
+
+build_dir = os.path.join(os.path.dirname(__file__), '..', 'build')
+
+vm_dict_file = f"{build_dir}/vm_dict_file"
+vm_dict = {}
+
+if os.path.isfile(vm_dict_file):
+    with open(vm_dict_file, 'rb') as f:
+        data = f.read()
+        if data:
+            vm_dict = pickle.loads(data)
+
+for vm in vm_dict:
+    pid = vm_dict[vm][0]
+    name = vm_dict[vm][1][0]
+    print(f"Killing {name} process with pid {pid}", end ="... ")
+    try:
+        os.kill(pid, signal.SIGKILL)
+        print("OK")
+    except ProcessLookupError:
+        print("Not found")