Handle synology_dsm discovery broadcasting on multiple ip addresses (#34623)

This commit is contained in:
J. Nick Koston 2020-04-23 19:53:18 -05:00 committed by GitHub
parent 5ba0ccd43b
commit f94329dbbd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 1 deletions

View File

@ -133,7 +133,7 @@ class SynologyDSMFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
return await self._show_setup_form(user_input, errors) return await self._show_setup_form(user_input, errors)
# Check if already configured # Check if already configured
await self.async_set_unique_id(serial) await self.async_set_unique_id(serial, raise_on_progress=False)
self._abort_if_unique_id_configured() self._abort_if_unique_id_configured()
config_data = { config_data = {
@ -162,6 +162,13 @@ class SynologyDSMFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
if self._host_already_configured(parsed_url.hostname): if self._host_already_configured(parsed_url.hostname):
return self.async_abort(reason="already_configured") return self.async_abort(reason="already_configured")
if ssdp.ATTR_UPNP_SERIAL in discovery_info:
# Synology can broadcast on multiple IP addresses
await self.async_set_unique_id(
discovery_info[ssdp.ATTR_UPNP_SERIAL].upper()
)
self._abort_if_unique_id_configured()
self.discovered_conf = { self.discovered_conf = {
CONF_NAME: friendly_name, CONF_NAME: friendly_name,
CONF_HOST: parsed_url.hostname, CONF_HOST: parsed_url.hostname,

View File

@ -321,6 +321,30 @@ async def test_missing_data_after_login(
assert result["errors"] == {"base": "missing_data"} assert result["errors"] == {"base": "missing_data"}
async def test_form_ssdp_already_configured(
hass: HomeAssistantType, service: MagicMock
):
"""Test ssdp abort when the serial number is already configured."""
await setup.async_setup_component(hass, "persistent_notification", {})
MockConfigEntry(
domain=DOMAIN,
data={CONF_HOST: HOST, CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD},
unique_id=SERIAL.upper(),
).add_to_hass(hass)
result = await hass.config_entries.flow.async_init(
DOMAIN,
context={"source": SOURCE_SSDP},
data={
ssdp.ATTR_SSDP_LOCATION: "http://192.168.1.5:5000",
ssdp.ATTR_UPNP_FRIENDLY_NAME: "mydsm",
ssdp.ATTR_UPNP_SERIAL: SERIAL,
},
)
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
async def test_form_ssdp(hass: HomeAssistantType, service: MagicMock): async def test_form_ssdp(hass: HomeAssistantType, service: MagicMock):
"""Test we can setup from ssdp.""" """Test we can setup from ssdp."""
await setup.async_setup_component(hass, "persistent_notification", {}) await setup.async_setup_component(hass, "persistent_notification", {})
@ -331,6 +355,7 @@ async def test_form_ssdp(hass: HomeAssistantType, service: MagicMock):
data={ data={
ssdp.ATTR_SSDP_LOCATION: "http://192.168.1.5:5000", ssdp.ATTR_SSDP_LOCATION: "http://192.168.1.5:5000",
ssdp.ATTR_UPNP_FRIENDLY_NAME: "mydsm", ssdp.ATTR_UPNP_FRIENDLY_NAME: "mydsm",
ssdp.ATTR_UPNP_SERIAL: SERIAL,
}, },
) )
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM assert result["type"] == data_entry_flow.RESULT_TYPE_FORM