blob: 5fc93e88347cabb52751257d879a347dd5357a03 [file] [log] [blame]
Lorenz Brun547b33f2020-04-23 15:27:06 +02001# Copyright 2020 The Monogon Project Authors.
2#
3# SPDX-License-Identifier: Apache-2.0
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17"""
Serge Bazanski662b5b32020-12-21 13:49:00 +010018Ktest provides a macro to run tests under a normal Metropolis node kernel
Lorenz Brun547b33f2020-04-23 15:27:06 +020019"""
20
Jan Schär0fd36f42025-04-29 10:26:03 +000021load("//osbase/build:def.bzl", "build_static_transition")
Tim Windelschmidtbed76d92025-02-18 03:04:14 +010022load("//osbase/build/fsspec:def.bzl", "FSSpecInfo", "fsspec_core_impl")
Lorenz Brunddd6caf2021-03-04 17:16:04 +010023
Lorenz Brunb69a71c2024-12-23 14:12:46 +010024_KTEST_SCRIPT = """
25#!/usr/bin/env bash
Lorenz Brunddd6caf2021-03-04 17:16:04 +010026
Lorenz Brunb69a71c2024-12-23 14:12:46 +010027exec "{ktest}" -initrd-path "{initrd}" -kernel-path "{kernel}" -cmdline "{cmdline}"
28"""
29
30def _ktest_impl(ctx):
31 initramfs_name = ctx.label.name + ".cpio.zst"
32 initramfs = ctx.actions.declare_file(initramfs_name)
33
Tim Windelschmidt24bf6fd2025-02-12 04:48:24 +010034 fsspec_core_impl(ctx, ctx.executable._mkcpio, initramfs, [("/init", ctx.attr._ktest_init[0]), ("/tester", ctx.attr.tester[0])], [ctx.attr._earlydev])
Lorenz Brunb69a71c2024-12-23 14:12:46 +010035
36 script_file = ctx.actions.declare_file(ctx.label.name + ".sh")
37
38 ctx.actions.write(
39 output = script_file,
40 content = _KTEST_SCRIPT.format(
41 ktest = ctx.executable._ktest.short_path,
42 initrd = initramfs.short_path,
43 kernel = ctx.file.kernel.short_path,
44 cmdline = ctx.attr.cmdline,
45 ),
46 is_executable = True,
Lorenz Brun547b33f2020-04-23 15:27:06 +020047 )
48
Tim Windelschmidt8f1efe92025-04-01 01:28:43 +020049 runfiles = ctx.runfiles(files = [ctx.file._ktest, initramfs, ctx.file.kernel, ctx.file.tester])
50 runfiles = runfiles.merge(ctx.attr._ktest[DefaultInfo].default_runfiles)
51
Lorenz Brunb69a71c2024-12-23 14:12:46 +010052 return [DefaultInfo(
53 executable = script_file,
Tim Windelschmidt8f1efe92025-04-01 01:28:43 +020054 runfiles = runfiles,
Lorenz Brunb69a71c2024-12-23 14:12:46 +010055 )]
56
57k_test = rule(
58 implementation = _ktest_impl,
59 doc = """
Jan Schär27da2e62025-04-28 16:11:16 +000060 Run a given test program under the Monogon kernel.
Lorenz Brunb69a71c2024-12-23 14:12:46 +010061 """,
62 attrs = {
63 "tester": attr.label(
64 mandatory = True,
65 executable = True,
66 allow_single_file = True,
67 # Runs inside the given kernel, needs to be build for Linux/static
68 cfg = build_static_transition,
69 ),
Tim Windelschmidt24bf6fd2025-02-12 04:48:24 +010070 "files": attr.string_keyed_label_dict(
Lorenz Brunb69a71c2024-12-23 14:12:46 +010071 allow_files = True,
72 doc = """
73 Dictionary of Labels to String, placing a given Label's output file in the initramfs at the location
74 specified by the String value. The specified labels must only have a single output.
75 """,
Jan Schär0fd36f42025-04-29 10:26:03 +000076 # Attach static transition to ensure all binaries added to the initramfs are static binaries.
Lorenz Brunb69a71c2024-12-23 14:12:46 +010077 cfg = build_static_transition,
78 ),
79 "symlinks": attr.string_dict(
80 default = {},
81 doc = """
Jan Schär0fd36f42025-04-29 10:26:03 +000082 Symbolic links to create. Similar format as in `files`, so the key is the location of the
Tim Windelschmidtad4d9542025-03-24 20:20:13 +010083 symlink itself and the value of it is target of the symlink. Only raw strings are allowed as targets,
Jan Schär0fd36f42025-04-29 10:26:03 +000084 labels are not permitted. Include the file using `files`, then symlink to its location.
Lorenz Brunb69a71c2024-12-23 14:12:46 +010085 """,
86 ),
87 "fsspecs": attr.label_list(
88 default = [],
89 doc = """
90 List of file system specs (osbase.build.fsspec.FSSpec) to also include in the resulting image.
91 These will be merged with all other given attributes.
92 """,
93 providers = [FSSpecInfo],
94 allow_files = True,
Jan Schär0fd36f42025-04-29 10:26:03 +000095 cfg = build_static_transition,
Lorenz Brunb69a71c2024-12-23 14:12:46 +010096 ),
97 "kernel": attr.label(
98 default = Label("//osbase/test/ktest:linux-testing"),
Lorenz Brunb69a71c2024-12-23 14:12:46 +010099 allow_single_file = True,
100 ),
101 "cmdline": attr.string(
102 default = "",
103 ),
104 # Tool
105 "_ktest": attr.label(
106 default = Label("//osbase/test/ktest"),
Jan Schär27da2e62025-04-28 16:11:16 +0000107 cfg = "target",
Lorenz Brunb69a71c2024-12-23 14:12:46 +0100108 executable = True,
Tim Windelschmidt8f1efe92025-04-01 01:28:43 +0200109 allow_single_file = True,
Lorenz Brunb69a71c2024-12-23 14:12:46 +0100110 ),
111 "_ktest_init": attr.label(
112 default = Label("//osbase/test/ktest/init"),
Jan Schär0fd36f42025-04-29 10:26:03 +0000113 cfg = build_static_transition,
Lorenz Brunb69a71c2024-12-23 14:12:46 +0100114 executable = True,
115 allow_single_file = True,
116 ),
117 "_mkcpio": attr.label(
118 default = Label("//osbase/build/mkcpio"),
119 executable = True,
120 cfg = "exec",
121 ),
122 "_earlydev": attr.label(
123 default = Label("//osbase/build:earlydev.fsspec"),
124 allow_files = True,
125 ),
126 },
127 test = True,
128)