summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGanesh Nalawade <ganesh634@gmail.com>2020-08-27 21:40:46 +0530
committerGitHub <noreply@github.com>2020-08-27 11:10:46 -0500
commit67fab726b9a6ce77a78092de2da1b036f2fb4785 (patch)
tree25f1ad8f4c575e2e611431ce7015bbcff8878af0
parent35d3ed5f1014197ba906c37aee4af882b61a25ac (diff)
downloadansible-67fab726b9a6ce77a78092de2da1b036f2fb4785.tar.gz
Fix commit timeout failure issue for netconf modules (#71291)
Fixes https://github.com/ansible-collections/cisco.iosxr/issues/74 * ncclient API expects commit timeout value in either unicode or bytes format, hence convert the timeout value explicitly to string type.
-rw-r--r--changelogs/fragments/iosxr_netconf_config_commit_fix.yaml2
-rw-r--r--lib/ansible/plugins/netconf/__init__.py3
-rw-r--r--lib/ansible/plugins/netconf/iosxr.py4
-rw-r--r--test/integration/targets/netconf_config/tests/iosxr/basic.yaml20
4 files changed, 27 insertions, 2 deletions
diff --git a/changelogs/fragments/iosxr_netconf_config_commit_fix.yaml b/changelogs/fragments/iosxr_netconf_config_commit_fix.yaml
new file mode 100644
index 0000000000..429f3c5c59
--- /dev/null
+++ b/changelogs/fragments/iosxr_netconf_config_commit_fix.yaml
@@ -0,0 +1,2 @@
+bugfixes:
+- Confirmed commit fails with TypeError in IOS XR netconf plugin (https://github.com/ansible-collections/cisco.iosxr/issues/74)
diff --git a/lib/ansible/plugins/netconf/__init__.py b/lib/ansible/plugins/netconf/__init__.py
index b181f37696..529cc26067 100644
--- a/lib/ansible/plugins/netconf/__init__.py
+++ b/lib/ansible/plugins/netconf/__init__.py
@@ -24,7 +24,7 @@ from functools import wraps
from ansible.errors import AnsibleError
from ansible.plugins import AnsiblePlugin
-from ansible.module_utils._text import to_native
+from ansible.module_utils._text import to_native, to_text
from ansible.module_utils.basic import missing_required_lib
try:
@@ -269,6 +269,7 @@ class NetconfBase(AnsiblePlugin):
and set a token on the ongoing confirmed commit
:return: Returns xml string containing the RPC response received from remote host
"""
+ timeout = to_text(timeout, errors='surrogate_or_strict')
resp = self.m.commit(confirmed=confirmed, timeout=timeout, persist=persist)
return resp.data_xml if hasattr(resp, 'data_xml') else resp.xml
diff --git a/lib/ansible/plugins/netconf/iosxr.py b/lib/ansible/plugins/netconf/iosxr.py
index 228c5828ab..2bcbfbf8ee 100644
--- a/lib/ansible/plugins/netconf/iosxr.py
+++ b/lib/ansible/plugins/netconf/iosxr.py
@@ -42,7 +42,7 @@ import json
import re
import collections
-from ansible.module_utils._text import to_native
+from ansible.module_utils._text import to_native, to_text
from ansible.module_utils.network.common.netconf import remove_namespaces
from ansible.module_utils.network.iosxr.iosxr import build_xml, etree_find
from ansible.errors import AnsibleConnectionFailure
@@ -181,6 +181,8 @@ class Netconf(NetconfBase):
raise Exception(to_xml(exc.xml))
def commit(self, confirmed=False, timeout=None, persist=None, remove_ns=False):
+ timeout = to_text(timeout, errors='surrogate_or_strict')
+
try:
resp = self.m.commit(confirmed=confirmed, timeout=timeout, persist=persist)
if remove_ns:
diff --git a/test/integration/targets/netconf_config/tests/iosxr/basic.yaml b/test/integration/targets/netconf_config/tests/iosxr/basic.yaml
index c2cd38974d..47af1306ec 100644
--- a/test/integration/targets/netconf_config/tests/iosxr/basic.yaml
+++ b/test/integration/targets/netconf_config/tests/iosxr/basic.yaml
@@ -11,4 +11,24 @@
that:
- "'backup_path' in result"
+- name: test confirm commit
+ netconf_config:
+ target: "candidate"
+ error_option: "rollback-on-error"
+ commit: yes
+ confirm: 10
+ default_operation: "merge"
+ content: |
+ <nc:config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
+ <cdp xmlns="http://cisco.com/ns/yang/Cisco-IOS-XR-cdp-cfg">
+ <enable>true</enable>
+ </cdp>
+ </nc:config>
+ register: result
+ ignore_errors: True
+
+- assert:
+ that:
+ - "'failed' not in result"
+
- debug: msg="END netconf_config iosxr/basic.yaml on connection={{ ansible_connection }}"