[OE-core] [PATCH v2] resulttool: Add option to dump all ptest logs

Joshua Watt jpewhacker at gmail.com
Wed May 8 16:16:23 UTC 2019


Adds an option to dump all the ptest logs to individual files in a
specified directory. If multiple test runs are present, the
'--prepend-run' argument will create separate directories for each test
run under the target directory and put the logs there to prevent each
test run from clobbering the others.

[YOCTO #13331]

Signed-off-by: Joshua Watt <JPEWhacker at gmail.com>
---
 scripts/lib/resulttool/log.py         | 54 +++++++++++++++++++--------
 scripts/lib/resulttool/resultutils.py | 16 ++++++++
 2 files changed, 54 insertions(+), 16 deletions(-)

diff --git a/scripts/lib/resulttool/log.py b/scripts/lib/resulttool/log.py
index 5584f2d0a99..49816357cda 100644
--- a/scripts/lib/resulttool/log.py
+++ b/scripts/lib/resulttool/log.py
@@ -11,6 +11,7 @@
 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 # more details.
 #
+import os
 import resulttool.resultutils as resultutils
 
 def show_ptest(result, ptest, logger):
@@ -24,22 +25,38 @@ def show_ptest(result, ptest, logger):
 
 def log(args, logger):
     results = resultutils.load_resultsdata(args.source)
-    for path in results:
-        for res in results[path]:
-            if 'result' not in results[path][res]:
-                continue
-            r = results[path][res]['result']
-
-            if args.raw:
-                if 'ptestresult.rawlogs' in r:
-                    print(r['ptestresult.rawlogs']['log'])
-                else:
-                    print('Raw logs not found')
-                    return 1
-
-            for ptest in args.ptest:
-                if not show_ptest(r, ptest, logger):
-                    return 1
+
+    ptest_count = sum(1 for _, _, _, r in resultutils.test_run_results(results) if 'ptestresult.sections' in r)
+    if ptest_count > 1 and not args.prepend_run:
+        print("%i ptest sections found. '--prepend-run' is required" % ptest_count)
+        return 1
+
+    for _, run_name, _, r in resultutils.test_run_results(results):
+        if args.dump_ptest:
+            if 'ptestresult.sections' in r:
+                for name, ptest in r['ptestresult.sections'].items():
+                    if 'log' in ptest:
+                        dest_dir = args.dump_ptest
+                        if args.prepend_run:
+                            dest_dir = os.path.join(dest_dir, run_name)
+
+                        os.makedirs(dest_dir, exist_ok=True)
+
+                        dest = os.path.join(dest_dir, '%s.log' % name)
+                        print(dest)
+                        with open(dest, 'w') as f:
+                            f.write(ptest['log'])
+
+        if args.raw:
+            if 'ptestresult.rawlogs' in r:
+                print(r['ptestresult.rawlogs']['log'])
+            else:
+                print('Raw logs not found')
+                return 1
+
+        for ptest in args.ptest:
+            if not show_ptest(r, ptest, logger):
+                return 1
 
 def register_commands(subparsers):
     """Register subcommands from this plugin"""
@@ -51,6 +68,11 @@ def register_commands(subparsers):
             help='the results file/directory/URL to import')
     parser.add_argument('--ptest', action='append', default=[],
             help='show logs for a ptest')
+    parser.add_argument('--dump-ptest', metavar='DIR',
+            help='Dump all ptest log files to the specified directory.')
+    parser.add_argument('--prepend-run', action='store_true',
+            help='''Dump ptest results to a subdirectory named after the test run when using --dump-ptest.
+                    Required if more than one test run is present in the result file''')
     parser.add_argument('--raw', action='store_true',
             help='show raw logs')
 
diff --git a/scripts/lib/resulttool/resultutils.py b/scripts/lib/resulttool/resultutils.py
index 8d17c7cd658..07dab4cbd31 100644
--- a/scripts/lib/resulttool/resultutils.py
+++ b/scripts/lib/resulttool/resultutils.py
@@ -167,3 +167,19 @@ def git_get_result(repo, tags):
         append_resultsdata(results, obj)
 
     return results
+
+def test_run_results(results):
+    """
+    Convenient generator function that iterates over all test runs that have a
+    result section.
+
+    Generates a tuple of:
+        (result json file path, test run name, test run (dict), test run "results" (dict))
+    for each test run that has a "result" section
+    """
+    for path in results:
+        for run_name, test_run in results[path].items():
+            if not 'result' in test_run:
+                continue
+            yield path, run_name, test_run, test_run['result']
+
-- 
2.20.1



More information about the Openembedded-core mailing list