Raise repair issues when scripts can't be set up (#122087)
This commit is contained in:
parent
e2276458ed
commit
0927dd9090
4 changed files with 189 additions and 23 deletions
|
@ -4,6 +4,7 @@ from __future__ import annotations
|
|||
|
||||
from collections.abc import Mapping
|
||||
from contextlib import suppress
|
||||
from enum import StrEnum
|
||||
from typing import Any
|
||||
|
||||
import voluptuous as vol
|
||||
|
@ -118,6 +119,12 @@ async def _async_validate_config_item(
|
|||
with suppress(ValueError): # Invalid config
|
||||
raw_config = dict(config)
|
||||
|
||||
def _humanize(err: Exception, data: Any) -> str:
|
||||
"""Humanize vol.Invalid, stringify other exceptions."""
|
||||
if isinstance(err, vol.Invalid):
|
||||
return humanize_error(data, err)
|
||||
return str(err)
|
||||
|
||||
def _log_invalid_script(
|
||||
err: Exception,
|
||||
script_name: str,
|
||||
|
@ -133,7 +140,7 @@ async def _async_validate_config_item(
|
|||
"Blueprint '%s' generated invalid script with inputs %s: %s",
|
||||
blueprint_inputs.blueprint.name,
|
||||
blueprint_inputs.inputs,
|
||||
humanize_error(data, err) if isinstance(err, vol.Invalid) else err,
|
||||
_humanize(err, data),
|
||||
)
|
||||
return
|
||||
|
||||
|
@ -141,17 +148,35 @@ async def _async_validate_config_item(
|
|||
"%s %s and has been disabled: %s",
|
||||
script_name,
|
||||
problem,
|
||||
humanize_error(data, err) if isinstance(err, vol.Invalid) else err,
|
||||
_humanize(err, data),
|
||||
)
|
||||
return
|
||||
|
||||
def _minimal_config() -> ScriptConfig:
|
||||
def _set_validation_status(
|
||||
script_config: ScriptConfig,
|
||||
validation_status: ValidationStatus,
|
||||
validation_error: Exception,
|
||||
config: ConfigType,
|
||||
) -> None:
|
||||
"""Set validation status."""
|
||||
if uses_blueprint:
|
||||
validation_status = ValidationStatus.FAILED_BLUEPRINT
|
||||
script_config.validation_status = validation_status
|
||||
script_config.validation_error = _humanize(validation_error, config)
|
||||
|
||||
def _minimal_config(
|
||||
validation_status: ValidationStatus,
|
||||
validation_error: Exception,
|
||||
config: ConfigType,
|
||||
) -> ScriptConfig:
|
||||
"""Try validating id, alias and description."""
|
||||
minimal_config = _MINIMAL_SCRIPT_ENTITY_SCHEMA(config)
|
||||
script_config = ScriptConfig(minimal_config)
|
||||
script_config.raw_blueprint_inputs = raw_blueprint_inputs
|
||||
script_config.raw_config = raw_config
|
||||
script_config.validation_failed = True
|
||||
_set_validation_status(
|
||||
script_config, validation_status, validation_error, config
|
||||
)
|
||||
return script_config
|
||||
|
||||
if is_blueprint_instance_config(config):
|
||||
|
@ -167,7 +192,7 @@ async def _async_validate_config_item(
|
|||
)
|
||||
if raise_on_errors:
|
||||
raise
|
||||
return _minimal_config()
|
||||
return _minimal_config(ValidationStatus.FAILED_BLUEPRINT, err, config)
|
||||
|
||||
raw_blueprint_inputs = blueprint_inputs.config_with_inputs
|
||||
|
||||
|
@ -184,7 +209,7 @@ async def _async_validate_config_item(
|
|||
)
|
||||
if raise_on_errors:
|
||||
raise HomeAssistantError(err) from err
|
||||
return _minimal_config()
|
||||
return _minimal_config(ValidationStatus.FAILED_BLUEPRINT, err, config)
|
||||
|
||||
script_name = f"Script with object id '{object_id}'"
|
||||
if isinstance(config, Mapping):
|
||||
|
@ -202,7 +227,7 @@ async def _async_validate_config_item(
|
|||
_log_invalid_script(err, script_name, "could not be validated", config)
|
||||
if raise_on_errors:
|
||||
raise
|
||||
return _minimal_config()
|
||||
return _minimal_config(ValidationStatus.FAILED_SCHEMA, err, config)
|
||||
|
||||
script_config = ScriptConfig(validated_config)
|
||||
script_config.raw_blueprint_inputs = raw_blueprint_inputs
|
||||
|
@ -217,22 +242,34 @@ async def _async_validate_config_item(
|
|||
HomeAssistantError,
|
||||
) as err:
|
||||
_log_invalid_script(
|
||||
err, script_name, "failed to setup actions", validated_config
|
||||
err, script_name, "failed to setup sequence", validated_config
|
||||
)
|
||||
if raise_on_errors:
|
||||
raise
|
||||
script_config.validation_failed = True
|
||||
_set_validation_status(
|
||||
script_config, ValidationStatus.FAILED_SEQUENCE, err, validated_config
|
||||
)
|
||||
return script_config
|
||||
|
||||
return script_config
|
||||
|
||||
|
||||
class ValidationStatus(StrEnum):
|
||||
"""What was changed in a config entry."""
|
||||
|
||||
FAILED_BLUEPRINT = "failed_blueprint"
|
||||
FAILED_SCHEMA = "failed_schema"
|
||||
FAILED_SEQUENCE = "failed_sequence"
|
||||
OK = "ok"
|
||||
|
||||
|
||||
class ScriptConfig(dict):
|
||||
"""Dummy class to allow adding attributes."""
|
||||
|
||||
raw_config: ConfigType | None = None
|
||||
raw_blueprint_inputs: ConfigType | None = None
|
||||
validation_failed: bool = False
|
||||
validation_status: ValidationStatus = ValidationStatus.OK
|
||||
validation_error: str | None = None
|
||||
|
||||
|
||||
async def _try_async_validate_config_item(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue