From 3ff2f3204ababa520f49b83101d4c9ee33304ed3 Mon Sep 17 00:00:00 2001
From: John Estabrook <jestabro@vyos.io>
Date: Tue, 7 May 2024 14:52:14 -0500
Subject: xml: T6319: add util for ancestor owner/priority

(cherry picked from commit 2551a741af9ac4f7dfff8dc5cbe47173a99fa478)
---
 python/vyos/xml_ref/__init__.py   |  6 ++++++
 python/vyos/xml_ref/definition.py | 27 +++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/python/vyos/xml_ref/__init__.py b/python/vyos/xml_ref/__init__.py
index bf434865d..2ba3da4e8 100644
--- a/python/vyos/xml_ref/__init__.py
+++ b/python/vyos/xml_ref/__init__.py
@@ -53,6 +53,12 @@ def is_valueless(path: list) -> bool:
 def is_leaf(path: list) -> bool:
     return load_reference().is_leaf(path)
 
+def owner(path: list) -> str:
+    return load_reference().owner(path)
+
+def priority(path: list) -> str:
+    return load_reference().priority(path)
+
 def cli_defined(path: list, node: str, non_local=False) -> bool:
     return load_reference().cli_defined(path, node, non_local=non_local)
 
diff --git a/python/vyos/xml_ref/definition.py b/python/vyos/xml_ref/definition.py
index c90c5ddbc..c85835ffd 100644
--- a/python/vyos/xml_ref/definition.py
+++ b/python/vyos/xml_ref/definition.py
@@ -135,6 +135,33 @@ class Xml:
         d = self._get_ref_path(path)
         return self._is_leaf_node(d)
 
+    def _least_upper_data(self, path: list, name: str) -> str:
+        ref_path = path.copy()
+        d = self.ref
+        data = ''
+        while ref_path and d:
+            d = d.get(ref_path[0], {})
+            ref_path.pop(0)
+            if self._is_tag_node(d) and ref_path:
+                ref_path.pop(0)
+            if self._is_leaf_node(d) and ref_path:
+                ref_path.pop(0)
+            res = self._get_ref_node_data(d, name)
+            if res is not None:
+                data = res
+
+        return data
+
+    def owner(self, path: list) -> str:
+        from pathlib import Path
+        data = self._least_upper_data(path, 'owner')
+        if data:
+            data = Path(data.split()[0]).name
+        return data
+
+    def priority(self, path: list) -> str:
+        return self._least_upper_data(path, 'priority')
+
     @staticmethod
     def _dict_get(d: dict, path: list) -> dict:
         for i in path:
-- 
cgit v1.2.3