Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package talhelper for openSUSE:Factory 
checked in at 2026-01-17 14:53:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/talhelper (Old)
 and      /work/SRC/openSUSE:Factory/.talhelper.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "talhelper"

Sat Jan 17 14:53:36 2026 rev:37 rq:1327530 version:3.1.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/talhelper/talhelper.changes      2026-01-14 
16:23:01.416779010 +0100
+++ /work/SRC/openSUSE:Factory/.talhelper.new.1928/talhelper.changes    
2026-01-17 14:54:27.394439871 +0100
@@ -1,0 +2,12 @@
+Fri Jan 16 06:14:44 UTC 2026 - Johannes Kastl 
<[email protected]>
+
+- Update to version 3.1.1:
+  * add common function for buildingRoutes
+  * chore(schema): update talos-extensions.yaml JSON schema (#1381)
+  * chore(schema): update talos-extensions.yaml JSON schema (#1379)
+  * fix(deps): update module github.com/budimanjojo/talhelper/v3 to
+    v3.1.0
+  * feat: update Scoop for talhelper version v3.1.0
+  * feat: update flake (#1377)
+
+-------------------------------------------------------------------

Old:
----
  talhelper-3.1.0.obscpio

New:
----
  talhelper-3.1.1.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ talhelper.spec ++++++
--- /var/tmp/diff_new_pack.4OJV8P/_old  2026-01-17 14:54:28.842500237 +0100
+++ /var/tmp/diff_new_pack.4OJV8P/_new  2026-01-17 14:54:28.850500570 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           talhelper
-Version:        3.1.0
+Version:        3.1.1
 Release:        0
 Summary:        Tool to help creating Talos kubernetes cluster
 License:        BSD-3-Clause

++++++ _service ++++++
--- /var/tmp/diff_new_pack.4OJV8P/_old  2026-01-17 14:54:28.898502571 +0100
+++ /var/tmp/diff_new_pack.4OJV8P/_new  2026-01-17 14:54:28.898502571 +0100
@@ -3,7 +3,7 @@
     <param name="url">https://github.com/budimanjojo/talhelper</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="revision">v3.1.0</param>
+    <param name="revision">v3.1.1</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)</param>
     <param name="changesgenerate">enable</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.4OJV8P/_old  2026-01-17 14:54:28.954504906 +0100
+++ /var/tmp/diff_new_pack.4OJV8P/_new  2026-01-17 14:54:28.958505073 +0100
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://github.com/budimanjojo/talhelper</param>
-              <param 
name="changesrevision">51f737124d27d43082622188120bd5b86158c4b9</param></service></servicedata>
+              <param 
name="changesrevision">074dc70ec0cc4c9690e62798802ff14fb37e29f8</param></service></servicedata>
 (No newline at EOF)
 

++++++ talhelper-3.1.0.obscpio -> talhelper-3.1.1.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/talhelper-3.1.0/default.nix 
new/talhelper-3.1.1/default.nix
--- old/talhelper-3.1.0/default.nix     2026-01-13 08:04:42.000000000 +0100
+++ new/talhelper-3.1.1/default.nix     2026-01-15 17:32:49.000000000 +0100
@@ -8,16 +8,16 @@
 
 buildGo125Module rec {
   pname = "talhelper";
-  version = "3.0.45";
+  version = "3.1.0";
 
   src = fetchFromGitHub {
     owner = "budimanjojo";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-9oZM6vIyJH8Vw/QhE9SIbrMa4r2LCZdIDRFztFYVVk0=";
+    sha256 = "sha256-pvJQ6l/Zh5TpGiWe3SXWsUOwFK5WUoGTu76MPyZcXRo=";
   };
 
-  vendorHash = "sha256-jn5zwEvFqasjQt6FTQpcX8qJ11lM03aMhGyapOOjclA=";
+  vendorHash = "sha256-AkCUKg5oA2XvvDtE0m9fQdeqowx5A1SnnimF7F/CORg=";
 
   ldflags = [ "-s -w -X 
github.com/budimanjojo/talhelper/v3/cmd.version=v${version}" ];
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/talhelper-3.1.0/hack/tsehelper/go.mod 
new/talhelper-3.1.1/hack/tsehelper/go.mod
--- old/talhelper-3.1.0/hack/tsehelper/go.mod   2026-01-13 08:04:42.000000000 
+0100
+++ new/talhelper-3.1.1/hack/tsehelper/go.mod   2026-01-15 17:32:49.000000000 
+0100
@@ -1,9 +1,9 @@
 module tsehelper
 
-go 1.25.4
+go 1.25.5
 
 require (
-       github.com/budimanjojo/talhelper/v3 v3.0.45
+       github.com/budimanjojo/talhelper/v3 v3.1.0
        github.com/google/go-containerregistry v0.20.7
        github.com/sirupsen/logrus v1.9.4-0.20251023124752-b61f268f75b6
        gopkg.in/yaml.v3 v3.0.1
@@ -23,7 +23,7 @@
        github.com/pkg/errors v0.9.1 // indirect
        github.com/stretchr/testify v1.10.0 // indirect
        github.com/vbatts/tar-split v0.12.2 // indirect
-       golang.org/x/mod v0.31.0 // indirect
-       golang.org/x/sync v0.18.0 // indirect
-       golang.org/x/sys v0.38.0 // indirect
+       golang.org/x/mod v0.32.0 // indirect
+       golang.org/x/sync v0.19.0 // indirect
+       golang.org/x/sys v0.39.0 // indirect
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/talhelper-3.1.0/hack/tsehelper/go.sum 
new/talhelper-3.1.1/hack/tsehelper/go.sum
--- old/talhelper-3.1.0/hack/tsehelper/go.sum   2026-01-13 08:04:42.000000000 
+0100
+++ new/talhelper-3.1.1/hack/tsehelper/go.sum   2026-01-15 17:32:49.000000000 
+0100
@@ -84,6 +84,8 @@
 github.com/budimanjojo/talhelper/v3 v3.0.44/go.mod 
h1:Q7nx013ejd41oJXTkujkViwszT6cRo+wvAZHYYh/9J8=
 github.com/budimanjojo/talhelper/v3 v3.0.45 
h1:ClbhSD2MZ2J7Weppakizq8yy5GBMLhWgxxJzdYkQBZ8=
 github.com/budimanjojo/talhelper/v3 v3.0.45/go.mod 
h1:Q7nx013ejd41oJXTkujkViwszT6cRo+wvAZHYYh/9J8=
+github.com/budimanjojo/talhelper/v3 v3.1.0 
h1:0YDjgySRg3SeFFfm7w3ZlJ2DToNWN673x/GONtyd71M=
+github.com/budimanjojo/talhelper/v3 v3.1.0/go.mod 
h1:0LjuZyGUQKRY6TGB0Py9sxFrKbFekdYinnwKLY/osvk=
 github.com/containerd/stargz-snapshotter/estargz v0.15.1 
h1:eXJjw9RbkLFgioVaTG+G/ZW/0kEe2oEKCdS/ZxIyoCU=
 github.com/containerd/stargz-snapshotter/estargz v0.15.1/go.mod 
h1:gr2RNwukQ/S9Nv33Lt6UC7xEx58C+LHRdoqbEKjz1Kk=
 github.com/containerd/stargz-snapshotter/estargz v0.16.3 
h1:7evrXtoh1mSbGj/pfRccTampEyKpjpOnS3CyiV1Ebr8=
@@ -217,6 +219,8 @@
 golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc=
 golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI=
 golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg=
+golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
+golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
 golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
 golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
@@ -237,6 +241,8 @@
 golang.org/x/sync v0.17.0/go.mod 
h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
 golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
 golang.org/x/sync v0.18.0/go.mod 
h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
+golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
+golang.org/x/sync v0.19.0/go.mod 
h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
 golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
@@ -266,6 +272,8 @@
 golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
 golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
 golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
+golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
+golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c 
h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod 
h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/talhelper-3.1.0/pkg/config/schemas/talos-extensions.json 
new/talhelper-3.1.1/pkg/config/schemas/talos-extensions.json
--- old/talhelper-3.1.0/pkg/config/schemas/talos-extensions.json        
2026-01-13 08:04:42.000000000 +0100
+++ new/talhelper-3.1.1/pkg/config/schemas/talos-extensions.json        
2026-01-15 17:32:49.000000000 +0100
@@ -38827,6 +38827,176 @@
                     "digest": 
"sha256:4d3cf4882cb1dc37afd125ea27d0cc3f64767748ea81213c9c6f04bea5e68d5a"
                 }
             ]
+        },
+        {
+            "version": "v1.13.0-alpha.0-1-g9f80dff",
+            "systemExtensions": [
+                "siderolabs/amazon-ena",
+                "siderolabs/amdgpu",
+                "siderolabs/amd-ucode",
+                "siderolabs/binfmt-misc",
+                "siderolabs/bird2",
+                "siderolabs/bnx2-bnx2x",
+                "siderolabs/btrfs",
+                "siderolabs/chelsio-drivers",
+                "siderolabs/chelsio-firmware",
+                "siderolabs/cloudflared",
+                "siderolabs/crun",
+                "siderolabs/ctr",
+                "siderolabs/drbd",
+                "siderolabs/dvb-cx23885",
+                "siderolabs/dvb-m88ds3103",
+                "siderolabs/ecr-credential-provider",
+                "siderolabs/fuse3",
+                "siderolabs/gasket-driver",
+                "siderolabs/gpio-pinctrl",
+                "siderolabs/glibc",
+                "siderolabs/gvisor",
+                "siderolabs/gvisor-debug",
+                "siderolabs/hailort",
+                "siderolabs/hello-world-service",
+                "siderolabs/i915",
+                "siderolabs/intel-ice-firmware",
+                "siderolabs/intel-ucode",
+                "siderolabs/iscsi-tools",
+                "siderolabs/kata-containers",
+                "siderolabs/lldpd",
+                "siderolabs/mdadm",
+                "siderolabs/mei",
+                "siderolabs/mellanox-mstflint",
+                "siderolabs/metal-agent",
+                "siderolabs/multipath-tools",
+                "siderolabs/nebula",
+                "siderolabs/netbird",
+                "siderolabs/newt",
+                "siderolabs/nfs-utils",
+                "siderolabs/nfsd",
+                "siderolabs/nfsrahead",
+                "siderolabs/nut-client",
+                "siderolabs/nvidia-container-toolkit-lts",
+                "siderolabs/nvidia-container-toolkit-production",
+                "siderolabs/nvidia-fabricmanager-lts",
+                "siderolabs/nvidia-fabricmanager-production",
+                "siderolabs/nvidia-gdrdrv-device",
+                "siderolabs/nvidia-open-gpu-kernel-modules-lts",
+                "siderolabs/nvidia-open-gpu-kernel-modules-production",
+                "siderolabs/nvme-cli",
+                "siderolabs/soci-snapshotter",
+                "siderolabs/panfrost",
+                "siderolabs/qemu-guest-agent",
+                "siderolabs/qlogic-firmware",
+                "siderolabs/realtek-firmware",
+                "siderolabs/revpi-firmware",
+                "siderolabs/rockchip-rknn",
+                "siderolabs/spin",
+                "siderolabs/stargz-snapshotter",
+                "siderolabs/tailscale",
+                "siderolabs/tenstorrent",
+                "siderolabs/thunderbolt",
+                "siderolabs/trident-iscsi-tools",
+                "siderolabs/uinput",
+                "siderolabs/usb-modem-drivers",
+                "siderolabs/usb-audio-drivers",
+                "siderolabs/util-linux-tools",
+                "siderolabs/v4l-uvc-drivers",
+                "siderolabs/vc4",
+                "siderolabs/vmtoolsd-guest-agent",
+                "siderolabs/wasmedge",
+                "siderolabs/xdma-driver",
+                "siderolabs/xe",
+                "siderolabs/xen-guest-agent",
+                "siderolabs/youki",
+                "siderolabs/zerotier",
+                "siderolabs/zfs",
+                "siderolabs/nonfree-kmod-nvidia-lts",
+                "siderolabs/nonfree-kmod-nvidia-production"
+            ],
+            "overlays": null
+        },
+        {
+            "version": "v1.13.0-alpha.0-2-ga265b08",
+            "systemExtensions": [
+                "siderolabs/amazon-ena",
+                "siderolabs/amdgpu",
+                "siderolabs/amd-ucode",
+                "siderolabs/binfmt-misc",
+                "siderolabs/bird2",
+                "siderolabs/bnx2-bnx2x",
+                "siderolabs/btrfs",
+                "siderolabs/chelsio-drivers",
+                "siderolabs/chelsio-firmware",
+                "siderolabs/cloudflared",
+                "siderolabs/crun",
+                "siderolabs/ctr",
+                "siderolabs/drbd",
+                "siderolabs/dvb-cx23885",
+                "siderolabs/dvb-m88ds3103",
+                "siderolabs/ecr-credential-provider",
+                "siderolabs/fuse3",
+                "siderolabs/gasket-driver",
+                "siderolabs/gpio-pinctrl",
+                "siderolabs/glibc",
+                "siderolabs/gvisor",
+                "siderolabs/gvisor-debug",
+                "siderolabs/hailort",
+                "siderolabs/hello-world-service",
+                "siderolabs/i915",
+                "siderolabs/intel-ice-firmware",
+                "siderolabs/intel-ucode",
+                "siderolabs/iscsi-tools",
+                "siderolabs/kata-containers",
+                "siderolabs/lldpd",
+                "siderolabs/mdadm",
+                "siderolabs/mei",
+                "siderolabs/mellanox-mstflint",
+                "siderolabs/metal-agent",
+                "siderolabs/multipath-tools",
+                "siderolabs/nebula",
+                "siderolabs/netbird",
+                "siderolabs/newt",
+                "siderolabs/nfs-utils",
+                "siderolabs/nfsd",
+                "siderolabs/nfsrahead",
+                "siderolabs/nut-client",
+                "siderolabs/nvidia-container-toolkit-lts",
+                "siderolabs/nvidia-container-toolkit-production",
+                "siderolabs/nvidia-fabricmanager-lts",
+                "siderolabs/nvidia-fabricmanager-production",
+                "siderolabs/nvidia-gdrdrv-device",
+                "siderolabs/nvidia-open-gpu-kernel-modules-lts",
+                "siderolabs/nvidia-open-gpu-kernel-modules-production",
+                "siderolabs/nvme-cli",
+                "siderolabs/soci-snapshotter",
+                "siderolabs/panfrost",
+                "siderolabs/qemu-guest-agent",
+                "siderolabs/qlogic-firmware",
+                "siderolabs/realtek-firmware",
+                "siderolabs/revpi-firmware",
+                "siderolabs/rockchip-rknn",
+                "siderolabs/spin",
+                "siderolabs/stargz-snapshotter",
+                "siderolabs/tailscale",
+                "siderolabs/tenstorrent",
+                "siderolabs/thunderbolt",
+                "siderolabs/trident-iscsi-tools",
+                "siderolabs/uinput",
+                "siderolabs/usb-modem-drivers",
+                "siderolabs/usb-audio-drivers",
+                "siderolabs/util-linux-tools",
+                "siderolabs/v4l-uvc-drivers",
+                "siderolabs/vc4",
+                "siderolabs/vmtoolsd-guest-agent",
+                "siderolabs/wasmedge",
+                "siderolabs/xdma-driver",
+                "siderolabs/xe",
+                "siderolabs/xen-guest-agent",
+                "siderolabs/youki",
+                "siderolabs/zerotier",
+                "siderolabs/zfs",
+                "siderolabs/nonfree-kmod-nvidia-lts",
+                "siderolabs/nonfree-kmod-nvidia-production"
+            ],
+            "overlays": null
         }
     ]
 }
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/talhelper-3.1.0/pkg/talos/networkconfig.go 
new/talhelper-3.1.1/pkg/talos/networkconfig.go
--- old/talhelper-3.1.0/pkg/talos/networkconfig.go      2026-01-13 
08:04:42.000000000 +0100
+++ new/talhelper-3.1.1/pkg/talos/networkconfig.go      2026-01-15 
17:32:49.000000000 +0100
@@ -677,48 +677,11 @@
        }
 
        for _, route := range device.DeviceRoutes {
-               routeConfig := network.RouteConfig{}
-
-               networkStr := route.Network()
-               if networkStr == "" {
-                       continue
-               }
-
-               prefix, err := netip.ParsePrefix(networkStr)
+               routeConfig, err := buildRouteConfig(route)
                if err != nil {
                        continue
                }
-
-               // For default routes (0.0.0.0/0 or ::/0), omit the destination 
field
-               // and let Talos infer it from the gateway's address family
-               isDefaultRoute := (prefix.String() == "0.0.0.0/0" || 
prefix.String() == "::/0")
-               if !isDefaultRoute {
-                       routeConfig.RouteDestination = network.Prefix{Prefix: 
prefix}
-               }
-
-               if route.Gateway() != "" {
-                       gateway, err := netip.ParseAddr(route.Gateway())
-                       if err == nil {
-                               routeConfig.RouteGateway = network.Addr{Addr: 
gateway}
-                       }
-               }
-
-               if route.Source() != "" {
-                       source, err := netip.ParseAddr(route.Source())
-                       if err == nil {
-                               routeConfig.RouteSource = network.Addr{Addr: 
source}
-                       }
-               }
-
-               if route.Metric() > 0 {
-                       routeConfig.RouteMetric = route.Metric()
-               }
-
-               if route.MTU() > 0 {
-                       routeConfig.RouteMTU = route.MTU()
-               }
-
-               linkConfig.LinkRoutes = append(linkConfig.LinkRoutes, 
routeConfig)
+               linkConfig.LinkRoutes = append(linkConfig.LinkRoutes, 
*routeConfig)
        }
 
        if device.DeviceMTU > 0 {
@@ -763,8 +726,8 @@
                return nil
        }
 
