mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 21:27:38 +00:00
Removal of stale add-on devices on startup (#52245)
This commit is contained in:
parent
3e1d32f4e0
commit
8255a2f6c8
@ -47,6 +47,7 @@ from .const import (
|
|||||||
ATTR_URL,
|
ATTR_URL,
|
||||||
ATTR_VERSION,
|
ATTR_VERSION,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
|
SupervisorEntityModel,
|
||||||
)
|
)
|
||||||
from .discovery import async_setup_discovery_view
|
from .discovery import async_setup_discovery_view
|
||||||
from .handler import HassIO, HassioAPIError, api_data
|
from .handler import HassIO, HassioAPIError, api_data
|
||||||
@ -597,7 +598,7 @@ def async_register_addons_in_dev_reg(
|
|||||||
params = {
|
params = {
|
||||||
"config_entry_id": entry_id,
|
"config_entry_id": entry_id,
|
||||||
"identifiers": {(DOMAIN, addon[ATTR_SLUG])},
|
"identifiers": {(DOMAIN, addon[ATTR_SLUG])},
|
||||||
"model": "Home Assistant Add-on",
|
"model": SupervisorEntityModel.ADDON,
|
||||||
"sw_version": addon[ATTR_VERSION],
|
"sw_version": addon[ATTR_VERSION],
|
||||||
"name": addon[ATTR_NAME],
|
"name": addon[ATTR_NAME],
|
||||||
"entry_type": ATTR_SERVICE,
|
"entry_type": ATTR_SERVICE,
|
||||||
@ -616,7 +617,7 @@ def async_register_os_in_dev_reg(
|
|||||||
"config_entry_id": entry_id,
|
"config_entry_id": entry_id,
|
||||||
"identifiers": {(DOMAIN, "OS")},
|
"identifiers": {(DOMAIN, "OS")},
|
||||||
"manufacturer": "Home Assistant",
|
"manufacturer": "Home Assistant",
|
||||||
"model": "Home Assistant Operating System",
|
"model": SupervisorEntityModel.OS,
|
||||||
"sw_version": os_dict[ATTR_VERSION],
|
"sw_version": os_dict[ATTR_VERSION],
|
||||||
"name": "Home Assistant Operating System",
|
"name": "Home Assistant Operating System",
|
||||||
"entry_type": ATTR_SERVICE,
|
"entry_type": ATTR_SERVICE,
|
||||||
@ -625,9 +626,7 @@ def async_register_os_in_dev_reg(
|
|||||||
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_remove_addons_from_dev_reg(
|
def async_remove_addons_from_dev_reg(dev_reg: DeviceRegistry, addons: set[str]) -> None:
|
||||||
dev_reg: DeviceRegistry, addons: list[dict[str, Any]]
|
|
||||||
) -> None:
|
|
||||||
"""Remove addons from the device registry."""
|
"""Remove addons from the device registry."""
|
||||||
for addon_slug in addons:
|
for addon_slug in addons:
|
||||||
if dev := dev_reg.async_get_device({(DOMAIN, addon_slug)}):
|
if dev := dev_reg.async_get_device({(DOMAIN, addon_slug)}):
|
||||||
@ -684,16 +683,21 @@ class HassioDataUpdateCoordinator(DataUpdateCoordinator):
|
|||||||
async_register_os_in_dev_reg(
|
async_register_os_in_dev_reg(
|
||||||
self.entry_id, self.dev_reg, new_data["os"]
|
self.entry_id, self.dev_reg, new_data["os"]
|
||||||
)
|
)
|
||||||
return new_data
|
|
||||||
|
|
||||||
# Remove add-ons that are no longer installed from device registry
|
# Remove add-ons that are no longer installed from device registry
|
||||||
if removed_addons := list(set(self.data["addons"]) - set(new_data["addons"])):
|
supervisor_addon_devices = {
|
||||||
async_remove_addons_from_dev_reg(self.dev_reg, removed_addons)
|
list(device.identifiers)[0][1]
|
||||||
|
for device in self.dev_reg.devices.values()
|
||||||
|
if self.entry_id in device.config_entries
|
||||||
|
and device.model == SupervisorEntityModel.ADDON
|
||||||
|
}
|
||||||
|
if stale_addons := supervisor_addon_devices - set(new_data["addons"]):
|
||||||
|
async_remove_addons_from_dev_reg(self.dev_reg, stale_addons)
|
||||||
|
|
||||||
# If there are new add-ons, we should reload the config entry so we can
|
# If there are new add-ons, we should reload the config entry so we can
|
||||||
# create new devices and entities. We can return an empty dict because
|
# create new devices and entities. We can return an empty dict because
|
||||||
# coordinator will be recreated.
|
# coordinator will be recreated.
|
||||||
if list(set(new_data["addons"]) - set(self.data["addons"])):
|
if self.data and list(set(new_data["addons"]) - set(self.data["addons"])):
|
||||||
self.hass.async_create_task(
|
self.hass.async_create_task(
|
||||||
self.hass.config_entries.async_reload(self.entry_id)
|
self.hass.config_entries.async_reload(self.entry_id)
|
||||||
)
|
)
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
"""Hass.io const variables."""
|
"""Hass.io const variables."""
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
DOMAIN = "hassio"
|
DOMAIN = "hassio"
|
||||||
|
|
||||||
@ -46,3 +47,10 @@ ATTR_UPDATE_AVAILABLE = "update_available"
|
|||||||
ATTR_SLUG = "slug"
|
ATTR_SLUG = "slug"
|
||||||
ATTR_URL = "url"
|
ATTR_URL = "url"
|
||||||
ATTR_REPOSITORY = "repository"
|
ATTR_REPOSITORY = "repository"
|
||||||
|
|
||||||
|
|
||||||
|
class SupervisorEntityModel(str, Enum):
|
||||||
|
"""Supervisor entity model."""
|
||||||
|
|
||||||
|
ADDON = "Home Assistant Add-on"
|
||||||
|
OS = "Home Assistant Operating System"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user