summaryrefslogtreecommitdiff
path: root/python/vyos/xml
diff options
context:
space:
mode:
Diffstat (limited to 'python/vyos/xml')
-rw-r--r--python/vyos/xml/__init__.py2
-rw-r--r--python/vyos/xml/definition.py6
-rw-r--r--python/vyos/xml/kw.py1
-rw-r--r--python/vyos/xml/load.py17
4 files changed, 23 insertions, 3 deletions
diff --git a/python/vyos/xml/__init__.py b/python/vyos/xml/__init__.py
index 0ef0c85ce..e0eacb2d1 100644
--- a/python/vyos/xml/__init__.py
+++ b/python/vyos/xml/__init__.py
@@ -46,6 +46,8 @@ def is_tag(lpath):
def is_leaf(lpath, flat=True):
return load_configuration().is_leaf(lpath, flat)
+def component_versions():
+ return load_configuration().component_versions()
def defaults(lpath, flat=False):
return load_configuration().defaults(lpath, flat)
diff --git a/python/vyos/xml/definition.py b/python/vyos/xml/definition.py
index f556c5ced..5e0d5282c 100644
--- a/python/vyos/xml/definition.py
+++ b/python/vyos/xml/definition.py
@@ -30,6 +30,7 @@ class XML(dict):
self[kw.owners] = {}
self[kw.default] = {}
self[kw.tags] = []
+ self[kw.component_version] = {}
dict.__init__(self)
@@ -248,6 +249,11 @@ class XML(dict):
# @lru_cache(maxsize=100)
# XXX: need to use cachetool instead - for later
+ def component_versions(self) -> dict:
+ sort_component = sorted(self[kw.component_version].items(),
+ key = lambda kv: kv[0])
+ return dict(sort_component)
+
def defaults(self, lpath, flat):
d = self[kw.default]
for k in lpath:
diff --git a/python/vyos/xml/kw.py b/python/vyos/xml/kw.py
index 58d47e751..48226ce96 100644
--- a/python/vyos/xml/kw.py
+++ b/python/vyos/xml/kw.py
@@ -32,6 +32,7 @@ priorities = '[priorities]'
owners = '[owners]'
tags = '[tags]'
default = '[default]'
+component_version = '[component_version]'
# nodes
diff --git a/python/vyos/xml/load.py b/python/vyos/xml/load.py
index 37479c6e1..c3022f3d6 100644
--- a/python/vyos/xml/load.py
+++ b/python/vyos/xml/load.py
@@ -115,7 +115,12 @@ def _format_nodes(inside, conf, xml):
nodetype = 'tagNode'
nodename = kw.tagNode
elif 'syntaxVersion' in conf.keys():
- conf.pop('syntaxVersion')
+ sv = conf.pop('syntaxVersion')
+ if isinstance(sv, list):
+ for v in sv:
+ xml[kw.component_version][v['@component']] = v['@version']
+ else:
+ xml[kw.component_version][sv['@component']] = sv['@version']
continue
else:
_fatal(conf.keys())
@@ -125,14 +130,20 @@ def _format_nodes(inside, conf, xml):
for node in nodes:
name = node.pop('@name')
into = inside + [name]
- r[name] = _format_node(into, node, xml)
+ if name in r:
+ r[name].update(_format_node(into, node, xml))
+ else:
+ r[name] = _format_node(into, node, xml)
r[name][kw.node] = nodename
xml[kw.tags].append(' '.join(into))
else:
node = nodes
name = node.pop('@name')
into = inside + [name]
- r[name] = _format_node(inside + [name], node, xml)
+ if name in r:
+ r[name].update(_format_node(inside + [name], node, xml))
+ else:
+ r[name] = _format_node(inside + [name], node, xml)
r[name][kw.node] = nodename
xml[kw.tags].append(' '.join(into))
return r