From d101d4449fa056548bf787645eb0b9a0aa8ee827 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 22 Dec 2019 22:24:18 +0100 Subject: [PATCH] Fix deconz SSDP updating Hassio discovery (#30153) --- .../components/deconz/config_flow.py | 8 ++++- tests/components/deconz/test_config_flow.py | 33 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/deconz/config_flow.py b/homeassistant/components/deconz/config_flow.py index f44acdbd305..c84192456d1 100644 --- a/homeassistant/components/deconz/config_flow.py +++ b/homeassistant/components/deconz/config_flow.py @@ -161,7 +161,11 @@ class DeconzFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): def _update_entry(self, entry, host, port, api_key=None): """Update existing entry.""" - if entry.data[CONF_HOST] == host: + if ( + entry.data[CONF_HOST] == host + and entry.data[CONF_PORT] == port + and (api_key is None or entry.data[CONF_API_KEY] == api_key) + ): return self.async_abort(reason="already_configured") entry.data[CONF_HOST] = host @@ -186,6 +190,8 @@ class DeconzFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): for entry in self.hass.config_entries.async_entries(DOMAIN): if uuid == entry.data.get(CONF_UUID): + if entry.source == "hassio": + return self.async_abort(reason="already_configured") return self._update_entry(entry, parsed_url.hostname, parsed_url.port) bridgeid = discovery_info[ssdp.ATTR_UPNP_SERIAL] diff --git a/tests/components/deconz/test_config_flow.py b/tests/components/deconz/test_config_flow.py index ddcbc1a1d5f..da8b0a8a7f4 100644 --- a/tests/components/deconz/test_config_flow.py +++ b/tests/components/deconz/test_config_flow.py @@ -269,6 +269,39 @@ async def test_bridge_discovery_update_existing_entry(hass): assert entry.data[config_flow.CONF_HOST] == "mock-deconz" +async def test_bridge_discovery_dont_update_existing_hassio_entry(hass): + """Test to ensure the SSDP discovery does not update an Hass.io entry.""" + entry = MockConfigEntry( + domain=config_flow.DOMAIN, + source="hassio", + data={ + config_flow.CONF_HOST: "core-deconz", + config_flow.CONF_BRIDGEID: "123ABC", + config_flow.CONF_UUID: "456DEF", + }, + ) + entry.add_to_hass(hass) + + gateway = Mock() + gateway.config_entry = entry + hass.data[config_flow.DOMAIN] = {"123ABC": gateway} + + result = await hass.config_entries.flow.async_init( + config_flow.DOMAIN, + data={ + ssdp.ATTR_SSDP_LOCATION: "http://mock-deconz/", + ssdp.ATTR_UPNP_MANUFACTURER_URL: config_flow.DECONZ_MANUFACTURERURL, + ssdp.ATTR_UPNP_SERIAL: "123ABC", + ssdp.ATTR_UPNP_UDN: "uuid:456DEF", + }, + context={"source": "ssdp"}, + ) + + assert result["type"] == "abort" + assert result["reason"] == "already_configured" + assert entry.data[config_flow.CONF_HOST] == "core-deconz" + + async def test_create_entry(hass, aioclient_mock): """Test that _create_entry work and that bridgeid can be requested.""" aioclient_mock.get(