summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNilashish Chakraborty <nilashishchakraborty8@gmail.com>2019-10-02 21:13:29 +0530
committerToshio Kuratomi <a.badger@gmail.com>2019-10-03 11:24:27 -0700
commite3b61c40bb11aec7fd1aadf896f45716fe1cfc55 (patch)
tree8d2c5836002e4e775208fd00275f50d8ec1f8ea0
parent6d5cac5f510278d1931fc5837cf9fc0edf5ff92a (diff)
downloadansible-e3b61c40bb11aec7fd1aadf896f45716fe1cfc55.tar.gz
IOS-XR: Fix iosxr_lag_interfaces intermittent failures (#62998)
* Fix iosxr_lag_interfaces intermittent failures * If the dictionary is read out of order from member the current logic in `diff_list_of_dicts` returns unwanted diff. Hence use `dict_diff` utils function instead of sets. Remove zip() to make existing tests happy Signed-off-by: NilashishC <nilashishchakraborty8@gmail.com> * Address review comments Signed-off-by: NilashishC <nilashishchakraborty8@gmail.com> (cherry picked from commit 69317a9d3e7286ca5419114b52ebe307aafd702b) Add changelog for iosxr_lag_interfaces fix
-rw-r--r--changelogs/fragments/62998-fix_iosxr_lag_interfaces_random_failures.yaml3
-rw-r--r--lib/ansible/module_utils/network/iosxr/utils/utils.py15
2 files changed, 11 insertions, 7 deletions
diff --git a/changelogs/fragments/62998-fix_iosxr_lag_interfaces_random_failures.yaml b/changelogs/fragments/62998-fix_iosxr_lag_interfaces_random_failures.yaml
new file mode 100644
index 0000000000..2386402456
--- /dev/null
+++ b/changelogs/fragments/62998-fix_iosxr_lag_interfaces_random_failures.yaml
@@ -0,0 +1,3 @@
+---
+bugfixes:
+ - iosxr - Fix random idempotence issues with iosxr_lag_interfaces Resource Module (https://github.com/ansible/ansible/pull/62998).
diff --git a/lib/ansible/module_utils/network/iosxr/utils/utils.py b/lib/ansible/module_utils/network/iosxr/utils/utils.py
index 555a905097..b6d0bef5ac 100644
--- a/lib/ansible/module_utils/network/iosxr/utils/utils.py
+++ b/lib/ansible/module_utils/network/iosxr/utils/utils.py
@@ -9,7 +9,7 @@ from __future__ import absolute_import, division, print_function
__metaclass__ = type
from ansible.module_utils.six import iteritems
-from ansible.module_utils.network.common.utils import is_masklen, to_netmask
+from ansible.module_utils.network.common.utils import dict_diff, is_masklen, to_netmask, search_obj_in_list
def remove_command_from_config_list(interface, cmd, commands):
@@ -178,12 +178,13 @@ def diff_list_of_dicts(w, h):
h = []
diff = []
- set_w = set(tuple(d.items()) for d in w)
- set_h = set(tuple(d.items()) for d in h)
- difference = set_w.difference(set_h)
-
- for element in difference:
- diff.append(dict((x, y) for x, y in element))
+ for w_item in w:
+ h_item = search_obj_in_list(w_item['member'], h, key='member') or {}
+ d = dict_diff(h_item, w_item)
+ if d:
+ if 'member' not in d.keys():
+ d['member'] = w_item['member']
+ diff.append(d)
return diff