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-01-13 21:26:34 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/openQA (Old) and /work/SRC/openSUSE:Factory/.openQA.new.1928 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openQA" Tue Jan 13 21:26:34 2026 rev:792 rq:1326791 version:5.1768209690.f34c2973 Changes: -------- --- /work/SRC/openSUSE:Factory/openQA/openQA.changes 2026-01-09 17:05:22.852693027 +0100 +++ /work/SRC/openSUSE:Factory/.openQA.new.1928/openQA.changes 2026-01-13 21:26:45.600615757 +0100 @@ -1,0 +2,10 @@ +Mon Jan 12 13:11:23 UTC 2026 - [email protected] + +- Update to version 5.1768209690.f34c2973: + * feat(scheduled-products): Allow adding note to result data + * docs: Use node_modules target + * docs: Mention minimum PostgreSQL version + * ci: Update PostgreSQL in CI/packaging to at least 14 + * Revert "Add MCP tool annotations for Claude connector compliance" + +------------------------------------------------------------------- Old: ---- openQA-5.1767868268.dacbd3f7.obscpio New: ---- openQA-5.1768209690.f34c2973.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openQA-client-test.spec ++++++ --- /var/tmp/diff_new_pack.4Of4qd/_old 2026-01-13 21:26:49.076759230 +0100 +++ /var/tmp/diff_new_pack.4Of4qd/_new 2026-01-13 21:26:49.080759396 +0100 @@ -18,7 +18,7 @@ %define short_name openQA-client Name: %{short_name}-test -Version: 5.1767868268.dacbd3f7 +Version: 5.1768209690.f34c2973 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-devel-test.spec ++++++ --- /var/tmp/diff_new_pack.4Of4qd/_old 2026-01-13 21:26:49.152762367 +0100 +++ /var/tmp/diff_new_pack.4Of4qd/_new 2026-01-13 21:26:49.152762367 +0100 @@ -18,7 +18,7 @@ %define short_name openQA-devel Name: %{short_name}-test -Version: 5.1767868268.dacbd3f7 +Version: 5.1768209690.f34c2973 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-test.spec ++++++ --- /var/tmp/diff_new_pack.4Of4qd/_old 2026-01-13 21:26:49.244766164 +0100 +++ /var/tmp/diff_new_pack.4Of4qd/_new 2026-01-13 21:26:49.248766330 +0100 @@ -18,7 +18,7 @@ %define short_name openQA Name: %{short_name}-test -Version: 5.1767868268.dacbd3f7 +Version: 5.1768209690.f34c2973 Release: 0 Summary: Test package for openQA License: GPL-2.0-or-later ++++++ openQA-worker-test.spec ++++++ --- /var/tmp/diff_new_pack.4Of4qd/_old 2026-01-13 21:26:49.320769301 +0100 +++ /var/tmp/diff_new_pack.4Of4qd/_new 2026-01-13 21:26:49.320769301 +0100 @@ -18,7 +18,7 @@ %define short_name openQA-worker Name: %{short_name}-test -Version: 5.1767868268.dacbd3f7 +Version: 5.1768209690.f34c2973 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA.spec ++++++ --- /var/tmp/diff_new_pack.4Of4qd/_old 2026-01-13 21:26:49.376771613 +0100 +++ /var/tmp/diff_new_pack.4Of4qd/_new 2026-01-13 21:26:49.376771613 +0100 @@ -83,7 +83,7 @@ # Do not require on this in individual sub-packages except for the devel # package. # The following line is generated from dependencies.yaml -%define test_requires %common_requires %main_requires %mcp_requires %python_scripts_requires %worker_requires curl jq openssh-common os-autoinst perl(App::cpanminus) perl(Selenium::Remote::Driver) >= 1.23 perl(Selenium::Remote::WDKeys) perl(Test::Exception) perl(Test::Fatal) perl(Test::MockModule) perl(Test::MockObject) perl(Test::Mojo) perl(Test::Most) perl(Test::Output) perl(Test::Pod) perl(Test::Strict) perl(Test::Warnings) >= 0.029 postgresql-server python3-setuptools +%define test_requires %common_requires %main_requires %mcp_requires %python_scripts_requires %worker_requires curl jq openssh-common os-autoinst perl(App::cpanminus) perl(Selenium::Remote::Driver) >= 1.23 perl(Selenium::Remote::WDKeys) perl(Test::Exception) perl(Test::Fatal) perl(Test::MockModule) perl(Test::MockObject) perl(Test::Mojo) perl(Test::Most) perl(Test::Output) perl(Test::Pod) perl(Test::Strict) perl(Test::Warnings) >= 0.029 postgresql-server >= 14 python3-setuptools %ifarch x86_64 %define qemu qemu qemu-kvm %else @@ -99,7 +99,7 @@ %define devel_requires %devel_no_selenium_requires chromedriver Name: openQA -Version: 5.1767868268.dacbd3f7 +Version: 5.1768209690.f34c2973 Release: 0 Summary: The openQA web-frontend, scheduler and tools License: GPL-2.0-or-later ++++++ openQA-5.1767868268.dacbd3f7.obscpio -> openQA-5.1768209690.f34c2973.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1767868268.dacbd3f7/container/devel:openQA:ci/base/Dockerfile new/openQA-5.1768209690.f34c2973/container/devel:openQA:ci/base/Dockerfile --- old/openQA-5.1767868268.dacbd3f7/container/devel:openQA:ci/base/Dockerfile 2026-01-08 11:31:08.000000000 +0100 +++ new/openQA-5.1768209690.f34c2973/container/devel:openQA:ci/base/Dockerfile 2026-01-12 10:21:30.000000000 +0100 @@ -14,7 +14,7 @@ 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 'rubygem(sass)>=3.7.4' ruby-devel npm python3-base python3-requests git-core rsync curl postgresql-devel postgresql-server qemu qemu-tools tar xorg-x11-fonts sudo make +RUN zypper install -y 'rubygem(sass)>=3.7.4' 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1767868268.dacbd3f7/dependencies.yaml new/openQA-5.1768209690.f34c2973/dependencies.yaml --- old/openQA-5.1767868268.dacbd3f7/dependencies.yaml 2026-01-08 11:31:08.000000000 +0100 +++ new/openQA-5.1768209690.f34c2973/dependencies.yaml 2026-01-12 10:21:30.000000000 +0100 @@ -192,7 +192,7 @@ curl: jq: os-autoinst: - postgresql-server: + postgresql-server: '>= 14' python3-setuptools: perl(App::cpanminus): perl(Selenium::Remote::Driver): '>= 1.23' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1767868268.dacbd3f7/dist/rpm/openQA.spec new/openQA-5.1768209690.f34c2973/dist/rpm/openQA.spec --- old/openQA-5.1767868268.dacbd3f7/dist/rpm/openQA.spec 2026-01-08 11:31:08.000000000 +0100 +++ new/openQA-5.1768209690.f34c2973/dist/rpm/openQA.spec 2026-01-12 10:21:30.000000000 +0100 @@ -83,7 +83,7 @@ # Do not require on this in individual sub-packages except for the devel # package. # The following line is generated from dependencies.yaml -%define test_requires %common_requires %main_requires %mcp_requires %python_scripts_requires %worker_requires curl jq openssh-common os-autoinst perl(App::cpanminus) perl(Selenium::Remote::Driver) >= 1.23 perl(Selenium::Remote::WDKeys) perl(Test::Exception) perl(Test::Fatal) perl(Test::MockModule) perl(Test::MockObject) perl(Test::Mojo) perl(Test::Most) perl(Test::Output) perl(Test::Pod) perl(Test::Strict) perl(Test::Warnings) >= 0.029 postgresql-server python3-setuptools +%define test_requires %common_requires %main_requires %mcp_requires %python_scripts_requires %worker_requires curl jq openssh-common os-autoinst perl(App::cpanminus) perl(Selenium::Remote::Driver) >= 1.23 perl(Selenium::Remote::WDKeys) perl(Test::Exception) perl(Test::Fatal) perl(Test::MockModule) perl(Test::MockObject) perl(Test::Mojo) perl(Test::Most) perl(Test::Output) perl(Test::Pod) perl(Test::Strict) perl(Test::Warnings) >= 0.029 postgresql-server >= 14 python3-setuptools %ifarch x86_64 %define qemu qemu qemu-kvm %else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1767868268.dacbd3f7/docs/Contributing.asciidoc new/openQA-5.1768209690.f34c2973/docs/Contributing.asciidoc --- old/openQA-5.1767868268.dacbd3f7/docs/Contributing.asciidoc 2026-01-08 11:31:08.000000000 +0100 +++ new/openQA-5.1768209690.f34c2973/docs/Contributing.asciidoc 2026-01-12 10:21:30.000000000 +0100 @@ -436,9 +436,9 @@ development after you setup a PostgreSQL database as mentioned in the previous section. -You have to install/update web-related dependencies first using -`npm clean-install --ignore-scripts`. To start the webserver for development, -use `scripts/openqa daemon`. The other daemons (mentioned in the +You have to install/update web-related dependencies first, using +`make node_modules`. To start the web server for development, use +`scripts/openqa daemon`. The other daemons (mentioned in the link:images/architecture.svg[architecture diagram]) are started in the same way, e.g. `script/openqa-scheduler daemon`. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1767868268.dacbd3f7/docs/Installing.asciidoc new/openQA-5.1768209690.f34c2973/docs/Installing.asciidoc --- old/openQA-5.1767868268.dacbd3f7/docs/Installing.asciidoc 2026-01-08 11:31:08.000000000 +0100 +++ new/openQA-5.1768209690.f34c2973/docs/Installing.asciidoc 2026-01-12 10:21:30.000000000 +0100 @@ -500,8 +500,8 @@ [[database]] === Database -openQA uses PostgreSQL as database. By default, a database with name `openqa` -and `geekotest` user as owner is used. An automatic setup of a freshly +openQA requires PostgreSQL 14 or newer. By default, a database with name +`openqa` and `geekotest` user as owner is used. An automatic setup of a freshly installed PostgreSQL instance can be done using https://github.com/os-autoinst/openQA/blob/master/script/setup-db[this script]. The database connection can be configured in <<GettingStarted.asciidoc#_configuration,the database configuration file>>. @@ -1420,7 +1420,7 @@ + [source,sh] ---- -oldver=10 newver=12 +oldver=17 newver=18 sudo zypper in postgresql$newver-server postgresql$newver-contrib ---- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1767868268.dacbd3f7/lib/OpenQA/Schema/ResultSet/ScheduledProducts.pm new/openQA-5.1768209690.f34c2973/lib/OpenQA/Schema/ResultSet/ScheduledProducts.pm --- old/openQA-5.1767868268.dacbd3f7/lib/OpenQA/Schema/ResultSet/ScheduledProducts.pm 2026-01-08 11:31:08.000000000 +0100 +++ new/openQA-5.1768209690.f34c2973/lib/OpenQA/Schema/ResultSet/ScheduledProducts.pm 2026-01-12 10:21:30.000000000 +0100 @@ -4,6 +4,7 @@ package OpenQA::Schema::ResultSet::ScheduledProducts; use Mojo::Base 'DBIx::Class::ResultSet', -signatures; +use Mojo::JSON qw(encode_json); use OpenQA::Schema::Result::ScheduledProducts qw(CANCELLED); use OpenQA::App; @@ -30,6 +31,28 @@ return {jobs_cancelled => $count}; } +sub update_note ($self, $distri, $version, $flavor, $arch, $build, $note) { + my $sth = $self->result_source->schema->storage->dbh->prepare( + <<~'END_SQL' + UPDATE scheduled_products SET results['note'] = ? where id = ( + SELECT id + FROM scheduled_products + WHERE distri = ? and version = ? and flavor = ? and arch = ? and build = ? + ORDER BY id DESC + LIMIT 1 + ) RETURNING id; + END_SQL + ); + $sth->bind_param(1, encode_json($note)); + $sth->bind_param(2, $distri); + $sth->bind_param(3, $version); + $sth->bind_param(4, $flavor); + $sth->bind_param(5, $arch); + $sth->bind_param(6, $build); + $sth->execute; + return {updated_product_id => $sth->fetchrow_arrayref->[0]}; +} + sub job_statistics ($self, $distri, $version, $flavor, $arch, $build) { my $sth = $self->result_source->schema->storage->dbh->prepare( <<~'END_SQL' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1767868268.dacbd3f7/lib/OpenQA/WebAPI/Controller/API/V1/Iso.pm new/openQA-5.1768209690.f34c2973/lib/OpenQA/WebAPI/Controller/API/V1/Iso.pm --- old/openQA-5.1767868268.dacbd3f7/lib/OpenQA/WebAPI/Controller/API/V1/Iso.pm 2026-01-08 11:31:08.000000000 +0100 +++ new/openQA-5.1768209690.f34c2973/lib/OpenQA/WebAPI/Controller/API/V1/Iso.pm 2026-01-12 10:21:30.000000000 +0100 @@ -56,6 +56,15 @@ $self->render(json => $scheduled_product->to_hash(@args)); } +sub _get_iso_params_and_validate ($self) { + my $validation = $self->validation; + my @param_keys = (qw(distri version flavor arch build)); + $validation->required($_) for @param_keys; + return [map { $validation->param($_) } @param_keys] unless $validation->has_error; + $self->reply->validation_error({format => 'json'}); + return 0; +} + =over 4 =item job_statistics() @@ -89,13 +98,30 @@ =cut sub job_statistics ($self) { + return undef unless my $params = $self->_get_iso_params_and_validate; + my $scheduled_products = $self->app->schema->resultset('ScheduledProducts'); + $self->render(json => $scheduled_products->job_statistics(@$params)); +} + +=over 4 + +=item update_note() + +Adds/updates a note on the latest scheduled product matching the specified +DISTRI, VERSION, FLAVOR, ARCH and BUILD parameters. This note is shown on the +web UI. The ID of the scheduled product where the note was added/updated is +returned, e.g. `{updated_product_id: 42}`. + +=back + +=cut + +sub update_note ($self) { my $validation = $self->validation; - my @param_keys = (qw(distri version flavor arch build)); - $validation->required($_) for @param_keys; - return $self->reply->validation_error({format => 'json'}) if $validation->has_error; - my @params = map { $validation->param($_) } @param_keys; + $validation->required('note'); + return undef unless my $params = $self->_get_iso_params_and_validate; my $scheduled_products = $self->app->schema->resultset('ScheduledProducts'); - $self->render(json => $scheduled_products->job_statistics(@params)); + $self->render(json => $scheduled_products->update_note(@$params, $validation->param('note'))); } sub validate_create_parameters ($self) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1767868268.dacbd3f7/lib/OpenQA/WebAPI/Plugin/MCP.pm new/openQA-5.1768209690.f34c2973/lib/OpenQA/WebAPI/Plugin/MCP.pm --- old/openQA-5.1767868268.dacbd3f7/lib/OpenQA/WebAPI/Plugin/MCP.pm 2026-01-08 11:31:08.000000000 +0100 +++ new/openQA-5.1768209690.f34c2973/lib/OpenQA/WebAPI/Plugin/MCP.pm 2026-01-12 10:21:30.000000000 +0100 @@ -16,64 +16,31 @@ $mcp->tool( name => 'openqa_get_info', - title => 'Get openQA Server Info', description => 'Get information about the openQA server, connected workers and the current user', - input_schema => {type => 'object', properties => {}, additionalProperties => 0}, - annotations => { - title => 'Get openQA Server Info', - readOnlyHint => 1, - destructiveHint => 0, - idempotentHint => 1, - openWorldHint => 0, - }, code => \&tool_openqa_get_info ); $mcp->tool( name => 'openqa_get_job_info', - title => 'Get openQA Job Details', - description => 'Get any information about a specific openQA job, like logs, scheduling etc.', + description => 'Get information about a specific openQA job', input_schema => { type => 'object', - properties => - {job_id => {type => 'integer', minimum => 1, description => 'The job ID of any openQA test suite.'}}, + properties => {job_id => {type => 'integer', minimum => 1}}, required => ['job_id'], - additionalProperties => 0, - }, - annotations => { - title => 'Get openQA Job Details', - readOnlyHint => 1, - destructiveHint => 0, - idempotentHint => 1, - openWorldHint => 0, }, code => \&tool_openqa_get_job_info ); $mcp->tool( name => 'openqa_get_log_file', - title => 'Get openQA Job Log File', description => 'Get the content of a specific log file for an openQA job', input_schema => { type => 'object', properties => { - job_id => {type => 'integer', minimum => 1, description => 'The job ID of the openQA job'}, - file_name => { - type => 'string', - minLength => 1, - description => - 'Name of the log file to lookup (e.g., autoinst-log.txt, serial0.txt). Only text logs for now' - } + job_id => {type => 'integer', minimum => 1}, + file_name => {type => 'string', minLength => 1} }, required => ['job_id', 'file_name'], - additionalProperties => 0, - }, - annotations => { - title => 'Get openQA Job Log File', - readOnlyHint => 1, - destructiveHint => 0, - idempotentHint => 1, - openWorldHint => 0, }, code => \&tool_openqa_get_log_file ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1767868268.dacbd3f7/lib/OpenQA/WebAPI.pm new/openQA-5.1768209690.f34c2973/lib/OpenQA/WebAPI.pm --- old/openQA-5.1767868268.dacbd3f7/lib/OpenQA/WebAPI.pm 2026-01-08 11:31:08.000000000 +0100 +++ new/openQA-5.1768209690.f34c2973/lib/OpenQA/WebAPI.pm 2026-01-12 10:21:30.000000000 +0100 @@ -380,6 +380,7 @@ $api_ra->delete('/isos/#name')->name('apiv1_destroy_iso')->to('iso#destroy'); $api_ro->post('/isos/#name/cancel')->name('apiv1_cancel_iso')->to('iso#cancel'); $api_ro->get('/isos/job_stats')->name('apiv1_scheduled_product_job_stats')->to('iso#job_statistics'); + $api_ro->put('/experimental/isos/note')->name('apiv1_scheduled_product_note')->to('iso#update_note'); # api/v1/webhooks $api_ro->post('/webhooks/product')->name('apiv1_evaluate_webhook_product')->to('webhook#product'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1767868268.dacbd3f7/t/api/02-iso.t new/openQA-5.1768209690.f34c2973/t/api/02-iso.t --- old/openQA-5.1767868268.dacbd3f7/t/api/02-iso.t 2026-01-08 11:31:08.000000000 +0100 +++ new/openQA-5.1768209690.f34c2973/t/api/02-iso.t 2026-01-12 10:21:30.000000000 +0100 @@ -310,6 +310,8 @@ lj; +my $params = 'distri=opensuse&version=13.1&flavor=DVD&arch=i586&build=0091'; + subtest 'job statistics can be queried about the scheduled product' => sub { $schema->txn_begin; # assume some of the scheduled jobs are already done @@ -317,7 +319,7 @@ $jobs->find(99988)->update({state => DONE, result => FAILED}); $jobs->find(99993)->update({state => DONE, result => PASSED}); $jobs->find(99994)->update({state => DONE, result => PASSED}); - $t->get_ok('/api/v1/isos/job_stats?distri=opensuse&version=13.1&flavor=DVD&arch=i586&build=0091')->status_is(200); + $t->get_ok("/api/v1/isos/job_stats?$params")->status_is(200); $schema->txn_rollback; my $json = $t->tx->res->json; is_deeply [sort keys %$json], [DONE, SCHEDULED], 'expected states present'; @@ -329,6 +331,18 @@ 'scheduled jobs'; }; +subtest 'note can be updated by distri, version, flavor, arch and build parameters' => sub { + $t->put_ok("/api/v1/experimental/isos/note?$params"); + $t->status_is(400, 'error returned if parameter missing'); + $t->put_ok("/api/v1/experimental/isos/note?$params¬e=not+approving"); + $t->status_is(200, 'update successful'); + my $res = $t->tx->res->json; + ok my $id = $res->{updated_product_id}, 'scheduled product ID returned' or always_explain $res; + $t->get_ok("/api/v1/isos/$id")->status_is(200, 'returned scheduled product ID exists'); + $t->json_is('/results/note' => 'not approving', 'note present'); + always_explain $t->tx->res->json unless $t->success; +}; + subtest 'old tests are cancelled unless they are marked as important' => sub { $t->get_ok('/api/v1/jobs/99927')->status_is(200); is($t->tx->res->json->{job}->{state}, 'cancelled', 'job 99927 is cancelled'); ++++++ openQA.obsinfo ++++++ --- /var/tmp/diff_new_pack.4Of4qd/_old 2026-01-13 21:27:02.049294654 +0100 +++ /var/tmp/diff_new_pack.4Of4qd/_new 2026-01-13 21:27:02.057294984 +0100 @@ -1,5 +1,5 @@ name: openQA -version: 5.1767868268.dacbd3f7 -mtime: 1767868268 -commit: dacbd3f73d9507db51fc3972fdf46f04fc490ec4 +version: 5.1768209690.f34c2973 +mtime: 1768209690 +commit: f34c29732fde5f2386315ab8129298675d9863a4
