Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package openQA for openSUSE:Factory checked 
in at 2026-02-26 18:51:59
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/openQA (Old)
 and      /work/SRC/openSUSE:Factory/.openQA.new.29461 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "openQA"

Thu Feb 26 18:51:59 2026 rev:812 rq:1335177 version:5.1772031289.93bc2a13

Changes:
--------
--- /work/SRC/openSUSE:Factory/openQA/openQA.changes    2026-02-25 
21:10:07.465064793 +0100
+++ /work/SRC/openSUSE:Factory/.openQA.new.29461/openQA.changes 2026-02-26 
18:52:05.958142125 +0100
@@ -1,0 +2,13 @@
+Wed Feb 25 20:08:14 UTC 2026 - [email protected]
+
+- Update to version 5.1772031289.93bc2a13:
+  * docs(image): describe the TW image with openQA available in o3
+  * fix(t/03-auth): avoid 'Too many open files' with mocks
+  * fix: avoid constant redefinition warnings in ScheduledProducts
+  * feat: add aggregate favicons for test overview
+  * build: improve cleanup of generated favicon assets
+  * feat: add Makefile targets to run services with temporary test database
+  * ci(helm): increase timeout on ct install
+  * feat: add gitlint for conventional commit checks
+
+-------------------------------------------------------------------

Old:
----
  openQA-5.1771942065.808b073f.obscpio

New:
----
  openQA-5.1772031289.93bc2a13.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ openQA-client-test.spec ++++++
--- /var/tmp/diff_new_pack.FulGyX/_old  2026-02-26 18:52:08.514248525 +0100
+++ /var/tmp/diff_new_pack.FulGyX/_new  2026-02-26 18:52:08.518248691 +0100
@@ -18,7 +18,7 @@
 
 %define         short_name openQA-client
 Name:           %{short_name}-test
-Version:        5.1771942065.808b073f
+Version:        5.1772031289.93bc2a13
 Release:        0
 Summary:        Test package for %{short_name}
 License:        GPL-2.0-or-later

++++++ openQA-devel-test.spec ++++++
--- /var/tmp/diff_new_pack.FulGyX/_old  2026-02-26 18:52:08.554250190 +0100
+++ /var/tmp/diff_new_pack.FulGyX/_new  2026-02-26 18:52:08.558250356 +0100
@@ -18,7 +18,7 @@
 
 %define         short_name openQA-devel
 Name:           %{short_name}-test
-Version:        5.1771942065.808b073f
+Version:        5.1772031289.93bc2a13
 Release:        0
 Summary:        Test package for %{short_name}
 License:        GPL-2.0-or-later

++++++ openQA-test.spec ++++++
--- /var/tmp/diff_new_pack.FulGyX/_old  2026-02-26 18:52:08.606252354 +0100
+++ /var/tmp/diff_new_pack.FulGyX/_new  2026-02-26 18:52:08.606252354 +0100
@@ -18,7 +18,7 @@
 
 %define         short_name openQA
 Name:           %{short_name}-test
-Version:        5.1771942065.808b073f
+Version:        5.1772031289.93bc2a13
 Release:        0
 Summary:        Test package for openQA
 License:        GPL-2.0-or-later

++++++ openQA-worker-test.spec ++++++
--- /var/tmp/diff_new_pack.FulGyX/_old  2026-02-26 18:52:08.642253852 +0100
+++ /var/tmp/diff_new_pack.FulGyX/_new  2026-02-26 18:52:08.646254020 +0100
@@ -18,7 +18,7 @@
 
 %define         short_name openQA-worker
 Name:           %{short_name}-test
-Version:        5.1771942065.808b073f
+Version:        5.1772031289.93bc2a13
 Release:        0
 Summary:        Test package for %{short_name}
 License:        GPL-2.0-or-later

++++++ openQA.spec ++++++
--- /var/tmp/diff_new_pack.FulGyX/_old  2026-02-26 18:52:08.718257017 +0100
+++ /var/tmp/diff_new_pack.FulGyX/_new  2026-02-26 18:52:08.722257183 +0100
@@ -99,7 +99,7 @@
 %define devel_requires %devel_no_selenium_requires chromedriver
 
 Name:           openQA
-Version:        5.1771942065.808b073f
+Version:        5.1772031289.93bc2a13
 Release:        0
 Summary:        The openQA web-frontend, scheduler and tools
 License:        GPL-2.0-or-later

++++++ openQA-5.1771942065.808b073f.obscpio -> 
openQA-5.1772031289.93bc2a13.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/.github/workflows/commit-message-checker.yml 
new/openQA-5.1772031289.93bc2a13/.github/workflows/commit-message-checker.yml
--- 
old/openQA-5.1771942065.808b073f/.github/workflows/commit-message-checker.yml   
    2026-02-24 15:07:45.000000000 +0100
+++ 
new/openQA-5.1772031289.93bc2a13/.github/workflows/commit-message-checker.yml   
    2026-02-25 15:54:49.000000000 +0100
@@ -1,15 +1,19 @@
 ---
-# https://github.com/marketplace/actions/gs-commit-message-checker
 name: 'Commit message check'
-# yamllint disable-line rule:truthy
 on:
   pull_request:
   push:
     branches:
-      - '!master'  # we must not fix commit messages when they already reached 
master
+      - '!master'
 
 jobs:
   check-commit-message:
-    secrets:
-      accessToken: "${{ secrets.GITHUB_TOKEN }}"
-    uses: 
os-autoinst/os-autoinst-common/.github/workflows/base-commit-message-checker.yml@master
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: Install gitlint
+        run: pip install gitlint-core
+      - name: Check commit messages
+        run: gitlint --commits origin/${{ github.base_ref }}..HEAD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openQA-5.1771942065.808b073f/.gitlint 
new/openQA-5.1772031289.93bc2a13/.gitlint
--- old/openQA-5.1771942065.808b073f/.gitlint   1970-01-01 01:00:00.000000000 
+0100
+++ new/openQA-5.1772031289.93bc2a13/.gitlint   2026-02-25 15:54:49.000000000 
+0100
@@ -0,0 +1,3 @@
+[general]
+contrib=contrib-title-conventional-commits
+ignore=body-min-length,body-is-missing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openQA-5.1771942065.808b073f/Makefile 
new/openQA-5.1772031289.93bc2a13/Makefile
--- old/openQA-5.1771942065.808b073f/Makefile   2026-02-24 15:07:45.000000000 
+0100
+++ new/openQA-5.1772031289.93bc2a13/Makefile   2026-02-25 15:54:49.000000000 
+0100
@@ -282,6 +282,22 @@
 setup-database:
        test -d $(TEST_PG_PATH) && (pg_ctl -D $(TEST_PG_PATH) -s status 
>&/dev/null || pg_ctl -D $(TEST_PG_PATH) -s start) || ./t/test_postgresql 
$(TEST_PG_PATH)
 
