diff options
author | Christian Breunig <christian@breunig.cc> | 2023-05-27 11:33:37 +0200 |
---|---|---|
committer | Christian Breunig <christian@breunig.cc> | 2023-05-27 11:33:37 +0200 |
commit | f427201f56f84792d403baa49932645621457d31 (patch) | |
tree | 8b6df4cfa2ad2d4ca0fd570c47c685d8ec7d1295 /python/vyos/xml_ref | |
parent | a8c0a7e25bfff9f05b90c51d6ff6463325098487 (diff) | |
parent | ec8ffd2c967d178c913be645c896434aa3212c9c (diff) | |
download | vyos-1x-f427201f56f84792d403baa49932645621457d31.tar.gz vyos-1x-f427201f56f84792d403baa49932645621457d31.zip |
Merge branch 't5242-smoketest-dynamic' into current
* t5242-smoketest-dynamic:
smoketest: T5242: automatically detect interface "capabilities"
geneve: T2630: change lower limit MTU to 1200 bytes
gitignore: T5242: add XML dict cache file
bridge: T4579: fix error message for bridge and bond membership
T5242: example use of cli_defined
xml: T5242: add cli_defined boolean test for node existing under path
Diffstat (limited to 'python/vyos/xml_ref')
-rw-r--r-- | python/vyos/xml_ref/__init__.py | 3 | ||||
-rw-r--r-- | python/vyos/xml_ref/definition.py | 25 |
2 files changed, 28 insertions, 0 deletions
diff --git a/python/vyos/xml_ref/__init__.py b/python/vyos/xml_ref/__init__.py index ae5184746..2e144ef10 100644 --- a/python/vyos/xml_ref/__init__.py +++ b/python/vyos/xml_ref/__init__.py @@ -45,6 +45,9 @@ def is_valueless(path: list) -> bool: def is_leaf(path: list) -> bool: return load_reference().is_leaf(path) +def cli_defined(path: list, node: str, non_local=False) -> bool: + return load_reference().cli_defined(path, node, non_local=non_local) + def component_version() -> dict: return load_reference().component_version() diff --git a/python/vyos/xml_ref/definition.py b/python/vyos/xml_ref/definition.py index 429331577..95ecc01a6 100644 --- a/python/vyos/xml_ref/definition.py +++ b/python/vyos/xml_ref/definition.py @@ -92,6 +92,31 @@ class Xml: d = self._get_ref_path(path) return self._is_leaf_node(d) + @staticmethod + def _dict_get(d: dict, path: list) -> dict: + for i in path: + d = d.get(i, {}) + if not isinstance(d, dict): + return {} + if not d: + break + return d + + def _dict_find(self, d: dict, key: str, non_local=False) -> bool: + for k in list(d): + if k in ('node_data', 'component_version'): + continue + if k == key: + return True + if non_local and isinstance(d[k], dict): + if self._dict_find(d[k], key): + return True + return False + + def cli_defined(self, path: list, node: str, non_local=False) -> bool: + d = self._dict_get(self.ref, path) + return self._dict_find(d, node, non_local=non_local) + def component_version(self) -> dict: d = {} for k, v in self.ref['component_version']: |