From 9c5f1b44064bb0d8be9435331809e8241d13461a Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Fri, 14 May 2021 15:23:16 -0600 Subject: [PATCH] Fix IQVIA failing to start if any API call fails (#50615) Co-authored-by: Paulus Schoutsen --- homeassistant/components/iqvia/__init__.py | 10 ++++++++-- homeassistant/components/iqvia/sensor.py | 7 +++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/iqvia/__init__.py b/homeassistant/components/iqvia/__init__.py index f8ccf3c7e29..5d13a2373a6 100644 --- a/homeassistant/components/iqvia/__init__.py +++ b/homeassistant/components/iqvia/__init__.py @@ -9,6 +9,7 @@ from pyiqvia.errors import IQVIAError from homeassistant.components.sensor import SensorEntity from homeassistant.const import ATTR_ATTRIBUTION from homeassistant.core import callback +from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import aiohttp_client from homeassistant.helpers.update_coordinator import ( CoordinatorEntity, @@ -74,9 +75,14 @@ async def async_setup_entry(hass, entry): update_interval=DEFAULT_SCAN_INTERVAL, update_method=partial(async_get_data_from_api, api_coro), ) - init_data_update_tasks.append(coordinator.async_config_entry_first_refresh()) + init_data_update_tasks.append(coordinator.async_refresh()) - await asyncio.gather(*init_data_update_tasks) + results = await asyncio.gather(*init_data_update_tasks, return_exceptions=True) + if all(isinstance(result, Exception) for result in results): + # The IQVIA API can be selectively flaky, meaning that any number of the setup + # API calls could fail. We only retry integration setup if *all* of the initial + # API calls fail: + raise ConfigEntryNotReady() hass.data[DOMAIN].setdefault(DATA_COORDINATOR, {})[entry.entry_id] = coordinators hass.config_entries.async_setup_platforms(entry, PLATFORMS) diff --git a/homeassistant/components/iqvia/sensor.py b/homeassistant/components/iqvia/sensor.py index 48ec1cf97b1..b0420a52ee9 100644 --- a/homeassistant/components/iqvia/sensor.py +++ b/homeassistant/components/iqvia/sensor.py @@ -104,9 +104,12 @@ class ForecastSensor(IQVIAEntity): @callback def update_from_latest_data(self): """Update the sensor.""" - data = self.coordinator.data.get("Location") + if not self.coordinator.data: + return - if not data or not data.get("periods"): + data = self.coordinator.data.get("Location", {}) + + if not data.get("periods"): return indices = [p["Index"] for p in data["periods"]]