From b0a028bf381e5467acca8d66f37e778d569e331d Mon Sep 17 00:00:00 2001 From: Jelte Jansen Date: Tue, 27 Mar 2012 10:41:49 +0200 Subject: [PATCH 1/3] [1491] copy default named-set data to local when editing if a child member is set, and the named-set data is default, it would 'lose' the other default values if it wasn't copied to local. For succesful operations this wouldn't be a problem (as this only happens 'locally' in bindctl), but it can cause problems when updates fail due to mistyped data --- src/lib/python/isc/config/config_data.py | 11 ++++++++++- .../python/isc/config/tests/config_data_test.py | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/lib/python/isc/config/config_data.py b/src/lib/python/isc/config/config_data.py index e7e810b1f2..4fa95bc2fc 100644 --- a/src/lib/python/isc/config/config_data.py +++ b/src/lib/python/isc/config/config_data.py @@ -42,7 +42,7 @@ def spec_part_is_map(spec_part): def spec_part_is_named_set(spec_part): """Returns True if the given spec_part is a dict that contains a named_set specification, and False otherwise.""" - return (type(spec_part) == dict and 'named_map_item_spec' in spec_part) + return (type(spec_part) == dict and 'named_set_item_spec' in spec_part) def check_type(spec_part, value): """Does nothing if the value is of the correct type given the @@ -720,6 +720,15 @@ class MultiConfigData: cur_id_part + id, cur_value) cur_id_part = cur_id_part + id_part + "/" + + # We also need to copy to local if we are changing a named set, + # so that the other items in the set do not disappear + if spec_part_is_named_set(self.find_spec_part(cur_id_part)): + ns_value, ns_status = self.get_value(cur_id_part) + if ns_status != MultiConfigData.LOCAL: + isc.cc.data.set(self._local_changes, + cur_id_part, + ns_value) isc.cc.data.set(self._local_changes, identifier, value) def _get_list_items(self, item_name): diff --git a/src/lib/python/isc/config/tests/config_data_test.py b/src/lib/python/isc/config/tests/config_data_test.py index 446d89898d..1d6d5151a5 100644 --- a/src/lib/python/isc/config/tests/config_data_test.py +++ b/src/lib/python/isc/config/tests/config_data_test.py @@ -697,6 +697,20 @@ class TestMultiConfigData(unittest.TestCase): 'Spec32/named_set_item/bbbb', ], config_items) + def test_set_named_set_nonlocal(self): + # Test whether a default named set is copied to local if a subitem + # is changed, and that other items in the set do not get lost + module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + 'spec32.spec') + self.mcd.set_specification(module_spec) + value, status = self.mcd.get_value('Spec32/named_set_item') + self.assertEqual({'a': 1, 'b': 2}, value) + self.assertEqual(MultiConfigData.DEFAULT, status) + + self.mcd.set_value('Spec32/named_set_item/b', 3) + value, status = self.mcd.get_value('Spec32/named_set_item') + self.assertEqual({'a': 1, 'b': 3}, value) + self.assertEqual(MultiConfigData.LOCAL, status) + if __name__ == '__main__': unittest.main() From 5f7f84779f66576555728e70ea75383945e0700a Mon Sep 17 00:00:00 2001 From: Jelte Jansen Date: Tue, 27 Mar 2012 14:47:05 +0200 Subject: [PATCH 2/3] [1491] added missing test for spec_part_is_named_set --- src/lib/python/isc/config/tests/config_data_test.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/lib/python/isc/config/tests/config_data_test.py b/src/lib/python/isc/config/tests/config_data_test.py index 1d6d5151a5..309736ca9f 100644 --- a/src/lib/python/isc/config/tests/config_data_test.py +++ b/src/lib/python/isc/config/tests/config_data_test.py @@ -679,6 +679,12 @@ class TestMultiConfigData(unittest.TestCase): config_items = self.mcd.get_config_item_list("Spec2", True) self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5', 'Spec2/item6/value1', 'Spec2/item6/value2'], config_items) + def test_is_named_set(self): + module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec32.spec") + self.mcd.set_specification(module_spec) + spec_part = self.mcd.find_spec_part("Spec32/named_set_item") + self.assertTrue(spec_part_is_named_set(spec_part)) + def test_get_config_item_list_named_set(self): config_items = self.mcd.get_config_item_list() self.assertEqual([], config_items) From 55cecba6f3c43d725fc7c1614e5b47bc7729d5ec Mon Sep 17 00:00:00 2001 From: JINMEI Tatuya Date: Tue, 10 Apr 2012 11:02:50 -0700 Subject: [PATCH 3/3] [1491] (editorial) removed white spaces in a blank line. --- src/lib/python/isc/config/tests/config_data_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/python/isc/config/tests/config_data_test.py b/src/lib/python/isc/config/tests/config_data_test.py index 309736ca9f..bd236c6ff2 100644 --- a/src/lib/python/isc/config/tests/config_data_test.py +++ b/src/lib/python/isc/config/tests/config_data_test.py @@ -684,7 +684,7 @@ class TestMultiConfigData(unittest.TestCase): self.mcd.set_specification(module_spec) spec_part = self.mcd.find_spec_part("Spec32/named_set_item") self.assertTrue(spec_part_is_named_set(spec_part)) - + def test_get_config_item_list_named_set(self): config_items = self.mcd.get_config_item_list() self.assertEqual([], config_items)