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-08-12 16:11:29 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/openQA (Old) and /work/SRC/openSUSE:Factory/.openQA.new.17972 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openQA" Wed Aug 12 16:11:29 2026 rev:872 rq:1370736 version:5.1786454525.528632ee Changes: -------- --- /work/SRC/openSUSE:Factory/openQA/openQA.changes 2026-08-09 21:35:46.687077901 +0200 +++ /work/SRC/openSUSE:Factory/.openQA.new.17972/openQA.changes 2026-08-12 16:12:11.989692245 +0200 @@ -1,0 +2,97 @@ +Tue Aug 11 13:22:15 UTC 2026 - [email protected] + +- Update to version 5.1786454525.528632ee: + * fix(SeleniumTest): Gracefully handle set_window_size fail on tiling WM + * fix(job_group_overview): General improvements on #7729 + * chore(deps): Dependency cron 2026-08-11 + * feat: make privacy policy links configurable + * feat(job_group_overview): Use <select> for limit_buils and interval + * test: Preserve exit code in END block + * fix(worker): Remember http redirect by webui for further requests + * fix(t/24-worker-jobs.t): Don't read /etc/openqa/workers.ini + * test: Work around command processing issues of os-autoinst + * fix(CacheService): Ensure that /var/lib/openqa/cache/tmp exists + * chore(deps): Dependency cron 2026-08-06 + * chore(deps): bump fast-uri from 3.1.4 to 3.1.5 (#7720) + * fix: set client_body_buffer_size 12m everywhere + * fix: Ensure valid format for HTML element ids + * feat: Allow installing NGINX config separately for local testing + * fix(README): update the openQA-in-openQA badge reference + * docs: Document osado container test requirements + * chore(deps-dev): bump @types/estree from 1.0.8 to 1.0.9 (#7705) + * chore(deps-dev): bump prettier from 3.8.3 to 3.9.6 (#7704) + * test: Fix include paths in `t/api/18-jobtokens.t` + * feat: Add specific limits for admin table API routes + * fix: Correct comments for `generic_…_limit` in config file + * perf: Tweak generic limits to avoid high response times and RAM usage + * chore(deps): Dependency cron 2026-08-01 + * chore(deps-dev): bump stylelint from 17.6.0 to 17.14.1 (#7701) + * test: simplify status badge copy test + * feat(ui): copy button for status badges + * fix: Check for pages greater than 1 + * chore(deps): Dependency cron 2026-07-31 + * perf: Only show builds on first group_overview page + * chore(deps-dev): bump @eslint-community/eslint-utils (#7691) + * feat: Add reserved SUBMISSION_ID default history isolation key + * fix(dockerfile): Use preferred JSON notation + * chore(deps-dev): bump synckit from 0.11.12 to 0.11.13 (#7692) + * docs(Contributing): remove ca-certificates-suse from opensuse docs + * chore(deps): Dependency cron 2026-07-30 + * fix: Add forge.fedoraproject.org to the bugurl/bugref complex + * chore(deps-dev): bump @eslint/plugin-kit from 0.7.1 to 0.7.2 (#7687) + * chore(deps-dev): bump @csstools/css-syntax-patches-for-csstree (#7686) + * feat: Allow unsetting lock for individual worker slots + * feat: Skip download of unnecessary assets in clone_job + * chore(deps): Dependency cron 2026-07-29 + * chore(deps-dev): bump @cacheable/utils from 2.4.0 to 2.5.0 (#7678) + * chore(deps-dev): bump globby from 16.1.1 to 16.2.2 (#7677) + * chore(deps): bump fast-uri from 3.1.2 to 3.1.4 + * chore(deps): Dependency cron 2026-07-28 + * chore(deps): bump postcss from 8.5.12 to 8.5.23 (#7675) + * feat: Ensure a consistent order in the throttling notice + * fix: Remove accidentally added flash message when adding a comment + * chore(deps): bump the all-actions group with 2 updates + * ci: Rebuild Perl XS module on Perl version update + * chore: Update `pyproject.toml` to use named ignores + * test: Update ruff `noqa` comments to use new `ruff:ignore` format + * docs: Fix explanation of `prio_throttling_patterns` in config file + * feat: Avoid warning when computing diff times out + * chore(deps): Dependency cron 2026-07-24 + * feat: Add agama jsonnet profile for unattended worker OS installation + * feat: Persist "Next & Previous" strict toggle in the URL + * perf: Isolate "Next & Previous" via EXISTS in CTE instead of id-IN + * docs: Document _HISTORY_ISOLATION_KEYS and related migration + * feat: Add strict/generalized history toggle to "Next & Previous" + * feat(cli): improve connection error reporting + * refactor: Deduplicate post-processing of job settings + * fix: Apply global test settings when scheduling from YAML + * feat: Isolate investigation last-good by history isolation keys + * feat: Isolate bugref carry-over by history isolation keys + * feat: Add history-isolation primitive to separate scenario histories + * test: Ensure `t/full-stack.t` is considered fully covered with Perl 5.44 + * fix: Escape `@` sign in strings and regexes + * ci: Fix failures because os-autoinst is not rebuilt after Perl update + * fix(worker): enable rootless podman execution + * feat: extend API timestamp mismatch error message with diagnostic info + * feat: Turn job restart dropdown into a distinct button + * feat: Limit dependency tree + * refactor: Remove unused variable + * refactor: Simplify grep statement + * fix: Escape `@` sign in strings and regexes + * chore(deps): Dependency cron 2026-07-21 + * chore(deps-dev): bump brace-expansion from 5.0.5 to 5.0.7 (#7647) + * feat: Use stateful round-robin for group cleanup + * feat(admin): show exact timestamp on hover in product log + * feat(admin): query parameter search in product log + * feat(admin): search in settings in product log + * chore(deps): bump actions/setup-node in the all-actions group (#7645) + * fix: filter out md files when collecting python files + * feat(BCI): dedicated report template for BCI + * ci: Replace check-line-coverage with link to common repo + * chore: Update external/os-autoinst-common subrepo + * chore(deps): Dependency cron 2026-07-19 + * chore(deps-dev): bump @csstools/css-calc from 3.1.1 to 3.2.1 + * docs: remove blank lines from variable precedence list + * feat: support global instance-wide test settings + +------------------------------------------------------------------- Old: ---- openQA-5.1786008335.2d518cd9.obscpio New: ---- openQA-5.1786454525.528632ee.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openQA-client-test.spec ++++++ --- /var/tmp/diff_new_pack.MuVaD6/_old 2026-08-12 16:12:15.901857491 +0200 +++ /var/tmp/diff_new_pack.MuVaD6/_new 2026-08-12 16:12:15.905857659 +0200 @@ -18,7 +18,7 @@ %define short_name openQA-client Name: %{short_name}-test -Version: 5.1786008335.2d518cd9 +Version: 5.1786454525.528632ee Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-devel-test.spec ++++++ --- /var/tmp/diff_new_pack.MuVaD6/_old 2026-08-12 16:12:16.045863573 +0200 +++ /var/tmp/diff_new_pack.MuVaD6/_new 2026-08-12 16:12:16.057864080 +0200 @@ -18,7 +18,7 @@ %define short_name openQA-devel Name: %{short_name}-test -Version: 5.1786008335.2d518cd9 +Version: 5.1786454525.528632ee Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-test.spec ++++++ --- /var/tmp/diff_new_pack.MuVaD6/_old 2026-08-12 16:12:16.141867628 +0200 +++ /var/tmp/diff_new_pack.MuVaD6/_new 2026-08-12 16:12:16.145867798 +0200 @@ -18,7 +18,7 @@ %define short_name openQA Name: %{short_name}-test -Version: 5.1786008335.2d518cd9 +Version: 5.1786454525.528632ee Release: 0 Summary: Test package for openQA License: GPL-2.0-or-later ++++++ openQA-worker-test.spec ++++++ --- /var/tmp/diff_new_pack.MuVaD6/_old 2026-08-12 16:12:16.237871684 +0200 +++ /var/tmp/diff_new_pack.MuVaD6/_new 2026-08-12 16:12:16.237871684 +0200 @@ -18,7 +18,7 @@ %define short_name openQA-worker Name: %{short_name}-test -Version: 5.1786008335.2d518cd9 +Version: 5.1786454525.528632ee Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA.spec ++++++ --- /var/tmp/diff_new_pack.MuVaD6/_old 2026-08-12 16:12:16.281873542 +0200 +++ /var/tmp/diff_new_pack.MuVaD6/_new 2026-08-12 16:12:16.281873542 +0200 @@ -104,7 +104,7 @@ %define devel_requires %devel_no_selenium_requires chromedriver Name: openQA -Version: 5.1786008335.2d518cd9 +Version: 5.1786454525.528632ee Release: 0 Summary: Framework for automated system-level testing (web-frontend, scheduler and tools) Group: Development/Tools/Other ++++++ openQA-5.1786008335.2d518cd9.obscpio -> openQA-5.1786454525.528632ee.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/Makefile new/openQA-5.1786454525.528632ee/Makefile --- old/openQA-5.1786008335.2d518cd9/Makefile 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/Makefile 2026-08-11 15:22:05.000000000 +0200 @@ -114,8 +114,15 @@ cp -a $$i/* "$(DESTDIR)"/usr/share/openqa/$$i ;\ done +.PHONY: install-nginx +install-nginx: ## Install the NGINX configuration + install -d -m 755 "$(DESTDIR)"/etc/nginx/vhosts.d + for i in openqa-assets.inc openqa-endpoints.inc openqa-locations.inc openqa-upstreams.inc openqa.conf.template openqa-llm.conf.template; do \ + install -m 644 etc/nginx/vhosts.d/$$i "$(DESTDIR)"/etc/nginx/vhosts.d ;\ + done + .PHONY: install-generic -install-generic: generate-assets generate-completions ## Install generic components +install-generic: generate-assets generate-completions install-nginx ## Install generic components for f in $(shell perl -Ilib -mOpenQA::Assets -e OpenQA::Assets::list); do \ install -m 644 -D --target-directory="$(DESTDIR)/usr/share/openqa/$${f%/*}" "$$f";\ done @@ -140,11 +147,6 @@ install -m 644 etc/apache2/vhosts.d/$$i "$(DESTDIR)"/etc/apache2/vhosts.d ;\ done - install -d -m 755 "$(DESTDIR)"/etc/nginx/vhosts.d - for i in openqa-assets.inc openqa-endpoints.inc openqa-locations.inc openqa-upstreams.inc openqa.conf.template openqa-llm.conf.template; do \ - install -m 644 etc/nginx/vhosts.d/$$i "$(DESTDIR)"/etc/nginx/vhosts.d ;\ - done - for prefix in etc; do \ install -d -m 755 "$(DESTDIR)"/$$prefix/openqa ;\ install -d -m 755 "$(DESTDIR)"/$$prefix/openqa/client.conf.d ;\ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/README.md new/openQA-5.1786454525.528632ee/README.md --- old/openQA-5.1786008335.2d518cd9/README.md 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/README.md 2026-08-11 15:22:05.000000000 +0200 @@ -1,4 +1,4 @@ -[](https://codecov.io/gh/os-autoinst/openQA) [](https://circleci.com/gh/os-autoinst/openQA/tree/master) [](https://openqa.opensuse.org/tests/latest?arch=x86_64&distri=openqa&flavor=dev&machine=64bit-2G&test=openqa_install%2Bpublish&version=Tumbleweed) +[](https://codecov.io/gh/os-autoinst/openQA) [](https://circleci.com/gh/os-autoinst/openQA/tree/master) [](https://openqa.opensuse.org/tests/latest?arch=x86_64&distri=openqa&flavor=dev&test=openqa_install%2Bpublish&version=Tumbleweed) openQA is a testing framework that allows you to test GUI applications on one hand and bootloader and kernel on the other. In both cases, it is difficult to diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/assets/stylesheets/overview.scss new/openQA-5.1786454525.528632ee/assets/stylesheets/overview.scss --- old/openQA-5.1786008335.2d518cd9/assets/stylesheets/overview.scss 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/assets/stylesheets/overview.scss 2026-08-11 15:22:05.000000000 +0200 @@ -96,3 +96,13 @@ .group-comment-icon-stack [class*='fa-rotate-left'] { color: #0c4374; } +/* job group overview page controls */ +#more_builds, #mode_section { + select { + width: auto; + display: inline-block; + } + .cbc { + display: inline-block; + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/etc/openqa/openqa.ini new/openQA-5.1786454525.528632ee/etc/openqa/openqa.ini --- old/openQA-5.1786008335.2d518cd9/etc/openqa/openqa.ini 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/etc/openqa/openqa.ini 2026-08-11 15:22:05.000000000 +0200 @@ -5,6 +5,9 @@ ## type of branding - [ openSUSE, plain, openqa.suse.de ] #branding = plain +## Link to the privacy policy of the openQA instance +#privacy_policy_url = https://github.com/os-autoinst/openQA/blob/master/docs/PrivacyPolicy.md + ## space separated list of domains from which asset download with ## _URL params is allowed. Matched at the end of the hostname in ## the URL. with these values downloads from opensuse.org, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/lib/OpenQA/Setup.pm new/openQA-5.1786454525.528632ee/lib/OpenQA/Setup.pm --- old/openQA-5.1786008335.2d518cd9/lib/OpenQA/Setup.pm 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/lib/OpenQA/Setup.pm 2026-08-11 15:22:05.000000000 +0200 @@ -119,6 +119,7 @@ appname => 'openQA', base_url => undef, branding => 'openSUSE', + privacy_policy_url => 'https://github.com/os-autoinst/openQA/blob/master/docs/PrivacyPolicy.md', download_domains => undef, suse_mirror => undef, # deprecated alternate for git_auto_commit below diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/lib/OpenQA/WebAPI/Controller/Main.pm new/openQA-5.1786454525.528632ee/lib/OpenQA/WebAPI/Controller/Main.pm --- old/openQA-5.1786008335.2d518cd9/lib/OpenQA/WebAPI/Controller/Main.pm 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/lib/OpenQA/WebAPI/Controller/Main.pm 2026-08-11 15:22:05.000000000 +0200 @@ -9,6 +9,7 @@ use Mojo::File qw(path); use Mojo::Util qw(trim); use Time::Seconds; +use List::Util qw(any); use OpenQA::Constants qw(BUILD_SORT_BY_NAME BUILD_SORT_BY_NEWEST_JOB BUILD_SORT_BY_OLDEST_JOB); use OpenQA::Jobs::Constants; use OpenQA::Schema::Result::Jobs; @@ -16,6 +17,8 @@ use OpenQA::Utils; use constant OPENQA_WEBUI_OVERVIEW_INACTIVITY_TIMEOUT => $ENV{OPENQA_WEBUI_OVERVIEW_INACTIVITY_TIMEOUT} // 90; +use constant LIMIT_BUILDS => (10, 20, 50, 100, 400); +use constant INTERVAL => (30, 60, 90, 120, 180); sub dashboard_build_results ($self) { my $validation = $self->validation; @@ -115,9 +118,9 @@ my $validation = $self->validation; $validation->optional('limit_builds')->num; $validation->optional('time_limit_days')->like(qr/^[0-9.]+$/); - $validation->optional('only_tagged'); - $validation->optional('fullscreen'); - $validation->optional('interval'); + $validation->optional('only_tagged')->num; + $validation->optional('fullscreen')->num; + $validation->optional('interval')->num; $validation->optional('comments_page')->num; $validation->optional('comments_limit')->num; return $self->reply->validation_error({format => $self->accepts('html', 'json')}) if $validation->has_error; @@ -130,14 +133,30 @@ my $time_limit_days = $validation->param('time_limit_days') // 0; $self->app->log->debug("Retrieving results for up to $limit_builds builds up to $time_limit_days days old"); my $only_tagged = $validation->param('only_tagged') // 0; + my $fullscreen = $validation->param('fullscreen') // 0; + my $interval = $validation->param('interval') // ONE_MINUTE; + + my $current_user = $self->current_user; + my @limit_builds_preset = LIMIT_BUILDS; + if ($current_user && !any { $_ == $limit_builds } @limit_builds_preset) { + push @limit_builds_preset, $limit_builds; + @limit_builds_preset = (sort { $a <=> $b } @limit_builds_preset); + } + $validation->optional('limit_builds')->in(@limit_builds_preset); + + my @interval_preset = INTERVAL; + if ($current_user && !any { $_ == $interval } @interval_preset) { + push @interval_preset, $interval; + @interval_preset = (sort { $a <=> $b } @interval_preset); + } + $validation->optional('interval')->in(@interval_preset); + $self->stash(fullscreen => $fullscreen, interval => $interval, interval_preset => \@interval_preset); + + return $self->reply->validation_error({format => $self->accepts('html', 'json')}) if $validation->has_error; my $group_id = $self->stash('groupid'); return $self->reply->not_found unless my $group = $self->schema->resultset($resultset)->find($group_id); - my $fullscreen = $validation->param('fullscreen') // 0; - my $interval = $validation->param('interval') // ONE_MINUTE; - $self->stash(fullscreen => $fullscreen, interval => $interval); - my $page = $validation->param('comments_page') // 1; my $page_limit = $validation->param('comments_limit') // 5; @@ -206,6 +225,7 @@ group => $group_hash, sorting_note => $SORTING_NOTE{$group->build_version_sort}, limit_builds => $limit_builds, + limit_builds_preset => \@limit_builds_preset, only_tagged => $only_tagged, comments => \@comments, pinned_comments => \@pinned_comments, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/lib/OpenQA/Worker/WebUIConnection.pm new/openQA-5.1786454525.528632ee/lib/OpenQA/Worker/WebUIConnection.pm --- old/openQA-5.1786008335.2d518cd9/lib/OpenQA/Worker/WebUIConnection.pm 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/lib/OpenQA/Worker/WebUIConnection.pm 2026-08-11 15:22:05.000000000 +0200 @@ -45,6 +45,20 @@ # append relative paths to the existing ones $url->path('/api/v1/'); + # in case of redirect by server use new base_url + $ua->max_redirects(0); + my $target_url = $url->clone; + $target_url->path('workers'); + $target_url->query('limit=0'); + my $res = $ua->head($target_url)->res; + if ($res->is_redirect) { + my $new_url = Mojo::URL->new($res->headers->location)->query('')->path('/'); + $url->host_port($new_url->host_port); + $url->scheme($new_url->scheme); + $ua->base_url($url->base); + log_warning("Configured host was '$webui_host' but got redirected to '$new_url'. Will use new host now."); + } + # disable keep alive to avoid time outs in strange places - we only reach the # webapi once in a while so take the price of reopening the connection every time # we do diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/t/22-dashboard.t new/openQA-5.1786454525.528632ee/t/22-dashboard.t --- old/openQA-5.1786008335.2d518cd9/t/22-dashboard.t 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/t/22-dashboard.t 2026-08-11 15:22:05.000000000 +0200 @@ -608,6 +608,18 @@ $t->attr_like('a.fa-unlink', 'data-template', qr/\@review:acceptable_for/, 'review marker on test overview page'); }; +subtest 'Privacy policy configuration' => sub { + $t->get_ok('/')->status_is(200)->text_like('#footer-legal a', qr/Privacy Policy/) + ->attr_like('#footer-legal a', 'href', qr|docs/PrivacyPolicy.md|); + + my $original_url = $t->app->config->{global}->{privacy_policy_url}; + $t->app->config->{global}->{privacy_policy_url} = 'https://custom-privacy-policy.org'; + $t->get_ok('/')->status_is(200)->text_like('#footer-legal a', qr/Privacy Policy/) + ->attr_like('#footer-legal a', 'href', qr|^https://custom-privacy-policy\.org$|); + + $t->app->config->{global}->{privacy_policy_url} = $original_url; +}; + subtest 're-routing' => sub { # enable re-routing like it can be enabled via Mojolicious::Plugin::RequestBase $t->app->hook(before_dispatch => sub ($c) { $c->req->url->base->path('/base') }); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/t/24-worker-jobs.t new/openQA-5.1786454525.528632ee/t/24-worker-jobs.t --- old/openQA-5.1786008335.2d518cd9/t/24-worker-jobs.t 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/t/24-worker-jobs.t 2026-08-11 15:22:05.000000000 +0200 @@ -15,6 +15,7 @@ use FindBin; use lib "$FindBin::Bin/lib", "$FindBin::Bin/../external/os-autoinst-common/lib"; +$ENV{OPENQA_CONFIG} = "$FindBin::Bin/data/24-worker-overall"; use Mojo::Base -signatures; use Capture::Tiny qw(capture); @@ -186,7 +187,7 @@ result => {}, test_execution_paused => 0, test_order => [], - worker_hostname => undef, + worker_hostname => '127.0.0.1', worker_id => 1 } }, @@ -619,7 +620,7 @@ status => { cmd_srv_url => $engine_url, test_execution_paused => 0, - worker_hostname => undef, + worker_hostname => '127.0.0.1', worker_id => 1 } }, @@ -758,7 +759,7 @@ 'offset' => 0 }, test_execution_paused => 0, - worker_hostname => undef, + worker_hostname => '127.0.0.1', worker_id => 1 } }, @@ -776,7 +777,7 @@ 'offset' => (length $user_console_text) }, test_execution_paused => 0, - worker_hostname => undef, + worker_hostname => '127.0.0.1', worker_id => 1 } }, @@ -872,7 +873,7 @@ status => { cmd_srv_url => $engine_url, test_execution_paused => 0, - worker_hostname => undef, + worker_hostname => '127.0.0.1', worker_id => 1 } }, @@ -958,7 +959,7 @@ status => { cmd_srv_url => $engine_url, test_execution_paused => 0, - worker_hostname => undef, + worker_hostname => '127.0.0.1', worker_id => 1 } }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/t/24-worker-webui-connection.t new/openQA-5.1786454525.528632ee/t/24-worker-webui-connection.t --- old/openQA-5.1786008335.2d518cd9/t/24-worker-webui-connection.t 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/t/24-worker-webui-connection.t 2026-08-11 15:22:05.000000000 +0200 @@ -78,6 +78,19 @@ $job_mock->redefine(start_livelog => sub { shift->{_livelog_viewers} = 1 }); $job_mock->redefine(stop_livelog => sub { shift->{_livelog_viewers} = 0 }); +subtest 'redirect' => sub { + my $ua_mock = Test::MockModule->new('Mojo::UserAgent'); + my $fake_tx_head = Mojo::Transaction::HTTP->new; + $ua_mock->redefine(head => $fake_tx_head); + $fake_tx_head->res->code(308); + $fake_tx_head->res->headers->location('https://test.tld:1234/'); + my $client_redirect = undef; + combined_like { $client_redirect = OpenQA::Worker::WebUIConnection->new('http://127.0.0.1:12', {}) } + qr|Configured host was 'http://127.0.0.1:12' but got redirected to 'https://test.tld:1234/|, + 'Warning printed on redirect'; + is $client_redirect->url, 'https://test.tld:1234/api/v1/', 'New URL saved after redirect'; +}; + subtest 'attempt to register and send a command' => sub { my @expected_events; subtest 'handling registration failure on connection error' => sub { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/t/33-developer_mode.t new/openQA-5.1786454525.528632ee/t/33-developer_mode.t --- old/openQA-5.1786008335.2d518cd9/t/33-developer_mode.t 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/t/33-developer_mode.t 2026-08-11 15:22:05.000000000 +0200 @@ -206,6 +206,7 @@ wait_for_developer_console_like($driver, qr/\"resume_test_execution\":/, 'resume'); # skip timeout (again) + sleep 5; # workaround command processing issue, see https://progress.opensuse.org/issues/205206 enter_developer_console_cmd $driver, '{"cmd":"set_assert_screen_timeout","timeout":0}'; wait_for_developer_console_like( $driver, @@ -375,7 +376,7 @@ # in case it dies END { + local $?; kill_driver; turn_down_stack; - $? = 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/t/full-stack.t new/openQA-5.1786454525.528632ee/t/full-stack.t --- old/openQA-5.1786008335.2d518cd9/t/full-stack.t 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/t/full-stack.t 2026-08-11 15:22:05.000000000 +0200 @@ -465,9 +465,9 @@ done_testing; END { + local $?; kill_driver; turn_down_stack; session->clean; - $? = 0; $tempdir->list_tree->grep(qr/\.txt$/)->each(sub { print "$_:\n" . $_->slurp }) if defined $tempdir; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/t/lib/OpenQA/SeleniumTest.pm new/openQA-5.1786454525.528632ee/t/lib/OpenQA/SeleniumTest.pm --- old/openQA-5.1786008335.2d518cd9/t/lib/OpenQA/SeleniumTest.pm 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/t/lib/OpenQA/SeleniumTest.pm 2026-08-11 15:22:05.000000000 +0200 @@ -22,7 +22,7 @@ use Mojo::Server::Daemon; use Time::HiRes qw(time sleep); use OpenQA::WebAPI; -use OpenQA::Log 'log_info'; +use OpenQA::Log qw(log_info log_warning); use OpenQA::Utils; use OpenQA::Test::TimeLimit (); use OpenQA::Test::Utils qw(wait_for); @@ -99,7 +99,11 @@ enable_timeout; # Scripts are considered stuck after this timeout $_DRIVER->set_timeout(script => $ENV{OPENQA_SELENIUM_SCRIPT_TIMEOUT_MS} // 2000); - $_DRIVER->set_window_size(600, 800); + try { $_DRIVER->set_window_size(600, 800) } + catch ($e) { + # uncoverable statement + log_warning 'set_window_size failed, which could be due to a tiling WM. Continuing with current size.'; + } $_DRIVER->get($base_url); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/t/ui/14-dashboard.t new/openQA-5.1786454525.528632ee/t/ui/14-dashboard.t --- old/openQA-5.1786008335.2d518cd9/t/ui/14-dashboard.t 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/t/ui/14-dashboard.t 2026-08-11 15:22:05.000000000 +0200 @@ -79,29 +79,51 @@ is scalar @{$driver->find_elements('#group_description', 'css')}, 0, 'group description frame is not shown if none present'; is $driver->get($build_url . '?limit_builds=2'), 1, 'group overview page accepts query parameter, too'; +$driver->get($build_url . '?limit_builds=4711'); +like $driver->find_element('body')->get_text(), qr/limit_builds invalid/, + 'custom limit_builds value invalid when logged out'; +$driver->get($build_url . '?fullscreen=1&interval=4711'); +like $driver->find_element('body')->get_text(), qr/interval invalid/, 'custom interval value invalid when logged out'; +$driver->get('/login'); +$driver->get($build_url . '?fullscreen=1&interval=4711'); +is $driver->find_element('select[name=interval] option[value*="4711"][selected]')->get_text(), 4711, + 'select has custom interval 4711'; $driver->get($build_url . '?limit_builds=0'); is scalar @{$driver->find_elements('div.build-row .h4', 'css')}, 0, 'all builds filtered out'; is $driver->find_element('h2')->get_text(), 'Last Builds for opensuse', 'group name shown correctly when all builds filtered out'; -$driver->find_element_by_link_text('400')->click(); -is $driver->find_element('#more_builds b')->get_text(), 400, 'limited to the selected number'; +$driver->find_element('select[name=limit_builds]')->click(); +$driver->find_element('option[value*="400"]')->click(); +is $driver->find_element('option[value*="400"][selected]')->get_text(), 400, 'limited to the selected number'; like $driver->get_current_url(), qr/1001\?limit_builds=400/, 'url shows the selected build_limits'; -$driver->find_element_by_link_text('50')->click(); +$driver->find_element('select[name=limit_builds]')->click(); +$driver->find_element('option[value*="50"]')->click(); my $actual_url = $driver->get_current_url(); unlike $actual_url, qr/limit_builds=400/, 'url query does not show previous limit_builds'; like $actual_url, qr/1001\?limit_builds=50/, 'url query has unique limit_builds entry'; -$driver->find_element_by_link_text('tagged')->click(); +$driver->find_element('label[for=cb_only_tagged]')->click(); is scalar @{$driver->find_elements('.h4', 'css')}, 0, 'no tagged builds exist'; -$driver->find_element_by_link_text('400')->click(); +$driver->find_element('select[name=limit_builds]')->click(); +$driver->find_element('option[value*="400"]')->click(); $actual_url = $driver->get_current_url(); unlike $actual_url, qr/limit_builds=50/, 'url query updates only limit_builds entry and old selection is removed'; like $actual_url, qr/limit_builds=400/, 'url query updates only limit_builds entry and shows new selection'; like $actual_url, qr/only_tagged=1/, 'url query contains tag settings'; +$driver->find_element('label[for=cb_fullscreen]')->click(); +is scalar @{$driver->find_elements('#cb_fullscreen[checked]', 'css')}, 1, 'fullscreen on'; +$actual_url = $driver->get_current_url(); +like $actual_url, qr/fullscreen=1/, 'url query contains fullscreen'; +$driver->find_element('select[name=interval]')->click(); +$driver->find_element('option[value*="120"]')->click(); +$actual_url = $driver->get_current_url(); +like $actual_url, qr/interval=120/, 'url query contains interval=120'; +is $driver->find_element('select[name=interval] option[value*="120"][selected]')->get_text(), 120, + 'select has correct interval'; $driver->get('/group_overview/1001'); my $res = OpenQA::Test::Case::trim_whitespace($driver->find_element_by_id('more_builds')->get_text); -is $res, q{Limit to 10 / 20 / 50 / 100 / 400 builds, only tagged / all}, 'more builds can be requested'; +is $res, q{Limit to 10 20 50 100 400 builds Only show tagged builds}, 'more builds can be requested'; is $driver->get('/?group=opensuse'), 1, 'group parameter is not exact by default'; wait_for_ajax; is scalar @{$driver->find_elements('h2', 'css')}, 2, 'both job groups shown'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/templates/webapi/api_key/index.html.ep new/openQA-5.1786454525.528632ee/templates/webapi/api_key/index.html.ep --- old/openQA-5.1786008335.2d518cd9/templates/webapi/api_key/index.html.ep 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/templates/webapi/api_key/index.html.ep 2026-08-11 15:22:05.000000000 +0200 @@ -53,7 +53,7 @@ <li>Anonymize audit log entries (your username will be replaced)</li> <li>Replace your username, email, and profile information with placeholder values</li> </ul> - <p>See our <a href="https://github.com/os-autoinst/openQA/blob/master/docs/PrivacyPolicy.md" target="_blank">Privacy Policy</a> for more information about how we handle your data.</p> + <p>See our <a href="<%= app->config->{global}->{privacy_policy_url} %>" target="_blank">Privacy Policy</a> for more information about how we handle your data.</p> <div class="alert alert-warning"> <strong>This action cannot be undone.</strong> </div> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/templates/webapi/layouts/bootstrap.html.ep new/openQA-5.1786454525.528632ee/templates/webapi/layouts/bootstrap.html.ep --- old/openQA-5.1786008335.2d518cd9/templates/webapi/layouts/bootstrap.html.ep 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/templates/webapi/layouts/bootstrap.html.ep 2026-08-11 15:22:05.000000000 +0200 @@ -67,7 +67,7 @@ </span> </div> <div id='footer-legal' class="text-center"> - <a href='https://github.com/os-autoinst/openQA/blob/master/docs/PrivacyPolicy.md'>Privacy Policy</a> - + <a href="<%= app->config->{global}->{privacy_policy_url} %>">Privacy Policy</a> - openQA is licensed under %= link_to 'GPL-2.0' => 'https://github.com/os-autoinst/openQA' % if ($current_version) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/templates/webapi/main/more_builds.html.ep new/openQA-5.1786454525.528632ee/templates/webapi/main/more_builds.html.ep --- old/openQA-5.1786008335.2d518cd9/templates/webapi/main/more_builds.html.ep 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/templates/webapi/main/more_builds.html.ep 2026-08-11 15:22:05.000000000 +0200 @@ -1,19 +1,31 @@ -<div id="more_builds"> +<span id="more_builds"> Limit to - %= b join(' / ', map { $_ == $limit_builds ? "<b>$_</b>" : link_to($_ => url_with->query({limit_builds => $_})) } (10, 20, 50, 100, 400)); - builds, only - % my $selected = $only_tagged ? 'tagged' : 'all'; - %= b join(' / ', map { $_ eq $selected ? "<b>$_</b>" : link_to($_ => url_with->query({only_tagged => ($_ eq 'tagged' ? 1 : 0)})) } qw(tagged all)); -</div> + <select onchange="window.location.href = this.value;" class="form-select form-select-sm" name="limit_builds"> + % foreach (@$limit_builds_preset) { + <option value="<%= url_with->query({limit_builds => $_}) %>" <%= $_ == $limit_builds ? 'selected' : '' %>><%= $_ %></option> + % } + </select> + builds + <div class="cbc"> + <input type="checkbox" id="cb_only_tagged" value="<%= url_with->query({only_tagged => int(!$only_tagged)}) %>" <%= $only_tagged ? 'checked' : '' %> + onchange="window.location.href = this.value;" class="form-check-input" /> + <label for="cb_only_tagged" class="form-check-label">Only show tagged builds</label> + </div> +</span> -<div id="mode_section"> - Set mode to - % if ($fullscreen == 0) { - <%= link_to url_for->query(fullscreen => 1)->to_abs => begin %>full screen<% end %> - % } else { - <%= link_to url_for->query(fullscreen => 0)->to_abs => begin %>default view<% end %> - | Auto refresh every - %= b join(' / ', map { $_ == $interval ? "<b>$_</b>" : link_to($_ => url_with->query({interval => $_})) } (30, 60, 90, 120, 180)); +<span id="mode_section"> + <div class="cbc"> + <input type="checkbox" id="cb_fullscreen" value="<%= url_with->query({fullscreen => int(!$fullscreen)}) %>" <%= $fullscreen ? 'checked' : '' %> + onchange="window.location.href = this.value;" class="form-check-input" /> + <label for="cb_fullscreen" class="form-check-label">Fullscreen mode</label> + </div> + % if ($fullscreen) { + Auto refresh every + <select onchange="window.location.href = this.value;" class="form-select form-select-sm" name="interval"> + % foreach (@$interval_preset) { + <option value="<%= url_with->query({interval => $_}) %>" <%= $_ == $interval ? 'selected' : '' %>><%= $_ %></option> + % } + </select> seconds % } -</div> +</span> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/templates/webapi/test/overview_result_table.html.ep new/openQA-5.1786454525.528632ee/templates/webapi/test/overview_result_table.html.ep --- old/openQA-5.1786008335.2d518cd9/templates/webapi/test/overview_result_table.html.ep 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/templates/webapi/test/overview_result_table.html.ep 2026-08-11 15:22:05.000000000 +0200 @@ -35,7 +35,7 @@ <td>-</td> % next; % } - % my $resultid = join('_', $type, $arch, $config) =~ tr/ /_/r; + % my $resultid = join('_', $type, $arch, $config) =~ tr/ #/_/r; %= include 'test/tr_job_result', resultid => $resultid, res => $res, state => $state, jobid => $jobid % } </tr> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1786008335.2d518cd9/tools/ci/autoinst.sha new/openQA-5.1786454525.528632ee/tools/ci/autoinst.sha --- old/openQA-5.1786008335.2d518cd9/tools/ci/autoinst.sha 2026-08-06 11:25:35.000000000 +0200 +++ new/openQA-5.1786454525.528632ee/tools/ci/autoinst.sha 2026-08-11 15:22:05.000000000 +0200 @@ -1 +1 @@ -5.044000-71d56f4caac7a7cbb21f22654bce7a7dbe4cc779 \ No newline at end of file +5.044000-c0f0630c166834ebae41c5b1d56a850e2c24e911 \ No newline at end of file ++++++ openQA.obsinfo ++++++ --- /var/tmp/diff_new_pack.MuVaD6/_old 2026-08-12 16:12:32.202546014 +0200 +++ /var/tmp/diff_new_pack.MuVaD6/_new 2026-08-12 16:12:32.234547366 +0200 @@ -1,5 +1,5 @@ name: openQA -version: 5.1786008335.2d518cd9 -mtime: 1786008335 -commit: 2d518cd956f858cdc3aa9960a94c42bcf51b4f5e +version: 5.1786454525.528632ee +mtime: 1786454525 +commit: 528632ee272de3e74ac1325403ddaa3b533051a2
