mirror of
https://github.com/home-assistant/core.git
synced 2026-08-24 10:13:52 -05:00
356 lines
9.8 KiB
Python
356 lines
9.8 KiB
Python
"""Test hassio system health."""
|
|
|
|
import asyncio
|
|
from ipaddress import IPv4Address, IPv4Network
|
|
import os
|
|
from unittest.mock import patch
|
|
|
|
from aiohasupervisor.models import (
|
|
AddonStage,
|
|
AddonState,
|
|
DockerNetwork,
|
|
HostInfo,
|
|
InstalledAddon,
|
|
InterfaceMethod,
|
|
InterfaceType,
|
|
IPv4,
|
|
LogLevel,
|
|
NetworkInfo,
|
|
NetworkInterface,
|
|
OSInfo,
|
|
RootInfo,
|
|
SupervisorInfo,
|
|
SupervisorState,
|
|
UpdateChannel,
|
|
)
|
|
from aiohttp import ClientError
|
|
import pytest
|
|
|
|
from homeassistant.components.hassio.const import (
|
|
DATA_ADDONS_LIST,
|
|
DATA_HOST_INFO,
|
|
DATA_INFO,
|
|
DATA_NETWORK_INFO,
|
|
DATA_OS_INFO,
|
|
DATA_SUPERVISOR_INFO,
|
|
)
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.setup import async_setup_component
|
|
|
|
from .test_init import MOCK_ENVIRON
|
|
|
|
from tests.common import get_system_health_info
|
|
from tests.test_util.aiohttp import AiohttpClientMocker
|
|
|
|
|
|
@pytest.mark.usefixtures(
|
|
"supervisor_root_info", "host_info", "os_info", "supervisor_info"
|
|
)
|
|
async def test_hassio_system_health(
|
|
hass: HomeAssistant, aioclient_mock: AiohttpClientMocker
|
|
) -> None:
|
|
"""Test hassio system health."""
|
|
aioclient_mock.get("http://127.0.0.1/supervisor/ping", text="")
|
|
aioclient_mock.get("https://version.home-assistant.io/stable.json", text="")
|
|
|
|
hass.config.components.add("hassio")
|
|
assert await async_setup_component(hass, "system_health", {})
|
|
await hass.async_block_till_done()
|
|
|
|
hass.data[DATA_INFO] = RootInfo(
|
|
supervisor="2020.11.1",
|
|
homeassistant=None,
|
|
hassos="5.9",
|
|
docker="19.0.3",
|
|
hostname=None,
|
|
operating_system=None,
|
|
features=[],
|
|
machine=None,
|
|
machine_id=None,
|
|
arch="aarch64",
|
|
state=SupervisorState.RUNNING,
|
|
supported_arch=[],
|
|
supported=True,
|
|
channel=UpdateChannel.STABLE,
|
|
logging=LogLevel.INFO,
|
|
timezone="Etc/UTC",
|
|
)
|
|
hass.data[DATA_HOST_INFO] = HostInfo(
|
|
agent_version="1337",
|
|
apparmor_version=None,
|
|
chassis="vm",
|
|
virtualization="qemu",
|
|
cpe=None,
|
|
deployment=None,
|
|
disk_free=1.6,
|
|
disk_total=32.0,
|
|
disk_used=30.0,
|
|
disk_life_time=25.0,
|
|
features=[],
|
|
hostname=None,
|
|
llmnr_hostname=None,
|
|
kernel="4.19.0",
|
|
operating_system="Home Assistant OS 5.9",
|
|
timezone=None,
|
|
dt_utc=None,
|
|
dt_synchronized=True,
|
|
use_ntp=None,
|
|
startup_time=None,
|
|
boot_timestamp=None,
|
|
broadcast_llmnr=None,
|
|
broadcast_mdns=None,
|
|
)
|
|
hass.data[DATA_OS_INFO] = OSInfo(
|
|
version="5.9",
|
|
version_pending=None,
|
|
version_latest="5.9",
|
|
update_available=False,
|
|
board="odroid-n2",
|
|
boot=None,
|
|
data_disk=None,
|
|
boot_slots={},
|
|
)
|
|
hass.data[DATA_SUPERVISOR_INFO] = SupervisorInfo(
|
|
version="1.0.0",
|
|
version_latest="1.0.0",
|
|
update_available=False,
|
|
channel=UpdateChannel.STABLE,
|
|
arch="aarch64",
|
|
supported=True,
|
|
healthy=True,
|
|
ip_address=IPv4Address("172.30.32.2"),
|
|
timezone=None,
|
|
logging=LogLevel.INFO,
|
|
debug=False,
|
|
debug_block=False,
|
|
diagnostics=None,
|
|
auto_update=True,
|
|
country=None,
|
|
detect_blocking_io=False,
|
|
feature_flags={},
|
|
)
|
|
hass.data[DATA_ADDONS_LIST] = [
|
|
InstalledAddon(
|
|
detached=False,
|
|
advanced=False,
|
|
available=True,
|
|
build=False,
|
|
description="",
|
|
homeassistant=None,
|
|
icon=False,
|
|
logo=False,
|
|
name="Awesome Addon",
|
|
repository="core",
|
|
slug="test",
|
|
stage=AddonStage.STABLE,
|
|
update_available=False,
|
|
url=None,
|
|
version_latest="1.0.0",
|
|
version="1.0.0",
|
|
state=AddonState.STARTED,
|
|
)
|
|
]
|
|
hass.data[DATA_NETWORK_INFO] = NetworkInfo(
|
|
interfaces=[
|
|
NetworkInterface(
|
|
interface="eth0",
|
|
type=InterfaceType.ETHERNET,
|
|
enabled=True,
|
|
connected=True,
|
|
primary=False,
|
|
mac="aa:bb:cc:dd:ee:01",
|
|
ipv4=IPv4(
|
|
method=InterfaceMethod.AUTO,
|
|
ready=True,
|
|
address=[],
|
|
nameservers=[IPv4Address("9.9.9.9")],
|
|
gateway=None,
|
|
route_metric=None,
|
|
),
|
|
ipv6=None,
|
|
wifi=None,
|
|
vlan=None,
|
|
mdns=None,
|
|
llmnr=None,
|
|
),
|
|
NetworkInterface(
|
|
interface="eth1",
|
|
type=InterfaceType.ETHERNET,
|
|
enabled=True,
|
|
connected=True,
|
|
primary=True,
|
|
mac="aa:bb:cc:dd:ee:02",
|
|
ipv4=IPv4(
|
|
method=InterfaceMethod.AUTO,
|
|
ready=True,
|
|
address=[],
|
|
nameservers=[IPv4Address("1.1.1.1")],
|
|
gateway=None,
|
|
route_metric=None,
|
|
),
|
|
ipv6=None,
|
|
wifi=None,
|
|
vlan=None,
|
|
mdns=None,
|
|
llmnr=None,
|
|
),
|
|
],
|
|
docker=DockerNetwork(
|
|
interface="hassio",
|
|
address=IPv4Network("172.30.32.0/23"),
|
|
gateway=IPv4Address("172.30.32.1"),
|
|
dns=IPv4Address("172.30.32.3"),
|
|
),
|
|
host_internet=True,
|
|
supervisor_internet=True,
|
|
)
|
|
|
|
with patch.dict(os.environ, MOCK_ENVIRON):
|
|
info = await get_system_health_info(hass, "hassio")
|
|
|
|
for key, val in info.items():
|
|
if asyncio.iscoroutine(val):
|
|
info[key] = await val
|
|
|
|
assert info == {
|
|
"agent_version": "1337",
|
|
"board": "odroid-n2",
|
|
"disk_total": "32.0 GB",
|
|
"disk_used": "30.0 GB",
|
|
"disk_life_time": "25 %",
|
|
"docker_version": "19.0.3",
|
|
"healthy": True,
|
|
"host_connectivity": True,
|
|
"supervisor_connectivity": True,
|
|
"host_os": "Home Assistant OS 5.9",
|
|
"installed_addons": "Awesome Addon (1.0.0)",
|
|
"ntp_synchronized": True,
|
|
"nameservers": "1.1.1.1",
|
|
"supervisor_api": "ok",
|
|
"supervisor_version": "supervisor-2020.11.1",
|
|
"supported": True,
|
|
"update_channel": "stable",
|
|
"version_api": "ok",
|
|
"virtualization": "qemu",
|
|
}
|
|
|
|
|
|
@pytest.mark.usefixtures(
|
|
"supervisor_root_info", "host_info", "os_info", "supervisor_info"
|
|
)
|
|
async def test_hassio_system_health_with_issues(
|
|
hass: HomeAssistant, aioclient_mock: AiohttpClientMocker
|
|
) -> None:
|
|
"""Test hassio system health."""
|
|
aioclient_mock.get("http://127.0.0.1/supervisor/ping", text="")
|
|
aioclient_mock.get("https://version.home-assistant.io/stable.json", exc=ClientError)
|
|
|
|
hass.config.components.add("hassio")
|
|
assert await async_setup_component(hass, "system_health", {})
|
|
await hass.async_block_till_done()
|
|
|
|
hass.data[DATA_INFO] = RootInfo(
|
|
supervisor="1.0.0",
|
|
homeassistant=None,
|
|
hassos=None,
|
|
docker="19.0.3",
|
|
hostname=None,
|
|
operating_system=None,
|
|
features=[],
|
|
machine=None,
|
|
machine_id=None,
|
|
arch="aarch64",
|
|
state=SupervisorState.RUNNING,
|
|
supported_arch=[],
|
|
supported=True,
|
|
channel=UpdateChannel.STABLE,
|
|
logging=LogLevel.INFO,
|
|
timezone="Etc/UTC",
|
|
)
|
|
hass.data[DATA_HOST_INFO] = HostInfo(
|
|
agent_version=None,
|
|
apparmor_version=None,
|
|
chassis="vm",
|
|
virtualization=None,
|
|
cpe=None,
|
|
deployment=None,
|
|
disk_free=1.6,
|
|
disk_total=100.0,
|
|
disk_used=98.4,
|
|
disk_life_time=None,
|
|
features=[],
|
|
hostname=None,
|
|
llmnr_hostname=None,
|
|
kernel=None,
|
|
operating_system=None,
|
|
timezone=None,
|
|
dt_utc=None,
|
|
dt_synchronized=None,
|
|
use_ntp=None,
|
|
startup_time=None,
|
|
boot_timestamp=None,
|
|
broadcast_llmnr=None,
|
|
broadcast_mdns=None,
|
|
)
|
|
hass.data[DATA_OS_INFO] = OSInfo(
|
|
version=None,
|
|
version_pending=None,
|
|
version_latest=None,
|
|
update_available=False,
|
|
board=None,
|
|
boot=None,
|
|
data_disk=None,
|
|
boot_slots={},
|
|
)
|
|
hass.data[DATA_SUPERVISOR_INFO] = SupervisorInfo(
|
|
version="1.0.0",
|
|
version_latest="1.0.0",
|
|
update_available=False,
|
|
channel=UpdateChannel.STABLE,
|
|
arch="aarch64",
|
|
supported=False,
|
|
healthy=False,
|
|
ip_address=IPv4Address("172.30.32.2"),
|
|
timezone=None,
|
|
logging=LogLevel.INFO,
|
|
debug=False,
|
|
debug_block=False,
|
|
diagnostics=None,
|
|
auto_update=True,
|
|
country=None,
|
|
detect_blocking_io=False,
|
|
feature_flags={},
|
|
)
|
|
hass.data[DATA_NETWORK_INFO] = NetworkInfo(
|
|
interfaces=[],
|
|
docker=DockerNetwork(
|
|
interface="hassio",
|
|
address=IPv4Network("172.30.32.0/23"),
|
|
gateway=IPv4Address("172.30.32.1"),
|
|
dns=IPv4Address("172.30.32.3"),
|
|
),
|
|
host_internet=None,
|
|
supervisor_internet=False,
|
|
)
|
|
hass.data[DATA_ADDONS_LIST] = []
|
|
|
|
with patch.dict(os.environ, MOCK_ENVIRON):
|
|
info = await get_system_health_info(hass, "hassio")
|
|
|
|
for key, val in info.items():
|
|
if asyncio.iscoroutine(val):
|
|
info[key] = await val
|
|
|
|
assert info["healthy"] == {
|
|
"error": "Unhealthy",
|
|
"type": "failed",
|
|
}
|
|
assert info["supported"] == {
|
|
"error": "Unsupported",
|
|
"type": "failed",
|
|
}
|
|
assert info["version_api"] == {
|
|
"error": "unreachable",
|
|
"type": "failed",
|
|
}
|