mirror of
https://github.com/home-assistant/core.git
synced 2025-07-15 17:27:10 +00:00
Skip each ssdp listener that fails to bind (#53670)
This commit is contained in:
parent
f8750daa09
commit
219348d573
@ -256,9 +256,21 @@ class Scanner:
|
|||||||
self.hass.bus.async_listen_once(
|
self.hass.bus.async_listen_once(
|
||||||
EVENT_HOMEASSISTANT_STARTED, self.flow_dispatcher.async_start
|
EVENT_HOMEASSISTANT_STARTED, self.flow_dispatcher.async_start
|
||||||
)
|
)
|
||||||
await asyncio.gather(
|
results = await asyncio.gather(
|
||||||
*(listener.async_start() for listener in self._ssdp_listeners)
|
*(listener.async_start() for listener in self._ssdp_listeners),
|
||||||
|
return_exceptions=True,
|
||||||
)
|
)
|
||||||
|
failed_listeners = []
|
||||||
|
for idx, result in enumerate(results):
|
||||||
|
if isinstance(result, Exception):
|
||||||
|
_LOGGER.warning(
|
||||||
|
"Failed to setup listener for %s: %s",
|
||||||
|
self._ssdp_listeners[idx].source_ip,
|
||||||
|
result,
|
||||||
|
)
|
||||||
|
failed_listeners.append(self._ssdp_listeners[idx])
|
||||||
|
for listener in failed_listeners:
|
||||||
|
self._ssdp_listeners.remove(listener)
|
||||||
self._cancel_scan = async_track_time_interval(
|
self._cancel_scan = async_track_time_interval(
|
||||||
self.hass, self.async_scan, SCAN_INTERVAL
|
self.hass, self.async_scan, SCAN_INTERVAL
|
||||||
)
|
)
|
||||||
|
@ -790,3 +790,65 @@ async def test_async_detect_interfaces_setting_empty_route(hass):
|
|||||||
(IPv4Address("192.168.1.5"), IPv4Address("255.255.255.255")),
|
(IPv4Address("192.168.1.5"), IPv4Address("255.255.255.255")),
|
||||||
(IPv4Address("192.168.1.5"), None),
|
(IPv4Address("192.168.1.5"), None),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def test_bind_failure_skips_adapter(hass, caplog):
|
||||||
|
"""Test that an adapter with a bind failure is skipped."""
|
||||||
|
mock_get_ssdp = {
|
||||||
|
"mock-domain": [
|
||||||
|
{
|
||||||
|
ssdp.ATTR_UPNP_DEVICE_TYPE: "ABC",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
create_args = []
|
||||||
|
did_search = 0
|
||||||
|
|
||||||
|
@callback
|
||||||
|
def _callback(*_):
|
||||||
|
nonlocal did_search
|
||||||
|
did_search += 1
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _generate_failing_ssdp_listener(*args, **kwargs):
|
||||||
|
create_args.append([args, kwargs])
|
||||||
|
listener = SSDPListener(*args, **kwargs)
|
||||||
|
|
||||||
|
async def _async_callback(*_):
|
||||||
|
if kwargs["source_ip"] == IPv6Address("2001:db8::"):
|
||||||
|
raise OSError
|
||||||
|
pass
|
||||||
|
|
||||||
|
listener.async_start = _async_callback
|
||||||
|
listener.async_search = _callback
|
||||||
|
return listener
|
||||||
|
|
||||||
|
with patch(
|
||||||
|
"homeassistant.components.ssdp.async_get_ssdp",
|
||||||
|
return_value=mock_get_ssdp,
|
||||||
|
), patch(
|
||||||
|
"homeassistant.components.ssdp.SSDPListener",
|
||||||
|
new=_generate_failing_ssdp_listener,
|
||||||
|
), patch(
|
||||||
|
"homeassistant.components.ssdp.network.async_get_adapters",
|
||||||
|
return_value=_ADAPTERS_WITH_MANUAL_CONFIG,
|
||||||
|
):
|
||||||
|
assert await async_setup_component(hass, ssdp.DOMAIN, {ssdp.DOMAIN: {}})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
hass.bus.async_fire(EVENT_HOMEASSISTANT_STARTED)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
argset = set()
|
||||||
|
for argmap in create_args:
|
||||||
|
argset.add((argmap[1].get("source_ip"), argmap[1].get("target_ip")))
|
||||||
|
|
||||||
|
assert argset == {
|
||||||
|
(IPv6Address("2001:db8::"), None),
|
||||||
|
(IPv4Address("192.168.1.5"), IPv4Address("255.255.255.255")),
|
||||||
|
(IPv4Address("192.168.1.5"), None),
|
||||||
|
}
|
||||||
|
assert "Failed to setup listener for" in caplog.text
|
||||||
|
|
||||||
|
async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=200))
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert did_search == 2
|
||||||
|
Loading…
x
Reference in New Issue
Block a user