validate drivers

This commit is contained in:
Devaev Maxim 2020-09-08 12:13:44 +03:00
parent 7098eab258
commit d932a937ca
2 changed files with 10 additions and 4 deletions

View File

@ -52,6 +52,8 @@ from ..yamlconf import build_raw_from_options
from ..yamlconf.dumper import make_config_dump from ..yamlconf.dumper import make_config_dump
from ..yamlconf.loader import load_yaml_file from ..yamlconf.loader import load_yaml_file
from ..validators import check_string_in_list
from ..validators.basic import valid_stripped_string from ..validators.basic import valid_stripped_string
from ..validators.basic import valid_stripped_string_not_empty from ..validators.basic import valid_stripped_string_not_empty
from ..validators.basic import valid_bool from ..validators.basic import valid_bool
@ -179,6 +181,7 @@ def _patch_dynamic( # pylint: disable=too-many-locals
rebuild = True rebuild = True
if load_gpio: if load_gpio:
drivers: List[str] = []
for (driver, params) in { # type: ignore for (driver, params) in { # type: ignore
"__gpio__": {}, "__gpio__": {},
**tools.rget(raw_config, "kvmd", "gpio", "drivers"), **tools.rget(raw_config, "kvmd", "gpio", "drivers"),
@ -189,12 +192,17 @@ def _patch_dynamic( # pylint: disable=too-many-locals
"type": Option(driver_type, type=valid_stripped_string_not_empty), "type": Option(driver_type, type=valid_stripped_string_not_empty),
**get_ugpio_driver_class(driver_type).get_plugin_options() **get_ugpio_driver_class(driver_type).get_plugin_options()
} }
drivers.append(driver)
for (channel, params) in tools.rget(raw_config, "kvmd", "gpio", "scheme").items(): for (channel, params) in tools.rget(raw_config, "kvmd", "gpio", "scheme").items():
channel = valid_ugpio_channel(channel) channel = valid_ugpio_channel(channel)
mode = valid_ugpio_mode(params.get("mode", "")) mode = valid_ugpio_mode(params.get("mode", ""))
scheme["kvmd"]["gpio"]["scheme"][channel] = { scheme["kvmd"]["gpio"]["scheme"][channel] = {
"driver": Option("__gpio__"), "driver": Option("__gpio__", type=(lambda arg: check_string_in_list(
arg=valid_stripped_string_not_empty(arg),
name="configured GPIO driver",
variants=drivers,
))),
"pin": Option(-1, type=valid_gpio_pin), "pin": Option(-1, type=valid_gpio_pin),
"mode": Option("", type=valid_ugpio_mode), "mode": Option("", type=valid_ugpio_mode),
"inverted": Option(False, type=valid_bool), "inverted": Option(False, type=valid_bool),

View File

@ -235,9 +235,7 @@ class UserGpio:
self.__outputs: Dict[str, _GpioOutput] = {} self.__outputs: Dict[str, _GpioOutput] = {}
for (channel, ch_config) in sorted(config.scheme.items(), key=operator.itemgetter(0)): for (channel, ch_config) in sorted(config.scheme.items(), key=operator.itemgetter(0)):
driver = self.__drivers.get(ch_config.driver) driver = self.__drivers[ch_config.driver]
if driver is None:
raise RuntimeError(f"Missing User-GPIO driver configuration: {ch_config.driver}")
if ch_config.mode == "input": if ch_config.mode == "input":
self.__inputs[channel] = _GpioInput(channel, ch_config, driver) self.__inputs[channel] = _GpioInput(channel, ch_config, driver)
else: # output: else: # output: