diff --git a/netjsonconfig/utils.py b/netjsonconfig/utils.py index de9a08bf9..c91feeab8 100644 --- a/netjsonconfig/utils.py +++ b/netjsonconfig/utils.py @@ -22,9 +22,8 @@ def merge_config(template, config, list_identifiers=None): """ result = deepcopy(template) for key, value in config.items(): - if isinstance(value, dict): - node = result.get(key, OrderedDict()) - result[key] = merge_config(node, value) + if isinstance(value, dict) and isinstance(result.get(key), dict): + result[key] = merge_config(result.get(key), value, list_identifiers) elif isinstance(value, list) and isinstance(result.get(key), list): result[key] = merge_list(result[key], value, list_identifiers) else: diff --git a/tests/openwrt/test_default.py b/tests/openwrt/test_default.py index 9a7eb3eaa..b5e487b20 100644 --- a/tests/openwrt/test_default.py +++ b/tests/openwrt/test_default.py @@ -251,3 +251,28 @@ def test_render_invalid_uci_name(self): """ ) self.assertEqual(o.render(), expected) + + def test_merge_invalid_format(self): + invalid = { + "dhcp": { + "lan": { + "interface": "lan", + "start": 100, + "limit": 150, + "leasetime": "12h", + } + } + } + valid = { + "dhcp": [ + { + "dhcpv6": "disabled", + "ignore": True, + "ra": "disabled", + "config_value": "lan", + "config_name": "dhcp", + } + ] + } + o = OpenWrt({}, templates=[valid, invalid]) + o.validate()