summaryrefslogtreecommitdiff
path: root/python/vyos/config.py
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2023-06-24 08:07:44 -0500
committerGitHub <noreply@github.com>2023-06-24 08:07:44 -0500
commitf932180f70d3c6cbdfd500d7db1d831ac6ad6221 (patch)
tree08bad3e25a755dceff3b14ea3549e65cf599e82e /python/vyos/config.py
parentce37b953771ac5c1f81c437160e1d49a39c1dd37 (diff)
parentd19e7e5ce633f42f2a084ebd17e8c1e3dfef6b03 (diff)
downloadvyos-1x-f932180f70d3c6cbdfd500d7db1d831ac6ad6221.tar.gz
vyos-1x-f932180f70d3c6cbdfd500d7db1d831ac6ad6221.zip
Merge pull request #2010 from jestabro/revise-config-dict
config: T5228: simplify get_config_dict and add argument with_defaults
Diffstat (limited to 'python/vyos/config.py')
-rw-r--r--python/vyos/config.py56
1 files changed, 43 insertions, 13 deletions
diff --git a/python/vyos/config.py b/python/vyos/config.py
index 287fd2ed1..c3bb68373 100644
--- a/python/vyos/config.py
+++ b/python/vyos/config.py
@@ -1,4 +1,4 @@
-# Copyright 2017, 2019 VyOS maintainers and contributors <maintainers@vyos.io>
+# Copyright 2017, 2019-2023 VyOS maintainers and contributors <maintainers@vyos.io>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@@ -67,9 +67,9 @@ import re
import json
from copy import deepcopy
-import vyos.xml
-import vyos.util
import vyos.configtree
+from vyos.xml_ref import multi_to_list, merge_defaults, relative_defaults
+from vyos.utils.dict import get_sub_dict, mangle_dict_keys
from vyos.configsource import ConfigSource, ConfigSourceSession
class Config(object):
@@ -225,7 +225,8 @@ class Config(object):
def get_config_dict(self, path=[], effective=False, key_mangling=None,
get_first_key=False, no_multi_convert=False,
- no_tag_node_value_mangle=False):
+ no_tag_node_value_mangle=False,
+ with_defaults=False, with_recursive_defaults=False):
"""
Args:
path (str list): Configuration tree path, can be empty
@@ -238,19 +239,23 @@ class Config(object):
"""
lpath = self._make_path(path)
root_dict = self.get_cached_root_dict(effective)
- conf_dict = vyos.util.get_sub_dict(root_dict, lpath, get_first_key)
+ conf_dict = get_sub_dict(root_dict, lpath, get_first_key)
- if not key_mangling and no_multi_convert:
+ if key_mangling is None and no_multi_convert and not with_defaults:
return deepcopy(conf_dict)
- xmlpath = lpath if get_first_key else lpath[:-1]
+ rpath = lpath if get_first_key else lpath[:-1]
- if not key_mangling:
- conf_dict = vyos.xml.multi_to_list(xmlpath, conf_dict)
- return conf_dict
+ if not no_multi_convert:
+ conf_dict = multi_to_list(rpath, conf_dict)
+
+ if with_defaults or with_recursive_defaults:
+ conf_dict = merge_defaults(lpath, conf_dict,
+ get_first_key=get_first_key,
+ recursive=with_recursive_defaults)
- if no_multi_convert is False:
- conf_dict = vyos.xml.multi_to_list(xmlpath, conf_dict)
+ if key_mangling is None:
+ return conf_dict
if not (isinstance(key_mangling, tuple) and \
(len(key_mangling) == 2) and \
@@ -258,10 +263,35 @@ class Config(object):
isinstance(key_mangling[1], str)):
raise ValueError("key_mangling must be a tuple of two strings")
- conf_dict = vyos.util.mangle_dict_keys(conf_dict, key_mangling[0], key_mangling[1], abs_path=xmlpath, no_tag_node_value_mangle=no_tag_node_value_mangle)
+ conf_dict = mangle_dict_keys(conf_dict, key_mangling[0], key_mangling[1], abs_path=rpath, no_tag_node_value_mangle=no_tag_node_value_mangle)
return conf_dict
+ def get_config_defaults(self, path=[], effective=False, key_mangling=None,
+ no_tag_node_value_mangle=False, get_first_key=False,
+ recursive=False) -> dict:
+ lpath = self._make_path(path)
+ root_dict = self.get_cached_root_dict(effective)
+ conf_dict = get_sub_dict(root_dict, lpath, get_first_key)
+
+ defaults = relative_defaults(lpath, conf_dict,
+ get_first_key=get_first_key,
+ recursive=recursive)
+ if key_mangling is None:
+ return defaults
+
+ rpath = lpath if get_first_key else lpath[:-1]
+
+ if not (isinstance(key_mangling, tuple) and \
+ (len(key_mangling) == 2) and \
+ isinstance(key_mangling[0], str) and \
+ isinstance(key_mangling[1], str)):
+ raise ValueError("key_mangling must be a tuple of two strings")
+
+ defaults = mangle_dict_keys(defaults, key_mangling[0], key_mangling[1], abs_path=rpath, no_tag_node_value_mangle=no_tag_node_value_mangle)
+
+ return defaults
+
def is_multi(self, path):
"""
Args: