From a2fd88d70e84ab7d9f10ddbf2153e1f97e653611 Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Tue, 12 May 2020 21:43:42 +0200 Subject: [PATCH 1/4] New way to identify role, compatible with standalone controller or as part of unifios --- homeassistant/components/unifi/config_flow.py | 2 - homeassistant/components/unifi/controller.py | 4 +- homeassistant/components/unifi/strings.json | 3 +- tests/components/unifi/test_config_flow.py | 46 ------------------- tests/components/unifi/test_controller.py | 4 ++ tests/components/unifi/test_switch.py | 8 ++-- 6 files changed, 12 insertions(+), 55 deletions(-) diff --git a/homeassistant/components/unifi/config_flow.py b/homeassistant/components/unifi/config_flow.py index 5e4268f2250a60..2ac4233df5375b 100644 --- a/homeassistant/components/unifi/config_flow.py +++ b/homeassistant/components/unifi/config_flow.py @@ -134,8 +134,6 @@ async def async_step_site(self, user_input=None): 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 diff --git a/homeassistant/components/unifi/controller.py b/homeassistant/components/unifi/controller.py index acac9c8e371b62..82314adb771dd8 100644 --- a/homeassistant/components/unifi/controller.py +++ b/homeassistant/components/unifi/controller.py @@ -290,9 +290,11 @@ async def async_setup(self): 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/strings.json b/homeassistant/components/unifi/strings.json index e130f6f826d351..df1cb753b5361a 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/tests/components/unifi/test_config_flow.py b/tests/components/unifi/test_config_flow.py index 7487e9d341b12c..a1af12dfb7657e 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 9bf956e8063e52..55483d135b6e49 100644 --- a/tests/components/unifi/test_controller.py +++ b/tests/components/unifi/test_controller.py @@ -66,6 +66,7 @@ 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 mock_request(self, method, path, json=None): 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 f18e38183ded29..ea198c6d8f43e7 100644 --- a/tests/components/unifi/test_switch.py +++ b/tests/components/unifi/test_switch.py @@ -19,8 +19,8 @@ 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], ) From 03861b3d3bef3f275b781db67bf1e6b30f9dc17b Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Tue, 12 May 2020 21:46:07 +0200 Subject: [PATCH 2/4] Remove error --- homeassistant/components/unifi/errors.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/homeassistant/components/unifi/errors.py b/homeassistant/components/unifi/errors.py index e0da64f245c398..c90c4956312a34 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.""" From 666c14b9afd6ee8026eb5db8da9596124636725f Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Tue, 12 May 2020 22:14:18 +0200 Subject: [PATCH 3/4] Bump dependency to v22 --- homeassistant/components/unifi/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/unifi/manifest.json b/homeassistant/components/unifi/manifest.json index 1d847b4de05e2a..124c7241c30150 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/requirements_all.txt b/requirements_all.txt index 49126f9c56b662..c34bec8b707d2e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -221,7 +221,7 @@ aiopylgtv==0.3.3 aioswitcher==1.1.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 1d6fb577c65018..8391412032e492 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -107,7 +107,7 @@ aiopylgtv==0.3.3 aioswitcher==1.1.0 # homeassistant.components.unifi -aiounifi==21 +aiounifi==22 # homeassistant.components.wwlln aiowwlln==2.0.2 From 8f0410d800552d58f22de25cbda0a9feb1277cea Mon Sep 17 00:00:00 2001 From: Robert Svensson Date: Tue, 12 May 2020 23:03:08 +0200 Subject: [PATCH 4/4] Remove unused import --- homeassistant/components/unifi/config_flow.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/homeassistant/components/unifi/config_flow.py b/homeassistant/components/unifi/config_flow.py index 2ac4233df5375b..6115821b00093a 100644 --- a/homeassistant/components/unifi/config_flow.py +++ b/homeassistant/components/unifi/config_flow.py @@ -32,12 +32,7 @@ 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" @@ -152,9 +147,6 @@ async def async_step_site(self, user_input=None): 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={})