Change merge-if-exists logic to properly report changes

This commit is contained in:
Clint Armstrong 2016-06-28 12:51:14 -04:00
parent af83f59313
commit ebe7def2fb

View file

@ -4394,45 +4394,6 @@ def accumulated(name, filename, text, **kwargs):
_persist_accummulators(accum_data, accum_deps)
return ret
def _merge_dict(obj, k, v):
changes = {}
if k in obj:
if isinstance(obj[k], list):
if isinstance(v, list):
for a in v:
if a not in obj[k]:
changes[k] = a
obj[k].append(a)
else:
if obj[k] != v:
changes[k] = v
obj[k] = v
elif isinstance(obj[k], dict):
if isinstance(v, dict):
for a, b in six.iteritems(v):
if isinstance(b, dict) or isinstance(b, list):
updates = _merge_dict(obj[k], a, b)
for x, y in six.iteritems(updates):
changes[k + "." + x] = y
else:
if a not in obj[k] or obj[k][a] != b:
changes[k + "." + a] = b
obj[k][a] = b
else:
if obj[k] != v:
changes[k] = v
obj[k] = v
else:
if obj[k] != v:
changes[k] = v
obj[k] = v
else:
changes[k] = v
obj[k] = v
return changes
def serialize(name,
dataset=None,
dataset_pillar=None,
@ -4587,31 +4548,8 @@ def serialize(name,
serializer_name = '{0}.serialize'.format(formatter)
deserializer_name = '{0}.deserialize'.format(formatter)
if serializer_name in __serializers__:
serializer = __serializers__[serializer_name]
if merge_if_exists:
if os.path.isfile(name):
if '{0}.deserialize'.format(formatter) in __serializers__:
with salt.utils.fopen(name, 'r') as fhr:
existing_data = __serializers__[deserializer_name](fhr)
else:
return {'changes': {},
'comment': ('{0} format is not supported for merging'
.format(formatter.capitalize())),
'name': name,
'result': False}
if existing_data is not None:
for k, v in six.iteritems(dataset):
if k in existing_data:
ret['changes'].update(_merge_dict(existing_data, k, v))
else:
ret['changes'][k] = v
existing_data[k] = v
dataset = existing_data
contents = __serializers__[serializer_name](dataset)
else:
if serializer_name not in __serializers__:
return {'changes': {},
'comment': '{0} format is not supported'.format(
formatter.capitalize()),
@ -4619,6 +4557,29 @@ def serialize(name,
'result': False
}
if merge_if_exists:
if os.path.isfile(name):
if '{0}.deserialize'.format(formatter) not in __serializers__:
return {'changes': {},
'comment': ('{0} format is not supported for merging'
.format(formatter.capitalize())),
'name': name,
'result': False}
with salt.utils.fopen(name, 'r') as fhr:
existing_data = __serializers__[deserializer_name](fhr)
if existing_data is not None:
merged_data = existing_data.copy()
merged_data.update(dataset)
if existing_data == merged_data:
ret['result'] = True
ret['comment'] = 'The file {0} is in the correct state'.format(name)
return ret
dataset = merged_data
contents = __serializers__[serializer_name](dataset)
contents += '\n'
if __opts__['test']: