From 4fbf44cced8cdfe4eb08c0bb84740ef305343c87 Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Sun, 18 Sep 2022 15:25:37 -0400 Subject: [PATCH] Create repair issue if zwave-js-server is too old (#78670) * Create repair issue if zwave-js-server is too old * Switch is_fixable to false * review comments --- homeassistant/components/zwave_js/__init__.py | 15 +++++++ .../components/zwave_js/strings.json | 6 +++ tests/components/zwave_js/test_init.py | 45 ++++++++++++++++++- 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/zwave_js/__init__.py b/homeassistant/components/zwave_js/__init__.py index 066bc5101ae..d676a40d32f 100644 --- a/homeassistant/components/zwave_js/__init__.py +++ b/homeassistant/components/zwave_js/__init__.py @@ -34,6 +34,11 @@ from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import device_registry, entity_registry from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.dispatcher import async_dispatcher_send +from homeassistant.helpers.issue_registry import ( + IssueSeverity, + async_create_issue, + async_delete_issue, +) from homeassistant.helpers.typing import UNDEFINED, ConfigType from .addon import AddonError, AddonManager, AddonState, get_addon_manager @@ -133,10 +138,20 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: except InvalidServerVersion as err: if use_addon: async_ensure_addon_updated(hass) + else: + async_create_issue( + hass, + DOMAIN, + "invalid_server_version", + is_fixable=False, + severity=IssueSeverity.ERROR, + translation_key="invalid_server_version", + ) raise ConfigEntryNotReady(f"Invalid server version: {err}") from err except (asyncio.TimeoutError, BaseZwaveJSServerError) as err: raise ConfigEntryNotReady(f"Failed to connect: {err}") from err else: + async_delete_issue(hass, DOMAIN, "invalid_server_version") LOGGER.info("Connected to Zwave JS Server") dev_reg = device_registry.async_get(hass) diff --git a/homeassistant/components/zwave_js/strings.json b/homeassistant/components/zwave_js/strings.json index 91a6eae6ab6..19587cf0c0f 100644 --- a/homeassistant/components/zwave_js/strings.json +++ b/homeassistant/components/zwave_js/strings.json @@ -144,5 +144,11 @@ "ping": "Ping device", "reset_meter": "Reset meters on {subtype}" } + }, + "issues": { + "invalid_server_version": { + "title": "Newer version of Z-Wave JS Server needed", + "description": "The version of Z-Wave JS Server you are currently running is too old for this version of Home Assistant. Please update the Z-Wave JS Server to the latest version to fix this issue." + } } } diff --git a/tests/components/zwave_js/test_init.py b/tests/components/zwave_js/test_init.py index 5929657f595..c69c5a09f89 100644 --- a/tests/components/zwave_js/test_init.py +++ b/tests/components/zwave_js/test_init.py @@ -1,6 +1,7 @@ """Test the Z-Wave JS init module.""" +import asyncio from copy import deepcopy -from unittest.mock import call, patch +from unittest.mock import AsyncMock, call, patch import pytest from zwave_js_server.client import Client @@ -9,7 +10,7 @@ from zwave_js_server.exceptions import BaseZwaveJSServerError, InvalidServerVers from zwave_js_server.model.node import Node from homeassistant.components.hassio.handler import HassioAPIError -from homeassistant.components.zwave_js.const import DOMAIN +from homeassistant.components.zwave_js import DOMAIN from homeassistant.components.zwave_js.helpers import get_device_id from homeassistant.config_entries import ConfigEntryDisabler, ConfigEntryState from homeassistant.const import STATE_UNAVAILABLE @@ -18,6 +19,7 @@ from homeassistant.helpers import ( area_registry as ar, device_registry as dr, entity_registry as er, + issue_registry as ir, ) from .common import AIR_TEMPERATURE_SENSOR, EATON_RF9640_ENTITY @@ -696,6 +698,45 @@ async def test_update_addon( assert update_addon.call_count == update_calls +async def test_issue_registry(hass, client, version_state): + """Test issue registry.""" + device = "/test" + network_key = "abc123" + + client.connect.side_effect = InvalidServerVersion("Invalid version") + + entry = MockConfigEntry( + domain=DOMAIN, + title="Z-Wave JS", + data={ + "url": "ws://host1:3001", + "use_addon": False, + "usb_path": device, + "network_key": network_key, + }, + ) + entry.add_to_hass(hass) + + await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + + assert entry.state is ConfigEntryState.SETUP_RETRY + + issue_reg = ir.async_get(hass) + assert issue_reg.async_get_issue(DOMAIN, "invalid_server_version") + + async def connect(): + await asyncio.sleep(0) + client.connected = True + + client.connect = AsyncMock(side_effect=connect) + + await hass.config_entries.async_reload(entry.entry_id) + await hass.async_block_till_done() + assert entry.state is ConfigEntryState.LOADED + assert not issue_reg.async_get_issue(DOMAIN, "invalid_server_version") + + @pytest.mark.parametrize( "stop_addon_side_effect, entry_state", [