Limit add-on stats to add-ons that are running (#58479)

This commit is contained in:
Joakim Sørensen 2021-10-26 19:58:17 +02:00 committed by GitHub
parent 8b021ea06b
commit f15840e7ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 42 additions and 24 deletions

View file

@ -46,6 +46,8 @@ from .const import (
ATTR_PASSWORD,
ATTR_REPOSITORY,
ATTR_SLUG,
ATTR_STARTED,
ATTR_STATE,
ATTR_URL,
ATTR_VERSION,
DATA_KEY_ADDONS,
@ -539,12 +541,13 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: # noqa:
hassio.get_os_info(),
)
addon_slugs = [
addon[ATTR_SLUG]
addons = [
addon
for addon in hass.data[DATA_SUPERVISOR_INFO].get("addons", [])
if addon[ATTR_STATE] == ATTR_STARTED
]
stats_data = await asyncio.gather(
*[update_addon_stats(slug) for slug in addon_slugs]
*[update_addon_stats(addon[ATTR_SLUG]) for addon in addons]
)
hass.data[DATA_ADDONS_STATS] = dict(stats_data)

View file

@ -14,7 +14,13 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import ADDONS_COORDINATOR
from .const import ATTR_STATE, ATTR_UPDATE_AVAILABLE, DATA_KEY_ADDONS, DATA_KEY_OS
from .const import (
ATTR_STARTED,
ATTR_STATE,
ATTR_UPDATE_AVAILABLE,
DATA_KEY_ADDONS,
DATA_KEY_OS,
)
from .entity import HassioAddonEntity, HassioOSEntity
@ -37,7 +43,7 @@ ENTITY_DESCRIPTIONS = (
entity_registry_enabled_default=False,
key=ATTR_STATE,
name="Running",
target="started",
target=ATTR_STARTED,
),
)

View file

@ -46,6 +46,7 @@ ATTR_CPU_PERCENT = "cpu_percent"
ATTR_MEMORY_PERCENT = "memory_percent"
ATTR_SLUG = "slug"
ATTR_STATE = "state"
ATTR_STARTED = "started"
ATTR_URL = "url"
ATTR_REPOSITORY = "repository"

View file

@ -8,7 +8,7 @@ from homeassistant.helpers.entity import DeviceInfo, EntityDescription
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from . import DOMAIN, HassioDataUpdateCoordinator
from .const import ATTR_SLUG
from .const import ATTR_SLUG, DATA_KEY_ADDONS, DATA_KEY_OS
class HassioAddonEntity(CoordinatorEntity):
@ -28,6 +28,15 @@ class HassioAddonEntity(CoordinatorEntity):
self._attr_unique_id = f"{addon[ATTR_SLUG]}_{entity_description.key}"
self._attr_device_info = DeviceInfo(identifiers={(DOMAIN, addon[ATTR_SLUG])})
@property
def available(self) -> bool:
"""Return True if entity is available."""
return (
super().available
and self.entity_description.key
in self.coordinator.data[DATA_KEY_ADDONS][self._addon_slug]
)
class HassioOSEntity(CoordinatorEntity):
"""Base Entity for Hass.io OS."""
@ -43,3 +52,11 @@ class HassioOSEntity(CoordinatorEntity):
self._attr_name = f"Home Assistant Operating System: {entity_description.name}"
self._attr_unique_id = f"home_assistant_os_{entity_description.key}"
self._attr_device_info = DeviceInfo(identifiers={(DOMAIN, "OS")})
@property
def available(self) -> bool:
"""Return True if entity is available."""
return (
super().available
and self.entity_description.key in self.coordinator.data[DATA_KEY_OS]
)

View file

@ -493,6 +493,7 @@ async def test_device_registry_calls(hass):
"addons": [
{
"name": "test",
"state": "started",
"slug": "test",
"installed": True,
"update_available": False,
@ -503,6 +504,7 @@ async def test_device_registry_calls(hass):
},
{
"name": "test2",
"state": "started",
"slug": "test2",
"installed": True,
"update_available": False,
@ -537,6 +539,7 @@ async def test_device_registry_calls(hass):
"addons": [
{
"name": "test2",
"state": "started",
"slug": "test2",
"installed": True,
"update_available": False,
@ -568,6 +571,7 @@ async def test_device_registry_calls(hass):
{
"name": "test2",
"slug": "test2",
"state": "started",
"installed": True,
"update_available": False,
"version": "1.0.0",
@ -577,6 +581,7 @@ async def test_device_registry_calls(hass):
{
"name": "test3",
"slug": "test3",
"state": "stopped",
"installed": True,
"update_available": False,
"version": "1.0.0",

View file

@ -66,6 +66,7 @@ def mock_all(aioclient_mock, request):
"addons": [
{
"name": "test",
"state": "started",
"slug": "test",
"installed": True,
"update_available": False,
@ -76,6 +77,7 @@ def mock_all(aioclient_mock, request):
},
{
"name": "test2",
"state": "stopped",
"slug": "test2",
"installed": True,
"update_available": False,
@ -104,22 +106,6 @@ def mock_all(aioclient_mock, request):
},
},
)
aioclient_mock.get(
"http://127.0.0.1/addons/test2/stats",
json={
"result": "ok",
"data": {
"cpu_percent": 0.8,
"memory_usage": 51941376,
"memory_limit": 3977146368,
"memory_percent": 1.31,
"network_rx": 31338284,
"network_tx": 15692900,
"blk_read": 740077568,
"blk_write": 6004736,
},
},
)
aioclient_mock.get(
"http://127.0.0.1/ingress/panels", json={"result": "ok", "data": {"panels": {}}}
)
@ -149,9 +135,9 @@ async def test_sensors(hass, aioclient_mock):
"sensor.test2_version": "3.1.0",
"sensor.test2_newest_version": "3.2.0",
"sensor.test_cpu_percent": "0.99",
"sensor.test2_cpu_percent": "0.8",
"sensor.test2_cpu_percent": "unavailable",
"sensor.test_memory_percent": "4.59",
"sensor.test2_memory_percent": "1.31",
"sensor.test2_memory_percent": "unavailable",
}
"""Check that entities are disabled by default."""