Add diagnostics to UptimeRobot (#64905)
This commit is contained in:
parent
076bc976ee
commit
1093a2b808
5 changed files with 140 additions and 9 deletions
|
@ -57,6 +57,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||||
class UptimeRobotDataUpdateCoordinator(DataUpdateCoordinator):
|
class UptimeRobotDataUpdateCoordinator(DataUpdateCoordinator):
|
||||||
"""Data update coordinator for UptimeRobot."""
|
"""Data update coordinator for UptimeRobot."""
|
||||||
|
|
||||||
|
data: list[UptimeRobotMonitor]
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
|
@ -69,17 +71,16 @@ class UptimeRobotDataUpdateCoordinator(DataUpdateCoordinator):
|
||||||
hass,
|
hass,
|
||||||
LOGGER,
|
LOGGER,
|
||||||
name=DOMAIN,
|
name=DOMAIN,
|
||||||
update_method=self._async_update_data,
|
|
||||||
update_interval=COORDINATOR_UPDATE_INTERVAL,
|
update_interval=COORDINATOR_UPDATE_INTERVAL,
|
||||||
)
|
)
|
||||||
self._config_entry_id = config_entry_id
|
self._config_entry_id = config_entry_id
|
||||||
self._device_registry = dev_reg
|
self._device_registry = dev_reg
|
||||||
self._api = api
|
self.api = api
|
||||||
|
|
||||||
async def _async_update_data(self) -> list[UptimeRobotMonitor] | None:
|
async def _async_update_data(self) -> list[UptimeRobotMonitor] | None:
|
||||||
"""Update data."""
|
"""Update data."""
|
||||||
try:
|
try:
|
||||||
response = await self._api.async_get_monitors()
|
response = await self.api.async_get_monitors()
|
||||||
except UptimeRobotAuthenticationException as exception:
|
except UptimeRobotAuthenticationException as exception:
|
||||||
raise ConfigEntryAuthFailed(exception) from exception
|
raise ConfigEntryAuthFailed(exception) from exception
|
||||||
except UptimeRobotException as exception:
|
except UptimeRobotException as exception:
|
||||||
|
|
|
@ -9,17 +9,19 @@ from homeassistant.components.binary_sensor import (
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
|
|
||||||
|
|
||||||
|
from . import UptimeRobotDataUpdateCoordinator
|
||||||
from .const import DOMAIN
|
from .const import DOMAIN
|
||||||
from .entity import UptimeRobotEntity
|
from .entity import UptimeRobotEntity
|
||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(
|
async def async_setup_entry(
|
||||||
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
hass: HomeAssistant,
|
||||||
|
entry: ConfigEntry,
|
||||||
|
async_add_entities: AddEntitiesCallback,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Set up the UptimeRobot binary_sensors."""
|
"""Set up the UptimeRobot binary_sensors."""
|
||||||
coordinator: DataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
|
coordinator: UptimeRobotDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
|
||||||
async_add_entities(
|
async_add_entities(
|
||||||
[
|
[
|
||||||
UptimeRobotBinarySensor(
|
UptimeRobotBinarySensor(
|
||||||
|
|
45
homeassistant/components/uptimerobot/diagnostics.py
Normal file
45
homeassistant/components/uptimerobot/diagnostics.py
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
"""Diagnostics support for UptimeRobot."""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from pyuptimerobot import UptimeRobotException
|
||||||
|
|
||||||
|
from homeassistant.config_entries import ConfigEntry
|
||||||
|
from homeassistant.core import HomeAssistant
|
||||||
|
|
||||||
|
from . import UptimeRobotDataUpdateCoordinator
|
||||||
|
from .const import DOMAIN
|
||||||
|
|
||||||
|
|
||||||
|
async def async_get_config_entry_diagnostics(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
entry: ConfigEntry,
|
||||||
|
) -> dict[str, Any]:
|
||||||
|
"""Return diagnostics for a config entry."""
|
||||||
|
coordinator: UptimeRobotDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
|
||||||
|
account: dict[str, Any] | str | None = None
|
||||||
|
try:
|
||||||
|
response = await coordinator.api.async_get_account_details()
|
||||||
|
except UptimeRobotException as err:
|
||||||
|
account = str(err)
|
||||||
|
else:
|
||||||
|
if (details := response.data) is not None:
|
||||||
|
account = {
|
||||||
|
"up_monitors": details.up_monitors,
|
||||||
|
"down_monitors": details.down_monitors,
|
||||||
|
"paused_monitors": details.paused_monitors,
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
"account": account,
|
||||||
|
"monitors": [
|
||||||
|
{
|
||||||
|
"id": monitor.id,
|
||||||
|
"type": str(monitor.type),
|
||||||
|
"interval": monitor.interval,
|
||||||
|
"status": monitor.status,
|
||||||
|
}
|
||||||
|
for monitor in coordinator.data
|
||||||
|
],
|
||||||
|
}
|
|
@ -20,10 +20,15 @@ from homeassistant.core import HomeAssistant
|
||||||
|
|
||||||
from tests.common import MockConfigEntry
|
from tests.common import MockConfigEntry
|
||||||
|
|
||||||
MOCK_UPTIMEROBOT_API_KEY = "1234"
|
MOCK_UPTIMEROBOT_API_KEY = "0242ac120003"
|
||||||
|
MOCK_UPTIMEROBOT_EMAIL = "test@test.test"
|
||||||
MOCK_UPTIMEROBOT_UNIQUE_ID = "1234567890"
|
MOCK_UPTIMEROBOT_UNIQUE_ID = "1234567890"
|
||||||
|
|
||||||
MOCK_UPTIMEROBOT_ACCOUNT = {"email": "test@test.test", "user_id": 1234567890}
|
MOCK_UPTIMEROBOT_ACCOUNT = {
|
||||||
|
"email": MOCK_UPTIMEROBOT_EMAIL,
|
||||||
|
"user_id": 1234567890,
|
||||||
|
"up_monitors": 1,
|
||||||
|
}
|
||||||
MOCK_UPTIMEROBOT_ERROR = {"message": "test error from API."}
|
MOCK_UPTIMEROBOT_ERROR = {"message": "test error from API."}
|
||||||
MOCK_UPTIMEROBOT_MONITOR = {
|
MOCK_UPTIMEROBOT_MONITOR = {
|
||||||
"id": 1234,
|
"id": 1234,
|
||||||
|
@ -35,7 +40,7 @@ MOCK_UPTIMEROBOT_MONITOR = {
|
||||||
|
|
||||||
MOCK_UPTIMEROBOT_CONFIG_ENTRY_DATA = {
|
MOCK_UPTIMEROBOT_CONFIG_ENTRY_DATA = {
|
||||||
"domain": DOMAIN,
|
"domain": DOMAIN,
|
||||||
"title": "test@test.test",
|
"title": MOCK_UPTIMEROBOT_EMAIL,
|
||||||
"data": {"platform": DOMAIN, "api_key": MOCK_UPTIMEROBOT_API_KEY},
|
"data": {"platform": DOMAIN, "api_key": MOCK_UPTIMEROBOT_API_KEY},
|
||||||
"unique_id": MOCK_UPTIMEROBOT_UNIQUE_ID,
|
"unique_id": MOCK_UPTIMEROBOT_UNIQUE_ID,
|
||||||
"source": config_entries.SOURCE_USER,
|
"source": config_entries.SOURCE_USER,
|
||||||
|
|
78
tests/components/uptimerobot/test_diagnostics.py
Normal file
78
tests/components/uptimerobot/test_diagnostics.py
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
"""Test UptimeRobot diagnostics."""
|
||||||
|
import json
|
||||||
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
from aiohttp import ClientSession
|
||||||
|
from pyuptimerobot import UptimeRobotException
|
||||||
|
|
||||||
|
from homeassistant.core import HomeAssistant
|
||||||
|
|
||||||
|
from .common import (
|
||||||
|
MOCK_UPTIMEROBOT_ACCOUNT,
|
||||||
|
MOCK_UPTIMEROBOT_API_KEY,
|
||||||
|
MOCK_UPTIMEROBOT_EMAIL,
|
||||||
|
MockApiResponseKey,
|
||||||
|
mock_uptimerobot_api_response,
|
||||||
|
setup_uptimerobot_integration,
|
||||||
|
)
|
||||||
|
|
||||||
|
from tests.components.diagnostics import get_diagnostics_for_config_entry
|
||||||
|
|
||||||
|
|
||||||
|
async def test_entry_diagnostics(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
hass_client: ClientSession,
|
||||||
|
) -> None:
|
||||||
|
"""Test config entry diagnostics."""
|
||||||
|
entry = await setup_uptimerobot_integration(hass)
|
||||||
|
|
||||||
|
with patch(
|
||||||
|
"pyuptimerobot.UptimeRobot.async_get_account_details",
|
||||||
|
return_value=mock_uptimerobot_api_response(
|
||||||
|
key=MockApiResponseKey.ACCOUNT,
|
||||||
|
data=MOCK_UPTIMEROBOT_ACCOUNT,
|
||||||
|
),
|
||||||
|
):
|
||||||
|
|
||||||
|
result = await get_diagnostics_for_config_entry(
|
||||||
|
hass,
|
||||||
|
hass_client,
|
||||||
|
entry,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["account"] == {
|
||||||
|
"down_monitors": 0,
|
||||||
|
"paused_monitors": 0,
|
||||||
|
"up_monitors": 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
assert result["monitors"] == [
|
||||||
|
{"id": 1234, "interval": 0, "status": 2, "type": "MonitorType.HTTP"}
|
||||||
|
]
|
||||||
|
|
||||||
|
assert list(result.keys()) == ["account", "monitors"]
|
||||||
|
|
||||||
|
result_dump = json.dumps(result)
|
||||||
|
assert MOCK_UPTIMEROBOT_EMAIL not in result_dump
|
||||||
|
assert MOCK_UPTIMEROBOT_API_KEY not in result_dump
|
||||||
|
|
||||||
|
|
||||||
|
async def test_entry_diagnostics_exception(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
hass_client: ClientSession,
|
||||||
|
) -> None:
|
||||||
|
"""Test config entry diagnostics with exception."""
|
||||||
|
entry = await setup_uptimerobot_integration(hass)
|
||||||
|
|
||||||
|
with patch(
|
||||||
|
"pyuptimerobot.UptimeRobot.async_get_account_details",
|
||||||
|
side_effect=UptimeRobotException("Test exception"),
|
||||||
|
):
|
||||||
|
|
||||||
|
result = await get_diagnostics_for_config_entry(
|
||||||
|
hass,
|
||||||
|
hass_client,
|
||||||
|
entry,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["account"] == "Test exception"
|
Loading…
Add table
Add a link
Reference in a new issue