[Freeipa-devel] [PATCH] 163+164 Fix DNS zone --allow-dynupdate option behavior

2011-11-09 Thread Martin Kosek
Patch 164 fixes dnszone-mod --allow-dynupdate behavior which  disables
the zone dynamic updates value whenever a dnszone-mod command is run and
--allow-dynupdate options is not set.

I introduced a Param.encode() function (patch 163) to our framework to
help encoding Python native values to LDAP representation more
effectively. True/False to LDAP's TRUE/FALSE in this case. Encoding
functions are executed in a server context only.

Martin
From 6e230b1e1638a57a92c8654672bd4cbd7cc560cd Mon Sep 17 00:00:00 2001
From: Martin Kosek mko...@redhat.com
Date: Wed, 9 Nov 2011 14:10:08 +0100
Subject: [PATCH 1/2] Allow custom server backend encoding

Server framework does not support encoding of native Python type
values stored in Param classes and sub-classes. When backend (LDAP)
value encoding differs from Python type value representation user
has to has to hard-code the encoders in his processing.

This patch introduces a method Param.encode which is used in server
context to encode native Python Param values. The new encode method
is used for Bool parameter to convert native Python bool type value
(True, False) to LDAP value (TRUE, FALSE).

https://fedorahosted.org/freeipa/ticket/2039
---
 ipalib/frontend.py |   10 ++
 ipalib/parameters.py   |   29 +
 ipaserver/plugins/ldap2.py |   17 +
 3 files changed, 56 insertions(+), 0 deletions(-)

diff --git a/ipalib/frontend.py b/ipalib/frontend.py
index 61e7f493f8a8e30a1a189d06cd6a69893319deaf..851de4379536e10741d012186b9a914a36923ec7 100644
--- a/ipalib/frontend.py
+++ b/ipalib/frontend.py
@@ -428,6 +428,8 @@ class Command(HasParam):
 if not self.api.env.in_server and 'version' not in params:
 params['version'] = API_VERSION
 self.validate(**params)
+if self.api.env.in_server:
+params = self.encode(**params)
 (args, options) = self.params_2_args_options(**params)
 ret = self.run(*args, **options)
 if (
@@ -648,6 +650,14 @@ class Command(HasParam):
 (k, self.params[k].convert(v)) for (k, v) in kw.iteritems()
 )
 
+def encode(self, **kw):
+
+Return a dictionary of encoded values.
+
+return dict(
+(k, self.params[k].encode(v)) for (k, v) in kw.iteritems()
+)
+
 def __convert_iter(self, kw):
 for param in self.params():
 if kw.get(param.name, None) is None:
diff --git a/ipalib/parameters.py b/ipalib/parameters.py
index f9e171b0e5fa9590be73f4935b677c2f4447621c..1f3fdfde7452dace6b13a534b9737e8c3b1b0e5d 100644
--- a/ipalib/parameters.py
+++ b/ipalib/parameters.py
@@ -307,6 +307,7 @@ class Param(ReadOnly):
 ('multivalue', bool, False),
 ('primary_key', bool, False),
 ('normalizer', callable, None),
+('encoder', callable, None),
 ('default_from', DefaultFrom, None),
 ('create_default', callable, None),
 ('autofill', bool, False),
@@ -768,6 +769,34 @@ class Param(ReadOnly):
 rule=rule,
 )
 
+def encode(self, value):
+
+Encode Python native type value to chosen backend format. Encoding is
+applied for parameters representing actual attributes (attribute=True).
+
+The default encode method `Param._encode` can be overriden in a `Param`
+instance with `encoder` attribute:
+
+ s = Str('my_str', encoder=lambda x:encode(x))
+
+Note that the default method of encoding values is defined in
+`Param._encode()`.
+
+:param value: Encoded value
+
+if not self.attribute: #pylint: disable=E1101
+return value
+if self.encoder is not None: #pylint: disable=E1101
+return self.encoder(value) #pylint: disable=E1101
+
+return self._encode(value)
+
+def _encode(self, value):
+
+Encode a value to backend format.
+
+return value
+
 def get_default(self, **kw):
 
 Return the static default or construct and return a dynamic default.
diff --git a/ipaserver/plugins/ldap2.py b/ipaserver/plugins/ldap2.py
index 5c40182933143021abf817bff4ed12287697e4ea..32a1eccb437a1ed3ed74208cdbbb834b3dd1fbc6 100644
--- a/ipaserver/plugins/ldap2.py
+++ b/ipaserver/plugins/ldap2.py
@@ -45,6 +45,7 @@ from ldap.controls import LDAPControl
 from ldap.functions import explode_dn
 from ipalib.dn import DN
 from ipalib import _
+from ipalib.parameters import Bool
 
 import krbV
 
@@ -62,6 +63,22 @@ MEMBERS_INDIRECT = 2
 # SASL authentication mechanism
 SASL_AUTH = _ldap_sasl.sasl({}, 'GSSAPI')
 
+# OID 1.3.6.1.4.1.1466.115.121.1.7 (Boolean) syntax encoding
+def _encode_bool(self, value):
+def encode_bool_value(value):
+if value:
+return u'TRUE'
+else:
+return u'FALSE'
+
+if type(value) in (tuple, list):
+return tuple(encode_bool_value(v) for v in value)
+else:
+

Re: [Freeipa-devel] [PATCH] 163+164 Fix DNS zone --allow-dynupdate option behavior

2011-11-09 Thread Alexander Bokovoy
On Wed, 09 Nov 2011, Martin Kosek wrote:
 Patch 164 fixes dnszone-mod --allow-dynupdate behavior which  disables
 the zone dynamic updates value whenever a dnszone-mod command is run and
 --allow-dynupdate options is not set.
As discussed on IRC, please rename the CLI option name to 
--dynamic-update.

Otherwise, ACK.

Please also file a ticket for 3.0 for gathering all renames of CLI 
options where we feel they are unclear or unfriendly.

 I introduced a Param.encode() function (patch 163) to our framework to
 help encoding Python native values to LDAP representation more
 effectively. True/False to LDAP's TRUE/FALSE in this case. Encoding
 functions are executed in a server context only.
Ack.

-- 
/ Alexander Bokovoy

___
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel


Re: [Freeipa-devel] [PATCH] 163+164 Fix DNS zone --allow-dynupdate option behavior

2011-11-09 Thread Martin Kosek
On Wed, 2011-11-09 at 16:14 +0200, Alexander Bokovoy wrote:
 On Wed, 09 Nov 2011, Martin Kosek wrote:
  Patch 164 fixes dnszone-mod --allow-dynupdate behavior which  disables
  the zone dynamic updates value whenever a dnszone-mod command is run and
  --allow-dynupdate options is not set.
 As discussed on IRC, please rename the CLI option name to 
 --dynamic-update.
 
 Otherwise, ACK.

Renamed and pushed to master.

Endi, Petr, I created a ticket to implement this new behavior in WebUI
too:

https://fedorahosted.org/freeipa/ticket/2084

 
 Please also file a ticket for 3.0 for gathering all renames of CLI 
 options where we feel they are unclear or unfriendly.

https://fedorahosted.org/freeipa/ticket/2083

 
  I introduced a Param.encode() function (patch 163) to our framework to
  help encoding Python native values to LDAP representation more
  effectively. True/False to LDAP's TRUE/FALSE in this case. Encoding
  functions are executed in a server context only.
 Ack.
 

Pushed to master.

Martin

___
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel