From e558fb54a6ee59f4db8a9946a0a3429871bd38da Mon Sep 17 00:00:00 2001 From: Stefan Gula Date: Tue, 16 Sep 2025 12:49:09 +0200 Subject: [PATCH] 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 --- libyang/data.py | 15 ++++++++++++++- tests/test_data.py | 3 +++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/libyang/data.py b/libyang/data.py index 9595ea1..e24a3ff 100644 --- a/libyang/data.py +++ b/libyang/data.py @@ -1015,7 +1015,7 @@ def leafref_link_node_tree(self) -> None: def leafref_nodes(self) -> Iterator["DNode"]: """ - Gets the leafref links record for given node. + Gets the nodes that are referring to this node. Requires leafref_linking to be set on the libyang context. """ @@ -1026,6 +1026,19 @@ def leafref_nodes(self) -> Iterator["DNode"]: for n in ly_array_iter(out[0].leafref_nodes): yield DNode.new(self.context, n) + def target_nodes(self) -> Iterator["DNode"]: + """ + Gets the target nodes that are referred by this node. + + Requires leafref_linking to be set on the libyang context. + """ + term_node = ffi.cast("struct lyd_node_term *", self.cdata) + out = ffi.new("const struct lyd_leafref_links_rec **") + if lib.lyd_leafref_get_links(term_node, out) != lib.LY_SUCCESS: + return + for n in ly_array_iter(out[0].target_nodes): + yield DNode.new(self.context, n) + def __repr__(self): cls = self.__class__ return "<%s.%s: %s>" % (cls.__module__, cls.__name__, str(self)) diff --git a/tests/test_data.py b/tests/test_data.py index 1479eb9..820db0c 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -1092,6 +1092,9 @@ def test_dnode_leafref_linking(self): dnode4 = next(dnode3.leafref_nodes()) self.assertIsInstance(dnode4, DLeaf) self.assertEqual(dnode4.cdata, dnode2.cdata) + dnode5 = next(dnode4.target_nodes()) + self.assertIsInstance(dnode5, DLeaf) + self.assertEqual(dnode5.cdata, dnode3.cdata) dnode1.free() def test_dnode_store_only(self):