From 785b8d2bd1000d754837ea48f9ab2db5c216253d Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Wed, 13 May 2020 00:37:16 +0200 Subject: [PATCH] UniFi - Sites don't declare role on UniFiOS 1.7.0 beta (#35555) * New way to identify role, compatible with standalone controller or as part of unifios * Remove error * Bump dependency to v22 * Remove unused import --- homeassistant/components/unifi/config_flow.py | 12 +---- homeassistant/components/unifi/controller.py | 4 +- homeassistant/components/unifi/errors.py | 4 -- homeassistant/components/unifi/manifest.json | 2 +- homeassistant/components/unifi/strings.json | 3 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/unifi/test_config_flow.py | 46 ------------------- tests/components/unifi/test_controller.py | 4 ++ tests/components/unifi/test_switch.py | 8 ++-- 10 files changed, 16 insertions(+), 71 deletions(-) diff --git a/homeassistant/components/unifi/config_flow.py b/homeassistant/components/unifi/config_flow.py index 5e4268f2250..6115821b000 100644 --- a/homeassistant/components/unifi/config_flow.py +++ b/homeassistant/components/unifi/config_flow.py @@ -32,12 +32,7 @@ from .const import ( LOGGER, ) from .controller import get_controller -from .errors import ( - AlreadyConfigured, - AuthenticationRequired, - CannotConnect, - NoLocalUser, -) +from .errors import AlreadyConfigured, AuthenticationRequired, CannotConnect DEFAULT_PORT = 8443 DEFAULT_SITE_ID = "default" @@ -134,8 +129,6 @@ class UnifiFlowHandler(config_entries.ConfigFlow, domain=UNIFI_DOMAIN): for site in self.sites.values(): if desc == site["desc"]: - if "role" not in site: - raise NoLocalUser self.config[CONF_SITE_ID] = site["name"] break @@ -154,9 +147,6 @@ class UnifiFlowHandler(config_entries.ConfigFlow, domain=UNIFI_DOMAIN): except AlreadyConfigured: return self.async_abort(reason="already_configured") - except NoLocalUser: - return self.async_abort(reason="no_local_user") - if len(self.sites) == 1: self.desc = next(iter(self.sites.values()))["desc"] return await self.async_step_site(user_input={}) diff --git a/homeassistant/components/unifi/controller.py b/homeassistant/components/unifi/controller.py index acac9c8e371..82314adb771 100644 --- a/homeassistant/components/unifi/controller.py +++ b/homeassistant/components/unifi/controller.py @@ -290,9 +290,11 @@ class UniFiController: for site in sites.values(): if self.site == site["name"]: self._site_name = site["desc"] - self._site_role = site["role"] break + description = await self.api.site_description() + self._site_role = description[0]["site_role"] + except CannotConnect: raise ConfigEntryNotReady diff --git a/homeassistant/components/unifi/errors.py b/homeassistant/components/unifi/errors.py index e0da64f245c..c90c4956312 100644 --- a/homeassistant/components/unifi/errors.py +++ b/homeassistant/components/unifi/errors.py @@ -22,9 +22,5 @@ class LoginRequired(UnifiException): """Component got logged out.""" -class NoLocalUser(UnifiException): - """No local user.""" - - class UserLevel(UnifiException): """User level too low.""" diff --git a/homeassistant/components/unifi/manifest.json b/homeassistant/components/unifi/manifest.json index 1d847b4de05..124c7241c30 100644 --- a/homeassistant/components/unifi/manifest.json +++ b/homeassistant/components/unifi/manifest.json @@ -3,7 +3,7 @@ "name": "Ubiquiti UniFi", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/unifi", - "requirements": ["aiounifi==21"], + "requirements": ["aiounifi==22"], "codeowners": ["@Kane610"], "quality_scale": "platinum" } diff --git a/homeassistant/components/unifi/strings.json b/homeassistant/components/unifi/strings.json index e130f6f826d..df1cb753b53 100644 --- a/homeassistant/components/unifi/strings.json +++ b/homeassistant/components/unifi/strings.json @@ -19,8 +19,7 @@ "unknown_client_mac": "No client available on that MAC address" }, "abort": { - "already_configured": "Controller site is already configured", - "no_local_user": "No local user found, configure a local account on controller and try again" + "already_configured": "Controller site is already configured" } }, "options": { diff --git a/requirements_all.txt b/requirements_all.txt index 24aebd7a042..a83499f8de0 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -221,7 +221,7 @@ aiopylgtv==0.3.3 aioswitcher==1.2.0 # homeassistant.components.unifi -aiounifi==21 +aiounifi==22 # homeassistant.components.wwlln aiowwlln==2.0.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 9e3d407a275..060a3fbfa93 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -107,7 +107,7 @@ aiopylgtv==0.3.3 aioswitcher==1.2.0 # homeassistant.components.unifi -aiounifi==21 +aiounifi==22 # homeassistant.components.wwlln aiowwlln==2.0.2 diff --git a/tests/components/unifi/test_config_flow.py b/tests/components/unifi/test_config_flow.py index 7487e9d341b..a1af12dfb76 100644 --- a/tests/components/unifi/test_config_flow.py +++ b/tests/components/unifi/test_config_flow.py @@ -222,52 +222,6 @@ async def test_flow_fails_site_already_configured(hass, aioclient_mock): assert result["reason"] == "already_configured" -async def test_flow_fails_site_has_no_local_user(hass, aioclient_mock): - """Test config flow.""" - entry = MockConfigEntry( - domain=UNIFI_DOMAIN, data={"controller": {"host": "1.2.3.4", "site": "site_id"}} - ) - entry.add_to_hass(hass) - - result = await hass.config_entries.flow.async_init( - UNIFI_DOMAIN, context={"source": "user"} - ) - - assert result["type"] == data_entry_flow.RESULT_TYPE_FORM - assert result["step_id"] == "user" - - aioclient_mock.get("https://1.2.3.4:1234", status=302) - - aioclient_mock.post( - "https://1.2.3.4:1234/api/login", - json={"data": "login successful", "meta": {"rc": "ok"}}, - headers={"content-type": "application/json"}, - ) - - aioclient_mock.get( - "https://1.2.3.4:1234/api/self/sites", - json={ - "data": [{"desc": "Site name", "name": "site_id"}], - "meta": {"rc": "ok"}, - }, - headers={"content-type": "application/json"}, - ) - - result = await hass.config_entries.flow.async_configure( - result["flow_id"], - user_input={ - CONF_HOST: "1.2.3.4", - CONF_USERNAME: "username", - CONF_PASSWORD: "password", - CONF_PORT: 1234, - CONF_VERIFY_SSL: True, - }, - ) - - assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT - assert result["reason"] == "no_local_user" - - async def test_flow_fails_user_credentials_faulty(hass, aioclient_mock): """Test config flow.""" result = await hass.config_entries.flow.async_init( diff --git a/tests/components/unifi/test_controller.py b/tests/components/unifi/test_controller.py index 9bf956e8063..55483d135b6 100644 --- a/tests/components/unifi/test_controller.py +++ b/tests/components/unifi/test_controller.py @@ -66,6 +66,7 @@ ENTRY_OPTIONS = {} CONFIGURATION = [] SITES = {"Site name": {"desc": "Site name", "name": "site_id", "role": "admin"}} +DESCRIPTION = [{"name": "username", "site_name": "site_id", "site_role": "admin"}] async def setup_unifi_integration( @@ -73,6 +74,7 @@ async def setup_unifi_integration( config=ENTRY_CONFIG, options=ENTRY_OPTIONS, sites=SITES, + site_description=DESCRIPTION, clients_response=None, devices_response=None, clients_all_response=None, @@ -130,6 +132,8 @@ async def setup_unifi_integration( with patch("aiounifi.Controller.check_unifi_os", return_value=True), patch( "aiounifi.Controller.login", return_value=True, ), patch("aiounifi.Controller.sites", return_value=sites), patch( + "aiounifi.Controller.site_description", return_value=site_description + ), patch( "aiounifi.Controller.request", new=mock_request ), patch.object( aiounifi.websocket.WSClient, "start", return_value=True diff --git a/tests/components/unifi/test_switch.py b/tests/components/unifi/test_switch.py index f18e38183de..ea198c6d8f4 100644 --- a/tests/components/unifi/test_switch.py +++ b/tests/components/unifi/test_switch.py @@ -19,8 +19,8 @@ from homeassistant.setup import async_setup_component from .test_controller import ( CONTROLLER_HOST, + DESCRIPTION, ENTRY_CONFIG, - SITES, setup_unifi_integration, ) @@ -289,12 +289,12 @@ async def test_controller_not_client(hass): async def test_not_admin(hass): """Test that switch platform only work on an admin account.""" - sites = deepcopy(SITES) - sites["Site name"]["role"] = "not admin" + description = deepcopy(DESCRIPTION) + description[0]["site_role"] = "not admin" controller = await setup_unifi_integration( hass, options={CONF_TRACK_CLIENTS: False, CONF_TRACK_DEVICES: False}, - sites=sites, + site_description=description, clients_response=[CLIENT_1], devices_response=[DEVICE_1], )