diff --git a/homeassistant/components/hassio/__init__.py b/homeassistant/components/hassio/__init__.py index 5f2cc386a87..f3f6887570f 100644 --- a/homeassistant/components/hassio/__init__.py +++ b/homeassistant/components/hassio/__init__.py @@ -711,7 +711,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: dev_reg = await async_get_registry(hass) coordinator = HassioDataUpdateCoordinator(hass, entry, dev_reg) hass.data[ADDONS_COORDINATOR] = coordinator - await coordinator.async_refresh() + await coordinator.async_config_entry_first_refresh() hass.config_entries.async_setup_platforms(entry, PLATFORMS) @@ -848,8 +848,8 @@ class HassioDataUpdateCoordinator(DataUpdateCoordinator): new_data[DATA_KEY_ADDONS] = { addon[ATTR_SLUG]: { **addon, - **((addons_stats or {}).get(addon[ATTR_SLUG], {})), - ATTR_AUTO_UPDATE: addons_info.get(addon[ATTR_SLUG], {}).get( + **((addons_stats or {}).get(addon[ATTR_SLUG]) or {}), + ATTR_AUTO_UPDATE: (addons_info.get(addon[ATTR_SLUG]) or {}).get( ATTR_AUTO_UPDATE, False ), ATTR_CHANGELOG: (addons_changelogs or {}).get(addon[ATTR_SLUG]), @@ -952,15 +952,27 @@ class HassioDataUpdateCoordinator(DataUpdateCoordinator): async def _update_addon_stats(self, slug): """Update single addon stats.""" - stats = await self.hassio.get_addon_stats(slug) - return (slug, stats) + try: + stats = await self.hassio.get_addon_stats(slug) + return (slug, stats) + except HassioAPIError as err: + _LOGGER.warning("Could not fetch stats for %s: %s", slug, err) + return (slug, None) async def _update_addon_changelog(self, slug): """Return the changelog for an add-on.""" - changelog = await self.hassio.get_addon_changelog(slug) - return (slug, changelog) + try: + changelog = await self.hassio.get_addon_changelog(slug) + return (slug, changelog) + except HassioAPIError as err: + _LOGGER.warning("Could not fetch changelog for %s: %s", slug, err) + return (slug, None) async def _update_addon_info(self, slug): """Return the info for an add-on.""" - info = await self.hassio.get_addon_info(slug) - return (slug, info) + try: + info = await self.hassio.get_addon_info(slug) + return (slug, info) + except HassioAPIError as err: + _LOGGER.warning("Could not fetch info for %s: %s", slug, err) + return (slug, None) diff --git a/tests/components/hassio/test_update.py b/tests/components/hassio/test_update.py index 3407c26fc2f..14d1d06ef38 100644 --- a/tests/components/hassio/test_update.py +++ b/tests/components/hassio/test_update.py @@ -509,3 +509,30 @@ async def test_no_os_entity(hass): # Verify that the entity does not exist assert not hass.states.get("update.home_assistant_operating_system_update") + + +async def test_setting_up_core_update_when_addon_fails(hass, caplog): + """Test setting up core update when single addon fails.""" + with patch.dict(os.environ, MOCK_ENVIRON), patch( + "homeassistant.components.hassio.HassIO.get_addon_stats", + side_effect=HassioAPIError("add-on is not running"), + ), patch( + "homeassistant.components.hassio.HassIO.get_addon_changelog", + side_effect=HassioAPIError("add-on is not running"), + ), patch( + "homeassistant.components.hassio.HassIO.get_addon_info", + side_effect=HassioAPIError("add-on is not running"), + ): + result = await async_setup_component( + hass, + "hassio", + {"http": {"server_port": 9999, "server_host": "127.0.0.1"}, "hassio": {}}, + ) + assert result + await hass.async_block_till_done() + + # Verify that the core update entity does exist + state = hass.states.get("update.home_assistant_core_update") + assert state + assert state.state == "on" + assert "Could not fetch stats for test: add-on is not running" in caplog.text