diff --git a/napalm_proxmox/vm_provision_mixin.py b/napalm_proxmox/vm_provision_mixin.py index 43ea407..dd6106a 100644 --- a/napalm_proxmox/vm_provision_mixin.py +++ b/napalm_proxmox/vm_provision_mixin.py @@ -415,6 +415,15 @@ class ProxmoxVMProvisionMixin: if not name: continue # A vnet's VLAN is already fixed by its zone/tag — no separate vlan_tag applies. - targets.append({"name": name, "kind": "vnet", "vlan_aware": False}) + tag = vnet.get("tag") + fixed_vlan_tag = int(tag) if tag is not None else None + targets.append( + { + "name": name, + "kind": "vnet", + "vlan_aware": False, + "fixed_vlan_tag": fixed_vlan_tag, + } + ) return targets diff --git a/tests/test_vm_provision_mixin.py b/tests/test_vm_provision_mixin.py index d0de0e0..c030c3f 100644 --- a/tests/test_vm_provision_mixin.py +++ b/tests/test_vm_provision_mixin.py @@ -472,3 +472,42 @@ def test_get_network_targets_sdn_vnet_never_vlan_aware(): assert len(targets) == 2 assert all(t["kind"] == "vnet" for t in targets) assert all(t["vlan_aware"] is False for t in targets) + + +def test_get_network_targets_vnet_exposes_fixed_vlan_tag(): + """A vnet's fixed_vlan_tag surfaces its SDN tag for display purposes.""" + mixin = ProxmoxVMProvisionMixin() + mixin._get_node_network = MagicMock(return_value=[]) + mixin._get_sdn_vnets = MagicMock( + return_value=[{"vnet": "vnet0", "zone": "zone-vlan", "tag": 10}] + ) + + targets = mixin.get_network_targets() + + assert targets[0]["fixed_vlan_tag"] == 10 + + +def test_get_network_targets_vnet_without_tag_has_none_fixed_vlan_tag(): + """A vnet with no tag (e.g. VXLAN/EVPN zone) reports fixed_vlan_tag=None.""" + mixin = ProxmoxVMProvisionMixin() + mixin._get_node_network = MagicMock(return_value=[]) + mixin._get_sdn_vnets = MagicMock( + return_value=[{"vnet": "vnet2", "zone": "zone-vxlan"}] + ) + + targets = mixin.get_network_targets() + + assert targets[0]["fixed_vlan_tag"] is None + + +def test_get_network_targets_bridge_has_no_fixed_vlan_tag(): + """Bridges never carry a single fixed VLAN tag — only vnets do.""" + mixin = ProxmoxVMProvisionMixin() + mixin._get_node_network = MagicMock( + return_value=[{"iface": "vmbr0", "type": "bridge", "bridge_vlan_aware": 1}] + ) + mixin._get_sdn_vnets = MagicMock(return_value=[]) + + targets = mixin.get_network_targets() + + assert "fixed_vlan_tag" not in targets[0] or targets[0]["fixed_vlan_tag"] is None