diff options
author | Viacheslav Hletenko <v.gletenko@vyos.io> | 2022-11-02 14:55:27 +0200 |
---|---|---|
committer | Viacheslav Hletenko <v.gletenko@vyos.io> | 2022-11-02 12:59:57 +0000 |
commit | 46eda54c88ae96ed1f4aaa9ce56c505ed837f3d7 (patch) | |
tree | 852b802c592919fec3fe66c14dd2f4aaaf8fd7ed /python/vyos/opmode.py | |
parent | 738641a6c66d22c09b8c028ee3d8a90527d9701f (diff) | |
parent | f2ec92a78c4ee2a35e7d071387460fc6ce360740 (diff) | |
download | vyos-1x-46eda54c88ae96ed1f4aaa9ce56c505ed837f3d7.tar.gz vyos-1x-46eda54c88ae96ed1f4aaa9ce56c505ed837f3d7.zip |
T4758: Fix conflicts op-mode-standardized
Diffstat (limited to 'python/vyos/opmode.py')
-rw-r--r-- | python/vyos/opmode.py | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/python/vyos/opmode.py b/python/vyos/opmode.py index 7e3545c87..727e118a8 100644 --- a/python/vyos/opmode.py +++ b/python/vyos/opmode.py @@ -44,6 +44,13 @@ class PermissionDenied(Error): """ pass +class InternalError(Error): + """ Any situation when VyOS detects that it could not perform + an operation correctly due to logic errors in its own code + or errors in underlying software. + """ + pass + def _is_op_mode_function_name(name): if re.match(r"^(show|clear|reset|restart)", name): @@ -93,6 +100,51 @@ def _get_arg_type(t): else: return t +def _normalize_field_name(name): + # Convert the name to string if it is not + # (in some cases they may be numbers) + name = str(name) + + # Replace all separators with underscores + name = re.sub(r'(\s|[\(\)\[\]\{\}\-\.\,:\"\'\`])+', '_', name) + + # Replace specific characters with textual descriptions + name = re.sub(r'@', '_at_', name) + name = re.sub(r'%', '_percentage_', name) + name = re.sub(r'~', '_tilde_', name) + + # Force all letters to lowercase + name = name.lower() + + # Remove leading and trailing underscores, if any + name = re.sub(r'(^(_+)(?=[^_])|_+$)', '', name) + + # Ensure there are only single underscores + name = re.sub(r'_+', '_', name) + + return name + +def _normalize_dict_field_names(old_dict): + new_dict = {} + + for key in old_dict: + new_key = _normalize_field_name(key) + new_dict[new_key] = _normalize_field_names(old_dict[key]) + + # Sanity check + if len(old_dict) != len(new_dict): + raise InternalError("Dictionary fields do not allow unique normalization") + else: + return new_dict + +def _normalize_field_names(value): + if isinstance(value, dict): + return _normalize_dict_field_names(value) + elif isinstance(value, list): + return list(map(lambda v: _normalize_field_names(v), value)) + else: + return value + def run(module): from argparse import ArgumentParser @@ -148,6 +200,7 @@ def run(module): if not args["raw"]: return res else: + res = _normalize_field_names(res) from json import dumps return dumps(res, indent=4) else: |