diff --git a/plugins/module_utils/diff.py b/plugins/module_utils/diff.py new file mode 100644 index 0000000..6ba4aa1 --- /dev/null +++ b/plugins/module_utils/diff.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Red Hat, Inc. +# Apache License 2.0 (see LICENSE or http://www.apache.org/licenses/LICENSE-2.0) + +from typing import Dict, Tuple, Optional + +from ansible_collections.kubernetes.core.plugins.module_utils.k8s import service + + +# Copied from +# https://github.com/ansible-collections/kubernetes.core/blob/d329e7ee42799ae9d86b54cf2c7dfc8059103504/plugins/module_utils/k8s/service.py#L493 +# Removed this once this fix was merged into kubernetes.core. +def _diff_objects( + existing: Dict, new: Dict, hidden_fields: Optional[list] = None +) -> Tuple[bool, Dict]: + result = {} + diff = service.recursive_diff(existing, new) + if not diff: + return True, result + + result["before"] = service.hide_fields(diff[0], hidden_fields) + result["after"] = service.hide_fields(diff[1], hidden_fields) + + if list(result["after"].keys()) == ["metadata"] and list( + result["before"].keys() + ) == ["metadata"]: + # If only metadata.generation and metadata.resourceVersion changed, ignore it + ignored_keys = set(["generation", "resourceVersion"]) + + if set(result["after"]["metadata"].keys()).issubset(ignored_keys) and set( + result["before"]["metadata"].keys() + ).issubset(ignored_keys): + return True, result + + return False, result + + +service.diff_objects = _diff_objects + + +def _patch_diff_objects(): + """_dummy is required to satisfy the unused import linter and the ansible-doc sanity check.""" + pass diff --git a/plugins/modules/kubevirt_vm.py b/plugins/modules/kubevirt_vm.py index abfa35b..73d0c6f 100644 --- a/plugins/modules/kubevirt_vm.py +++ b/plugins/modules/kubevirt_vm.py @@ -282,6 +282,11 @@ result: type: str """ +# Monkey patch service.diff_objects to temporarily fix the changed logic +from ansible_collections.kubevirt.core.plugins.module_utils.diff import ( + _patch_diff_objects, +) + from copy import deepcopy from typing import Dict @@ -457,4 +462,5 @@ def main() -> None: if __name__ == "__main__": + _patch_diff_objects() main() diff --git a/plugins/modules/kubevirt_vm_info.py b/plugins/modules/kubevirt_vm_info.py index fb0c634..a6d0668 100644 --- a/plugins/modules/kubevirt_vm_info.py +++ b/plugins/modules/kubevirt_vm_info.py @@ -159,6 +159,11 @@ resources: type: dict """ +# Monkey patch service.diff_objects to temporarily fix the changed logic +from ansible_collections.kubevirt.core.plugins.module_utils.diff import ( + _patch_diff_objects, +) + from copy import deepcopy from ansible_collections.kubernetes.core.plugins.module_utils.ansiblemodule import ( @@ -223,4 +228,5 @@ def main(): if __name__ == "__main__": + _patch_diff_objects() main() diff --git a/plugins/modules/kubevirt_vmi_info.py b/plugins/modules/kubevirt_vmi_info.py index d857fae..1c2acae 100644 --- a/plugins/modules/kubevirt_vmi_info.py +++ b/plugins/modules/kubevirt_vmi_info.py @@ -144,6 +144,11 @@ resources: type: dict """ +# Monkey patch service.diff_objects to temporarily fix the changed logic +from ansible_collections.kubevirt.core.plugins.module_utils.diff import ( + _patch_diff_objects, +) + from copy import deepcopy from ansible_collections.kubernetes.core.plugins.module_utils.ansiblemodule import ( @@ -202,4 +207,5 @@ def main(): if __name__ == "__main__": + _patch_diff_objects() main()