diff options
Diffstat (limited to 'meta-arm/meta-arm-systemready/classes/arm-systemready-acs.bbclass')
-rw-r--r-- | meta-arm/meta-arm-systemready/classes/arm-systemready-acs.bbclass | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/meta-arm/meta-arm-systemready/classes/arm-systemready-acs.bbclass b/meta-arm/meta-arm-systemready/classes/arm-systemready-acs.bbclass new file mode 100644 index 0000000000..e988802368 --- /dev/null +++ b/meta-arm/meta-arm-systemready/classes/arm-systemready-acs.bbclass @@ -0,0 +1,161 @@ +# This class contains the common logic to deploy the SystemReady ACS pre-built +# image and set up the testimage environment. It is to be inherited by recipes +# which contains the URI to download the SystemReady ACS image. +# This class also contains a testimage "postfunc" called acs_logs_handle which +# performs the following functions after the tests have completed: +# * Extract the acs_results directory from the Wic image to +# ${WORKDIR}/testimage +# * Create a symlink to the acs_results in ${TMPDIR}/log/oeqa for ease of +# access +# * Run the test parser, format results, and check results routines + +INHIBIT_DEFAULT_DEPS = "1" +COMPATIBLE_HOST = "aarch64-*" +PACKAGE_ARCH = "${MACHINE_ARCH}" +inherit nopackages deploy rootfs-postcommands ${IMAGE_CLASSES} python3native + +do_configure[noexec] = "1" +do_compile[noexec] = "1" +do_install[noexec] = "1" +do_testimage[depends] += "mtools-native:do_populate_sysroot" + +# Deploy with this suffix so it is picked up in the machine configuration +IMAGE_DEPLOY_SUFFIX ?= ".wic" + +# Post-process commands may write to IMGDEPLOYDIR +IMGDEPLOYDIR = "${DEPLOYDIR}" +# Write the test data in IMAGE_POSTPROCESS_COMMAND +IMAGE_POSTPROCESS_COMMAND += "write_image_test_data; " + +python do_deploy() { + deploydir = d.getVar('DEPLOYDIR') + suffix = d.getVar('IMAGE_DEPLOY_SUFFIX') + imgfile = os.path.join(d.getVar('WORKDIR'), d.getVar('IMAGE_FILENAME')) + deployfile = os.path.join(deploydir, d.getVar('IMAGE_NAME') + suffix) + linkfile = os.path.join(deploydir, d.getVar('IMAGE_LINK_NAME') + suffix) + + # Install the image file in the deploy directory + import shutil + shutil.copyfile(imgfile, deployfile) + if os.path.lexists(linkfile): + os.remove(manifest_link) + os.symlink(os.path.basename(deployfile), linkfile) + + # Run the image post-process commands + from oe.utils import execute_pre_post_process + post_process_cmds = d.getVar("IMAGE_POSTPROCESS_COMMAND") + execute_pre_post_process(d, post_process_cmds) + + # Copy the report.txt to DEPLOYDIR + # The machine-specific implementation can optionally put the report file in + # ${WORKDIR}/report.txt. If there is no such file present, use the template. + workdir = d.getVar('WORKDIR') + report_file = os.path.join(workdir, "report.txt") + report_file_dest = os.path.join(deploydir, "report.txt") + if os.path.exists(report_file): + report_file_to_copy = report_file + else: + report_file_to_copy = os.path.join(workdir, "systemready-ir-template", + "report.txt") + shutil.copyfile(report_file_to_copy, report_file_dest) + + # Ensure an empty rootfs manifest exists (required by testimage) + fname = os.path.join(deploydir, d.getVar('IMAGE_LINK_NAME') + ".manifest") + open(fname, 'w').close() +} +addtask deploy after do_install before do_image_complete + +do_image_complete() { + true +} +addtask image_complete after do_deploy before do_build +do_image_complete[depends] += "arm-systemready-firmware:do_image_complete" + +ACS_LOG_NAME = "acs_results_${DATETIME}" +ACS_LOG_NAME[vardepsexclude] += "DATETIME" +ACS_LOG_DIR = "${TEST_LOG_DIR}/${ACS_LOG_NAME}" +ACS_LOG_LINK = "${TEST_LOG_DIR}/acs_results" +TEST_LOG_DIR = "${WORKDIR}/testimage" +RM_WORK_EXCLUDE_ITEMS += "${@ os.path.basename(d.getVar('TEST_LOG_DIR')) }" + +do_testimage[postfuncs] += "acs_logs_handle" +do_testimage[depends] += "edk2-test-parser-native:do_populate_sysroot \ + arm-systemready-scripts-native:do_populate_sysroot" + +# Process the logs +python acs_logs_handle() { + import logging + from oeqa.utils import make_logger_bitbake_compatible + import shutil + + deploy_dir_image = d.getVar('DEPLOY_DIR_IMAGE') + systemready_scripts_dir = os.path.join(d.getVar('STAGING_LIBDIR_NATIVE'), + "systemready_scripts") + edk2_test_parser_dir = os.path.join(d.getVar('STAGING_LIBDIR_NATIVE'), + "edk2_test_parser") + deployfile = os.path.join(deploy_dir_image, d.getVar('IMAGE_LINK_NAME') + + d.getVar('IMAGE_DEPLOY_SUFFIX')) + + testimage_dir = d.getVar('TEST_LOG_DIR') + logdir = d.getVar('ACS_LOG_DIR') + loglink = d.getVar('ACS_LOG_LINK') + + # Copy the report.txt file from DEPLOY_DIR_IMAGE + report_file = os.path.join(deploy_dir_image, "report.txt") + report_file_dest = os.path.join(testimage_dir, "report.txt") + shutil.copyfile(report_file, report_file_dest) + + # Extract the log files from the Wic image to the testimage logs directory + resultspath = deployfile + ':3/acs_results' + import subprocess + subprocess.run(['wic', 'cp', resultspath, logdir], check=True) + + # Create a symlink to the acs_results directory + if os.path.lexists(loglink): + os.remove(loglink) + os.symlink(os.path.basename(logdir), loglink) + + # Create a top-level symlink to the acs_results directory + top_logdir = os.path.join(get_testimage_json_result_dir(d), d.getVar("PN")) + log_name = d.getVar('ACS_LOG_NAME') + top_link = os.path.join(top_logdir, log_name) + log_target = os.path.relpath(logdir, top_logdir) + os.symlink(log_target, top_link) + + # Parse the logs and generate results file + logger = make_logger_bitbake_compatible(logging.getLogger("BitBake")) + + sct_log = os.path.join(logdir, 'sct_results', 'Overall', 'Summary.ekl') + sct_seq = os.path.join(logdir, 'sct_results', 'Sequence', 'EBBR.seq') + + parser_path = os.path.join(edk2_test_parser_dir, "parser.py") + # format-sr-results.py needs the output file to be called "result.md" + subprocess.run([parser_path, sct_log, sct_seq, "--md", + os.path.join(logdir, "result.md")], check=True) + + scripts_path = os.path.join(systemready_scripts_dir, + "format-sr-results.py") + summary_path = os.path.join(testimage_dir, "summary.md") + subprocess.run([scripts_path, "--dir", testimage_dir, "--md", summary_path], + check=True) + + # Symlink acs-console.log to default_log + subprocess.run(["ln", "-sf", os.path.join(testimage_dir, "default_log"), + os.path.join(testimage_dir, "acs-console.log")], check=True) + + # Run the check-sr-results.py systemready script to check the results + check_sr_results_log_path = os.path.join(testimage_dir, + "check_sr_results.log") + with open(check_sr_results_log_path, "w") as f: + check_sr_results_path = os.path.join(systemready_scripts_dir, + "check-sr-results.py") + try: + subprocess.run([check_sr_results_path, "--dir", testimage_dir, + "--print-meta", "--debug"], + stdout=f, stderr=f, text=True, check=True) + except subprocess.CalledProcessError: + logger.error(f"ACS run failed the check SystemReady results. See " + f"{summary_path} and {check_sr_results_log_path} for " + f"details of the error.") + raise bb.BBHandledException() +} |