Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package openQA for openSUSE:Factory checked in at 2025-12-12 21:41:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/openQA (Old) and /work/SRC/openSUSE:Factory/.openQA.new.1939 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openQA" Fri Dec 12 21:41:01 2025 rev:783 rq:1322254 version:5.1765469360.5c0525b5 Changes: -------- --- /work/SRC/openSUSE:Factory/openQA/openQA.changes 2025-12-11 18:38:00.129054072 +0100 +++ /work/SRC/openSUSE:Factory/.openQA.new.1939/openQA.changes 2025-12-12 21:42:06.975208218 +0100 @@ -2 +2 @@ -Wed Dec 10 15:10:39 UTC 2025 - [email protected] +Thu Dec 11 17:35:22 UTC 2025 - [email protected] @@ -4 +4,5 @@ -- Update to version 5.1765365298.9af08171: +- Update to version 5.1765469360.5c0525b5: + * worker: Add coverage for OVS DBus checks + * Fix overview when filtering by test and module result at the same time + * Return signal as part of run_cmd result + * Add scanner for untracked screenshots Old: ---- openQA-5.1765365298.9af08171.obscpio New: ---- openQA-5.1765469360.5c0525b5.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openQA-client-test.spec ++++++ --- /var/tmp/diff_new_pack.B8xSqO/_old 2025-12-12 21:42:08.411268745 +0100 +++ /var/tmp/diff_new_pack.B8xSqO/_new 2025-12-12 21:42:08.411268745 +0100 @@ -18,7 +18,7 @@ %define short_name openQA-client Name: %{short_name}-test -Version: 5.1765365298.9af08171 +Version: 5.1765469360.5c0525b5 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-devel-test.spec ++++++ --- /var/tmp/diff_new_pack.B8xSqO/_old 2025-12-12 21:42:08.447270262 +0100 +++ /var/tmp/diff_new_pack.B8xSqO/_new 2025-12-12 21:42:08.447270262 +0100 @@ -18,7 +18,7 @@ %define short_name openQA-devel Name: %{short_name}-test -Version: 5.1765365298.9af08171 +Version: 5.1765469360.5c0525b5 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-test.spec ++++++ --- /var/tmp/diff_new_pack.B8xSqO/_old 2025-12-12 21:42:08.483271779 +0100 +++ /var/tmp/diff_new_pack.B8xSqO/_new 2025-12-12 21:42:08.487271948 +0100 @@ -18,7 +18,7 @@ %define short_name openQA Name: %{short_name}-test -Version: 5.1765365298.9af08171 +Version: 5.1765469360.5c0525b5 Release: 0 Summary: Test package for openQA License: GPL-2.0-or-later ++++++ openQA-worker-test.spec ++++++ --- /var/tmp/diff_new_pack.B8xSqO/_old 2025-12-12 21:42:08.523273465 +0100 +++ /var/tmp/diff_new_pack.B8xSqO/_new 2025-12-12 21:42:08.523273465 +0100 @@ -18,7 +18,7 @@ %define short_name openQA-worker Name: %{short_name}-test -Version: 5.1765365298.9af08171 +Version: 5.1765469360.5c0525b5 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA.spec ++++++ --- /var/tmp/diff_new_pack.B8xSqO/_old 2025-12-12 21:42:08.571275489 +0100 +++ /var/tmp/diff_new_pack.B8xSqO/_new 2025-12-12 21:42:08.575275658 +0100 @@ -99,7 +99,7 @@ %define devel_requires %devel_no_selenium_requires chromedriver Name: openQA -Version: 5.1765365298.9af08171 +Version: 5.1765469360.5c0525b5 Release: 0 Summary: The openQA web-frontend, scheduler and tools License: GPL-2.0-or-later ++++++ openQA-5.1765365298.9af08171.obscpio -> openQA-5.1765469360.5c0525b5.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1765365298.9af08171/lib/OpenQA/Schema/ResultSet/Screenshots.pm new/openQA-5.1765469360.5c0525b5/lib/OpenQA/Schema/ResultSet/Screenshots.pm --- old/openQA-5.1765365298.9af08171/lib/OpenQA/Schema/ResultSet/Screenshots.pm 2025-12-10 12:14:58.000000000 +0100 +++ new/openQA-5.1765469360.5c0525b5/lib/OpenQA/Schema/ResultSet/Screenshots.pm 2025-12-11 17:09:20.000000000 +0100 @@ -1,4 +1,4 @@ -# Copyright 2019 SUSE LLC +# Copyright SUSE LLC # SPDX-License-Identifier: GPL-2.0-or-later package OpenQA::Schema::ResultSet::Screenshots; @@ -6,7 +6,9 @@ use Mojo::Base 'DBIx::Class::ResultSet', -signatures; -use OpenQA::Log qw(log_trace); +use Mojo::File qw(path); +use OpenQA::Log qw(log_trace log_error); +use OpenQA::Utils qw(imagesdir); sub create_screenshot ($self, $img) { my $dbh = $self->result_source->schema->storage->dbh; @@ -30,4 +32,26 @@ $self->result_source->schema->resultset('ScreenshotLinks')->populate([[qw(screenshot_id job_id)], @data]); } +# scans the image directories for untracked screenshots and deletes them +# This can take a very long time to execute if $images_dir is big. So this is meant to be executed manually, e.g.: +# OPENQA_LOGFILE=scan.log script/openqa eval 'say(STDERR app->schema->resultset("Screenshots")->scan_untracked_screenshots)' > to-delete.txt +sub scan_untracked_screenshots ($self, $images_dir = imagesdir, $delete = 0) { + my $dbh = $self->result_source->schema->storage->dbh; + my $sth = $dbh->prepare('SELECT count(id) FROM screenshots WHERE filename = ?'); + my $screenshots_path = path($images_dir); + my $screenshot_paths = $screenshots_path->list_tree({max_depth => 3})->grep(qr/.*\.png/i); + my $error_count = 0; + my $handle_error = sub ($msg) { log_error $msg; ++$error_count; return 0 }; + for my $screenshot_path_abs (@$screenshot_paths) { + my $screenshot_path = $screenshot_path_abs->to_rel($screenshots_path); + $sth->execute($screenshot_path); + my ($count) = $sth->fetchrow_array; + $handle_error->("Unable to lookup $screenshot_path in DB: " . $sth->errstr) and next if defined $sth->err; + next if $count; + say $screenshot_path_abs; + unlink $screenshot_path_abs or $handle_error->("Unable to delete $screenshot_path_abs: $!") if $delete; + } + return $error_count; +} + 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1765365298.9af08171/lib/OpenQA/Utils.pm new/openQA-5.1765469360.5c0525b5/lib/OpenQA/Utils.pm --- old/openQA-5.1765365298.9af08171/lib/OpenQA/Utils.pm 2025-12-10 12:14:58.000000000 +0100 +++ new/openQA-5.1765469360.5c0525b5/lib/OpenQA/Utils.pm 2025-12-11 17:09:20.000000000 +0100 @@ -311,11 +311,17 @@ my @out_args = defined $output_file ? ('>', $output_file, '2>', \$stderr) : (\$stdout, \$stderr); my $ipc_run_succeeded = IPC::Run::run($cmd, \$stdin, @out_args); my $error_code = $?; - my $return_code = ($error_code & 127) ? (undef) : ($error_code >> 8); - my $message - = defined $return_code - ? ("cmd returned $return_code") - : sprintf('cmd died with signal %d', $error_code & 127); + my $return_code; + my $signal; + my $message; + if ($error_code & 127) { + $signal = $error_code & 127; + $message = "cmd died with signal $signal"; + } + else { + $return_code = $error_code >> 8; + $message = "cmd returned $return_code"; + } my $expected_return_codes = $args{expected_return_codes}; chomp $stderr; if ( @@ -337,6 +343,7 @@ return_code => $return_code, stdout => $stdout, stderr => $stderr, + signal => $signal, }; } catch ($e) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1765365298.9af08171/lib/OpenQA/WebAPI/Plugin/Helpers.pm new/openQA-5.1765469360.5c0525b5/lib/OpenQA/WebAPI/Plugin/Helpers.pm --- old/openQA-5.1765365298.9af08171/lib/OpenQA/WebAPI/Plugin/Helpers.pm 2025-12-10 12:14:58.000000000 +0100 +++ new/openQA-5.1765469360.5c0525b5/lib/OpenQA/WebAPI/Plugin/Helpers.pm 2025-12-11 17:09:20.000000000 +0100 @@ -518,9 +518,9 @@ my $machines = $c->every_non_empty_param('machine'); my $failed_modules = $c->every_non_empty_param('failed_modules'); my %filters; - $filters{state} = {-in => $states} if @$states; - $filters{result} = {-in => $results} if @$results; - $filters{result} = FAILED if @$failed_modules; + $filters{'me.state'} = {-in => $states} if @$states; + $filters{'me.result'} = {-in => $results} if @$results; + $filters{'me.result'} = FAILED if @$failed_modules; $filters{ARCH} = {-in => $archs} if @$archs; $filters{MACHINE} = {-in => $machines} if @$machines; return [\%filters]; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1765365298.9af08171/t/16-utils-runcmd.t new/openQA-5.1765469360.5c0525b5/t/16-utils-runcmd.t --- old/openQA-5.1765365298.9af08171/t/16-utils-runcmd.t 2025-12-10 12:14:58.000000000 +0100 +++ new/openQA-5.1765469360.5c0525b5/t/16-utils-runcmd.t 2025-12-11 17:09:20.000000000 +0100 @@ -63,6 +63,7 @@ qr/.*cmd died with signal 9\n.*/i; is $res->{return_code}, undef, 'no exit code returned if command dies with a signal'; ok !$res->{status}, 'status not ok if command dies with a signal'; + is $res->{signal}, 9, 'signal returned in result'; }; subtest 'invoke Git commands for real testing error handling' => sub { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1765365298.9af08171/t/24-worker-overall.t new/openQA-5.1765469360.5c0525b5/t/24-worker-overall.t --- old/openQA-5.1765365298.9af08171/t/24-worker-overall.t 2025-12-10 12:14:58.000000000 +0100 +++ new/openQA-5.1765469360.5c0525b5/t/24-worker-overall.t 2025-12-11 17:09:20.000000000 +0100 @@ -16,6 +16,7 @@ use Mojolicious; use Test::Output qw(combined_like combined_from); use Test::MockModule; +use Test::MockObject; use OpenQA::Constants qw(WORKER_COMMAND_QUIT WORKER_SR_API_FAILURE WORKER_SR_DIED WORKER_SR_DONE WORKER_SR_FINISH_OFF); use OpenQA::Worker; use OpenQA::Worker::Job; @@ -594,6 +595,16 @@ is $worker->check_availability, undef, 'worker considered always available if not a tap worker'; }; +subtest 'check is_ovs_dbus_service_running of D-Bus service' => sub { + my $mock_net_dbus = Test::MockObject->new(); + $worker->{_system_dbus} = $mock_net_dbus; + $mock_net_dbus->set_true('get_service'); + is $worker->is_ovs_dbus_service_running, 1, 'OvS D-Bus service passed on passing get_service'; + $mock_net_dbus->mock(get_service => sub { die "Fake error" }); + is $worker->is_ovs_dbus_service_running, 0, 'OvS D-Bus service failed on failing get_service'; +}; + + subtest 'handle client status changes' => sub { my $fake_client = OpenQA::Worker::WebUIConnection->new('some-host', {apikey => 'foo', apisecret => 'bar'}); my $fake_client_2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1765365298.9af08171/t/42-screenshots.t new/openQA-5.1765469360.5c0525b5/t/42-screenshots.t --- old/openQA-5.1765365298.9af08171/t/42-screenshots.t 2025-12-10 12:14:58.000000000 +0100 +++ new/openQA-5.1765469360.5c0525b5/t/42-screenshots.t 2025-12-11 17:09:20.000000000 +0100 @@ -15,7 +15,7 @@ use OpenQA::ScreenshotDeletion; use Mojo::File qw(path tempdir); use Mojo::Log; -use Test::Output qw(combined_like); +use Test::Output qw(combined_like combined_unlike); use Test::Mojo; use Test::Warnings ':report_warnings'; use DateTime; @@ -244,4 +244,23 @@ unlike $log, qr/duplicate.*violates unique constraint "screenshots_filename"/, 'no unique constraint error'; }; +subtest 'deleting untracked screenshots' => sub { + my $tempdir = tempdir; + my $subdir = $tempdir->child('0a4/a66')->make_path; + my $image = $subdir->child('0647f51a4bef105e96ad0fad32.png')->touch; + my $screenshot_path = '0a4/a66/0647f51a4bef105e96ad0fad32.png'; + my $screenshot = $screenshots->create({filename => $screenshot_path, t_created => '2025-01-01'}); + my $error_count; + combined_unlike { $error_count = $screenshots->scan_untracked_screenshots($tempdir, 1) } + qr/0647f51a4bef105e96ad0fad32/, 'filename of screenshot not logged'; + ok -e $image, 'image that is still present in the database has been preserved'; + + is $error_count, 0, 'deletion happened without errors (0)'; + $screenshot->delete; + combined_like { $error_count = $screenshots->scan_untracked_screenshots($tempdir, 1) } + qr/0647f51a4bef105e96ad0fad32/, 'filename of screenshot logged'; + ok !-e $image, 'image that was deleted from the database has been deleted on disk as well'; + is $error_count, 0, 'deletion happened without errors (1)'; +}; + done_testing(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1765365298.9af08171/t/ui/10-tests_overview.t new/openQA-5.1765469360.5c0525b5/t/ui/10-tests_overview.t --- old/openQA-5.1765365298.9af08171/t/ui/10-tests_overview.t 2025-12-10 12:14:58.000000000 +0100 +++ new/openQA-5.1765469360.5c0525b5/t/ui/10-tests_overview.t 2025-12-11 17:09:20.000000000 +0100 @@ -399,6 +399,8 @@ subtest 'filtering by module' => sub { my $module = 'kate'; my $JOB_ICON_SELECTOR = 'td[id^="res_DVD_"]'; + my $query_all_job_ids_sorted + = qq|return Array.from(document.querySelectorAll('[name^="jobid_td"')).map(e => e.attributes.name.value).sort()|; my $result = 'failed'; subtest 'jobs containing the module with any result are present' => sub { @@ -432,8 +434,8 @@ element_visible('#res_DVD_i586_textmode'); element_visible('#res_DVD_x86_64_doc'); }; + my $modules = 'kate,zypper_up'; subtest 'jobs containing all the modules separated by comma are present' => sub { - my $modules = 'kate,zypper_up'; my $number_of_found_jobs = 2; $driver->get("/tests/overview?arch=&distri=opensuse&modules=$modules&modules_result=$result"); my @jobs = $driver->find_elements($JOB_ICON_SELECTOR); @@ -442,6 +444,11 @@ element_visible('#res_DVD_i586_kde'); element_visible('#res_DVD_i586_textmode'); }; + subtest 'combining module result and test result filters' => sub { + $driver->get("/tests/overview?result=$result&modules_result=$result"); + my $jobs = $driver->execute_script($query_all_job_ids_sorted); + is_deeply $jobs, [qw(jobid_td_99938 jobid_td_99946)], 'expected jobs present'; + }; }; subtest 'filtering by module_re' => sub { ++++++ openQA.obsinfo ++++++ --- /var/tmp/diff_new_pack.B8xSqO/_old 2025-12-12 21:42:26.304023181 +0100 +++ /var/tmp/diff_new_pack.B8xSqO/_new 2025-12-12 21:42:26.308023350 +0100 @@ -1,5 +1,5 @@ name: openQA -version: 5.1765365298.9af08171 -mtime: 1765365298 -commit: 9af081713946f8a6bc765d509a3ce855b547fdcf +version: 5.1765469360.5c0525b5 +mtime: 1765469360 +commit: 5c0525b50074bae31379e7f21d31810747bc1fbe
