diff options
Diffstat (limited to 'meta/lib/oeqa/utils/postactions.py')
-rw-r--r-- | meta/lib/oeqa/utils/postactions.py | 72 |
1 files changed, 38 insertions, 34 deletions
diff --git a/meta/lib/oeqa/utils/postactions.py b/meta/lib/oeqa/utils/postactions.py index 8104400ac2..c69481db6c 100644 --- a/meta/lib/oeqa/utils/postactions.py +++ b/meta/lib/oeqa/utils/postactions.py | |||
@@ -7,35 +7,32 @@ | |||
7 | # Run a set of actions after tests. The runner provides internal data | 7 | # Run a set of actions after tests. The runner provides internal data |
8 | # dictionary as well as test context to any action to run. | 8 | # dictionary as well as test context to any action to run. |
9 | 9 | ||
10 | from oeqa.utils import get_json_result_dir | 10 | import datetime |
11 | 11 | import io | |
12 | def create_artifacts_directory(d, tc): | 12 | import os |
13 | import shutil | 13 | import stat |
14 | 14 | import subprocess | |
15 | local_artifacts_dir = os.path.join(get_json_result_dir(d), "artifacts") | 15 | import tempfile |
16 | if os.path.isdir(local_artifacts_dir): | 16 | from oeqa.utils import get_artefact_dir |
17 | shutil.rmtree(local_artifacts_dir) | ||
18 | |||
19 | os.makedirs(local_artifacts_dir) | ||
20 | 17 | ||
21 | ################################################################## | 18 | ################################################################## |
22 | # Host/target statistics | 19 | # Host/target statistics |
23 | ################################################################## | 20 | ################################################################## |
24 | 21 | ||
25 | def get_target_disk_usage(d, tc): | 22 | def get_target_disk_usage(d, tc, artifacts_list, outputdir): |
26 | output_file = os.path.join(get_json_result_dir(d), "artifacts", "target_disk_usage.txt") | 23 | output_file = os.path.join(outputdir, "target_disk_usage.txt") |
27 | try: | 24 | try: |
28 | (status, output) = tc.target.run('df -hl') | 25 | (status, output) = tc.target.run('df -h') |
29 | with open(output_file, 'w') as f: | 26 | with open(output_file, 'w') as f: |
30 | f.write(output) | 27 | f.write(output) |
31 | f.write("\n") | 28 | f.write("\n") |
32 | except Exception as e: | 29 | except Exception as e: |
33 | bb.warn(f"Can not get target disk usage: {e}") | 30 | bb.warn(f"Can not get target disk usage: {e}") |
34 | 31 | ||
35 | def get_host_disk_usage(d, tc): | 32 | def get_host_disk_usage(d, tc, artifacts_list, outputdir): |
36 | import subprocess | 33 | import subprocess |
37 | 34 | ||
38 | output_file = os.path.join(get_json_result_dir(d), "artifacts", "host_disk_usage.txt") | 35 | output_file = os.path.join(outputdir, "host_disk_usage.txt") |
39 | try: | 36 | try: |
40 | with open(output_file, 'w') as f: | 37 | with open(output_file, 'w') as f: |
41 | output = subprocess.run(['df', '-hl'], check=True, text=True, stdout=f, env={}) | 38 | output = subprocess.run(['df', '-hl'], check=True, text=True, stdout=f, env={}) |
@@ -61,25 +58,22 @@ def get_artifacts_list(target, raw_list): | |||
61 | 58 | ||
62 | return result | 59 | return result |
63 | 60 | ||
64 | def retrieve_test_artifacts(target, artifacts_list, target_dir): | 61 | def list_and_fetch_failed_tests_artifacts(d, tc, artifacts_list, outputdir): |
65 | local_artifacts_dir = os.path.join(target_dir, "artifacts") | 62 | artifacts_list = get_artifacts_list(tc.target, artifacts_list) |
66 | for artifact_path in artifacts_list: | ||
67 | if not os.path.isabs(artifact_path): | ||
68 | bb.warn(f"{artifact_path} is not an absolute path") | ||
69 | continue | ||
70 | try: | ||
71 | dest_dir = os.path.join(local_artifacts_dir, os.path.dirname(artifact_path[1:])) | ||
72 | os.makedirs(dest_dir, exist_ok=True) | ||
73 | target.copyFrom(artifact_path, dest_dir) | ||
74 | except Exception as e: | ||
75 | bb.warn(f"Can not retrieve {artifact_path} from test target: {e}") | ||
76 | |||
77 | def list_and_fetch_failed_tests_artifacts(d, tc): | ||
78 | artifacts_list = get_artifacts_list(tc.target, d.getVar("TESTIMAGE_FAILED_QA_ARTIFACTS")) | ||
79 | if not artifacts_list: | 63 | if not artifacts_list: |
80 | bb.warn("Could not load artifacts list, skip artifacts retrieval") | 64 | bb.warn("Could not load artifacts list, skip artifacts retrieval") |
81 | else: | 65 | return |
82 | retrieve_test_artifacts(tc.target, artifacts_list, get_json_result_dir(d)) | 66 | try: |
67 | # We need gnu tar for sparse files, not busybox | ||
68 | cmd = "tar --sparse -zcf - " + " ".join(artifacts_list) | ||
69 | (status, output) = tc.target.run(cmd, raw = True) | ||
70 | if status != 0 or not output: | ||
71 | raise Exception("Error while fetching compressed artifacts") | ||
72 | archive_name = os.path.join(outputdir, "tests_artifacts.tar.gz") | ||
73 | with open(archive_name, "wb") as f: | ||
74 | f.write(output) | ||
75 | except Exception as e: | ||
76 | bb.warn(f"Can not retrieve artifacts from test target: {e}") | ||
83 | 77 | ||
84 | 78 | ||
85 | ################################################################## | 79 | ################################################################## |
@@ -87,12 +81,22 @@ def list_and_fetch_failed_tests_artifacts(d, tc): | |||
87 | ################################################################## | 81 | ################################################################## |
88 | 82 | ||
89 | def run_failed_tests_post_actions(d, tc): | 83 | def run_failed_tests_post_actions(d, tc): |
84 | artifacts = d.getVar("TESTIMAGE_FAILED_QA_ARTIFACTS") | ||
85 | # Allow all the code to be disabled by having no artifacts set, e.g. for systems with no ssh support | ||
86 | if not artifacts: | ||
87 | return | ||
88 | |||
89 | outputdir = get_artefact_dir(d) | ||
90 | os.makedirs(outputdir, exist_ok=True) | ||
91 | datestr = datetime.datetime.now().strftime('%Y%m%d') | ||
92 | outputdir = tempfile.mkdtemp(prefix='oeqa-target-artefacts-%s-' % datestr, dir=outputdir) | ||
93 | os.chmod(outputdir, stat.S_IRWXU | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH) | ||
94 | |||
90 | post_actions=[ | 95 | post_actions=[ |
91 | create_artifacts_directory, | ||
92 | list_and_fetch_failed_tests_artifacts, | 96 | list_and_fetch_failed_tests_artifacts, |
93 | get_target_disk_usage, | 97 | get_target_disk_usage, |
94 | get_host_disk_usage | 98 | get_host_disk_usage |
95 | ] | 99 | ] |
96 | 100 | ||
97 | for action in post_actions: | 101 | for action in post_actions: |
98 | action(d, tc) | 102 | action(d, tc, artifacts, outputdir) |