+define RUN_SERVICE_TEST_DB
+       OPENQA_BASEDIR=t/data \
+       OPENQA_DATABASE=test \
+       OPENQA_WEBUI_MODE=test \
+       TEST_PG="DBI:Pg:dbname=openqa_test;host=$(TEST_PG_PATH)" \
+       $(1)
+endef
+
+.PHONY: run-webui-test-db
+run-webui-test-db: setup-database
+       $(call RUN_SERVICE_TEST_DB,script/openqa-webui-daemon)
+
+.PHONY: run-gru-test-db
+run-gru-test-db: setup-database
+       $(call RUN_SERVICE_TEST_DB,script/openqa-gru)
+
 # prepares running the tests within a container (eg. pulls os-autoinst) and 
then runs the tests considering
 # the test matrix environment variables
 # note: This is supposed to run within the container unlike 
`launch-container-to-run-tests-within`
@@ -333,18 +349,18 @@
 coverage-html: coverage
        $(MAKE) coverage-report-html
 
-public/favicon.ico: assets/images/logo.svg
+public/favicon.ico: $(wildcard assets/images/*.svg)
        for w in 16 32 64 128; do \
                (cd assets/images/ && for i in *.svg; do \
-                       inkscape -e $${i%.svg}-$$w.png -w $$w $$i; \
+                       inkscape -o $${i%.svg}-$$w.png -w $$w $$i; \
                done); \
        done
        convert assets/images/logo-16.png assets/images/logo-32.png 
assets/images/logo-64.png assets/images/logo-128.png -background white -alpha 
remove public/favicon.ico
-       rm assets/images/logo-128.png assets/images/logo-32.png 
assets/images/logo-64.png
+       rm assets/images/*-32.png assets/images/*-64.png assets/images/*-128.png
 
 # all additional checks not called by prove
 .PHONY: test-checkstyle-standalone
-test-checkstyle-standalone: test-shellcheck test-yaml test-critic test-shfmt
+test-checkstyle-standalone: test-shellcheck test-yaml test-critic test-shfmt 
test-gitlint
 ifeq ($(CONTAINER_TEST),1)
 test-checkstyle-standalone: test-check-containers
 endif
@@ -373,6 +389,15 @@
        @which shfmt >/dev/null 2>&1 || (echo "Command 'shfmt' not found, can 
not execute bash script syntax checks" && false)
        shfmt -d -i 4 -bn -ci -sr $(shellfiles)
 
+.PHONY: test-gitlint
+test-gitlint:
+       @which gitlint >/dev/null 2>&1 || (echo "Command 'gitlint' not found, 
can not execute commit message checks. Install with 'python3-gitlint' 
(openSUSE) or 'pip install gitlint-core'" && false)
+       @if git rev-parse --verify master >/dev/null 2>&1 && [ "$$(git 
rev-parse HEAD)" != "$$(git rev-parse master)" ]; then \
+               gitlint --commits master..HEAD; \
+       else \
+               gitlint; \
+       fi
+
 .PHONY: test-check-containers
 test-check-containers:
        tools/static_check_containers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openQA-5.1771942065.808b073f/assets/assetpack.def 
new/openQA-5.1772031289.93bc2a13/assets/assetpack.def
--- old/openQA-5.1771942065.808b073f/assets/assetpack.def       2026-02-24 
15:07:45.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/assets/assetpack.def       2026-02-25 
15:54:49.000000000 +0100
@@ -214,6 +214,27 @@
 ! logo-aborted-16.png
 < images/logo-cancelled-16.png
 
+! logo-aggregate-passed-16.png
+< images/logo-aggregate-passed-16.png
+
+! logo-aggregate-failed-16.png
+< images/logo-aggregate-failed-16.png
+
+! logo-aggregate-softfailed-16.png
+< images/logo-aggregate-softfailed-16.png
+
+! logo-aggregate-not_complete-16.png
+< images/logo-aggregate-not_complete-16.png
+
+! logo-aggregate-aborted-16.png
+< images/logo-aggregate-aborted-16.png
+
+! logo-aggregate-scheduled-16.png
+< images/logo-aggregate-scheduled-16.png
+
+! logo-aggregate-running-16.png
+< images/logo-aggregate-running-16.png
+
 ! logo.svg
 < images/logo.svg
 
@@ -247,6 +268,27 @@
 ! logo-aborted.svg
 < images/logo-cancelled.svg
 
+! logo-aggregate-passed.svg
+< images/logo-aggregate-passed.svg
+
+! logo-aggregate-failed.svg
+< images/logo-aggregate-failed.svg
+
+! logo-aggregate-softfailed.svg
+< images/logo-aggregate-softfailed.svg
+
+! logo-aggregate-not_complete.svg
+< images/logo-aggregate-not_complete.svg
+
+! logo-aggregate-aborted.svg
+< images/logo-aggregate-aborted.svg
+
+! logo-aggregate-scheduled.svg
+< images/logo-aggregate-scheduled.svg
+
+! logo-aggregate-running.svg
+< images/logo-aggregate-running.svg
+
 ! terminal.svg
 < images/terminal.svg
 
Binary files old/openQA-5.1771942065.808b073f/assets/images/audio-16.png and 
new/openQA-5.1772031289.93bc2a13/assets/images/audio-16.png differ
Binary files old/openQA-5.1771942065.808b073f/assets/images/logo-16.png and 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-16.png differ
Binary files 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-aborted-16.png 
and 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-aborted-16.png 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-aborted.svg 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-aborted.svg
--- old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-aborted.svg   
1970-01-01 01:00:00.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-aborted.svg   
2026-02-25 15:54:49.000000000 +0100
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="24" height="24" viewBox="0 0 24 24" 
xmlns="http://www.w3.org/2000/svg";>
+  <rect x="2" y="2" width="20" height="20" rx="6" ry="6" fill="#aaaaaa" />
+  <path d="m 6.3744266,6.2312 c -1.771702,0.025 -3.4309811,0.7278 
-4.6601561,1.957 -2.43164883,2.6979 -1.86820453,6.9869 -0.1542969,8.7266 
1.7139078,1.7397 3.0996094,1.9218 3.0996094,1.9218 l 0.9785156,-2.3456 c 
-0.5068951,-0.2538 -1.87809,-1.1527 -2.4628906,-2.1504 -0.5848007,-0.9977 
-0.6052241,-3.2596 1.1445312,-4.6485 1.7497553,-1.3888 3.9841699,-0.8087 
4.9042957,0.4024 0.9201291,1.2111 1.1658381,2.159 0.8678021,4.801 l 
-0.0026,0.014 c -0.5329541,1.8284 -0.07067,3.857 1.371095,5.2988 
1.308985,1.3069 2.97532,1.5515 4.779297,1.1425 l -0.04102,-2.2812 c 
-1.066824,0.4244 -2.062804,0.1729 -2.875,-0.6387 -1.122474,-1.1229 
-1.122474,-2.9433 0,-4.0664 0.549633,-0.5497 1.296921,-0.8531 2.074219,-0.8418 
0.748046,0.011 1.463238,0.3128 1.992187,0.8418 0.575137,0.5774 0.801938,1.3872 
0.78125,1.793 l -0.06055,5.375 h 1.28125 l 0.0098,0.01 h 2.255859 l 
0.742188,-2.0039 -2.1875,-0.01 c -0.007,-1.4735 -0.0096,-3.1809 0.01758,-3.8457 
0.04533,-1.1075 -0.07231,-2.1192 -1.083984,-3.1328 -1.030141,-1.
 0302 -2.401567,-1.5255 -3.804671,-1.5255 -0.827556,0 -1.682166,0.2015 
-2.449219,0.5664 -0.120502,-1.5578 -0.821911,-2.8509 -1.761718,-3.6699 
-1.8688321,-1.6285 -2.9841577,-1.7166 -4.7558596,-1.6914 z m 0.3378908,8.8828 
-1.8945312,5.0098 1.8515623,1.2656 1.8203124,-4.7715 z" fill="white" 
fill-opacity="0.8" />
+</svg>
Binary files 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-failed-16.png and 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-failed-16.png 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-failed.svg 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-failed.svg
--- old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-failed.svg    
1970-01-01 01:00:00.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-failed.svg    
2026-02-25 15:54:49.000000000 +0100
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="24" height="24" viewBox="0 0 24 24" 
xmlns="http://www.w3.org/2000/svg";>
+  <rect x="2" y="2" width="20" height="20" rx="6" ry="6" fill="#ff4e46" />
+  <path d="m 6.3744266,6.2312 c -1.771702,0.025 -3.4309811,0.7278 
-4.6601561,1.957 -2.43164883,2.6979 -1.86820453,6.9869 -0.1542969,8.7266 
1.7139078,1.7397 3.0996094,1.9218 3.0996094,1.9218 l 0.9785156,-2.3456 c 
-0.5068951,-0.2538 -1.87809,-1.1527 -2.4628906,-2.1504 -0.5848007,-0.9977 
-0.6052241,-3.2596 1.1445312,-4.6485 1.7497553,-1.3888 3.9841699,-0.8087 
4.9042957,0.4024 0.9201291,1.2111 1.1658381,2.159 0.8678021,4.801 l 
-0.0026,0.014 c -0.5329541,1.8284 -0.07067,3.857 1.371095,5.2988 
1.308985,1.3069 2.97532,1.5515 4.779297,1.1425 l -0.04102,-2.2812 c 
-1.066824,0.4244 -2.062804,0.1729 -2.875,-0.6387 -1.122474,-1.1229 
-1.122474,-2.9433 0,-4.0664 0.549633,-0.5497 1.296921,-0.8531 2.074219,-0.8418 
0.748046,0.011 1.463238,0.3128 1.992187,0.8418 0.575137,0.5774 0.801938,1.3872 
0.78125,1.793 l -0.06055,5.375 h 1.28125 l 0.0098,0.01 h 2.255859 l 
0.742188,-2.0039 -2.1875,-0.01 c -0.007,-1.4735 -0.0096,-3.1809 0.01758,-3.8457 
0.04533,-1.1075 -0.07231,-2.1192 -1.083984,-3.1328 -1.030141,-1.
 0302 -2.401567,-1.5255 -3.804671,-1.5255 -0.827556,0 -1.682166,0.2015 
-2.449219,0.5664 -0.120502,-1.5578 -0.821911,-2.8509 -1.761718,-3.6699 
-1.8688321,-1.6285 -2.9841577,-1.7166 -4.7558596,-1.6914 z m 0.3378908,8.8828 
-1.8945312,5.0098 1.8515623,1.2656 1.8203124,-4.7715 z" fill="white" 
fill-opacity="0.8" />
+</svg>
Binary files 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-not_complete-16.png
 and 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-not_complete-16.png
 differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-not_complete.svg 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-not_complete.svg
--- 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-not_complete.svg  
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-not_complete.svg  
    2026-02-25 15:54:49.000000000 +0100
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="24" height="24" viewBox="0 0 24 24" 
xmlns="http://www.w3.org/2000/svg";>
+  <rect x="2" y="2" width="20" height="20" rx="6" ry="6" fill="#af1e11" />
+  <path d="m 6.3744266,6.2312 c -1.771702,0.025 -3.4309811,0.7278 
-4.6601561,1.957 -2.43164883,2.6979 -1.86820453,6.9869 -0.1542969,8.7266 
1.7139078,1.7397 3.0996094,1.9218 3.0996094,1.9218 l 0.9785156,-2.3456 c 
-0.5068951,-0.2538 -1.87809,-1.1527 -2.4628906,-2.1504 -0.5848007,-0.9977 
-0.6052241,-3.2596 1.1445312,-4.6485 1.7497553,-1.3888 3.9841699,-0.8087 
4.9042957,0.4024 0.9201291,1.2111 1.1658381,2.159 0.8678021,4.801 l 
-0.0026,0.014 c -0.5329541,1.8284 -0.07067,3.857 1.371095,5.2988 
1.308985,1.3069 2.97532,1.5515 4.779297,1.1425 l -0.04102,-2.2812 c 
-1.066824,0.4244 -2.062804,0.1729 -2.875,-0.6387 -1.122474,-1.1229 
-1.122474,-2.9433 0,-4.0664 0.549633,-0.5497 1.296921,-0.8531 2.074219,-0.8418 
0.748046,0.011 1.463238,0.3128 1.992187,0.8418 0.575137,0.5774 0.801938,1.3872 
0.78125,1.793 l -0.06055,5.375 h 1.28125 l 0.0098,0.01 h 2.255859 l 
0.742188,-2.0039 -2.1875,-0.01 c -0.007,-1.4735 -0.0096,-3.1809 0.01758,-3.8457 
0.04533,-1.1075 -0.07231,-2.1192 -1.083984,-3.1328 -1.030141,-1.
 0302 -2.401567,-1.5255 -3.804671,-1.5255 -0.827556,0 -1.682166,0.2015 
-2.449219,0.5664 -0.120502,-1.5578 -0.821911,-2.8509 -1.761718,-3.6699 
-1.8688321,-1.6285 -2.9841577,-1.7166 -4.7558596,-1.6914 z m 0.3378908,8.8828 
-1.8945312,5.0098 1.8515623,1.2656 1.8203124,-4.7715 z" fill="white" 
fill-opacity="0.8" />
+</svg>
Binary files 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-passed-16.png and 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-passed-16.png 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-passed.svg 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-passed.svg
--- old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-passed.svg    
1970-01-01 01:00:00.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-passed.svg    
2026-02-25 15:54:49.000000000 +0100
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="24" height="24" viewBox="0 0 24 24" 
xmlns="http://www.w3.org/2000/svg";>
+  <rect x="2" y="2" width="20" height="20" rx="6" ry="6" fill="#73ba25" />
+  <path d="m 6.3744266,6.2312 c -1.771702,0.025 -3.4309811,0.7278 
-4.6601561,1.957 -2.43164883,2.6979 -1.86820453,6.9869 -0.1542969,8.7266 
1.7139078,1.7397 3.0996094,1.9218 3.0996094,1.9218 l 0.9785156,-2.3456 c 
-0.5068951,-0.2538 -1.87809,-1.1527 -2.4628906,-2.1504 -0.5848007,-0.9977 
-0.6052241,-3.2596 1.1445312,-4.6485 1.7497553,-1.3888 3.9841699,-0.8087 
4.9042957,0.4024 0.9201291,1.2111 1.1658381,2.159 0.8678021,4.801 l 
-0.0026,0.014 c -0.5329541,1.8284 -0.07067,3.857 1.371095,5.2988 
1.308985,1.3069 2.97532,1.5515 4.779297,1.1425 l -0.04102,-2.2812 c 
-1.066824,0.4244 -2.062804,0.1729 -2.875,-0.6387 -1.122474,-1.1229 
-1.122474,-2.9433 0,-4.0664 0.549633,-0.5497 1.296921,-0.8531 2.074219,-0.8418 
0.748046,0.011 1.463238,0.3128 1.992187,0.8418 0.575137,0.5774 0.801938,1.3872 
0.78125,1.793 l -0.06055,5.375 h 1.28125 l 0.0098,0.01 h 2.255859 l 
0.742188,-2.0039 -2.1875,-0.01 c -0.007,-1.4735 -0.0096,-3.1809 0.01758,-3.8457 
0.04533,-1.1075 -0.07231,-2.1192 -1.083984,-3.1328 -1.030141,-1.
 0302 -2.401567,-1.5255 -3.804671,-1.5255 -0.827556,0 -1.682166,0.2015 
-2.449219,0.5664 -0.120502,-1.5578 -0.821911,-2.8509 -1.761718,-3.6699 
-1.8688321,-1.6285 -2.9841577,-1.7166 -4.7558596,-1.6914 z m 0.3378908,8.8828 
-1.8945312,5.0098 1.8515623,1.2656 1.8203124,-4.7715 z" fill="white" 
fill-opacity="0.8" />
+</svg>
Binary files 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-running-16.png 
and 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-running-16.png 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-running.svg 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-running.svg
--- old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-running.svg   
1970-01-01 01:00:00.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-running.svg   
2026-02-25 15:54:49.000000000 +0100
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="24" height="24" viewBox="0 0 24 24" 
xmlns="http://www.w3.org/2000/svg";>
+  <rect x="2" y="2" width="20" height="20" rx="6" ry="6" fill="#8bdfff" />
+  <path d="m 6.3744266,6.2312 c -1.771702,0.025 -3.4309811,0.7278 
-4.6601561,1.957 -2.43164883,2.6979 -1.86820453,6.9869 -0.1542969,8.7266 
1.7139078,1.7397 3.0996094,1.9218 3.0996094,1.9218 l 0.9785156,-2.3456 c 
-0.5068951,-0.2538 -1.87809,-1.1527 -2.4628906,-2.1504 -0.5848007,-0.9977 
-0.6052241,-3.2596 1.1445312,-4.6485 1.7497553,-1.3888 3.9841699,-0.8087 
4.9042957,0.4024 0.9201291,1.2111 1.1658381,2.159 0.8678021,4.801 l 
-0.0026,0.014 c -0.5329541,1.8284 -0.07067,3.857 1.371095,5.2988 
1.308985,1.3069 2.97532,1.5515 4.779297,1.1425 l -0.04102,-2.2812 c 
-1.066824,0.4244 -2.062804,0.1729 -2.875,-0.6387 -1.122474,-1.1229 
-1.122474,-2.9433 0,-4.0664 0.549633,-0.5497 1.296921,-0.8531 2.074219,-0.8418 
0.748046,0.011 1.463238,0.3128 1.992187,0.8418 0.575137,0.5774 0.801938,1.3872 
0.78125,1.793 l -0.06055,5.375 h 1.28125 l 0.0098,0.01 h 2.255859 l 
0.742188,-2.0039 -2.1875,-0.01 c -0.007,-1.4735 -0.0096,-3.1809 0.01758,-3.8457 
0.04533,-1.1075 -0.07231,-2.1192 -1.083984,-3.1328 -1.030141,-1.
 0302 -2.401567,-1.5255 -3.804671,-1.5255 -0.827556,0 -1.682166,0.2015 
-2.449219,0.5664 -0.120502,-1.5578 -0.821911,-2.8509 -1.761718,-3.6699 
-1.8688321,-1.6285 -2.9841577,-1.7166 -4.7558596,-1.6914 z m 0.3378908,8.8828 
-1.8945312,5.0098 1.8515623,1.2656 1.8203124,-4.7715 z" fill="white" 
fill-opacity="0.8" />
+</svg>
Binary files 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-scheduled-16.png 
and 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-scheduled-16.png 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-scheduled.svg 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-scheduled.svg
--- old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-scheduled.svg 
1970-01-01 01:00:00.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-scheduled.svg 
2026-02-25 15:54:49.000000000 +0100
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="24" height="24" viewBox="0 0 24 24" 
xmlns="http://www.w3.org/2000/svg";>
+  <rect x="2" y="2" width="20" height="20" rx="6" ry="6" fill="#3c6eb4" />
+  <path d="m 6.3744266,6.2312 c -1.771702,0.025 -3.4309811,0.7278 
-4.6601561,1.957 -2.43164883,2.6979 -1.86820453,6.9869 -0.1542969,8.7266 
1.7139078,1.7397 3.0996094,1.9218 3.0996094,1.9218 l 0.9785156,-2.3456 c 
-0.5068951,-0.2538 -1.87809,-1.1527 -2.4628906,-2.1504 -0.5848007,-0.9977 
-0.6052241,-3.2596 1.1445312,-4.6485 1.7497553,-1.3888 3.9841699,-0.8087 
4.9042957,0.4024 0.9201291,1.2111 1.1658381,2.159 0.8678021,4.801 l 
-0.0026,0.014 c -0.5329541,1.8284 -0.07067,3.857 1.371095,5.2988 
1.308985,1.3069 2.97532,1.5515 4.779297,1.1425 l -0.04102,-2.2812 c 
-1.066824,0.4244 -2.062804,0.1729 -2.875,-0.6387 -1.122474,-1.1229 
-1.122474,-2.9433 0,-4.0664 0.549633,-0.5497 1.296921,-0.8531 2.074219,-0.8418 
0.748046,0.011 1.463238,0.3128 1.992187,0.8418 0.575137,0.5774 0.801938,1.3872 
0.78125,1.793 l -0.06055,5.375 h 1.28125 l 0.0098,0.01 h 2.255859 l 
0.742188,-2.0039 -2.1875,-0.01 c -0.007,-1.4735 -0.0096,-3.1809 0.01758,-3.8457 
0.04533,-1.1075 -0.07231,-2.1192 -1.083984,-3.1328 -1.030141,-1.
 0302 -2.401567,-1.5255 -3.804671,-1.5255 -0.827556,0 -1.682166,0.2015 
-2.449219,0.5664 -0.120502,-1.5578 -0.821911,-2.8509 -1.761718,-3.6699 
-1.8688321,-1.6285 -2.9841577,-1.7166 -4.7558596,-1.6914 z m 0.3378908,8.8828 
-1.8945312,5.0098 1.8515623,1.2656 1.8203124,-4.7715 z" fill="white" 
fill-opacity="0.8" />
+</svg>
Binary files 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-softfailed-16.png 
and 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-softfailed-16.png 
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-softfailed.svg 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-softfailed.svg
--- 
old/openQA-5.1771942065.808b073f/assets/images/logo-aggregate-softfailed.svg    
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-aggregate-softfailed.svg    
    2026-02-25 15:54:49.000000000 +0100
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="24" height="24" viewBox="0 0 24 24" 
xmlns="http://www.w3.org/2000/svg";>
+  <rect x="2" y="2" width="20" height="20" rx="6" ry="6" fill="#eeb560" />
+  <path d="m 6.3744266,6.2312 c -1.771702,0.025 -3.4309811,0.7278 
-4.6601561,1.957 -2.43164883,2.6979 -1.86820453,6.9869 -0.1542969,8.7266 
1.7139078,1.7397 3.0996094,1.9218 3.0996094,1.9218 l 0.9785156,-2.3456 c 
-0.5068951,-0.2538 -1.87809,-1.1527 -2.4628906,-2.1504 -0.5848007,-0.9977 
-0.6052241,-3.2596 1.1445312,-4.6485 1.7497553,-1.3888 3.9841699,-0.8087 
4.9042957,0.4024 0.9201291,1.2111 1.1658381,2.159 0.8678021,4.801 l 
-0.0026,0.014 c -0.5329541,1.8284 -0.07067,3.857 1.371095,5.2988 
1.308985,1.3069 2.97532,1.5515 4.779297,1.1425 l -0.04102,-2.2812 c 
-1.066824,0.4244 -2.062804,0.1729 -2.875,-0.6387 -1.122474,-1.1229 
-1.122474,-2.9433 0,-4.0664 0.549633,-0.5497 1.296921,-0.8531 2.074219,-0.8418 
0.748046,0.011 1.463238,0.3128 1.992187,0.8418 0.575137,0.5774 0.801938,1.3872 
0.78125,1.793 l -0.06055,5.375 h 1.28125 l 0.0098,0.01 h 2.255859 l 
0.742188,-2.0039 -2.1875,-0.01 c -0.007,-1.4735 -0.0096,-3.1809 0.01758,-3.8457 
0.04533,-1.1075 -0.07231,-2.1192 -1.083984,-3.1328 -1.030141,-1.
 0302 -2.401567,-1.5255 -3.804671,-1.5255 -0.827556,0 -1.682166,0.2015 
-2.449219,0.5664 -0.120502,-1.5578 -0.821911,-2.8509 -1.761718,-3.6699 
-1.8688321,-1.6285 -2.9841577,-1.7166 -4.7558596,-1.6914 z m 0.3378908,8.8828 
-1.8945312,5.0098 1.8515623,1.2656 1.8203124,-4.7715 z" fill="white" 
fill-opacity="0.8" />
+</svg>
Binary files old/openQA-5.1771942065.808b073f/assets/images/logo-blocked-16.png 
and new/openQA-5.1772031289.93bc2a13/assets/images/logo-blocked-16.png differ
Binary files 
old/openQA-5.1771942065.808b073f/assets/images/logo-cancelled-16.png and 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-cancelled-16.png differ
Binary files 
old/openQA-5.1771942065.808b073f/assets/images/logo-execution-16.png and 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-execution-16.png differ
Binary files old/openQA-5.1771942065.808b073f/assets/images/logo-failed-16.png 
and new/openQA-5.1772031289.93bc2a13/assets/images/logo-failed-16.png differ
Binary files 
old/openQA-5.1771942065.808b073f/assets/images/logo-not_complete-16.png and 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-not_complete-16.png differ
Binary files old/openQA-5.1771942065.808b073f/assets/images/logo-passed-16.png 
and new/openQA-5.1772031289.93bc2a13/assets/images/logo-passed-16.png differ
Binary files 
old/openQA-5.1771942065.808b073f/assets/images/logo-scheduled-16.png and 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-scheduled-16.png differ
Binary files 
old/openQA-5.1771942065.808b073f/assets/images/logo-softfailed-16.png and 
new/openQA-5.1772031289.93bc2a13/assets/images/logo-softfailed-16.png differ
Binary files old/openQA-5.1771942065.808b073f/assets/images/terminal-16.png and 
new/openQA-5.1772031289.93bc2a13/assets/images/terminal-16.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openQA-5.1771942065.808b073f/container/helm/ct.yaml 
new/openQA-5.1772031289.93bc2a13/container/helm/ct.yaml
--- old/openQA-5.1771942065.808b073f/container/helm/ct.yaml     2026-02-24 
15:07:45.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/container/helm/ct.yaml     2026-02-25 
15:54:49.000000000 +0100
@@ -5,3 +5,4 @@
 chart-repos:
   - bitnami=https://charts.bitnami.com/bitnami
 validate-maintainers: false
+kubectl-timeout: "500s"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/docs/Installing.asciidoc 
new/openQA-5.1772031289.93bc2a13/docs/Installing.asciidoc
--- old/openQA-5.1771942065.808b073f/docs/Installing.asciidoc   2026-02-24 
15:07:45.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/docs/Installing.asciidoc   2026-02-25 
15:54:49.000000000 +0100
@@ -273,6 +273,47 @@
 systemd-run -tM openqa1 /bin/bash # start a shell in the container
 -------------------------------------------------------------------------------
 
+=== openQA in a virtual machine 
+
+You can also set up a ready-to-use **openQA** instance as a virtual machine
+in your computer.
+
+The images are available directly from the https://openqa.opensuse.org[o3] 
site.
+Download the HDD image `opensuse-Tumbleweed-x86_64@uefi-4G-<...>.qcow2` (~3.2 
GB)
+from the _Assets_ in the test scenario 
https://openqa.opensuse.org/tests/latest?arch=x86_64&distri=openqa&flavor=dev&machine=uefi-4G&test=openqa_install%2Bpublish&version=Tumbleweed#downloads[openqa_install+publish].
+
+==== The VM
+
+The downloaded image can be used to launch a local VM from, running the
+_openSUSE Tumbleweed_ system, a graphical user interface and a network access
+to your local machine's networks.
+
+Upon starting the VM, you can login as the root user. The login credentials
+are available on 
https://github.com/os-autoinst/os-autoinst-distri-opensuse/blob/master/lib/main_common.pm[os-autoinst-distri-opensuse]
 by searching for `$testapi::password`. 
+
+You can also access the VM via SSH from a console on your machine
+(`ssh root@<VM_IP_ADDRESS>`), after properly configuring `ssh` in the VM and
+your computer.
+
+==== The openQA instance
+
+The system features a pre-configured **openQA** instance, which includes the
+web UI at http://localhost/, a worker, and a PostgreSQL database. To check the
+services, run on a VM terminal: `systemctl status openqa-* openqa-worker@1
+postgresql`
+
+You can access the web UI via the Firefox browser within the VM's graphical
+environment and log in as the default openQA Demo user.
+Once you have the VM's IP address, you can also access the web UI from any
+browser on your machine by navigating to http://<VM_IP>/.
+
+The drop-down menu in the UI top-left corner allows you to open an _Example 
test_
+page, to run a simple test and verify the setup.
+
+Other tests can be cloned via the VM console or an SSH session from your 
machine,
+using `openqa-clone-job`, getting the job settings from o3 and instantiating
+the test execution on the local VM instance (`--from openqa.opensuse.org --host
+localhost`; refer to the `openqa-clone-job` documentation).
 
 == Custom installation - repositories and procedure
 [id="custom_installation"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/lib/OpenQA/Jobs/Constants.pm 
new/openQA-5.1772031289.93bc2a13/lib/OpenQA/Jobs/Constants.pm
--- old/openQA-5.1771942065.808b073f/lib/OpenQA/Jobs/Constants.pm       
2026-02-24 15:07:45.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/lib/OpenQA/Jobs/Constants.pm       
2026-02-25 15:54:49.000000000 +0100
@@ -125,9 +125,12 @@
   RESULT_CLEANUP_LOG_FILES => COMMON_RESULT_LOG_FILES,
   qw(serial0.txt serial_terminal.txt serial_terminal_user.txt video_time.vtt);
 
-# defaults for new jobs that are useful outside the schema
+# default for new jobs that are useful outside the schema
 use constant DEFAULT_JOB_PRIORITY => 50;
 
+# priority for status aggregation (worst result first)
+use constant STATUS_PRIORITY => (FAILED, NOT_COMPLETE, SOFTFAILED, ABORTED, 
RUNNING, SCHEDULED, NONE);
+
 # the "column" to query for a tag ID in accordance with 
parse_tags_from_comments() and _important_builds()
 use constant TAG_ID_COLUMN => "concat(VERSION, '-', BUILD)";
 
@@ -183,6 +186,7 @@
   DEFAULT_JOB_PRIORITY
   RESULT_CLEANUP_LOG_FILES
   TAG_ID_COLUMN
+  STATUS_PRIORITY
 );
 
 # mapping from any specific job state/result to a meta state/result
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/lib/OpenQA/Schema/Result/ScheduledProducts.pm 
new/openQA-5.1772031289.93bc2a13/lib/OpenQA/Schema/Result/ScheduledProducts.pm
--- 
old/openQA-5.1771942065.808b073f/lib/OpenQA/Schema/Result/ScheduledProducts.pm  
    2026-02-24 15:07:45.000000000 +0100
+++ 
new/openQA-5.1772031289.93bc2a13/lib/OpenQA/Schema/Result/ScheduledProducts.pm  
    2026-02-25 15:54:49.000000000 +0100
@@ -6,7 +6,6 @@
 ## no critic (OpenQA::RedundantStrictWarning)
 use Mojo::Base 'DBIx::Class::Core', -signatures;
 
-use Mojo::Base -base, -signatures;
 use DBIx::Class::Timestamps 'now';
 use Exporter 'import';
 use File::Basename;
@@ -26,9 +25,7 @@
 use constant {
     ADDED => 'added',    # no jobs have been created yet
     SCHEDULING => 'scheduling',    # jobs are being created
-    SCHEDULED => 'scheduled',    # all jobs have been created
     CANCELLING => 'cancelling',    # jobs are being cancelled (so far only 
possible as reaction to webhook event)
-    CANCELLED => 'cancelled',    # all jobs have been cancelled (so far only 
possible as reaction to webhook event)
 };
 
 __PACKAGE__->table('scheduled_products');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/lib/OpenQA/WebAPI/Controller/Test.pm 
new/openQA-5.1772031289.93bc2a13/lib/OpenQA/WebAPI/Controller/Test.pm
--- old/openQA-5.1771942065.808b073f/lib/OpenQA/WebAPI/Controller/Test.pm       
2026-02-24 15:07:45.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/lib/OpenQA/WebAPI/Controller/Test.pm       
2026-02-25 15:54:49.000000000 +0100
@@ -18,7 +18,7 @@
 use File::Basename;
 use POSIX 'strftime';
 use Mojo::JSON qw(to_json decode_json);
-use List::Util qw(min);
+use List::Util qw(first min);
 
 use constant DEPENDENCY_DEBUG_INFO => $ENV{OPENQA_DEPENDENCY_DEBUG_INFO};
 
@@ -872,6 +872,9 @@
     my $jobs = $jobs_rs->latest_jobs_from_ids($latest_job_ids, $limit);
     my ($archs, $results, $aggregated, $job_ids) = 
$self->_prepare_job_results($jobs, $latest_job_ids);
 
+    my %counts = (%$aggregated, failed => $aggregated->{failed} || 
($aggregated->{unknown} // 0));
+    my $aggregate_status = (first { $counts{$_} } STATUS_PRIORITY) // 'passed';
+
     # determine distri/version from job results if not explicitly specified 
via search args
     my @distris = keys %$results;
     my $formatted_distri;
@@ -911,6 +914,7 @@
         archs => $archs,
         results => $results,
         aggregated => $aggregated,
+        aggregate_status => $aggregate_status,
         job_ids => $job_ids,
         until => $search_args->{until},
         parallel_children_collapsable_results_sel => 
$config->{global}->{parallel_children_collapsable_results_sel},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/lib/OpenQA/WebAPI/Plugin/Helpers.pm 
new/openQA-5.1772031289.93bc2a13/lib/OpenQA/WebAPI/Plugin/Helpers.pm
--- old/openQA-5.1771942065.808b073f/lib/OpenQA/WebAPI/Plugin/Helpers.pm        
2026-02-24 15:07:45.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/lib/OpenQA/WebAPI/Plugin/Helpers.pm        
2026-02-25 15:54:49.000000000 +0100
@@ -137,9 +137,14 @@
 
     $app->helper(
         favicon_url => sub ($c, $suffix) {
-            return $c->icon_url("logo$suffix") unless my $job = 
$c->stash('job');
-            my $status = $job->status;
-            return $c->icon_url("logo-$status$suffix");
+            if (my $job = $c->stash('job')) {
+                my $status = $job->status;
+                return $c->icon_url("logo-$status$suffix");
+            }
+            if (my $agg_status = $c->stash('aggregate_status')) {
+                return $c->icon_url("logo-aggregate-$agg_status$suffix") if 
$agg_status ne 'none';
+            }
+            return $c->icon_url("logo$suffix");
         });
 
     $app->helper(
Binary files old/openQA-5.1771942065.808b073f/public/favicon.ico and 
new/openQA-5.1772031289.93bc2a13/public/favicon.ico differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openQA-5.1771942065.808b073f/t/03-auth.t 
new/openQA-5.1772031289.93bc2a13/t/03-auth.t
--- old/openQA-5.1771942065.808b073f/t/03-auth.t        2026-02-24 
15:07:45.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/t/03-auth.t        2026-02-25 
15:54:49.000000000 +0100
@@ -23,6 +23,13 @@
 $file_api_mock->redefine(download_asset => sub ($self) { $self->render(text => 
'asset-ok') });
 $file_api_mock->redefine(test_asset => sub ($self) { 
$self->redirect_to('/assets/iso/test.iso') });
 
+# Mock assets to avoid "Too many open files" errors due to multiple app 
startups
+my $assets_mock = Test::MockModule->new('OpenQA::Assets');
+$assets_mock->redefine(
+    setup => sub ($server) {
+        $server->helper(asset => sub { '/dummy' });
+    });
+
 my $tempdir = tempdir("$FindBin::Script-XXXX", TMPDIR => 1);
 $ENV{OPENQA_CONFIG} = $tempdir;
 OpenQA::Test::Database->new->create;
@@ -31,6 +38,7 @@
     my @conf = ("[auth]\n", "method = \t  $auth \t\n");
     $tempdir->child('openqa.ini')->spew(join('', @conf, @options, 
"[openid]\n", "httpsonly = 0\n"));
     my $t = Test::Mojo->new('OpenQA::WebAPI');
+    $t->app->helper(icon_url => sub { '/favicon.ico' });
     is $t->app->config->{auth}->{method}, $auth, "started successfully with 
auth $auth";
     $t->get_ok('/login' => {Referer => 'http://open.qa/tests/42'});
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openQA-5.1771942065.808b073f/t/10-tests_overview.t 
new/openQA-5.1772031289.93bc2a13/t/10-tests_overview.t
--- old/openQA-5.1771942065.808b073f/t/10-tests_overview.t      2026-02-24 
15:07:45.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/t/10-tests_overview.t      2026-02-25 
15:54:49.000000000 +0100
@@ -22,6 +22,25 @@
 sub get_summary { 
OpenQA::Test::Case::trim_whitespace($t->tx->res->dom->at('#summary')->all_text) 
}
 
 my $jobs = $schema->resultset('Jobs');
+
+sub create_job {
+    my %args = @_;
+    return $jobs->create(
+        {
+            group_id => 1001,
+            priority => 50,
+            state => 'done',
+            BUILD => '0001',
+            ARCH => 'x86_64',
+            MACHINE => '64bit',
+            DISTRI => 'opensuse',
+            VERSION => '13.1',
+            FLAVOR => 'DVD',
+            TEST => 'test',
+            %args,
+        });
+}
+
 $jobs->find(99928)->update({blocked_by_id => 99927});
 $jobs->find($_)->comments->create({text => 'foobar', user_id => 99901}) for 
99946, 99963;
 $t->get_ok('/tests/overview' => form => {distri => 'opensuse', version => 
'13.1', build => '0091'})->status_is(200);
@@ -178,6 +197,36 @@
 $t->element_exists('#res_DVD_x86_64_doc .result_failed');
 $t->element_exists_not('#res_DVD_x86_64_kde .result_passed');
 
+subtest 'summary card border' => sub {
+    # Create a job that is softfailed
+    my $softfailed_job = create_job(
+        result => OpenQA::Jobs::Constants::SOFTFAILED,
+        TEST => 'softfailed_test',
+        VERSION => 'SoftFailVersion',
+        DISTRI => 'softfail_distri',
+    );
+
+    $t->get_ok('/tests/overview' => form => {distri => 'softfail_distri', 
version => 'SoftFailVersion'})
+      ->status_is(200);
+    $t->element_exists('#summary.border-success', 'softfailed results in 
border-success');
+    $t->element_exists_not('#summary.border-danger', 'softfailed does NOT 
result in border-danger');
+
+    # Add a failed job to the same distri/version to see it change to 
border-danger
+    my $failed_job = create_job(
+        result => OpenQA::Jobs::Constants::FAILED,
+        TEST => 'failed_test',
+        VERSION => 'SoftFailVersion',
+        DISTRI => 'softfail_distri',
+    );
+
+    $t->get_ok('/tests/overview' => form => {distri => 'softfail_distri', 
version => 'SoftFailVersion'})
+      ->status_is(200);
+    $t->element_exists('#summary.border-danger', 'failed + softfailed results 
in border-danger');
+
+    $softfailed_job->delete();
+    $failed_job->delete();
+};
+
 subtest 'clickable summary buttons' => sub {
     $t->get_ok('/tests/overview' => form => {distri => 'opensuse', version => 
'Factory', build => '0048'})
       ->status_is(200);
@@ -207,17 +256,13 @@
 
 subtest 'todo-flag on test overview' => sub {
     $schema->txn_begin;
-    $jobs->create(
-        {
-            id => 99964,
-            BUILD => '0048',
-            group_id => 1001,
-            TEST => 'server_client_parallel',
-            DISTRI => 'opensuse',
-            VERSION => 'Factory',
-            state => 'done',
-            result => 'parallel_failed',
-        });
+    create_job(
+        id => 99964,
+        BUILD => '0048',
+        TEST => 'server_client_parallel',
+        VERSION => 'Factory',
+        result => 'parallel_failed',
+    );
     $form = {distri => 'opensuse', version => 'Factory', build => '0048', todo 
=> 1};
     $t->get_ok('/tests/overview' => form => $form)->status_is(200);
     like get_summary, qr/current time Failed: 1/i, 'todo=1 shows only 
unlabeled left failed';
@@ -281,15 +326,13 @@
         name => 'opensuse test 2'
     });
 
-my $job = $jobs->create(
-    {
-        id => 99964,
-        BUILD => '0092',
-        group_id => 1003,
-        TEST => 'kde',
-        DISTRI => 'opensuse',
-        VERSION => '13.1'
-    });
+my $job = create_job(
+    id => 99964,
+    BUILD => '0092',
+    group_id => 1003,
+    TEST => 'kde',
+    state => 'scheduled',
+);
 
 
$t->get_ok('/tests/overview?distri=opensuse&version=13.1&groupid=1001&groupid=1003')->status_is(200);
 $summary = get_summary;
@@ -482,4 +525,20 @@
       ->element_count_is('table.overview td.name', 0);
 };
 
+subtest 'aggregate favicon' => sub {
+    $t->get_ok('/tests/overview' => form => {distri => 'opensuse', version => 
'13.1', build => '0091'})->status_is(200);
+    
$t->element_exists('link#favicon-16[href*="logo-aggregate-running-16.png"]');
+    $t->element_exists('link#favicon-svg[href*="logo-aggregate-running.svg"]');
+
+    $t->get_ok('/tests/overview' => form => {distri => 'opensuse', version => 
'Factory', build => '0048'})
+      ->status_is(200);
+    
$t->element_exists('link#favicon-16[href*="logo-aggregate-failed-16.png"]');
+    $t->element_exists('link#favicon-svg[href*="logo-aggregate-failed.svg"]');
+
+    $t->get_ok('/tests/overview' => form => {distri => 'opensuse', version => 
'13.1', result => 'passed'})
+      ->status_is(200);
+    
$t->element_exists('link#favicon-16[href*="logo-aggregate-passed-16.png"]');
+    $t->element_exists('link#favicon-svg[href*="logo-aggregate-passed.svg"]');
+};
+
 done_testing();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/t/ui/10-tests_overview.t 
new/openQA-5.1772031289.93bc2a13/t/ui/10-tests_overview.t
--- old/openQA-5.1771942065.808b073f/t/ui/10-tests_overview.t   2026-02-24 
15:07:45.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/t/ui/10-tests_overview.t   2026-02-25 
15:54:49.000000000 +0100
@@ -850,6 +850,12 @@
     like $driver->get_current_url, qr/result__not=passed/, 'URL contains 
result__not=passed';
 };
 
+subtest 'aggregate favicon' => sub {
+    $driver->get($baseurl . 
'tests/overview?distri=opensuse&version=13.1&build=0091');
+    my $favicon_16 = $driver->find_element('#favicon-16', 'css');
+    like $favicon_16->get_attribute('href'), 
qr/logo-aggregate-failed-16\.png/, 'favicon correctly set to failed';
+};
+
 subtest 'meta-checkboxes are ignored by bulk operations' => sub {
     $driver->get('/tests/overview');
     $driver->find_element('#filter-panel .card-header')->click();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/openQA-5.1771942065.808b073f/templates/webapi/test/overview.html.ep 
new/openQA-5.1772031289.93bc2a13/templates/webapi/test/overview.html.ep
--- old/openQA-5.1771942065.808b073f/templates/webapi/test/overview.html.ep     
2026-02-24 15:07:45.000000000 +0100
+++ new/openQA-5.1772031289.93bc2a13/templates/webapi/test/overview.html.ep     
2026-02-25 15:54:49.000000000 +0100
@@ -16,7 +16,7 @@
 % }
 <div>
     <h2>Test result overview</h2>
-    <div id="summary" class="card <%= ($aggregated->{failed} + 
$aggregated->{not_complete}) ? 'border-danger' : 'border-success' %>">
+    <div id="summary" class="card <%= ($aggregate_status =~ 
/^(?:failed|not_complete)$/) ? 'border-danger' : 'border-success' %>">
         <div class="card-header">
             Overall Summary of
             % if (@$summary_parts) {

++++++ openQA.obsinfo ++++++
--- /var/tmp/diff_new_pack.FulGyX/_old  2026-02-26 18:52:23.074854621 +0100
+++ /var/tmp/diff_new_pack.FulGyX/_new  2026-02-26 18:52:23.078854788 +0100
@@ -1,5 +1,5 @@
 name: openQA
-version: 5.1771942065.808b073f
-mtime: 1771942065
-commit: 808b073f9b189dd237fd533a330b6fbad075580d
+version: 5.1772031289.93bc2a13
+mtime: 1772031289
+commit: 93bc2a130594f802fa3c4843b4680862d01e978b
 

Reply via email to