Running validators after all Knobs are set allows use of other Knob
value during validation.
--
David Kupka
From b9a8ae178e770a4b84fc8d05d04218531642d3eb Mon Sep 17 00:00:00 2001
From: David Kupka <dku...@redhat.com>
Date: Mon, 7 Dec 2015 13:35:49 +0100
Subject: [PATCH] install: Run all validators at once.
---
ipapython/install/core.py | 33 +++++++++++++++++++++------------
1 file changed, 21 insertions(+), 12 deletions(-)
diff --git a/ipapython/install/core.py b/ipapython/install/core.py
index 8e3ba58021adba263eb038c5cb70603e4e8c9352..62c1fb61797863da49402d3f86d14e3c6389d932 100644
--- a/ipapython/install/core.py
+++ b/ipapython/install/core.py
@@ -118,16 +118,6 @@ class KnobBase(PropertyBase):
def __init__(self, outer):
self.outer = outer
- def __set__(self, obj, value):
- try:
- self.validate(value)
- except KnobValueError:
- raise
- except ValueError as e:
- raise KnobValueError(self.__outer_name__, str(e))
-
- super(KnobBase, self).__set__(obj, value)
-
def validate(self, value):
pass
@@ -253,8 +243,27 @@ class Configurable(six.with_metaclass(abc.ABCMeta, object)):
except KeyError:
pass
else:
- prop = prop_cls(self)
- prop.__set__(self, value)
+ setattr(self, name, value)
+
+ for owner_cls, name in cls.knobs():
+ if name.startswith('_'):
+ continue
+ if not isinstance(self, owner_cls):
+ continue
+ if name not in self.__dict__:
+ continue
+ try:
+ value = getattr(self, name)
+ except AttributeError:
+ continue
+ prop_cls = getattr(owner_cls, name)
+ prop = prop_cls(self)
+ try:
+ prop.validate(value)
+ except KnobValueError:
+ raise
+ except ValueError as e:
+ raise KnobValueError(name, str(e))
if kwargs:
extra = sorted(kwargs)
--
2.5.0
--
Manage your subscription for the Freeipa-devel mailing list:
https://www.redhat.com/mailman/listinfo/freeipa-devel
Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code