diff --git a/changelogs/fragments/59515-ce_mtu-update-to-fix-bugs.yml b/changelogs/fragments/59515-ce_mtu-update-to-fix-bugs.yml
new file mode 100644
index 0000000000..21689fad49
--- /dev/null
+++ b/changelogs/fragments/59515-ce_mtu-update-to-fix-bugs.yml
@@ -0,0 +1,2 @@
+bugfixes:
+- ce_mtu - bug-info - unable to parse request, to fix the bug (https://github.com/ansible/ansible/pull/59343)
diff --git a/lib/ansible/modules/network/cloudengine/ce_mtu.py b/lib/ansible/modules/network/cloudengine/ce_mtu.py
index d1e802b51d..f4ccb96abd 100644
--- a/lib/ansible/modules/network/cloudengine/ce_mtu.py
+++ b/lib/ansible/modules/network/cloudengine/ce_mtu.py
@@ -135,32 +135,8 @@ changed:
import re
import copy
from ansible.module_utils.basic import AnsibleModule
-from ansible.module_utils.network.cloudengine.ce import ce_argument_spec, get_config, load_config, get_nc_config, set_nc_config
-
-CE_NC_GET_INTF = """
-
-
-
-
- %s
-
-
-
-
-
-
-"""
-
-CE_NC_XML_MERGE_INTF_MTU = """
-
-
-
- %s
- %s
-
-
-
-"""
+from ansible.module_utils.network.cloudengine.ce import ce_argument_spec, load_config
+from ansible.module_utils.connection import exec_command
def is_interface_support_setjumboframe(interface):
@@ -236,12 +212,6 @@ def get_interface_type(interface):
return iftype.lower()
-def build_config_xml(xmlstr):
- """ build_config_xml"""
-
- return ' ' + xmlstr + ' '
-
-
class Mtu(object):
"""set mtu"""
@@ -276,36 +246,49 @@ class Mtu(object):
self.module = AnsibleModule(
argument_spec=self.spec, supports_check_mode=True)
- def check_response(self, xml_str, xml_name):
- """Check if response message is already succeed."""
+ def get_config(self, flags=None):
+ """Retrieves the current config from the device or cache
+ """
+ flags = [] if flags is None else flags
- if "" not in xml_str:
- self.module.fail_json(msg='Error: %s failed.' % xml_name)
+ cmd = 'display current-configuration '
+ cmd += ' '.join(flags)
+ cmd = cmd.strip()
+
+ rc, out, err = exec_command(self.module, cmd)
+ if rc != 0:
+ self.module.fail_json(msg=err)
+ cfg = str(out).strip()
+
+ return cfg
def get_interface_dict(self, ifname):
""" get one interface attributes dict."""
intf_info = dict()
- conf_str = CE_NC_GET_INTF % ifname
- ret_xml = get_nc_config(self.module, conf_str)
- if "" in ret_xml:
+
+ flags = list()
+ exp = r"| ignore-case section include ^#\s+interface %s\s+" % ifname.replace(" ", "")
+ flags.append(exp)
+ output = self.get_config(flags)
+ output_list = output.split('\n')
+ if output_list is None:
return intf_info
- intf = re.findall(
- r'.*(.*).*\s*'
- r'(.*).*\s*'
- r'(.*).*', ret_xml)
+ mtu = None
+ for config in output_list:
+ config = config.strip()
+ if config.startswith('mtu'):
+ mtu = re.findall(r'.*mtu\s*([0-9]*)', output)[0]
- if intf:
- intf_info = dict(ifName=intf[0][0],
- isL2SwitchPort=intf[0][1],
- ifMtu=intf[0][2])
+ intf_info = dict(ifName=ifname,
+ ifMtu=mtu)
return intf_info
def prase_jumboframe_para(self, config_str):
"""prase_jumboframe_para"""
- interface_cli = "interface %s" % self.interface
+ interface_cli = "interface %s" % (self.interface.replace(" ", "").lower())
if config_str.find(interface_cli) == -1:
self.module.fail_json(msg='Error: Interface does not exist.')
@@ -322,11 +305,13 @@ class Mtu(object):
return re.findall(r'([0-9]+)', config_str_tmp)
- def cli_load_config(self, commands):
+ def cli_load_config(self):
"""load config by cli"""
if not self.module.check_mode:
- load_config(self.module, commands)
+ if len(self.commands) > 1:
+ load_config(self.module, self.commands)
+ self.changed = True
def cli_add_command(self, command, undo=False):
"""add command to self.update_cmd and self.commands"""
@@ -342,10 +327,10 @@ class Mtu(object):
""" get_jumboframe_config"""
flags = list()
- exp = " all | section inc %s$" % self.interface.upper()
+ exp = r"| ignore-case section include ^#\s+interface %s\s+" % self.interface.replace(" ", "")
flags.append(exp)
- output = get_config(self.module, flags)
- output = output.replace('*', '')
+ output = self.get_config(flags)
+ output = output.replace('*', '').lower()
return self.prase_jumboframe_para(output)
@@ -387,10 +372,6 @@ class Mtu(object):
return
jbf_value = [9216, 1518]
- # excute commands
- command = "interface %s" % self.interface
- self.cli_add_command(command)
-
if len(jbf_value) == 2:
self.jbf_cli = "jumboframe enable %s %s" % (
jbf_value[0], jbf_value[1])
@@ -398,9 +379,6 @@ class Mtu(object):
self.jbf_cli = "jumboframe enable %s" % (jbf_value[0])
self.cli_add_command(self.jbf_cli)
- if self.commands:
- self.cli_load_config(self.commands)
- self.changed = True
if self.state == "present":
if self.jbf_min:
self.updates_cmd.append(
@@ -417,25 +395,24 @@ class Mtu(object):
xmlstr = ''
change = False
- self.updates_cmd.append("interface %s" % ifname)
+
+ command = "interface %s" % ifname
+ self.cli_add_command(command)
+
if self.state == "present":
if mtu and self.intf_info["ifMtu"] != mtu:
- xmlstr += CE_NC_XML_MERGE_INTF_MTU % (ifname, mtu)
+ command = "mtu %s" % mtu
+ self.cli_add_command(command)
self.updates_cmd.append("mtu %s" % mtu)
change = True
else:
- if self.intf_info["ifMtu"] != '1500':
- xmlstr += CE_NC_XML_MERGE_INTF_MTU % (ifname, '1500')
+ if self.intf_info["ifMtu"] != '1500' and self.intf_info["ifMtu"]:
+ command = "mtu 1500"
+ self.cli_add_command(command)
self.updates_cmd.append("undo mtu")
change = True
- if not change:
- return
-
- conf_str = build_config_xml(xmlstr)
- ret_xml = set_nc_config(self.module, conf_str)
- self.check_response(ret_xml, "MERGE_INTF_MTU")
- self.changed = True
+ return
def check_params(self):
"""Check all input params"""
@@ -465,10 +442,6 @@ class Mtu(object):
if not self.intf_info:
self.module.fail_json(msg='Error: interface does not exist.')
- # check interface
- if self.mtu and self.intf_info['isL2SwitchPort'] == 'true':
- self.module.fail_json(msg='Error: L2Switch Port can not set mtu.')
-
# check interface can set jumbo frame
if self.state == 'present':
if self.jbf_max:
@@ -489,7 +462,7 @@ class Mtu(object):
if not self.jbf_max:
self.module.fail_json(
msg='Error: please specify max jumboframe value.')
- if (int(self.jbf_min) > self.jbf_max) or (int(self.jbf_min) < 1518):
+ if (int(self.jbf_min) > int(self.jbf_max)) or (int(self.jbf_min) < 1518):
self.module.fail_json(
msg='Error: Min jumboframe is between '
'1518 to jumboframe max value.')
@@ -570,6 +543,7 @@ class Mtu(object):
self.merge_interface(self.interface, self.mtu)
self.set_jumboframe()
+ self.cli_load_config()
self.get_existing()
self.get_end_state()