From 5ad58569969af9ea3aaf47949ab02341c4d7186d Mon Sep 17 00:00:00 2001 From: Martin Klein Date: Sat, 6 Oct 2018 23:46:19 +0200 Subject: [PATCH] Add deep merge for contexts Using deepmerger config contexts are merged overriding everything but dicts. --- netbox/extras/models.py | 17 ++++++++++++++--- requirements.txt | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/netbox/extras/models.py b/netbox/extras/models.py index de3edca9b..5669c1d48 100644 --- a/netbox/extras/models.py +++ b/netbox/extras/models.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals from collections import OrderedDict +from deepmerge import Merger from datetime import date import graphviz @@ -724,14 +725,24 @@ class ConfigContextModel(models.Model): 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 - data = OrderedDict() + data = {} 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 self.local_context_data is not None: - data.update(self.local_context_data) + config_merger.merge(data, self.local_context_data) return data diff --git a/requirements.txt b/requirements.txt index b3bee6b6d..b8e9e4cd8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,4 +20,4 @@ psycopg2-binary==2.7.5 py-gfm==0.1.3 pycryptodome==3.6.4 xmltodict==0.11.0 - +deepmerge==0.0.4