Skip to content

Commit 673f022

Browse files
authored
Continue migration of methods from handler to aiohasupervisor (#129183)
1 parent 79c602f commit 673f022

24 files changed

+906
-667
lines changed

homeassistant/components/hassio/__init__.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import re
1111
from typing import Any, NamedTuple
1212

13+
from aiohasupervisor import SupervisorError
1314
import voluptuous as vol
1415

1516
from homeassistant.auth.const import GROUP_ID_ADMIN
@@ -101,16 +102,12 @@
101102
HassIO,
102103
HassioAPIError,
103104
async_create_backup,
104-
async_get_addon_discovery_info,
105105
async_get_green_settings,
106106
async_get_yellow_settings,
107107
async_reboot_host,
108108
async_set_green_settings,
109109
async_set_yellow_settings,
110-
async_update_core,
111110
async_update_diagnostics,
112-
async_update_os,
113-
async_update_supervisor,
114111
get_supervisor_client,
115112
)
116113
from .http import HassIOView
@@ -310,8 +307,11 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: # noqa:
310307
host = os.environ["SUPERVISOR"]
311308
websession = async_get_clientsession(hass)
312309
hass.data[DOMAIN] = hassio = HassIO(hass.loop, websession, host)
310+
supervisor_client = get_supervisor_client(hass)
313311

314-
if not await hassio.is_connected():
312+
try:
313+
await supervisor_client.supervisor.ping()
314+
except SupervisorError:
315315
_LOGGER.warning("Not connected with the supervisor / system too busy!")
316316

317317
store = Store[dict[str, str]](hass, STORAGE_VERSION, STORAGE_KEY)
@@ -468,9 +468,9 @@ async def update_info_data(_: datetime | None = None) -> None:
468468
async def _async_stop(hass: HomeAssistant, restart: bool) -> None:
469469
"""Stop or restart home assistant."""
470470
if restart:
471-
await hassio.restart_homeassistant()
471+
await supervisor_client.homeassistant.restart()
472472
else:
473-
await hassio.stop_homeassistant()
473+
await supervisor_client.homeassistant.stop()
474474

475475
# Set a custom handler for the homeassistant.restart and homeassistant.stop services
476476
async_set_stop_handler(hass, _async_stop)

homeassistant/components/hassio/addon_manager.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,7 @@
2121
from homeassistant.core import HomeAssistant, callback
2222
from homeassistant.exceptions import HomeAssistantError
2323

24-
from .handler import (
25-
HassioAPIError,
26-
async_create_backup,
27-
async_get_addon_discovery_info,
28-
get_supervisor_client,
29-
)
24+
from .handler import HassioAPIError, async_create_backup, get_supervisor_client
3025

3126
type _FuncType[_T, **_P, _R] = Callable[Concatenate[_T, _P], Awaitable[_R]]
3227
type _ReturnFuncType[_T, **_P, _R] = Callable[
@@ -128,18 +123,25 @@ def task_in_progress(self) -> bool:
128123
)
129124
)
130125

