Add deep merge for contexts

Using deepmerger config contexts are merged overriding
everything but dicts.
This commit is contained in:
Martin Klein 2018-10-06 23:46:19 +02:00 committed by Martin Klein
parent 7d1f6b7049
commit 5ad5856996
2 changed files with 15 additions and 4 deletions

View File

@ -1,6 +1,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from collections import OrderedDict from collections import OrderedDict
from deepmerge import Merger
from datetime import date from datetime import date
import graphviz import graphviz
@ -724,14 +725,24 @@ class ConfigContextModel(models.Model):
Return the rendered configuration context for a device or VM. Return the rendered configuration context for a device or VM.
""" """
# Create a merger overriding everithing but dicts to avoid merging array type configuration
config_merger = Merger(
[
(list, ["override"]),
(dict, ["merge"])
],
["override"],
["override"]
)
# Compile all config data, overwriting lower-weight values with higher-weight values where a collision occurs # Compile all config data, overwriting lower-weight values with higher-weight values where a collision occurs
data = OrderedDict() data = {}
for context in ConfigContext.objects.get_for_object(self): for context in ConfigContext.objects.get_for_object(self):
data.update(context.data) config_merger.merge(data, context.data)
# If the object has local config context data defined, that data overwrites all rendered data # If the object has local config context data defined, that data overwrites all rendered data
if self.local_context_data is not None: if self.local_context_data is not None:
data.update(self.local_context_data) config_merger.merge(data, self.local_context_data)
return data return data

View File

@ -20,4 +20,4 @@ psycopg2-binary==2.7.5
py-gfm==0.1.3 py-gfm==0.1.3
pycryptodome==3.6.4 pycryptodome==3.6.4
xmltodict==0.11.0 xmltodict==0.11.0
deepmerge==0.0.4