Skip to content

Commit b684b4e

Browse files
committed
data: Adding ability to get target_nodes
This patch introduces target_nodes API, which allows user to get all target data nodes that current leafref node is pointing to Signed-off-by: Stefan Gula <steweg@gmail.com>
1 parent 3072af0 commit b684b4e

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

libyang/data.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1015,7 +1015,7 @@ def leafref_link_node_tree(self) -> None:
10151015

10161016
def leafref_nodes(self) -> Iterator["DNode"]:
10171017
"""
1018-
Gets the leafref links record for given node.
1018+
Gets the nodes that are referring to this node.
10191019
10201020
Requires leafref_linking to be set on the libyang context.
10211021
"""
@@ -1026,6 +1026,19 @@ def leafref_nodes(self) -> Iterator["DNode"]:
10261026
for n in ly_array_iter(out[0].leafref_nodes):
10271027
yield DNode.new(self.context, n)
10281028

1029+
def target_nodes(self) -> Iterator["DNode"]:
1030+
"""
1031+
Gets the target nodes that are referred by this node.
1032+
1033+
Requires leafref_linking to be set on the libyang context.
1034+
"""
1035+
term_node = ffi.cast("struct lyd_node_term *", self.cdata)
1036+
out = ffi.new("const struct lyd_leafref_links_rec **")
1037+
if lib.lyd_leafref_get_links(term_node, out) != lib.LY_SUCCESS:
1038+
return
1039+
for n in ly_array_iter(out[0].target_nodes):
1040+
yield DNode.new(self.context, n)
1041+
10291042
def __repr__(self):
10301043
cls = self.__class__
10311044
return "<%s.%s: %s>" % (cls.__module__, cls.__name__, str(self))

tests/test_data.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,6 +1092,9 @@ def test_dnode_leafref_linking(self):
10921092
dnode4 = next(dnode3.leafref_nodes())
10931093
self.assertIsInstance(dnode4, DLeaf)
10941094
self.assertEqual(dnode4.cdata, dnode2.cdata)
1095+
dnode5 = next(dnode4.target_nodes())
1096+
self.assertIsInstance(dnode5, DLeaf)
1097+
self.assertEqual(dnode5.cdata, dnode3.cdata)
10951098
dnode1.free()
10961099

10971100
def test_dnode_store_only(self):

0 commit comments

Comments
 (0)