summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rwxr-xr-xpython/vyos/xml_ref/generate_op_cache.py11
-rw-r--r--python/vyos/xml_ref/op_definition.py30
2 files changed, 41 insertions, 0 deletions
diff --git a/python/vyos/xml_ref/generate_op_cache.py b/python/vyos/xml_ref/generate_op_cache.py
index 4c98cf18d..4c22672b2 100755
--- a/python/vyos/xml_ref/generate_op_cache.py
+++ b/python/vyos/xml_ref/generate_op_cache.py
@@ -38,6 +38,7 @@ from op_definition import key_name
from op_definition import key_type
from op_definition import node_data_difference
from op_definition import get_node_data
+from op_definition import collapse
_here = dirname(__file__)
@@ -235,6 +236,11 @@ def main():
action='store_true',
help='check consistency of node data across files',
)
+ parser.add_argument(
+ '--check-path-ambiguity',
+ action='store_true',
+ help='attempt to reduce to unique paths, reporting if error',
+ )
args = vars(parser.parse_args())
@@ -251,6 +257,11 @@ def main():
d = sort_op_data(d)
+ if args['check_path_ambiguity']:
+ # when the following passes with no output, return value will be
+ # the full dictionary indexed by str, not tuple
+ _ = collapse(d)
+
with open(op_ref_cache, 'w') as f:
f.write('from vyos.xml_ref.op_definition import NodeData\n')
f.write(f'op_reference = {str(d)}')
diff --git a/python/vyos/xml_ref/op_definition.py b/python/vyos/xml_ref/op_definition.py
index 46ccc3ef4..71076bdb7 100644
--- a/python/vyos/xml_ref/op_definition.py
+++ b/python/vyos/xml_ref/op_definition.py
@@ -134,6 +134,36 @@ def node_data_difference(a: NodeData, b: NodeData):
return out
+def collapse(d: OpData, acc: dict = None) -> dict:
+ if acc is None:
+ acc = {}
+ if not isinstance(d, dict):
+ return d
+ for k, v in d.items():
+ if isinstance(k, tuple):
+ # reduce
+ name = key_name(k)
+ if name != '__node_data':
+ new_data = get_node_data(v)
+ if name in list(acc.keys()):
+ prev_data = acc[name].get('__node_data', {})
+ if prev_data:
+ out = f'prev: {prev_data.file} {prev_data.path}\n'
+ else:
+ out = '\n'
+ out += f'new: {new_data.file} {new_data.path}\n'
+ print(out)
+ else:
+ acc[name] = {}
+ acc[name]['__node_data'] = new_data
+ acc[name].update(collapse(v))
+ else:
+ name = k
+ acc[name] = v
+
+ return acc
+
+
class OpXml:
def __init__(self):
self.op_ref = {}