From b641cc9ca0889c949f071a236bbb5158a6651347 Mon Sep 17 00:00:00 2001 From: "patchback[bot]" <45432694+patchback[bot]@users.noreply.github.com> Date: Sat, 13 Jun 2026 17:33:31 +0200 Subject: [PATCH] [PR #12149/3fa258f5 backport][stable-12] udm_dns_record: fix idempotency with shortened IPv6 addresses (#12244) udm_dns_record: fix idempotency with shortened IPv6 addresses (#12149) * fix(udm_dns_record): normalize IPv6 addresses before comparison UCS stores IPv6 addresses in expanded form; providing a shortened address causes obj.diff() to always detect a difference and report changed=True. Normalize IPv6 values in the data dict to exploded form before updating the Univention object. Fixes #317 * changelog: add fragment for PR 12149 * add type hint (cherry picked from commit 3fa258f5a84112f7b38ff4074e2ab8bd81d44355) Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com> --- .../12149-udm-dns-record-ipv6-idempotency.yml | 2 ++ plugins/modules/udm_dns_record.py | 24 ++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 changelogs/fragments/12149-udm-dns-record-ipv6-idempotency.yml diff --git a/changelogs/fragments/12149-udm-dns-record-ipv6-idempotency.yml b/changelogs/fragments/12149-udm-dns-record-ipv6-idempotency.yml new file mode 100644 index 0000000000..c2c5cccec0 --- /dev/null +++ b/changelogs/fragments/12149-udm-dns-record-ipv6-idempotency.yml @@ -0,0 +1,2 @@ +bugfixes: + - "udm_dns_record - normalize IPv6 addresses in ``data`` to expanded form to fix idempotency (https://github.com/ansible-collections/community.general/issues/317, https://github.com/ansible-collections/community.general/pull/12149)." diff --git a/plugins/modules/udm_dns_record.py b/plugins/modules/udm_dns_record.py index a35142209d..3278e556fd 100644 --- a/plugins/modules/udm_dns_record.py +++ b/plugins/modules/udm_dns_record.py @@ -114,6 +114,28 @@ with deps.declare("ipaddress"): import ipaddress +def _normalize_ip(value: str) -> str: + try: + addr = ipaddress.ip_address(value) + if isinstance(addr, ipaddress.IPv6Address): + return addr.exploded + except ValueError: + pass + return value + + +def _normalize_data_ips(data: dict) -> dict: + result: dict = {} + for key, value in data.items(): + if isinstance(value, list): + result[key] = [_normalize_ip(v) if isinstance(v, str) else v for v in value] + elif isinstance(value, str): + result[key] = _normalize_ip(value) + else: + result[key] = value + return result + + def main(): module = AnsibleModule( argument_spec=dict( @@ -185,7 +207,7 @@ def main(): else: obj["name"] = name - obj.update(data) + obj.update(_normalize_data_ips(data)) diff = obj.diff() changed = obj.diff() != [] if not module.check_mode: