Browse Source

Merge branch 'trac3239_3'

Mukund Sivaraman 11 years ago
parent
commit
84d5eda2a6
3 changed files with 52 additions and 14 deletions
  1. 17 4
      doc/guide/bind10-guide.xml
  2. 3 2
      src/bin/bindctl/bindcmd.py
  3. 32 8
      src/lib/python/isc/config/config_data.py

+ 17 - 4
doc/guide/bind10-guide.xml

@@ -1554,7 +1554,10 @@ Parameters:
                 <term>integer</term>
                 <listitem>
                     <simpara>
-                        A basic integer; can be set directly with <command>config set</command>, to any integer value.
+                        A basic integer; can be set directly with
+                        <command>config set</command>, to any integer
+                        value. The value must not be quoted, or else, it
+                        will be parsed as a string.
                     </simpara>
                 </listitem>
             </varlistentry>
@@ -1562,7 +1565,10 @@ Parameters:
                 <term>real</term>
                 <listitem>
                     <simpara>
-                        A basic floating point number; can be set directly with <command>config set</command>, to any floating point value.
+                        A basic floating point number; can be set
+                        directly with <command>config set</command>, to
+                        any floating point value. The value must not be
+                        quoted, or else, it will be parsed as a string.
                     </simpara>
                 </listitem>
             </varlistentry>
@@ -1570,7 +1576,12 @@ Parameters:
                 <term>boolean</term>
                 <listitem>
                     <simpara>
-                        A basic boolean value; can be set directly with <command>config set</command>, to either <command>true</command> or <command>false</command>.
+                        A basic boolean value; can be set directly with
+                        <command>config set</command>, to either
+                        <command>true</command> or
+                        <command>false</command>. The value must not be
+                        quoted, or else, it will be parsed as a
+                        string. Integer values are not allowed.
                     </simpara>
                 </listitem>
             </varlistentry>
@@ -1578,7 +1589,9 @@ Parameters:
                 <term>string</term>
                 <listitem>
                     <simpara>
-                        A basic string value; can be set directly with <command>config set,</command> so any string. Double quotation marks are optional.
+                        A basic string value; can be set directly with
+                        <command>config set</command> to any
+                        string. Double quotation marks are optional.
                     </simpara>
                 </listitem>
             </varlistentry>

+ 3 - 2
src/bin/bindctl/bindcmd.py

@@ -446,8 +446,9 @@ WARNING: The Python readline module isn't available, so some command line
                     raise CmdMissParamSyntaxError(cmd.module, cmd.command, name)
                 param_nr += 1
 
-        # Convert parameter value according parameter spec file.
-        # Ignore check for commands belongs to module 'config' or 'execute
+        # Convert parameter value according to parameter spec
+        # file. Ignore check for commands belonging to module 'config'
+        # or 'execute'.
         if cmd.module != CONFIG_MODULE_NAME and\
            cmd.module != command_sets.EXECUTE_MODULE_NAME:
             for param_name in cmd.params:

+ 32 - 8
src/lib/python/isc/config/config_data.py

@@ -53,6 +53,22 @@ def spec_part_is_any(spec_part):
     return (type(spec_part) == dict and 'item_type' in spec_part and
             spec_part['item_type'] == "any")
 
+def _type_as_string(value):
+    if type(value) == int:
+        return 'integer'
+    elif type(value) == float:
+        return 'real'
+    elif type(value) == bool:
+        return 'boolean'
+    elif type(value) == str:
+        return 'string'
+    elif type(value) == list:
+        return 'list'
+    elif type(value) == dict:
+        return 'map'
+    else:
+        return '<unknown>'
+
 def check_type(spec_part, value):
     """Does nothing if the value is of the correct type given the
        specification part relevant for the value. Raises an
@@ -65,27 +81,35 @@ def check_type(spec_part, value):
 
     if data_type == "integer":
         if type(value) != int:
-            raise isc.cc.data.DataTypeError(str(value) + " is not an integer")
+            raise isc.cc.data.DataTypeError('%s is not an integer (%s was passed)' % \
+                                            (str(value), _type_as_string(value)))
         if value > sys.maxsize:
-            raise isc.cc.data.DataTypeError(str(value) + " is too large an integer")
+            raise isc.cc.data.DataTypeError('%s is too large an integer' % \
+                                            (str(value)))
     elif data_type == "real":
         if type(value) != float:
-            raise isc.cc.data.DataTypeError(str(value) + " is not a real")
+            raise isc.cc.data.DataTypeError('%s is not a real (%s was passed)' % \
+                                            (str(value), _type_as_string(value)))
         if float(value) > sys.float_info.max:
-            raise isc.cc.data.DataTypeError(str(value) + " is too large a float")
+            raise isc.cc.data.DataTypeError('%s is too large for a float' % \
+                                            (str(value)))
     elif data_type == "boolean" and type(value) != bool:
-        raise isc.cc.data.DataTypeError(str(value) + " is not a boolean")
+        raise isc.cc.data.DataTypeError('%s is not a boolean (%s was passed)' % \
+                                        (str(value), _type_as_string(value)))
     elif data_type == "string" and type(value) != str:
-        raise isc.cc.data.DataTypeError(str(value) + " is not a string")
+        raise isc.cc.data.DataTypeError('%s is not a string (%s was passed)' % \
+                                        (str(value), _type_as_string(value)))
     elif data_type == "list":
         if type(value) != list:
-            raise isc.cc.data.DataTypeError(str(value) + " is not a list")
+            raise isc.cc.data.DataTypeError('%s is not a list (%s was passed)' % \
+                                            (str(value), _type_as_string(value)))
         else:
             for element in value:
                 check_type(spec_part['list_item_spec'], element)
     elif data_type == "map" and type(value) != dict:
         # todo: check types of map contents too
-        raise isc.cc.data.DataTypeError(str(value) + " is not a map")
+        raise isc.cc.data.DataTypeError('%s is not a map (%s was passed)' % \
+                                        (str(value), _type_as_string(value)))
 
 def convert_type(spec_part, value):
     """Convert the given value(type is string) according specification