From: alexis.lothore@bootlin.com
To: <Openembedded-core@lists.openembedded.org>
Cc: "Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
"Alexandre Belloni" <alexandre.belloni@bootlin.com>,
"Alexis Lothoré" <alexis.lothore@bootlin.com>
Subject: [OE-Core][PATCH v3 3/4] testimage: implement test artifacts retriever for failing tests
Date: Fri, 9 Jun 2023 08:48:01 +0200 [thread overview]
Message-ID: <20230609064802.11777-4-alexis.lothore@bootlin.com> (raw)
In-Reply-To: <20230609064802.11777-1-alexis.lothore@bootlin.com>
From: Alexis Lothoré <alexis.lothore@bootlin.com>
Add a basic artifacts retrievers in testimage class which:
- triggers when at least one runtime test fails but tests execution
encountered no major issue
- reads a list of paths to retrieve from TESTIMAGE_FAILED_QA_ARTIFACTS
- checks for artifacts presence on target
- retrieve those files over scp thanks to existing ssh class
- store those files in an "artifacts" directory in "tmp/log/oeqa/<image>"
This implementation assumes that the SSH or Qemu target has run and
finished gracefully. If tests do not finish because of an exception,
artifacts will not be retrieved
Bring partial solution to [YOCTO #14901]
Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com>
---
Changes since v2:
- remove ptests directories from default artifact list, now managed in
core-image-ptest.bb
- use new function to check for any failed ptest
Changes since v1:
- only gather artifacts in nominal case (ie qemu runs without any raised
exception)
- list artifacts directly in variable instead of using external file
- use standard variables in artifacts paths
- allow glob patterns usage in artifacts paths
- expand/filter artifacts list on target before retrieving them
- tune default artifacts list
---
meta/classes-recipe/testimage.bbclass | 48 +++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/meta/classes-recipe/testimage.bbclass b/meta/classes-recipe/testimage.bbclass
index b48cd96575d2..765184c18008 100644
--- a/meta/classes-recipe/testimage.bbclass
+++ b/meta/classes-recipe/testimage.bbclass
@@ -18,6 +18,15 @@ inherit image-artifact-names
TESTIMAGE_AUTO ??= "0"
+# When any test fails, TESTIMAGE_FAILED_QA ARTIFACTS will be parsed and for
+# each entry in it, if artifact pointed by path description exists on target,
+# it will be retrieved onto host
+
+TESTIMAGE_FAILED_QA_ARTIFACTS ??= "\
+ ${localstatedir}/log \
+ ${sysconfdir}/version \
+ ${sysconfdir}/os-release"
+
# You can set (or append to) TEST_SUITES in local.conf to select the tests
# which you want to run for your target.
# The test names are the module names in meta/lib/oeqa/runtime/cases.
@@ -192,6 +201,39 @@ def get_testimage_boot_patterns(d):
boot_patterns[flag] = flagval.encode().decode('unicode-escape')
return boot_patterns
+def get_artifacts_list(target, raw_list):
+ result = []
+ # Passed list may contains patterns in paths, expand them directly on target
+ for raw_path in raw_list.split():
+ cmd = f"for p in {raw_path}; do if [ -e $p ]; then echo $p; fi; done"
+ try:
+ status, output = target.run(cmd)
+ if status != 0 or not output:
+ raise Exception()
+ result += output.split()
+ except:
+ bb.warn(f"No file/directory matching path {raw_path}")
+
+ return result
+
+def retrieve_test_artifacts(target, artifacts_list, target_dir):
+ import shutil
+
+ local_artifacts_dir = os.path.join(target_dir, "artifacts")
+ if os.path.isdir(local_artifacts_dir):
+ shutil.rmtree(local_artifacts_dir)
+
+ os.makedirs(local_artifacts_dir)
+ for artifact_path in artifacts_list:
+ if not os.path.isabs(artifact_path):
+ bb.warn(f"{artifact_path} is not an absolute path")
+ continue
+ try:
+ dest_dir = os.path.join(local_artifacts_dir, os.path.dirname(artifact_path[1:]))
+ os.makedirs(dest_dir, exist_ok=True)
+ target.copyFrom(artifact_path, dest_dir)
+ except:
+ bb.warn(f"Can not retrieve {artifact_path} from test target")
def testimage_main(d):
import os
@@ -383,6 +425,12 @@ def testimage_main(d):
pass
results = tc.runTests()
complete = True
+ if results.hasAnyFailingTest():
+ artifacts_list = get_artifacts_list(tc.target, d.getVar("TESTIMAGE_FAILED_QA_ARTIFACTS"))
+ if not artifacts_list:
+ bb.warn("Could not load artifacts list, skip artifacts retrieval")
+ else:
+ retrieve_test_artifacts(tc.target, artifacts_list, get_testimage_json_result_dir(d))
except (KeyboardInterrupt, BlockingIOError) as err:
if isinstance(err, KeyboardInterrupt):
bb.error('testimage interrupted, shutting down...')
--
2.40.1
next prev parent reply other threads:[~2023-06-09 6:47 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-09 6:47 [OE-Core][PATCH v3 0/4] add failed tests artifacts retriever alexis.lothore
2023-06-09 6:47 ` [OE-Core][PATCH v3 1/4] oeqa/core/runner: add helper to know about expected failures alexis.lothore
2023-06-09 6:48 ` [OE-Core][PATCH v3 2/4] oeqa/target/ssh: update options for SCP alexis.lothore
2023-06-09 6:48 ` alexis.lothore [this message]
2023-06-09 6:48 ` [OE-Core][PATCH v3 4/4] core-image-ptest: append ptest directory to artifacts list alexis.lothore
2023-06-09 6:52 ` Mikko Rapeli
2023-06-09 7:24 ` Alexis Lothoré
2023-06-11 15:16 ` Alexander Kanavin
2023-06-11 15:48 ` Alex Kiernan
2023-06-15 7:03 ` Richard Purdie
2023-06-15 8:34 ` Mikko Rapeli
2023-06-15 9:05 ` Richard Purdie
2023-06-15 21:27 ` Peter Kjellerstedt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230609064802.11777-4-alexis.lothore@bootlin.com \
--to=alexis.lothore@bootlin.com \
--cc=Openembedded-core@lists.openembedded.org \
--cc=alexandre.belloni@bootlin.com \
--cc=thomas.petazzoni@bootlin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.