mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-11-09 19:09:41 +00:00
* Improve connection settings fixture Make the connection settings fixture behave more closely to the actual NetworkManager. The behavior has been tested with NetworkManager 1.42.4 (Debian 12) and 1.44.2 (HAOS 13.1). This likely behaves similar in older versions too. * Introduce separate skeleton and settings for wireless Instead of having a combined network settings object which has Ethernet and Wirless settings, create a separate settings object for wireless. * Handle addresses/address-data property like NetworkManager * Address ruff check * Improve network API test Add a test which changes from "static" to "auto". Validate that settings are updated accordingly. Specifically, today this does clear the DNS setting (by not providing the property). * ruff format * ruff check * Complete TEST_INTERFACE rename * Add partial network update as test case
439 lines
13 KiB
Python
439 lines
13 KiB
Python
"""Mock of Network Manager Device service."""
|
|
|
|
from ctypes import c_uint32
|
|
from dataclasses import dataclass
|
|
|
|
from dbus_fast import Variant
|
|
from dbus_fast.service import PropertyAccess, dbus_property, signal
|
|
|
|
from .base import DBusServiceMock, dbus_method
|
|
|
|
BUS_NAME = "org.freedesktop.NetworkManager"
|
|
ETHERNET_DEVICE_OBJECT_PATH = "/org/freedesktop/NetworkManager/Devices/1"
|
|
WIRELESS_DEVICE_OBJECT_PATH = "/org/freedesktop/NetworkManager/Devices/3"
|
|
DEFAULT_OBJECT_PATH = ETHERNET_DEVICE_OBJECT_PATH
|
|
|
|
|
|
def setup(object_path: str | None = None) -> DBusServiceMock:
|
|
"""Create dbus mock object."""
|
|
return Device(object_path if object_path else DEFAULT_OBJECT_PATH)
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class DeviceFixture:
|
|
"""Device fixture."""
|
|
|
|
Udi: str
|
|
Path: str
|
|
Interface: str
|
|
IpInterface: str
|
|
Driver: str
|
|
DriverVersion: str
|
|
FirmwareVersion: str
|
|
Capabilities: c_uint32
|
|
Ip4Address: c_uint32
|
|
State: c_uint32
|
|
StateReason: list[c_uint32]
|
|
ActiveConnection: str
|
|
Ip4Config: str
|
|
Dhcp4Config: str
|
|
Ip6Config: str
|
|
Dhcp6Config: str
|
|
Managed: bool
|
|
Autoconnect: bool
|
|
FirmwareMissing: bool
|
|
NmPluginMissing: bool
|
|
DeviceType: c_uint32
|
|
AvailableConnections: list[str]
|
|
PhysicalPortId: str
|
|
Mtu: c_uint32
|
|
Metered: c_uint32
|
|
LldpNeighbors: list[dict[str, Variant]]
|
|
Real: bool
|
|
Ip4Connectivity: c_uint32
|
|
Ip6Connectivity: c_uint32
|
|
InterfaceFlags: c_uint32
|
|
HwAddress: str
|
|
Ports: list[str]
|
|
|
|
|
|
FIXTURES: dict[str, DeviceFixture] = {
|
|
"/org/freedesktop/NetworkManager/Devices/1": DeviceFixture(
|
|
Udi="/sys/devices/pci0000:00/0000:00:1f.6/net/eth0",
|
|
Path="platform-ff3f0000.ethernet",
|
|
Interface="eth0",
|
|
IpInterface="eth0",
|
|
Driver="e1000e",
|
|
DriverVersion="3.2.6-k",
|
|
FirmwareVersion="0.7-4",
|
|
Capabilities=3,
|
|
Ip4Address=2499979456,
|
|
State=100,
|
|
StateReason=[100, 0],
|
|
ActiveConnection="/org/freedesktop/NetworkManager/ActiveConnection/1",
|
|
Ip4Config="/org/freedesktop/NetworkManager/IP4Config/1",
|
|
Dhcp4Config="/org/freedesktop/NetworkManager/DHCP4Config/1",
|
|
Ip6Config="/org/freedesktop/NetworkManager/IP6Config/1",
|
|
Dhcp6Config="/",
|
|
Managed=True,
|
|
Autoconnect=True,
|
|
FirmwareMissing=False,
|
|
NmPluginMissing=False,
|
|
DeviceType=1,
|
|
AvailableConnections=["/org/freedesktop/NetworkManager/Settings/1"],
|
|
PhysicalPortId="",
|
|
Mtu=1500,
|
|
Metered=4,
|
|
LldpNeighbors=[],
|
|
Real=True,
|
|
Ip4Connectivity=4,
|
|
Ip6Connectivity=3,
|
|
InterfaceFlags=65539,
|
|
HwAddress="AA:BB:CC:DD:EE:FF",
|
|
Ports=[],
|
|
),
|
|
"/org/freedesktop/NetworkManager/Devices/3": DeviceFixture(
|
|
Udi="/sys/devices/platform/soc/fe300000.mmcnr/mmc_host/mmc1/mmc1:0001/mmc1:0001:1/net/wlan0",
|
|
Path="platform.fe300000.mmcnr",
|
|
Interface="wlan0",
|
|
IpInterface="",
|
|
Driver="brcmfmac",
|
|
DriverVersion="7.45.154",
|
|
FirmwareVersion="01-4fbe0b04",
|
|
Capabilities=1,
|
|
Ip4Address=0,
|
|
State=30,
|
|
StateReason=[30, 42],
|
|
ActiveConnection="/",
|
|
Ip4Config="/",
|
|
Dhcp4Config="/",
|
|
Ip6Config="/",
|
|
Dhcp6Config="/",
|
|
Managed=True,
|
|
Autoconnect=True,
|
|
FirmwareMissing=False,
|
|
NmPluginMissing=False,
|
|
DeviceType=2,
|
|
AvailableConnections=["/org/freedesktop/NetworkManager/Settings/3"],
|
|
PhysicalPortId="",
|
|
Mtu=1500,
|
|
Metered=0,
|
|
LldpNeighbors=[],
|
|
Real=True,
|
|
Ip4Connectivity=1,
|
|
Ip6Connectivity=1,
|
|
InterfaceFlags=65539,
|
|
HwAddress="FF:EE:DD:CC:BB:AA",
|
|
Ports=[],
|
|
),
|
|
"/org/freedesktop/NetworkManager/Devices/4": DeviceFixture(
|
|
Udi="/sys/devices/pci0000:00/0000:00:1f.6/net/eth0",
|
|
Path="platform-ff3f0000.ethernet",
|
|
Interface="eth0",
|
|
IpInterface="eth0",
|
|
Driver="e1000e",
|
|
DriverVersion="3.2.6-k",
|
|
FirmwareVersion="0.7-4",
|
|
Capabilities=3,
|
|
Ip4Address=2499979456,
|
|
State=100,
|
|
StateReason=[100, 0],
|
|
ActiveConnection="/org/freedesktop/NetworkManager/ActiveConnection/2",
|
|
Ip4Config="/org/freedesktop/NetworkManager/IP4Config/1",
|
|
Dhcp4Config="/org/freedesktop/NetworkManager/DHCP4Config/1",
|
|
Ip6Config="/org/freedesktop/NetworkManager/IP6Config/1",
|
|
Dhcp6Config="/",
|
|
Managed=True,
|
|
Autoconnect=True,
|
|
FirmwareMissing=False,
|
|
NmPluginMissing=False,
|
|
DeviceType=1,
|
|
AvailableConnections=["/org/freedesktop/NetworkManager/Settings/2"],
|
|
PhysicalPortId="",
|
|
Mtu=1500,
|
|
Metered=4,
|
|
LldpNeighbors=[],
|
|
Real=True,
|
|
Ip4Connectivity=4,
|
|
Ip6Connectivity=3,
|
|
InterfaceFlags=65539,
|
|
HwAddress="A1:B2:C3:D4:E5:F6",
|
|
Ports=[],
|
|
),
|
|
"/org/freedesktop/NetworkManager/Devices/5": DeviceFixture(
|
|
Udi="/sys/devices/pci0000:00/0000:00:1f.6/net/en0",
|
|
Path="platform-ff3f0000.ethernet",
|
|
Interface="en0",
|
|
IpInterface="en0",
|
|
Driver="e1000e",
|
|
DriverVersion="3.2.6-k",
|
|
FirmwareVersion="0.7-4",
|
|
Capabilities=3,
|
|
Ip4Address=2499979456,
|
|
State=100,
|
|
StateReason=[100, 0],
|
|
ActiveConnection="/org/freedesktop/NetworkManager/ActiveConnection/2",
|
|
Ip4Config="/org/freedesktop/NetworkManager/IP4Config/1",
|
|
Dhcp4Config="/org/freedesktop/NetworkManager/DHCP4Config/1",
|
|
Ip6Config="/org/freedesktop/NetworkManager/IP6Config/1",
|
|
Dhcp6Config="/",
|
|
Managed=True,
|
|
Autoconnect=True,
|
|
FirmwareMissing=False,
|
|
NmPluginMissing=False,
|
|
DeviceType=1,
|
|
AvailableConnections=["/org/freedesktop/NetworkManager/Settings/2"],
|
|
PhysicalPortId="",
|
|
Mtu=1500,
|
|
Metered=4,
|
|
LldpNeighbors=[],
|
|
Real=True,
|
|
Ip4Connectivity=4,
|
|
Ip6Connectivity=3,
|
|
InterfaceFlags=65539,
|
|
HwAddress="AA:BB:CC:DD:EE:FF",
|
|
Ports=[],
|
|
),
|
|
"/org/freedesktop/NetworkManager/Devices/35": DeviceFixture(
|
|
Udi="/sys/devices/virtual/net/veth87bd238'",
|
|
Path="",
|
|
Interface="veth87bd238",
|
|
IpInterface="veth87bd238",
|
|
Driver="veth",
|
|
DriverVersion="1.0",
|
|
FirmwareVersion="",
|
|
Capabilities=7,
|
|
Ip4Address=0,
|
|
State=10,
|
|
StateReason=[10, 0],
|
|
ActiveConnection="/",
|
|
Ip4Config="/",
|
|
Dhcp4Config="/",
|
|
Ip6Config="/",
|
|
Dhcp6Config="/",
|
|
Managed=False,
|
|
Autoconnect=True,
|
|
FirmwareMissing=False,
|
|
NmPluginMissing=False,
|
|
DeviceType=20,
|
|
AvailableConnections=[],
|
|
PhysicalPortId="",
|
|
Mtu=1500,
|
|
Metered=0,
|
|
LldpNeighbors=[],
|
|
Real=True,
|
|
Ip4Connectivity=0,
|
|
Ip6Connectivity=0,
|
|
InterfaceFlags=65539,
|
|
HwAddress="9A:4B:E3:9A:F8:D3",
|
|
Ports=[],
|
|
),
|
|
}
|
|
|
|
|
|
class Device(DBusServiceMock):
|
|
"""Device mock.
|
|
|
|
gdbus introspect --system --dest org.freedesktop.NetworkManager --object-path /org/freedesktop/NetworkManager/Devices/1
|
|
"""
|
|
|
|
interface = "org.freedesktop.NetworkManager.Device"
|
|
|
|
def __init__(self, object_path: str):
|
|
"""Initialize object."""
|
|
super().__init__()
|
|
self.object_path = object_path
|
|
self.fixture: DeviceFixture = FIXTURES[object_path]
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Udi(self) -> "s":
|
|
"""Get Udi."""
|
|
return self.fixture.Udi
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Path(self) -> "s":
|
|
"""Get Path."""
|
|
return self.fixture.Path
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Interface(self) -> "s":
|
|
"""Get Interface."""
|
|
return self.fixture.Interface
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def IpInterface(self) -> "s":
|
|
"""Get IpInterface."""
|
|
return self.fixture.IpInterface
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Driver(self) -> "s":
|
|
"""Get Driver."""
|
|
return self.fixture.Driver
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def DriverVersion(self) -> "s":
|
|
"""Get DriverVersion."""
|
|
return self.fixture.DriverVersion
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def FirmwareVersion(self) -> "s":
|
|
"""Get FirmwareVersion."""
|
|
return self.fixture.FirmwareVersion
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Capabilities(self) -> "u":
|
|
"""Get Capabilities."""
|
|
return self.fixture.Capabilities
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Ip4Address(self) -> "u":
|
|
"""Get Ip4Address."""
|
|
return self.fixture.Ip4Address
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def State(self) -> "u":
|
|
"""Get State."""
|
|
return self.fixture.State
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def StateReason(self) -> "(uu)":
|
|
"""Get StateReason."""
|
|
return self.fixture.StateReason
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def ActiveConnection(self) -> "o":
|
|
"""Get ActiveConnection."""
|
|
return self.fixture.ActiveConnection
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Ip4Config(self) -> "o":
|
|
"""Get Ip4Config."""
|
|
return self.fixture.Ip4Config
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Dhcp4Config(self) -> "o":
|
|
"""Get Dhcp4Config."""
|
|
return self.fixture.Dhcp4Config
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Ip6Config(self) -> "o":
|
|
"""Get Ip6Config."""
|
|
return self.fixture.Ip6Config
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Dhcp6Config(self) -> "o":
|
|
"""Get Dhcp6Config."""
|
|
return self.fixture.Dhcp6Config
|
|
|
|
@dbus_property()
|
|
def Managed(self) -> "b":
|
|
"""Get Managed."""
|
|
return self.fixture.Managed
|
|
|
|
@Managed.setter
|
|
def Managed(self, value: "b"):
|
|
"""Set Managed."""
|
|
self.emit_properties_changed({"Managed": value})
|
|
|
|
@dbus_property()
|
|
def Autoconnect(self) -> "b":
|
|
"""Get Autoconnect."""
|
|
return self.fixture.Autoconnect
|
|
|
|
@Autoconnect.setter
|
|
def Autoconnect(self, value: "b"):
|
|
"""Set Autoconnect."""
|
|
self.emit_properties_changed({"Autoconnect": value})
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def FirmwareMissing(self) -> "b":
|
|
"""Get FirmwareMissing."""
|
|
return self.fixture.FirmwareMissing
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def NmPluginMissing(self) -> "b":
|
|
"""Get NmPluginMissing."""
|
|
return self.fixture.NmPluginMissing
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def DeviceType(self) -> "u":
|
|
"""Get DeviceType."""
|
|
return self.fixture.DeviceType
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def AvailableConnections(self) -> "ao":
|
|
"""Get AvailableConnections."""
|
|
return self.fixture.AvailableConnections
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def PhysicalPortId(self) -> "s":
|
|
"""Get PhysicalPortId."""
|
|
return self.fixture.PhysicalPortId
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Mtu(self) -> "u":
|
|
"""Get Mtu."""
|
|
return self.fixture.Mtu
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Metered(self) -> "u":
|
|
"""Get Metered."""
|
|
return self.fixture.Metered
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def LldpNeighbors(self) -> "aa{sv}":
|
|
"""Get LldpNeighbors."""
|
|
return self.fixture.LldpNeighbors
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Real(self) -> "b":
|
|
"""Get Real."""
|
|
return self.fixture.Real
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Ip4Connectivity(self) -> "u":
|
|
"""Get Ip4Connectivity."""
|
|
return self.fixture.Ip4Connectivity
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Ip6Connectivity(self) -> "u":
|
|
"""Get Ip6Connectivity."""
|
|
return self.fixture.Ip6Connectivity
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def InterfaceFlags(self) -> "u":
|
|
"""Get InterfaceFlags."""
|
|
return self.fixture.InterfaceFlags
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def HwAddress(self) -> "s":
|
|
"""Get HwAddress."""
|
|
return self.fixture.HwAddress
|
|
|
|
@dbus_property(access=PropertyAccess.READ)
|
|
def Ports(self) -> "ao":
|
|
"""Get Ports."""
|
|
return self.fixture.Ports
|
|
|
|
@signal()
|
|
def StateChanged(self) -> "uuu":
|
|
"""Signal StateChanged."""
|
|
return [120, 100, 1]
|
|
|
|
@dbus_method()
|
|
def Reapply(self, connection: "a{sa{sv}}", version_id: "t", flags: "u") -> None:
|
|
"""Do Reapply method."""
|
|
|
|
@dbus_method()
|
|
def GetAppliedConnection(self, flags: "u") -> "a{sa{sv}}t":
|
|
"""Do GetAppliedConnection method."""
|
|
return [{}, 0]
|
|
|
|
@dbus_method()
|
|
def Disconnect(self) -> None:
|
|
"""Do Disconnect method."""
|
|
|
|
@dbus_method()
|
|
def Delete(self) -> None:
|
|
"""Do Delete method."""
|