Browse Source

[1344] don't be too hasty on erroring on None when setting data

Jelte Jansen 13 years ago
parent
commit
df9b10fae5

+ 21 - 0
src/lib/config/tests/testdata/spec32.spec

@@ -12,6 +12,27 @@
           "item_optional": false,
           "item_default": 3
         }
+      },
+      { "item_name": "named_set_item2",
+        "item_type": "named_set",
+        "item_optional": true,
+        "item_default": { },
+        "named_set_item_spec": {
+          "item_name": "named_set_element",
+          "item_type": "map",
+          "item_optional": false,
+          "item_default": {},
+          "map_item_spec": [
+          { "item_name": "first",
+            "item_type": "integer",
+            "item_optional": true
+          },
+          { "item_name": "second",
+            "item_type": "string",
+            "item_optional": true
+          }
+          ]
+        }
       }
     ]
   }

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

@@ -515,7 +515,7 @@ class MultiConfigData:
             return value, self.CURRENT
         if default:
             value = self.get_default_value(identifier)
-            if value != None:
+            if value is not None:
                 return value, self.DEFAULT
         return None, self.NONE
 
@@ -650,9 +650,13 @@ class MultiConfigData:
             cur_value, status = self.get_value(cur_id_part + id)
             # Check if the value was there in the first place
             if status == MultiConfigData.NONE and cur_id_part != "/":
-                raise isc.cc.data.DataNotFoundError(id_part +
-                                                    " not found in " +
-                                                    cur_id_part)
+                # In case the element we are inspecting did not have any value set, was optional, *and* had no default, we do not want to error when trying to set it
+                if not 'item_default' in spec_part and 'item_optional' in spec_part and spec_part['item_optional']:
+                    pass
+                else:
+                    raise isc.cc.data.DataNotFoundError(id_part +
+                                                        " not found in " +
+                                                        cur_id_part)
             if list_indices is not None:
                 # And check if we don't set something outside of any
                 # list

+ 21 - 0
src/lib/python/isc/config/tests/ccsession_test.py

@@ -773,6 +773,27 @@ class TestUIModuleCCSession(unittest.TestCase):
                           uccs.remove_value, "/Spec32/named_set_item",
                           "no_such_item")
 
+    def test_set_value_named_set(self):
+        fake_conn = fakeUIConn()
+        uccs = self.create_uccs_named_set(fake_conn)
+        value, status = uccs.get_value("/Spec32/named_set_item2")
+        self.assertEqual({}, value)
+        self.assertEqual(status, uccs.DEFAULT)
+
+        # Try setting a value that is optional but has no default
+        uccs.add_value("/Spec32/named_set_item2", "new")
+        uccs.set_value("/Spec32/named_set_item2/new/first", 3)
+
+        value, status = uccs.get_value("/Spec32/named_set_item2")
+        self.assertEqual({ 'new': {'first': 3 }}, value)
+        self.assertEqual(status, uccs.LOCAL)
+
+        uccs.set_value("/Spec32/named_set_item2/new/second", "foo")
+
+        value, status = uccs.get_value("/Spec32/named_set_item2")
+        self.assertEqual({ 'new': {'first': 3, 'second': "foo" }}, value)
+        self.assertEqual(status, uccs.LOCAL)
+
     def test_commit(self):
         fake_conn = fakeUIConn()
         uccs = self.create_uccs2(fake_conn)

+ 1 - 1
src/lib/python/isc/config/tests/config_data_test.py

@@ -627,7 +627,7 @@ class TestMultiConfigData(unittest.TestCase):
         config_items = self.mcd.get_config_item_list(None, False)
         self.assertEqual(['Spec32'], config_items)
         config_items = self.mcd.get_config_item_list(None, True)
-        self.assertEqual(['Spec32/named_set_item'], config_items)
+        self.assertEqual(['Spec32/named_set_item', 'Spec32/named_set_item2'], config_items)
         self.mcd.set_value('Spec32/named_set_item', { "aaaa": 4, "aabb": 5, "bbbb": 6})
         config_items = self.mcd.get_config_item_list("/Spec32/named_set_item", True)
         self.assertEqual(['Spec32/named_set_item/aaaa',