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