"""Tests for SDN-related methods: get_vlans, get_network_instances.""" from __future__ import annotations import pytest from tests.conftest import _build_mock_api, SDN_ZONES, SDN_VNETS class TestGetVlans: def test_sdn_vnets_appear_as_vlans(self, driver): result = driver.get_vlans() # vnet0 tag=10, vnet1 tag=20 assert "10" in result assert "20" in result def test_vlan_name_is_vnet_id(self, driver): result = driver.get_vlans() assert result["10"]["name"] == "vnet0" assert result["20"]["name"] == "vnet1" def test_vlan_100000_for_vxlan(self, driver): result = driver.get_vlans() assert "100000" in result def test_membership_derived_from_vm_configs(self, driver): """Without OVS ports, VLAN membership comes from each VM's netN config. This replaces a test for a `bridge vlan show` fallback that no longer exists — it also asserted an "interfaces" key this method has never produced, so it could not have passed against any version of the code. """ node = driver._node_api() node.qemu.get.return_value = [{"vmid": 100}] node.lxc.get.return_value = [] node.qemu.return_value.config.get.return_value = { "net0": "virtio=AA:BB:CC:DD:EE:FF,bridge=vmbr0,tag=10", } result = driver.get_vlans() assert "vmbr0" in result["10"]["untagged"] def test_configured_vnets_appear_even_without_members(self, driver): """An SDN VNet exists on the node whether or not anything is attached. Entries with no member ports used to be filtered out of this one return path while the OVS path returned them, so a configured VLAN was visible or invisible depending on which branch ran. """ result = driver.get_vlans() assert result["20"]["name"] == "vnet1" assert result["20"]["untagged"] == [] def test_empty_sdn_returns_dict(self): from unittest.mock import patch from napalm_proxmox.driver import ProxmoxDriver from tests.conftest import _build_mock_api mock_api = _build_mock_api(sdn_vnets=[], sdn_zones=[]) drv = ProxmoxDriver("pve1", "root", "secret", optional_args={"verify_ssl": False}) with patch("napalm_proxmox.driver.ProxmoxAPI", return_value=mock_api): drv.open() result = drv.get_vlans() assert isinstance(result, dict) class TestGetNetworkInstances: def test_default_instance_always_present(self, driver): result = driver.get_network_instances() assert "default" in result assert result["default"]["type"] == "DEFAULT_INSTANCE" def test_sdn_zones_as_instances(self, driver): result = driver.get_network_instances() assert "zone-vlan" in result assert "zone-vxlan" in result assert "zone-evpn" in result def test_zone_type_mapping(self, driver): result = driver.get_network_instances() assert result["zone-vlan"]["type"] == "L2VPN" assert result["zone-evpn"]["type"] == "L3VRF" def test_vnet_appears_in_zone_interfaces(self, driver): result = driver.get_network_instances() zone_ifaces = result["zone-vlan"]["interfaces"]["interface"] assert "vnet0" in zone_ifaces assert "vnet1" in zone_ifaces def test_filter_by_name(self, driver): result = driver.get_network_instances(name="zone-vlan") assert "zone-vlan" in result assert "zone-vxlan" not in result def test_evpn_route_distinguisher(self, driver): result = driver.get_network_instances() rd = result["zone-evpn"]["state"]["route_distinguisher"] assert rd == 10001 def test_default_interfaces_include_node_ifaces(self, driver): result = driver.get_network_instances() default_ifaces = result["default"]["interfaces"]["interface"] assert "eth0" in default_ifaces assert "vmbr0" in default_ifaces