summaryrefslogtreecommitdiff
path: root/tools/net/ynl/pyynl/lib/nlspec.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/net/ynl/pyynl/lib/nlspec.py')
-rw-r--r--tools/net/ynl/pyynl/lib/nlspec.py31
1 files changed, 27 insertions, 4 deletions
diff --git a/tools/net/ynl/pyynl/lib/nlspec.py b/tools/net/ynl/pyynl/lib/nlspec.py
index fcffeb5b7ba3..b4ec59814ab1 100644
--- a/tools/net/ynl/pyynl/lib/nlspec.py
+++ b/tools/net/ynl/pyynl/lib/nlspec.py
@@ -12,6 +12,8 @@ import importlib
import os
import yaml as pyyaml
+from .specdir import find_spec, SYS_SCHEMA_DIR
+
class SpecException(Exception):
"""Netlink spec exception.
@@ -439,7 +441,28 @@ class SpecFamily(SpecElement):
# To be loaded dynamically as needed
jsonschema = None
- def __init__(self, spec_path, schema_path=None, exclude_ops=None):
+ try:
+ _yaml_loader = pyyaml.CSafeLoader
+ except AttributeError:
+ _yaml_loader = pyyaml.SafeLoader
+
+ def __init__(self, spec_path=None, schema_path=None, exclude_ops=None,
+ family=None):
+ # schema_path selects how the spec is validated:
+ # None -- no preference: validate against the default schema,
+ # but trust (skip) installed specs selected by family=
+ # True -- always validate against the default schema
+ # path -- validate against this schema
+ # '' -- do not validate
+ if (spec_path is None) == (family is None):
+ raise ValueError("Specify exactly one of spec path or family name")
+ if family is not None:
+ spec_path = find_spec(family)
+ # Installed specs are assumed correct, so skip schema validation
+ # to save cycles unless the caller asked to validate.
+ if schema_path is None and spec_path.startswith(SYS_SCHEMA_DIR):
+ schema_path = ''
+
with open(spec_path, "r", encoding='utf-8') as stream:
prefix = '# SPDX-License-Identifier: '
first = stream.readline().strip()
@@ -448,7 +471,7 @@ class SpecFamily(SpecElement):
self.license = first[len(prefix):]
stream.seek(0)
- spec = pyyaml.safe_load(stream)
+ spec = pyyaml.load(stream, Loader=self._yaml_loader)
self.fixed_header = None
self._resolution_list = []
@@ -460,11 +483,11 @@ class SpecFamily(SpecElement):
self.proto = self.yaml.get('protocol', 'genetlink')
self.msg_id_model = self.yaml['operations'].get('enum-model', 'unified')
- if schema_path is None:
+ if schema_path is None or schema_path is True:
schema_path = os.path.dirname(os.path.dirname(spec_path)) + f'/{self.proto}.yaml'
if schema_path:
with open(schema_path, "r", encoding='utf-8') as stream:
- schema = pyyaml.safe_load(stream)
+ schema = pyyaml.load(stream, Loader=self._yaml_loader)
if SpecFamily.jsonschema is None:
SpecFamily.jsonschema = importlib.import_module("jsonschema")