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
This commit is contained in:
Raman Gupta 2022-09-18 15:25:37 -04:00 committed by GitHub
parent d74f5c6ee0
commit 4fbf44cced
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 64 additions and 2 deletions

View File

@ -34,6 +34,11 @@ from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.helpers import device_registry, entity_registry from homeassistant.helpers import device_registry, entity_registry
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.dispatcher import async_dispatcher_send 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 homeassistant.helpers.typing import UNDEFINED, ConfigType
from .addon import AddonError, AddonManager, AddonState, get_addon_manager 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: except InvalidServerVersion as err:
if use_addon: if use_addon:
async_ensure_addon_updated(hass) 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 raise ConfigEntryNotReady(f"Invalid server version: {err}") from err
except (asyncio.TimeoutError, BaseZwaveJSServerError) as err: except (asyncio.TimeoutError, BaseZwaveJSServerError) as err:
raise ConfigEntryNotReady(f"Failed to connect: {err}") from err raise ConfigEntryNotReady(f"Failed to connect: {err}") from err
else: else:
async_delete_issue(hass, DOMAIN, "invalid_server_version")
LOGGER.info("Connected to Zwave JS Server") LOGGER.info("Connected to Zwave JS Server")
dev_reg = device_registry.async_get(hass) dev_reg = device_registry.async_get(hass)

View File

@ -144,5 +144,11 @@
"ping": "Ping device", "ping": "Ping device",
"reset_meter": "Reset meters on {subtype}" "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."
}
} }
} }

View File

@ -1,6 +1,7 @@
"""Test the Z-Wave JS init module.""" """Test the Z-Wave JS init module."""
import asyncio
from copy import deepcopy from copy import deepcopy
from unittest.mock import call, patch from unittest.mock import AsyncMock, call, patch
import pytest import pytest
from zwave_js_server.client import Client 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 zwave_js_server.model.node import Node
from homeassistant.components.hassio.handler import HassioAPIError 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.components.zwave_js.helpers import get_device_id
from homeassistant.config_entries import ConfigEntryDisabler, ConfigEntryState from homeassistant.config_entries import ConfigEntryDisabler, ConfigEntryState
from homeassistant.const import STATE_UNAVAILABLE from homeassistant.const import STATE_UNAVAILABLE
@ -18,6 +19,7 @@ from homeassistant.helpers import (
area_registry as ar, area_registry as ar,
device_registry as dr, device_registry as dr,
entity_registry as er, entity_registry as er,
issue_registry as ir,
) )
from .common import AIR_TEMPERATURE_SENSOR, EATON_RF9640_ENTITY 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 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( @pytest.mark.parametrize(
"stop_addon_side_effect, entry_state", "stop_addon_side_effect, entry_state",
[ [