-       vlanInterface := device.DeviceInterface
        if vlan.VlanID > 0 {
+               vlanInterface := fmt.Sprintf("%s.%d", device.DeviceInterface, 
vlan.VlanID)
                vlanConfig := network.NewVLANConfigV1Alpha1(vlanInterface)
                vlanConfig.VLANIDConfig = vlan.VlanID
                vlanConfig.ParentLinkConfig = device.DeviceInterface
@@ -791,41 +754,11 @@
 
                if len(vlan.VlanRoutes) > 0 {
                        for _, route := range vlan.VlanRoutes {
-                               routeSpec := network.RouteConfig{}
-
-                               if route.Network() != "" {
-                                       prefix, err := 
netip.ParsePrefix(route.Network())
-                                       if err != nil {
-                                               continue
-                                       }
-                                       routeSpec.RouteDestination = 
network.Prefix{Prefix: prefix}
-                               } else {
+                               routeConfig, err := buildRouteConfig(route)
+                               if err != nil {
                                        continue
                                }
-
-                               if route.Gateway() != "" {
-                                       gateway, err := 
netip.ParseAddr(route.Gateway())
-                                       if err == nil {
-                                               routeSpec.RouteGateway = 
network.Addr{Addr: gateway}
-                                       }
-                               }
-
-                               if route.Source() != "" {
-                                       source, err := 
netip.ParseAddr(route.Source())
-                                       if err == nil {
-                                               routeSpec.RouteSource = 
network.Addr{Addr: source}
-                                       }
-                               }
-
-                               if route.Metric() > 0 {
-                                       routeSpec.RouteMetric = route.Metric()
-                               }
-
-                               if route.MTU() > 0 {
-                                       routeSpec.RouteMTU = route.MTU()
-                               }
-
-                               vlanConfig.LinkRoutes = 
append(vlanConfig.LinkRoutes, routeSpec)
+                               vlanConfig.LinkRoutes = 
append(vlanConfig.LinkRoutes, *routeConfig)
                        }
                }
 
@@ -981,6 +914,57 @@
                device.DeviceWireguardConfig != nil || device.DeviceBridge != 
nil
 }
 
+func buildRouteConfig(route interface {
+       Network() string
+       Gateway() string
+       Source() string
+       Metric() uint32
+       MTU() uint32
+}) (*network.RouteConfig, error) {
+       networkStr := route.Network()
+       if networkStr == "" {
+               return nil, fmt.Errorf("route network is empty")
+       }
+
+       prefix, err := netip.ParsePrefix(networkStr)
+       if err != nil {
+               return nil, fmt.Errorf("invalid network prefix: %w", err)
+       }
+
+       routeConfig := &network.RouteConfig{}
+
+       // For default routes (0.0.0.0/0 or ::/0), omit the destination field
+       // and let Talos infer it from the gateway's address family
+       isDefaultRoute := (prefix.String() == "0.0.0.0/0" || prefix.String() == 
"::/0")
+       if !isDefaultRoute {
+               routeConfig.RouteDestination = network.Prefix{Prefix: prefix}
+       }
+
+       if route.Gateway() != "" {
+               gateway, err := netip.ParseAddr(route.Gateway())
+               if err == nil {
+                       routeConfig.RouteGateway = network.Addr{Addr: gateway}
+               }
+       }
+
+       if route.Source() != "" {
+               source, err := netip.ParseAddr(route.Source())
+               if err == nil {
+                       routeConfig.RouteSource = network.Addr{Addr: source}
+               }
+       }
+
+       if route.Metric() > 0 {
+               routeConfig.RouteMetric = route.Metric()
+       }
+
+       if route.MTU() > 0 {
+               routeConfig.RouteMTU = route.MTU()
+       }
+
+       return routeConfig, nil
+}
+
 func addCommonLinkConfig(linkConfig *network.CommonLinkConfig, device 
*v1alpha1.Device) {
        if device == nil || linkConfig == nil {
                return
@@ -1006,48 +990,11 @@
        }
 
        for _, route := range device.DeviceRoutes {
-               routeConfig := network.RouteConfig{}
-
-               networkStr := route.Network()
-               if networkStr == "" {
-                       continue
-               }
-
-               prefix, err := netip.ParsePrefix(networkStr)
+               routeConfig, err := buildRouteConfig(route)
                if err != nil {
                        continue
                }
-
-               // For default routes (0.0.0.0/0 or ::/0), omit the destination 
field
-               // and let Talos infer it from the gateway's address family
-               isDefaultRoute := (prefix.String() == "0.0.0.0/0" || 
prefix.String() == "::/0")
-               if !isDefaultRoute {
-                       routeConfig.RouteDestination = network.Prefix{Prefix: 
prefix}
-               }
-
-               if route.Gateway() != "" {
-                       gateway, err := netip.ParseAddr(route.Gateway())
-                       if err == nil {
-                               routeConfig.RouteGateway = network.Addr{Addr: 
gateway}
-                       }
-               }
-
-               if route.Source() != "" {
-                       source, err := netip.ParseAddr(route.Source())
-                       if err == nil {
-                               routeConfig.RouteSource = network.Addr{Addr: 
source}
-                       }
-               }
-
-               if route.Metric() > 0 {
-                       routeConfig.RouteMetric = route.Metric()
-               }
-
-               if route.MTU() > 0 {
-                       routeConfig.RouteMTU = route.MTU()
-               }
-
-               linkConfig.LinkRoutes = append(linkConfig.LinkRoutes, 
routeConfig)
+               linkConfig.LinkRoutes = append(linkConfig.LinkRoutes, 
*routeConfig)
        }
 
        if device.DeviceMTU > 0 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/talhelper-3.1.0/pkg/talos/networkconfig_test.go 
new/talhelper-3.1.1/pkg/talos/networkconfig_test.go
--- old/talhelper-3.1.0/pkg/talos/networkconfig_test.go 2026-01-13 
08:04:42.000000000 +0100
+++ new/talhelper-3.1.1/pkg/talos/networkconfig_test.go 2026-01-15 
17:32:49.000000000 +0100
@@ -664,8 +664,8 @@
                t.Fatal("expected VLAN config, got nil")
        }
 
-       if result.MetaName != "eth0" {
-               t.Errorf("expected name=eth0, got %s", result.MetaName)
+       if result.MetaName != "eth0.100" {
+               t.Errorf("expected name=eth0.100, got %s", result.MetaName)
        }
 
        if result.VLANIDConfig != 100 {
@@ -722,8 +722,8 @@
        if !bytes.Contains(vlanBytes, []byte("kind: VLANConfig")) {
                t.Error("expected output to contain 'kind: VLANConfig'")
        }
-       if !bytes.Contains(vlanBytes, []byte("name: eth0")) {
-               t.Error("expected output to contain 'name: eth0'")
+       if !bytes.Contains(vlanBytes, []byte("name: eth0.100")) {
+               t.Error("expected output to contain 'name: eth0.100'")
        }
        if !bytes.Contains(vlanBytes, []byte("vlanID: 100")) {
                t.Error("expected output to contain 'vlanID: 100'")
@@ -734,6 +734,107 @@
        t.Logf("VLAN config output:\n%s", vlanStr)
 }
 
+func TestGenerateVLANConfigMultipleVLANs(t *testing.T) {
+       data := []byte(`nodes:
+  - hostname: node1
+    networkInterfaces:
+      - interface: eth0
+        vlans:
+          - vlanId: 100
+            addresses:
+              - 192.168.100.1/24
+          - vlanId: 200
+            addresses:
+              - 192.168.200.1/24
+          - vlanId: 300
+            addresses:
+              - 192.168.300.1/24`)
+
+       var m config.TalhelperConfig
+       if err := yaml.Unmarshal(data, &m); err != nil {
+               t.Fatal(err)
+       }
+
+       vlans := m.Nodes[0].NetworkInterfaces[0].DeviceVlans
+       if len(vlans) != 3 {
+               t.Fatalf("expected 3 VLANs, got %d", len(vlans))
+       }
+
+       vlan100 := GenerateVLANConfig(m.Nodes[0].NetworkInterfaces[0], vlans[0])
+       vlan200 := GenerateVLANConfig(m.Nodes[0].NetworkInterfaces[0], vlans[1])
+       vlan300 := GenerateVLANConfig(m.Nodes[0].NetworkInterfaces[0], vlans[2])
+
+       if vlan100 == nil || vlan200 == nil || vlan300 == nil {
+               t.Fatal("expected all VLAN configs to be non-nil")
+       }
+
+       names := map[string]bool{
+               vlan100.MetaName: true,
+               vlan200.MetaName: true,
+               vlan300.MetaName: true,
+       }
+
+       if len(names) != 3 {
+               t.Errorf("expected 3 unique VLAN names, got %d: vlan100=%s, 
vlan200=%s, vlan300=%s",
+                       len(names), vlan100.MetaName, vlan200.MetaName, 
vlan300.MetaName)
+       }
+
+       expectedNames := map[string]bool{
+               "eth0.100": true,
+               "eth0.200": true,
+               "eth0.300": true,
+       }
+
+       if vlan100.MetaName != "eth0.100" {
+               t.Errorf("expected VLAN 100 name to be eth0.100, got %s", 
vlan100.MetaName)
+       }
+       if vlan200.MetaName != "eth0.200" {
+               t.Errorf("expected VLAN 200 name to be eth0.200, got %s", 
vlan200.MetaName)
+       }
+       if vlan300.MetaName != "eth0.300" {
+               t.Errorf("expected VLAN 300 name to be eth0.300, got %s", 
vlan300.MetaName)
+       }
+
+       if vlan100.ParentLinkConfig != "eth0" {
+               t.Errorf("expected parent eth0, got %s", 
vlan100.ParentLinkConfig)
+       }
+       if vlan200.ParentLinkConfig != "eth0" {
+               t.Errorf("expected parent eth0, got %s", 
vlan200.ParentLinkConfig)
+       }
+       if vlan300.ParentLinkConfig != "eth0" {
+               t.Errorf("expected parent eth0, got %s", 
vlan300.ParentLinkConfig)
+       }
+
+       if vlan100.VLANIDConfig != 100 {
+               t.Errorf("expected VLAN ID 100, got %d", vlan100.VLANIDConfig)
+       }
+       if vlan200.VLANIDConfig != 200 {
+               t.Errorf("expected VLAN ID 200, got %d", vlan200.VLANIDConfig)
+       }
+       if vlan300.VLANIDConfig != 300 {
+               t.Errorf("expected VLAN ID 300, got %d", vlan300.VLANIDConfig)
+       }
+
+       vlanBytes, err := GenerateVLANConfigBytes(m.Nodes[0].NetworkInterfaces)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       if vlanBytes == nil {
+               t.Fatal("expected VLAN config bytes, got nil")
+       }
+
+       vlanStr := string(vlanBytes)
+
+       for name := range expectedNames {
+               if !bytes.Contains(vlanBytes, []byte("name: "+name)) {
+                       t.Errorf("expected output to contain 'name: %s'", name)
+               }
+       }
+
+       t.Logf("Multiple VLAN config output:\n%s", vlanStr)
+}
+
 func TestGenerateWireguardConfig(t *testing.T) {
        data := []byte(`nodes:
   - hostname: node1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/talhelper-3.1.0/talhelper.json 
new/talhelper-3.1.1/talhelper.json
--- old/talhelper-3.1.0/talhelper.json  2026-01-13 08:04:42.000000000 +0100
+++ new/talhelper-3.1.1/talhelper.json  2026-01-15 17:32:49.000000000 +0100
@@ -1,19 +1,19 @@
 {
-    "version": "3.0.45",
+    "version": "3.1.0",
     "architecture": {
         "64bit": {
-            "url": 
"https://github.com/budimanjojo/talhelper/releases/download/v3.0.45/talhelper_windows_amd64.tar.gz";,
+            "url": 
"https://github.com/budimanjojo/talhelper/releases/download/v3.1.0/talhelper_windows_amd64.tar.gz";,
             "bin": [
                 "talhelper.exe"
             ],
-            "hash": 
"9cdb2f157d90fc80666229632b1e1f66113f59c6a8717626a3ebbc1603143f91"
+            "hash": 
"498c6919d552f1d3a0acf2faee2929d0828597b3b21777d714a15423aae14f23"
         },
         "arm64": {
-            "url": 
"https://github.com/budimanjojo/talhelper/releases/download/v3.0.45/talhelper_windows_arm64.tar.gz";,
+            "url": 
"https://github.com/budimanjojo/talhelper/releases/download/v3.1.0/talhelper_windows_arm64.tar.gz";,
             "bin": [
                 "talhelper.exe"
             ],
-            "hash": 
"8fbdf2fd2dec2c280eb2ba610c7edc3d601a6c47fd7747670ac92a56240ff76f"
+            "hash": 
"5a5e65a962defc94eb95dfcb3f5037fb9bc87b14ce8f6294ae04ea6d7d9b073b"
         }
     },
     "homepage": "https://github.com/budimanjojo/talhelper";,

++++++ talhelper.obsinfo ++++++
--- /var/tmp/diff_new_pack.4OJV8P/_old  2026-01-17 14:54:29.330520582 +0100
+++ /var/tmp/diff_new_pack.4OJV8P/_new  2026-01-17 14:54:29.350521415 +0100
@@ -1,5 +1,5 @@
 name: talhelper
-version: 3.1.0
-mtime: 1768287882
-commit: 51f737124d27d43082622188120bd5b86158c4b9
+version: 3.1.1
+mtime: 1768494769
+commit: 074dc70ec0cc4c9690e62798802ff14fb37e29f8
 

++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/talhelper/vendor.tar.gz 
/work/SRC/openSUSE:Factory/.talhelper.new.1928/vendor.tar.gz differ: char 135, 
line 2

Reply via email to