diff --git a/supervisor/discovery/const.py b/supervisor/discovery/const.py index fd93f010f..e06ae62c1 100644 --- a/supervisor/discovery/const.py +++ b/supervisor/discovery/const.py @@ -7,5 +7,6 @@ ATTR_PORT = "port" ATTR_PROTOCOL = "protocol" ATTR_SERIAL = "serial" ATTR_SSL = "ssl" +ATTR_URI = "uri" ATTR_URL = "url" ATTR_USERNAME = "username" diff --git a/supervisor/discovery/services/wyoming.py b/supervisor/discovery/services/wyoming.py new file mode 100644 index 000000000..fc1d571e6 --- /dev/null +++ b/supervisor/discovery/services/wyoming.py @@ -0,0 +1,25 @@ +"""Discovery service for the Wyoming Protocol integration.""" +from typing import Any, cast +from urllib.parse import urlparse + +import voluptuous as vol + +from ..const import ATTR_URI + + +def validate_uri(value: Any) -> str: + """Validate an Wyoming URI. + + Currently accepts TCP URIs, can extended + to accept UNIX sockets in the future. + """ + uri_value = str(value) + + if urlparse(uri_value).scheme == "tcp": + # pylint: disable-next=no-value-for-parameter + return cast(str, vol.Schema(vol.Url())(uri_value)) + + raise vol.Invalid("invalid Wyoming Protocol URI") + + +SCHEMA = vol.Schema({vol.Required(ATTR_URI): validate_uri}) diff --git a/tests/discovery/test_wyoming.py b/tests/discovery/test_wyoming.py new file mode 100644 index 000000000..f17c09670 --- /dev/null +++ b/tests/discovery/test_wyoming.py @@ -0,0 +1,27 @@ +"""Test wyoming discovery.""" + +import pytest +import voluptuous as vol + +from supervisor.discovery.validate import valid_discovery_config + + +def test_good_config(): + """Test good wyoming config.""" + + valid_discovery_config("wyoming", {"uri": "tcp://core-wyoming"}) + + valid_discovery_config("wyoming", {"uri": "tcp://core-wyoming:1234"}) + + +def test_bad_config(): + """Test bad wyoming config.""" + + with pytest.raises(vol.Invalid): + valid_discovery_config("wyoming", {"host": "test"}) + + with pytest.raises(vol.Invalid): + valid_discovery_config("wyoming", {"uri": "https://also.an.uri.com"}) + + with pytest.raises(vol.Invalid): + valid_discovery_config("wyoming", {"uri": "unix://not/supported/yet.socket"})