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-03-12 22:21:35 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/openQA (Old) and /work/SRC/openSUSE:Factory/.openQA.new.8177 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openQA" Thu Mar 12 22:21:35 2026 rev:822 rq:1338406 version:5.1773291834.69acf4b4 Changes: -------- --- /work/SRC/openSUSE:Factory/openQA/openQA.changes 2026-03-11 20:53:08.940577686 +0100 +++ /work/SRC/openSUSE:Factory/.openQA.new.8177/openQA.changes 2026-03-12 22:25:51.103058915 +0100 @@ -1,0 +2,9 @@ +Thu Mar 12 05:26:52 UTC 2026 - [email protected] + +- Update to version 5.1773291834.69acf4b4: + * chore(deps): Dependency cron 2026-03-12 + * style: Use HTTP::Status status code constants + * Revert "feat: optimize size of devel:openQA:ci/base container" + * feat: adapt to os-autoinst switching to markdown + +------------------------------------------------------------------- Old: ---- openQA-5.1773151075.654d76ed.obscpio New: ---- openQA-5.1773291834.69acf4b4.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openQA-client-test.spec ++++++ --- /var/tmp/diff_new_pack.OpQft1/_old 2026-03-12 22:25:53.707166579 +0100 +++ /var/tmp/diff_new_pack.OpQft1/_new 2026-03-12 22:25:53.707166579 +0100 @@ -18,7 +18,7 @@ %define short_name openQA-client Name: %{short_name}-test -Version: 5.1773151075.654d76ed +Version: 5.1773291834.69acf4b4 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-devel-test.spec ++++++ --- /var/tmp/diff_new_pack.OpQft1/_old 2026-03-12 22:25:53.743168068 +0100 +++ /var/tmp/diff_new_pack.OpQft1/_new 2026-03-12 22:25:53.743168068 +0100 @@ -18,7 +18,7 @@ %define short_name openQA-devel Name: %{short_name}-test -Version: 5.1773151075.654d76ed +Version: 5.1773291834.69acf4b4 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-test.spec ++++++ --- /var/tmp/diff_new_pack.OpQft1/_old 2026-03-12 22:25:53.775169390 +0100 +++ /var/tmp/diff_new_pack.OpQft1/_new 2026-03-12 22:25:53.779169556 +0100 @@ -18,7 +18,7 @@ %define short_name openQA Name: %{short_name}-test -Version: 5.1773151075.654d76ed +Version: 5.1773291834.69acf4b4 Release: 0 Summary: Test package for openQA License: GPL-2.0-or-later ++++++ openQA-worker-test.spec ++++++ --- /var/tmp/diff_new_pack.OpQft1/_old 2026-03-12 22:25:53.815171044 +0100 +++ /var/tmp/diff_new_pack.OpQft1/_new 2026-03-12 22:25:53.815171044 +0100 @@ -18,7 +18,7 @@ %define short_name openQA-worker Name: %{short_name}-test -Version: 5.1773151075.654d76ed +Version: 5.1773291834.69acf4b4 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA.spec ++++++ --- /var/tmp/diff_new_pack.OpQft1/_old 2026-03-12 22:25:53.847172367 +0100 +++ /var/tmp/diff_new_pack.OpQft1/_new 2026-03-12 22:25:53.851172533 +0100 @@ -59,7 +59,7 @@ # The following line is generated from dependencies.yaml %define assetpack_requires perl(CSS::Minifier::XS) >= 0.01 perl(JavaScript::Minifier::XS) >= 0.11 perl(Mojolicious) perl(Mojolicious::Plugin::AssetPack) >= 1.36 perl(YAML::PP) >= 0.026 # The following line is generated from dependencies.yaml -%define common_requires ntp-daemon perl >= 5.20.0 perl(Carp::Always) >= 0.14.02 perl(Config::IniFiles) perl(Cpanel::JSON::XS) >= 4.09 perl(Cwd) perl(Data::Dump) perl(Data::Dumper) perl(Digest::MD5) perl(Feature::Compat::Try) perl(Filesys::Df) perl(Getopt::Long) perl(Minion) >= 10.25 perl(Mojolicious) >= 9.340.0 perl(Regexp::Common) perl(Storable) perl(Text::Glob) perl(Time::Moment) +%define common_requires ntp-daemon perl >= 5.20.0 perl(Carp::Always) >= 0.14.02 perl(Config::IniFiles) perl(Cpanel::JSON::XS) >= 4.09 perl(Cwd) perl(Data::Dump) perl(Data::Dumper) perl(Digest::MD5) perl(Feature::Compat::Try) perl(Filesys::Df) perl(Getopt::Long) perl(HTTP::Status) perl(Minion) >= 10.25 perl(Mojolicious) >= 9.340.0 perl(Regexp::Common) perl(Storable) perl(Text::Glob) perl(Time::Moment) # runtime requirements for the main package that are not required by other sub-packages # The following line is generated from dependencies.yaml %define main_requires %assetpack_requires bsdtar git-core hostname openssh-clients perl(BSD::Resource) perl(Carp) perl(CommonMark) perl(DBD::Pg) >= 3.7.4 perl(DBI) >= 1.632 perl(DBIx::Class) >= 0.082801 perl(DBIx::Class::DeploymentHandler) perl(DBIx::Class::DynamicDefault) perl(DBIx::Class::OptimisticLocking) perl(DBIx::Class::ResultClass::HashRefInflator) perl(DBIx::Class::Schema::Config) perl(DBIx::Class::Storage::Statistics) perl(Date::Format) perl(DateTime) perl(DateTime::Duration) perl(DateTime::Format::Pg) perl(Exporter) perl(Fcntl) perl(File::Basename) perl(File::Copy) perl(File::Copy::Recursive) perl(File::Path) perl(File::Spec) perl(FindBin) perl(Getopt::Long::Descriptive) perl(IO::Handle) perl(IPC::Run) perl(JSON::Validator) perl(LWP::UserAgent) perl(Module::Load::Conditional) perl(Module::Pluggable) perl(Mojo::Base) perl(Mojo::ByteStream) perl(Mojo::IOLoop) perl(Mojo::JSON) perl(Mojo::Pg) perl(Mojo::RabbitMQ::Client) >= 0.2 perl(Mojo::URL) perl(Mojo::Util) perl(Mojoliciou s::Commands) perl(Mojolicious::Plugin) perl(Mojolicious::Plugin::OAuth2) perl(Mojolicious::Static) perl(Net::OpenID::Consumer) perl(POSIX) perl(Pod::POM) perl(SQL::Translator) perl(Scalar::Util) perl(Sort::Versions) perl(Text::Diff) perl(Time::HiRes) perl(Time::ParseDate) perl(Time::Piece) perl(Time::Seconds) perl(URI::Escape) perl(YAML::PP) >= 0.026 perl(YAML::XS) perl(aliased) perl(base) perl(constant) perl(diagnostics) perl(strict) perl(warnings) @@ -99,7 +99,7 @@ %define devel_requires %devel_no_selenium_requires chromedriver Name: openQA -Version: 5.1773151075.654d76ed +Version: 5.1773291834.69acf4b4 Release: 0 Summary: The openQA web-frontend, scheduler and tools License: GPL-2.0-or-later ++++++ openQA-5.1773151075.654d76ed.obscpio -> openQA-5.1773291834.69acf4b4.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/container/devel:openQA:ci/base/Dockerfile new/openQA-5.1773291834.69acf4b4/container/devel:openQA:ci/base/Dockerfile --- old/openQA-5.1773151075.654d76ed/container/devel:openQA:ci/base/Dockerfile 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/container/devel:openQA:ci/base/Dockerfile 2026-03-12 06:03:54.000000000 +0100 @@ -6,15 +6,18 @@ #!NoSquash FROM opensuse/leap:16.0 -# dependencies for CircleCI to be able to load/save the package cache +# only dependencies for CircleCI to be able to load/save the package cache # and fix permissions for the unprivileged user we use -# + autoinst dependencies -# + openQA dependencies -# + openQA chromedriver for Selenium tests -RUN zypper -n in tar gzip sudo \ - gcc-c++ cmake ninja pkgconfig\(opencv4\) pkg-config perl\(Module::CPANfile\) pkgconfig\(fftw3\) pkgconfig\(libpng\) pkgconfig\(sndfile\) pkgconfig\(theoraenc\) tesseract-ocr \ - perl-CSS-Sass ruby-devel npm python3-base python3-requests git-core rsync curl 'postgresql-devel>=14' 'postgresql-server>=14' qemu qemu-tools tar xorg-x11-fonts sudo make \ - chromedriver && zypper clean -a +RUN zypper -n in tar gzip sudo + +# these are autoinst dependencies +RUN zypper install -y gcc-c++ cmake ninja pkgconfig\(opencv4\) pkg-config perl\(Module::CPANfile\) pkgconfig\(fftw3\) pkgconfig\(libpng\) pkgconfig\(sndfile\) pkgconfig\(theoraenc\) tesseract-ocr + +# openQA dependencies +RUN zypper install -y perl-CSS-Sass ruby-devel npm python3-base python3-requests git-core rsync curl 'postgresql-devel>=14' 'postgresql-server>=14' qemu qemu-tools tar xorg-x11-fonts sudo make + +# openQA chromedriver for Selenium tests +RUN zypper install -y chromedriver ENV LANG=en_US.UTF-8 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/cpanfile new/openQA-5.1773291834.69acf4b4/cpanfile --- old/openQA-5.1773151075.654d76ed/cpanfile 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/cpanfile 2026-03-12 06:03:54.000000000 +0100 @@ -42,6 +42,7 @@ requires 'FindBin'; requires 'Getopt::Long'; requires 'Getopt::Long::Descriptive'; +requires 'HTTP::Status'; requires 'IO::Handle'; requires 'IO::Socket::SSL', '>= 2.009'; requires 'IPC::Run'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/dependencies.yaml new/openQA-5.1773291834.69acf4b4/dependencies.yaml --- old/openQA-5.1773151075.654d76ed/dependencies.yaml 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/dependencies.yaml 2026-03-12 06:03:54.000000000 +0100 @@ -43,6 +43,7 @@ perl(Feature::Compat::Try): perl(Filesys::Df): perl(Getopt::Long): + perl(HTTP::Status): perl(Minion): '>= 10.25' perl(Mojolicious): perl: '>= 9.34' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/dist/rpm/openQA.spec new/openQA-5.1773291834.69acf4b4/dist/rpm/openQA.spec --- old/openQA-5.1773151075.654d76ed/dist/rpm/openQA.spec 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/dist/rpm/openQA.spec 2026-03-12 06:03:54.000000000 +0100 @@ -59,7 +59,7 @@ # The following line is generated from dependencies.yaml %define assetpack_requires perl(CSS::Minifier::XS) >= 0.01 perl(JavaScript::Minifier::XS) >= 0.11 perl(Mojolicious) perl(Mojolicious::Plugin::AssetPack) >= 1.36 perl(YAML::PP) >= 0.026 # The following line is generated from dependencies.yaml -%define common_requires ntp-daemon perl >= 5.20.0 perl(Carp::Always) >= 0.14.02 perl(Config::IniFiles) perl(Cpanel::JSON::XS) >= 4.09 perl(Cwd) perl(Data::Dump) perl(Data::Dumper) perl(Digest::MD5) perl(Feature::Compat::Try) perl(Filesys::Df) perl(Getopt::Long) perl(Minion) >= 10.25 perl(Mojolicious) >= 9.340.0 perl(Regexp::Common) perl(Storable) perl(Text::Glob) perl(Time::Moment) +%define common_requires ntp-daemon perl >= 5.20.0 perl(Carp::Always) >= 0.14.02 perl(Config::IniFiles) perl(Cpanel::JSON::XS) >= 4.09 perl(Cwd) perl(Data::Dump) perl(Data::Dumper) perl(Digest::MD5) perl(Feature::Compat::Try) perl(Filesys::Df) perl(Getopt::Long) perl(HTTP::Status) perl(Minion) >= 10.25 perl(Mojolicious) >= 9.340.0 perl(Regexp::Common) perl(Storable) perl(Text::Glob) perl(Time::Moment) # runtime requirements for the main package that are not required by other sub-packages # The following line is generated from dependencies.yaml %define main_requires %assetpack_requires bsdtar git-core hostname openssh-clients perl(BSD::Resource) perl(Carp) perl(CommonMark) perl(DBD::Pg) >= 3.7.4 perl(DBI) >= 1.632 perl(DBIx::Class) >= 0.082801 perl(DBIx::Class::DeploymentHandler) perl(DBIx::Class::DynamicDefault) perl(DBIx::Class::OptimisticLocking) perl(DBIx::Class::ResultClass::HashRefInflator) perl(DBIx::Class::Schema::Config) perl(DBIx::Class::Storage::Statistics) perl(Date::Format) perl(DateTime) perl(DateTime::Duration) perl(DateTime::Format::Pg) perl(Exporter) perl(Fcntl) perl(File::Basename) perl(File::Copy) perl(File::Copy::Recursive) perl(File::Path) perl(File::Spec) perl(FindBin) perl(Getopt::Long::Descriptive) perl(IO::Handle) perl(IPC::Run) perl(JSON::Validator) perl(LWP::UserAgent) perl(Module::Load::Conditional) perl(Module::Pluggable) perl(Mojo::Base) perl(Mojo::ByteStream) perl(Mojo::IOLoop) perl(Mojo::JSON) perl(Mojo::Pg) perl(Mojo::RabbitMQ::Client) >= 0.2 perl(Mojo::URL) perl(Mojo::Util) perl(Mojoliciou s::Commands) perl(Mojolicious::Plugin) perl(Mojolicious::Plugin::OAuth2) perl(Mojolicious::Static) perl(Net::OpenID::Consumer) perl(POSIX) perl(Pod::POM) perl(SQL::Translator) perl(Scalar::Util) perl(Sort::Versions) perl(Text::Diff) perl(Time::HiRes) perl(Time::ParseDate) perl(Time::Piece) perl(Time::Seconds) perl(URI::Escape) perl(YAML::PP) >= 0.026 perl(YAML::XS) perl(aliased) perl(base) perl(constant) perl(diagnostics) perl(strict) perl(warnings) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/docs/UsersGuide.asciidoc new/openQA-5.1773291834.69acf4b4/docs/UsersGuide.asciidoc --- old/openQA-5.1773151075.654d76ed/docs/UsersGuide.asciidoc 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/docs/UsersGuide.asciidoc 2026-03-12 06:03:54.000000000 +0100 @@ -50,7 +50,7 @@ creation request. Certain variables also influence openQA's and/or os-autoinst's own behavior in terms of how it configures the environment for the job. Variables that influence os-autoinst's behavior are documented in the -file `doc/backend_vars.asciidoc` in the os-autoinst repository. +file `doc/backend_vars.md` in the os-autoinst repository. In openQA we can parameterize a test to describe for what product it will run and for what kind of machines it will be executed. For example, a test suite diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/docs/WritingTests.asciidoc new/openQA-5.1773291834.69acf4b4/docs/WritingTests.asciidoc --- old/openQA-5.1773151075.654d76ed/docs/WritingTests.asciidoc 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/docs/WritingTests.asciidoc 2026-03-12 06:03:54.000000000 +0100 @@ -2173,7 +2173,7 @@ a much faster test execution that can boot an existing system and only execute the intended test module. -https://github.com/os-autoinst/os-autoinst/blob/master/doc/backend_vars.asciidoc +https://github.com/os-autoinst/os-autoinst/blob/master/doc/backend_vars.md describes in detail the mentioned test parameters and more. Please consult this full reference as well. @@ -2281,7 +2281,7 @@ repository and branch. This works by setting the `CASEDIR` parameter of os-autoinst to a valid Git repository path including an optional branch/refspec specifier. `NEEDLES_DIR` can be set in the same way to use custom needles. See -https://github.com/os-autoinst/os-autoinst/blob/master/doc/backend_vars.asciidoc[the os-autoinst documentation] +https://github.com/os-autoinst/os-autoinst/blob/master/doc/backend_vars.md[the os-autoinst documentation] for details. [NOTE] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/Client/Archive.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/Client/Archive.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/Client/Archive.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/Client/Archive.pm 2026-03-12 06:03:54.000000000 +0100 @@ -8,6 +8,7 @@ use Mojo::URL; use Carp 'croak'; use Mojo::JSON 'encode_json'; +use HTTP::Status qw(:constants); sub run ($self, $options) { croak 'Options must be a HASH ref' unless ref $options eq 'HASH'; @@ -21,7 +22,7 @@ $self->client->max_response_size($options->{'asset-size-limit'}); my $code = $res->code; - die "There's an error openQA client returned $code" unless $code eq 200; + die "There's an error openQA client returned $code" unless $code eq HTTP_OK; my $job = $res->json->{job} || die 'No job could be retrieved'; @@ -88,7 +89,7 @@ my $message; if (my $err = $tx->error) { - $message //= {message => "file not found.\n"} if $tx->error->{code} && $tx->error->{code} eq 404; + $message //= {message => "file not found.\n"} if $tx->error->{code} && $tx->error->{code} eq HTTP_NOT_FOUND; $message //= {message => "Unexpected error while downloading: @{ [$tx->error->{message}]}\n"} if $tx->error->{message}; } @@ -183,7 +184,7 @@ progress => sub { my $msg = shift; - $msg->finish if $msg->code == 304; + $msg->finish if $msg->code == HTTP_NOT_MODIFIED; return unless my $len = $msg->headers->content_length; local $| = 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/Downloader.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/Downloader.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/Downloader.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/Downloader.pm 2026-03-12 06:03:54.000000000 +0100 @@ -11,6 +11,7 @@ use OpenQA::Utils 'human_readable_size'; use Time::HiRes 'sleep'; use Feature::Compat::Try; +use HTTP::Status qw(:constants); has attempts => 5; has [qw(log tmpdir)]; @@ -85,7 +86,7 @@ my $code = $res->code; my $error = $res->error // {message => 'Unknown error'}; - if (defined $code && $code == 304) { + if (defined $code && $code == HTTP_NOT_MODIFIED) { $options->{on_unchanged}->() if $options->{on_unchanged}; return (undef, -e $target ? undef : $error->{message}); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/Script/CloneJob.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/Script/CloneJob.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/Script/CloneJob.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/Script/CloneJob.pm 2026-03-12 06:03:54.000000000 +0100 @@ -16,6 +16,7 @@ use Mojo::JSON; # booleans use OpenQA::Script::CloneJobSUSE; use List::Util 'any'; +use HTTP::Status qw(:constants); our @EXPORT = qw( clone_jobs @@ -83,7 +84,7 @@ $err->{code} //= ''; die "failed to get job '$jobid': $err->{code} $err->{message}"; } - if ($tx->res->code != 200) { + if ($tx->res->code != HTTP_OK) { warn sprintf 'unexpected return code: %s %s', $tx->res->code, $tx->res->message; exit 1; } @@ -165,7 +166,7 @@ print STDERR "downloading\n$from\nto\n$dst\n"; my $r = $ua->mirror($from, $dst); - unless ($r->is_success || $r->code == 304) { + unless ($r->is_success || $r->code == HTTP_NOT_MODIFIED) { print STDERR "$jobid failed: $file, ", $r->status_line, "\n"; die "Can't clone due to missing assets: ", $r->status_line, " \n" unless $options->{'ignore-missing-assets'}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/Shared/Controller/Running.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/Shared/Controller/Running.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/Shared/Controller/Running.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/Shared/Controller/Running.pm 2026-03-12 06:03:54.000000000 +0100 @@ -14,6 +14,7 @@ use OpenQA::WebSockets::Client; use OpenQA::Jobs::Constants; use OpenQA::Schema::Result::Jobs; +use HTTP::Status qw(:constants); use constant IMAGE_STREAMING_INTERVAL => $ENV{OPENQA_IMAGE_STREAMING_INTERVAL} // 0.3; use constant TEXT_STREAMING_INTERVAL => $ENV{OPENQA_TEXT_STREAMING_INTERVAL} // 1.0; @@ -82,7 +83,7 @@ $self->render_later; Mojo::IOLoop->stream($self->tx->connection)->timeout(900); my $res = $self->res; - $res->code(200); + $res->code(HTTP_OK); $res->headers->content_type('text/event-stream'); # Try to open the log file and keep the filehandle diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/Shared/Plugin/Gru.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/Shared/Plugin/Gru.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/Shared/Plugin/Gru.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/Shared/Plugin/Gru.pm 2026-03-12 06:03:54.000000000 +0100 @@ -17,6 +17,7 @@ use Mojo::File qw(path); use Mojo::JSON qw(decode_json); use Feature::Compat::Try; +use HTTP::Status qw(:constants); use constant TRACK_INTERVAL => $ENV{OPENQA_GRU_TASK_TRACK_INTERVAL} // 0.5; @@ -318,11 +319,13 @@ sub (@results) { # pass result hash with error message (used by save/delete needle tasks) my $result = ref $results[0] eq 'HASH' ? $results[0]->{result} : undef; - return Mojo::Promise->reject($result, 500) if ref $result eq 'HASH' && $result->{error}; + return Mojo::Promise->reject($result, HTTP_INTERNAL_SERVER_ERROR) + if ref $result eq 'HASH' && $result->{error}; # format error message (fallback for general case) my $msg = ref $result eq '' && $result ? $result : 'check out Minion dashboard for further details.'; - return Mojo::Promise->reject({error => "Task for $task_description failed: $msg", result => $result}, 500); + return Mojo::Promise->reject({error => "Task for $task_description failed: $msg", result => $result}, + HTTP_INTERNAL_SERVER_ERROR); }); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/API/V1/Comment.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/API/V1/Comment.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/API/V1/Comment.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/API/V1/Comment.pm 2026-03-12 06:03:54.000000000 +0100 @@ -9,6 +9,7 @@ use OpenQA::App; use OpenQA::Utils qw(:DEFAULT href_to_bugref); use List::Util qw(min); +use HTTP::Status qw(:constants); =pod @@ -205,7 +206,7 @@ $self->emit_event('openqa_comments_create', \%res); $res{error} = 'Not all comments could be created.' if @failed; - $self->render(json => \%res, status => (@failed ? 400 : 200)); + $self->render(json => \%res, status => (@failed ? HTTP_BAD_REQUEST : HTTP_OK)); } =over 4 @@ -300,7 +301,7 @@ my %res = (ids => $ids, deleted => int $deleted_rows); $self->emit_event('openqa_comments_delete', \%res) if $deleted_rows; $res{error} = 'Not all comments could be deleted.' unless $ok; - $self->render(json => \%res, status => ($ok ? 200 : 400)); + $self->render(json => \%res, status => ($ok ? HTTP_OK : HTTP_BAD_REQUEST)); } 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/API/V1/Job.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/API/V1/Job.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/API/V1/Job.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/API/V1/Job.pm 2026-03-12 06:03:54.000000000 +0100 @@ -20,6 +20,7 @@ use DBIx::Class::Timestamps 'now'; use Mojo::Asset::Memory; use Mojo::File 'path'; +use HTTP::Status qw(:constants); =pod @@ -91,7 +92,7 @@ my $limits = OpenQA::App->singleton->config->{misc_limits}; my $limit = min($limits->{generic_max_limit}, $validation->param('limit') // $limits->{generic_default_limit}); my $offset = $validation->param('offset') // 0; - return $self->render(json => {error => 'Limit exceeds maximum'}, status => 400) unless $limit; + return $self->render(json => {error => 'Limit exceeds maximum'}, status => HTTP_BAD_REQUEST) unless $limit; return $self->reply->validation_error({format => 'json'}) if $validation->has_error; # validate parameters @@ -118,7 +119,7 @@ my $values = $args{$arg} = index($value, ',') != -1 ? [split /,/, $value] : $self->every_param($arg); if ($arg eq 'ids') { for my $id (@$values) { - return $self->render(json => {error => 'ids must be integers'}, status => 400) + return $self->render(json => {error => 'ids must be integers'}, status => HTTP_BAD_REQUEST) unless looks_like_number $id; } } @@ -426,7 +427,7 @@ } $self->emit_event(openqa_job_create => $_) for @$event_data; - $self->render(json => $json, status => ($json->{error} ? 400 : 200)); + $self->render(json => $json, status => ($json->{error} ? HTTP_BAD_REQUEST : HTTP_OK)); } =over 4 @@ -505,7 +506,7 @@ # this is the general worker update call sub update_status ($self) { - return $self->render(json => {error => 'No status information provided'}, status => 400) + return $self->render(json => {error => 'No status information provided'}, status => HTTP_BAD_REQUEST) unless my $json = $self->req->json; my $status = $json->{status}; @@ -514,14 +515,14 @@ if (!$job) { my $err = 'Got status update for non-existing job: ' . $job_id; log_info($err); - return $self->render(json => {error => $err}, status => 400); + return $self->render(json => {error => $err}, status => HTTP_BAD_REQUEST); } my $worker_id = $status->{worker_id}; if (!defined $worker_id) { my $err = "Got status update for job $job_id but does not contain a worker id!"; log_info($err); - return $self->render(json => {error => $err}, status => 400); + return $self->render(json => {error => $err}, status => HTTP_BAD_REQUEST); } # find worker @@ -539,7 +540,7 @@ my $err = "Got status update for job $job_id and worker $worker_id but there is" . " not even a worker assigned to this job (job is $job_status)"; log_info($err); - return $self->render(json => {error => $err}, status => 400); + return $self->render(json => {error => $err}, status => HTTP_BAD_REQUEST); } } @@ -550,7 +551,7 @@ = "Got status update for job $job_id with unexpected worker ID $worker_id" . " (expected $expected_worker_id, job is $job_status)"; log_info($err); - return $self->render(json => {error => $err}, status => 400); + return $self->render(json => {error => $err}, status => HTTP_BAD_REQUEST); } # update worker and job status @@ -571,7 +572,7 @@ if (!$ret || $ret->{error} || $ret->{error_status}) { $ret = {} unless $ret; $ret->{error} //= 'Unable to update status'; - $ret->{error_status} //= 400; + $ret->{error_status} //= HTTP_BAD_REQUEST; return $self->render(json => {error => $ret->{error}}, status => $ret->{error_status}); } $self->render(json => $ret); @@ -615,14 +616,16 @@ sub update ($self) { return unless my $job = $self->find_job_or_render_not_found($self->stash('jobid')); my $json = $self->req->json; - return $self->render(json => {error => 'No updates provided (must be provided as JSON)'}, status => 400) - unless $json; + return $self->render( + json => {error => 'No updates provided (must be provided as JSON)'}, + status => HTTP_BAD_REQUEST + ) unless $json; my $settings = delete $json->{settings}; # validate specified columns (print error if at least one specified column does not exist) my @allowed_cols = qw(group_id priority); for my $key (keys %$json) { - return $self->render(json => {error => "Column $key can not be set"}, status => 400) + return $self->render(json => {error => "Column $key can not be set"}, status => HTTP_BAD_REQUEST) unless grep { $_ eq $key } @allowed_cols; } @@ -695,7 +698,7 @@ return $self->render(text => 'OK') if $job->parse_extra_tests($validation->param('file'), $validation->param('type'), $validation->param('script')); - return $self->render(json => {error => 'Unable to parse extra test'}, status => 400); + return $self->render(json => {error => 'Unable to parse extra test'}, status => HTTP_BAD_REQUEST); } elsif (my $scope = $self->param('asset')) { my ($error, $fname, $type, $last) @@ -785,7 +788,7 @@ ) : 'Refusing to set result because job has already been re-scheduled.' ); - return $self->render(status => 400, json => {error => $msg}) if $msg; + return $self->render(status => HTTP_BAD_REQUEST, json => {error => $msg}) if $msg; } my $result = $validation->param('result'); @@ -796,7 +799,7 @@ $res = $job->done(result => $result, reason => $reason, newbuild => $newbuild); } catch ($e) { - $self->render(status => 400, json => {error => $e}); + $self->render(status => HTTP_BAD_REQUEST, json => {error => $e}); } return undef unless $res; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/API/V1/JobGroup.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/API/V1/JobGroup.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/API/V1/JobGroup.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/API/V1/JobGroup.pm 2026-03-12 06:03:54.000000000 +0100 @@ -5,6 +5,7 @@ use Mojo::Base 'Mojolicious::Controller', -signatures; use Mojo::JSON; use Feature::Compat::Try; +use HTTP::Status qw(:constants); use OpenQA::Schema::Result::JobGroups; @@ -216,7 +217,7 @@ sub _render_json ($self, $id = undef) { my $errors = $self->{_errors}; - my $status = @$errors ? 400 : 200; + my $status = @$errors ? HTTP_BAD_REQUEST : HTTP_OK; my %res = ( errors_by_field => $self->{_errors_by_field} // {}, warnings_by_field => $self->{_warnings_by_field} // {}, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/API/V1/JobTemplate.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/API/V1/JobTemplate.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/API/V1/JobTemplate.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/API/V1/JobTemplate.pm 2026-03-12 06:03:54.000000000 +0100 @@ -7,6 +7,7 @@ use OpenQA::App; use OpenQA::YAML qw(load_yaml dump_yaml); use List::Util qw(min); +use HTTP::Status qw(:constants); sub _get_templates ($self) { my $schema = $self->schema; @@ -65,7 +66,7 @@ sub list ($self) { my @templates; try { @templates = $self->_get_templates } - catch ($e) { return $self->render(json => {error => $e}, status => 404) } # uncoverable statement + catch ($e) { return $self->render(json => {error => $e}, status => HTTP_NOT_FOUND) } # uncoverable statement $self->render(json => {JobTemplates => [map { $_->to_hash } @templates]}); } @@ -256,7 +257,7 @@ # Push the exception to the list of errors without the trailing new line push @$user_errors, substr $e, 0, -1; } - return $self->respond_to(json => {json => {error => $user_errors}, status => 400}) if @$user_errors; + return $self->respond_to(json => {json => {error => $user_errors}, status => HTTP_BAD_REQUEST}) if @$user_errors; my $json = {}; my @server_errors; @@ -276,7 +277,8 @@ } if (@$user_errors) { $json->{error} = $user_errors; - return $self->respond_to(json => {json => $json, status => (@server_errors ? 500 : 400)}); + return $self->respond_to( + json => {json => $json, status => (@server_errors ? HTTP_INTERNAL_SERVER_ERROR : HTTP_BAD_REQUEST)}); } $self->emit_event('openqa_jobtemplate_create', $json) unless $validation->param('preview'); @@ -410,7 +412,7 @@ if ($error) { $json->{error} = $error; - $status = 400; + $status = HTTP_BAD_REQUEST; } else { $self->emit_event(openqa_jobtemplate_create => $json); @@ -431,7 +433,7 @@ sub destroy ($self) { my $job_template = $self->schema->resultset('JobTemplates')->find({id => $self->param('job_template_id')}); - my $status = 400; + my $status = HTTP_BAD_REQUEST; my $json = {}; if ($job_template && $job_template->group->template) { @@ -446,11 +448,11 @@ if ($rs) { $json->{result} = int $rs; $self->emit_event('openqa_jobtemplate_delete', {id => $self->param('job_template_id')}); - $status = 200; + $status = HTTP_OK; } } else { - $status = 404; + $status = HTTP_NOT_FOUND; $json->{error} = 'Not found'; } $self->render(json => $json, status => $status); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/API/V1/Search.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/API/V1/Search.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/API/V1/Search.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/API/V1/Search.pm 2026-03-12 06:03:54.000000000 +0100 @@ -7,6 +7,7 @@ use OpenQA::Utils; use Mojo::File 'path'; use IPC::Run; +use HTTP::Status qw(:constants); =pod @@ -81,7 +82,7 @@ my $stdout; my $stderr; IPC::Run::run(\@cmd, \undef, \$stdout, \$stderr); - return $self->render(json => {error => "Grep failed: $stderr"}, status => 400) if $stderr; + return $self->render(json => {error => "Grep failed: $stderr"}, status => HTTP_BAD_REQUEST) if $stderr; my $basename = $distri->basename; my $last_filename = ''; @@ -172,7 +173,7 @@ # Allow n queries per minute, per user (if logged in) my $lockname = 'webui_query_rate_limit'; if (my $user = $self->current_user) { $lockname .= $user->username } - return $self->render(json => {error => 'Rate limit exceeded'}, status => 400) + return $self->render(json => {error => 'Rate limit exceeded'}, status => HTTP_BAD_REQUEST) unless $self->app->minion->lock($lockname, 60, {limit => $self->app->config->{rate_limits}->{search}}); my $cap = $self->app->config->{global}->{search_results_limit}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/API/V1/Table.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/API/V1/Table.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/API/V1/Table.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/API/V1/Table.pm 2026-03-12 06:03:54.000000000 +0100 @@ -10,6 +10,7 @@ use List::Util qw(min); use Feature::Compat::Try; use Mojo::JSON 'decode_json'; +use HTTP::Status qw(:constants); =pod @@ -127,7 +128,7 @@ offset => $offset }); } - catch ($e) { return $self->render(json => {error => $e}, status => 404) } # uncoverable statement + catch ($e) { return $self->render(json => {error => $e}, status => HTTP_NOT_FOUND) } # uncoverable statement # Pagination pop @all if my $has_more = @all > $limit; @@ -172,14 +173,14 @@ my %entry = %{$TABLES{$table}->{defaults}}; my ($error_message, $settings, $keys) = $self->_prepare_settings($table, \%entry); - return $self->render(json => {error => $error_message}, status => 400) if defined $error_message; + return $self->render(json => {error => $error_message}, status => HTTP_BAD_REQUEST) if defined $error_message; $entry{settings} = $settings; my $id; try { $id = $self->schema->resultset($table)->create(\%entry)->id } - catch ($e) { return $self->render(json => {error => $e}, status => 400) } + catch ($e) { return $self->render(json => {error => $e}, status => HTTP_BAD_REQUEST) } $self->emit_event('openqa_table_create', {table => $table, id => $id, %entry}); $self->render(json => {id => $id}); @@ -227,13 +228,13 @@ my $table = $self->param('table'); my $entry = {}; my ($error_message, $settings, $keys) = $self->_prepare_settings($table, $entry); - return $self->render(json => {error => $error_message}, status => 400) if defined $error_message; + return $self->render(json => {error => $error_message}, status => HTTP_BAD_REQUEST) if defined $error_message; my $error; - my $status = 400; + my $status = HTTP_BAD_REQUEST; my $schema = $self->schema; my $update = sub { - return $status = 404 unless my $rc = $schema->resultset($table)->find({id => $self->param('id')}); + return $status = HTTP_NOT_FOUND unless my $rc = $schema->resultset($table)->find({id => $self->param('id')}); # Tables used in a group configured in YAML must not be renamed if ( (($table eq 'TestSuites' || $table eq 'Machines') && $rc->name ne $self->param('name')) @@ -254,13 +255,13 @@ try { $schema->txn_do($update); - $status = 200; + $status = HTTP_OK; } catch ($e) { # The first line of the backtrace gives us the error message we want $error = (split /\n/, $e)[0]; } - return $self->render(json => {error => $error // 'Not found'}, status => $status) unless $status == 200; + return $self->render(json => {error => $error // 'Not found'}, status => $status) unless $status == HTTP_OK; $self->emit_event('openqa_table_update', {table => $table, name => $entry->{name}, settings => $settings}); $self->render(json => {result => 1}); @@ -307,10 +308,10 @@ } if ($ret && $ret == 0) { - return $self->render(json => {error => 'Not found'}, status => 404); + return $self->render(json => {error => 'Not found'}, status => HTTP_NOT_FOUND); } if (!$ret) { - return $self->render(json => {error => $error}, status => 400); + return $self->render(json => {error => $error}, status => HTTP_BAD_REQUEST); } $self->emit_event('openqa_table_delete', {table => $table, name => $entry_name}); $self->render(json => {result => int $ret}); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/Admin/User.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/Admin/User.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/Admin/User.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/Admin/User.pm 2026-03-12 06:03:54.000000000 +0100 @@ -3,6 +3,7 @@ package OpenQA::WebAPI::Controller::Admin::User; use Mojo::Base 'Mojolicious::Controller'; +use HTTP::Status qw(:constants); sub index { my ($self) = @_; @@ -32,7 +33,7 @@ my $user = $set->find($self->param('userid')); if (!$user) { - $err = 404; + $err = HTTP_NOT_FOUND; $msg = "Can't find that user"; } else { @@ -42,7 +43,7 @@ } if (($self->tx->req->headers->accept // '') eq 'application/json') { - return $self->render(json => {$err ? 'error' : 'status' => $msg}, status => ($err ? $err : '200')); + return $self->render(json => {$err ? 'error' : 'status' => $msg}, status => ($err ? $err : HTTP_OK)); } else { $self->flash($err ? 'error' : 'info', $msg); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/Test.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/Test.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Controller/Test.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Controller/Test.pm 2026-03-12 06:03:54.000000000 +0100 @@ -19,6 +19,7 @@ use POSIX 'strftime'; use Mojo::JSON qw(to_json decode_json); use List::Util qw(first min); +use HTTP::Status qw(:constants); use constant DEPENDENCY_DEBUG_INFO => $ENV{OPENQA_DEPENDENCY_DEBUG_INFO}; @@ -189,15 +190,17 @@ sub clone ($self) { my $preset = $self->_load_test_preset($self->param('preset')); - return $self->render(status => 400, text => 'unable to find preset') unless defined $preset; - return $self->render(status => 400, text => 'preset has no distri') unless my $distri = $preset->{distri}; - return $self->render(status => 400, text => 'preset has no casedir') unless my $casedir = $preset->{casedir}; + return $self->render(status => HTTP_BAD_REQUEST, text => 'unable to find preset') unless defined $preset; + return $self->render(status => HTTP_BAD_REQUEST, text => 'preset has no distri') + unless my $distri = $preset->{distri}; + return $self->render(status => HTTP_BAD_REQUEST, text => 'preset has no casedir') + unless my $casedir = $preset->{casedir}; $self->gru->enqueue_and_keep_track( task_name => 'git_clone', task_description => 'cloning test distribution', task_args => {testcasedir($distri, $preset->{version}) => $casedir} # uncoverable statement )->then(sub ($result) { $self->render(json => $result) }) # uncoverable statement - ->catch(sub ($error, @) { $self->reply->gru_result($error, 400) }); + ->catch(sub ($error, @) { $self->reply->gru_result($error, HTTP_BAD_REQUEST) }); } sub get_match_param ($self) { @@ -601,20 +604,20 @@ sub _badge ($self, $job) { my $badge_text = 'Error 404: Job not found!'; my $badge_color = $BADGE_RESULT_COLORS{cancelled}; - my $status = 404; + my $status = HTTP_NOT_FOUND; if ($job) { my $result = $job->concise_result; $badge_color = $BADGE_RESULT_COLORS{$result} // $BADGE_RESULT_COLORS{cancelled}; $badge_text = $result =~ s/_/ /rg; $badge_text = $job->BUILD . ': ' . $badge_text if ($self->param('show_build')); - $status = 200; + $status = HTTP_OK; } $self->_render_badge($badge_text, $badge_color, $status); } -sub _render_badge ($self, $badge_text, $badge_color, $status = 200) { +sub _render_badge ($self, $badge_text, $badge_color, $status = HTTP_OK) { # determine the approximate required width of the badge my $charlen = 11; my $badge_prefix_width = 85; @@ -1005,7 +1008,7 @@ sub latest ($self) { my $job = $self->_get_latest_job(); - return $self->render(text => 'No matching job found', status => 404) unless $job; + return $self->render(text => 'No matching job found', status => HTTP_NOT_FOUND) unless $job; $self->stash(testid => $job->id); return $self->_show($job); } @@ -1161,7 +1164,7 @@ sub investigate ($self) { return $self->reply->not_found unless my $job = $self->_get_current_job; - my $git_limit = OpenQA::App->singleton->config->{global}->{job_investigate_git_log_limit} // 200; + my $git_limit = OpenQA::App->singleton->config->{global}->{job_investigate_git_log_limit} // HTTP_OK; my $investigation = $job->investigate(git_limit => $git_limit); $self->render(json => $investigation); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Plugin/ObsRsync.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Plugin/ObsRsync.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI/Plugin/ObsRsync.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI/Plugin/ObsRsync.pm 2026-03-12 06:03:54.000000000 +0100 @@ -10,6 +10,7 @@ use POSIX 'strftime'; use File::Which qw(which); use OpenQA::Log qw(log_error); +use HTTP::Status qw(:constants); my $dirty_status_filename = '.dirty_status'; my $api_repo_filename = '.api_repo'; @@ -180,7 +181,7 @@ my $tx = $ua->get($url); my $res = $tx->result; # Retry if authentication is required - if ($res->code == 401) { + if ($res->code == HTTP_UNAUTHORIZED) { my $username = $helper->username; my $ssh_key_file = $helper->ssh_key_file; my $auth_header = _bs_ssh_auth($res->headers->www_authenticate, $username, $ssh_key_file); @@ -474,15 +475,15 @@ } sub _check_error ($home, $alias, $subfolder = undef, $filename = undef) { - return (405, 'Home directory is not set') unless $home; - return (405, 'Home directory not found') unless -d $home; - return (400, 'Project has invalid characters') if $alias && $alias =~ m!/!; - return (400, 'Subfolder has invalid characters') if $subfolder && $subfolder =~ m!/!; - return (400, 'Filename has invalid characters') if $filename && $filename =~ m!/!; + return (HTTP_METHOD_NOT_ALLOWED, 'Home directory is not set') unless $home; + return (HTTP_METHOD_NOT_ALLOWED, 'Home directory not found') unless -d $home; + return (HTTP_BAD_REQUEST, 'Project has invalid characters') if $alias && $alias =~ m!/!; + return (HTTP_BAD_REQUEST, 'Subfolder has invalid characters') if $subfolder && $subfolder =~ m!/!; + return (HTTP_BAD_REQUEST, 'Filename has invalid characters') if $filename && $filename =~ m!/!; my ($project, $batch) = _split_alias(undef, $alias); - return (404, "Invalid Project {$project}") if $project && !-d Mojo::File->new($home, $project); - return (404, "Invalid Batch {$project|$batch}") + return (HTTP_NOT_FOUND, "Invalid Project {$project}") if $project && !-d Mojo::File->new($home, $project); + return (HTTP_NOT_FOUND, "Invalid Batch {$project|$batch}") if $project && $batch && !-d Mojo::File->new($home, $project, $batch); return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/WebAPI.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/WebAPI.pm 2026-03-12 06:03:54.000000000 +0100 @@ -15,6 +15,7 @@ use Mojo::IOLoop; use Mojo::Util 'trim'; use Feature::Compat::Try; +use HTTP::Status qw(:constants); has secrets => sub ($self) { $self->schema->read_application_secrets }; @@ -507,7 +508,7 @@ $app->hook( before_render => sub ($c, $args) { # return errors as JSON if accepted but HTML not - if (!$c->accepts('html') && $c->accepts('json') && $args->{status} && $args->{status} != 200) { + if (!$c->accepts('html') && $c->accepts('json') && $args->{status} && $args->{status} != HTTP_OK) { # the JSON API might already provide JSON in some error cases which must be preserved (($args->{json} //= {})->{error_status}) = $args->{status}; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/lib/OpenQA/Worker/WebUIConnection.pm new/openQA-5.1773291834.69acf4b4/lib/OpenQA/Worker/WebUIConnection.pm --- old/openQA-5.1773151075.654d76ed/lib/OpenQA/Worker/WebUIConnection.pm 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/lib/OpenQA/Worker/WebUIConnection.pm 2026-03-12 06:03:54.000000000 +0100 @@ -10,6 +10,10 @@ use OpenQA::Worker::CommandHandler; use Mojo::IOLoop; +use HTTP::Status qw(:constants); +# In HTTP-Message < 6.26 HTTP::Status did not have HTTP_TOO_EARLY yet, so we +# define it here for now until we can drop support for Leap 15.6 +use constant _HTTP_TOO_EARLY => 425; has 'webui_host'; # hostname:port of the web UI to connect to has 'url'; # URL of the web UI to connect to - initially deduced from webui_host (Mojo::URL instance) @@ -222,7 +226,8 @@ # define list of HTTP error codes which indicate that the web UI is overloaded or down for maintenance # (in these cases the re-try delay should be increased) -my %BUSY_ERROR_CODES = map { $_ => 1 } 408, 425, 502, 503, 504, 598; +my %BUSY_ERROR_CODES = map { $_ => 1 } HTTP_REQUEST_TIMEOUT, _HTTP_TOO_EARLY, HTTP_BAD_GATEWAY, + HTTP_SERVICE_UNAVAILABLE, HTTP_GATEWAY_TIMEOUT, 598; sub _retry_delay ($self, $is_webui_busy) { my $key = $is_webui_busy ? 'RETRY_DELAY_IF_WEBUI_BUSY' : 'RETRY_DELAY'; @@ -239,7 +244,11 @@ $msg = $error->{message} unless $msg; if (my $error_code = $error->{code}) { $msg = "$error_code response: $msg"; - if ($error_code < 500 && $error_code != 408 && $error_code != 425 && $error_code != 490) { + if ( $error_code < HTTP_INTERNAL_SERVER_ERROR + && $error_code != HTTP_REQUEST_TIMEOUT + && $error_code != _HTTP_TOO_EARLY + && $error_code != 490) + { # don't retry on most 4xx errors (in this case we can't expect different results on further attempts) $$remaining_tries = 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/tools/ci/autoinst.sha new/openQA-5.1773291834.69acf4b4/tools/ci/autoinst.sha --- old/openQA-5.1773151075.654d76ed/tools/ci/autoinst.sha 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/tools/ci/autoinst.sha 2026-03-12 06:03:54.000000000 +0100 @@ -1 +1 @@ -f10b3febe79d5b706696b8e71c0ab0a2366a0015 +43fc8f009328bcacc99afadef0fb847f9bbb87a8 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1773151075.654d76ed/tools/ci/ci-packages.txt new/openQA-5.1773291834.69acf4b4/tools/ci/ci-packages.txt --- old/openQA-5.1773151075.654d76ed/tools/ci/ci-packages.txt 2026-03-10 14:57:55.000000000 +0100 +++ new/openQA-5.1773291834.69acf4b4/tools/ci/ci-packages.txt 2026-03-12 06:03:54.000000000 +0100 @@ -139,7 +139,7 @@ perl-Log-Contextual-0.009001 perl-LWP-MediaTypes-6.04 perl-LWP-Protocol-https-6.140.0 -perl-MCP-0.40.0 +perl-MCP-0.80.0 perl-MIME-Base32-1.303.0 perl-Minion-10.300.0 perl-Minion-Backend-SQLite-5.0.7 ++++++ openQA.obsinfo ++++++ --- /var/tmp/diff_new_pack.OpQft1/_old 2026-03-12 22:26:04.911636154 +0100 +++ /var/tmp/diff_new_pack.OpQft1/_new 2026-03-12 22:26:04.915636322 +0100 @@ -1,5 +1,5 @@ name: openQA -version: 5.1773151075.654d76ed -mtime: 1773151075 -commit: 654d76edc6b0fc7ca984379670c280d1943e7029 +version: 5.1773291834.69acf4b4 +mtime: 1773291834 +commit: 69acf4b4c014204adb5c0687e0c7c7da622e7fa9
