mirror of
https://github.com/home-assistant/core.git
synced 2025-07-12 15:57:06 +00:00
Avoid collision when replacing existing config entry with same unique id (#130062)
This commit is contained in:
parent
e407b4730d
commit
2b7d593ebe
@ -1507,10 +1507,14 @@ class ConfigEntriesFlowManager(
|
|||||||
version=result["version"],
|
version=result["version"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if existing_entry is not None:
|
||||||
|
# Unload and remove the existing entry
|
||||||
|
await self.config_entries._async_remove(existing_entry.entry_id) # noqa: SLF001
|
||||||
await self.config_entries.async_add(entry)
|
await self.config_entries.async_add(entry)
|
||||||
|
|
||||||
if existing_entry is not None:
|
if existing_entry is not None:
|
||||||
await self.config_entries.async_remove(existing_entry.entry_id)
|
# Clean up devices and entities belonging to the existing entry
|
||||||
|
self.config_entries._async_clean_up(existing_entry) # noqa: SLF001
|
||||||
|
|
||||||
result["result"] = entry
|
result["result"] = entry
|
||||||
return result
|
return result
|
||||||
@ -1900,7 +1904,21 @@ class ConfigEntries:
|
|||||||
self._async_schedule_save()
|
self._async_schedule_save()
|
||||||
|
|
||||||
async def async_remove(self, entry_id: str) -> dict[str, Any]:
|
async def async_remove(self, entry_id: str) -> dict[str, Any]:
|
||||||
"""Remove an entry."""
|
"""Remove, unload and clean up after an entry."""
|
||||||
|
unload_success, entry = await self._async_remove(entry_id)
|
||||||
|
self._async_clean_up(entry)
|
||||||
|
|
||||||
|
for discovery_domain in entry.discovery_keys:
|
||||||
|
async_dispatcher_send_internal(
|
||||||
|
self.hass,
|
||||||
|
signal_discovered_config_entry_removed(discovery_domain),
|
||||||
|
entry,
|
||||||
|
)
|
||||||
|
|
||||||
|
return {"require_restart": not unload_success}
|
||||||
|
|
||||||
|
async def _async_remove(self, entry_id: str) -> tuple[bool, ConfigEntry]:
|
||||||
|
"""Remove and unload an entry."""
|
||||||
if (entry := self.async_get_entry(entry_id)) is None:
|
if (entry := self.async_get_entry(entry_id)) is None:
|
||||||
raise UnknownEntry
|
raise UnknownEntry
|
||||||
|
|
||||||
@ -1916,6 +1934,13 @@ class ConfigEntries:
|
|||||||
self.async_update_issues()
|
self.async_update_issues()
|
||||||
self._async_schedule_save()
|
self._async_schedule_save()
|
||||||
|
|
||||||
|
return (unload_success, entry)
|
||||||
|
|
||||||
|
@callback
|
||||||
|
def _async_clean_up(self, entry: ConfigEntry) -> None:
|
||||||
|
"""Clean up after an entry."""
|
||||||
|
entry_id = entry.entry_id
|
||||||
|
|
||||||
dev_reg = device_registry.async_get(self.hass)
|
dev_reg = device_registry.async_get(self.hass)
|
||||||
ent_reg = entity_registry.async_get(self.hass)
|
ent_reg = entity_registry.async_get(self.hass)
|
||||||
|
|
||||||
@ -1934,13 +1959,6 @@ class ConfigEntries:
|
|||||||
ir.async_delete_issue(self.hass, HOMEASSISTANT_DOMAIN, issue_id)
|
ir.async_delete_issue(self.hass, HOMEASSISTANT_DOMAIN, issue_id)
|
||||||
|
|
||||||
self._async_dispatch(ConfigEntryChange.REMOVED, entry)
|
self._async_dispatch(ConfigEntryChange.REMOVED, entry)
|
||||||
for discovery_domain in entry.discovery_keys:
|
|
||||||
async_dispatcher_send_internal(
|
|
||||||
self.hass,
|
|
||||||
signal_discovered_config_entry_removed(discovery_domain),
|
|
||||||
entry,
|
|
||||||
)
|
|
||||||
return {"require_restart": not unload_success}
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _async_shutdown(self, event: Event) -> None:
|
def _async_shutdown(self, event: Event) -> None:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user