From 0ebd32373d01d08c7b77a2d2a5061d6fadcab5d4 Mon Sep 17 00:00:00 2001 From: Alexei Znamensky <103110+russoz@users.noreply.github.com> Date: Sun, 3 May 2026 12:49:39 +1200 Subject: [PATCH] gandi_livedns: implement diff mode support (#11934) * feat(gandi_livedns): implement diff mode support Co-Authored-By: Claude Sonnet 4.6 * fix(gandi_livedns): add changelog fragment for PR 11934 Co-Authored-By: Claude Sonnet 4.6 * Update plugins/modules/gandi_livedns.py Co-authored-by: Felix Fontein --------- Co-authored-by: Claude Sonnet 4.6 Co-authored-by: Felix Fontein --- .../11934-gandi-livedns-diff-mode.yml | 2 ++ plugins/module_utils/_gandi_livedns_api.py | 15 +++++++------ plugins/modules/gandi_livedns.py | 21 +++++++++++++------ 3 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 changelogs/fragments/11934-gandi-livedns-diff-mode.yml diff --git a/changelogs/fragments/11934-gandi-livedns-diff-mode.yml b/changelogs/fragments/11934-gandi-livedns-diff-mode.yml new file mode 100644 index 0000000000..fb60441cec --- /dev/null +++ b/changelogs/fragments/11934-gandi-livedns-diff-mode.yml @@ -0,0 +1,2 @@ +minor_changes: + - gandi_livedns - add support for diff mode, showing before and after state of DNS records (https://github.com/ansible-collections/community.general/issues/4927, https://github.com/ansible-collections/community.general/pull/11934). diff --git a/plugins/module_utils/_gandi_livedns_api.py b/plugins/module_utils/_gandi_livedns_api.py index a27b5a83c3..e35ade16f5 100644 --- a/plugins/module_utils/_gandi_livedns_api.py +++ b/plugins/module_utils/_gandi_livedns_api.py @@ -168,6 +168,7 @@ class GandiLiveDNSAPI: if records: cur_record = records[0] + before = cur_record self.changed = True @@ -177,14 +178,14 @@ class GandiLiveDNSAPI: # Removing one or more values from a record, we update the record with the remaining values self.update_record(record, type, list(new_values), cur_record["rrset_ttl"], domain) records = self.get_records(record, type, domain) - return records[0], self.changed + return before, records[0], self.changed if not self.module.check_mode: self.delete_record(record, type, domain) else: - cur_record = None + before = None - return None, self.changed + return before, None, self.changed def ensure_dns_record(self, record, type, ttl, values, domain): if record == "": @@ -194,6 +195,7 @@ class GandiLiveDNSAPI: if records: cur_record = records[0] + before = cur_record do_update = False if ttl is not None and cur_record["rrset_ttl"] != ttl: @@ -210,10 +212,11 @@ class GandiLiveDNSAPI: records = self.get_records(record, type, domain) result = records[0] self.changed = True - return result, self.changed + return before, result, self.changed else: - return cur_record, self.changed + return before, cur_record, self.changed + before = None if self.module.check_mode: new_record = dict(rrset_type=type, rrset_name=record, rrset_values=values, rrset_ttl=ttl) result = new_record @@ -221,4 +224,4 @@ class GandiLiveDNSAPI: result = self.create_record(record, type, values, ttl, domain) self.changed = True - return result, self.changed + return before, result, self.changed diff --git a/plugins/modules/gandi_livedns.py b/plugins/modules/gandi_livedns.py index 30fa11b67b..3ca9b099ff 100644 --- a/plugins/modules/gandi_livedns.py +++ b/plugins/modules/gandi_livedns.py @@ -20,7 +20,8 @@ attributes: check_mode: support: full diff_mode: - support: none + support: full + version_added: 13.0.0 options: personal_access_token: description: @@ -189,24 +190,32 @@ def main(): gandi_api = GandiLiveDNSAPI(module) + domain = module.params["domain"] + if module.params["state"] == "present": - ret, changed = gandi_api.ensure_dns_record( + before, ret, changed = gandi_api.ensure_dns_record( module.params["record"], module.params["type"], module.params["ttl"], module.params["values"], - module.params["domain"], + domain, ) else: - ret, changed = gandi_api.delete_dns_record( - module.params["record"], module.params["type"], module.params["values"], module.params["domain"] + before, ret, changed = gandi_api.delete_dns_record( + module.params["record"], module.params["type"], module.params["values"], domain ) result = dict( changed=changed, ) if ret: - result["record"] = gandi_api.build_result(ret, module.params["domain"]) + result["record"] = gandi_api.build_result(ret, domain) + + if module._diff: + result["diff"] = { + "before": gandi_api.build_result(before, domain) or {}, + "after": result.get("record") or {}, + } module.exit_json(**result)