Newer
Older
+++
title = "QA Report App Administration"
toc = true
date = "2022-10-07"
+++
[QA Report App](https://gitlab.apertis.org/infrastructure/qa-report-app) is the
Apertis tool for reporting and viewing the results of both manual and automated
(via LAVA) QA testing.
# Primary Configuration File
QA Report App's configuration is handled via the file `secrets/config.yaml`.
## General Options
### Resource Links and virtual location
QA Report App needs to be able to generate links to the test cases and images:
```yaml
app-url: https://qa.apertis.org
image-root: https://images.apertis.org
```
`app-url` should be the URL where QA Report App is running at, and `image-root`
should point to the web location where images downloads are available at.
Additionally, in cases where the app needs to be mounted under a specific URL
prefix (its virtual location), the `url-prefix` option can be set:
```yaml
url-prefix: /URL-PREFIX
```
Where the prefix must start with a leading slash (`/`). Setting this option will
cause the prefix to be automatically added to all URLs generated by the application.
Behind the scenes this will cause the WSGI [SCRIPT_NAME](https://wsgi.readthedocs.io/en/latest/definitions.html#envvar-SCRIPT_NAME)
to be set to this prefix and the [PATH_INFO](https://wsgi.readthedocs.io/en/latest/definitions.html#envvar-PATH_INFO) of any request
which is prefixed with this value to be stripped of the prefix.
### Debug Logging
Debug logging from the service can be enabled via:
```yaml
debug: true
```
### Open ID Connect user login
To activate authentication, the following configuration options must be set:
```yaml
openid:
client-id: CLIENT-ID
client-secret: CLIENT-SECRET
well-known-url: WELL-KNOWN-URL
always-require-login: BOOL # (optional)
```
Both `client-id` and `client-secret` are created by the OpenID Connect
identity provider.
It should also provide the `well-known-url`.
E.g.: For using a Gitlab instance as OpenID Connect identity provider,
an application must be added on gitlab, with the openid scope and the
`https://<qa-report-app-server>/openid_callback` callback URL.
For Gitlab, the `well-known-url` value is
`https://<gitlab-instance>/.well-known/openid-configuration`.
`always-require-login` is an optional boolean value.
When set to `true`, the website will require users to be logged in to access
any page. This is set to `false` by default.
### Authentication groups
In addition to the login options described above, a set of authentication
groups can be defined for a more fine grained control on which users/groups
are allowed to login and their respective permissions:
```yaml
auth-groups:
- name: GROUP-1
- name: GROUP-2
extra-perms:
- submit-reports
- tag-images
```
Each group can optionally configure a set of extra permissions (defaults to empty).
The supported values for `extra-perms` are:
- submit-reports: users in this group can submit manual test reports
- tag-images: users in this group can tag images
If `auth-groups` is omitted or empty (default), any user with the right credentials
will be able to login, submit reports and tag images.
### LAVA Authentication
QA Report App uses shared secrets to authenticate legitimate LAVA callback
submissions, which can be set in the config file:
```yaml
lava-callback-tokens:
- TOKEN-1
- TOKEN-2
- ...
```
Additionally, they can be set in the
[environment](#environment-for-docker-compose).
In order to obtain a new token, you need to create a new token in the LAVA UI
(`API` → `Authentication Tokens`) for the user submitting the `notify` callback.
The token's name should match the name set in the `notify`→`callback`→`token`
property of the LAVA job definition YAML.
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
### Filter displayed releases
The `display` configuration section can be used to alter the minimal version to
be displayed, as well as the number of results displayed for each release on
the main page.
This makes it easier to go through the results.
The section is optional and can be configured as follows:
```yaml
display:
min-version: MIN-VERSION
series-results:
dailies: RESULT-COUNT
releases: RESULT-COUNT
weeklies: RESULT-COUNT
```
`MIN-VERSION` is a string value that specifies the minimal version to be shown.
E.g.: `'v2021'`.
All results for versions inferior to `MIN-VERSION` will not be shown on the
main page.
Each `RESULT-COUNT` is an integer value that specifies the number of results
to show for each release.
E.g.: At the start of year 2023, with
```yaml
display:
min-version: 'v2022'
series-results:
dailies: 7
releases: 2
weeklies: 4
```
the displayed results will be:
- for releases: show results for v2024dev0.0, v2023.0 & v2023pre.0 (last 2 release results in the v2023 series) and v2022.3 & v2022.2
- for dailies: show last 7 results for each of v2024, v2023 and v2022 daily builds
- for weeklies: show last 4 results for each of v2024, v2023 and v2022 weekly builds
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
## Defining Supported Platforms and Deployments
QA Report App is designed to take in test case results from a given *platform*
that the test cases were run on, such as `fixedfunction-armhf-uboot-public` or
`minimal-armhf-uboot-internal`, along with a *deployment* describing how the OS
was installed onto the platform (e.g. `apt`, `ostree`, `lxc`, `nfs`).
The support platforms and deployments can be configured via the `images` section
of the configuration file:
```yaml
images:
architectures:
...
variants:
...
deployments:
...
platform-groups:
...
```
### Defining Variants and Architectures
Image platforms as described contain both *variants* (different versions of the
same distribution) and *architectures*. For example, given the following
platforms:
- fixedfunction-armhf-uboot-public
- tiny-lxc-amd64-amd64-uefi-internal
Each of these starts with a variant (`fixedfunction`, `tiny-lxc`) that is
immediately followed by the architecture (`armhf`, `amd64`). The supported
variants and architectures should be defined at the top of the `images` section
of the config file:
```yaml
images:
architectures:
- amd64
- arm64
variants:
- fixedfunction
- tiny-lxc
```
### Defining Deployments
```yaml
images:
deployments:
user-selectable:
NAME-1: DESCRIPTION 1
lava-only:
- NAME-2
- NAME-3
```
Deployments that can be selected by the user when manually submitting test
results go in the `user-selectable` section, with each deployment name mapped
to a human-readable description. For instance, we may have:
```yaml
user-selectable:
ostree: OSTree
```
In this case, `ostree`, is the deployment name, and `OSTree` is the
human-readable description that will be shown in the UI.
If, instead, a deployment should *not* appear for manual test result submission,
but instead only be available for automatically reported LAVA results, the
deployment names should be placed in the `lava-only` section, e.g.:
```yaml
lava-only:
- lxc
- nfs
```
No human-readable name is required, since these are never shown explicitly in
the UI.
### Defining Platforms
```yaml
images:
platform-groups:
- platforms:
PLATFORM-1: DESCRIPTION 1
PLATFORM-2: DESCRIPTION 2
deployments: [DEPLOYMENT-1, DEPLOYMENT-2]
supported-by:
- first:
release: FIRST-RELEASE
version: FIRST-VERSION
last:
release: LAST-RELEASE
version: LAST-VERSION
- ...
```
Image platforms, such as `fixedfunction-armhf-uboot-public`, are defined in
groups called "platform groups". Each group contains:
- A list of platforms defined in this group.
- A list of deployments supported by the given platforms.
- (Optional) A list of release/version ranges that support the given platforms.
The purpose of placing platforms into these groups is to be able to define
multiple platforms that support the same deployments same conditions in one
place, reducing repition.
Example of some basic platform groups:
```yaml
platform-groups:
- platforms:
tiny-lxc-armhf-uboot-public: Tiny LXC ARM
tiny-lxc-arm64-uboot-public: Tiny LXC ARM64
tiny-lxc-amd64-uefi-public: Tiny LXC AMD64
deployments: [lxc]
- platforms:
nfsroot-armhf-uboot-public: Nfsroot ARM
nfsroot-arm64-uboot-public: Nfsroot ARM64
nfsroot-amd64-uefi-public: Nfsroot AMD64
deployments: [nfs]
```
#### Platform Support Ranges
```yaml
supported-by:
- first:
release: FIRST-RELEASE
version: FIRST-VERSION
last:
release: LAST-RELEASE
version: LAST-VERSION
- first:
release: FIRST-RELEASE
version: FIRST-VERSION
last:
release: LAST-RELEASE
version: LAST-VERSION
```
The `supported-by` key defines a list of *ranges* of releases that support the
platforms in the current group.
The individual ranges inside have two keys, at least one of which must be given:
- `first`: the first / oldest version that supports this platform. If not
given, it is assumed that the platform has been supported since the very first
release.
- `last` defines the last / newest version that supports this platform. If not
given, it is assumed that the platform is still supported by the very latest
release.
Each of these endpoints of the range in turn contains `release` and `version`,
to set the release and version of the given endpoint. The version is optional
and, if not given, all versions in the release are counted. For example, this
platform group is valid for all releases from v2021 to v2022 version 20220624:
```yaml
supported-by:
- first:
release: v2021
last:
release: v2022
version: '20220624'
```
The end ranges can be defined to be exclusive instead of inclusive, via:
```yaml
supported-by:
- first:
release: v2021
inclusive: false
```
This would normally mean "every release since *and including* v2021 is
supported", but setting `inclusive: false` changes it to mean "every release
since *and not including* v2021".
Multiple support ranges can be given:
```yaml
supported-by:
# Supported from v2019 to v2021 and from v2022dev0 to v2022dev2.
- first:
release: v2019
last:
release: v2021
- first:
release: v2022dev0
last:
release: v2022dev2
```
Some more examples:
```yaml
# Supported from every release since, and including, v2022dev3, 20210910:
supported-by:
- first:
release: v2022dev3
version: '20210910'
# Supported from every version *after* v2021, 20210910 up until, and including,
# v2022.
supported-by:
- first:
release: v2021
version: '20210910'
inclusive: false
last:
release: v2022
```
## Changing the Test Cases Source
Test cases are, by default, pulled from the [Apertis test cases Git
repository](https://gitlab.apertis.org/tests/apertis-test-cases). The individual
YAML files describing test cases are then taken from every branch starting with
`apertis/`, with the text afterwards being treated as the release (e.g. given
`apertis/v2020`, the release would be `v2020`). If you want to change the URL
and the branch prefix (the `apertis/`), set `test-cases-repository`:
```yaml
test-cases-repository:
url: THE-URL
branch-prefix: THE-BRANCH-PREFIX
```
where:
- `URL` is a URL pointing to a Git repository containing the test cases.
- `BRANCH-PREFIX` is the prefix
Note that the portion of the branch name after the branch prefix is treated as
the release/suite.
## Bug Tracker Integration
### Phabricator
```yaml
bug-tracking: phabricator
phabricator-url: https://PHRABRICATOR-URL/
phabricator-token: PHABRICATOR-TOKEN
filter-tag: PRIMARY-TAG
tags:
- ADDITIONAL-TAG-1
- ADDITIONAL-TAG-2
- ...
```
This sets up integration with Phabricator, for automated issue creation.
`PHABRICATOR-TOKEN` is a Phabricator Conduit API token, which can be obtained
via the following steps:
- Click your profile picture in Phabricator on the top-right -> Settings.
- Select *Conduit API Tokens* in the left sidebar.
- Click the *Generate Token* button.
The `phabricator-tasks` section controls the behavior of tasks that are
automatically created by QA Report App from LAVA failures.
`space` is the Phabricator space that should have visibility into the created
tickets.
`filter-tag` is a Phabricator tag should identify all tasks automatically filed;
new tasks filed will have this tag assigned, and existing ones will be searched
using this tag. `tags` defines any additional tags that should be added when
opening a new ticket (but these are not used for any other purpose).
### GitLab
```yaml
bug-tracking: gitlab
gitlab-url: https://GITLAB-URL/
gitlab-token: GITLAB-TOKEN
gitlab-project: GITLAB/PROJECT
gitlab-issues:
filter-label: PRIMARY-LABEL
labels:
- ADDITIONAL-LABEL-1
- ADDITIONAL-LABEL-2
- ...
```
This sets up integration with GitLab issues, for automated issue creation.
`GITLAB-TOKEN` should be a [GitLab access token]
https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token)
(use the *api* scope), and `GITLAB/PROJECT` should be the GitLab project where
issues are stored (e.g. `infrastructure/apertis-issues`).
The `gitlab-issues` section controls the behavior of issues that are
automatically created by QA Report App from LAVA failures. `filter-label` is a
GitLab label that should identify all issues automatically filed; new issues
filed will have this label assigned, and existing ones will be searched using
this label. `labels` defines any additional labels that should be added when
opening a new issue (but these are not used for any other purpose).
Note that `gitlab-url` is additionally used for configuring OAuth logins and
thus may be set even if GitLab issues integration is not set up.
# Environment for docker-compose
In addition to the standalone configuration file, a separate file `.env`,
providing environment variables to docker-compose, can be created in the
qa-report-app directory. These variables are used to configure hosting aspects,
rather than the behavior of the application itself.
The following variables are available to be set, as well as their default
values:
# The port the application will be exposed on.
QA_REPORT_APP_PORT=28080
# The user ID and group ID the application and database will run as. In
# particular, this results in the database files also being owned by this user
# and group.
RUN_USER=1000:1000
# If lava-callback-tokens is not set in the config file, it should be set here.
LAVA_CALLBACK_TOKENS=["TOKEN-1", "TOKEN-2"]