RFC: Add required_klds metadata to Kyua

From: Igor Ostapenko <igoro_at_FreeBSD.org>
Date: Wed, 06 Nov 2024 18:12:10 UTC
Hi FreeBSD developers,

During Kyua's execenv=jail feature implementation there were discussions to
get some help from Kyua side with kernel modules required by specific tests.
The thing got "required_klds" codename.

The problem to solve here is a well-known one: typically we invoke "kyua
test" and get a lot of "Skipped" due to many kernel module requirements. And
the pain is to know which ones need loading, especially if we target a
sub-tree of /usr/tests. Also, the FreeBSD CI needs periodic sync if a new
test is added with new module requirements. And other related issues.

I would like to share the existing ideas and vision before the
implementation itself. I propose to split it onto several subsequent
projects to ease reasoning, review, etc.


Project A: declaration & skipping
---------------------------------

Add a new metadata property to Kyua which is used by a test to define its
requirements on specific kernel modules expected being loaded. The following
interface is expected:

- Define it on ATF level, e.g. for atf-sh:

     atf_set require.klds pf pflog

- Define it on Kyuafile level:

     test_program{name="testbinary1", required_klds="pf pflog"}

- Get it listed per test case:

     > kyua list -v testbinary1 | grep required_klds
     required_klds = pf pflog if_epair

Having it declared we could simplify tests and avoid manual checks for
modules with the respective "skip test" lib calls. Thus, this new metadata
would work the same way as the existing required_programs and required_files
ones -- if some of the required modules are not loaded Kyua will skip such
test with a respective message including names of the missing modules.

An extra benefit is that we do not need to iterate it like: 1) kyua test, 2)
kldload a-missing-module, 3) repeat. Such iteration is usually needed due to
our tests typically do kldstat sequentially with "skip fast" logic. Skipping
reason information still is not aggregated to make it easy to run a single
kldload for all missing modules, but that's another story which is covered
by the following Project B.

Q1: I have doubts regarding the name of this new metadata. There are several
other options in my mind, it would be appreciated to hear opinions regarding
this:
   a) required_klds -- the original idea based on the vibe that FreeBSD Kyua
      fork is mainly for FreeBSD

   b) required_mods -- to keep it OS agnostic while Kyua still is treated
      as an OS agnostic tool, and freebsd/kyua GitHub repo actually is the
      main Kyua repo in the world today

   c) required_kmods -- a little improvement of the previous option to make
      sure it talks about "kernel modules" and leave space for other meanings
      in the future, just in case

   d) required_klds | required_kmods -- to have some official aliases
      supported, but it's expected to bring confusion instead

   e) your variant


Project B: automatic kldload
----------------------------

Having Project A implemented and the existing tests augmented with the
respective metadata we could ask Kyua to automatically load the required
kernel modules.

 From the implementation perspective, Kyua is expected to have a generic
concept of a requirement resolver. A resolver may read all metadata and
decide on its actions. If we decide on "klds" name in Project A then the
very first resolver implemented would look for required_klds metadata, if
it's present, then the mentioned kernel modules will be loaded. Such
resolver could be named "klds", and we can think of future additions like
"pkgs" resolver and so on.

Currently, I see it as a new kyua command to make it separate from the
testing process itself. The interface could be as follows:

- List all available requirement resolvers (name and short description):

     > kyua rr list

- Run all resolvers or only specified ones. It would deal with the current
   dir, and later we can think of "-k" option like "kyua test" command has.

     > kyua rr run [resolver1-name resolver2-name ...]

- It's proposed to be a sub-set of commands in case if in the future we want
   additions, e.g. dry-run or verify command without actual resolving.

Having this interface the FreeBSD CI could have a separate step to run "kyua
rr run" before the existing step which runs "kyua test". But from
development perspective it may quickly end up with a need to have a single
command for both. The following interface addition could be there:

- Run all or specified requirement resolvers before the actual testing:

     > kyua test --rr ["resolver1-name resolver2-name ..."]

Another option is to use the existing Kyua mechanisms and add it as a
configuration variable, i.e. it can be configured once in the local
kyua.conf not to specify it with every test command invocation:

     # without configuration:
     > kyua -v rr="klds pkgs" test

     # with configuration:
     > echo 'rr = "klds pkgs"' >> /etc/kyua/kyua.conf
     > kyua test  # now it does resolving first


Q2: Project B has the same set of questions about naming and style. For
example, "rr" name for kyua.conf feels non-obvious and probably it could be
named like "requirement_resolvers" to keep it self-explainable.


What do you think? Any idea, comment, or suggestion are welcome.


Best regards,
igoro