Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 1 | # This class contains the common logic to deploy the SystemReady ACS pre-built |
| 2 | # image and set up the testimage environment. It is to be inherited by recipes |
| 3 | # which contains the URI to download the SystemReady ACS image. |
| 4 | # This class also contains a testimage "postfunc" called acs_logs_handle which |
| 5 | # performs the following functions after the tests have completed: |
| 6 | # * Extract the acs_results directory from the Wic image to |
| 7 | # ${WORKDIR}/testimage |
| 8 | # * Create a symlink to the acs_results in ${TMPDIR}/log/oeqa for ease of |
| 9 | # access |
| 10 | # * Run the test parser, format results, and check results routines |
| 11 | |
| 12 | INHIBIT_DEFAULT_DEPS = "1" |
| 13 | COMPATIBLE_HOST = "aarch64-*" |
| 14 | PACKAGE_ARCH = "${MACHINE_ARCH}" |
Patrick Williams | 169d7bc | 2024-01-05 11:33:25 -0600 | [diff] [blame] | 15 | inherit nopackages deploy rootfs-postcommands ${IMAGE_CLASSES} python3native testimage |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 16 | |
| 17 | do_configure[noexec] = "1" |
| 18 | do_compile[noexec] = "1" |
| 19 | do_install[noexec] = "1" |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 20 | |
| 21 | # Deploy with this suffix so it is picked up in the machine configuration |
| 22 | IMAGE_DEPLOY_SUFFIX ?= ".wic" |
| 23 | |
| 24 | # Post-process commands may write to IMGDEPLOYDIR |
| 25 | IMGDEPLOYDIR = "${DEPLOYDIR}" |
| 26 | # Write the test data in IMAGE_POSTPROCESS_COMMAND |
| 27 | IMAGE_POSTPROCESS_COMMAND += "write_image_test_data; " |
| 28 | |
| 29 | python do_deploy() { |
| 30 | deploydir = d.getVar('DEPLOYDIR') |
| 31 | suffix = d.getVar('IMAGE_DEPLOY_SUFFIX') |
| 32 | imgfile = os.path.join(d.getVar('WORKDIR'), d.getVar('IMAGE_FILENAME')) |
| 33 | deployfile = os.path.join(deploydir, d.getVar('IMAGE_NAME') + suffix) |
| 34 | linkfile = os.path.join(deploydir, d.getVar('IMAGE_LINK_NAME') + suffix) |
| 35 | |
| 36 | # Install the image file in the deploy directory |
| 37 | import shutil |
| 38 | shutil.copyfile(imgfile, deployfile) |
| 39 | if os.path.lexists(linkfile): |
| 40 | os.remove(manifest_link) |
| 41 | os.symlink(os.path.basename(deployfile), linkfile) |
| 42 | |
| 43 | # Run the image post-process commands |
| 44 | from oe.utils import execute_pre_post_process |
| 45 | post_process_cmds = d.getVar("IMAGE_POSTPROCESS_COMMAND") |
| 46 | execute_pre_post_process(d, post_process_cmds) |
| 47 | |
| 48 | # Copy the report.txt to DEPLOYDIR |
| 49 | # The machine-specific implementation can optionally put the report file in |
| 50 | # ${WORKDIR}/report.txt. If there is no such file present, use the template. |
| 51 | workdir = d.getVar('WORKDIR') |
| 52 | report_file = os.path.join(workdir, "report.txt") |
| 53 | report_file_dest = os.path.join(deploydir, "report.txt") |
| 54 | if os.path.exists(report_file): |
| 55 | report_file_to_copy = report_file |
| 56 | else: |
| 57 | report_file_to_copy = os.path.join(workdir, "systemready-ir-template", |
| 58 | "report.txt") |
| 59 | shutil.copyfile(report_file_to_copy, report_file_dest) |
| 60 | |
| 61 | # Ensure an empty rootfs manifest exists (required by testimage) |
| 62 | fname = os.path.join(deploydir, d.getVar('IMAGE_LINK_NAME') + ".manifest") |
| 63 | open(fname, 'w').close() |
| 64 | } |
| 65 | addtask deploy after do_install before do_image_complete |
| 66 | |
| 67 | do_image_complete() { |
| 68 | true |
| 69 | } |
| 70 | addtask image_complete after do_deploy before do_build |
| 71 | do_image_complete[depends] += "arm-systemready-firmware:do_image_complete" |
| 72 | |
| 73 | ACS_LOG_NAME = "acs_results_${DATETIME}" |
| 74 | ACS_LOG_NAME[vardepsexclude] += "DATETIME" |
| 75 | ACS_LOG_DIR = "${TEST_LOG_DIR}/${ACS_LOG_NAME}" |
| 76 | ACS_LOG_LINK = "${TEST_LOG_DIR}/acs_results" |
| 77 | TEST_LOG_DIR = "${WORKDIR}/testimage" |
| 78 | RM_WORK_EXCLUDE_ITEMS += "${@ os.path.basename(d.getVar('TEST_LOG_DIR')) }" |
| 79 | |
| 80 | do_testimage[postfuncs] += "acs_logs_handle" |
| 81 | do_testimage[depends] += "edk2-test-parser-native:do_populate_sysroot \ |
Patrick Williams | 169d7bc | 2024-01-05 11:33:25 -0600 | [diff] [blame] | 82 | arm-systemready-scripts-native:do_populate_sysroot \ |
| 83 | mtools-native:do_populate_sysroot \ |
| 84 | parted-native:do_populate_sysroot" |
Patrick Williams | ac13d5f | 2023-11-24 18:59:46 -0600 | [diff] [blame] | 85 | |
| 86 | # Process the logs |
| 87 | python acs_logs_handle() { |
| 88 | import logging |
| 89 | from oeqa.utils import make_logger_bitbake_compatible |
| 90 | import shutil |
| 91 | |
| 92 | deploy_dir_image = d.getVar('DEPLOY_DIR_IMAGE') |
| 93 | systemready_scripts_dir = os.path.join(d.getVar('STAGING_LIBDIR_NATIVE'), |
| 94 | "systemready_scripts") |
| 95 | edk2_test_parser_dir = os.path.join(d.getVar('STAGING_LIBDIR_NATIVE'), |
| 96 | "edk2_test_parser") |
| 97 | deployfile = os.path.join(deploy_dir_image, d.getVar('IMAGE_LINK_NAME') |
| 98 | + d.getVar('IMAGE_DEPLOY_SUFFIX')) |
| 99 | |
| 100 | testimage_dir = d.getVar('TEST_LOG_DIR') |
| 101 | logdir = d.getVar('ACS_LOG_DIR') |
| 102 | loglink = d.getVar('ACS_LOG_LINK') |
| 103 | |
| 104 | # Copy the report.txt file from DEPLOY_DIR_IMAGE |
| 105 | report_file = os.path.join(deploy_dir_image, "report.txt") |
| 106 | report_file_dest = os.path.join(testimage_dir, "report.txt") |
| 107 | shutil.copyfile(report_file, report_file_dest) |
| 108 | |
| 109 | # Extract the log files from the Wic image to the testimage logs directory |
| 110 | resultspath = deployfile + ':3/acs_results' |
| 111 | import subprocess |
| 112 | subprocess.run(['wic', 'cp', resultspath, logdir], check=True) |
| 113 | |
| 114 | # Create a symlink to the acs_results directory |
| 115 | if os.path.lexists(loglink): |
| 116 | os.remove(loglink) |
| 117 | os.symlink(os.path.basename(logdir), loglink) |
| 118 | |
| 119 | # Create a top-level symlink to the acs_results directory |
| 120 | top_logdir = os.path.join(get_testimage_json_result_dir(d), d.getVar("PN")) |
| 121 | log_name = d.getVar('ACS_LOG_NAME') |
| 122 | top_link = os.path.join(top_logdir, log_name) |
| 123 | log_target = os.path.relpath(logdir, top_logdir) |
| 124 | os.symlink(log_target, top_link) |
| 125 | |
| 126 | # Parse the logs and generate results file |
| 127 | logger = make_logger_bitbake_compatible(logging.getLogger("BitBake")) |
| 128 | |
| 129 | sct_log = os.path.join(logdir, 'sct_results', 'Overall', 'Summary.ekl') |
| 130 | sct_seq = os.path.join(logdir, 'sct_results', 'Sequence', 'EBBR.seq') |
| 131 | |
| 132 | parser_path = os.path.join(edk2_test_parser_dir, "parser.py") |
| 133 | # format-sr-results.py needs the output file to be called "result.md" |
| 134 | subprocess.run([parser_path, sct_log, sct_seq, "--md", |
| 135 | os.path.join(logdir, "result.md")], check=True) |
| 136 | |
| 137 | scripts_path = os.path.join(systemready_scripts_dir, |
| 138 | "format-sr-results.py") |
| 139 | summary_path = os.path.join(testimage_dir, "summary.md") |
| 140 | subprocess.run([scripts_path, "--dir", testimage_dir, "--md", summary_path], |
| 141 | check=True) |
| 142 | |
| 143 | # Symlink acs-console.log to default_log |
| 144 | subprocess.run(["ln", "-sf", os.path.join(testimage_dir, "default_log"), |
| 145 | os.path.join(testimage_dir, "acs-console.log")], check=True) |
| 146 | |
| 147 | # Run the check-sr-results.py systemready script to check the results |
| 148 | check_sr_results_log_path = os.path.join(testimage_dir, |
| 149 | "check_sr_results.log") |
| 150 | with open(check_sr_results_log_path, "w") as f: |
| 151 | check_sr_results_path = os.path.join(systemready_scripts_dir, |
| 152 | "check-sr-results.py") |
| 153 | try: |
| 154 | subprocess.run([check_sr_results_path, "--dir", testimage_dir, |
| 155 | "--print-meta", "--debug"], |
| 156 | stdout=f, stderr=f, text=True, check=True) |
| 157 | except subprocess.CalledProcessError: |
| 158 | logger.error(f"ACS run failed the check SystemReady results. See " |
| 159 | f"{summary_path} and {check_sr_results_log_path} for " |
| 160 | f"details of the error.") |
| 161 | raise bb.BBHandledException() |
| 162 | } |