Skip to content

Commit 2740fa2

Browse files
stewegrjarry
authored andcommitted
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 <[email protected]>
1 parent e977f94 commit 2740fa2

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
@@ -1009,7 +1009,7 @@ def leafref_link_node_tree(self) -> None:
10091009

10101010
def leafref_nodes(self) -> Iterator["DNode"]:
10111011
"""
1012-
Gets the leafref links record for given node.
1012+
Gets the nodes that are referring to this node.
10131013
10141014
Requires leafref_linking to be set on the libyang context.
10151015
"""
@@ -1020,6 +1020,19 @@ def leafref_nodes(self) -> Iterator["DNode"]:
10201020
for n in ly_array_iter(out[0].leafref_nodes):
10211021
yield DNode.new(self.context, n)
10221022

1023+
def target_nodes(self) -> Iterator["DNode"]:
1024+
"""
1025+
Gets the target nodes that are referred by this node.
1026+
1027+
Requires leafref_linking to be set on the libyang context.
1028+
"""
1029+
term_node = ffi.cast("struct lyd_node_term *", self.cdata)
1030+
out = ffi.new("const struct lyd_leafref_links_rec **")
1031+
if lib.lyd_leafref_get_links(term_node, out) != lib.LY_SUCCESS:
1032+
return
1033+
for n in ly_array_iter(out[0].target_nodes):
1034+
yield DNode.new(self.context, n)
1035+
10231036
def __repr__(self):
10241037
cls = self.__class__
10251038
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)