Fix bond reloading on zeroconf discovery when host has not changed (#57799)

This commit is contained in:
J. Nick Koston 2021-10-17 07:50:13 -10:00 committed by GitHub
parent e9d601a688
commit d09ee11c54
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 44 additions and 22 deletions

View File

@ -1,6 +1,7 @@
"""The Bond integration."""
from asyncio import TimeoutError as AsyncIOTimeoutError
import logging
from typing import Any
from aiohttp import ClientError, ClientResponseError, ClientTimeout
from bond_api import Bond, BPUPSubscriptions, start_bpup
@ -12,18 +13,17 @@ from homeassistant.const import (
EVENT_HOMEASSISTANT_STOP,
HTTP_UNAUTHORIZED,
)
from homeassistant.core import Event, HomeAssistant, callback
from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.entity import SLOW_UPDATE_WARNING
from .const import BPUP_STOP, BPUP_SUBS, BRIDGE_MAKE, DOMAIN, HUB
from .const import BPUP_SUBS, BRIDGE_MAKE, DOMAIN, HUB
from .utils import BondHub
PLATFORMS = ["cover", "fan", "light", "switch"]
_API_TIMEOUT = SLOW_UPDATE_WARNING - 1
_STOP_CANCEL = "stop_cancel"
_LOGGER = logging.getLogger(__name__)
@ -55,18 +55,17 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
stop_bpup = await start_bpup(host, bpup_subs)
@callback
def _async_stop_event(event: Event) -> None:
def _async_stop_event(*_: Any) -> None:
stop_bpup()
stop_event_cancel = hass.bus.async_listen(
EVENT_HOMEASSISTANT_STOP, _async_stop_event
entry.async_on_unload(_async_stop_event)
entry.async_on_unload(
hass.bus.async_listen(EVENT_HOMEASSISTANT_STOP, _async_stop_event)
)
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN][entry.entry_id] = {
HUB: hub,
BPUP_SUBS: bpup_subs,
BPUP_STOP: stop_bpup,
_STOP_CANCEL: stop_event_cancel,
}
if not entry.unique_id:
@ -95,15 +94,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload a config entry."""
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
data = hass.data[DOMAIN][entry.entry_id]
data[_STOP_CANCEL]()
if BPUP_STOP in data:
data[BPUP_STOP]()
if unload_ok:
hass.data[DOMAIN].pop(entry.entry_id)
return unload_ok

View File

@ -110,12 +110,14 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
token := await async_get_token(self.hass, host)
):
updates[CONF_ACCESS_TOKEN] = token
self.hass.config_entries.async_update_entry(
entry, data={**entry.data, **updates}
)
self.hass.async_create_task(
self.hass.config_entries.async_reload(entry.entry_id)
)
new_data = {**entry.data, **updates}
if new_data != dict(entry.data):
self.hass.config_entries.async_update_entry(
entry, data={**entry.data, **updates}
)
self.hass.async_create_task(
self.hass.config_entries.async_reload(entry.entry_id)
)
raise AbortFlow("already_configured")
self._discovered = {CONF_HOST: host, CONF_NAME: bond_id}

View File

@ -9,7 +9,6 @@ CONF_BOND_ID: str = "bond_id"
HUB = "hub"
BPUP_SUBS = "bpup_subs"
BPUP_STOP = "bpup_stop"
SERVICE_SET_FAN_SPEED_TRACKED_STATE = "set_fan_speed_tracked_state"
SERVICE_SET_POWER_TRACKED_STATE = "set_switch_power_tracked_state"

View File

@ -352,6 +352,35 @@ async def test_zeroconf_already_configured_refresh_token(hass: core.HomeAssistan
assert len(mock_setup_entry.mock_calls) == 1
async def test_zeroconf_already_configured_no_reload_same_host(
hass: core.HomeAssistant,
):
"""Test starting a flow from zeroconf when already configured does not reload if the host is the same."""
entry = MockConfigEntry(
domain=DOMAIN,
unique_id="already-registered-bond-id",
data={CONF_HOST: "stored-host", CONF_ACCESS_TOKEN: "correct-token"},
)
entry.add_to_hass(hass)
with _patch_async_setup_entry() as mock_setup_entry, patch_bond_token(
return_value={"token": "correct-token"}
):
result = await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": config_entries.SOURCE_ZEROCONF},
data={
"name": "already-registered-bond-id.some-other-tail-info",
"host": "stored-host",
},
)
await hass.async_block_till_done()
assert result["type"] == "abort"
assert result["reason"] == "already_configured"
assert len(mock_setup_entry.mock_calls) == 0
async def test_zeroconf_form_unexpected_error(hass: core.HomeAssistant):
"""Test we handle unexpected error gracefully."""
await _help_test_form_unexpected_error(