Prevent integrations from retrying setup once shutdown has started (#88818)

* Prevent integrations from retrying setup once shutdown has started

* coverage
This commit is contained in:
J. Nick Koston 2023-02-26 21:01:02 -06:00 committed by GitHub
parent 4898d22960
commit f8934175cb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 0 deletions

View file

@ -445,6 +445,10 @@ class ConfigEntry:
async def setup_again(*_: Any) -> None: async def setup_again(*_: Any) -> None:
"""Run setup again.""" """Run setup again."""
# Check again when we fire in case shutdown
# has started so we do not block shutdown
if hass.is_stopping:
return
self._async_cancel_retry_setup = None self._async_cancel_retry_setup = None
await self.async_setup(hass, integration=integration, tries=tries) await self.async_setup(hass, integration=integration, tries=tries)

View file

@ -29,6 +29,7 @@ from homeassistant.helpers import entity_registry as er
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from homeassistant.setup import async_set_domains_to_be_loaded, async_setup_component from homeassistant.setup import async_set_domains_to_be_loaded, async_setup_component
from homeassistant.util import dt from homeassistant.util import dt
import homeassistant.util.dt as dt_util
from .common import ( from .common import (
MockConfigEntry, MockConfigEntry,
@ -999,6 +1000,27 @@ async def test_setup_retrying_during_unload_before_started(hass: HomeAssistant)
) )
async def test_setup_does_not_retry_during_shutdown(hass: HomeAssistant) -> None:
"""Test we do not retry when HASS is shutting down."""
entry = MockConfigEntry(domain="test")
mock_setup_entry = AsyncMock(side_effect=ConfigEntryNotReady)
mock_integration(hass, MockModule("test", async_setup_entry=mock_setup_entry))
mock_entity_platform(hass, "config_flow.test", None)
await entry.async_setup(hass)
assert entry.state is config_entries.ConfigEntryState.SETUP_RETRY
assert len(mock_setup_entry.mock_calls) == 1
hass.state = CoreState.stopping
async_fire_time_changed(hass, dt_util.utcnow() + timedelta(minutes=5))
await hass.async_block_till_done()
assert entry.state is config_entries.ConfigEntryState.SETUP_RETRY
assert len(mock_setup_entry.mock_calls) == 1
async def test_create_entry_options(hass: HomeAssistant) -> None: async def test_create_entry_options(hass: HomeAssistant) -> None:
"""Test a config entry being created with options.""" """Test a config entry being created with options."""