From 3fa258f5a84112f7b38ff4074e2ab8bd81d44355 Mon Sep 17 00:00:00 2001 From: Alexei Znamensky <103110+russoz@users.noreply.github.com> Date: Sun, 14 Jun 2026 03:07:40 +1200 Subject: [PATCH] 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 --- .../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 a2629a939e..20415ffcd7 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: