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-20 21:03:10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/talhelper (Old)
 and      /work/SRC/openSUSE:Factory/.talhelper.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "talhelper"

Tue Jan 20 21:03:10 2026 rev:38 rq:1328172 version:3.1.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/talhelper/talhelper.changes      2026-01-17 
14:54:27.394439871 +0100
+++ /work/SRC/openSUSE:Factory/.talhelper.new.1928/talhelper.changes    
2026-01-20 21:03:15.012841553 +0100
@@ -1,0 +2,18 @@
+Tue Jan 20 05:38:36 UTC 2026 - Johannes Kastl 
<[email protected]>
+
+- Update to version 3.1.2:
+  * chore(github-action): update renovatebot/github-action action
+    to v44.2.5
+  * fix(genconfig): vlan parent interface should get a LinkConfig
+  * fix(genconfig): a lot of silent errors
+  * fix(lint): shut golangci-lint up
+  * fix(genconfig): VLAN with DHCP set to true should generate
+    DHCPConfigs
+  * chore(schema): update talos-extensions.yaml JSON schema (#1389)
+  * fix(deps): update module github.com/budimanjojo/talhelper/v3 to
+    v3.1.1
+  * fix(deps): update module github.com/sirupsen/logrus to v1.9.4
+  * feat: update Scoop for talhelper version v3.1.1
+  * feat: update flake
+
+-------------------------------------------------------------------

Old:
----
  talhelper-3.1.1.obscpio

New:
----
  talhelper-3.1.2.obscpio

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

Other differences:
------------------
++++++ talhelper.spec ++++++
--- /var/tmp/diff_new_pack.cQdJ90/_old  2026-01-20 21:03:18.264976162 +0100
+++ /var/tmp/diff_new_pack.cQdJ90/_new  2026-01-20 21:03:18.264976162 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           talhelper
-Version:        3.1.1
+Version:        3.1.2
 Release:        0
 Summary:        Tool to help creating Talos kubernetes cluster
 License:        BSD-3-Clause

++++++ _service ++++++
--- /var/tmp/diff_new_pack.cQdJ90/_old  2026-01-20 21:03:18.312978149 +0100
+++ /var/tmp/diff_new_pack.cQdJ90/_new  2026-01-20 21:03:18.316978314 +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.1</param>
+    <param name="revision">v3.1.2</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)</param>
     <param name="changesgenerate">enable</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.cQdJ90/_old  2026-01-20 21:03:18.344979473 +0100
+++ /var/tmp/diff_new_pack.cQdJ90/_new  2026-01-20 21:03:18.352979804 +0100
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://github.com/budimanjojo/talhelper</param>
-              <param 
name="changesrevision">074dc70ec0cc4c9690e62798802ff14fb37e29f8</param></service></servicedata>
+              <param 
name="changesrevision">598d11139a83225801c8565700774a9db7e5ff25</param></service></servicedata>
 (No newline at EOF)
 

++++++ talhelper-3.1.1.obscpio -> talhelper-3.1.2.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/talhelper-3.1.1/default.nix 
new/talhelper-3.1.2/default.nix
--- old/talhelper-3.1.1/default.nix     2026-01-15 17:32:49.000000000 +0100
+++ new/talhelper-3.1.2/default.nix     2026-01-20 03:14:30.000000000 +0100
@@ -8,13 +8,13 @@
 
 buildGo125Module rec {
   pname = "talhelper";
-  version = "3.1.0";
+  version = "3.1.1";
 
   src = fetchFromGitHub {
     owner = "budimanjojo";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-pvJQ6l/Zh5TpGiWe3SXWsUOwFK5WUoGTu76MPyZcXRo=";
+    sha256 = "sha256-2CuMGYzJV1kfOjAl9eniyzIUJGAeg32Jro5f8Y5m7cs=";
   };
 
   vendorHash = "sha256-AkCUKg5oA2XvvDtE0m9fQdeqowx5A1SnnimF7F/CORg=";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/talhelper-3.1.1/hack/tsehelper/go.mod 
new/talhelper-3.1.2/hack/tsehelper/go.mod
--- old/talhelper-3.1.1/hack/tsehelper/go.mod   2026-01-15 17:32:49.000000000 
+0100
+++ new/talhelper-3.1.2/hack/tsehelper/go.mod   2026-01-20 03:14:30.000000000 
+0100
@@ -3,9 +3,9 @@
 go 1.25.5
 
 require (
-       github.com/budimanjojo/talhelper/v3 v3.1.0
+       github.com/budimanjojo/talhelper/v3 v3.1.1
        github.com/google/go-containerregistry v0.20.7
-       github.com/sirupsen/logrus v1.9.4-0.20251023124752-b61f268f75b6
+       github.com/sirupsen/logrus v1.9.4
        gopkg.in/yaml.v3 v3.0.1
 )
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/talhelper-3.1.1/hack/tsehelper/go.sum 
new/talhelper-3.1.2/hack/tsehelper/go.sum
--- old/talhelper-3.1.1/hack/tsehelper/go.sum   2026-01-15 17:32:49.000000000 
+0100
+++ new/talhelper-3.1.2/hack/tsehelper/go.sum   2026-01-20 03:14:30.000000000 
+0100
@@ -86,6 +86,8 @@
 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/budimanjojo/talhelper/v3 v3.1.1 
h1:4sAvlDLcUym1S5y09AWvXNEaC6g9UV/ywXHH908ztso=
+github.com/budimanjojo/talhelper/v3 v3.1.1/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=
@@ -177,6 +179,8 @@
 github.com/sirupsen/logrus v1.9.4-0.20230606125235-dd1b4c2e81af/go.mod 
h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
 github.com/sirupsen/logrus v1.9.4-0.20251023124752-b61f268f75b6 
h1:JEH4GlfEqachL/BWMxNEqYZGst5AGInBdLF/bEx+dZY=
 github.com/sirupsen/logrus v1.9.4-0.20251023124752-b61f268f75b6/go.mod 
h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
+github.com/sirupsen/logrus v1.9.4 
h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
+github.com/sirupsen/logrus v1.9.4/go.mod 
h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
 github.com/stretchr/objx v0.1.0/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.7.0/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.8.4 
h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/talhelper-3.1.1/pkg/config/schemas/talos-extensions.json 
new/talhelper-3.1.2/pkg/config/schemas/talos-extensions.json
--- old/talhelper-3.1.1/pkg/config/schemas/talos-extensions.json        
2026-01-15 17:32:49.000000000 +0100
+++ new/talhelper-3.1.2/pkg/config/schemas/talos-extensions.json        
2026-01-20 03:14:30.000000000 +0100
@@ -38997,6 +38997,91 @@
                 "siderolabs/nonfree-kmod-nvidia-production"
             ],
             "overlays": null
+        },
+        {
+            "version": "v1.13.0-alpha.0-3-g5b356b5",
+            "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.1/pkg/talos/multidocs.go 
new/talhelper-3.1.2/pkg/talos/multidocs.go
--- old/talhelper-3.1.1/pkg/talos/multidocs.go  2026-01-15 17:32:49.000000000 
+0100
+++ new/talhelper-3.1.2/pkg/talos/multidocs.go  2026-01-20 03:14:30.000000000 
+0100
@@ -119,11 +119,7 @@
                return nil, err
        }
 
-       if err := appendNetworkConfig(&result, vc, node, "dhcp4", 
GenerateDHCP4ConfigBytes); err != nil {
-               return nil, err
-       }
-
-       if err := appendNetworkConfig(&result, vc, node, "dhcp6", 
GenerateDHCP6ConfigBytes); err != nil {
+       if err := appendNetworkConfig(&result, vc, node, "dhcp", 
GenerateDHCPConfigsBytes); err != nil {
                return nil, err
        }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/talhelper-3.1.1/pkg/talos/networkconfig.go 
new/talhelper-3.1.2/pkg/talos/networkconfig.go
--- old/talhelper-3.1.1/pkg/talos/networkconfig.go      2026-01-15 
17:32:49.000000000 +0100
+++ new/talhelper-3.1.2/pkg/talos/networkconfig.go      2026-01-20 
03:14:30.000000000 +0100
@@ -11,6 +11,7 @@
        "github.com/siderolabs/go-pointer"
        "github.com/siderolabs/talos/pkg/machinery/cel"
        "github.com/siderolabs/talos/pkg/machinery/cel/celenv"
+       cinterfaces "github.com/siderolabs/talos/pkg/machinery/config/config"
        "github.com/siderolabs/talos/pkg/machinery/config/types/network"
        "github.com/siderolabs/talos/pkg/machinery/config/types/v1alpha1"
        "github.com/siderolabs/talos/pkg/machinery/nethelpers"
@@ -346,7 +347,11 @@
                        continue
                }
 
-               bondConfig := GenerateBondConfig(device)
+               bondConfig, err := GenerateBondConfig(device)
+               if err != nil {
+                       return nil, err
+               }
+
                if bondConfig == nil {
                        continue
                }
@@ -366,9 +371,9 @@
        return CombineYamlBytes(result), nil
 }
 
-func GenerateBondConfig(device *v1alpha1.Device) *network.BondConfigV1Alpha1 {
+func GenerateBondConfig(device *v1alpha1.Device) (*network.BondConfigV1Alpha1, 
error) {
        if device == nil || device.DeviceBond == nil {
-               return nil
+               return nil, nil
        }
 
        bondConfig := network.NewBondConfigV1Alpha1(device.DeviceInterface)
@@ -485,94 +490,42 @@
                }
        }
 
-       addCommonLinkConfig(&bondConfig.CommonLinkConfig, device)
-
-       return bondConfig
-}
-
-func GenerateDHCP4ConfigBytes(devices []*v1alpha1.Device) ([]byte, error) {
-       var result [][]byte
-
-       for _, device := range devices {
-               if device.DeviceDHCP == nil || !*device.DeviceDHCP {
-                       continue
-               }
-
-               dhcpConfig := GenerateDHCP4Config(device)
-               if dhcpConfig == nil {
-                       continue
-               }
-
-               dhcpBytes, err := marshalYaml(dhcpConfig)
-               if err != nil {
-                       return nil, err
-               }
-
-               result = append(result, dhcpBytes)
-       }
-
-       if len(result) == 0 {
-               return nil, nil
-       }
-       return CombineYamlBytes(result), nil
-}
-
-func GenerateDHCP4Config(device *v1alpha1.Device) 
*network.DHCPv4ConfigV1Alpha1 {
-       if device == nil || device.DeviceDHCP == nil || !*device.DeviceDHCP {
-               return nil
-       }
-
-       dhcpConfig := network.NewDHCPv4ConfigV1Alpha1(device.DeviceInterface)
-
-       if device.DeviceDHCPOptions != nil {
-               if device.DeviceDHCPOptions.DHCPRouteMetric != 0 {
-                       dhcpConfig.ConfigRouteMetric = 
device.DeviceDHCPOptions.DHCPRouteMetric
-               }
+       if err := addCommonLinkConfig(&bondConfig.CommonLinkConfig, device); 
err != nil {
+               return nil, err
        }
 
-       return dhcpConfig
+       return bondConfig, nil
 }
 
-func GenerateDHCP6ConfigBytes(devices []*v1alpha1.Device) ([]byte, error) {
+func GenerateDHCPConfigsBytes(devices []*v1alpha1.Device) ([]byte, error) {
        var result [][]byte
 
        for _, device := range devices {
-               if device.DeviceDHCPOptions == nil || 
device.DeviceDHCPOptions.DHCPIPv6 == nil || !*device.DeviceDHCPOptions.DHCPIPv6 
{
-                       continue
-               }
-
-               dhcp6Config := GenerateDHCP6Config(device)
-               if dhcp6Config == nil {
-                       continue
-               }
-
-               dhcp6Bytes, err := marshalYaml(dhcp6Config)
-               if err != nil {
-                       return nil, err
+               dhcpConfigs := GenerateDHCPConfigs(device)
+               if len(dhcpConfigs) > 0 {
+                       for _, dhcpConfig := range dhcpConfigs {
+                               dhcpBytes, err := marshalYaml(dhcpConfig)
+                               if err != nil {
+                                       return nil, err
+                               }
+                               result = append(result, dhcpBytes)
+                       }
                }
-
-               result = append(result, dhcp6Bytes)
        }
 
-       if len(result) == 0 {
-               return nil, nil
+       if len(result) > 0 {
+               return CombineYamlBytes(result), nil
        }
 
-       return CombineYamlBytes(result), nil
+       return nil, nil
 }
 
-func GenerateDHCP6Config(device *v1alpha1.Device) 
*network.DHCPv6ConfigV1Alpha1 {
-       if device == nil || device.DeviceDHCPOptions == nil || 
device.DeviceDHCPOptions.DHCPIPv6 == nil || !*device.DeviceDHCPOptions.DHCPIPv6 
{
-               return nil
-       }
-
-       dhcp6Config := network.NewDHCPv6ConfigV1Alpha1(device.DeviceInterface)
-
-       if device.DeviceDHCPOptions.DHCPRouteMetric != 0 {
-               dhcp6Config.ConfigRouteMetric = 
device.DeviceDHCPOptions.DHCPRouteMetric
+func GenerateDHCPConfigs(device *v1alpha1.Device) 
[]cinterfaces.NetworkDHCPConfig {
+       if device != nil && device.DHCP() {
+               return generateDHCPConfigs(device.DeviceInterface, 
device.DeviceDHCPOptions)
        }
 
-       return dhcp6Config
+       return nil
 }
 
 func GenerateVIPConfigBytes(devices []*v1alpha1.Device) ([]byte, error) {
@@ -622,7 +575,11 @@
                        continue
                }
 
-               linkConfig := GenerateLinkConfig(device)
+               linkConfig, err := GenerateLinkConfig(device)
+               if err != nil {
+                       return nil, err
+               }
+
                if linkConfig == nil {
                        continue
                }
@@ -642,9 +599,9 @@
        return CombineYamlBytes(result), nil
 }
 
-func GenerateLinkConfig(device *v1alpha1.Device) *network.LinkConfigV1Alpha1 {
+func GenerateLinkConfig(device *v1alpha1.Device) (*network.LinkConfigV1Alpha1, 
error) {
        if device == nil {
-               return nil
+               return nil, nil
        }
 
        hasAddresses := len(device.DeviceAddresses) > 0
@@ -652,7 +609,7 @@
        hasMTU := device.DeviceMTU > 0
 
        if !hasAddresses && !hasRoutes && !hasMTU {
-               return nil
+               return nil, nil
        }
 
        linkConfig := network.NewLinkConfigV1Alpha1(device.DeviceInterface)
@@ -660,9 +617,9 @@
        for _, address := range device.DeviceAddresses {
                prefix, err := netip.ParsePrefix(address)
                if err != nil {
-                       ip, ipErr := netip.ParseAddr(address)
-                       if ipErr != nil {
-                               continue
+                       ip, err := netip.ParseAddr(address)
+                       if err != nil {
+                               return nil, err
                        }
                        bits := 32
                        if ip.Is6() {
@@ -679,7 +636,7 @@
        for _, route := range device.DeviceRoutes {
                routeConfig, err := buildRouteConfig(route)
                if err != nil {
-                       continue
+                       return nil, err
                }
                linkConfig.LinkRoutes = append(linkConfig.LinkRoutes, 
*routeConfig)
        }
@@ -688,7 +645,7 @@
                linkConfig.LinkMTU = uint32(device.DeviceMTU)
        }
 
-       return linkConfig
+       return linkConfig, nil
 }
 
 func GenerateVLANConfigBytes(devices []*v1alpha1.Device) ([]byte, error) {
@@ -700,17 +657,18 @@
                }
 
                for _, vlan := range device.DeviceVlans {
-                       vlanConfig := GenerateVLANConfig(device, vlan)
-                       if vlanConfig == nil {
-                               continue
-                       }
-
-                       vlanBytes, err := marshalYaml(vlanConfig)
+                       vlanConfigs, err := GenerateVLANConfig(device, vlan)
                        if err != nil {
                                return nil, err
                        }
 
-                       result = append(result, vlanBytes)
+                       for _, vlanConfig := range vlanConfigs {
+                               bytes, err := marshalYaml(vlanConfig)
+                               if err != nil {
+                                       return nil, err
+                               }
+                               result = append(result, bytes)
+                       }
                }
        }
 
@@ -721,12 +679,14 @@
        return CombineYamlBytes(result), nil
 }
 
-func GenerateVLANConfig(device *v1alpha1.Device, vlan *v1alpha1.Vlan) 
*network.VLANConfigV1Alpha1 {
+func GenerateVLANConfig(device *v1alpha1.Device, vlan *v1alpha1.Vlan) 
([]cinterfaces.NamedDocument, error) {
        if device == nil || vlan == nil {
-               return nil
+               return nil, nil
        }
 
        if vlan.VlanID > 0 {
+               var docs []cinterfaces.NamedDocument
+
                vlanInterface := fmt.Sprintf("%s.%d", device.DeviceInterface, 
vlan.VlanID)
                vlanConfig := network.NewVLANConfigV1Alpha1(vlanInterface)
                vlanConfig.VLANIDConfig = vlan.VlanID
@@ -766,10 +726,21 @@
                        vlanConfig.LinkMTU = uint32(vlan.VlanMTU)
                }
 
-               return vlanConfig
+               docs = append(docs, vlanConfig)
+
+               if vlan.DHCP() {
+                       dhcpConfigs := generateDHCPConfigs(vlanInterface, 
vlan.VlanDHCPOptions)
+                       if len(dhcpConfigs) > 0 {
+                               for _, dhcpConfig := range dhcpConfigs {
+                                       docs = append(docs, dhcpConfig)
+                               }
+                       }
+               }
+
+               return docs, nil
        }
 
-       return nil
+       return nil, nil
 }
 
 func GenerateWireguardConfigBytes(devices []*v1alpha1.Device) ([]byte, error) {
@@ -780,7 +751,11 @@
                        continue
                }
 
-               wgConfig := GenerateWireguardConfig(device)
+               wgConfig, err := GenerateWireguardConfig(device)
+               if err != nil {
+                       return nil, err
+               }
+
                if wgConfig == nil {
                        continue
                }
@@ -800,9 +775,9 @@
        return CombineYamlBytes(result), nil
 }
 
-func GenerateWireguardConfig(device *v1alpha1.Device) 
*network.WireguardConfigV1Alpha1 {
+func GenerateWireguardConfig(device *v1alpha1.Device) 
(*network.WireguardConfigV1Alpha1, error) {
        if device == nil || device.DeviceWireguardConfig == nil {
-               return nil
+               return nil, nil
        }
 
        wgConfig := network.NewWireguardConfigV1Alpha1(device.DeviceInterface)
@@ -851,9 +826,11 @@
                }
        }
 
-       addCommonLinkConfig(&wgConfig.CommonLinkConfig, device)
+       if err := addCommonLinkConfig(&wgConfig.CommonLinkConfig, device); err 
!= nil {
+               return nil, err
+       }
 
-       return wgConfig
+       return wgConfig, nil
 }
 
 func GenerateBridgeConfigBytes(devices []*v1alpha1.Device) ([]byte, error) {
@@ -864,7 +841,11 @@
                        continue
                }
 
-               bridgeConfig := GenerateBridgeConfig(device)
+               bridgeConfig, err := GenerateBridgeConfig(device)
+               if err != nil {
+                       return nil, err
+               }
+
                if bridgeConfig == nil {
                        continue
                }
@@ -884,9 +865,9 @@
        return CombineYamlBytes(result), nil
 }
 
-func GenerateBridgeConfig(device *v1alpha1.Device) 
*network.BridgeConfigV1Alpha1 {
+func GenerateBridgeConfig(device *v1alpha1.Device) 
(*network.BridgeConfigV1Alpha1, error) {
        if device == nil || device.DeviceBridge == nil {
-               return nil
+               return nil, nil
        }
 
        bridgeConfig := network.NewBridgeConfigV1Alpha1(device.DeviceInterface)
@@ -901,17 +882,44 @@
                }
        }
 
-       addCommonLinkConfig(&bridgeConfig.CommonLinkConfig, device)
+       if err := addCommonLinkConfig(&bridgeConfig.CommonLinkConfig, device); 
err != nil {
+               return nil, err
+       }
+
+       return bridgeConfig, nil
+}
+
+func generateDHCPConfigs(name string, options *v1alpha1.DHCPOptions) 
[]cinterfaces.NetworkDHCPConfig {
+       if options == nil {
+               options = &v1alpha1.DHCPOptions{}
+       }
+
+       result := []cinterfaces.NetworkDHCPConfig{}
+
+       if options.IPv4() {
+               ipv4 := network.NewDHCPv4ConfigV1Alpha1(name)
+               if options.RouteMetric() > 0 {
+                       ipv4.ConfigRouteMetric = options.RouteMetric()
+               }
+               result = append(result, ipv4)
+       }
+
+       if options.IPv6() {
+               ipv6 := network.NewDHCPv6ConfigV1Alpha1(name)
+               if options.RouteMetric() > 0 {
+                       ipv6.ConfigRouteMetric = options.RouteMetric()
+               }
+               result = append(result, ipv6)
+       }
 
-       return bridgeConfig
+       return result
 }
 
 func hasSpecialConfig(device *v1alpha1.Device) bool {
        if device == nil {
                return false
        }
-       return device.DeviceBond != nil || len(device.DeviceVlans) > 0 ||
-               device.DeviceWireguardConfig != nil || device.DeviceBridge != 
nil
+       return device.DeviceBond != nil || device.DeviceWireguardConfig != nil 
|| device.DeviceBridge != nil
 }
 
 func buildRouteConfig(route interface {
@@ -920,38 +928,39 @@
        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)
-       }
-
+},
+) (*network.RouteConfig, error) {
        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}
+       networkStr := route.Network()
+       if networkStr != "" {
+               prefix, err := netip.ParsePrefix(networkStr)
+               if err != nil {
+                       return nil, fmt.Errorf("invalid network prefix: %w", 
err)
+               }
+
+               // 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 err != nil {
+                       return nil, err
                }
+               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 err != nil {
+                       return nil, err
                }
+               routeConfig.RouteSource = network.Addr{Addr: source}
        }
 
        if route.Metric() > 0 {
@@ -965,17 +974,17 @@
        return routeConfig, nil
 }
 
