"""Tests for get_interfaces, get_interfaces_ip, get_interfaces_counters.""" from __future__ import annotations import pytest from tests.conftest import _build_mock_api, NODE_NETWORK from unittest.mock import patch from napalm_proxmox.driver import ProxmoxDriver class TestGetInterfaces: def test_returns_all_ifaces(self, driver): result = driver.get_interfaces() expected_names = {i["iface"] for i in NODE_NETWORK if i.get("iface")} assert set(result.keys()) == expected_names def test_eth0_is_up(self, driver): result = driver.get_interfaces() assert result["eth0"]["is_up"] is True assert result["eth0"]["is_enabled"] is True def test_ovs_bridge_not_up(self, driver): result = driver.get_interfaces() assert result["vmbr1"]["is_up"] is False def test_mac_address_normalized(self, driver): result = driver.get_interfaces() mac = result["eth0"]["mac_address"] # should be lower-case colon-separated assert mac == "aa:bb:cc:dd:ee:01" def test_speed_eth0(self, driver): result = driver.get_interfaces() assert result["eth0"]["speed"] == 1000.0 def test_speed_unknown(self, driver): result = driver.get_interfaces() assert result["vmbr0"]["speed"] == -1.0 def test_mtu(self, driver): result = driver.get_interfaces() assert result["eth1"]["mtu"] == 9000 def test_description(self, driver): result = driver.get_interfaces() assert result["eth0"]["description"] == "Management" def test_last_flapped_minus_one(self, driver): result = driver.get_interfaces() assert result["eth0"]["last_flapped"] == -1.0 class TestGetInterfacesIP: def test_eth0_has_ipv4(self, driver): result = driver.get_interfaces_ip() assert "eth0" in result assert "ipv4" in result["eth0"] assert "10.0.0.1" in result["eth0"]["ipv4"] def test_eth0_prefix_length(self, driver): result = driver.get_interfaces_ip() assert result["eth0"]["ipv4"]["10.0.0.1"]["prefix_length"] == 24 def test_sdn_vnet_ipv4_gateway(self, driver): result = driver.get_interfaces_ip() # vnet0 gateway 10.10.0.1 /24 assert "vnet0" in result assert "10.10.0.1" in result["vnet0"].get("ipv4", {}) def test_sdn_vnet_ipv6_gateway(self, driver): result = driver.get_interfaces_ip() # vnet1 has IPv6 subnet assert "vnet1" in result assert "2001:db8:20::1" in result["vnet1"].get("ipv6", {}) def test_iface_without_address_not_in_result(self, driver): result = driver.get_interfaces_ip() # eth1 has no address in fixture assert "eth1" not in result class TestGetInterfacesCounters: def test_returns_eth0(self, driver): result = driver.get_interfaces_counters() assert "eth0" in result def test_counters_fields_present(self, driver): result = driver.get_interfaces_counters() eth0 = result["eth0"] for field in ( "tx_errors", "rx_errors", "tx_discards", "rx_discards", "tx_octets", "rx_octets", "tx_unicast_packets", "rx_unicast_packets", "tx_multicast_packets", "rx_multicast_packets", "tx_broadcast_packets", "rx_broadcast_packets", ): assert field in eth0, f"Missing field: {field}" def test_counter_values(self, driver): result = driver.get_interfaces_counters() eth0 = result["eth0"] assert eth0["tx_octets"] == 500000 assert eth0["rx_octets"] == 1000000 assert eth0["tx_discards"] == 1 def test_empty_when_no_netstat(self, driver): driver._node_api().netstat.get.return_value = [] result = driver.get_interfaces_counters() assert result == {}