From f462d6fec8a4ae5c76a8f5e0d36e5dbb48917256 Mon Sep 17 00:00:00 2001 From: Matthew Flusche Date: Thu, 21 Sep 2017 18:13:42 +0000 Subject: [PATCH] fixes how os-apply-config handles invalid json If invalid json is included as the last element in os_config_files.json it can silently break the file customizations managed by os-apply-config. More details: https://bugzilla.redhat.com/show_bug.cgi?id=1493303 Closes-Bug: #1722321 Change-Id: I0ad89fcde101ba6f3723ab2fa5a348c40452bae5 --- os_apply_config/collect_config.py | 2 +- os_apply_config/tests/test_collect_config.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/os_apply_config/collect_config.py b/os_apply_config/collect_config.py index f7fa2c2..08f8e20 100644 --- a/os_apply_config/collect_config.py +++ b/os_apply_config/collect_config.py @@ -58,7 +58,7 @@ def merge_configs(parsed_configs): '''Returns deep-merged dict from passed list of dicts.''' final_conf = {} for conf in parsed_configs: - if conf: + if conf and isinstance(conf, dict): final_conf = _deep_merge_dict(final_conf, conf) return final_conf diff --git a/os_apply_config/tests/test_collect_config.py b/os_apply_config/tests/test_collect_config.py index ec1b499..bf0c386 100644 --- a/os_apply_config/tests/test_collect_config.py +++ b/os_apply_config/tests/test_collect_config.py @@ -109,6 +109,11 @@ class TestMergeConfigs(testtools.TestCase): result = collect_config.merge_configs(type_conflict) self.assertEqual({'a': [7, 8, 9]}, result) + def test_merge_configs_nested_type_conflict(self): + type_conflict = [{'a': {'foo': 'bar'}}, {'a': 'shazam'}] + result = collect_config.merge_configs(type_conflict) + self.assertEqual({'a': 'shazam'}, result) + def test_merge_configs_list_conflict(self): list_conflict = [{'a': [1, 2, 3]}, {'a': [4, 5, 6]}] @@ -116,6 +121,7 @@ class TestMergeConfigs(testtools.TestCase): self.assertEqual({'a': [4, 5, 6]}, result) def test_merge_configs_empty_notdict(self): - list_conflict = [[], {'a': '1'}, '', None, {'b': '2'}, {}] + list_conflict = [[], {'a': '1'}, '', None, 'tacocat', + {'b': '2'}, {}, 'baseball'] result = collect_config.merge_configs(list_conflict) self.assertEqual({'a': '1', 'b': '2'}, result)