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
 

Reply via email to