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-10-18 19:25:49 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/openQA (Old) and /work/SRC/openSUSE:Factory/.openQA.new.3698736 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openQA" Sun Oct 18 19:25:49 2026 rev:893 rq:1385888 version:5.1792312714.72310e70 Changes: -------- --- /work/SRC/openSUSE:Factory/openQA/openQA.changes 2026-10-17 21:25:32.837242903 +0200 +++ /work/SRC/openSUSE:Factory/.openQA.new.3698736/openQA.changes 2026-10-18 19:26:10.098897017 +0200 @@ -1,0 +2,27 @@ +Sun Oct 18 08:38:52 UTC 2026 - [email protected] + +- Update to version 5.1792312714.72310e70: + * Revert "chore(deps): bump @fortawesome/fontawesome-free from 6.7.2 to 7.3.1 (…" + * chore(deps): bump @fortawesome/fontawesome-free from 6.7.2 to 7.3.1 (#7963) + +------------------------------------------------------------------- +Sat Oct 17 16:18:39 UTC 2026 - [email protected] + +- Update to version 5.1792253904.15891dd2: + * chore(deps-dev): bump nanoid from 3.3.16 to 3.3.20 (#7962) + +------------------------------------------------------------------- +Sat Oct 17 00:22:59 UTC 2026 - [email protected] + +- Update to version 5.1792192473.2519a8cf: + * feat: Add prepare-node-env target for npm tools + +------------------------------------------------------------------- +Fri Oct 16 21:54:22 UTC 2026 - [email protected] + +- Update to version 5.1792179051.8cc81679: + * chore(deps-dev): bump stylelint-config-recommended-scss (#7360) + * chore(deps): bump robust-predicates from 3.0.2 to 3.0.3 (#7240) + * feat: Improve OVS health check for workers with `tap` class + +------------------------------------------------------------------- Old: ---- openQA-5.1792169851.d54cd4e4.obscpio New: ---- openQA-5.1792312714.72310e70.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openQA-client-test.spec ++++++ --- /var/tmp/diff_new_pack.T9tFUM/_old 2026-10-18 19:26:12.591001332 +0200 +++ /var/tmp/diff_new_pack.T9tFUM/_new 2026-10-18 19:26:12.592001374 +0200 @@ -18,7 +18,7 @@ %define short_name openQA-client Name: %{short_name}-test -Version: 5.1792169851.d54cd4e4 +Version: 5.1792312714.72310e70 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA-test.spec ++++++ --- /var/tmp/diff_new_pack.T9tFUM/_old 2026-10-18 19:26:12.616002378 +0200 +++ /var/tmp/diff_new_pack.T9tFUM/_new 2026-10-18 19:26:12.618002462 +0200 @@ -18,7 +18,7 @@ %define short_name openQA Name: %{short_name}-test -Version: 5.1792169851.d54cd4e4 +Version: 5.1792312714.72310e70 Release: 0 Summary: Test package for openQA License: GPL-2.0-or-later ++++++ openQA-worker-test.spec ++++++ --- /var/tmp/diff_new_pack.T9tFUM/_old 2026-10-18 19:26:12.640003383 +0200 +++ /var/tmp/diff_new_pack.T9tFUM/_new 2026-10-18 19:26:12.642003467 +0200 @@ -18,7 +18,7 @@ %define short_name openQA-worker Name: %{short_name}-test -Version: 5.1792169851.d54cd4e4 +Version: 5.1792312714.72310e70 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ openQA.spec ++++++ --- /var/tmp/diff_new_pack.T9tFUM/_old 2026-10-18 19:26:12.665004429 +0200 +++ /var/tmp/diff_new_pack.T9tFUM/_new 2026-10-18 19:26:12.667004513 +0200 @@ -104,7 +104,7 @@ %define devel_requires %devel_no_selenium_requires chromedriver Name: openQA -Version: 5.1792169851.d54cd4e4 +Version: 5.1792312714.72310e70 Release: 0 Summary: Framework for automated system-level testing (web-frontend, scheduler and tools) Group: Development/Tools/Other ++++++ node_modules.obscpio ++++++ Binary files old/nanoid-3.3.16.tgz and new/nanoid-3.3.16.tgz differ Binary files old/nanoid-3.3.20.tgz and new/nanoid-3.3.20.tgz differ Binary files old/robust-predicates-3.0.2.tgz and new/robust-predicates-3.0.2.tgz differ Binary files old/robust-predicates-3.0.3.tgz and new/robust-predicates-3.0.3.tgz differ Binary files old/stylelint-config-recommended-scss-17.0.0.tgz and new/stylelint-config-recommended-scss-17.0.0.tgz differ Binary files old/stylelint-config-recommended-scss-17.0.1.tgz and new/stylelint-config-recommended-scss-17.0.1.tgz differ ++++++ node_modules.spec.inc ++++++ --- /var/tmp/diff_new_pack.T9tFUM/_old 2026-10-18 19:26:13.260029336 +0200 +++ /var/tmp/diff_new_pack.T9tFUM/_new 2026-10-18 19:26:13.264029504 +0200 @@ -186,7 +186,7 @@ Source1185: https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz#/micromatch-4.0.8.tgz Source1186: https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz#/minimatch-10.2.4.tgz Source1187: https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#/ms-2.1.3.tgz -Source1188: https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz#/nanoid-3.3.16.tgz +Source1188: https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz#/nanoid-3.3.20.tgz Source1189: https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#/natural-compare-1.4.0.tgz Source1190: https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#/normalize-path-3.0.0.tgz Source1191: https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz#/optionator-0.9.4.tgz @@ -214,7 +214,7 @@ Source1213: https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz#/require-from-string-2.0.2.tgz Source1214: https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#/resolve-from-4.0.0.tgz Source1215: https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz#/reusify-1.1.0.tgz -Source1216: https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz#/robust-predicates-3.0.2.tgz +Source1216: https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz#/robust-predicates-3.0.3.tgz Source1217: https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz#/run-parallel-1.2.0.tgz Source1218: https://registry.npmjs.org/rw/-/rw-1.3.3.tgz#/rw-1.3.3.tgz Source1219: https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#/safer-buffer-2.1.2.tgz @@ -231,7 +231,7 @@ Source1230: https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz#/style-search-0.1.0.tgz Source1231: https://registry.npmjs.org/stylelint/-/stylelint-17.14.1.tgz#/stylelint-17.14.1.tgz Source1232: https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-18.0.0.tgz#/stylelint-config-recommended-18.0.0.tgz -Source1233: https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-17.0.0.tgz#/stylelint-config-recommended-scss-17.0.0.tgz +Source1233: https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-17.0.1.tgz#/stylelint-config-recommended-scss-17.0.1.tgz Source1234: https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-40.0.0.tgz#/stylelint-config-standard-40.0.0.tgz Source1235: https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-17.0.0.tgz#/stylelint-config-standard-scss-17.0.0.tgz Source1236: https://registry.npmjs.org/stylelint-prettier/-/stylelint-prettier-5.0.3.tgz#/stylelint-prettier-5.0.3.tgz ++++++ openQA-5.1792169851.d54cd4e4.obscpio -> openQA-5.1792312714.72310e70.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792169851.d54cd4e4/AGENTS.md new/openQA-5.1792312714.72310e70/AGENTS.md --- old/openQA-5.1792169851.d54cd4e4/AGENTS.md 2026-10-16 18:57:31.000000000 +0200 +++ new/openQA-5.1792312714.72310e70/AGENTS.md 2026-10-18 10:38:34.000000000 +0200 @@ -5,6 +5,8 @@ ## Build & Test Commands +- `make prepare-node-env`: Install Node.js/NPM development dependencies + locally (e.g. `prettier`, `eslint`). - `make tidy`: Must pass before committing (runs `perltidy` + `eslint/prettier`). - `make test-checkstyle`: Must pass before committing. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792169851.d54cd4e4/Makefile new/openQA-5.1792312714.72310e70/Makefile --- old/openQA-5.1792169851.d54cd4e4/Makefile 2026-10-16 18:57:31.000000000 +0200 +++ new/openQA-5.1792312714.72310e70/Makefile 2026-10-18 10:38:34.000000000 +0200 @@ -247,6 +247,11 @@ @command -v local-npm-registry >/dev/null 2>&1 || npm clean-install --no-audit --no-fund --ignore-scripts --omit=dev @touch node_modules +.PHONY: prepare-node-env +prepare-node-env: ## Install Node.js/NPM development dependencies locally (e.g. prettier, eslint) + @command -v npm >/dev/null 2>&1 || (echo "Command 'npm' not found, can not install node dependencies. Install Node.js and npm first (e.g. with 'zypper in nodejs-default' or your system package manager)" && false) + npm clean-install --no-audit --no-fund --ignore-scripts + .PHONY: test ifeq ($(CHECKSTYLE),0) checkstyle_tests = diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792169851.d54cd4e4/docs/Contributing.md new/openQA-5.1792312714.72310e70/docs/Contributing.md --- old/openQA-5.1792169851.d54cd4e4/docs/Contributing.md 2026-10-16 18:57:31.000000000 +0200 +++ new/openQA-5.1792312714.72310e70/docs/Contributing.md 2026-10-18 10:38:34.000000000 +0200 @@ -50,7 +50,8 @@ make tidy ``` This ensures your Perl, JavaScript and Python code changes are consistent with - the style rules. + the style rules (see [JavaScript and CSS](Contributing.md#javascript-and-css) + for installing Node.js tooling like `prettier`). - All tests are passed. This is ensured by a CI system. You can also run local tests in your development environment to verify everything works as expected, see [Conducting tests](Contributing.md#conducting-tests)) @@ -714,6 +715,15 @@ common/existing licenses; extend the `Files:`-section at the beginning of those files instead. +Development tooling such as `prettier`, `eslint`, and `stylelint` is defined in +`devDependencies` in `package.json`. While `make node_modules` only installs +runtime dependencies (omitting development dependencies), you can install the +development tooling locally with: + +```sh +make prepare-node-env +``` + ### Perl and other packages In openQA, there is a `dependencies.yaml` file including a list of @@ -1120,9 +1130,33 @@ And if you need code examples, there are some plugins [included with openQA](https://github.com/os-autoinst/openQA/tree/master/lib/OpenQA/WebAPI/Plugin). -## Checking for JavaScript problems +## Checking and formatting JavaScript, CSS and Markdown -One can use the tool `jshint` to check for problems within JavaScript code. It can be installed easily via `npm`. +After installing development dependencies (see +[JavaScript and CSS](Contributing.md#javascript-and-css)), you can check +JavaScript, stylesheets, and Markdown documentation for errors and style +violations: + +```sh +npm run lint +``` + +Or run individual tools directly using `npx`: + +```sh +npx prettier --check "docs/**/*.md" +npx eslint "assets/javascripts/**/*.js" +``` + +To automatically fix formatting issues, run: + +```sh +make tidy-js +# or: +npm run fix +``` + +One can also use the tool `jshint` to check for problems within JavaScript code. It can be installed easily via `npm`. ```sh npm install --no-save --ignore-scripts jshint @@ -1144,6 +1178,10 @@ ## Making documentation changes +Markdown documentation files in `docs/` are formatted and checked using `prettier` +(see [JavaScript and CSS](Contributing.md#javascript-and-css)). You can check or +format them using `npx prettier --check "docs/**/*.md"` or `make tidy-js`. + After changing documentation, consider generating documentation locally to verify it is rendered correctly using `tools/generate-docs`. It is possible to do that inside the provided development container by invoking: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792169851.d54cd4e4/lib/OpenQA/Worker.pm new/openQA-5.1792312714.72310e70/lib/OpenQA/Worker.pm --- old/openQA-5.1792169851.d54cd4e4/lib/OpenQA/Worker.pm 2026-10-16 18:57:31.000000000 +0200 +++ new/openQA-5.1792312714.72310e70/lib/OpenQA/Worker.pm 2026-10-18 10:38:34.000000000 +0200 @@ -692,19 +692,36 @@ return undef; } -sub is_ovs_dbus_service_running ($self) { +sub ovs_dbus_service_error ($self) { + my $name = $self->{_ovs_dbus_service_name}; try { defined &Net::DBus::system or require Net::DBus } - catch ($e) { return 0 } # uncoverable statement - unless (defined $self->{_system_dbus}) { + catch ($e) { return 'Perl module "Net::DBus" is not available' } # uncoverable statement + if (!defined $self->{_system_dbus}) { my $dbus; try { $dbus = Net::DBus->system(nomainloop => 1) } - catch ($e) { return 0 } # uncoverable statement + catch ($e) { return 'Unable to connect to system D-Bus' } # uncoverable statement $self->{_system_dbus} = $dbus; # this avoids piling up signals we never do anything with - POO #183833 $self->{_system_dbus}->get_bus_object->disconnect_from_signal('NameOwnerChanged', 1); } - try { return defined $self->{_system_dbus}->get_service('org.opensuse.os_autoinst.switch') } - catch ($e) { return 0 } + try { + my $ovs = $self->{_system_dbus}->get_service($name); + return "D-Bus service '$name' is not running" unless defined $ovs; + return undef if $self->current_job || $self->has_pending_jobs; # do not interfere with running jobs + my $switch = $ovs->get_object('/switch', $name); + return "D-Bus method '$name/switch' is not available" unless defined $switch; + # check whether VLAN assignments work for required tap devices + my $settings = $self->settings->global_settings; + my @devices = split /,/, $settings->{REQUIRED_TAP_DEVS} // ('tap' . $self->instance_number); + for my $device (@devices) { + my ($res, $msg) = $switch->set_vlan($device, 1); # test set_vlan + return $msg if $res != 0; # return e.g. "'tap1' is not connected to 'br1'" in case of improper setup + ($res, $msg) = $switch->unset_vlan($device, 1); # clean temporarily VLAN assignment up + return $msg if $res != 0; + } + return undef; + } + catch ($e) { return "Unable to query D-Bus service '$name': $e" } } # returns whether the worker is available and a reason @@ -737,8 +754,9 @@ return (1, 'Unable to determine worker address (WORKER_HOSTNAME)') unless $settings->auto_detect_worker_address; # check org.opensuse.os_autoinst.switch if it is a MM-capable worker slot - return (1, "D-Bus service '$self->{_ovs_dbus_service_name}' is not running") - if $settings->has_class('tap') && !$self->is_ovs_dbus_service_running; + if (my $ovs_error = $settings->has_class('tap') ? $self->ovs_dbus_service_error : '') { + return (1, $ovs_error); + } # continue with enqueued jobs in any case but avoid picking up new jobs if system utilization is critical if (my $system_utilization_error = $self->_check_system_utilization) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792169851.d54cd4e4/package-lock.json new/openQA-5.1792312714.72310e70/package-lock.json --- old/openQA-5.1792169851.d54cd4e4/package-lock.json 2026-10-16 18:57:31.000000000 +0200 +++ new/openQA-5.1792312714.72310e70/package-lock.json 2026-10-18 10:38:34.000000000 +0200 @@ -2351,9 +2351,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", "dev": true, "funding": [ { @@ -2748,9 +2748,9 @@ } }, "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", "license": "Unlicense" }, "node_modules/run-parallel": { @@ -2990,9 +2990,9 @@ } }, "node_modules/stylelint-config-recommended-scss": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-17.0.0.tgz", - "integrity": "sha512-VkVD9r7jfUT/dq3mA3/I1WXXk2U71rO5wvU2yIil9PW5o1g3UM7Xc82vHmuVJHV7Y8ok5K137fmW5u3HbhtTOA==", + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-17.0.1.tgz", + "integrity": "sha512-x5DVehzJudcwF0od3sGpgkln2PLLranFE7twwbp7dqDINCyZvwzFkMc6TLhNOvazRiVBJYATQLouJY0xPGB8WA==", "dev": true, "license": "MIT", "dependencies": { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openQA-5.1792169851.d54cd4e4/t/24-worker-overall.t new/openQA-5.1792312714.72310e70/t/24-worker-overall.t --- old/openQA-5.1792169851.d54cd4e4/t/24-worker-overall.t 2026-10-16 18:57:31.000000000 +0200 +++ new/openQA-5.1792312714.72310e70/t/24-worker-overall.t 2026-10-18 10:38:34.000000000 +0200 @@ -88,6 +88,26 @@ has availability_error => 'Cache service info error: Connection refused'; } # uncoverable statement +package Test::FakeDBusSwitch { + use Mojo::Base -base, -signatures; + has set_vlan_result => sub { [0, ''] }; + has unset_vlan_result => sub { [0, ''] }; + + sub set_vlan ($self, $dev, $tag) { + ref $self->set_vlan_result eq 'CODE' ? $self->set_vlan_result->($dev, $tag) : @{$self->set_vlan_result}; + } + + sub unset_vlan ($self, $dev, $tag) { + ref $self->unset_vlan_result eq 'CODE' ? $self->unset_vlan_result->($dev, $tag) : @{$self->unset_vlan_result}; + } +} # uncoverable statement + +package Test::FakeDBusService { + use Mojo::Base -base, -signatures; + has mock_switch => sub { Test::FakeDBusSwitch->new }; + sub get_object ($self, $path, $name = undef) { $self->mock_switch } +} # uncoverable statement + package Test::FakeDBusObject { use Mojo::Base -base, -signatures; sub disconnect_from_signal ($self, $signal, $id) { } @@ -95,8 +115,12 @@ package Test::FakeDBus { use Mojo::Base -base, -signatures; - has mock_service_value => 1; - sub get_service ($self, $service_name) { $self->mock_service_value } + has mock_service_value => sub { Test::FakeDBusService->new }; + + sub get_service ($self, $service_name) { + my $val = $self->mock_service_value; + return ref $val eq 'CODE' ? $val->($service_name) : $val; + } sub get_bus_object ($self) { Test::FakeDBusObject->new } } # uncoverable statement @@ -660,13 +684,68 @@ 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 'check VLAN assignments via the Open vSwitch D-Bus service' => sub { + subtest 'service is unavailable' => sub { + my $mock_net_dbus = Test::MockObject->new; + $worker->{_system_dbus} = $mock_net_dbus; + $mock_net_dbus->mock(get_service => sub { die "Fake error\n" }); + like $worker->ovs_dbus_service_error, qr/Unable.*D-Bus.*Fake error/, + 'OvS D-Bus service failed on failing get_service'; + $mock_net_dbus->mock(get_service => sub { undef }); + is $worker->ovs_dbus_service_error, "D-Bus service 'org.opensuse.os_autoinst.switch' is not running", + 'OvS D-Bus service failed on missing service'; + }; + + subtest 'system D-Bus initialization when not yet defined' => sub { + undef $worker->{_system_dbus}; + $dbus_mock->redefine(system => sub { die "Connection refused\n" }); + is $worker->ovs_dbus_service_error, 'Unable to connect to system D-Bus', + 'error when connecting to system D-Bus fails'; + $dbus_mock->redefine(system => sub (@) { Test::FakeDBus->new }); + is $worker->ovs_dbus_service_error, undef, 'OvS D-Bus service passed with working D-Bus and switch'; + ok defined $worker->{_system_dbus}, 'system D-Bus initialized'; + }; + + subtest 'does not interfere with running or pending jobs' => sub { + my $fake_client = Test::FakeClient->new; + my $fake_job = OpenQA::Worker::Job->new($worker, $fake_client, {id => 42}); + $worker->current_job($fake_job); + is $worker->ovs_dbus_service_error, undef, + 'returns undef without checking switch when job is currently running'; + $worker->current_job(undef); + $worker->{_queue} = {pending_jobs => [42]}; + is $worker->ovs_dbus_service_error, undef, 'returns undef without checking switch when jobs are pending'; + $worker->{_queue} = undef; + }; + + my $fake_service = Test::FakeDBusService->new(mock_switch => undef); + subtest 'switch object missing' => sub { + $worker->{_system_dbus}->mock_service_value($fake_service); + is $worker->ovs_dbus_service_error, "D-Bus method 'org.opensuse.os_autoinst.switch/switch' is not available", + 'returns error if switch object not available'; + }; + + my $fake_switch = Test::FakeDBusSwitch->new(set_vlan_result => [1, "'tap1' is not connected to 'br1'"]); + subtest 'set_vlan failure' => sub { + $fake_service->mock_switch($fake_switch); + is $worker->ovs_dbus_service_error, "'tap1' is not connected to 'br1'", 'returns error if set_vlan fails'; + }; + + subtest 'unset_vlan failure' => sub { + $fake_switch->set_vlan_result([0, '']); + $fake_switch->unset_vlan_result([1, "'tap1' could not be unset"]); + is $worker->ovs_dbus_service_error, "'tap1' could not be unset", 'returns error if unset_vlan fails'; + }; + + subtest 'custom REQUIRED_TAP_DEVS' => sub { + $fake_switch->unset_vlan_result([0, '']); + my @checked_devices; + $fake_switch->set_vlan_result(sub ($dev, $tag) { push @checked_devices, $dev; return (0, '') }); + $worker->settings->global_settings->{REQUIRED_TAP_DEVS} = 'tap10,tap11'; + is $worker->ovs_dbus_service_error, undef, 'succeeds with custom REQUIRED_TAP_DEVS'; + is_deeply \@checked_devices, ['tap10', 'tap11'], 'tested specified required tap devices'; + delete $worker->settings->global_settings->{REQUIRED_TAP_DEVS}; + }; }; ++++++ openQA.obsinfo ++++++ --- /var/tmp/diff_new_pack.T9tFUM/_old 2026-10-18 19:26:25.594545638 +0200 +++ /var/tmp/diff_new_pack.T9tFUM/_new 2026-10-18 19:26:25.598545805 +0200 @@ -1,5 +1,5 @@ name: openQA -version: 5.1792169851.d54cd4e4 -mtime: 1792169851 -commit: d54cd4e47a8a3eb4b40ca1bba954b13daa295bc2 +version: 5.1792312714.72310e70 +mtime: 1792312714 +commit: 72310e703d70af8d354ed5a2dd79ebe963790455
