Fix system_info importing hassio in the event loop (#113903)

This commit is contained in:
J. Nick Koston 2024-03-20 12:06:40 -10:00 committed by GitHub
parent ac175a4240
commit 267fe3dc34
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 15 additions and 6 deletions

View File

@ -7,13 +7,15 @@ from getpass import getuser
import logging import logging
import os import os
import platform import platform
from typing import Any from typing import TYPE_CHECKING, Any
from homeassistant.const import __version__ as current_version from homeassistant.const import __version__ as current_version
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.loader import bind_hass from homeassistant.loader import bind_hass
from homeassistant.util.package import is_docker_env, is_virtual_env from homeassistant.util.package import is_docker_env, is_virtual_env
from .importlib import async_import_module
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -32,8 +34,14 @@ cached_get_user = cache(getuser)
async def async_get_system_info(hass: HomeAssistant) -> dict[str, Any]: async def async_get_system_info(hass: HomeAssistant) -> dict[str, Any]:
"""Return info about the system.""" """Return info about the system."""
# Local import to avoid circular dependencies # Local import to avoid circular dependencies
# pylint: disable-next=import-outside-toplevel # We use the import helper because hassio
from homeassistant.components import hassio # may not be loaded yet and we don't want to
# do blocking I/O in the event loop to import it.
if TYPE_CHECKING:
# pylint: disable-next=import-outside-toplevel
from homeassistant.components import hassio
else:
hassio = await async_import_module(hass, "homeassistant.components.hassio")
is_hassio = hassio.is_hassio(hass) is_hassio = hassio.is_hassio(hass)

View File

@ -6,6 +6,7 @@ from unittest.mock import patch
import pytest import pytest
from homeassistant.components import hassio
from homeassistant.const import __version__ as current_version from homeassistant.const import __version__ as current_version
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.system_info import async_get_system_info, is_official_image from homeassistant.helpers.system_info import async_get_system_info, is_official_image
@ -39,8 +40,8 @@ async def test_get_system_info_supervisor_not_available(
"homeassistant.helpers.system_info.is_docker_env", return_value=True "homeassistant.helpers.system_info.is_docker_env", return_value=True
), patch( ), patch(
"homeassistant.helpers.system_info.is_official_image", return_value=True "homeassistant.helpers.system_info.is_official_image", return_value=True
), patch("homeassistant.components.hassio.is_hassio", return_value=True), patch( ), patch.object(hassio, "is_hassio", return_value=True), patch.object(
"homeassistant.components.hassio.get_info", return_value=None hassio, "get_info", return_value=None
), patch("homeassistant.helpers.system_info.cached_get_user", return_value="root"): ), patch("homeassistant.helpers.system_info.cached_get_user", return_value="root"):
info = await async_get_system_info(hass) info = await async_get_system_info(hass)
assert isinstance(info, dict) assert isinstance(info, dict)
@ -57,7 +58,7 @@ async def test_get_system_info_supervisor_not_loaded(hass: HomeAssistant) -> Non
"homeassistant.helpers.system_info.is_docker_env", return_value=True "homeassistant.helpers.system_info.is_docker_env", return_value=True
), patch( ), patch(
"homeassistant.helpers.system_info.is_official_image", return_value=True "homeassistant.helpers.system_info.is_official_image", return_value=True
), patch("homeassistant.components.hassio.get_info", return_value=None), patch.dict( ), patch.object(hassio, "get_info", return_value=None), patch.dict(
os.environ, {"SUPERVISOR": "127.0.0.1"} os.environ, {"SUPERVISOR": "127.0.0.1"}
): ):
info = await async_get_system_info(hass) info = await async_get_system_info(hass)