diff options
| author | John Estabrook <jestabro@vyos.io> | 2026-08-25 14:19:25 -0500 |
|---|---|---|
| committer | John Estabrook <jestabro@vyos.io> | 2026-09-01 13:44:38 -0500 |
| commit | 0a2f030916eb4a995175d12a22d48d0898a91ad7 (patch) | |
| tree | 57929a4a319aad84cfd0438b01247b3be4b4da41 /python | |
| parent | 5830f71fd8ae366211876f6c5fffd764c24f3015 (diff) | |
| download | vyos-1x-0a2f030916eb4a995175d12a22d48d0898a91ad7.tar.gz vyos-1x-0a2f030916eb4a995175d12a22d48d0898a91ad7.zip | |
T9231: add wrappers for reference_tree utils
Diffstat (limited to 'python')
| -rw-r--r-- | python/vyos/configtree.py | 46 | ||||
| -rw-r--r-- | python/vyos/referencetree.py | 48 |
2 files changed, 91 insertions, 3 deletions
diff --git a/python/vyos/configtree.py b/python/vyos/configtree.py index 90e889692..7354f9a50 100644 --- a/python/vyos/configtree.py +++ b/python/vyos/configtree.py @@ -78,6 +78,7 @@ _PROTOTYPES = { 'mask_inclusive': ([c_void_p, c_void_p], c_void_p), 'mask_exclusive': ([c_void_p, c_void_p], c_void_p), 'subtree_from_partial': ([c_void_p, c_void_p, c_void_p, c_char_p], c_void_p), + 'subtree_values_of_path': ([c_void_p, c_void_p, c_char_p], c_char_p), 'reference_tree_to_json': ([c_char_p, c_char_p, c_char_p], None), 'merge_reference_tree_cache': ([c_char_p, c_char_p, c_char_p], None), 'interface_definitions_to_cache': ([c_char_p, c_char_p], None), @@ -89,6 +90,12 @@ _PROTOTYPES = { 'read_internal_string_reference_tree': ([c_char_p], c_void_p), 'write_internal_reference_tree': ([c_void_p, c_char_p], None), 'to_json_reference_tree': ([c_void_p], c_char_p), + 'get_owner': ([c_void_p, c_char_p], c_char_p), + 'get_multi_nodes': ([c_void_p, c_char_p], c_char_p), + 'get_tag_nodes': ([c_void_p, c_char_p], c_char_p), + 'get_nodes_of_kind': ([c_void_p, c_char_p, c_char_p], c_char_p), + 'get_rdeps_of_kind': ([c_void_p, c_char_p, c_char_p], c_char_p), + 'get_rdeps_of_kind_data': ([c_void_p, c_char_p, c_char_p], c_char_p), } @@ -102,6 +109,8 @@ class _Lib: on symbols that were actually used. """ + # pylint: disable=too-few-public-methods + def __init__(self, libpath): self.__dict__['_lib'] = cdll.LoadLibrary(libpath) @@ -331,7 +340,9 @@ class ConfigTree: self.__config, path_str, str(value).encode() ) else: - res = self.__lib.set_add_value(self.__config, path_str, str(value).encode()) + res = self.__lib.set_add_value( + self.__config, path_str, str(value).encode() + ) if res != 0: msg = self.__lib.get_error().decode() @@ -694,6 +705,35 @@ def subtree_from_partial( return tree +def subtree_values_of_path( + config_tree: ConfigTree, + path: list[str], + reference_tree: 'ReferenceTree', + libpath=LIBPATH, +) -> list[tuple[list[str], list[str]]]: + # pylint: disable=raise-missing-from + check_path(path) + path_str = ' '.join(map(str, path)).encode() + + try: + lib = get_lib(libpath) + + res = lib.subtree_values_of_path( + reference_tree.get_tree(), + config_tree.get_tree(), + path_str, + ) + res = res.decode() + except Exception as e: + raise ConfigTreeError(e) + if res == '#1@': + msg = lib.get_error().decode() + raise ConfigTreeError(msg) + + lst = json.loads(res) + return list(map(tuple, lst)) + + def reference_tree_to_json(from_dir, to_file, internal_cache='', libpath=LIBPATH): # pylint: disable=raise-missing-from try: @@ -738,7 +778,9 @@ def reference_tree_cache_to_json(cache_path, render_file, libpath=LIBPATH): # pylint: disable=raise-missing-from try: lib = get_lib(libpath) - res = lib.reference_tree_cache_to_json(cache_path.encode(), render_file.encode()) + res = lib.reference_tree_cache_to_json( + cache_path.encode(), render_file.encode() + ) except Exception as e: raise ConfigTreeError(e) if res == 1: diff --git a/python/vyos/referencetree.py b/python/vyos/referencetree.py index c2cb654b4..1ffa690bc 100644 --- a/python/vyos/referencetree.py +++ b/python/vyos/referencetree.py @@ -25,7 +25,7 @@ class ReferenceTreeError(Exception): class ReferenceTree: - # pylint: disable=too-many-instance-attributes,raise-missing-from + # pylint: disable=too-many-instance-attributes,raise-missing-from,import-outside-toplevel def __init__(self, cache_file=reference_tree_cache, libpath=LIBPATH): self.__pointer = None self.__lib = get_lib(libpath) @@ -61,3 +61,49 @@ class ReferenceTree: def to_json(self): return self.__lib.to_json_reference_tree(self.__pointer).decode() + + def get_owner(self, path): + return self.__lib.get_owner(self.__pointer, path.encode()).decode() + + def get_multi_nodes(self, tag_value_placeholder='', as_tuple=False): + import json + + res = self.__lib.get_multi_nodes( + self.__pointer, tag_value_placeholder.encode() + ).decode() + sort = sorted(json.loads(res)) + return list(map(tuple, sort)) if as_tuple else sort + + def get_tag_nodes(self, tag_value_placeholder='', as_tuple=False): + import json + + res = self.__lib.get_tag_nodes( + self.__pointer, tag_value_placeholder.encode() + ).decode() + sort = sorted(json.loads(res)) + return list(map(tuple, sort)) if as_tuple else sort + + def get_nodes_of_kind(self, kind, tag_value_placeholder=''): + import json + + res = self.__lib.get_nodes_of_kind( + self.__pointer, kind.encode(), tag_value_placeholder.encode() + ).decode() + return sorted(json.loads(res)) + + def get_rdeps_of_kind(self, kind, tag_value_placeholder=''): + import json + + res = self.__lib.get_rdeps_of_kind( + self.__pointer, kind.encode(), tag_value_placeholder.encode() + ).decode() + return sorted(json.loads(res)) + + def get_rdeps_of_kind_data(self, kind, tag_value_placeholder='', as_tuple=True): + import json + + res = self.__lib.get_rdeps_of_kind_data( + self.__pointer, kind.encode(), tag_value_placeholder.encode() + ).decode() + sort = sorted(json.loads(res)) + return list(map(tuple, sort)) if as_tuple else sort |