131-
@api_error("Failed to get the {addon_name} add-on discovery info")
126+
@api_error(
127+
"Failed to get the {addon_name} add-on discovery info",
128+
expected_error_type=SupervisorError,
129+
)
132130
async def async_get_addon_discovery_info(self) -> dict:
133131
"""Return add-on discovery info."""
134-
discovery_info = await async_get_addon_discovery_info(
135-
self._hass, self.addon_slug
132+
discovery_info = next(
133+
(
134+
msg
135+
for msg in await self._supervisor_client.discovery.list()
136+
if msg.addon == self.addon_slug
137+
),
138+
None,
136139
)
137140

138141
if not discovery_info:
139142
raise AddonError(f"Failed to get {self.addon_name} add-on discovery info")
140143

141-
discovery_info_config: dict = discovery_info["config"]
142-
return discovery_info_config
144+
return discovery_info.config
143145

144146
@api_error(
145147
"Failed to get the {addon_name} add-on info",

homeassistant/components/hassio/coordinator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -563,8 +563,8 @@ async def _async_refresh(
563563
# updates if this is not a scheduled refresh and
564564
# we are not doing the first refresh.
565565
try:
566-
await self.hassio.refresh_updates()
567-
except HassioAPIError as err:
566+
await self.supervisor_client.refresh_updates()
567+
except SupervisorError as err:
568568
_LOGGER.warning("Error on Supervisor API: %s", err)
569569

570570
await super()._async_refresh(

homeassistant/components/hassio/discovery.py

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from typing import Any
99

1010
from aiohasupervisor import SupervisorError
11+
from aiohasupervisor.models import Discovery
1112
from aiohttp import web
1213
from aiohttp.web_exceptions import HTTPServiceUnavailable
1314

@@ -19,8 +20,8 @@
1920
from homeassistant.helpers import discovery_flow
2021
from homeassistant.helpers.dispatcher import async_dispatcher_connect
2122

22-
from .const import ATTR_ADDON, ATTR_CONFIG, ATTR_DISCOVERY, ATTR_UUID, DOMAIN
23-
from .handler import HassIO, HassioAPIError, get_supervisor_client
23+
from .const import ATTR_ADDON, ATTR_UUID, DOMAIN
24+
from .handler import HassIO, get_supervisor_client
2425

2526
_LOGGER = logging.getLogger(__name__)
2627

@@ -39,20 +40,21 @@ class HassioServiceInfo(BaseServiceInfo):
3940
def async_setup_discovery_view(hass: HomeAssistant, hassio: HassIO) -> None:
4041
"""Discovery setup."""
4142
hassio_discovery = HassIODiscovery(hass, hassio)
43+
supervisor_client = get_supervisor_client(hass)
4244
hass.http.register_view(hassio_discovery)
4345

4446
# Handle exists discovery messages
4547
async def _async_discovery_start_handler(event: Event) -> None:
4648
"""Process all exists discovery on startup."""
4749
try:
48-
data = await hassio.retrieve_discovery_messages()
49-
except HassioAPIError as err:
50+
data = await supervisor_client.discovery.list()
51+
except SupervisorError as err:
5052
_LOGGER.error("Can't read discover info: %s", err)
5153
return
5254

5355
jobs = [
5456
asyncio.create_task(hassio_discovery.async_process_new(discovery))
55-
for discovery in data[ATTR_DISCOVERY]
57+
for discovery in data
5658
]
5759
if jobs:
5860
await asyncio.wait(jobs)
@@ -95,8 +97,8 @@ async def post(self, request: web.Request, uuid: str) -> web.Response:
9597
"""Handle new discovery requests."""
9698
# Fetch discovery data and prevent injections
9799
try:
98-
data = await self.hassio.get_discovery_message(uuid)
99-
except HassioAPIError as err:
100+
data = await self._supervisor_client.discovery.get(uuid)
101+
except SupervisorError as err:
100102
_LOGGER.error("Can't read discovery data: %s", err)
101103
raise HTTPServiceUnavailable from None
102104

@@ -113,52 +115,50 @@ async def delete(self, request: web.Request, uuid: str) -> web.Response:
113115
async def async_rediscover(self, uuid: str) -> None:
114116
"""Rediscover add-on when config entry is removed."""
115117
try:
116-
data = await self.hassio.get_discovery_message(uuid)
117-
except HassioAPIError as err:
118+
data = await self._supervisor_client.discovery.get(uuid)
119+
except SupervisorError as err:
118120
_LOGGER.debug("Can't read discovery data: %s", err)
119121
else:
120122
await self.async_process_new(data)
121123

122-
async def async_process_new(self, data: dict[str, Any]) -> None:
124+
async def async_process_new(self, data: Discovery) -> None:
123125
"""Process add discovery entry."""
124-
service: str = data[ATTR_SERVICE]
125-
config_data: dict[str, Any] = data[ATTR_CONFIG]
126-
slug: str = data[ATTR_ADDON]
127-
uuid: str = data[ATTR_UUID]
128-
129126
# Read additional Add-on info
130127
try:
131-
addon_info = await self._supervisor_client.addons.addon_info(slug)
128+
addon_info = await self._supervisor_client.addons.addon_info(data.addon)
132129
except SupervisorError as err:
133130
_LOGGER.error("Can't read add-on info: %s", err)
134131
return
135132

136-
config_data[ATTR_ADDON] = addon_info.name
133+
data.config[ATTR_ADDON] = addon_info.name
137134

138135
# Use config flow
139136
discovery_flow.async_create_flow(
140137
self.hass,
141-
service,
138+
data.service,
142139
context={"source": config_entries.SOURCE_HASSIO},
143140
data=HassioServiceInfo(
144-
config=config_data, name=addon_info.name, slug=slug, uuid=uuid
141+
config=data.config,
142+
name=addon_info.name,
143+
slug=data.addon,
144+
uuid=data.uuid,
145145
),
146146
discovery_key=discovery_flow.DiscoveryKey(
147147
domain=DOMAIN,
148-
key=data[ATTR_UUID],
148+
key=data.uuid,
149149
version=1,
150150
),
151151
)
152152

153153
async def async_process_del(self, data: dict[str, Any]) -> None:
154154
"""Process remove discovery entry."""
155-
service = data[ATTR_SERVICE]
156-
uuid = data[ATTR_UUID]
155+
service: str = data[ATTR_SERVICE]
156+
uuid: str = data[ATTR_UUID]
157157

158158
# Check if really deletet / prevent injections
159159
try:
160-
data = await self.hassio.get_discovery_message(uuid)
161-
except HassioAPIError:
160+
data = await self._supervisor_client.discovery.get(uuid)
161+
except SupervisorError:
162162
pass
163163
else:
164164
_LOGGER.warning("Retrieve wrong unload for %s", service)

homeassistant/components/hassio/handler.py

Lines changed: 1 addition & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from homeassistant.helpers.singleton import singleton
2525
from homeassistant.loader import bind_hass
2626

27-
from .const import ATTR_DISCOVERY, ATTR_MESSAGE, ATTR_RESULT, DOMAIN, X_HASS_SOURCE
27+
from .const import ATTR_MESSAGE, ATTR_RESULT, DOMAIN, X_HASS_SOURCE
2828

2929
_LOGGER = logging.getLogger(__name__)
3030

@@ -76,15 +76,6 @@ async def async_update_diagnostics(hass: HomeAssistant, diagnostics: bool) -> bo
7676
return await hassio.update_diagnostics(diagnostics)
7777

7878

79-
@bind_hass
80-
async def async_get_addon_discovery_info(hass: HomeAssistant, slug: str) -> dict | None:
81-
"""Return discovery data for an add-on."""
82-
hassio: HassIO = hass.data[DOMAIN]
83-
data = await hassio.retrieve_discovery_messages()
84-
discovered_addons = data[ATTR_DISCOVERY]
85-
return next((addon for addon in discovered_addons if addon["addon"] == slug), None)
86-
87-
8879
@bind_hass
8980
@api_data
9081
async def async_create_backup(
@@ -100,52 +91,6 @@ async def async_create_backup(
10091
return await hassio.send_command(command, payload=payload, timeout=None)
10192

10293

103-
@bind_hass
104-
@api_data
105-
async def async_update_os(hass: HomeAssistant, version: str | None = None) -> dict:
106-
"""Update Home Assistant Operating System.
107-
108-
The caller of the function should handle HassioAPIError.
109-
"""
110-
hassio: HassIO = hass.data[DOMAIN]
111-
command = "/os/update"
112-
return await hassio.send_command(
113-
command,
114-
payload={"version": version},
115-
timeout=None,
116-
)
117-
118-
119-
@bind_hass
120-
@api_data
121-
async def async_update_supervisor(hass: HomeAssistant) -> dict:
122-
"""Update Home Assistant Supervisor.
123-
124-
The caller of the function should handle HassioAPIError.
125-
"""
126-
hassio: HassIO = hass.data[DOMAIN]
127-
command = "/supervisor/update"
128-
return await hassio.send_command(command, timeout=None)
129-
130-
131-
@bind_hass
132-
@api_data
133-
async def async_update_core(
134-
hass: HomeAssistant, version: str | None = None, backup: bool = False
135-
) -> dict:
136-
"""Update Home Assistant Core.
137-
138-
The caller of the function should handle HassioAPIError.
139-
"""
140-
hassio: HassIO = hass.data[DOMAIN]
141-
command = "/core/update"
142-
return await hassio.send_command(
143-
command,
144-
payload={"version": version, "backup": backup},
145-
timeout=None,
146-
)
147-
148-
14994
@bind_hass
15095
@_api_bool
15196
async def async_apply_suggestion(hass: HomeAssistant, suggestion_uuid: str) -> dict:
@@ -228,14 +173,6 @@ def base_url(self) -> URL:
228173
"""Return base url for Supervisor."""
229174
return self._base_url
230175

231-
@_api_bool
232-
def is_connected(self) -> Coroutine:
233-
"""Return true if it connected to Hass.io supervisor.
234-
235-
This method returns a coroutine.
236-
"""
237-
return self.send_command("/supervisor/ping", method="get", timeout=15)
238-
239176
@api_data
240177
def get_info(self) -> Coroutine:
241178
"""Return generic Supervisor information.
@@ -308,46 +245,6 @@ def get_ingress_panels(self) -> Coroutine:
308245
"""
309246
return self.send_command("/ingress/panels", method="get")
310247

311-
@_api_bool
312-
def restart_homeassistant(self) -> Coroutine:
313-
"""Restart Home-Assistant container.
314-
315-
This method returns a coroutine.
316-
"""
317-
return self.send_command("/homeassistant/restart")
318-
319-
@_api_bool
320-
def stop_homeassistant(self) -> Coroutine:
321-
"""Stop Home-Assistant container.
322-
323-
This method returns a coroutine.
324-
"""
325-
return self.send_command("/homeassistant/stop")
326-
327-
@_api_bool
328-
def refresh_updates(self) -> Coroutine:
329-
"""Refresh available updates.
330-
331-
This method returns a coroutine.
332-
"""
333-
return self.send_command("/refresh_updates", timeout=300)
334-
335-
@api_data
336-
def retrieve_discovery_messages(self) -> Coroutine:
337-
"""Return all discovery data from Hass.io API.
338-
339-
This method returns a coroutine.
340-
"""
341-
return self.send_command("/discovery", method="get", timeout=60)
342-
343-
@api_data
344-
def get_discovery_message(self, uuid: str) -> Coroutine:
345-
"""Return a single discovery data message.
346-
347-
This method returns a coroutine.
348-
"""
349-
return self.send_command(f"/discovery/{uuid}", method="get")
350-
351248
@api_data
352249
def get_resolution_info(self) -> Coroutine:
353250
"""Return data for Supervisor resolution center.

0 commit comments

Comments
 (0)