Hi, while investigating #1549 and #1550 I stumbled upon a problem. We create Param(s) as read only entities. This means that using standard methods, any modifications to Param instances are denied. What happens in #1549 and #1550 is that the code in Param.validate() relies on availability of existing context to determine whether name or cli_name of a param instance should be used.
By itself it is fine as context is passed to Param.validate() within environment. The decision what to pass is done in Param.__call__(): def __call__(self, value, **kw): """ One stop shopping. """ if value in NULLS: value = self.get_default(**kw) else: value = self.convert(self.normalize(value)) if hasattr(self, 'env'): self.validate(value, self.env.context) else: self.validate(value) return value If this Param instance has attribute 'env', we use its context. However, the instance in itself is ReadOnly and gets locked at the very end of Param.__init__(). So this makes a case when immediately after creating a parameter we can't assign it any environment, its environment always stays None and the code in __call__() always calls validate() without context. A fix I found is quite bad as it violates ReadOnly promise: diff --git a/ipalib/frontend.py b/ipalib/frontend.py index 3534310..1c7071a 100644 --- a/ipalib/frontend.py +++ b/ipalib/frontend.py @@ -344,6 +344,9 @@ class HasParam(Plugin): for spec in get(): param = create_param(spec) if env is None or param.use_in_context(env): + if env is not None and not hasattr(param, 'env'): + # Force specified environment + object.__setattr__(param, 'env', env) yield param def _create_param_namespace(self, name, env=None): Does anybody have better suggestion? -- / Alexander Bokovoy _______________________________________________ Freeipa-devel mailing list Freeipa-devel@redhat.com https://www.redhat.com/mailman/listinfo/freeipa-devel