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)