Project Configuration¶
The following page lists information on the use of a SoTest
project configuration file, typically named project_config.yaml
.
Every Test Run is described by a project configuration file. The basic idea of a project configuration is to provide an abstract list of tests along with explanations on how to execute them on a given hardware platform without being hardcoded to specific hardware setups.
More concretely, the project config defines a list of boot items with additional parameters. It is then used for running boot items in the local runner, or uploaded to the Web API via a POST request to create a new Test Run.
A project configuration can be stored alongside product code and tests. This way it is possible to check out a project on an arbitrary commit state and execute the tests.
In order to create a Test Run, all needed test binaries are bundled in a ZIP archive and uploaded to a URL that is accessible to the SoTest Controllers. Together with the project config that references the files in the archive, the URL is then used to create a Test Run via the REST API.
Project configurations can be represented as JSON or YAML.
A project configuration can have the following configuration items:
boot_items
extra_dependencies
boot_panic_patterns
fail_behavior
local_tags_list
They are explained in detail in the following sections.
Boot Items¶
One boot item describes one test. The key boot_items
of a project
configuration contains a list of boot items that will be scheduled on the
machines that are connected to the SoTest cluster.
Every boot item has its own name which is also displayed in the SoTest Web UI. The remaining parts of the boot item describe how it is booted.
The description on how to boot a test is derived from the Multiboot Standard. This standard is already familiar from the GRUB Bootloader.
A boot item specifies a boot source (boot_source
), which is one of the
following types: BIOS (bios
), UEFI (uefi
) or both (bifi
). Each BIOS
and UEFI boot source defines a mandatory execution command (exec
) and
optionally a list of load commands (load
). Each command contains a binary
path as well as command line parameters that are intended to be consumed by the
running binary.
Currently, the boot_source
key is optional, since we still support the legacy
way of defining one—namely, defining execution and load commands at the
top-level of the config. If used, a specific tag must be added to determine
which type of boot source is configured. Either boot:bios
or boot:uefi
must
be given. Failure to do so will lead to the boot item being handled as a BIFI
one. This applies if both or none of these tags are given. The resulting boot
config won’t be of much use though, since the configured BIOS and UEFI
config will have the same exec and load values. Please use the new option to
configure a boot source if you want to specify BIOS and UEFI configs at the
same time with their own exec and load information.
Please note: using the legacy exec
and load
top-level keys overwrite any
use of the boot_source
key. Also, the legacy support is only temporary, we
will announce any further changes ahead of time.
The following keys map to this description:
name
: The name of the boot item. Is displayed in the Web UI.boot_source
: The boot source definition of the boot item. Optional for legacy reasons. One or both of the following keys must be defined if used:bios
: A boot source config of type BIOS.uefi
: A boot source config of type UEFI.- Both
bios
anduefi
keys need to define the following values:exec
: Path to a bootable binary, followed by boot parameters (separated by a space). This binary will be executed during the test.load
: List of additional binaries to load into memory, each followed by additional parameters. This is a mandatory field but it may be empty.
- Deprecated:
exec
andload
can be top-level keys for legacy boot source definition
iscsi
: Optional field to specify iSCSI disks that should be visible to the booted system. Items are of the structuredrive = os
.extra_files
: Optional list of files that should be made available to the test via@{extra_files_http_url}/filename
. These can either be prerequisites or files from the Test Run zip archive.@{extra_files_http_url}
is a machine variable that can be used in theexec
andload
sections to provide the base URL to the respective test program(s). This variable expands to the HTTP base URL of the web server where the files are made available for this test.boot_item_panic_patterns
: Optional list of boot item specific panic patterns. More information about them can be found in the Test Run specific panic patterns section.boot_item_timeout
: For boot items that need a long time until the test begins to execute and prints SoTest protocol output, it may be necessary to increase the default timeout. The default timeout is 120 seconds.boot_item_type
: Must beall
orany
. Default isall
. Specifies if the boot item should be executed onall
available machines or just on one of all, no matter which one (any
). Can be combined with thetags
field to limit the available machines to a specific subset.tags
: Optional list of tags to limit the boot item execution to specific machines. The names of the available machines, and which machine provides which tags, is a server side setting that can be obtained from your SoTest operator. An empty list will result in using all configured machines rather than none. Note: a machine needs to fulfill all listed tags to be ‘valid’.
Extra Dependencies [optional]¶
While the binary archive that is provided together with the project configuration contains binaries that are under development (product binary and tests), boot items may reference certain binaries that remain unchanged over Test Runs. For example, a Linux kernel under development might be started with a large but static initial ramdisk file.
The extra_dependencies
field of the project configuration optionally contains
a list of binaries that should be available for consumption by boot items in
addition to the project binary archive.
Each item consists of the following fields:
name
: The name under which it will be referenced by boot itemsurl
: A URL that points to the location from where this binary can be obtained by a SoTest controller.sha256
: An optional hash that can be used to make sure that there are no unintended changes that might jeopardize test stability.
Panic Patterns [optional]¶
The boot_panic_patterns
field in the project configuration contains an
optional list of panic patterns. These panic patterns apply to all boot items in
the project config. Every panic pattern is a case-insensitive regular
expression. The test output parser tests if any of these regular expressions
can be found in any output line, and in case one of the patterns matches, the
whole Test Run is aborted.
Adequate usage of panic patterns improves test execution, because critically failing tests are detected immediately, as opposed to tests that are detected as fails by running into timeouts.
Linux kernel panic messages or application-specific assertion errors are example use cases.
Fail behavior [optional]¶
The fail_behavior
field is optional and specifies the behavior of a Test Run
after one of its Boot Items failed. There are three options:
continue
: The Test Run continues as is, just like before (default).priority
: The Test Run’s priority is set to -2, so that all other Boot Items are scheduled way later.abort
: The complete Test Run gets aborted.
This feature helps to reduce the waiting time of other Test Runs when
priority
or abort
is used.
Local tags [optional]¶
The local_tags_list
field is optional and contains, for a specific machine, a
list of tags to be used instead of the tags configured in the Controller.
This allows users to override the tag configurations for single project configs without affecting other Test Runs, for example when testing existing features on new hardware.
For each machine_name
specified in this list, SoTest finds the matching machine(s)
and replaces all of their tags with the ones given as local_tags
(see example).
Machines that are not listed here are not modified.
Details¶
Paths¶
Files in the exec
, load
and extra_files
items of a boot item must be
referenced in one of these two ways:
- As a relative path within the binary archive that was provided at Test Run creation time along with the project configuration.
- As the name of an external dependency.
Example: If the content of the binary archive looks like this:
$ unzip -l binaries.zip
Archive: binaries.zip
Length Date Time Name
--------- ---------- ----- ----
12202050 12-04-2019 15:56 initrds/dmidecode.initrd
204350231 12-04-2019 15:56 initrds/kernel-compile.initrd
4507296 12-04-2019 15:56 kernels/linux-4.19.81.bzImage
4761984 12-04-2019 15:56 kernels/linux-5.3.8.bzImage
--------- -------
225821561 4 files
Then a boot item could look like this:
- name: Linux kernel compile test
boot_source:
bios:
exec: kernels/linux-5.3.8.bzImage console=ttyS0,115200
load:
- initrds/kernel-compile.initrd
iSCSI Disks¶
It is possible to attach one or more iSCSI disks to the system at boot time.
The optional iscsi
field in a boot item accepts drive parameters in the
following format:
iscsi:
- <BIOS drive ID> = <image name>
- ...
The BIOS drive ID specifies the drive ID slot that is used locally to attach the drive to the system.
The image name is internally concatenated with the MAC address of the
hardware platform instance used while testing. That means if the MAC address of
the machine is 01:23:45:67:89:ab
and the image name in the config is foobar
then the resulting target name is 01-23-45-67-89-ab-foobar
. Therefore, the
iscsi
definition from the config itself is machine agnostic.
In order for such an image name to exist, the administrator of the iSCSI service must create one image per hardware platform instance. This way, no two hardware platform instances can manipulate the same image concurrently. If a machine switches its boot source type (UEFI to legacy BIOS or back), the image must be changed as well.
For more information on the underlying mechanism see the documentation for attaching SAN devices of the iPXE project.
In order to debug iSCSI errors, have a look at the Boot Config section of the boot item in the Web UI that is failing to attach an iSCSI target, and inspect the resulting iSCSI load line.
Hardware Platform Specific Variables¶
It is possible to parametrize exec
and load
lines with hardware platform
specific variables.
The administrator of a SoTest cluster can configure such variables per hardware
platform instance. Configured variables can be accessed using the following
syntax: @{variable_name}
if the variable in the hardware platform
configuration is variable_name
.
Example: In order to boot the same Linux kernel on multiple hardware platforms that each have different serial ports and baudrates, the following configuration would parametrize the boot item accordingly:
- name: Linux kernel compile test
boot_source:
bios:
exec: kernels/linux-5.3.8.bzImage console=@{serialport},@{serialbaudrate}
If a variable is not defined for the executing hardware platform, the boot item fails.