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.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)

View File

@ -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."
}
}
}

View File

@ -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",
[