#!/usr/bin/python # # This file is part of Ansible # # Ansible is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Ansible is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Ansible. If not, see . # from __future__ import (absolute_import, division, print_function) __metaclass__ = type ANSIBLE_METADATA = {'metadata_version': '1.1', 'status': ['preview'], 'supported_by': 'community'} DOCUMENTATION = ''' --- module: ce_bgp short_description: Manages BGP configuration on HUAWEI CloudEngine switches. description: - Manages BGP configurations on HUAWEI CloudEngine switches. author: - wangdezhuang (@QijunPan) notes: - This module requires the netconf system service be enabled on the remote device being managed. - Recommended connection is C(netconf). - This module also works with C(local) connections for legacy playbooks. options: state: description: - Specify desired state of the resource. default: present choices: ['present','absent'] as_number: description: - Local AS number. The value is a string of 1 to 11 characters. graceful_restart: description: - Enable GR of the BGP speaker in the specified address family, peer address, or peer group. default: no_use choices: ['no_use','true','false'] time_wait_for_rib: description: - Period of waiting for the End-Of-RIB flag. The value is an integer ranging from 3 to 3000. The default value is 600. as_path_limit: description: - Maximum number of AS numbers in the AS_Path attribute. The default value is 255. check_first_as: description: - Check the first AS in the AS_Path of the update messages from EBGP peers. default: no_use choices: ['no_use','true','false'] confed_id_number: description: - Confederation ID. The value is a string of 1 to 11 characters. confed_nonstanded: description: - Configure the device to be compatible with devices in a nonstandard confederation. default: no_use choices: ['no_use','true','false'] bgp_rid_auto_sel: description: - The function to automatically select router IDs for all VPN BGP instances is enabled. default: no_use choices: ['no_use','true','false'] keep_all_routes: description: - If the value is true, the system stores all route update messages received from all peers (groups) after BGP connection setup. If the value is false, the system stores only BGP update messages that are received from peers and pass the configured import policy. default: no_use choices: ['no_use','true','false'] memory_limit: description: - Support BGP RIB memory protection. default: no_use choices: ['no_use','true','false'] gr_peer_reset: description: - Peer disconnection through GR. default: no_use choices: ['no_use','true','false'] is_shutdown: description: - Interrupt BGP all neighbor. default: no_use choices: ['no_use','true','false'] suppress_interval: description: - Suppress interval. hold_interval: description: - Hold interval. clear_interval: description: - Clear interval. confed_peer_as_num: description: - Confederation AS number, in two-byte or four-byte format. The value is a string of 1 to 11 characters. vrf_name: description: - Name of a BGP instance. The name is a case-sensitive string of characters. vrf_rid_auto_sel: description: - If the value is true, VPN BGP instances are enabled to automatically select router IDs. If the value is false, VPN BGP instances are disabled from automatically selecting router IDs. default: no_use choices: ['no_use','true','false'] router_id: description: - ID of a router that is in IPv4 address format. keepalive_time: description: - If the value of a timer changes, the BGP peer relationship between the routers is disconnected. The value is an integer ranging from 0 to 21845. The default value is 60. hold_time: description: - Hold time, in seconds. The value of the hold time can be 0 or range from 3 to 65535. min_hold_time: description: - Min hold time, in seconds. The value of the hold time can be 0 or range from 20 to 65535. conn_retry_time: description: - ConnectRetry interval. The value is an integer, in seconds. The default value is 32s. ebgp_if_sensitive: description: - If the value is true, After the fast EBGP interface awareness function is enabled, EBGP sessions on an interface are deleted immediately when the interface goes Down. If the value is false, After the fast EBGP interface awareness function is enabled, EBGP sessions on an interface are not deleted immediately when the interface goes Down. default: no_use choices: ['no_use','true','false'] default_af_type: description: - Type of a created address family, which can be IPv4 unicast or IPv6 unicast. The default type is IPv4 unicast. choices: ['ipv4uni','ipv6uni'] ''' EXAMPLES = ''' - name: CloudEngine BGP test hosts: cloudengine connection: local gather_facts: no vars: cli: host: "{{ inventory_hostname }}" port: "{{ ansible_ssh_port }}" username: "{{ username }}" password: "{{ password }}" transport: cli tasks: - name: "Enable BGP" ce_bgp: state: present as_number: 100 confed_id_number: 250 provider: "{{ cli }}" - name: "Disable BGP" ce_bgp: state: absent as_number: 100 confed_id_number: 250 provider: "{{ cli }}" - name: "Create confederation peer AS num" ce_bgp: state: present confed_peer_as_num: 260 provider: "{{ cli }}" ''' RETURN = ''' changed: description: check to see if a change was made on the device returned: always type: bool sample: true proposed: description: k/v pairs of parameters passed into module returned: always type: dict sample: {"as_number": "100", state": "present"} existing: description: k/v pairs of existing aaa server returned: always type: dict sample: {"bgp_enable": [["100"], ["true"]]} end_state: description: k/v pairs of aaa params after module execution returned: always type: dict sample: {"bgp_enable": [["100"], ["true"]]} updates: description: command sent to the device returned: always type: list sample: ["bgp 100"] ''' import re from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.general.plugins.module_utils.network.cloudengine.ce import get_nc_config, set_nc_config, ce_argument_spec SUCCESS = """success""" FAILED = """failed""" # get bgp enable CE_GET_BGP_ENABLE = """ """ CE_GET_BGP_ENABLE_HEADER = """ """ CE_GET_BGP_ENABLE_TAIL = """ """ # merge bgp enable CE_MERGE_BGP_ENABLE_HEADER = """ """ CE_MERGE_BGP_ENABLE_TAIL = """ """ # get bgp confederation peer as CE_GET_BGP_CONFED_PEER_AS = """ """ # merge bgp confederation peer as CE_MERGE_BGP_CONFED_PEER_AS = """ %s """ # create bgp confederation peer as CE_CREATE_BGP_CONFED_PEER_AS = """ %s """ # delete bgp confederation peer as CE_DELETE_BGP_CONFED_PEER_AS = """ %s """ # get bgp instance CE_GET_BGP_INSTANCE = """ """ # get bgp instance CE_GET_BGP_INSTANCE_HEADER = """ """ CE_GET_BGP_INSTANCE_TAIL = """ """ # merge bgp instance CE_MERGE_BGP_INSTANCE_HEADER = """ """ CE_MERGE_BGP_INSTANCE_TAIL = """ """ # create bgp instance CE_CREATE_BGP_INSTANCE_HEADER = """ """ CE_CREATE_BGP_INSTANCE_TAIL = """ """ # delete bgp instance CE_DELETE_BGP_INSTANCE_HEADER = """ """ CE_DELETE_BGP_INSTANCE_TAIL = """ """ def check_ip_addr(**kwargs): """ check_ip_addr """ ipaddr = kwargs["ipaddr"] addr = ipaddr.strip().split('.') if len(addr) != 4: return FAILED for i in range(4): addr[i] = int(addr[i]) if addr[i] <= 255 and addr[i] >= 0: pass else: return FAILED return SUCCESS def check_bgp_enable_args(**kwargs): """ check_bgp_enable_args """ module = kwargs["module"] need_cfg = False as_number = module.params['as_number'] if as_number: if len(as_number) > 11 or len(as_number) == 0: module.fail_json( msg='Error: The len of as_number %s is out of [1 - 11].' % as_number) else: need_cfg = True return need_cfg def check_bgp_confed_args(**kwargs): """ check_bgp_confed_args """ module = kwargs["module"] need_cfg = False confed_peer_as_num = module.params['confed_peer_as_num'] if confed_peer_as_num: if len(confed_peer_as_num) > 11 or len(confed_peer_as_num) == 0: module.fail_json( msg='Error: The len of confed_peer_as_num %s is out of [1 - 11].' % confed_peer_as_num) else: need_cfg = True return need_cfg class Bgp(object): """ Manages BGP configuration """ def netconf_get_config(self, **kwargs): """ netconf_get_config """ module = kwargs["module"] conf_str = kwargs["conf_str"] xml_str = get_nc_config(module, conf_str) return xml_str def netconf_set_config(self, **kwargs): """ netconf_set_config """ module = kwargs["module"] conf_str = kwargs["conf_str"] xml_str = set_nc_config(module, conf_str) return xml_str def check_bgp_enable_other_args(self, **kwargs): """ check_bgp_enable_other_args """ module = kwargs["module"] state = module.params['state'] result = dict() need_cfg = False graceful_restart = module.params['graceful_restart'] if graceful_restart != 'no_use': conf_str = CE_GET_BGP_ENABLE_HEADER + \ "" + CE_GET_BGP_ENABLE_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["graceful_restart"] = re_find if re_find[0] != graceful_restart: need_cfg = True else: need_cfg = True time_wait_for_rib = module.params['time_wait_for_rib'] if time_wait_for_rib: if int(time_wait_for_rib) > 3000 or int(time_wait_for_rib) < 3: module.fail_json( msg='Error: The time_wait_for_rib %s is out of [3 - 3000].' % time_wait_for_rib) else: conf_str = CE_GET_BGP_ENABLE_HEADER + \ "" + CE_GET_BGP_ENABLE_TAIL recv_xml = self.netconf_get_config( module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["time_wait_for_rib"] = re_find if re_find[0] != time_wait_for_rib: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["time_wait_for_rib"] = re_find if re_find[0] == time_wait_for_rib: need_cfg = True as_path_limit = module.params['as_path_limit'] if as_path_limit: if int(as_path_limit) > 2000 or int(as_path_limit) < 1: module.fail_json( msg='Error: The as_path_limit %s is out of [1 - 2000].' % as_path_limit) else: conf_str = CE_GET_BGP_ENABLE_HEADER + \ "" + CE_GET_BGP_ENABLE_TAIL recv_xml = self.netconf_get_config( module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["as_path_limit"] = re_find if re_find[0] != as_path_limit: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["as_path_limit"] = re_find if re_find[0] == as_path_limit: need_cfg = True check_first_as = module.params['check_first_as'] if check_first_as != 'no_use': conf_str = CE_GET_BGP_ENABLE_HEADER + \ "" + CE_GET_BGP_ENABLE_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["check_first_as"] = re_find if re_find[0] != check_first_as: need_cfg = True else: need_cfg = True confed_id_number = module.params['confed_id_number'] if confed_id_number: if len(confed_id_number) > 11 or len(confed_id_number) == 0: module.fail_json( msg='Error: The len of confed_id_number %s is out of [1 - 11].' % confed_id_number) else: conf_str = CE_GET_BGP_ENABLE_HEADER + \ "" + CE_GET_BGP_ENABLE_TAIL recv_xml = self.netconf_get_config( module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["confed_id_number"] = re_find if re_find[0] != confed_id_number: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["confed_id_number"] = re_find if re_find[0] == confed_id_number: need_cfg = True confed_nonstanded = module.params['confed_nonstanded'] if confed_nonstanded != 'no_use': conf_str = CE_GET_BGP_ENABLE_HEADER + \ "" + CE_GET_BGP_ENABLE_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["confed_nonstanded"] = re_find if re_find[0] != confed_nonstanded: need_cfg = True else: need_cfg = True bgp_rid_auto_sel = module.params['bgp_rid_auto_sel'] if bgp_rid_auto_sel != 'no_use': conf_str = CE_GET_BGP_ENABLE_HEADER + \ "" + CE_GET_BGP_ENABLE_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["bgp_rid_auto_sel"] = re_find if re_find[0] != bgp_rid_auto_sel: need_cfg = True else: need_cfg = True keep_all_routes = module.params['keep_all_routes'] if keep_all_routes != 'no_use': conf_str = CE_GET_BGP_ENABLE_HEADER + \ "" + CE_GET_BGP_ENABLE_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["keep_all_routes"] = re_find if re_find[0] != keep_all_routes: need_cfg = True else: need_cfg = True memory_limit = module.params['memory_limit'] if memory_limit != 'no_use': conf_str = CE_GET_BGP_ENABLE_HEADER + \ "" + CE_GET_BGP_ENABLE_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["memory_limit"] = re_find if re_find[0] != memory_limit: need_cfg = True else: need_cfg = True gr_peer_reset = module.params['gr_peer_reset'] if gr_peer_reset != 'no_use': conf_str = CE_GET_BGP_ENABLE_HEADER + \ "" + CE_GET_BGP_ENABLE_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["gr_peer_reset"] = re_find if re_find[0] != gr_peer_reset: need_cfg = True else: need_cfg = True is_shutdown = module.params['is_shutdown'] if is_shutdown != 'no_use': conf_str = CE_GET_BGP_ENABLE_HEADER + \ "" + CE_GET_BGP_ENABLE_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["is_shutdown"] = re_find if re_find[0] != is_shutdown: need_cfg = True else: need_cfg = True suppress_interval = module.params['suppress_interval'] hold_interval = module.params['hold_interval'] clear_interval = module.params['clear_interval'] if suppress_interval: if not hold_interval or not clear_interval: module.fail_json( msg='Error: Please input suppress_interval hold_interval clear_interval at the same time.') if int(suppress_interval) > 65535 or int(suppress_interval) < 1: module.fail_json( msg='Error: The suppress_interval %s is out of [1 - 65535].' % suppress_interval) else: conf_str = CE_GET_BGP_ENABLE_HEADER + \ "" + CE_GET_BGP_ENABLE_TAIL recv_xml = self.netconf_get_config( module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["suppress_interval"] = re_find if re_find[0] != suppress_interval: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["suppress_interval"] = re_find if re_find[0] == suppress_interval: need_cfg = True if hold_interval: if not suppress_interval or not clear_interval: module.fail_json( msg='Error: Please input suppress_interval hold_interval clear_interval at the same time.') if int(hold_interval) > 65535 or int(hold_interval) < 1: module.fail_json( msg='Error: The hold_interval %s is out of [1 - 65535].' % hold_interval) else: conf_str = CE_GET_BGP_ENABLE_HEADER + \ "" + CE_GET_BGP_ENABLE_TAIL recv_xml = self.netconf_get_config( module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["hold_interval"] = re_find if re_find[0] != hold_interval: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["hold_interval"] = re_find if re_find[0] == hold_interval: need_cfg = True if clear_interval: if not suppress_interval or not hold_interval: module.fail_json( msg='Error: Please input suppress_interval hold_interval clear_interval at the same time.') if int(clear_interval) > 65535 or int(clear_interval) < 1: module.fail_json( msg='Error: The clear_interval %s is out of [1 - 65535].' % clear_interval) else: conf_str = CE_GET_BGP_ENABLE_HEADER + \ "" + CE_GET_BGP_ENABLE_TAIL recv_xml = self.netconf_get_config( module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["clear_interval"] = re_find if re_find[0] != clear_interval: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["clear_interval"] = re_find if re_find[0] == clear_interval: need_cfg = True result["need_cfg"] = need_cfg return result def check_bgp_instance_args(self, **kwargs): """ check_bgp_instance_args """ module = kwargs["module"] state = module.params['state'] need_cfg = False vrf_name = module.params['vrf_name'] if vrf_name: if len(vrf_name) > 31 or len(vrf_name) == 0: module.fail_json( msg='the len of vrf_name %s is out of [1 - 31].' % vrf_name) conf_str = CE_GET_BGP_INSTANCE_HEADER + \ "" + CE_GET_BGP_INSTANCE_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) check_vrf_name = vrf_name if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: if check_vrf_name not in re_find: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: if check_vrf_name in re_find: need_cfg = True return need_cfg def check_bgp_instance_other_args(self, **kwargs): """ check_bgp_instance_other_args """ module = kwargs["module"] state = module.params['state'] result = dict() need_cfg = False vrf_name = module.params['vrf_name'] router_id = module.params['router_id'] if router_id: if not vrf_name: module.fail_json( msg='Error: Please input vrf_name.') if check_ip_addr(ipaddr=router_id) == FAILED: module.fail_json( msg='Error: The router_id %s is invalid.' % router_id) conf_str = CE_GET_BGP_INSTANCE_HEADER + "%s" % vrf_name + \ "" + CE_GET_BGP_INSTANCE_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["router_id"] = re_find if re_find[0] != router_id: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["router_id"] = re_find if re_find[0] == router_id: need_cfg = True vrf_rid_auto_sel = module.params['vrf_rid_auto_sel'] if vrf_rid_auto_sel != 'no_use': if not vrf_name: module.fail_json( msg='Error: Please input vrf_name.') conf_str = CE_GET_BGP_INSTANCE_HEADER + "%s" % vrf_name + \ "" + CE_GET_BGP_INSTANCE_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["vrf_rid_auto_sel"] = re_find if re_find[0] != vrf_rid_auto_sel: need_cfg = True else: need_cfg = True keepalive_time = module.params['keepalive_time'] if keepalive_time: if not vrf_name: module.fail_json( msg='Error: Please input vrf_name.') if int(keepalive_time) > 21845 or int(keepalive_time) < 0: module.fail_json( msg='keepalive_time %s is out of [0 - 21845].' % keepalive_time) else: conf_str = CE_GET_BGP_INSTANCE_HEADER + "%s" % vrf_name + \ "" + CE_GET_BGP_INSTANCE_TAIL recv_xml = self.netconf_get_config( module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["keepalive_time"] = re_find if re_find[0] != keepalive_time: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["keepalive_time"] = re_find if re_find[0] == keepalive_time: need_cfg = True hold_time = module.params['hold_time'] if hold_time: if not vrf_name: module.fail_json( msg='Error: Please input vrf_name.') if int(hold_time) > 65535 or int(hold_time) < 3: module.fail_json( msg='hold_time %s is out of [3 - 65535].' % hold_time) else: conf_str = CE_GET_BGP_INSTANCE_HEADER + "%s" % vrf_name + \ "" + CE_GET_BGP_INSTANCE_TAIL recv_xml = self.netconf_get_config( module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["hold_time"] = re_find if re_find[0] != hold_time: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["hold_time"] = re_find if re_find[0] == hold_time: need_cfg = True min_hold_time = module.params['min_hold_time'] if min_hold_time: if not vrf_name: module.fail_json( msg='Error: Please input vrf_name.') if int(min_hold_time) != 0 and (int(min_hold_time) > 65535 or int(min_hold_time) < 20): module.fail_json( msg='min_hold_time %s is out of [0, or 20 - 65535].' % min_hold_time) else: conf_str = CE_GET_BGP_INSTANCE_HEADER + "%s" % vrf_name + \ "" + CE_GET_BGP_INSTANCE_TAIL recv_xml = self.netconf_get_config( module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["min_hold_time"] = re_find if re_find[0] != min_hold_time: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["min_hold_time"] = re_find if re_find[0] == min_hold_time: need_cfg = True conn_retry_time = module.params['conn_retry_time'] if conn_retry_time: if not vrf_name: module.fail_json( msg='Error: Please input vrf_name.') if int(conn_retry_time) > 65535 or int(conn_retry_time) < 1: module.fail_json( msg='conn_retry_time %s is out of [1 - 65535].' % conn_retry_time) else: conf_str = CE_GET_BGP_INSTANCE_HEADER + "%s" % vrf_name + \ "" + CE_GET_BGP_INSTANCE_TAIL recv_xml = self.netconf_get_config( module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["conn_retry_time"] = re_find if re_find[0] != conn_retry_time: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["conn_retry_time"] = re_find if re_find[0] == conn_retry_time: need_cfg = True else: pass ebgp_if_sensitive = module.params['ebgp_if_sensitive'] if ebgp_if_sensitive != 'no_use': if not vrf_name: module.fail_json( msg='Error: Please input vrf_name.') conf_str = CE_GET_BGP_INSTANCE_HEADER + "%s" % vrf_name + \ "" + CE_GET_BGP_INSTANCE_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["ebgp_if_sensitive"] = re_find if re_find[0] != ebgp_if_sensitive: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["ebgp_if_sensitive"] = re_find if re_find[0] == ebgp_if_sensitive: need_cfg = True else: pass default_af_type = module.params['default_af_type'] if default_af_type: if not vrf_name: module.fail_json( msg='Error: Please input vrf_name.') conf_str = CE_GET_BGP_INSTANCE_HEADER + "%s" % vrf_name + \ "" + CE_GET_BGP_INSTANCE_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["default_af_type"] = re_find if re_find[0] != default_af_type: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["default_af_type"] = re_find if re_find[0] == default_af_type: need_cfg = True else: pass result["need_cfg"] = need_cfg return result def get_bgp_enable(self, **kwargs): """ get_bgp_enable """ module = kwargs["module"] conf_str = CE_GET_BGP_ENABLE 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*(.*).*', xml_str) if re_find: return re_find else: return result def merge_bgp_enable(self, **kwargs): """ merge_bgp_enable """ module = kwargs["module"] conf_str = CE_MERGE_BGP_ENABLE_HEADER state = module.params['state'] if state == "present": conf_str += "true" else: conf_str += "false" as_number = module.params['as_number'] if as_number: conf_str += "%s" % as_number conf_str += CE_MERGE_BGP_ENABLE_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Merge bgp enable failed.') cmds = [] if state == "present": cmd = "bgp %s" % as_number else: cmd = "undo bgp %s" % as_number cmds.append(cmd) return cmds def merge_bgp_enable_other(self, **kwargs): """ merge_bgp_enable_other """ module = kwargs["module"] conf_str = CE_MERGE_BGP_ENABLE_HEADER cmds = [] graceful_restart = module.params['graceful_restart'] if graceful_restart != 'no_use': conf_str += "%s" % graceful_restart if graceful_restart == "true": cmd = "graceful-restart" else: cmd = "undo graceful-restart" cmds.append(cmd) time_wait_for_rib = module.params['time_wait_for_rib'] if time_wait_for_rib: conf_str += "%s" % time_wait_for_rib cmd = "graceful-restart timer wait-for-rib %s" % time_wait_for_rib cmds.append(cmd) as_path_limit = module.params['as_path_limit'] if as_path_limit: conf_str += "%s" % as_path_limit cmd = "as-path-limit %s" % as_path_limit cmds.append(cmd) check_first_as = module.params['check_first_as'] if check_first_as != 'no_use': conf_str += "%s" % check_first_as if check_first_as == "true": cmd = "check-first-as" else: cmd = "undo check-first-as" cmds.append(cmd) confed_id_number = module.params['confed_id_number'] if confed_id_number: conf_str += "%s" % confed_id_number cmd = "confederation id %s" % confed_id_number cmds.append(cmd) confed_nonstanded = module.params['confed_nonstanded'] if confed_nonstanded != 'no_use': conf_str += "%s" % confed_nonstanded if confed_nonstanded == "true": cmd = "confederation nonstandard" else: cmd = "undo confederation nonstandard" cmds.append(cmd) bgp_rid_auto_sel = module.params['bgp_rid_auto_sel'] if bgp_rid_auto_sel != 'no_use': conf_str += "%s" % bgp_rid_auto_sel if bgp_rid_auto_sel == "true": cmd = "router-id vpn-instance auto-select" else: cmd = "undo router-id" cmds.append(cmd) keep_all_routes = module.params['keep_all_routes'] if keep_all_routes != 'no_use': conf_str += "%s" % keep_all_routes if keep_all_routes == "true": cmd = "keep-all-routes" else: cmd = "undo keep-all-routes" cmds.append(cmd) memory_limit = module.params['memory_limit'] if memory_limit != 'no_use': conf_str += "%s" % memory_limit if memory_limit == "true": cmd = "prefix memory-limit" else: cmd = "undo prefix memory-limit" cmds.append(cmd) gr_peer_reset = module.params['gr_peer_reset'] if gr_peer_reset != 'no_use': conf_str += "%s" % gr_peer_reset if gr_peer_reset == "true": cmd = "graceful-restart peer-reset" else: cmd = "undo graceful-restart peer-reset" cmds.append(cmd) is_shutdown = module.params['is_shutdown'] if is_shutdown != 'no_use': conf_str += "%s" % is_shutdown if is_shutdown == "true": cmd = "shutdown" else: cmd = "undo shutdown" cmds.append(cmd) suppress_interval = module.params['suppress_interval'] hold_interval = module.params['hold_interval'] clear_interval = module.params['clear_interval'] if suppress_interval: conf_str += "%s" % suppress_interval cmd = "nexthop recursive-lookup restrain suppress-interval %s hold-interval %s " \ "clear-interval %s" % (suppress_interval, hold_interval, clear_interval) cmds.append(cmd) if hold_interval: conf_str += "%s" % hold_interval if clear_interval: conf_str += "%s" % clear_interval conf_str += CE_MERGE_BGP_ENABLE_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Merge bgp enable failed.') return cmds def delete_bgp_enable_other(self, **kwargs): """ delete bgp enable other args """ module = kwargs["module"] conf_str = CE_MERGE_BGP_ENABLE_HEADER cmds = [] graceful_restart = module.params['graceful_restart'] if graceful_restart != 'no_use': conf_str += "%s" % graceful_restart if graceful_restart == "true": cmd = "graceful-restart" else: cmd = "undo graceful-restart" cmds.append(cmd) time_wait_for_rib = module.params['time_wait_for_rib'] if time_wait_for_rib: conf_str += "600" cmd = "undo graceful-restart timer wait-for-rib" cmds.append(cmd) as_path_limit = module.params['as_path_limit'] if as_path_limit: conf_str += "255" cmd = "undo as-path-limit" cmds.append(cmd) check_first_as = module.params['check_first_as'] if check_first_as != 'no_use': conf_str += "%s" % check_first_as if check_first_as == "true": cmd = "check-first-as" else: cmd = "undo check-first-as" cmds.append(cmd) confed_id_number = module.params['confed_id_number'] confed_peer_as_num = module.params['confed_peer_as_num'] if confed_id_number and not confed_peer_as_num: conf_str += "" cmd = "undo confederation id" cmds.append(cmd) confed_nonstanded = module.params['confed_nonstanded'] if confed_nonstanded != 'no_use': conf_str += "%s" % confed_nonstanded if confed_nonstanded == "true": cmd = "confederation nonstandard" else: cmd = "undo confederation nonstandard" cmds.append(cmd) bgp_rid_auto_sel = module.params['bgp_rid_auto_sel'] if bgp_rid_auto_sel != 'no_use': conf_str += "%s" % bgp_rid_auto_sel if bgp_rid_auto_sel == "true": cmd = "router-id vpn-instance auto-select" else: cmd = "undo router-id" cmds.append(cmd) keep_all_routes = module.params['keep_all_routes'] if keep_all_routes != 'no_use': conf_str += "%s" % keep_all_routes if keep_all_routes == "true": cmd = "keep-all-routes" else: cmd = "undo keep-all-routes" cmds.append(cmd) memory_limit = module.params['memory_limit'] if memory_limit != 'no_use': conf_str += "%s" % memory_limit if memory_limit == "true": cmd = "prefix memory-limit" else: cmd = "undo prefix memory-limit" cmds.append(cmd) gr_peer_reset = module.params['gr_peer_reset'] if gr_peer_reset != 'no_use': conf_str += "%s" % gr_peer_reset if gr_peer_reset == "true": cmd = "graceful-restart peer-reset" else: cmd = "undo graceful-restart peer-reset" cmds.append(cmd) is_shutdown = module.params['is_shutdown'] if is_shutdown != 'no_use': conf_str += "%s" % is_shutdown if is_shutdown == "true": cmd = "shutdown" else: cmd = "undo shutdown" cmds.append(cmd) suppress_interval = module.params['suppress_interval'] hold_interval = module.params['hold_interval'] clear_interval = module.params['clear_interval'] if suppress_interval: conf_str += "60" cmd = "undo nexthop recursive-lookup restrain suppress-interval hold-interval clear-interval" cmds.append(cmd) if hold_interval: conf_str += "120" if clear_interval: conf_str += "600" conf_str += CE_MERGE_BGP_ENABLE_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Delete bgp enable failed.') return cmds def get_bgp_confed_peer_as(self, **kwargs): """ get_bgp_confed_peer_as """ module = kwargs["module"] conf_str = CE_GET_BGP_CONFED_PEER_AS 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'.*(.*).*', xml_str) if re_find: return re_find else: return result def merge_bgp_confed_peer_as(self, **kwargs): """ merge_bgp_confed_peer_as """ module = kwargs["module"] confed_peer_as_num = module.params['confed_peer_as_num'] conf_str = CE_MERGE_BGP_CONFED_PEER_AS % confed_peer_as_num recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Merge bgp confed peer as failed.') cmds = [] cmd = "confederation peer-as %s" % confed_peer_as_num cmds.append(cmd) return cmds def create_bgp_confed_peer_as(self, **kwargs): """ create_bgp_confed_peer_as """ module = kwargs["module"] confed_peer_as_num = module.params['confed_peer_as_num'] conf_str = CE_CREATE_BGP_CONFED_PEER_AS % confed_peer_as_num recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Create bgp confed peer as failed.') cmds = [] cmd = "confederation peer-as %s" % confed_peer_as_num cmds.append(cmd) return cmds def delete_bgp_confed_peer_as(self, **kwargs): """ delete_bgp_confed_peer_as """ module = kwargs["module"] confed_peer_as_num = module.params['confed_peer_as_num'] conf_str = CE_DELETE_BGP_CONFED_PEER_AS % confed_peer_as_num recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Delete bgp confed peer as failed.') cmds = [] cmd = "undo confederation peer-as %s" % confed_peer_as_num cmds.append(cmd) return cmds def get_bgp_instance(self, **kwargs): """ get_bgp_instance """ module = kwargs["module"] conf_str = CE_GET_BGP_INSTANCE 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'.*(.*).*', xml_str) if re_find: return re_find else: return result def merge_bgp_instance(self, **kwargs): """ merge_bgp_instance """ module = kwargs["module"] conf_str = CE_MERGE_BGP_INSTANCE_HEADER vrf_name = module.params['vrf_name'] conf_str += "%s" % vrf_name conf_str += CE_MERGE_BGP_INSTANCE_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Merge bgp instance failed.') cmds = [] if vrf_name != "_public_": cmd = "ipv4-family vpn-instance %s" % vrf_name cmds.append(cmd) return cmds def create_bgp_instance(self, **kwargs): """ create_bgp_instance """ module = kwargs["module"] conf_str = CE_CREATE_BGP_INSTANCE_HEADER cmds = [] vrf_name = module.params['vrf_name'] if vrf_name: if vrf_name == "_public_": return cmds conf_str += "%s" % vrf_name conf_str += CE_CREATE_BGP_INSTANCE_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Create bgp instance failed.') if vrf_name != "_public_": cmd = "ipv4-family vpn-instance %s" % vrf_name cmds.append(cmd) return cmds def delete_bgp_instance(self, **kwargs): """ delete_bgp_instance """ module = kwargs["module"] conf_str = CE_DELETE_BGP_INSTANCE_HEADER vrf_name = module.params['vrf_name'] if vrf_name: conf_str += "%s" % vrf_name conf_str += CE_DELETE_BGP_INSTANCE_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Delete bgp instance failed.') cmds = [] if vrf_name != "_public_": cmd = "undo ipv4-family vpn-instance %s" % vrf_name cmds.append(cmd) return cmds def merge_bgp_instance_other(self, **kwargs): """ merge_bgp_instance_other """ module = kwargs["module"] conf_str = CE_MERGE_BGP_INSTANCE_HEADER vrf_name = module.params['vrf_name'] conf_str += "%s" % vrf_name cmds = [] default_af_type = module.params['default_af_type'] if default_af_type: conf_str += "%s" % default_af_type if vrf_name != "_public_": if default_af_type == "ipv6uni": cmd = "ipv6-family vpn-instance %s" % vrf_name cmds.append(cmd) vrf_rid_auto_sel = module.params['vrf_rid_auto_sel'] if vrf_rid_auto_sel != 'no_use': conf_str += "%s" % vrf_rid_auto_sel if vrf_rid_auto_sel == "true": cmd = "router-id auto-select" else: cmd = "undo router-id auto-select" cmds.append(cmd) router_id = module.params['router_id'] if router_id: conf_str += "%s" % router_id cmd = "router-id %s" % router_id cmds.append(cmd) keepalive_time = module.params['keepalive_time'] if keepalive_time: conf_str += "%s" % keepalive_time cmd = "timer keepalive %s" % keepalive_time cmds.append(cmd) hold_time = module.params['hold_time'] if hold_time: conf_str += "%s" % hold_time cmd = "timer hold %s" % hold_time cmds.append(cmd) min_hold_time = module.params['min_hold_time'] if min_hold_time: conf_str += "%s" % min_hold_time cmd = "timer min-holdtime %s" % min_hold_time cmds.append(cmd) conn_retry_time = module.params['conn_retry_time'] if conn_retry_time: conf_str += "%s" % conn_retry_time cmd = "timer connect-retry %s" % conn_retry_time cmds.append(cmd) ebgp_if_sensitive = module.params['ebgp_if_sensitive'] if ebgp_if_sensitive != 'no_use': conf_str += "%s" % ebgp_if_sensitive if ebgp_if_sensitive == "true": cmd = "ebgp-interface-sensitive" else: cmd = "undo ebgp-interface-sensitive" cmds.append(cmd) conf_str += CE_MERGE_BGP_INSTANCE_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Merge bgp instance other failed.') return cmds def delete_bgp_instance_other_comm(self, **kwargs): """ delete_bgp_instance_other_comm """ module = kwargs["module"] conf_str = CE_DELETE_BGP_INSTANCE_HEADER vrf_name = module.params['vrf_name'] conf_str += "%s" % vrf_name cmds = [] router_id = module.params['router_id'] if router_id: conf_str += "%s" % router_id cmd = "undo router-id" cmds.append(cmd) vrf_rid_auto_sel = module.params['vrf_rid_auto_sel'] if vrf_rid_auto_sel != 'no_use': conf_str += "%s" % vrf_rid_auto_sel cmd = "undo router-id vpn-instance auto-select" cmds.append(cmd) keepalive_time = module.params['keepalive_time'] if keepalive_time: conf_str += "%s" % keepalive_time cmd = "undo timer keepalive" cmds.append(cmd) hold_time = module.params['hold_time'] if hold_time: conf_str += "%s" % hold_time cmd = "undo timer hold" cmds.append(cmd) min_hold_time = module.params['min_hold_time'] if min_hold_time: conf_str += "%s" % min_hold_time cmd = "undo timer min-holdtime" cmds.append(cmd) conn_retry_time = module.params['conn_retry_time'] if conn_retry_time: conf_str += "%s" % conn_retry_time cmd = "undo timer connect-retry" cmds.append(cmd) ebgp_if_sensitive = module.params['ebgp_if_sensitive'] if ebgp_if_sensitive != 'no_use': conf_str += "%s" % ebgp_if_sensitive cmd = "undo ebgp-interface-sensitive" cmds.append(cmd) default_af_type = module.params['default_af_type'] if default_af_type: conf_str += "%s" % default_af_type if vrf_name != "_public_": if default_af_type == "ipv6uni": cmd = "undo ipv6-family vpn-instance %s" % vrf_name cmds.append(cmd) else: cmd = "undo ipv4-family vpn-instance %s" % vrf_name cmds.append(cmd) else: if vrf_name != "_public_": cmd = "undo ipv4-family vpn-instance %s" % vrf_name cmds.append(cmd) conf_str += CE_DELETE_BGP_INSTANCE_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json( msg='Error: Delete common vpn bgp instance other args failed.') return cmds def delete_instance_other_public(self, **kwargs): """ delete_instance_other_public """ module = kwargs["module"] conf_str = CE_MERGE_BGP_INSTANCE_HEADER vrf_name = module.params['vrf_name'] conf_str += "%s" % vrf_name cmds = [] router_id = module.params['router_id'] if router_id: conf_str += "" cmd = "undo router-id" cmds.append(cmd) vrf_rid_auto_sel = module.params['vrf_rid_auto_sel'] if vrf_rid_auto_sel != 'no_use': conf_str += "%s" % "false" cmd = "undo router-id vpn-instance auto-select" cmds.append(cmd) keepalive_time = module.params['keepalive_time'] if keepalive_time: conf_str += "%s" % "60" cmd = "undo timer keepalive" cmds.append(cmd) hold_time = module.params['hold_time'] if hold_time: conf_str += "%s" % "180" cmd = "undo timer hold" cmds.append(cmd) min_hold_time = module.params['min_hold_time'] if min_hold_time: conf_str += "%s" % "0" cmd = "undo timer min-holdtime" cmds.append(cmd) conn_retry_time = module.params['conn_retry_time'] if conn_retry_time: conf_str += "%s" % "32" cmd = "undo timer connect-retry" cmds.append(cmd) ebgp_if_sensitive = module.params['ebgp_if_sensitive'] if ebgp_if_sensitive != 'no_use': conf_str += "%s" % "true" cmd = "ebgp-interface-sensitive" cmds.append(cmd) default_af_type = module.params['default_af_type'] if default_af_type: conf_str += "%s" % "ipv4uni" if vrf_name != "_public_": if default_af_type == "ipv6uni": cmd = "undo ipv6-family vpn-instance %s" % vrf_name cmds.append(cmd) else: cmd = "undo ipv4-family vpn-instance %s" % vrf_name cmds.append(cmd) else: if vrf_name != "_public_": cmd = "undo ipv4-family vpn-instance %s" % vrf_name cmds.append(cmd) conf_str += CE_MERGE_BGP_INSTANCE_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json( msg='Error: Delete default vpn bgp instance other args failed.') return cmds def main(): """ main """ argument_spec = dict( state=dict(choices=['present', 'absent'], default='present'), as_number=dict(type='str'), graceful_restart=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), time_wait_for_rib=dict(type='str'), as_path_limit=dict(type='str'), check_first_as=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), confed_id_number=dict(type='str'), confed_nonstanded=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), bgp_rid_auto_sel=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), keep_all_routes=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), memory_limit=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), gr_peer_reset=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), is_shutdown=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), suppress_interval=dict(type='str'), hold_interval=dict(type='str'), clear_interval=dict(type='str'), confed_peer_as_num=dict(type='str'), vrf_name=dict(type='str'), vrf_rid_auto_sel=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), router_id=dict(type='str'), keepalive_time=dict(type='str'), hold_time=dict(type='str'), min_hold_time=dict(type='str'), conn_retry_time=dict(type='str'), ebgp_if_sensitive=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), default_af_type=dict(type='str', choices=['ipv4uni', 'ipv6uni']) ) argument_spec.update(ce_argument_spec) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) changed = False proposed = dict() existing = dict() end_state = dict() updates = [] state = module.params['state'] as_number = module.params['as_number'] graceful_restart = module.params['graceful_restart'] time_wait_for_rib = module.params['time_wait_for_rib'] as_path_limit = module.params['as_path_limit'] check_first_as = module.params['check_first_as'] confed_id_number = module.params['confed_id_number'] confed_nonstanded = module.params['confed_nonstanded'] bgp_rid_auto_sel = module.params['bgp_rid_auto_sel'] keep_all_routes = module.params['keep_all_routes'] memory_limit = module.params['memory_limit'] gr_peer_reset = module.params['gr_peer_reset'] is_shutdown = module.params['is_shutdown'] suppress_interval = module.params['suppress_interval'] hold_interval = module.params['hold_interval'] clear_interval = module.params['clear_interval'] confed_peer_as_num = module.params['confed_peer_as_num'] router_id = module.params['router_id'] vrf_name = module.params['vrf_name'] vrf_rid_auto_sel = module.params['vrf_rid_auto_sel'] keepalive_time = module.params['keepalive_time'] hold_time = module.params['hold_time'] min_hold_time = module.params['min_hold_time'] conn_retry_time = module.params['conn_retry_time'] ebgp_if_sensitive = module.params['ebgp_if_sensitive'] default_af_type = module.params['default_af_type'] ce_bgp_obj = Bgp() if not ce_bgp_obj: module.fail_json(msg='Error: Init module failed.') # get proposed proposed["state"] = state if as_number: proposed["as_number"] = as_number if graceful_restart != 'no_use': proposed["graceful_restart"] = graceful_restart if time_wait_for_rib: proposed["time_wait_for_rib"] = time_wait_for_rib if as_path_limit: proposed["as_path_limit"] = as_path_limit if check_first_as != 'no_use': proposed["check_first_as"] = check_first_as if confed_id_number: proposed["confed_id_number"] = confed_id_number if confed_nonstanded != 'no_use': proposed["confed_nonstanded"] = confed_nonstanded if bgp_rid_auto_sel != 'no_use': proposed["bgp_rid_auto_sel"] = bgp_rid_auto_sel if keep_all_routes != 'no_use': proposed["keep_all_routes"] = keep_all_routes if memory_limit != 'no_use': proposed["memory_limit"] = memory_limit if gr_peer_reset != 'no_use': proposed["gr_peer_reset"] = gr_peer_reset if is_shutdown != 'no_use': proposed["is_shutdown"] = is_shutdown if suppress_interval: proposed["suppress_interval"] = suppress_interval if hold_interval: proposed["hold_interval"] = hold_interval if clear_interval: proposed["clear_interval"] = clear_interval if confed_peer_as_num: proposed["confed_peer_as_num"] = confed_peer_as_num if router_id: proposed["router_id"] = router_id if vrf_name: proposed["vrf_name"] = vrf_name if vrf_rid_auto_sel != 'no_use': proposed["vrf_rid_auto_sel"] = vrf_rid_auto_sel if keepalive_time: proposed["keepalive_time"] = keepalive_time if hold_time: proposed["hold_time"] = hold_time if min_hold_time: proposed["min_hold_time"] = min_hold_time if conn_retry_time: proposed["conn_retry_time"] = conn_retry_time if ebgp_if_sensitive != 'no_use': proposed["ebgp_if_sensitive"] = ebgp_if_sensitive if default_af_type: proposed["default_af_type"] = default_af_type need_bgp_enable = check_bgp_enable_args(module=module) need_bgp_enable_other_rst = ce_bgp_obj.check_bgp_enable_other_args( module=module) need_bgp_confed = check_bgp_confed_args(module=module) need_bgp_instance = ce_bgp_obj.check_bgp_instance_args(module=module) need_bgp_instance_other_rst = ce_bgp_obj.check_bgp_instance_other_args( module=module) router_id_exist = ce_bgp_obj.get_bgp_instance(module=module) existing["bgp instance"] = router_id_exist # bgp enable/disable if need_bgp_enable: bgp_enable_exist = ce_bgp_obj.get_bgp_enable(module=module) existing["bgp enable"] = bgp_enable_exist if bgp_enable_exist: asnumber_exist = bgp_enable_exist[0][1] bgpenable_exist = bgp_enable_exist[0][0] else: asnumber_exist = None bgpenable_exist = None if state == "present": bgp_enable_new = ("true", as_number) if bgp_enable_new in bgp_enable_exist: pass elif bgpenable_exist == "true" and asnumber_exist != as_number: module.fail_json( msg='Error: BGP is already running. The AS is %s.' % asnumber_exist) else: cmd = ce_bgp_obj.merge_bgp_enable(module=module) changed = True for item in cmd: updates.append(item) else: if need_bgp_enable_other_rst["need_cfg"] or need_bgp_confed or \ need_bgp_instance_other_rst["need_cfg"] or need_bgp_instance: pass elif bgpenable_exist == "false": pass elif bgpenable_exist == "true" and asnumber_exist == as_number: cmd = ce_bgp_obj.merge_bgp_enable(module=module) changed = True for item in cmd: updates.append(item) else: module.fail_json( msg='Error: BGP is already running. The AS is %s.' % asnumber_exist) bgp_enable_end = ce_bgp_obj.get_bgp_enable(module=module) end_state["bgp enable"] = bgp_enable_end # bgp enable/disable other args exist_tmp = dict() for item in need_bgp_enable_other_rst: if item != "need_cfg": exist_tmp[item] = need_bgp_enable_other_rst[item] if exist_tmp: existing["bgp enable other"] = exist_tmp if need_bgp_enable_other_rst["need_cfg"]: if state == "present": cmd = ce_bgp_obj.merge_bgp_enable_other(module=module) changed = True for item in cmd: updates.append(item) else: cmd = ce_bgp_obj.delete_bgp_enable_other(module=module) changed = True for item in cmd: updates.append(item) need_bgp_enable_other_rst = ce_bgp_obj.check_bgp_enable_other_args( module=module) end_tmp = dict() for item in need_bgp_enable_other_rst: if item != "need_cfg": end_tmp[item] = need_bgp_enable_other_rst[item] if end_tmp: end_state["bgp enable other"] = end_tmp # bgp confederation peer as if need_bgp_confed: confed_exist = ce_bgp_obj.get_bgp_confed_peer_as(module=module) existing["confederation peer as"] = confed_exist confed_new = (confed_peer_as_num) if state == "present": if len(confed_exist) == 0: cmd = ce_bgp_obj.create_bgp_confed_peer_as(module=module) changed = True for item in cmd: updates.append(item) elif confed_new not in confed_exist: cmd = ce_bgp_obj.merge_bgp_confed_peer_as(module=module) changed = True for item in cmd: updates.append(item) else: if len(confed_exist) == 0: pass elif confed_new not in confed_exist: pass else: cmd = ce_bgp_obj.delete_bgp_confed_peer_as(module=module) changed = True for item in cmd: updates.append(item) confed_end = ce_bgp_obj.get_bgp_confed_peer_as(module=module) end_state["confederation peer as"] = confed_end # bgp instance if need_bgp_instance and default_af_type != "ipv6uni": router_id_new = vrf_name if state == "present": if len(router_id_exist) == 0: cmd = ce_bgp_obj.create_bgp_instance(module=module) changed = True updates.extend(cmd) elif router_id_new not in router_id_exist: cmd = ce_bgp_obj.merge_bgp_instance(module=module) changed = True updates.extend(cmd) else: if not need_bgp_instance_other_rst["need_cfg"]: if vrf_name != "_public_": if len(router_id_exist) == 0: pass elif router_id_new not in router_id_exist: pass else: cmd = ce_bgp_obj.delete_bgp_instance(module=module) changed = True for item in cmd: updates.append(item) # bgp instance other exist_tmp = dict() for item in need_bgp_instance_other_rst: if item != "need_cfg": exist_tmp[item] = need_bgp_instance_other_rst[item] if exist_tmp: existing["bgp instance other"] = exist_tmp if need_bgp_instance_other_rst["need_cfg"]: if state == "present": cmd = ce_bgp_obj.merge_bgp_instance_other(module=module) changed = True for item in cmd: updates.append(item) else: if vrf_name == "_public_": cmd = ce_bgp_obj.delete_instance_other_public( module=module) changed = True for item in cmd: updates.append(item) else: cmd = ce_bgp_obj.delete_bgp_instance_other_comm(module=module) changed = True for item in cmd: updates.append(item) need_bgp_instance_other_rst = ce_bgp_obj.check_bgp_instance_other_args( module=module) router_id_end = ce_bgp_obj.get_bgp_instance(module=module) end_state["bgp instance"] = router_id_end end_tmp = dict() for item in need_bgp_instance_other_rst: if item != "need_cfg": end_tmp[item] = need_bgp_instance_other_rst[item] if end_tmp: end_state["bgp instance other"] = end_tmp if end_state == existing: changed = False updates = list() results = dict() results['proposed'] = proposed results['existing'] = existing results['changed'] = changed results['end_state'] = end_state results['updates'] = updates module.exit_json(**results) if __name__ == '__main__': main()