From f6ebe29173337d3dce38cc3011e46ab573548b73 Mon Sep 17 00:00:00 2001 From: Andreas Lutro Date: Mon, 16 Jul 2018 20:59:38 +0200 Subject: [PATCH 1/6] implement file.serialize dict diffing --- salt/states/file.py | 47 ++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/salt/states/file.py b/salt/states/file.py index bbfa3d6d73ce..a25ece0965ac 100644 --- a/salt/states/file.py +++ b/salt/states/file.py @@ -301,6 +301,7 @@ def run(): import salt.payload import salt.utils.data import salt.utils.dateutils +import salt.utils.dictdiffer import salt.utils.dictupdate import salt.utils.files import salt.utils.hashutils @@ -7861,27 +7862,33 @@ def serialize( else: ret["result"] = True ret["comment"] = "The file {0} is in the correct state".format(name) - return ret + else: + ret = __salt__["file.manage_file"]( + name=name, + sfn="", + ret=ret, + source=None, + source_sum={}, + user=user, + group=group, + mode=mode, + attrs=None, + saltenv=__env__, + backup=backup, + makedirs=makedirs, + template=None, + show_changes=show_changes, + encoding=encoding, + encoding_errors=encoding_errors, + contents=contents, + ) - return __salt__["file.manage_file"]( - name=name, - sfn="", - ret=ret, - source=None, - source_sum={}, - user=user, - group=group, - mode=mode, - attrs=None, - saltenv=__env__, - backup=backup, - makedirs=makedirs, - template=None, - show_changes=show_changes, - encoding=encoding, - encoding_errors=encoding_errors, - contents=contents, - ) + if isinstance(existing_data, dict) and isinstance(merged_data, dict): + ret["changes"] = salt.utils.dictdiffer.recursive_diff( + existing_data, merged_data + ) + + return ret def mknod(name, ntype, major=0, minor=0, user=None, group=None, mode="0600"): From 7155a7f334b610c82b2c36af1c0a464a09720db2 Mon Sep 17 00:00:00 2001 From: Andreas Lutro Date: Wed, 29 Aug 2018 22:27:11 +0200 Subject: [PATCH 2/6] existing_data must always be set --- salt/states/file.py | 1 + 1 file changed, 1 insertion(+) diff --git a/salt/states/file.py b/salt/states/file.py index a25ece0965ac..fc57bd236155 100644 --- a/salt/states/file.py +++ b/salt/states/file.py @@ -7778,6 +7778,7 @@ def serialize( salt.utils.data.repack_dictlist(deserializer_opts) ) + existing_data = None if merge_if_exists: if os.path.isfile(name): if deserializer_name not in __serializers__: From b7082a204ef2588e63c8b103314abd3d288a8cd9 Mon Sep 17 00:00:00 2001 From: Andreas Lutro Date: Wed, 5 Sep 2018 19:28:24 +0200 Subject: [PATCH 3/6] update changes.diff instead of changes --- salt/states/file.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/states/file.py b/salt/states/file.py index fc57bd236155..00a95fcda3e6 100644 --- a/salt/states/file.py +++ b/salt/states/file.py @@ -7885,7 +7885,7 @@ def serialize( ) if isinstance(existing_data, dict) and isinstance(merged_data, dict): - ret["changes"] = salt.utils.dictdiffer.recursive_diff( + ret["changes"]["diff"] = salt.utils.dictdiffer.recursive_diff( existing_data, merged_data ) From 02d7aae1a9d58ab62f6c2e44bd9277cf547dd236 Mon Sep 17 00:00:00 2001 From: Erik Johnson Date: Tue, 11 Dec 2018 07:45:30 -0600 Subject: [PATCH 4/6] Return the diff dict instead of the dictdiffer object --- salt/states/file.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/salt/states/file.py b/salt/states/file.py index 00a95fcda3e6..52f35b3b62fc 100644 --- a/salt/states/file.py +++ b/salt/states/file.py @@ -7887,7 +7887,7 @@ def serialize( if isinstance(existing_data, dict) and isinstance(merged_data, dict): ret["changes"]["diff"] = salt.utils.dictdiffer.recursive_diff( existing_data, merged_data - ) + ).diffs return ret From 962fc679812a36bc1f41b2ea0c75aedf46ecdc24 Mon Sep 17 00:00:00 2001 From: "Gareth J. Greenaway" Date: Tue, 28 Jul 2020 13:05:16 -0700 Subject: [PATCH 5/6] Updating integration tests to reflect changes when diffinng and merge_if_exists is enabled. --- tests/integration/states/test_file.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/integration/states/test_file.py b/tests/integration/states/test_file.py index 01ed0b140fc6..1be45957a69a 100644 --- a/tests/integration/states/test_file.py +++ b/tests/integration/states/test_file.py @@ -2011,6 +2011,12 @@ def test_serializer_deserializer_opts(self, name): ) ret = ret[next(iter(ret))] assert ret["result"], ret + assert "changes" in ret + assert "diff" in ret["changes"] + assert "foo" in ret["changes"]["diff"] + assert "abc" in ret["changes"]["diff"]["foo"] + assert "new" in ret["changes"]["diff"]["foo"]["abc"] + assert ret["changes"]["diff"]["foo"]["abc"]["new"], 123 with salt.utils.files.fopen(name) as fp_: serialized_data = salt.serializers.configparser.deserialize(fp_) @@ -2057,6 +2063,12 @@ def test_serializer_plist_binary_file_open(self, name): ) ret = ret[next(iter(ret))] assert ret["result"], ret + assert "changes" in ret + assert "diff" in ret["changes"] + assert "foo" in ret["changes"]["diff"] + assert "abc" in ret["changes"]["diff"]["foo"] + assert "new" in ret["changes"]["diff"]["foo"]["abc"] + assert ret["changes"]["diff"]["foo"]["abc"]["new"], 123 with salt.utils.files.fopen(name, "rb") as fp_: serialized_data = salt.serializers.plist.deserialize(fp_) @@ -2090,6 +2102,12 @@ def test_serializer_plist_file_open(self, name): ) ret = ret[next(iter(ret))] assert ret["result"], ret + assert "changes" in ret + assert "diff" in ret["changes"] + assert "foo" in ret["changes"]["diff"] + assert "abc" in ret["changes"]["diff"]["foo"] + assert "new" in ret["changes"]["diff"]["foo"]["abc"] + assert ret["changes"]["diff"]["foo"]["abc"]["new"], 123 with salt.utils.files.fopen(name, "rb") as fp_: serialized_data = salt.serializers.plist.deserialize(fp_) From 678862882bf825fe4ac7ac1eee953f2a8f01556c Mon Sep 17 00:00:00 2001 From: "Gareth J. Greenaway" Date: Wed, 19 Jan 2022 13:53:37 -0800 Subject: [PATCH 6/6] Adding changelog. --- changelog/48609.changed | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog/48609.changed diff --git a/changelog/48609.changed b/changelog/48609.changed new file mode 100644 index 000000000000..92f1dc00f8e5 --- /dev/null +++ b/changelog/48609.changed @@ -0,0 +1 @@ +More intelligent diffing in changes of file.serialize state.