From e01e550c596b423a0ec3af3773f7280043343ed7 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 15 Jul 2021 12:58:57 +0200 Subject: [PATCH] arg_validator: support generating default value for ArgValidatorDict Some dictionaries may wish to have a default value that is a dictionary with the default of all keys. Add a method to generate this. This returns a callable instead of a plain dictionary. In practice, the generated default value should always be the same. However, we also expect that ArgValidator validation gives a result that is owned by the caller. In case of mutable values (like a dictionary), we want a deep clone. Signed-off-by: Thomas Haller --- .../network_lsr/argument_validator.py | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/module_utils/network_lsr/argument_validator.py b/module_utils/network_lsr/argument_validator.py index 38169d2..f52488b 100644 --- a/module_utils/network_lsr/argument_validator.py +++ b/module_utils/network_lsr/argument_validator.py @@ -337,11 +337,14 @@ class ArgValidatorDict(ArgValidator): default_value=None, all_missing_during_validate=False, ): - ArgValidator.__init__(self, name, required, default_value) if nested is not None: - self.nested = dict([(v.name, v) for v in nested]) + nested = dict([(v.name, v) for v in nested]) else: - self.nested = {} + nested = {} + if default_value is ArgValidator.DEFAULT: + default_value = self.generate_default + ArgValidator.__init__(self, name, required, default_value) + self.nested = nested self.all_missing_during_validate = all_missing_during_validate def _validate_impl(self, value, name): @@ -378,6 +381,18 @@ class ArgValidatorDict(ArgValidator): result[setting] = default return result + @staticmethod + def generate_default_from_nested(nested): + result = {} + for name, validator in nested.items(): + default = validator.get_default_value() + if default is not ArgValidator.MISSING: + result[name] = default + return result + + def generate_default(self): + return ArgValidatorDict.generate_default_from_nested(self.nested) + class ArgValidatorList(ArgValidator): def __init__(self, name, nested, default_value=None):