blob: 4a6942f67c28a3215e25e8b1550e082e083bf98b [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
Lorenz Brunb69a71c2024-12-23 14:12:46 +010049 return [DefaultInfo(
50 executable = script_file,
51 runfiles = ctx.runfiles(
52 files = [ctx.files._ktest[0], initramfs, ctx.file.kernel, ctx.file.tester],
53 ),
54 )]
55
56k_test = rule(
57 implementation = _ktest_impl,
58 doc = """
Jan Schär27da2e62025-04-28 16:11:16 +000059 Run a given test program under the Monogon kernel.
Lorenz Brunb69a71c2024-12-23 14:12:46 +010060 """,
61 attrs = {
62 "tester": attr.label(
63 mandatory = True,
64 executable = True,
65 allow_single_file = True,
66 # Runs inside the given kernel, needs to be build for Linux/static
67 cfg = build_static_transition,
68 ),
Tim Windelschmidt24bf6fd2025-02-12 04:48:24 +010069 "files": attr.string_keyed_label_dict(
Lorenz Brunb69a71c2024-12-23 14:12:46 +010070 allow_files = True,
71 doc = """
72 Dictionary of Labels to String, placing a given Label's output file in the initramfs at the location
73 specified by the String value. The specified labels must only have a single output.
74 """,
Jan Schär0fd36f42025-04-29 10:26:03 +000075 # Attach static transition to ensure all binaries added to the initramfs are static binaries.
Lorenz Brunb69a71c2024-12-23 14:12:46 +010076 cfg = build_static_transition,
77 ),
78 "symlinks": attr.string_dict(
79 default = {},
80 doc = """
Jan Schär0fd36f42025-04-29 10:26:03 +000081 Symbolic links to create. Similar format as in `files`, so the key is the location of the
Tim Windelschmidtad4d9542025-03-24 20:20:13 +010082 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 +000083 labels are not permitted. Include the file using `files`, then symlink to its location.
Lorenz Brunb69a71c2024-12-23 14:12:46 +010084 """,
85 ),
86 "fsspecs": attr.label_list(
87 default = [],
88 doc = """
89 List of file system specs (osbase.build.fsspec.FSSpec) to also include in the resulting image.
90 These will be merged with all other given attributes.
91 """,
92 providers = [FSSpecInfo],
93 allow_files = True,
Jan Schär0fd36f42025-04-29 10:26:03 +000094 cfg = build_static_transition,
Lorenz Brunb69a71c2024-12-23 14:12:46 +010095 ),
96 "kernel": attr.label(
97 default = Label("//osbase/test/ktest:linux-testing"),
Lorenz Brunb69a71c2024-12-23 14:12:46 +010098 allow_single_file = True,
99 ),
100 "cmdline": attr.string(
101 default = "",
102 ),
103 # Tool
104 "_ktest": attr.label(
105 default = Label("//osbase/test/ktest"),
Jan Schär27da2e62025-04-28 16:11:16 +0000106 cfg = "target",
Lorenz Brunb69a71c2024-12-23 14:12:46 +0100107 executable = True,
108 allow_files = True,
109 ),
110 "_ktest_init": attr.label(
111 default = Label("//osbase/test/ktest/init"),
Jan Schär0fd36f42025-04-29 10:26:03 +0000112 cfg = build_static_transition,
Lorenz Brunb69a71c2024-12-23 14:12:46 +0100113 executable = True,
114 allow_single_file = True,
115 ),
116 "_mkcpio": attr.label(
117 default = Label("//osbase/build/mkcpio"),
118 executable = True,
119 cfg = "exec",
120 ),
121 "_earlydev": attr.label(
122 default = Label("//osbase/build:earlydev.fsspec"),
123 allow_files = True,
124 ),
125 },
126 test = True,
127)