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-07-08 17:37:37 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/openQA (Old) and /work/SRC/openSUSE:Factory/.openQA.new.1982 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openQA" Wed Jul 8 17:37:37 2026 rev:865 rq:1364441 version:5.1783486111.5733fbdf Changes: -------- --- /work/SRC/openSUSE:Factory/openQA/openQA.changes 2026-07-07 21:02:39.061138462 +0200 +++ /work/SRC/openSUSE:Factory/.openQA.new.1982/openQA.changes 2026-07-08 17:39:57.728635217 +0200 @@ -1,0 +2,22 @@ +Wed Jul 08 04:48:42 UTC 2026 - [email protected] + +- Update to version 5.1783486111.5733fbdf: + * fix(source links): Category and module can contain an underscore + * fixup! feat: Log early aborts during disk space cleanup + * feat: Log early aborts during disk space cleanup + * feat: Abort results cleanup early to prevent load surges + * refactor: Make `t/05-scheduler-full.t` easier to understand + * refactor: Improve marking workers as dead in `t/05-scheduler-full.t` + * refactor: Use signatures in `t/05-scheduler-full.t` + * test: Remove simulation of "heavy load" from `t/05-scheduler-full.t` + * chore(deps): Dependency cron 2026-07-07 + * fix(packaging): remove duplicate openqa spec dir + * fix(packaging): create podman cache dir via RPM + * fix(worker): ensure podman cache directory exists + * fix: XUnit: render skipped testcases as missing instead of ok + * test: Stabilize `t/ui/26-jobs_restart.t` + * chore(deps): bump the all-actions group across 1 directory with 5 updates + * ci: Reduce memory usage of `t/05-scheduler.t` + * feat: Turn code locations in autoinst-log into links + +------------------------------------------------------------------- Old: ---- openQA-5.1783327469.933c54e2.obscpio New: ---- openQA-5.1783486111.5733fbdf.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openQA-client-test.spec ++++++ --- /var/tmp/diff_new_pack.Nd9aIV/_old 2026-07-08 17:39:59.008679947 +0200 +++ /var/tmp/diff_new_pack.Nd9aIV/_new 2026-07-08 17:39:59.012680088 +0200 @@ -18,7 +18,7 @@ %define short_name openQA-client Name: %{short_name}-test -Version: 5.1783327469.933c54e2 +Version: 5.1783486111.5733fbdf Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-devel-test.spec ++++++ --- /var/tmp/diff_new_pack.Nd9aIV/_old 2026-07-08 17:39:59.040681066 +0200 +++ /var/tmp/diff_new_pack.Nd9aIV/_new 2026-07-08 17:39:59.044681206 +0200 @@ -18,7 +18,7 @@ %define short_name openQA-devel Name: %{short_name}-test -Version: 5.1783327469.933c54e2 +Version: 5.1783486111.5733fbdf Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-test.spec ++++++ --- /var/tmp/diff_new_pack.Nd9aIV/_old 2026-07-08 17:39:59.076682324 +0200 +++ /var/tmp/diff_new_pack.Nd9aIV/_new 2026-07-08 17:39:59.076682324 +0200 @@ -18,7 +18,7 @@ %define short_name openQA Name: %{short_name}-test -Version: 5.1783327469.933c54e2 +Version: 5.1783486111.5733fbdf Release: 0 Summary: Test package for openQA License: GPL-2.0-or-later ++++++ openQA-worker-test.spec ++++++ --- /var/tmp/diff_new_pack.Nd9aIV/_old 2026-07-08 17:39:59.124684002 +0200 +++ /var/tmp/diff_new_pack.Nd9aIV/_new 2026-07-08 17:39:59.124684002 +0200 @@ -18,7 +18,7 @@ %define short_name openQA-worker Name: %{short_name}-test -Version: 5.1783327469.933c54e2 +Version: 5.1783486111.5733fbdf Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA.spec ++++++ --- /var/tmp/diff_new_pack.Nd9aIV/_old 2026-07-08 17:39:59.164685399 +0200 +++ /var/tmp/diff_new_pack.Nd9aIV/_new 2026-07-08 17:39:59.168685539 +0200 @@ -104,7 +104,7 @@ %define devel_requires %devel_no_selenium_requires chromedriver Name: openQA -Version: 5.1783327469.933c54e2 +Version: 5.1783486111.5733fbdf Release: 0 Summary: Framework for automated system-level testing (web-frontend, scheduler and tools) Group: Development/Tools/Other @@ -642,7 +642,6 @@ %dir %{_sysconfdir}/openqa/database.ini.d %{_datadir}/doc/openqa/examples/openqa.ini %{_datadir}/doc/openqa/examples/database.ini -%dir %{_datadir}/openqa %config %{_sysconfdir}/logrotate.d # apache vhost %dir %{_sysconfdir}/apache2 @@ -833,6 +832,7 @@ %dir %{_localstatedir}/lib/openqa/pool %defattr(-,_openqa-worker,root) %dir %{_localstatedir}/lib/openqa/cache +%dir %{_localstatedir}/lib/openqa/cache/podman # own one pool - to create the others is task of the admin %dir %{_localstatedir}/lib/openqa/pool/1 %if 0%{?suse_version} > 1500 ++++++ openQA-5.1783327469.933c54e2.obscpio -> openQA-5.1783486111.5733fbdf.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/.github/workflows/check-containers.yml new/openQA-5.1783486111.5733fbdf/.github/workflows/check-containers.yml --- old/openQA-5.1783327469.933c54e2/.github/workflows/check-containers.yml 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/.github/workflows/check-containers.yml 2026-07-08 06:48:31.000000000 +0200 @@ -8,6 +8,6 @@ contents: read runs-on: ubuntu-latest steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Test our container definitions run: make test-check-containers diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/.github/workflows/check-helm-chart.yml new/openQA-5.1783486111.5733fbdf/.github/workflows/check-helm-chart.yml --- old/openQA-5.1783327469.933c54e2/.github/workflows/check-helm-chart.yml 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/.github/workflows/check-helm-chart.yml 2026-07-08 06:48:31.000000000 +0200 @@ -9,15 +9,15 @@ runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Install Helm - uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4 + uses: azure/setup-helm@9bc31f4ebc9c6b171d7bfbaa5d006ae7abdb4310 # v5.0.1 with: version: v3.8.1 - name: Install Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version: 3.13 @@ -35,15 +35,15 @@ REGISTRY_PATH: registry.opensuse.org/devel/openqa/containers16.0 steps: - name: Checkout repository - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Install Helm - uses: azure/setup-helm@1a275c3b69536ee54be43f2070a358922e12c8d4 # v4 + uses: azure/setup-helm@9bc31f4ebc9c6b171d7bfbaa5d006ae7abdb4310 # v5.0.1 with: version: v3.8.1 - name: Install Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0 with: python-version: 3.13 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/.github/workflows/checklist.yml new/openQA-5.1783486111.5733fbdf/.github/workflows/checklist.yml --- old/openQA-5.1783327469.933c54e2/.github/workflows/checklist.yml 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/.github/workflows/checklist.yml 2026-07-08 06:48:31.000000000 +0200 @@ -10,7 +10,7 @@ name: Checklist job steps: - name: Checkout - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Checklist uses: wyozi/contextual-qa-checklist-action@dd4b6b51d85a59f537b7ca9e2f162164627ec811 # master with: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/.github/workflows/compose.yml new/openQA-5.1783486111.5733fbdf/.github/workflows/compose.yml --- old/openQA-5.1783327469.933c54e2/.github/workflows/compose.yml 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/.github/workflows/compose.yml 2026-07-08 06:48:31.000000000 +0200 @@ -9,6 +9,6 @@ runs-on: ubuntu-latest timeout-minutes: 60 steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Verify that containers can be composed run: make test-containers-compose diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/.github/workflows/javascript.yml new/openQA-5.1783486111.5733fbdf/.github/workflows/javascript.yml --- old/openQA-5.1783327469.933c54e2/.github/workflows/javascript.yml 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/.github/workflows/javascript.yml 2026-07-08 06:48:31.000000000 +0200 @@ -14,9 +14,9 @@ node-version: [22] os: [ubuntu-latest] steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Setup Node (version ${{ matrix.node-version }}) - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: ${{ matrix.node-version }} - name: npm clean-install diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/.github/workflows/obs-helper.yaml new/openQA-5.1783486111.5733fbdf/.github/workflows/obs-helper.yaml --- old/openQA-5.1783327469.933c54e2/.github/workflows/obs-helper.yaml 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/.github/workflows/obs-helper.yaml 2026-07-08 06:48:31.000000000 +0200 @@ -12,7 +12,7 @@ name: Report OBS URL runs-on: ubuntu-latest steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: debug run: | env | sort diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/.github/workflows/prove.yml new/openQA-5.1783486111.5733fbdf/.github/workflows/prove.yml --- old/openQA-5.1783327469.933c54e2/.github/workflows/prove.yml 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/.github/workflows/prove.yml 2026-07-08 06:48:31.000000000 +0200 @@ -19,7 +19,7 @@ container: image: registry.opensuse.org/devel/openqa/containers/opensuse/openqa_devel:latest steps: - - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - name: Build os-autoinst run: bash -x tools/ci/build_autoinst.sh - name: Make project folder user-writable @@ -32,7 +32,7 @@ run: cover -write cover_db cover_db* - name: Generate coverage report run: make coverage-report-html - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: Upload artifacts path: | diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/Makefile new/openQA-5.1783486111.5733fbdf/Makefile --- old/openQA-5.1783327469.933c54e2/Makefile 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/Makefile 2026-07-08 06:48:31.000000000 +0200 @@ -120,7 +120,7 @@ install -m 644 -D --target-directory="$(DESTDIR)/usr/share/openqa/$${f%/*}" "$$f";\ done - for i in db images testresults pool/1 cache webui/cache backup; do \ + for i in db images testresults pool/1 cache cache/podman webui/cache backup; do \ mkdir -p "$(DESTDIR)"/var/lib/openqa/$$i ;\ done # shared dirs between openQA web and workers + compatibility links diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/assets/javascripts/render.js new/openQA-5.1783486111.5733fbdf/assets/javascripts/render.js --- old/openQA-5.1783327469.933c54e2/assets/javascripts/render.js 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/assets/javascripts/render.js 2026-07-08 06:48:31.000000000 +0200 @@ -53,7 +53,8 @@ const E = createElement; const params = new URLSearchParams({ filename: 'autoinst-log.txt', - filter: `[step:${module.category},${module.name},${step.num}]` + filter: `[step:${module.category},${module.name},${step.num}]`, + sl: 1 }); const currentPath = window.location.pathname.replace(/\/$/, ''); const logHref = `${currentPath}/logfile?${params.toString()}`; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/assets/javascripts/test_result.js new/openQA-5.1783486111.5733fbdf/assets/javascripts/test_result.js --- old/openQA-5.1783327469.933c54e2/assets/javascripts/test_result.js 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/assets/javascripts/test_result.js 2026-07-08 06:48:31.000000000 +0200 @@ -1,6 +1,8 @@ // jshint multistr: true // jshint esversion: 6 +const testGitInfoRe = /TEST_GIT_HASH=([a-fA-F0-9]+) TEST_GIT_URL=([^\p{Cc}]+)/u; + const testStatus = { state: null, result: null, @@ -635,6 +637,16 @@ return; } const lines = Array.from(content); + if (logFileElement.dataset.showSourceLinks && !logFileElement.dataset.gitBaseUrl) { + for (const line of lines) { + const found = line.match(testGitInfoRe); + if (found) { + logFileElement.dataset.gitBaseUrl = found[2] + '/blob/' + found[1]; + break; + } + } + } + let lineNumber = 0; let matchingLines = 0; if (string.length > 0) { @@ -669,6 +681,24 @@ loadEmbeddedLogFiles(filterLogLines.bind(null, searchBox, false)); } +const stepRe = / \[step:[a-zA-Z0-9_-]+,[a-zA-Z0-9_-]+,[0-9]+\] /; +const sourceRe = /(?<= )([a-zA-Z0-9_/.-]+\.p[my]):(\d+)/g; +function createSourceLinks(logFileElement, lineContentElement) { + const E = createElement; + const found = lineContentElement.innerHTML.match(stepRe); + if (found) { + lineContentElement.innerHTML = lineContentElement.innerHTML.replace(sourceRe, (match, filePath, lineNumber) => { + const i = E('i', [''], {class: 'fa-regular fa-file-code fa-lg'}); + const a = E('a', [i, ` ${filePath}:${lineNumber}`], { + class: 'source-link', + target: '_blank', + href: `${logFileElement.dataset.gitBaseUrl}/${filePath}#L${lineNumber}` + }); + return a.outerHTML; + }); + } +} + function showLogLines(logFileElement, lines, viaSearchBox = false) { const tableElement = document.createElement('table'); const currentHash = document.location.hash; @@ -700,6 +730,10 @@ lineNumberLinkElement.onclick(); } lineContentElement.innerHTML = ansiToHtml(line); + if (logFileElement.dataset.gitBaseUrl) { + createSourceLinks(logFileElement, lineContentElement); + } + lineNumberElement.appendChild(lineNumberLinkElement); lineElement.append(lineNumberElement, lineContentElement); tableElement.appendChild(lineElement); @@ -729,11 +763,17 @@ window.hasHandlerForUpdatingCurrentLine = true; } +const srcRe = /tests\/.*\/file\/autoinst-log\.txt/; function loadEmbeddedLogFiles(filter) { $('.embedded-logfile').each(function (index, logFileElement) { if (logFileElement.dataset.contentsLoaded) { return; } + const params = new URLSearchParams(window.location.search); + const found = logFileElement.dataset.src.match(srcRe); + if (found && params.get('sl')) { + logFileElement.dataset.showSourceLinks = true; + } fetch(logFileElement.dataset.src) .then(response => { if (!response.ok) throw `Server returned ${response.status}: ${response.statusText}`; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/dist/rpm/openQA.spec new/openQA-5.1783486111.5733fbdf/dist/rpm/openQA.spec --- old/openQA-5.1783327469.933c54e2/dist/rpm/openQA.spec 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/dist/rpm/openQA.spec 2026-07-08 06:48:31.000000000 +0200 @@ -643,7 +643,6 @@ %dir %{_sysconfdir}/openqa/database.ini.d %{_datadir}/doc/openqa/examples/openqa.ini %{_datadir}/doc/openqa/examples/database.ini -%dir %{_datadir}/openqa %config %{_sysconfdir}/logrotate.d # apache vhost %dir %{_sysconfdir}/apache2 @@ -834,6 +833,7 @@ %dir %{_localstatedir}/lib/openqa/pool %defattr(-,_openqa-worker,root) %dir %{_localstatedir}/lib/openqa/cache +%dir %{_localstatedir}/lib/openqa/cache/podman # own one pool - to create the others is task of the admin %dir %{_localstatedir}/lib/openqa/pool/1 %if 0%{?suse_version} > 1500 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/lib/OpenQA/Parser/Format/XUnit.pm new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Parser/Format/XUnit.pm --- old/openQA-5.1783327469.933c54e2/lib/OpenQA/Parser/Format/XUnit.pm 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Parser/Format/XUnit.pm 2026-07-08 06:48:31.000000000 +0200 @@ -11,7 +11,7 @@ sub addproperty ($self, $prop) { $self->{properties}->add(OpenQA::Parser::Result::XUnit::Property->new($prop)) } -my %TC_RESULT_BY_TAG = (softfailure => 'softfail', failure => 'fail', error => 'fail'); +my %TC_RESULT_BY_TAG = (softfailure => 'softfail', failure => 'fail', error => 'fail', skipped => 'missing'); sub parse ($self, $xml) { confess 'No XML given/loaded' unless $xml; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/lib/OpenQA/Task/Job/Limit.pm new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Task/Job/Limit.pm --- old/openQA-5.1783327469.933c54e2/lib/OpenQA/Task/Job/Limit.pm 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Task/Job/Limit.pm 2026-07-08 06:48:31.000000000 +0200 @@ -5,10 +5,11 @@ use Mojo::Base 'Mojolicious::Plugin', -signatures; use OpenQA::Jobs::Constants; -use OpenQA::Log 'log_debug'; +use OpenQA::Log qw(log_debug log_info); use OpenQA::ScreenshotDeletion; use OpenQA::Utils qw(:DEFAULT resultdir archivedir check_df); -use OpenQA::Task::Utils qw(acquire_limit_lock_or_retry finish_job_if_disk_usage_below_percentage); +use OpenQA::Task::Utils + qw(acquire_limit_lock_or_retry finish_job_if_disk_usage_below_percentage is_disk_usage_below_percentage); use OpenQA::Task::SignalGuard; use Scalar::Util 'looks_like_number'; use List::Util 'min'; @@ -55,6 +56,17 @@ my $gru = $app->gru; my %options = (priority => -20, ttl => 2 * ONE_DAY); while (my $group = $groups->next) { + if ( + my $msg = is_disk_usage_below_percentage( + job => $job, + setting => 'result_cleanup_max_free_percentage', + dir => resultdir + )) + { + log_info "Early abort during job groups loop: $msg"; + $job->note(early_abort_results => $msg); + last; + } my @preserved_important_jobs; $group->limit_results_and_logs(\@preserved_important_jobs); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/lib/OpenQA/Task/Utils.pm new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Task/Utils.pm --- old/openQA-5.1783327469.933c54e2/lib/OpenQA/Task/Utils.pm 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Task/Utils.pm 2026-07-08 06:48:31.000000000 +0200 @@ -5,13 +5,14 @@ use Mojo::Base -signatures; use Exporter qw(import); -use OpenQA::Log qw(log_warning); +use OpenQA::Log qw(log_warning log_info); use OpenQA::Utils qw(check_df); use Scalar::Util qw(looks_like_number); use Time::Seconds; use Feature::Compat::Try; -our @EXPORT_OK = (qw(acquire_limit_lock_or_retry finish_job_if_disk_usage_below_percentage)); +our @EXPORT_OK + = (qw(acquire_limit_lock_or_retry finish_job_if_disk_usage_below_percentage is_disk_usage_below_percentage)); # acquire lock to prevent multiple limit_* tasks to run in parallel unless # concurrency is configured to be allowed @@ -24,7 +25,7 @@ return 0; } -sub finish_job_if_disk_usage_below_percentage (%args) { +sub is_disk_usage_below_percentage (%args) { my $job = $args{job}; my $percentage = $job->app->config->{misc_limits}->{$args{setting}}; @@ -44,9 +45,17 @@ my $free_percentage = $available_bytes / $total_bytes * 100; return undef if $free_percentage <= $percentage; - $job->finish("Skipping, free disk space on '$dir' exceeds configured percentage $percentage %" - . " (free percentage: $free_percentage %)"); - return 1; + return +"Skipping, free disk space on '$dir' exceeds configured percentage $percentage % (free percentage: $free_percentage %)"; +} + +sub finish_job_if_disk_usage_below_percentage (%args) { + if (my $msg = is_disk_usage_below_percentage(%args)) { + log_info $msg; + $args{job}->finish($msg); + return 1; + } + return undef; } 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/lib/OpenQA/Worker/Engines/isotovideo.pm new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Worker/Engines/isotovideo.pm --- old/openQA-5.1783327469.933c54e2/lib/OpenQA/Worker/Engines/isotovideo.pm 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/lib/OpenQA/Worker/Engines/isotovideo.pm 2026-07-08 06:48:31.000000000 +0200 @@ -537,6 +537,7 @@ // 'registry.opensuse.org/devel/openqa/containers/os-autoinst_dev:latest'; my $podman_dir = prjdir() . '/cache/podman'; + path($podman_dir)->make_path; my @cmd = ( 'env', "HOME=$podman_dir", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/t/05-scheduler-full.t new/openQA-5.1783486111.5733fbdf/t/05-scheduler-full.t --- old/openQA-5.1783327469.933c54e2/t/05-scheduler-full.t 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/t/05-scheduler-full.t 2026-07-08 06:48:31.000000000 +0200 @@ -5,6 +5,7 @@ use Test::Most; use Test::Warnings ':report_warnings'; +use Mojo::Base -signatures; use OpenQA::Utils; BEGIN { @@ -53,6 +54,7 @@ # setup directories and database my $tempdir = setup_fullstack_temp_dir('scheduler'); my $schema = OpenQA::Test::Database->new->create(fixtures_glob => '01-jobs.pl 02-workers.pl'); +my $workers = $schema->resultset('Workers'); my $api_credentials = create_user_for_workers; my $api_key = $api_credentials->key; my $api_secret = $api_credentials->secret; @@ -70,8 +72,10 @@ my $resultdir = path($ENV{OPENQA_BASEDIR}, 'openqa', 'testresults')->make_path; ok -d $resultdir, "results directory created under $resultdir"; -sub create_worker { - my ($apikey, $apisecret, $host, $instance, $log) = @_; +my $last_worker_id = $workers->find({}, {order_by => {-desc => 'id'}, rows => 1})->id; +sub expected_worker_id ($instance_number) { $last_worker_id + $instance_number } + +sub create_worker ($apikey, $apisecret, $host, $instance, $log = undef) { my @connect_args = ("--instance=${instance}", "--apikey=${apikey}", "--apisecret=${apisecret}", "--host=${host}"); note "Starting standard worker. Instance: $instance for host $host"; # save testing time as we do not test a webUI host being down for @@ -84,23 +88,21 @@ sub stop_workers { stop_service($_, 1) for @workers } -sub dead_workers { - my $schema = shift; - $_->update({t_seen => DateTime->from_epoch(epoch => time - DEFAULT_WORKER_TIMEOUT - DB_TIMESTAMP_ACCURACY)}) - for $schema->resultset('Workers')->all(); +sub mark_all_workers_as_dead ($schema) { + $workers->update({t_seen => DateTime->from_epoch(epoch => time - DEFAULT_WORKER_TIMEOUT - DB_TIMESTAMP_ACCURACY)}); } # waits until a worker with the given ID has registered; this does not mean its ws connection is ready so we might still need to retry job allocation -sub wait_for_worker { - my ($schema, $id, %opts) = @_; +sub wait_for_worker ($schema, $instance_number, %opts) { + my $expected_id = expected_worker_id($instance_number); my $expected_error = $opts{error}; wait_for_or_bail_out { - my $worker = $schema->resultset('Workers')->find($id); + my $worker = $workers->find($expected_id); defined $worker && !$worker->dead && (!defined $expected_error || ($worker->error // '') eq $expected_error); } - "worker $id to be active"; + "worker instance $instance_number has registered with ID $expected_id"; } my $job_model = OpenQA::Scheduler::Model::Jobs->singleton; @@ -118,8 +120,7 @@ note 'starting two workers'; my $new_job = $schema->resultset('Jobs')->find(80000)->auto_duplicate({settings => {WORKER_CLASS => 'foo'}}); @workers = map { create_worker(@$worker_settings, $_) } (1, 2); - wait_for_worker($schema, 3); - wait_for_worker($schema, 4); + wait_for_worker($schema, $_) for (1, 2); note 'assigning one job to each worker'; wait_for_or_bail_out { push @$allocated, @{$job_model->schedule}; @$allocated >= 2 } 'two jobs allocated'; @@ -142,7 +143,7 @@ $new_job->delete; stop_workers; - dead_workers($schema); + mark_all_workers_as_dead($schema); }; subtest 're-scheduling and incompletion of jobs when worker rejects jobs or goes offline' => sub { @@ -160,22 +161,22 @@ # simulate a worker in broken state; it will register itself but declare itself as broken @workers = broken_worker(@$worker_settings, 3, 'out of order'); - wait_for_worker($schema, 5, error => 'out of order'); + wait_for_worker($schema, 3, error => 'out of order'); $allocated = $job_model->schedule; is @$allocated, 0, 'scheduler does not consider broken worker for allocating job'; stop_workers; - dead_workers($schema); + mark_all_workers_as_dead($schema); # simulate a worker in idle state that rejects all jobs assigned to it @workers = rejective_worker(@$worker_settings, 3, 'rejection reason'); $allocated = []; - wait_for_worker($schema, 5); + wait_for_worker($schema, 3); note 'waiting for job to be assigned and set back to re-scheduled'; wait_for_or_bail_out { push @$allocated, @{$job_model->schedule}; @$allocated >= 1 } 'at least one job allocated'; is @$allocated, 1, 'one job allocated' and is @{$allocated}[0]->{job}, $duplicated_id, 'right job allocated' - and is @{$allocated}[0]->{worker}, 5, 'job allocated to expected worker'; + and is @{$allocated}[0]->{worker}, expected_worker_id(3), 'job allocated to expected worker'; my $job_assigned = 0; my $job_scheduled = 0; for (0 .. 100) { @@ -192,25 +193,26 @@ } ok $job_scheduled, 'assigned job set back to scheduled if worker reports back again but has abandoned the job'; stop_workers; - dead_workers($schema); + mark_all_workers_as_dead($schema); # start an unstable worker; it will register itself but ignore any job assignment (also not explicitly reject # assignments) @workers = unstable_worker(@$worker_settings, 3, -1); $allocated = []; - wait_for_worker($schema, 5); + wait_for_worker($schema, 3); wait_for_or_bail_out { push @$allocated, @{$job_model->schedule}; @$allocated >= 1 } 'at least one job allocated'; is @$allocated, 1, 'one job allocated' and is @{$allocated}[0]->{job}, $duplicated_id, 'right job allocated' - and is @{$allocated}[0]->{worker}, 5, 'job allocated to expected worker'; + and is @{$allocated}[0]->{worker}, expected_worker_id(3), 'job allocated to expected worker'; # kill the worker but assume the job has been actually started and is running # note: Also setting back assigned_worker_id and result because the worker might have actually picked up the job. stop_workers; - $jobs->find($duplicated_id)->update({assigned_worker_id => 5, state => RUNNING, result => NONE}); + $jobs->find($duplicated_id) + ->update({assigned_worker_id => expected_worker_id(3), state => RUNNING, result => NONE}); @workers = unstable_worker(@$worker_settings, 3, -1); - wait_for_worker($schema, 5); + wait_for_worker($schema, 3); wait_for { $jobs->find($duplicated_id)->state eq DONE } "job $duplicated_id is incompleted", {timeout => 20}; my $job = $jobs->find($duplicated_id); @@ -219,18 +221,17 @@ like $job->reason, qr/abandoned: associated worker .+:\d+ re-connected but abandoned the job/, 'reason is set'; stop_workers; - dead_workers($schema); + mark_all_workers_as_dead($schema); }; -subtest 'Simulation of heavy unstable load' => sub { - dead_workers($schema); +subtest 'behavior in presence of unresponsive and unstable workers' => sub { + mark_all_workers_as_dead($schema); # duplicate latest jobs ignoring failures my @duplicated = map { my $dup = $_->auto_duplicate; ref $dup ? $dup : () } $schema->resultset('Jobs')->latest_jobs; - my $nr = $ENV{OPENQA_SCHEDULER_TEST_UNRESPONSIVE_COUNT} // ($ENV{CI} ? 10 : 50); + my $nr = $ENV{OPENQA_SCHEDULER_TEST_UNRESPONSIVE_COUNT} // 10; @workers = map { unresponsive_worker(@$worker_settings, $_) } (1 .. $nr); - my $i = 2; - wait_for_worker($schema, ++$i) for 1 .. $nr; + wait_for_worker($schema, $_) for 1 .. $nr; my $allocated = []; # Will try to allocate to previous worker and fail! wait_for_or_bail_out { push @$allocated, @{$job_model->schedule}; @$allocated >= 10 } 'at least ten jobs allocated'; @@ -252,12 +253,11 @@ is $dup->state, SCHEDULED, 'Job(' . $dup->id . ') back in scheduled state'; } stop_workers; - dead_workers($schema); + mark_all_workers_as_dead($schema); - my $unstable_workers = $ENV{OPENQA_SCHEDULER_TEST_UNSTABLE_COUNT} // 30; + my $unstable_workers = $ENV{OPENQA_SCHEDULER_TEST_UNSTABLE_COUNT} // 10; @workers = map { unstable_worker(@$worker_settings, $_, 3) } (1 .. $unstable_workers); - $i = 5; - wait_for_worker($schema, ++$i) for 0 .. 12; + wait_for_worker($schema, $_) for 1 .. $unstable_workers; $allocated = $job_model->schedule; # Will try to allocate to previous worker and fail! is @$allocated, 0, 'All failed allocation on second step - workers were killed'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/t/30-test_parser.t new/openQA-5.1783486111.5733fbdf/t/30-test_parser.t --- old/openQA-5.1783327469.933c54e2/t/30-test_parser.t 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/t/30-test_parser.t 2026-07-08 06:48:31.000000000 +0200 @@ -454,6 +454,8 @@ 'Overall 11 testsuites, 2 tests does not have title containing bacon'; is $parser->results->search_in_details('text', qr/bacon/)->size, 16, 'Overall 11 testsuites, 15 tests are for bacon'; + is $parser->results->search_in_details('result', qr/^missing$/)->size, 3, + 'skipped testcases are mapped to missing, not ok'; is $parser->generated_tests_output->size, 24, '24 Outputs'; my $resultsdir = tempdir; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/t/42-df-based-cleanup.t new/openQA-5.1783486111.5733fbdf/t/42-df-based-cleanup.t --- old/openQA-5.1783327469.933c54e2/t/42-df-based-cleanup.t 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/t/42-df-based-cleanup.t 2026-07-08 06:48:31.000000000 +0200 @@ -62,14 +62,19 @@ subtest 'abort early if there is enough free disk space' => sub { $app->config->{misc_limits}->{result_cleanup_max_free_percentage} = 10; - my $job = run_gru_job($app, limit_results_and_logs => []); + my $job; + combined_like { $job = run_gru_job($app, limit_results_and_logs => []) } + qr/Skipping, free disk space on '.*' exceeds configured percentage 10 % \(free percentage: 11 %\)/, + 'result cleanup early abort logged'; is $job->{state}, 'finished', 'result cleanup still considered successful'; like $job->{result}, qr|Skipping.*/openqa/testresults.*exceeds configured percentage 10 % \(free percentage: 11 %\)|, 'result cleanup aborted early'; $app->config->{misc_limits}->{asset_cleanup_max_free_percentage} = 9; - $job = run_gru_job($app, limit_assets => []); + combined_like { $job = run_gru_job($app, limit_assets => []) } + qr/Skipping, free disk space on '.*' exceeds configured percentage 9 % \(free percentage: 11 %\)/, + 'asset cleanup early abort logged'; is $job->{state}, 'finished', 'asset cleanup still considered successful'; like $job->{result}, qr|Skipping.*/openqa/share/factory.*exceeds configured percentage 9 % \(free percentage: 11 %\)|, @@ -90,6 +95,27 @@ is $job->{state}, undef, 'job not finished when proceeding with cleanup'; }; +subtest 'abort early during the loop' => sub { + # We will simulate `df` returning low space on the first call, and high space on the second call. + my $df_call_count = 0; + my @bavail = (5); + $df_mock->redefine(df => sub ($dir, @) { {bavail => $bavail[$df_call_count++] // 20, blocks => 100} }); + $app->config->{misc_limits}->{result_cleanup_max_free_percentage} = 10; + + my $group_bar = $app->schema->resultset('JobGroups')->create({name => 'bar'}); + my $loop_job; + combined_like { $loop_job = run_gru_job($app, limit_results_and_logs => []) } +qr/Early abort during job groups loop: Skipping, free disk space on '.*' exceeds configured percentage 10 % \(free percentage: 20 %\)/, + 'early abort during loop logged'; + is $loop_job->{state}, 'finished', 'result cleanup still considered successful'; + like $loop_job->{notes}->{early_abort_results}, + qr|Skipping.*/openqa/testresults.*exceeds configured percentage 10 % \(free percentage: 20 %\)|, + 'result cleanup aborted early inside the loop'; + $group_bar->delete; + + $mock_df->(); # restore +}; + $app->config->{misc_limits}->{result_cleanup_max_free_percentage} = 100; $app->config->{misc_limits}->{asset_cleanup_max_free_percentage} = 100; $app->config->{misc_limits}->{dry_min_free_disk_space_cleanup} = 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/t/testresults/00099/00099946-opensuse-13.1-DVD-i586-Build0091-textmode/autoinst-log.txt new/openQA-5.1783486111.5733fbdf/t/testresults/00099/00099946-opensuse-13.1-DVD-i586-Build0091-textmode/autoinst-log.txt --- old/openQA-5.1783327469.933c54e2/t/testresults/00099/00099946-opensuse-13.1-DVD-i586-Build0091-textmode/autoinst-log.txt 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/t/testresults/00099/00099946-opensuse-13.1-DVD-i586-Build0091-textmode/autoinst-log.txt 2026-07-08 06:48:31.000000000 +0200 @@ -1281,6 +1281,10 @@ waiting for console read thread to quit... WARNING: read qmp 145 - {"timestamp": {"seconds": 1392728646, "microseconds": 936768}, "event": "DEVICE_TRAY_MOVED", "data": {"device": "ide1-cd0", "tray-open": true}} +[2026-06-22T20:28:39.215621+02:00] [debug] [pid:14231] TEST_GIT_HASH=c0ffee TEST_GIT_URL=https://example.org/fortest +[2026-06-22T20:29:10.379120+02:00] [debug] [pid:14264] [step:installation,bootloader,1] tests/installaton/bootloader.pm:5 called utils::wait_for_desktop -> lib/utils.pm:47 called utils::handle_gui_password +[2026-06-22T20:29:10.379120+02:00] [debug] [pid:14264] [step:installation,bootloader,2] tests/installaton/bootloader.pm:5 called utils::wait_for_desktop -> lib/utils.pm:47 called utils::handle_gui_password + ALARM: backend.run got deleted! - exiting... read HMP failed: management thread exit at 2014-02-18 13:04:07 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/t/ui/18-tests-details.t new/openQA-5.1783486111.5733fbdf/t/ui/18-tests-details.t --- old/openQA-5.1783327469.933c54e2/t/ui/18-tests-details.t 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/t/ui/18-tests-details.t 2026-07-08 06:48:31.000000000 +0200 @@ -492,8 +492,18 @@ my $link = $log_link_elems[0]; is $link->get_attribute('title'), 'Jump to logfile', 'log link exists'; like $link->get_attribute('href'), - qr{/tests/99946/logfile\?filename=autoinst-log\.txt&filter=.*step.*installation.*bootloader.*$step}, + qr{/tests/99946/logfile\?filename=autoinst-log\.txt&filter=.*step.*installation.*bootloader.*$step.*sl=1}, 'log href correct'; + + $link->click; + wait_for_ajax msg => 'log contents'; + like $driver->find_element('.embedded-logfile')->get_text, + qr/ \[step:installation,bootloader,$step\].* called /, 'test'; + my @source_links = $driver->find_element_by_class('source-link'); + my $sl = $source_links[0]; + is $sl->get_attribute('href'), + 'https://example.org/fortest/blob/c0ffee/tests/installaton/bootloader.pm#L5', 'source link ok'; + $driver->go_back; }; } }; @@ -579,14 +589,14 @@ like $driver->find_element('.embedded-logfile')->get_text, qr{/usr/bin/qemu-kvm}, 'qemu-kvm is shown in log viewer'; $driver->find_element('#filter-log-file')->send_keys('kate'); - wait_until(sub { $driver->find_element('#filter-info')->get_text =~ qr{Showing 3 / 1292 lines} }, + wait_until(sub { $driver->find_element('#filter-info')->get_text =~ qr{Showing 3 / 1296 lines} }, 'Showing filter result info for substring'); unlike $driver->find_element('.embedded-logfile')->get_text, qr{/usr/bin/qemu-kvm}, 'qemu-kvm is not shown when filtering for something else'; $driver->find_element('#filter-log-file')->clear; wait_until(sub { $driver->find_element('#filter-info')->get_text eq '' }, 'Filter result info cleared'); $driver->find_element('#filter-log-file')->send_keys('/kate-[12]/'); - wait_until(sub { $driver->find_element('#filter-info')->get_text =~ qr{Showing 2 / 1292 lines} }, + wait_until(sub { $driver->find_element('#filter-info')->get_text =~ qr{Showing 2 / 1296 lines} }, 'Showing filter result info for regex'); my $url = Mojo::URL->new($driver->execute_script('return document.location.toString()')); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/t/ui/26-jobs_restart.t new/openQA-5.1783486111.5733fbdf/t/ui/26-jobs_restart.t --- old/openQA-5.1783327469.933c54e2/t/ui/26-jobs_restart.t 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/t/ui/26-jobs_restart.t 2026-07-08 06:48:31.000000000 +0200 @@ -91,6 +91,8 @@ $driver->title_is('openQA', 'on main page'); $driver->find_element_by_link_text('Login')->click(); +sub flash_messages { $driver->find_element('#flash-messages')->get_text } + subtest 'restart job from info panel in test results' => sub { subtest 'parent job shows options for advanced restart' => sub { $driver->get_ok('/tests/99900', 'go to job 99900'); @@ -122,10 +124,8 @@ $driver->find_element('#restart-result')->click(); wait_for_ajax(msg => 'fail to start job with missing asset and no parent'); like $driver->get_current_url, qr|tests/99939|, 'no auto refresh when there are errors/warnings'; - like - $driver->find_element('#flash-messages')->get_text, - qr/Job 99939 misses.*\.iso.*Ensure to provide mandatory assets/s, - 'restarting job with missing asset results in an error'; + wait_until(sub { flash_messages =~ m/Job 99939 misses.*\.iso.*Ensure to provide mandatory assets/s }, + 'restarting job with missing asset results in an error', 20); }; subtest 'assets missing; there is a parent' => sub { $schema->resultset('JobDependencies') @@ -133,11 +133,8 @@ {child_job_id => 99939, parent_job_id => 99947, dependency => OpenQA::JobDependencies::Constants::CHAINED}); is $driver->get('/tests/99939'), 1, 'go to job 99939'; $driver->find_element('#restart-result')->click(); - wait_for_ajax(msg => 'fail to start job with missing asset and no parent'); - like - $driver->find_element('#flash-messages')->get_text, - qr/Job 99939 misses.*\.iso.*You may try to retrigger the parent job/s, - 'restarting job with missing asset results in an error'; + wait_until(sub { flash_messages =~ m/Job 99939 misses.*\.iso.*You may try to retrigger the parent job/s }, + 'restarting job with missing asset results in an error', 20); }; subtest 'force restart' => sub { update_last_job_id; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/templates/webapi/step/viewimg.html.ep new/openQA-5.1783486111.5733fbdf/templates/webapi/step/viewimg.html.ep --- old/openQA-5.1783327469.933c54e2/templates/webapi/step/viewimg.html.ep 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/templates/webapi/step/viewimg.html.ep 2026-07-08 06:48:31.000000000 +0200 @@ -91,7 +91,7 @@ % if ($video_file_name && $frametime) { %= stepvideolink_for $testid, $video_file_name, $frametime % } - %= steploglink_for 'Jump to logfile' => url_for('logfile')->query(filename => 'autoinst-log.txt', filter => sprintf("[step:%s,%s,%d]", $module->category, $module->name, param 'stepid')), 'fa-file-lines', 'view_log' + %= steploglink_for 'Jump to logfile' => url_for('logfile')->query(filename => 'autoinst-log.txt', filter => sprintf("[step:%s,%s,%d]", $module->category, $module->name, param 'stepid'), sl => 1), 'fa-file-lines', 'view_log' </span> </div> <div id="needle_diff"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1783327469.933c54e2/tools/ci/autoinst.sha new/openQA-5.1783486111.5733fbdf/tools/ci/autoinst.sha --- old/openQA-5.1783327469.933c54e2/tools/ci/autoinst.sha 2026-07-06 10:44:29.000000000 +0200 +++ new/openQA-5.1783486111.5733fbdf/tools/ci/autoinst.sha 2026-07-08 06:48:31.000000000 +0200 @@ -1 +1 @@ -c3cb41daa60ce53156b4c36222a89e14145e7c93 \ No newline at end of file +ad31d328dcfe42082b3805e7d883e56296d687e5 \ No newline at end of file ++++++ openQA.obsinfo ++++++ --- /var/tmp/diff_new_pack.Nd9aIV/_old 2026-07-08 17:40:23.597537028 +0200 +++ /var/tmp/diff_new_pack.Nd9aIV/_new 2026-07-08 17:40:23.601537168 +0200 @@ -1,5 +1,5 @@ name: openQA -version: 5.1783327469.933c54e2 -mtime: 1783327469 -commit: 933c54e227e654c9db2fc2394abe5ef5f00f2130 +version: 5.1783486111.5733fbdf +mtime: 1783486111 +commit: 5733fbdf1f5b1b7a3dae7c428aa74651ad1750ea
