summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2026-08-25 14:19:25 -0500
committerJohn Estabrook <jestabro@vyos.io>2026-09-01 13:44:38 -0500
commit0a2f030916eb4a995175d12a22d48d0898a91ad7 (patch)
tree57929a4a319aad84cfd0438b01247b3be4b4da41 /python
parent5830f71fd8ae366211876f6c5fffd764c24f3015 (diff)
downloadvyos-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.py46
-rw-r--r--python/vyos/referencetree.py48
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