Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package os-autoinst for openSUSE:Factory checked in at 2026-05-05 15:16:27 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/os-autoinst (Old) and /work/SRC/openSUSE:Factory/.os-autoinst.new.30200 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "os-autoinst" Tue May 5 15:16:27 2026 rev:593 rq:1350832 version:5.1777891128.f572829 Changes: -------- --- /work/SRC/openSUSE:Factory/os-autoinst/os-autoinst.changes 2026-04-30 20:33:11.257654654 +0200 +++ /work/SRC/openSUSE:Factory/.os-autoinst.new.30200/os-autoinst.changes 2026-05-05 15:17:51.173255564 +0200 @@ -1,0 +2,10 @@ +Mon May 04 10:38:57 UTC 2026 - [email protected] + +- Update to version 5.1777891128.f572829: + * fix: handle pre-marker pending text in script_output + * fix: echo json_cmd_token in isotovideo responses + * fix: re-install serial marker hook after console reset + * fix: support pretty_serial_markers in script_output regex + * fix(test): handle D-Bus AccessDenied in Open vSwitch test + +------------------------------------------------------------------- Old: ---- os-autoinst-5.1777537682.913fce0.obscpio New: ---- os-autoinst-5.1777891128.f572829.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ os-autoinst-devel-test.spec ++++++ --- /var/tmp/diff_new_pack.K2aFTi/_old 2026-05-05 15:17:52.429307647 +0200 +++ /var/tmp/diff_new_pack.K2aFTi/_new 2026-05-05 15:17:52.429307647 +0200 @@ -18,7 +18,7 @@ %define short_name os-autoinst-devel Name: %{short_name}-test -Version: 5.1777537682.913fce0 +Version: 5.1777891128.f572829 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ os-autoinst-openvswitch-test.spec ++++++ --- /var/tmp/diff_new_pack.K2aFTi/_old 2026-05-05 15:17:52.469309305 +0200 +++ /var/tmp/diff_new_pack.K2aFTi/_new 2026-05-05 15:17:52.469309305 +0200 @@ -19,7 +19,7 @@ %define name_ext -test %define short_name os-autoinst-openvswitch Name: %{short_name}%{?name_ext} -Version: 5.1777537682.913fce0 +Version: 5.1777891128.f572829 Release: 0 Summary: test package for %{short_name} License: GPL-2.0-or-later ++++++ os-autoinst-test.spec ++++++ --- /var/tmp/diff_new_pack.K2aFTi/_old 2026-05-05 15:17:52.513311130 +0200 +++ /var/tmp/diff_new_pack.K2aFTi/_new 2026-05-05 15:17:52.517311296 +0200 @@ -19,7 +19,7 @@ %define name_ext -test %define short_name os-autoinst Name: %{short_name}%{?name_ext} -Version: 5.1777537682.913fce0 +Version: 5.1777891128.f572829 Release: 0 Summary: test package for os-autoinst License: GPL-2.0-or-later ++++++ os-autoinst.spec ++++++ --- /var/tmp/diff_new_pack.K2aFTi/_old 2026-05-05 15:17:52.557312955 +0200 +++ /var/tmp/diff_new_pack.K2aFTi/_new 2026-05-05 15:17:52.561313121 +0200 @@ -17,7 +17,7 @@ Name: os-autoinst -Version: 5.1777537682.913fce0 +Version: 5.1777891128.f572829 Release: 0 Summary: OS-level test automation License: GPL-2.0-or-later ++++++ os-autoinst-5.1777537682.913fce0.obscpio -> os-autoinst-5.1777891128.f572829.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1777537682.913fce0/OpenQA/Isotovideo/CommandHandler.pm new/os-autoinst-5.1777891128.f572829/OpenQA/Isotovideo/CommandHandler.pm --- old/os-autoinst-5.1777537682.913fce0/OpenQA/Isotovideo/CommandHandler.pm 2026-04-30 10:28:02.000000000 +0200 +++ new/os-autoinst-5.1777891128.f572829/OpenQA/Isotovideo/CommandHandler.pm 2026-05-04 12:38:48.000000000 +0200 @@ -17,6 +17,7 @@ # io handles for sending data to command server and backend has [qw(test_fd cmd_srv_fd backend_fd backend_out_fd answer_fd)] => undef; +has [qw(current_command_token backend_requester_token postponed_token)]; # the name of the current test (full name includes category prefix, eg. installation-) has [qw(current_test_name current_test_full_name)]; @@ -76,6 +77,7 @@ sub process_command ($self, $answer_fd, $command_to_process) { my $cmd = $command_to_process->{cmd} or die 'isotovideo: no command specified'; $self->answer_fd($answer_fd); + local $self->{current_command_token} = $command_to_process->{json_cmd_token}; # invoke handler for the command if (my $handler = $self->can('_handle_command_' . $cmd)) { @@ -108,6 +110,7 @@ # postpone execution of command $self->postponed_answer_fd($self->answer_fd); + $self->postponed_token($self->current_command_token); $self->postponed_command($response); # send no reply to autotest, just let it wait @@ -119,18 +122,30 @@ sub _send_to_backend ($self, $data) { myjsonrpc::send_json($self->backend_fd, $data) } sub send_to_backend_requester ($self, $data) { - myjsonrpc::send_json($self->backend_requester, $data); + local $self->{current_command_token} = $self->backend_requester_token; + $self->_send_response($self->backend_requester, $data); $self->backend_requester(undef); + $self->backend_requester_token(undef); } -sub _respond ($self, $data) { myjsonrpc::send_json($self->answer_fd, $data) } +sub _add_token ($self, $data) { + my $token = $self->current_command_token or return $data; + return $data if exists $data->{json_cmd_token}; + return {%$data, json_cmd_token => $token}; +} + +sub _send_response ($self, $fd, $data) { + myjsonrpc::send_json($fd, $self->_add_token($data)); +} + +sub _respond ($self, $data) { $self->_send_response($self->answer_fd, $data) } sub _respond_ok ($self) { $self->_respond({ret => 1}) } sub _respond_ok_or_postpone_if_paused ($self) { return $self->_respond_ok unless my $reason_for_pause = $self->reason_for_pause; $self->_send_to_cmd_srv({paused => 1, reason => $reason_for_pause}); - $self->postponed_answer_fd($self->answer_fd)->postponed_command(undef); + $self->postponed_answer_fd($self->answer_fd)->postponed_token($self->current_command_token)->postponed_command(undef); } sub _pass_command_to_backend_unless_paused ($self, $response, $backend_cmd) { @@ -138,12 +153,13 @@ die 'isotovideo: we need to implement a backend queue' if $self->backend_requester; $self->backend_requester($self->answer_fd); + $self->backend_requester_token($self->current_command_token); $self->_send_to_cmd_srv({ $backend_cmd => $response, current_api_function => $backend_cmd, }); - $self->_send_to_backend({cmd => $backend_cmd, arguments => $response}); + $self->_send_to_backend($self->_add_token({cmd => $backend_cmd, arguments => $response})); $self->current_api_function($backend_cmd); } @@ -169,6 +185,7 @@ # postpone sending the reply $self->postponed_answer_fd($self->answer_fd); + $self->postponed_token($self->current_command_token); $self->postponed_command(undef); } @@ -213,12 +230,12 @@ } sub _handle_command_pause_test_execution ($self, $response, @) { - return $self->_respond_ok if $self->reason_for_pause; # do nothing if already paused - return $self->_respond_ok if $response->{due_to_failure} && !$self->pause_on_failure; + return $self->_respond_ok() if $self->reason_for_pause; # do nothing if already paused + return $self->_respond_ok() if $response->{due_to_failure} && !$self->pause_on_failure; my $reason_for_pause = $response->{reason} // 'manually paused'; $self->reason_for_pause($reason_for_pause); $self->_send_to_cmd_srv({paused => 1, reason => $reason_for_pause}); - $self->postponed_answer_fd($self->answer_fd)->postponed_command(undef); + $self->postponed_answer_fd($self->answer_fd)->postponed_token($self->current_command_token)->postponed_command(undef); } sub _handle_command_resume_test_execution ($self, $response, @) { @@ -238,6 +255,8 @@ my $downloader = OpenQA::Isotovideo::NeedleDownloader->new(); $downloader->download_missing_needles($response->{new_needles} // []); + $self->_respond_ok(); + # skip resuming last command if receiving a resume command without having previously postponed an answer # note: This should normally not be the case. However, the JavaScript client can technically send the command # to resume at any time and that apparently also happens sometimes in the fullstack test (see poo#101734). @@ -245,11 +264,13 @@ # if no command has been postponed (because paused due to timeout or on set_current_test) just return 1 if (!$postponed_command) { - myjsonrpc::send_json($postponed_answer_fd, { + local $self->{current_command_token} = $self->postponed_token; + $self->_send_response($postponed_answer_fd, { ret => ($response->{options} // 1), new_needles => $response->{new_needles}, }); $self->postponed_answer_fd(undef); + $self->postponed_token(undef); return; } @@ -259,6 +280,7 @@ $self->postponed_command(undef); $self->postponed_answer_fd(undef); + $self->postponed_token(undef); $self->process_command($postponed_answer_fd, $postponed_command); } @@ -285,13 +307,13 @@ $self->reason_for_pause('reached module ' . $pause_test_name); } $self->update_status_file; - $self->_respond_ok_or_postpone_if_paused; + $self->_respond_ok_or_postpone_if_paused(); } sub _handle_command_tests_done ($self, $response, @) { $self->test_died($response->{died}); $self->test_completed($response->{completed}); - $self->_respond_ok; + $self->_respond_ok(); $self->emit(tests_done => $response); $self->current_test_name(''); $self->status('finished'); @@ -312,7 +334,7 @@ check_screen => \%arguments, current_api_function => $current_api_function, }); - my $tags_resp = $bmwqemu::backend->_send_json({cmd => 'set_tags_to_assert', arguments => \%arguments}); + my $tags_resp = $bmwqemu::backend->_send_json($self->_add_token({cmd => 'set_tags_to_assert', arguments => \%arguments})); $self->tags(($tags_resp // {})->{tags} // []); $self->current_api_function($current_api_function); } @@ -320,10 +342,10 @@ sub _handle_command_set_assert_screen_timeout ($self, $response, @) { my $timeout = $response->{timeout}; $self->_send_to_cmd_srv({set_assert_screen_timeout => $timeout}); - $bmwqemu::backend->_send_json({ - cmd => 'set_assert_screen_timeout', - arguments => $timeout, - }); + $bmwqemu::backend->_send_json($self->_add_token({ + cmd => 'set_assert_screen_timeout', + arguments => $timeout, + })); $self->_respond_ok(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1777537682.913fce0/distribution.pm new/os-autoinst-5.1777891128.f572829/distribution.pm --- old/os-autoinst-5.1777537682.913fce0/distribution.pm 2026-04-30 10:28:02.000000000 +0200 +++ new/os-autoinst-5.1777891128.f572829/distribution.pm 2026-05-04 12:38:48.000000000 +0200 @@ -354,7 +354,7 @@ } # and the markers including internal exit catcher - my $out = $output =~ /(?:^|\r?\n)$marker\r?\n(?<expected_output>.*?)SCRIPT_FINISHED$marker-\d+-/s ? $+ : ''; + my $out = $output =~ /$marker\r?\n(?<expected_output>.*?)SCRIPT_FINISHED$marker-\d+-/s ? $+ : ''; # trim whitespaces $out =~ s/^\s+|\s+$//g; return $out; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1777537682.913fce0/t/03-testapi.t new/os-autoinst-5.1777891128.f572829/t/03-testapi.t --- old/os-autoinst-5.1777537682.913fce0/t/03-testapi.t 2026-04-30 10:28:02.000000000 +0200 +++ new/os-autoinst-5.1777891128.f572829/t/03-testapi.t 2026-05-04 12:38:48.000000000 +0200 @@ -805,6 +805,9 @@ $mock_testapi->redefine(wait_serial => "XXX\nfoo\nSCRIPT_FINISHEDXXX-1-"); is(script_output('echo foo', undef, proceed_on_failure => 1), 'foo', 'proceed_on_failure=1 retrieves retrieves output of script and do not die'); + $mock_testapi->redefine(wait_serial => "login: XXX\nfoo\nSCRIPT_FINISHEDXXX-0-"); + is(script_output('echo foo'), 'foo', 'script_output handles pre-marker pending text correctly'); + $mock_testapi->redefine(wait_serial => sub { return 'none' unless $_[0] =~ /SCRIPT_FINISHEDXXX/; return; }); throws_ok { script_output('timeout'); } qr/timeout/, 'die expected with timeout'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1777537682.913fce0/t/19-isotovideo-command-processing.t new/os-autoinst-5.1777891128.f572829/t/19-isotovideo-command-processing.t --- old/os-autoinst-5.1777537682.913fce0/t/19-isotovideo-command-processing.t 2026-04-30 10:28:02.000000000 +0200 +++ new/os-autoinst-5.1777891128.f572829/t/19-isotovideo-command-processing.t 2026-05-04 12:38:48.000000000 +0200 @@ -399,6 +399,31 @@ } qr/isotovideo received signal INT/, 'Signal logged'; is($last_signal, 'INT', 'Event emitted'); }; +subtest token_echo => sub { + reset_state(); + my $token = 'echo-test-token'; + $command_handler->process_command($answer_fd, {cmd => 'status', json_cmd_token => $token}); + is($last_received_msg_by_fd[$answer_fd]->{json_cmd_token}, $token, 'json_cmd_token echoed back in status response'); + + reset_state(); + $token = 'backend-token'; + $command_handler->process_command($answer_fd, {cmd => 'backend_some_cmd', json_cmd_token => $token}); + $command_handler->send_to_backend_requester({ret => 1}); + is($last_received_msg_by_fd[$answer_fd]->{json_cmd_token}, $token, 'json_cmd_token echoed back in backend response (auto-injected)'); + + subtest 'interleaved commands' => sub { + reset_state(); + my $token1 = 'token-1'; + my $token2 = 'token-2'; + $command_handler->process_command($answer_fd, {cmd => 'backend_cmd1', json_cmd_token => $token1}); + $command_handler->process_command($answer_fd, {cmd => 'status', json_cmd_token => $token2}); + is($last_received_msg_by_fd[$answer_fd]->{json_cmd_token}, $token2, 'interleaved command gets correct token'); + + $command_handler->send_to_backend_requester({ret => 1}); + is($last_received_msg_by_fd[$answer_fd]->{json_cmd_token}, $token1, 'deferred backend response gets correct token'); + }; +}; + subtest 'Check exit_code_from_test_results' => sub { my $mock_runner = Test::MockModule->new('OpenQA::Isotovideo::Runner'); my @diags; ++++++ os-autoinst.obsinfo ++++++ --- /var/tmp/diff_new_pack.K2aFTi/_old 2026-05-05 15:17:54.761404347 +0200 +++ /var/tmp/diff_new_pack.K2aFTi/_new 2026-05-05 15:17:54.769404679 +0200 @@ -1,5 +1,5 @@ name: os-autoinst -version: 5.1777537682.913fce0 -mtime: 1777537682 -commit: 913fce00a14c6d0b215fec654944b9f6f3954a62 +version: 5.1777891128.f572829 +mtime: 1777891128 +commit: f5728294afb1ee469327074230e3df21639643cd
