mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-11-09 10:59:43 +00:00
Network: abstract dbus and supervisor - ipv6/wifi/vlan (#2217)
* Abstract code between dbus - supervisor * cleanup v2 * fix address vs interface * fix API calls * Fix methodnames * add vlan type * add vlan support * Fix tests * Add wifi support * more OOO * fix typing import * typing part 2 * Fix profile * fix test payload * ignore powersafe * support privancy * fix property * Fix tests * full support all API * Fix all * more robust * Update supervisor/dbus/network/connection.py Co-authored-by: Joakim Sørensen <joasoe@gmail.com> * Fix gateway * fix empty gateway * Allow no ipv6 or ipv4 kernel support * Exclude device drivers * Add wifi * Use loop on api * refactory p1 Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch> * refactory p2 Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch> * refactory p3 Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch> * refactory p4 Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch> * refactory p5 Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch> * refactory p6 Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch> * refactory p7 Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch> * refactory p8 Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch> * Fix lint * update sup p1 Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch> * update sup p2 Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch> * fix tests Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch> * fix logging Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch> * improve mock handling Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch> * add fixtures Signed-off-by: Pascal Vizeli <pvizeli@syshack.ch> * fix tests * better testing * Add more tests * Fix API test * Add test for vlan payload * Support variation * Fix doc string * support remove & wifi scan * make sure we ignore local-link on ipv6 * remove privancy - add vlan * Fix tests * fix isort * Fixture dbus by commands * Add dnsmanager fixture * expose commands called by dbus * Add wifi tests * Update supervisor/plugins/dns.py Co-authored-by: Joakim Sørensen <joasoe@gmail.com> * Address comments & fix tests * change url to be closer on others Co-authored-by: Joakim Sørensen <joasoe@gmail.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
"""Common test functions."""
|
||||
from pathlib import Path
|
||||
import re
|
||||
from unittest.mock import AsyncMock, MagicMock, PropertyMock, patch
|
||||
from uuid import uuid4
|
||||
|
||||
@@ -10,13 +11,11 @@ import pytest
|
||||
from supervisor.api import RestAPI
|
||||
from supervisor.bootstrap import initialize_coresys
|
||||
from supervisor.coresys import CoreSys
|
||||
from supervisor.dbus.const import DBUS_NAME_NM, DBUS_OBJECT_BASE
|
||||
from supervisor.dbus.network import NetworkManager
|
||||
from supervisor.dbus.network.interface import NetworkInterface
|
||||
from supervisor.docker import DockerAPI
|
||||
from supervisor.utils.gdbus import DBus
|
||||
|
||||
from tests.common import load_fixture, load_json_fixture
|
||||
from tests.common import exists_fixture, load_fixture, load_json_fixture
|
||||
|
||||
# pylint: disable=redefined-outer-name, protected-access
|
||||
|
||||
@@ -53,38 +52,53 @@ def docker() -> DockerAPI:
|
||||
def dbus() -> DBus:
|
||||
"""Mock DBUS."""
|
||||
|
||||
async def mock_get_properties(_, interface):
|
||||
return load_json_fixture(f"{interface.replace('.', '_')}.json")
|
||||
dbus_commands = []
|
||||
|
||||
async def mock_get_properties(dbus_obj, interface):
|
||||
latest = dbus_obj.object_path.split("/")[-1]
|
||||
fixture = interface.replace(".", "_")
|
||||
|
||||
if latest.isnumeric():
|
||||
fixture = f"{fixture}_{latest}"
|
||||
|
||||
return load_json_fixture(f"{fixture}.json")
|
||||
|
||||
async def mock_send(_, command, silent=False):
|
||||
if silent:
|
||||
return ""
|
||||
|
||||
filetype = "xml" if "--xml" in command else "fixture"
|
||||
fixture = f"{command[6].replace('/', '_')[1:]}.{filetype}"
|
||||
return load_fixture(fixture)
|
||||
fixture = command[6].replace("/", "_")[1:]
|
||||
if command[1] == "introspect":
|
||||
filetype = "xml"
|
||||
|
||||
if not exists_fixture(f"{fixture}.{filetype}"):
|
||||
fixture = re.sub(r"_[0-9]+$", "", fixture)
|
||||
|
||||
# special case
|
||||
if exists_fixture(f"{fixture}_*.{filetype}"):
|
||||
fixture = f"{fixture}_*"
|
||||
else:
|
||||
fixture = f"{fixture}-{command[10].split('.')[-1]}"
|
||||
filetype = "fixture"
|
||||
|
||||
dbus_commands.append(fixture)
|
||||
|
||||
return load_fixture(f"{fixture}.{filetype}")
|
||||
|
||||
with patch("supervisor.utils.gdbus.DBus._send", new=mock_send), patch(
|
||||
"supervisor.dbus.interface.DBusInterface.is_connected",
|
||||
return_value=True,
|
||||
), patch("supervisor.utils.gdbus.DBus.get_properties", new=mock_get_properties):
|
||||
|
||||
dbus_obj = DBus(DBUS_NAME_NM, DBUS_OBJECT_BASE)
|
||||
|
||||
yield dbus_obj
|
||||
yield dbus_commands
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
async def network_manager(dbus) -> NetworkManager:
|
||||
"""Mock NetworkManager."""
|
||||
|
||||
async def dns_update():
|
||||
pass
|
||||
|
||||
with patch("supervisor.dbus.network.NetworkManager.dns", return_value=MagicMock()):
|
||||
nm_obj = NetworkManager()
|
||||
nm_obj.dns.update = dns_update
|
||||
nm_obj = NetworkManager()
|
||||
nm_obj.dbus = dbus
|
||||
|
||||
# Init
|
||||
await nm_obj.connect()
|
||||
await nm_obj.update()
|
||||
|
||||
@@ -92,7 +106,7 @@ async def network_manager(dbus) -> NetworkManager:
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
async def coresys(loop, docker, dbus, network_manager, aiohttp_client) -> CoreSys:
|
||||
async def coresys(loop, docker, network_manager, aiohttp_client) -> CoreSys:
|
||||
"""Create a CoreSys Mock."""
|
||||
with patch("supervisor.bootstrap.initialize_system_data"), patch(
|
||||
"supervisor.bootstrap.setup_diagnostics"
|
||||
@@ -106,10 +120,10 @@ async def coresys(loop, docker, dbus, network_manager, aiohttp_client) -> CoreSy
|
||||
coresys_obj = await initialize_coresys()
|
||||
|
||||
# Mock save json
|
||||
coresys_obj.ingress.save_data = MagicMock()
|
||||
coresys_obj.auth.save_data = MagicMock()
|
||||
coresys_obj.updater.save_data = MagicMock()
|
||||
coresys_obj.config.save_data = MagicMock()
|
||||
coresys_obj._ingress.save_data = MagicMock()
|
||||
coresys_obj._auth.save_data = MagicMock()
|
||||
coresys_obj._updater.save_data = MagicMock()
|
||||
coresys_obj._config.save_data = MagicMock()
|
||||
|
||||
# Mock test client
|
||||
coresys_obj.arch._default_arch = "amd64"
|
||||
@@ -117,8 +131,7 @@ async def coresys(loop, docker, dbus, network_manager, aiohttp_client) -> CoreSy
|
||||
coresys_obj._machine_id = uuid4()
|
||||
|
||||
# Mock host communication
|
||||
coresys_obj._dbus = dbus
|
||||
coresys_obj._dbus.network = network_manager
|
||||
coresys_obj._dbus._network = network_manager
|
||||
|
||||
# Mock docker
|
||||
coresys_obj._docker = docker
|
||||
@@ -153,15 +166,6 @@ async def api_client(aiohttp_client, coresys: CoreSys):
|
||||
yield await aiohttp_client(api.webapp)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
async def network_interface(dbus):
|
||||
"""Fixture for a network interface."""
|
||||
interface = NetworkInterface()
|
||||
await interface.connect(dbus, "/org/freedesktop/NetworkManager/ActiveConnection/1")
|
||||
await interface.connection.update_information()
|
||||
yield interface
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def store_manager(coresys: CoreSys):
|
||||
"""Fixture for the store manager."""
|
||||
|
||||
Reference in New Issue
Block a user