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
 

Reply via email to