From 1017f15c38460c85215c1696b4abea25ecc23485 Mon Sep 17 00:00:00 2001
From: xuxiaowei <35824522+xuxiaowei0512@users.noreply.github.com>
Date: Wed, 17 Apr 2019 15:21:58 +0800
Subject: [PATCH] fix bugs for ce (#54750)
* Update ce.py
while to_text(out, errors='surrogate_then_replace').strip().endswith(']'):
display.vvvv('wrong context, sending exit to device', self._play_context.remote_addr)
conn.exec_command('return')
out = conn.get_prompt()
connetion has no send_command function and ce device has no 'exit' command to return user-view(a correct context),but 'return' .command.
* Add files via upload
Some bugs fix.
* Add files via upload
fix some bugs
* fix a bug for ce_command
Running a command with prompt via ce_command, It doesn't work.The reason is that the key word for network_cli recognition is answer not response.
* fix bugs
fix bugs for ce modules
* Update ce.py
* Delete ce_ftp.py
need modify
* Delete ce_lacp.py
* Add files via upload
* Delete ce_aaa_server.py
* Delete ce_aaa_server_host.py
* Compatible with Python 3
Compatible with Python 3 and fix bugs for ce
* Update ce_aaa_server.py
* Add files via upload
modify doc
* Add files via upload
Compatible with Python 3 and fix bugs
* Add files via upload
Compatible with Python 3 and fix bugs
* Add files via upload
Cancellation of change
* Update ce_netconf.py
It is a bug that response has no xml attribute:line 183
* Add files via upload
* Add files via upload
Compatible with Python 3 and fix bugs
* updatp ce_config.py
a bug for this module.
---
.../module_utils/network/cloudengine/ce.py | 9 +-
.../network/cloudengine/ce_aaa_server.py | 46 +-
.../network/cloudengine/ce_aaa_server_host.py | 420 +++++++++---------
.../modules/network/cloudengine/ce_command.py | 4 +-
.../modules/network/cloudengine/ce_config.py | 55 ++-
.../modules/network/cloudengine/ce_facts.py | 26 +-
.../modules/network/cloudengine/ce_netconf.py | 2 +-
.../modules/network/cloudengine/ce_vlan.py | 18 +-
lib/ansible/plugins/action/ce.py | 4 +-
9 files changed, 315 insertions(+), 269 deletions(-)
diff --git a/lib/ansible/module_utils/network/cloudengine/ce.py b/lib/ansible/module_utils/network/cloudengine/ce.py
index 9b813931409..168c7906831 100644
--- a/lib/ansible/module_utils/network/cloudengine/ce.py
+++ b/lib/ansible/module_utils/network/cloudengine/ce.py
@@ -80,7 +80,7 @@ ce_argument_spec.update(ce_top_spec)
def to_string(data):
- return re.sub(r'|>)', r'|>)', r'" in xml_str:
return result
else:
re_find = re.findall(
- r'.*(.*).*\s*'
- r'(.*).*\s*'
- r'(.*).*', xml_str)
+ r'.*(.*).*\s*'
+ r'(.*).*\s*'
+ r'(.*).*\s*', xml_str)
if re_find:
return re_find
@@ -947,16 +949,15 @@ class AaaServer(object):
conf_str = CE_GET_AUTHORIZATION_SCHEME
xml_str = self.netconf_get_config(module=module, conf_str=conf_str)
-
result = list()
if "" in xml_str:
return result
else:
re_find = re.findall(
- r'.*(.*).*\s*'
- r'(.*).*\s*'
- r'(.*).*', xml_str)
+ r'.*(.*).*\s*'
+ r'(.*).*\s*'
+ r'(.*).*\s*', xml_str)
if re_find:
return re_find
@@ -1132,16 +1133,12 @@ class AaaServer(object):
conf_str = CE_GET_ACCOUNTING_SCHEME
xml_str = self.netconf_get_config(module=module, conf_str=conf_str)
-
result = list()
if "" in xml_str:
return result
else:
- re_find = re.findall(
- r'.*(.*).*\s*'
- r'(.*).*', xml_str)
-
+ re_find = re.findall(r'.*(.*)\s*(.*)', xml_str)
if re_find:
return re_find
else:
@@ -1676,25 +1673,20 @@ def check_module_argument(**kwargs):
module.fail_json(
msg='Error: local_user_group %s '
'is large than 32.' % local_user_group)
- check_name(module=module, name=local_user_group,
- invalid_char=INVALID_GROUP_CHAR)
+ check_name(module=module, name=local_user_group, invalid_char=INVALID_GROUP_CHAR)
def main():
""" Module main """
argument_spec = dict(
- state=dict(choices=['present', 'absent'],
- default='present'),
+ state=dict(choices=['present', 'absent'], default='present'),
authen_scheme_name=dict(type='str'),
- first_authen_mode=dict(choices=['invalid', 'local',
- 'hwtacacs', 'radius', 'none']),
+ first_authen_mode=dict(default='local', choices=['invalid', 'local', 'hwtacacs', 'radius', 'none']),
author_scheme_name=dict(type='str'),
- first_author_mode=dict(choices=['invalid', 'local',
- 'hwtacacs', 'if-authenticated', 'none']),
+ first_author_mode=dict(default='local', choices=['invalid', 'local', 'hwtacacs', 'if-authenticated', 'none']),
acct_scheme_name=dict(type='str'),
- accounting_mode=dict(choices=['invalid', 'hwtacacs',
- 'radius', 'none']),
+ accounting_mode=dict(default='none', choices=['invalid', 'hwtacacs', 'radius', 'none']),
domain_name=dict(type='str'),
radius_server_group=dict(type='str'),
hwtacas_template=dict(type='str'),
@@ -1758,8 +1750,7 @@ def main():
if authen_scheme_name:
scheme_exist = ce_aaa_server.get_authentication_scheme(module=module)
- scheme_new = (first_authen_mode.lower(), "invalid",
- authen_scheme_name.lower())
+ scheme_new = (authen_scheme_name.lower(), first_authen_mode.lower(), "invalid")
existing["authentication scheme"] = scheme_exist
@@ -1843,8 +1834,7 @@ def main():
if author_scheme_name:
scheme_exist = ce_aaa_server.get_authorization_scheme(module=module)
- scheme_new = (first_author_mode.lower(), "invalid",
- author_scheme_name.lower())
+ scheme_new = (author_scheme_name.lower(), first_author_mode.lower(), "invalid")
existing["authorization scheme"] = scheme_exist
@@ -1925,7 +1915,7 @@ def main():
if acct_scheme_name:
scheme_exist = ce_aaa_server.get_accounting_scheme(module=module)
- scheme_new = (accounting_mode.lower(), acct_scheme_name.lower())
+ scheme_new = (acct_scheme_name.lower(), accounting_mode.lower())
existing["accounting scheme"] = scheme_exist
diff --git a/lib/ansible/modules/network/cloudengine/ce_aaa_server_host.py b/lib/ansible/modules/network/cloudengine/ce_aaa_server_host.py
index 60a02589c13..bde163278d4 100644
--- a/lib/ansible/modules/network/cloudengine/ce_aaa_server_host.py
+++ b/lib/ansible/modules/network/cloudengine/ce_aaa_server_host.py
@@ -788,7 +788,7 @@ class AaaServerHost(object):
replace('xmlns="http://www.huawei.com/netconf/vrp"', "")
root = ElementTree.fromstring(xml_str)
- local_user_info = root.findall("data/aaa/lam/users/user")
+ local_user_info = root.findall("aaa/lam/users/user")
if local_user_info:
for tmp in local_user_info:
tmp_dict = dict()
@@ -1042,7 +1042,7 @@ class AaaServerHost(object):
root = ElementTree.fromstring(xml_str)
radius_server_ip_v4 = root.findall(
- "data/radius/rdsTemplates/rdsTemplate/rdsServerIPV4s/rdsServerIPV4")
+ "radius/rdsTemplates/rdsTemplate/rdsServerIPV4s/rdsServerIPV4")
if radius_server_ip_v4:
for tmp in radius_server_ip_v4:
tmp_dict = dict()
@@ -1053,43 +1053,42 @@ class AaaServerHost(object):
result["radius_server_ip_v4"].append(tmp_dict)
if result["radius_server_ip_v4"]:
- for tmp in result["radius_server_ip_v4"]:
- if "serverType" in tmp.keys():
- if state == "present":
- if tmp["serverType"] != radius_server_type:
- need_cfg = True
- else:
- if tmp["serverType"] == radius_server_type:
- need_cfg = True
- if "serverIPAddress" in tmp.keys():
- if state == "present":
- if tmp["serverIPAddress"] != radius_server_ip:
- need_cfg = True
- else:
- if tmp["serverIPAddress"] == radius_server_ip:
- need_cfg = True
- if "serverPort" in tmp.keys():
- if state == "present":
- if tmp["serverPort"] != radius_server_port:
- need_cfg = True
- else:
- if tmp["serverPort"] == radius_server_port:
- need_cfg = True
- if "serverMode" in tmp.keys():
- if state == "present":
- if tmp["serverMode"] != radius_server_mode:
- need_cfg = True
- else:
- if tmp["serverMode"] == radius_server_mode:
- need_cfg = True
- if "vpnName" in tmp.keys():
- if state == "present":
- if tmp["vpnName"] != radius_vpn_name:
- need_cfg = True
- else:
- if tmp["vpnName"] == radius_vpn_name:
- need_cfg = True
+ cfg = dict()
+ config_list = list()
+ if radius_server_type:
+ cfg["serverType"] = radius_server_type.lower()
+ if radius_server_ip:
+ cfg["serverIPAddress"] = radius_server_ip.lower()
+ if radius_server_port:
+ cfg["serverPort"] = radius_server_port.lower()
+ if radius_server_mode:
+ cfg["serverMode"] = radius_server_mode.lower()
+ if radius_vpn_name:
+ cfg["vpnName"] = radius_vpn_name.lower()
+ for tmp in result["radius_server_ip_v4"]:
+ exist_cfg = dict()
+ if radius_server_type:
+ exist_cfg["serverType"] = tmp.get("serverType").lower()
+ if radius_server_ip:
+ exist_cfg["serverIPAddress"] = tmp.get("serverIPAddress").lower()
+ if radius_server_port:
+ exist_cfg["serverPort"] = tmp.get("serverPort").lower()
+ if radius_server_mode:
+ exist_cfg["serverMode"] = tmp.get("serverMode").lower()
+ if radius_vpn_name:
+ exist_cfg["vpnName"] = tmp.get("vpnName").lower()
+ config_list.append(exist_cfg)
+ if cfg in config_list:
+ if state == "present":
+ need_cfg = False
+ else:
+ need_cfg = True
+ else:
+ if state == "present":
+ need_cfg = True
+ else:
+ need_cfg = False
result["need_cfg"] = need_cfg
return result
@@ -1221,7 +1220,7 @@ class AaaServerHost(object):
root = ElementTree.fromstring(xml_str)
radius_server_ip_v6 = root.findall(
- "data/radius/rdsTemplates/rdsTemplate/rdsServerIPV6s/rdsServerIPV6")
+ "radius/rdsTemplates/rdsTemplate/rdsServerIPV6s/rdsServerIPV6")
if radius_server_ip_v6:
for tmp in radius_server_ip_v6:
tmp_dict = dict()
@@ -1232,35 +1231,38 @@ class AaaServerHost(object):
result["radius_server_ip_v6"].append(tmp_dict)
if result["radius_server_ip_v6"]:
+ cfg = dict()
+ config_list = list()
+ if radius_server_type:
+ cfg["serverType"] = radius_server_type.lower()
+ if radius_server_ipv6:
+ cfg["serverIPAddress"] = radius_server_ipv6.lower()
+ if radius_server_port:
+ cfg["serverPort"] = radius_server_port.lower()
+ if radius_server_mode:
+ cfg["serverMode"] = radius_server_mode.lower()
+
for tmp in result["radius_server_ip_v6"]:
- if "serverType" in tmp.keys():
- if state == "present":
- if tmp["serverType"] != radius_server_type:
- need_cfg = True
- else:
- if tmp["serverType"] == radius_server_type:
- need_cfg = True
- if "serverIPAddress" in tmp.keys():
- if state == "present":
- if tmp["serverIPAddress"] != radius_server_ipv6:
- need_cfg = True
- else:
- if tmp["serverIPAddress"] == radius_server_ipv6:
- need_cfg = True
- if "serverPort" in tmp.keys():
- if state == "present":
- if tmp["serverPort"] != radius_server_port:
- need_cfg = True
- else:
- if tmp["serverPort"] == radius_server_port:
- need_cfg = True
- if "serverMode" in tmp.keys():
- if state == "present":
- if tmp["serverMode"] != radius_server_mode:
- need_cfg = True
- else:
- if tmp["serverMode"] == radius_server_mode:
- need_cfg = True
+ exist_cfg = dict()
+ if radius_server_type:
+ exist_cfg["serverType"] = tmp.get("serverType").lower()
+ if radius_server_ipv6:
+ exist_cfg["serverIPAddress"] = tmp.get("serverIPAddress").lower()
+ if radius_server_port:
+ exist_cfg["serverPort"] = tmp.get("serverPort").lower()
+ if radius_server_mode:
+ exist_cfg["serverMode"] = tmp.get("serverMode").lower()
+ config_list.append(exist_cfg)
+ if cfg in config_list:
+ if state == "present":
+ need_cfg = False
+ else:
+ need_cfg = True
+ else:
+ if state == "present":
+ need_cfg = True
+ else:
+ need_cfg = False
result["need_cfg"] = need_cfg
return result
@@ -1380,7 +1382,7 @@ class AaaServerHost(object):
root = ElementTree.fromstring(xml_str)
radius_server_name_cfg = root.findall(
- "data/radius/rdsTemplates/rdsTemplate/rdsServerNames/rdsServerName")
+ "radius/rdsTemplates/rdsTemplate/rdsServerNames/rdsServerName")
if radius_server_name_cfg:
for tmp in radius_server_name_cfg:
tmp_dict = dict()
@@ -1391,43 +1393,42 @@ class AaaServerHost(object):
result["radius_server_name_cfg"].append(tmp_dict)
if result["radius_server_name_cfg"]:
- for tmp in result["radius_server_name_cfg"]:
- if "serverType" in tmp.keys():
- if state == "present":
- if tmp["serverType"] != radius_server_type:
- need_cfg = True
- else:
- if tmp["serverType"] == radius_server_type:
- need_cfg = True
- if "serverName" in tmp.keys():
- if state == "present":
- if tmp["serverName"] != radius_server_name:
- need_cfg = True
- else:
- if tmp["serverName"] == radius_server_name:
- need_cfg = True
- if "serverPort" in tmp.keys():
- if state == "present":
- if tmp["serverPort"] != radius_server_port:
- need_cfg = True
- else:
- if tmp["serverPort"] == radius_server_port:
- need_cfg = True
- if "serverMode" in tmp.keys():
- if state == "present":
- if tmp["serverMode"] != radius_server_mode:
- need_cfg = True
- else:
- if tmp["serverMode"] == radius_server_mode:
- need_cfg = True
- if "vpnName" in tmp.keys():
- if state == "present":
- if tmp["vpnName"] != radius_vpn_name:
- need_cfg = True
- else:
- if tmp["vpnName"] == radius_vpn_name:
- need_cfg = True
+ cfg = dict()
+ config_list = list()
+ if radius_server_type:
+ cfg["serverType"] = radius_server_type.lower()
+ if radius_server_name:
+ cfg["serverName"] = radius_server_name.lower()
+ if radius_server_port:
+ cfg["serverPort"] = radius_server_port.lower()
+ if radius_server_mode:
+ cfg["serverMode"] = radius_server_mode.lower()
+ if radius_vpn_name:
+ cfg["vpnName"] = radius_vpn_name.lower()
+ for tmp in result["radius_server_name_cfg"]:
+ exist_cfg = dict()
+ if radius_server_type:
+ exist_cfg["serverType"] = tmp.get("serverType").lower()
+ if radius_server_name:
+ exist_cfg["serverName"] = tmp.get("serverName").lower()
+ if radius_server_port:
+ exist_cfg["serverPort"] = tmp.get("serverPort").lower()
+ if radius_server_mode:
+ exist_cfg["serverMode"] = tmp.get("serverMode").lower()
+ if radius_vpn_name:
+ exist_cfg["vpnName"] = tmp.get("vpnName").lower()
+ config_list.append(exist_cfg)
+ if cfg in config_list:
+ if state == "present":
+ need_cfg = False
+ else:
+ need_cfg = True
+ else:
+ if state == "present":
+ need_cfg = True
+ else:
+ need_cfg = False
result["need_cfg"] = need_cfg
return result
@@ -1559,7 +1560,7 @@ class AaaServerHost(object):
root = ElementTree.fromstring(xml_str)
hwtacacs_server_cfg_ipv4 = root.findall(
- "data/hwtacacs/hwTacTempCfgs/hwTacTempCfg/hwTacSrvCfgs/hwTacSrvCfg")
+ "hwtacacs/hwTacTempCfgs/hwTacTempCfg/hwTacSrvCfgs/hwTacSrvCfg")
if hwtacacs_server_cfg_ipv4:
for tmp in hwtacacs_server_cfg_ipv4:
tmp_dict = dict()
@@ -1570,43 +1571,43 @@ class AaaServerHost(object):
result["hwtacacs_server_cfg_ipv4"].append(tmp_dict)
if result["hwtacacs_server_cfg_ipv4"]:
- for tmp in result["hwtacacs_server_cfg_ipv4"]:
- if "serverIpAddress" in tmp.keys():
- if state == "present":
- if tmp["serverIpAddress"] != hwtacacs_server_ip:
- need_cfg = True
- else:
- if tmp["serverIpAddress"] == hwtacacs_server_ip:
- need_cfg = True
- if "serverType" in tmp.keys():
- if state == "present":
- if tmp["serverType"] != hwtacacs_server_type:
- need_cfg = True
- else:
- if tmp["serverType"] == hwtacacs_server_type:
- need_cfg = True
- if "isSecondaryServer" in tmp.keys():
- if state == "present":
- if tmp["isSecondaryServer"] != str(hwtacacs_is_secondary_server).lower():
- need_cfg = True
- else:
- if tmp["isSecondaryServer"] == str(hwtacacs_is_secondary_server).lower():
- need_cfg = True
- if "isPublicNet" in tmp.keys():
- if state == "present":
- if tmp["isPublicNet"] != str(hwtacacs_is_public_net).lower():
- need_cfg = True
- else:
- if tmp["isPublicNet"] == str(hwtacacs_is_public_net).lower():
- need_cfg = True
- if "vpnName" in tmp.keys():
- if state == "present":
- if tmp["vpnName"] != hwtacacs_vpn_name:
- need_cfg = True
- else:
- if tmp["vpnName"] == hwtacacs_vpn_name:
- need_cfg = True
+ cfg = dict()
+ config_list = list()
+ if hwtacacs_server_ip:
+ cfg["serverIpAddress"] = hwtacacs_server_ip.lower()
+ if hwtacacs_server_type:
+ cfg["serverType"] = hwtacacs_server_type.lower()
+ if hwtacacs_is_secondary_server:
+ cfg["isSecondaryServer"] = str(hwtacacs_is_secondary_server).lower()
+ if hwtacacs_is_public_net:
+ cfg["isPublicNet"] = str(hwtacacs_is_public_net).lower()
+ if hwtacacs_vpn_name:
+ cfg["vpnName"] = hwtacacs_vpn_name.lower()
+
+ for tmp in result["hwtacacs_server_cfg_ipv4"]:
+ exist_cfg = dict()
+ if hwtacacs_server_ip:
+ exist_cfg["serverIpAddress"] = tmp.get("serverIpAddress").lower()
+ if hwtacacs_server_type:
+ exist_cfg["serverType"] = tmp.get("serverType").lower()
+ if hwtacacs_is_secondary_server:
+ exist_cfg["isSecondaryServer"] = tmp.get("isSecondaryServer").lower()
+ if hwtacacs_is_public_net:
+ exist_cfg["isPublicNet"] = tmp.get("isPublicNet").lower()
+ if hwtacacs_vpn_name:
+ exist_cfg["vpnName"] = tmp.get("vpnName").lower()
+ config_list.append(exist_cfg)
+ if cfg in config_list:
+ if state == "present":
+ need_cfg = False
+ else:
+ need_cfg = True
+ else:
+ if state == "present":
+ need_cfg = True
+ else:
+ need_cfg = False
result["need_cfg"] = need_cfg
return result
@@ -1775,7 +1776,7 @@ class AaaServerHost(object):
root = ElementTree.fromstring(xml_str)
hwtacacs_server_cfg_ipv6 = root.findall(
- "data/hwtacacs/hwTacTempCfgs/hwTacTempCfg/hwTacIpv6SrvCfgs/hwTacIpv6SrvCfg")
+ "hwtacacs/hwTacTempCfgs/hwTacTempCfg/hwTacIpv6SrvCfgs/hwTacIpv6SrvCfg")
if hwtacacs_server_cfg_ipv6:
for tmp in hwtacacs_server_cfg_ipv6:
tmp_dict = dict()
@@ -1786,36 +1787,39 @@ class AaaServerHost(object):
result["hwtacacs_server_cfg_ipv6"].append(tmp_dict)
if result["hwtacacs_server_cfg_ipv6"]:
- for tmp in result["hwtacacs_server_cfg_ipv6"]:
- if "serverIpAddress" in tmp.keys():
- if state == "present":
- if tmp["serverIpAddress"] != hwtacacs_server_ipv6:
- need_cfg = True
- else:
- if tmp["serverIpAddress"] == hwtacacs_server_ipv6:
- need_cfg = True
- if "serverType" in tmp.keys():
- if state == "present":
- if tmp["serverType"] != hwtacacs_server_type:
- need_cfg = True
- else:
- if tmp["serverType"] == hwtacacs_server_type:
- need_cfg = True
- if "isSecondaryServer" in tmp.keys():
- if state == "present":
- if tmp["isSecondaryServer"] != str(hwtacacs_is_secondary_server).lower():
- need_cfg = True
- else:
- if tmp["isSecondaryServer"] == str(hwtacacs_is_secondary_server).lower():
- need_cfg = True
- if "vpnName" in tmp.keys():
- if state == "present":
- if tmp["vpnName"] != hwtacacs_vpn_name:
- need_cfg = True
- else:
- if tmp["vpnName"] == hwtacacs_vpn_name:
- need_cfg = True
+ cfg = dict()
+ config_list = list()
+ if hwtacacs_server_ipv6:
+ cfg["serverIpAddress"] = hwtacacs_server_ipv6.lower()
+ if hwtacacs_server_type:
+ cfg["serverType"] = hwtacacs_server_type.lower()
+ if hwtacacs_is_secondary_server:
+ cfg["isSecondaryServer"] = str(hwtacacs_is_secondary_server).lower()
+ if hwtacacs_vpn_name:
+ cfg["vpnName"] = hwtacacs_vpn_name.lower()
+
+ for tmp in result["hwtacacs_server_cfg_ipv6"]:
+ exist_cfg = dict()
+ if hwtacacs_server_ipv6:
+ exist_cfg["serverIpAddress"] = tmp.get("serverIpAddress").lower()
+ if hwtacacs_server_type:
+ exist_cfg["serverType"] = tmp.get("serverType").lower()
+ if hwtacacs_is_secondary_server:
+ exist_cfg["isSecondaryServer"] = tmp.get("isSecondaryServer").lower()
+ if hwtacacs_vpn_name:
+ exist_cfg["vpnName"] = tmp.get("vpnName").lower()
+ config_list.append(exist_cfg)
+ if cfg in config_list:
+ if state == "present":
+ need_cfg = False
+ else:
+ need_cfg = True
+ else:
+ if state == "present":
+ need_cfg = True
+ else:
+ need_cfg = False
result["need_cfg"] = need_cfg
return result
@@ -1967,7 +1971,7 @@ class AaaServerHost(object):
root = ElementTree.fromstring(xml_str)
hwtacacs_server_name_cfg = root.findall(
- "data/hwtacacs/hwTacTempCfgs/hwTacTempCfg/hwTacHostSrvCfgs/hwTacHostSrvCfg")
+ "hwtacacs/hwTacTempCfgs/hwTacTempCfg/hwTacHostSrvCfgs/hwTacHostSrvCfg")
if hwtacacs_server_name_cfg:
for tmp in hwtacacs_server_name_cfg:
tmp_dict = dict()
@@ -1978,43 +1982,43 @@ class AaaServerHost(object):
result["hwtacacs_server_name_cfg"].append(tmp_dict)
if result["hwtacacs_server_name_cfg"]:
- for tmp in result["hwtacacs_server_name_cfg"]:
- if "serverHostName" in tmp.keys():
- if state == "present":
- if tmp["serverHostName"] != hwtacacs_server_host_name:
- need_cfg = True
- else:
- if tmp["serverHostName"] == hwtacacs_server_host_name:
- need_cfg = True
- if "serverType" in tmp.keys():
- if state == "present":
- if tmp["serverType"] != hwtacacs_server_type:
- need_cfg = True
- else:
- if tmp["serverType"] == hwtacacs_server_type:
- need_cfg = True
- if "isSecondaryServer" in tmp.keys():
- if state == "present":
- if tmp["isSecondaryServer"] != str(hwtacacs_is_secondary_server).lower():
- need_cfg = True
- else:
- if tmp["isSecondaryServer"] == str(hwtacacs_is_secondary_server).lower():
- need_cfg = True
- if "isPublicNet" in tmp.keys():
- if state == "present":
- if tmp["isPublicNet"] != str(hwtacacs_is_public_net).lower():
- need_cfg = True
- else:
- if tmp["isPublicNet"] == str(hwtacacs_is_public_net).lower():
- need_cfg = True
- if "vpnName" in tmp.keys():
- if state == "present":
- if tmp["vpnName"] != hwtacacs_vpn_name:
- need_cfg = True
- else:
- if tmp["vpnName"] == hwtacacs_vpn_name:
- need_cfg = True
+ cfg = dict()
+ config_list = list()
+ if hwtacacs_server_host_name:
+ cfg["serverHostName"] = hwtacacs_server_host_name.lower()
+ if hwtacacs_server_type:
+ cfg["serverType"] = hwtacacs_server_type.lower()
+ if hwtacacs_is_secondary_server:
+ cfg["isSecondaryServer"] = str(hwtacacs_is_secondary_server).lower()
+ if hwtacacs_is_public_net:
+ cfg["isPublicNet"] = str(hwtacacs_is_public_net).lower()
+ if hwtacacs_vpn_name:
+ cfg["vpnName"] = hwtacacs_vpn_name.lower()
+
+ for tmp in result["hwtacacs_server_name_cfg"]:
+ exist_cfg = dict()
+ if hwtacacs_server_host_name:
+ exist_cfg["serverHostName"] = tmp.get("serverHostName").lower()
+ if hwtacacs_server_type:
+ exist_cfg["serverType"] = tmp.get("serverType").lower()
+ if hwtacacs_is_secondary_server:
+ exist_cfg["isSecondaryServer"] = tmp.get("isSecondaryServer").lower()
+ if hwtacacs_is_public_net:
+ exist_cfg["isPublicNet"] = tmp.get("isPublicNet").lower()
+ if hwtacacs_vpn_name:
+ exist_cfg["vpnName"] = tmp.get("vpnName").lower()
+ config_list.append(exist_cfg)
+ if cfg in config_list:
+ if state == "present":
+ need_cfg = False
+ else:
+ need_cfg = True
+ else:
+ if state == "present":
+ need_cfg = True
+ else:
+ need_cfg = False
result["need_cfg"] = need_cfg
return result
diff --git a/lib/ansible/modules/network/cloudengine/ce_command.py b/lib/ansible/modules/network/cloudengine/ce_command.py
index 971f4aac9f8..738684c4784 100644
--- a/lib/ansible/modules/network/cloudengine/ce_command.py
+++ b/lib/ansible/modules/network/cloudengine/ce_command.py
@@ -27,7 +27,7 @@ DOCUMENTATION = """
module: ce_command
version_added: "2.3"
-author: "JackyGao2016 (@JackyGao2016)"
+author: "JackyGao2016 (@CloudEngine-Ansible)"
short_description: Run arbitrary command on HUAWEI CloudEngine devices.
description:
- Sends an arbitrary command to an HUAWEI CloudEngine node and returns
@@ -168,7 +168,7 @@ def parse_commands(module, warnings):
command=dict(key=True),
output=dict(),
prompt=dict(),
- response=dict()
+ answer=dict()
), module)
commands = transform(module.params['commands'])
diff --git a/lib/ansible/modules/network/cloudengine/ce_config.py b/lib/ansible/modules/network/cloudengine/ce_config.py
index db72e664981..a18e5363534 100644
--- a/lib/ansible/modules/network/cloudengine/ce_config.py
+++ b/lib/ansible/modules/network/cloudengine/ce_config.py
@@ -224,6 +224,7 @@ from ansible.module_utils.network.common.config import NetworkConfig, dumps
from ansible.module_utils.network.cloudengine.ce import get_config, load_config, run_commands
from ansible.module_utils.network.cloudengine.ce import ce_argument_spec
from ansible.module_utils.network.cloudengine.ce import check_args as ce_check_args
+import re
def check_args(module, warnings):
@@ -240,10 +241,45 @@ def get_running_config(module):
return NetworkConfig(indent=1, contents=contents)
+def conversion_src(module):
+ src_list = module.params['src'].split('\n')
+ src_list_organize = []
+ exit_list = [' return', ' system-view']
+ if src_list[0].strip() == '#':
+ src_list.pop(0)
+ for per_config in src_list:
+ if per_config.strip() == '#':
+ if per_config.rstrip() == '#':
+ src_list_organize.extend(exit_list)
+ else:
+ src_list_organize.append('quit')
+ else:
+ src_list_organize.append(per_config)
+ src_str = '\n'.join(src_list_organize)
+ return src_str
+
+
+def conversion_lines(commands):
+ all_config = []
+ exit_list = [' return', ' system-view']
+ for per_command in commands:
+ if re.search(r',', per_command):
+ all_config.extend(exit_list)
+ per_config = per_command.split(',')
+ for config in per_config:
+ if config:
+ all_config.append(config)
+ all_config.extend(exit_list)
+ else:
+ all_config.append(per_command)
+ return all_config
+
+
def get_candidate(module):
candidate = NetworkConfig(indent=1)
if module.params['src']:
- candidate.load(module.params['src'])
+ config = conversion_src(module)
+ candidate.load(config)
elif module.params['lines']:
parents = module.params['parents'] or list()
candidate.add(module.params['lines'], parents=parents)
@@ -253,7 +289,6 @@ def get_candidate(module):
def run(module, result):
match = module.params['match']
replace = module.params['replace']
-
candidate = get_candidate(module)
if match != 'none':
@@ -265,21 +300,27 @@ def run(module, result):
if configobjs:
commands = dumps(configobjs, 'commands').split('\n')
-
if module.params['lines']:
+
+ commands = conversion_lines(commands)
+
if module.params['before']:
commands[:0] = module.params['before']
if module.params['after']:
commands.extend(module.params['after'])
- result['commands'] = commands
- result['updates'] = commands
+ command_display = []
+ for per_command in commands:
+ if per_command.strip() not in ['quit', 'return', 'system-view']:
+ command_display.append(per_command)
+ result['commands'] = command_display
+ result['updates'] = command_display
if not module.check_mode:
load_config(module, commands)
-
- result['changed'] = True
+ if result['commands']:
+ result['changed'] = True
def main():
diff --git a/lib/ansible/modules/network/cloudengine/ce_facts.py b/lib/ansible/modules/network/cloudengine/ce_facts.py
index ea8f15d9674..d4849ea8a44 100644
--- a/lib/ansible/modules/network/cloudengine/ce_facts.py
+++ b/lib/ansible/modules/network/cloudengine/ce_facts.py
@@ -205,11 +205,14 @@ class Default(FactsBase):
data = self.responses[0]
if data:
version = data.split("\n")
- tmp_version = version[11:]
- for item in tmp_version:
- tmp_item = item.split()
- tmp_key = tmp_item[1] + " " + tmp_item[2]
- self.facts[tmp_key] = tmp_item[4]
+ for item in version:
+ if re.findall(r"^\d+\S\s+", item.strip()):
+ tmp_item = item.split()
+ tmp_key = tmp_item[1] + " " + tmp_item[2]
+ if len(tmp_item) > 5:
+ self.facts[tmp_key] = " ".join(tmp_item[4:])
+ else:
+ self.facts[tmp_key] = tmp_item[4]
data = self.responses[1]
if data:
@@ -293,12 +296,17 @@ class Interfaces(FactsBase):
super(Interfaces, self).populate()
data = self.responses[0]
+ begin = False
if data:
interface_info = data.split("\n")
- tmp_interface = interface_info[12:]
- for item in tmp_interface:
- tmp_item = item.split()
- interface_dict[tmp_item[0]] = tmp_item[1]
+ for item in interface_info:
+ if begin:
+ tmp_item = item.split()
+ interface_dict[tmp_item[0]] = tmp_item[1]
+
+ if re.findall(r"^Interface", item.strip()):
+ begin = True
+
self.facts['interfaces'] = interface_dict
data = self.responses[1]
diff --git a/lib/ansible/modules/network/cloudengine/ce_netconf.py b/lib/ansible/modules/network/cloudengine/ce_netconf.py
index 5359b5cad68..a72bdaf69e1 100644
--- a/lib/ansible/modules/network/cloudengine/ce_netconf.py
+++ b/lib/ansible/modules/network/cloudengine/ce_netconf.py
@@ -180,7 +180,7 @@ def main():
if "" in response:
end_state["result"] = ""
else:
- tmp1 = response.xml.split(r"")
+ tmp1 = response.split(r"")
tmp2 = tmp1[1].split(r"")
result = tmp2[0].split("\n")
diff --git a/lib/ansible/modules/network/cloudengine/ce_vlan.py b/lib/ansible/modules/network/cloudengine/ce_vlan.py
index 2fed160c9b2..6e54a1b3364 100644
--- a/lib/ansible/modules/network/cloudengine/ce_vlan.py
+++ b/lib/ansible/modules/network/cloudengine/ce_vlan.py
@@ -384,13 +384,17 @@ class Vlan(object):
if "" in xml_str:
return attr
else:
- re_find = re.findall(r'.*(.*).*\s*'
- r'(.*).*\s*'
- r'(.*).*', xml_str)
- if re_find:
- attr = dict(vlan_id=re_find[0][0], name=re_find[0][1],
- description=re_find[0][2])
+ re_find_id = re.findall(r'.*(.*).*\s*', xml_str)
+ re_find_name = re.findall(r'.*(.*).*\s*', xml_str)
+ re_find_desc = re.findall(r'.*(.*).*\s*', xml_str)
+ if re_find_id:
+ if re_find_name:
+ attr = dict(vlan_id=re_find_id[0], name=re_find_name[0],
+ description=re_find_desc[0])
+ else:
+ attr = dict(vlan_id=re_find_id[0], name=None,
+ description=re_find_desc[0])
return attr
def get_vlans_name(self):
@@ -477,7 +481,7 @@ class Vlan(object):
if tagged_vlans <= 0 or tagged_vlans > 4094:
self.module.fail_json(
msg='Error: Vlan id is not in the range from 1 to 4094.')
- j = tagged_vlans / 4
+ j = tagged_vlans // 4
bit_int[j] |= 0x8 >> (tagged_vlans % 4)
vlan_bit[j] = hex(bit_int[j])[2]
diff --git a/lib/ansible/plugins/action/ce.py b/lib/ansible/plugins/action/ce.py
index 0680d91fc94..a6d40cd5201 100644
--- a/lib/ansible/plugins/action/ce.py
+++ b/lib/ansible/plugins/action/ce.py
@@ -19,7 +19,7 @@ from ansible.utils.display import Display
display = Display()
-CLI_SUPPORTED_MODULES = ['ce_config', 'ce_command']
+CLI_SUPPORTED_MODULES = ['ce_config', 'ce_command', 'ce_facts']
class ActionModule(ActionNetworkModule):
@@ -89,7 +89,7 @@ class ActionModule(ActionNetworkModule):
out = conn.get_prompt()
while to_text(out, errors='surrogate_then_replace').strip().endswith(']'):
display.vvvv('wrong context, sending exit to device', self._play_context.remote_addr)
- conn.send_command('exit')
+ conn.exec_command('return')
out = conn.get_prompt()
result = super(ActionModule, self).run(task_vars=task_vars)