-func addCommonLinkConfig(linkConfig *network.CommonLinkConfig, device 
*v1alpha1.Device) {
+func addCommonLinkConfig(linkConfig *network.CommonLinkConfig, device 
*v1alpha1.Device) error {
        if device == nil || linkConfig == nil {
-               return
+               return nil
        }
 
        for _, address := range device.DeviceAddresses {
                prefix, err := netip.ParsePrefix(address)
                if err != nil {
-                       ip, ipErr := netip.ParseAddr(address)
-                       if ipErr != nil {
-                               continue
+                       ip, err := netip.ParseAddr(address)
+                       if err != nil {
+                               return err
                        }
                        bits := 32
                        if ip.Is6() {
@@ -992,7 +1001,7 @@
        for _, route := range device.DeviceRoutes {
                routeConfig, err := buildRouteConfig(route)
                if err != nil {
-                       continue
+                       return err
                }
                linkConfig.LinkRoutes = append(linkConfig.LinkRoutes, 
*routeConfig)
        }
@@ -1000,6 +1009,8 @@
        if device.DeviceMTU > 0 {
                linkConfig.LinkMTU = uint32(device.DeviceMTU)
        }
+
+       return nil
 }
 
 // marshalYaml encodes `in` into `yaml` bytes with 2 indentation.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/talhelper-3.1.1/pkg/talos/networkconfig_test.go 
new/talhelper-3.1.2/pkg/talos/networkconfig_test.go
--- old/talhelper-3.1.1/pkg/talos/networkconfig_test.go 2026-01-15 
17:32:49.000000000 +0100
+++ new/talhelper-3.1.2/pkg/talos/networkconfig_test.go 2026-01-20 
03:14:30.000000000 +0100
@@ -11,6 +11,8 @@
        networktypes 
"github.com/siderolabs/talos/pkg/machinery/api/resource/definitions/network"
        "github.com/siderolabs/talos/pkg/machinery/cel"
        "github.com/siderolabs/talos/pkg/machinery/cel/celenv"
+       cinterfaces "github.com/siderolabs/talos/pkg/machinery/config/config"
+       "github.com/siderolabs/talos/pkg/machinery/config/configloader"
        "github.com/siderolabs/talos/pkg/machinery/config/types/network"
        v1alpha1 
"github.com/siderolabs/talos/pkg/machinery/config/types/v1alpha1"
        "github.com/siderolabs/talos/pkg/machinery/nethelpers"
@@ -140,7 +142,11 @@
                t.Fatal("failed to parse test data")
        }
 
-       result := GenerateBondConfig(m.Nodes[0].NetworkInterfaces[0])
+       result, err := GenerateBondConfig(m.Nodes[0].NetworkInterfaces[0])
+       if err != nil {
+               t.Fatal(err)
+       }
+
        if result == nil {
                t.Fatal("expected bond config, got nil")
        }
@@ -194,13 +200,17 @@
        }
 }
 
-func TestGenerateDHCP4Config(t *testing.T) {
+func TestGenerateDHCPConfigs(t *testing.T) {
        data := []byte(`nodes:
   - hostname: node1
     networkInterfaces:
       - interface: eth0
         dhcp: true
         dhcpOptions:
+          ipv6: true
+      - interface: eth1
+        dhcp: true
+        dhcpOptions:
           routeMetric: 1024`)
 
        var m config.TalhelperConfig
@@ -208,53 +218,66 @@
                t.Fatal(err)
        }
 
-       if len(m.Nodes) == 0 || len(m.Nodes[0].NetworkInterfaces) == 0 {
+       if len(m.Nodes) == 0 || len(m.Nodes[0].NetworkInterfaces) != 2 {
                t.Fatal("failed to parse test data")
        }
 
-       result := GenerateDHCP4Config(m.Nodes[0].NetworkInterfaces[0])
-       if result == nil {
-               t.Fatal("expected DHCP4 config, got nil")
-       }
+       var results []cinterfaces.NetworkDHCPConfig
 
-       if result.Name() != "eth0" {
-               t.Errorf("expected name=eth0, got %s", result.Name())
-       }
+       results = append(results, 
GenerateDHCPConfigs(m.Nodes[0].NetworkInterfaces[0])...)
+       results = append(results, 
GenerateDHCPConfigs(m.Nodes[0].NetworkInterfaces[1])...)
 
-       if result.ConfigRouteMetric != 1024 {
-               t.Errorf("expected route metric=1024, got %d", 
result.ConfigRouteMetric)
+       type check struct {
+               kind        string
+               name        string
+               routeMetric uint32
        }
-}
 
-func TestGenerateDHCP6Config(t *testing.T) {
-       data := []byte(`nodes:
-  - hostname: node1
-    networkInterfaces:
-      - interface: eth0
-        dhcpOptions:
-          ipv6: true
-          routeMetric: 2048`)
-
-       var m config.TalhelperConfig
-       if err := yaml.Unmarshal(data, &m); err != nil {
-               t.Fatal(err)
-       }
-
-       if len(m.Nodes) == 0 || len(m.Nodes[0].NetworkInterfaces) == 0 {
-               t.Fatal("failed to parse test data")
-       }
-
-       result := GenerateDHCP6Config(m.Nodes[0].NetworkInterfaces[0])
-       if result == nil {
-               t.Fatal("expected DHCP6 config, got nil")
+       expected := []check{
+               {
+                       kind: "DHCPv4Config",
+                       name: "eth0",
+               },
+               {
+                       kind: "DHCPv6Config",
+                       name: "eth0",
+               },
+               {
+                       kind:        "DHCPv4Config",
+                       name:        "eth1",
+                       routeMetric: 1024,
+               },
        }
 
-       if result.Name() != "eth0" {
-               t.Errorf("expected name=eth0, got %s", result.Name())
+       if len(results) != len(expected) {
+               t.Fatalf("expected results to have length of %d, got %d", 
len(expected), len(results))
        }
 
-       if result.ConfigRouteMetric != 2048 {
-               t.Errorf("expected route metric=2048, got %d", 
result.ConfigRouteMetric)
+       for k, v := range results {
+               switch doc := v.(type) {
+               case *network.DHCPv4ConfigV1Alpha1:
+                       if doc.MetaKind != expected[k].kind {
+                               t.Errorf("expected results[%d] kind to be %s, 
got %s", k, expected[k].kind, doc.MetaKind)
+                       }
+                       if doc.MetaName != expected[k].name {
+                               t.Errorf("expected results[%d] name to be %s, 
got %s", k, expected[k].name, doc.MetaName)
+                       }
+                       if doc.ConfigRouteMetric != expected[k].routeMetric {
+                               t.Errorf("expected results[%d] route metric to 
be %d, got %d", k, expected[k].routeMetric, doc.ConfigRouteMetric)
+                       }
+               case *network.DHCPv6ConfigV1Alpha1:
+                       if doc.MetaKind != expected[k].kind {
+                               t.Errorf("expected results[%d] kind to be %s, 
got %s", k, expected[k].kind, doc.MetaKind)
+                       }
+                       if doc.MetaName != expected[k].name {
+                               t.Errorf("expected results[%d] name to be %s, 
got %s", k, expected[k].name, doc.MetaName)
+                       }
+                       if doc.ConfigRouteMetric != expected[k].routeMetric {
+                               t.Errorf("expected results[%d] route metric to 
be %d, got %d", k, expected[k].routeMetric, doc.ConfigRouteMetric)
+                       }
+               default:
+                       t.Errorf("unexpected type for results[%d]: %T", k, doc)
+               }
        }
 }
 
@@ -296,38 +319,6 @@
        t.Logf("Bond config output:\n%s", bondStr)
 }
 
-func TestGenerateDHCP4ConfigBytes(t *testing.T) {
-       data := []byte(`nodes:
-  - hostname: node1
-    networkInterfaces:
-      - interface: eth0
-        dhcp: true
-      - interface: eth1`)
-
-       var m config.TalhelperConfig
-       if err := yaml.Unmarshal(data, &m); err != nil {
-               t.Fatal(err)
-       }
-
-       dhcpBytes, err := GenerateDHCP4ConfigBytes(m.Nodes[0].NetworkInterfaces)
-       if err != nil {
-               t.Fatal(err)
-       }
-
-       if dhcpBytes == nil {
-               t.Fatal("expected DHCP4 config bytes, got nil")
-       }
-
-       dhcpStr := string(dhcpBytes)
-       if !bytes.Contains(dhcpBytes, []byte("kind: DHCPv4Config")) {
-               t.Error("expected output to contain 'kind: DHCPv4Config'")
-       }
-       if !bytes.Contains(dhcpBytes, []byte("name: eth0")) {
-               t.Error("expected output to contain 'name: eth0'")
-       }
-       t.Logf("DHCP4 config output:\n%s", dhcpStr)
-}
-
 func TestGenerateVIPConfig(t *testing.T) {
        data := []byte(`nodes:
   - hostname: node1
@@ -410,7 +401,11 @@
                t.Fatal(err)
        }
 
-       result := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[0])
+       result, err := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[0])
+       if err != nil {
+               t.Fatal(err)
+       }
+
        if result == nil {
                t.Fatal("expected link config, got nil")
        }
@@ -492,7 +487,11 @@
                t.Fatal(err)
        }
 
-       result := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[0])
+       result, err := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[0])
+       if err != nil {
+               t.Fatal(err)
+       }
+
        if result == nil {
                t.Fatal("expected link config, got nil")
        }
@@ -581,7 +580,11 @@
                t.Fatal(err)
        }
 
-       result := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[0])
+       result, err := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[0])
+       if err != nil {
+               t.Fatal(err)
+       }
+
        if result == nil {
                t.Fatal("expected link config, got nil")
        }
@@ -594,7 +597,11 @@
                t.Errorf("expected MTU 9000, got %d", result.LinkMTU)
        }
 
-       result2 := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[1])
+       result2, err := GenerateLinkConfig(m.Nodes[0].NetworkInterfaces[1])
+       if err != nil {
+               t.Fatal(err)
+       }
+
        if result2 != nil {
                t.Error("expected nil for interface without MTU")
        }
@@ -647,7 +654,8 @@
             routes:
               - network: 10.0.0.0/8
                 gateway: 192.168.100.254
-            mtu: 1500`)
+            mtu: 1500
+            dhcp: true`)
 
        var m config.TalhelperConfig
        if err := yaml.Unmarshal(data, &m); err != nil {
@@ -659,38 +667,60 @@
                t.Fatal("expected VLANs, got none")
        }
 
-       result := GenerateVLANConfig(m.Nodes[0].NetworkInterfaces[0], vlans[0])
-       if result == nil {
-               t.Fatal("expected VLAN config, got nil")
+       result, err := GenerateVLANConfig(m.Nodes[0].NetworkInterfaces[0], 
vlans[0])
+       if err != nil {
+               t.Fatal(err)
        }
 
-       if result.MetaName != "eth0.100" {
-               t.Errorf("expected name=eth0.100, got %s", result.MetaName)
+       if len(result) != 2 {
+               t.Fatalf("expected 2 documents, got %v document(s)", 
len(result))
        }
 
-       if result.VLANIDConfig != 100 {
-               t.Errorf("expected VLAN ID 100, got %d", result.VLANIDConfig)
+       result0, ok := result[0].(*network.VLANConfigV1Alpha1)
+       if !ok {
+               t.Errorf("expected first document to be type of VlanConfig, got 
%T", result0)
        }
 
-       if result.ParentLinkConfig != "eth0" {
-               t.Errorf("expected parent=eth0, got %s", 
result.ParentLinkConfig)
+       if result0.MetaName != "eth0.100" {
+               t.Errorf("expected first document name=eth0.100, got %s", 
result0.MetaName)
        }
 
-       if len(result.LinkAddresses) != 1 {
-               t.Fatalf("expected 1 address, got %d", 
len(result.LinkAddresses))
+       if result0.VLANIDConfig != 100 {
+               t.Errorf("expected VLAN ID 100, got %d", result0.VLANIDConfig)
+       }
+
+       if result0.ParentLinkConfig != "eth0" {
+               t.Errorf("expected parent=eth0, got %s", 
result0.ParentLinkConfig)
+       }
+
+       if len(result0.LinkAddresses) != 1 {
+               t.Fatalf("expected 1 address, got %d", 
len(result0.LinkAddresses))
        }
 
        expectedAddr := netip.MustParsePrefix("192.168.100.1/24")
-       if result.LinkAddresses[0].AddressAddress != expectedAddr {
-               t.Errorf("expected address %s, got %s", expectedAddr, 
result.LinkAddresses[0].AddressAddress)
+       if result0.LinkAddresses[0].AddressAddress != expectedAddr {
+               t.Errorf("expected address %s, got %s", expectedAddr, 
result0.LinkAddresses[0].AddressAddress)
+       }
+
+       if len(result0.LinkRoutes) != 1 {
+               t.Fatalf("expected 1 route, got %d", len(result0.LinkRoutes))
        }
 
-       if len(result.LinkRoutes) != 1 {
-               t.Fatalf("expected 1 route, got %d", len(result.LinkRoutes))
+       if result0.LinkMTU != 1500 {
+               t.Errorf("expected MTU 1500, got %d", result0.LinkMTU)
        }
 
-       if result.LinkMTU != 1500 {
-               t.Errorf("expected MTU 1500, got %d", result.LinkMTU)
+       if result[0].Name() != "eth0.100" || result[1].Name() != "eth0.100" {
+               t.Errorf("expected name=eth0.100, got %s and %s", 
result[0].Name(), result[1].Name())
+       }
+
+       result1, ok := result[1].(*network.DHCPv4ConfigV1Alpha1)
+       if !ok {
+               t.Errorf("expected second document to be type of DHCPv4Config, 
got %T", result1)
+       }
+
+       if result1.MetaName != "eth0.100" {
+               t.Errorf("expected second document name=eth0.100, got %s", 
result1.MetaName)
        }
 }
 
@@ -734,21 +764,19 @@
        t.Logf("VLAN config output:\n%s", vlanStr)
 }
 
-func TestGenerateVLANConfigMultipleVLANs(t *testing.T) {
+func TestGenerateVLANConfigBytesMultipleVLANs(t *testing.T) {
        data := []byte(`nodes:
   - hostname: node1
     networkInterfaces:
       - interface: eth0
         vlans:
           - vlanId: 100
-            addresses:
-              - 192.168.100.1/24
+            dhcp: true
           - vlanId: 200
-            addresses:
-              - 192.168.200.1/24
-          - vlanId: 300
-            addresses:
-              - 192.168.300.1/24`)
+            dhcp: true
+            dhcpOptions:
+              ipv6: true
+          - vlanId: 300`)
 
        var m config.TalhelperConfig
        if err := yaml.Unmarshal(data, &m); err != nil {
@@ -756,83 +784,94 @@
        }
 
        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,
+       result, err := GenerateVLANConfigBytes(m.Nodes[0].NetworkInterfaces)
+       if err != nil {
+               t.Fatal(err)
        }
 
-       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)
+       test, err := configloader.NewFromBytes(result)
+       if err != nil {
+               t.Fatal(err)
        }
 
-       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)
+       type check struct {
+               kind   string
+               name   string
+               vlanId uint16
        }
 
-       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)
+       expected := []check{
+               {
+                       kind:   "VLANConfig",
+                       name:   "eth0.100",
+                       vlanId: 100,
+               },
+               {
+                       kind: "DHCPv4Config",
+                       name: "eth0.100",
+               },
+               {
+                       kind:   "VLANConfig",
+                       name:   "eth0.200",
+                       vlanId: 200,
+               },
+               {
+                       kind: "DHCPv4Config",
+                       name: "eth0.200",
+               },
+               {
+                       kind: "DHCPv6Config",
+                       name: "eth0.200",
+               },
+               {
+                       kind:   "VLANConfig",
+                       name:   "eth0.300",
+                       vlanId: 300,
+               },
        }
 
-       if vlanBytes == nil {
-               t.Fatal("expected VLAN config bytes, got nil")
+       if len(test.Documents()) != len(expected) {
+               t.Fatalf("expected %d documents, got %d documents", 
len(expected), len(test.Documents()))
        }
 
-       vlanStr := string(vlanBytes)
-
-       for name := range expectedNames {
-               if !bytes.Contains(vlanBytes, []byte("name: "+name)) {
-                       t.Errorf("expected output to contain 'name: %s'", name)
+       for k, v := range test.Documents() {
+               switch doc := v.(type) {
+               case *network.VLANConfigV1Alpha1:
+                       if doc.MetaKind != expected[k].kind {
+                               t.Errorf("expected result[%d] kind to be %s, 
got %s", k, expected[k].kind, doc.MetaKind)
+                       }
+                       if doc.MetaName != expected[k].name {
+                               t.Errorf("expected result[%d] name to be %s, 
got %s", k, expected[k].name, doc.MetaName)
+                       }
+                       if doc.VLANIDConfig != expected[k].vlanId {
+                               t.Errorf("expected result[%d] vlanId to be %d, 
got %d", k, expected[k].vlanId, doc.VLANIDConfig)
+                       }
+                       if doc.ParentLinkConfig != "eth0" {
+                               t.Errorf("expected result[%d] parent name to be 
eth0, got %s", k, doc.ParentLinkConfig)
+                       }
+               case *network.DHCPv4ConfigV1Alpha1:
+                       if doc.MetaKind != expected[k].kind {
+                               t.Errorf("expected result[%d] kind to be %s, 
got %s", k, expected[k].kind, doc.MetaKind)
+                       }
+                       if doc.MetaName != expected[k].name {
+                               t.Errorf("expected result[%d] name to be %s, 
got %s", k, expected[k].name, doc.MetaName)
+                       }
+               case *network.DHCPv6ConfigV1Alpha1:
+                       if doc.MetaKind != expected[k].kind {
+                               t.Errorf("expected result[%d] kind to be %s, 
got %s", k, expected[k].kind, doc.MetaKind)
+                       }
+                       if doc.MetaName != expected[k].name {
+                               t.Errorf("expected result[%d] name to be %s, 
got %s", k, expected[k].name, doc.MetaName)
+                       }
+               default:
+                       t.Errorf("unexpected result[%d] kind: %T", k, doc)
                }
        }
-
-       t.Logf("Multiple VLAN config output:\n%s", vlanStr)
 }
 
 func TestGenerateWireguardConfig(t *testing.T) {
@@ -856,7 +895,11 @@
                t.Fatal(err)
        }
 
-       result := GenerateWireguardConfig(m.Nodes[0].NetworkInterfaces[0])
+       result, err := GenerateWireguardConfig(m.Nodes[0].NetworkInterfaces[0])
+       if err != nil {
+               t.Fatal(err)
+       }
+
        if result == nil {
                t.Fatal("expected WireGuard config, got nil")
        }
@@ -957,7 +1000,11 @@
                t.Fatal(err)
        }
 
-       result := GenerateBridgeConfig(m.Nodes[0].NetworkInterfaces[0])
+       result, err := GenerateBridgeConfig(m.Nodes[0].NetworkInterfaces[0])
+       if err != nil {
+               t.Fatal(err)
+       }
+
        if result == nil {
                t.Fatal("expected bridge config, got nil")
        }
@@ -1045,7 +1092,11 @@
                t.Fatal(err)
        }
 
-       bondConfig := GenerateBondConfig(m.Nodes[0].NetworkInterfaces[0])
+       bondConfig, err := GenerateBondConfig(m.Nodes[0].NetworkInterfaces[0])
+       if err != nil {
+               t.Fatal(err)
+       }
+
        if bondConfig == nil {
                t.Fatal("expected bond config, got nil")
        }
@@ -1096,7 +1147,11 @@
                t.Fatal(err)
        }
 
-       wgConfig := GenerateWireguardConfig(m.Nodes[0].NetworkInterfaces[0])
+       wgConfig, err := 
GenerateWireguardConfig(m.Nodes[0].NetworkInterfaces[0])
+       if err != nil {
+               t.Fatal(err)
+       }
+
        if wgConfig == nil {
                t.Fatal("expected wireguard config, got nil")
        }
@@ -1140,7 +1195,11 @@
                t.Fatal(err)
        }
 
-       bridgeConfig := GenerateBridgeConfig(m.Nodes[0].NetworkInterfaces[0])
+       bridgeConfig, err := 
GenerateBridgeConfig(m.Nodes[0].NetworkInterfaces[0])
+       if err != nil {
+               t.Fatal(err)
+       }
+
        if bridgeConfig == nil {
                t.Fatal("expected bridge config, got nil")
        }
@@ -1201,8 +1260,8 @@
                t.Error("expected bridge interface to have special config")
        }
 
-       if !hasSpecialConfig(m.Nodes[0].NetworkInterfaces[3]) {
-               t.Error("expected interface with VLAN to have special config")
+       if hasSpecialConfig(m.Nodes[0].NetworkInterfaces[3]) {
+               t.Error("expected interface with VLAN to NOT have special 
config")
        }
 
        if hasSpecialConfig(m.Nodes[0].NetworkInterfaces[4]) {
@@ -1658,7 +1717,11 @@
                t.Fatal(err)
        }
 
-       bondConfig := GenerateBondConfig(m.Nodes[0].NetworkInterfaces[0])
+       bondConfig, err := GenerateBondConfig(m.Nodes[0].NetworkInterfaces[0])
+       if err != nil {
+               t.Fatal(err)
+       }
+
        if bondConfig == nil {
                t.Fatal("expected bond config, got nil")
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/talhelper-3.1.1/talhelper.json 
new/talhelper-3.1.2/talhelper.json
--- old/talhelper-3.1.1/talhelper.json  2026-01-15 17:32:49.000000000 +0100
+++ new/talhelper-3.1.2/talhelper.json  2026-01-20 03:14:30.000000000 +0100
@@ -1,19 +1,19 @@
 {
-    "version": "3.1.0",
+    "version": "3.1.1",
     "architecture": {
         "64bit": {
-            "url": 
"https://github.com/budimanjojo/talhelper/releases/download/v3.1.0/talhelper_windows_amd64.tar.gz";,
+            "url": 
"https://github.com/budimanjojo/talhelper/releases/download/v3.1.1/talhelper_windows_amd64.tar.gz";,
             "bin": [
                 "talhelper.exe"
             ],
-            "hash": 
"498c6919d552f1d3a0acf2faee2929d0828597b3b21777d714a15423aae14f23"
+            "hash": 
"c0918411820b3e9c77872292cacf57b6efb5af6926338e2403a573aac41013e6"
         },
         "arm64": {
-            "url": 
"https://github.com/budimanjojo/talhelper/releases/download/v3.1.0/talhelper_windows_arm64.tar.gz";,
+            "url": 
"https://github.com/budimanjojo/talhelper/releases/download/v3.1.1/talhelper_windows_arm64.tar.gz";,
             "bin": [
                 "talhelper.exe"
             ],
-            "hash": 
"5a5e65a962defc94eb95dfcb3f5037fb9bc87b14ce8f6294ae04ea6d7d9b073b"
+            "hash": 
"f903e4ff760be1ca371896d84de63331141a1de1cbb817df655502ac21b1f026"
         }
     },
     "homepage": "https://github.com/budimanjojo/talhelper";,

++++++ talhelper.obsinfo ++++++
--- /var/tmp/diff_new_pack.cQdJ90/_old  2026-01-20 21:03:18.748996196 +0100
+++ /var/tmp/diff_new_pack.cQdJ90/_new  2026-01-20 21:03:18.760996692 +0100
@@ -1,5 +1,5 @@
 name: talhelper
-version: 3.1.1
-mtime: 1768494769
-commit: 074dc70ec0cc4c9690e62798802ff14fb37e29f8
+version: 3.1.2
+mtime: 1768875270
+commit: 598d11139a83225801c8565700774a9db7e5ff25
 

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

Reply via email to