diff options
Diffstat (limited to 'lib/ansible/modules/network/cloudengine/ce_bgp_neighbor.py')
-rw-r--r-- | lib/ansible/modules/network/cloudengine/ce_bgp_neighbor.py | 2052 |
1 files changed, 0 insertions, 2052 deletions
diff --git a/lib/ansible/modules/network/cloudengine/ce_bgp_neighbor.py b/lib/ansible/modules/network/cloudengine/ce_bgp_neighbor.py deleted file mode 100644 index 8df16c60be..0000000000 --- a/lib/ansible/modules/network/cloudengine/ce_bgp_neighbor.py +++ /dev/null @@ -1,2052 +0,0 @@ -#!/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 <http://www.gnu.org/licenses/>. -# - -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_neighbor -version_added: "2.4" -short_description: Manages BGP peer configuration on HUAWEI CloudEngine switches. -description: - - Manages BGP peer 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'] - vrf_name: - description: - - Name of a BGP instance. The name is a case-sensitive string of characters. - The BGP instance can be used only after the corresponding VPN instance is created. - required: true - peer_addr: - description: - - Connection address of a peer, which can be an IPv4 or IPv6 address. - required: true - remote_as: - description: - - AS number of a peer. - The value is a string of 1 to 11 characters. - required: true - description: - description: - - Description of a peer, which can be letters or digits. - The value is a string of 1 to 80 characters. - fake_as: - description: - - Fake AS number that is specified for a local peer. - The value is a string of 1 to 11 characters. - dual_as: - description: - - If the value is true, the EBGP peer can use either a fake AS number or the actual AS number. - If the value is false, the EBGP peer can only use a fake AS number. - choices: ['no_use','true','false'] - default: no_use - conventional: - description: - - If the value is true, the router has all extended capabilities. - If the value is false, the router does not have all extended capabilities. - choices: ['no_use','true','false'] - default: no_use - route_refresh: - description: - - If the value is true, BGP is enabled to advertise REFRESH packets. - If the value is false, the route refresh function is enabled. - choices: ['no_use','true','false'] - default: no_use - is_ignore: - description: - - If the value is true, the session with a specified peer is torn down and all related - routing entries are cleared. - If the value is false, the session with a specified peer is retained. - choices: ['no_use','true','false'] - default: no_use - local_if_name: - description: - - Name of a source interface that sends BGP packets. - The value is a string of 1 to 63 characters. - ebgp_max_hop: - description: - - Maximum number of hops in an indirect EBGP connection. - The value is an ranging from 1 to 255. - valid_ttl_hops: - description: - - Enable GTSM on a peer or peer group. - The valid-TTL-Value parameter is used to specify the number of TTL hops to be detected. - The value is an integer ranging from 1 to 255. - connect_mode: - description: - - The value can be Connect-only, Listen-only, or Both. - is_log_change: - description: - - If the value is true, BGP is enabled to record peer session status and event information. - If the value is false, BGP is disabled from recording peer session status and event information. - choices: ['no_use','true','false'] - default: no_use - pswd_type: - description: - - Enable BGP peers to establish a TCP connection and perform the Message Digest 5 (MD5) - authentication for BGP messages. - choices: ['null','cipher','simple'] - pswd_cipher_text: - description: - - The character string in a password identifies the contents of the password, spaces not supported. - The value is a string of 1 to 255 characters. - keep_alive_time: - description: - - Specify the Keepalive time of a peer or peer group. - The value is an integer ranging from 0 to 21845. The default value is 60. - hold_time: - description: - - Specify the Hold time of a peer or peer group. - The value is 0 or an integer ranging from 3 to 65535. - min_hold_time: - description: - - Specify the Min hold time of a peer or peer group. - key_chain_name: - description: - - Specify the Keychain authentication name used when BGP peers establish a TCP connection. - The value is a string of 1 to 47 case-insensitive characters. - conn_retry_time: - description: - - ConnectRetry interval. - The value is an integer ranging from 1 to 65535. - tcp_MSS: - description: - - Maximum TCP MSS value used for TCP connection establishment for a peer. - The value is an integer ranging from 176 to 4096. - mpls_local_ifnet_disable: - description: - - If the value is true, peer create MPLS Local IFNET disable. - If the value is false, peer create MPLS Local IFNET enable. - choices: ['no_use','true','false'] - default: no_use - prepend_global_as: - description: - - Add the global AS number to the Update packets to be advertised. - choices: ['no_use','true','false'] - default: no_use - prepend_fake_as: - description: - - Add the Fake AS number to received Update packets. - choices: ['no_use','true','false'] - default: no_use - is_bfd_block: - description: - - If the value is true, peers are enabled to inherit the BFD function from the peer group. - If the value is false, peers are disabled to inherit the BFD function from the peer group. - choices: ['no_use','true','false'] - default: no_use - multiplier: - description: - - Specify the detection multiplier. The default value is 3. - The value is an integer ranging from 3 to 50. - is_bfd_enable: - description: - - If the value is true, BFD is enabled. - If the value is false, BFD is disabled. - choices: ['no_use','true','false'] - default: no_use - rx_interval: - description: - - Specify the minimum interval at which BFD packets are received. - The value is an integer ranging from 50 to 1000, in milliseconds. - tx_interval: - description: - - Specify the minimum interval at which BFD packets are sent. - The value is an integer ranging from 50 to 1000, in milliseconds. - is_single_hop: - description: - - If the value is true, the system is enabled to preferentially use the single-hop mode for - BFD session setup between IBGP peers. - If the value is false, the system is disabled from preferentially using the single-hop - mode for BFD session setup between IBGP peers. - choices: ['no_use','true','false'] - default: no_use -''' - -EXAMPLES = ''' - -- name: CloudEngine BGP neighbor 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: "Config bgp peer" - ce_bgp_neighbor: - state: present - vrf_name: js - peer_addr: 192.168.10.10 - remote_as: 500 - provider: "{{ cli }}" - - - name: "Config bgp route id" - ce_bgp_neighbor: - state: absent - vrf_name: js - peer_addr: 192.168.10.10 - 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: {"peer_addr": "192.168.10.10", "remote_as": "500", "state": "present", "vrf_name": "js"} -existing: - description: k/v pairs of existing aaa server - returned: always - type: dict - sample: {"bgp peer": []} -end_state: - description: k/v pairs of aaa params after module execution - returned: always - type: dict - sample: {"bgp peer": [["192.168.10.10", "500"]]} -updates: - description: command sent to the device - returned: always - type: list - sample: ["peer 192.168.10.10 as-number 500"] -''' - -import re -from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.network.cloudengine.ce import get_nc_config, set_nc_config, ce_argument_spec, check_ip_addr - - -# get bgp peer -CE_GET_BGP_PEER_HEADER = """ - <filter type="subtree"> - <bgp xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0"> - <bgpcomm> - <bgpVrfs> - <bgpVrf> - <vrfName>%s</vrfName> - <bgpPeers> - <bgpPeer> - <peerAddr>%s</peerAddr> -""" -CE_GET_BGP_PEER_TAIL = """ - </bgpPeer> - </bgpPeers> - </bgpVrf> - </bgpVrfs> - </bgpcomm> - </bgp> - </filter> -""" - -# merge bgp peer -CE_MERGE_BGP_PEER_HEADER = """ - <config> - <bgp xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0"> - <bgpcomm> - <bgpVrfs> - <bgpVrf> - <vrfName>%s</vrfName> - <bgpPeers> - <bgpPeer operation="merge"> - <peerAddr>%s</peerAddr> -""" -CE_MERGE_BGP_PEER_TAIL = """ - </bgpPeer> - </bgpPeers> - </bgpVrf> - </bgpVrfs> - </bgpcomm> - </bgp> - </config> -""" - -# create bgp peer -CE_CREATE_BGP_PEER_HEADER = """ - <config> - <bgp xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0"> - <bgpcomm> - <bgpVrfs> - <bgpVrf> - <vrfName>%s</vrfName> - <bgpPeers> - <bgpPeer operation="create"> - <peerAddr>%s</peerAddr> -""" -CE_CREATE_BGP_PEER_TAIL = """ - </bgpPeer> - </bgpPeers> - </bgpVrf> - </bgpVrfs> - </bgpcomm> - </bgp> - </config> -""" - -# delete bgp peer -CE_DELETE_BGP_PEER_HEADER = """ - <config> - <bgp xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0"> - <bgpcomm> - <bgpVrfs> - <bgpVrf> - <vrfName>%s</vrfName> - <bgpPeers> - <bgpPeer operation="delete"> - <peerAddr>%s</peerAddr> -""" -CE_DELETE_BGP_PEER_TAIL = """ - </bgpPeer> - </bgpPeers> - </bgpVrf> - </bgpVrfs> - </bgpcomm> - </bgp> - </config> -""" - -# get peer bfd -CE_GET_PEER_BFD_HEADER = """ - <filter type="subtree"> - <bgp xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0"> - <bgpcomm> - <bgpVrfs> - <bgpVrf> - <vrfName>%s</vrfName> - <bgpPeers> - <bgpPeer> - <peerAddr>%s</peerAddr> - <peerBfd> -""" -CE_GET_PEER_BFD_TAIL = """ - </peerBfd> - </bgpPeer> - </bgpPeers> - </bgpVrf> - </bgpVrfs> - </bgpcomm> - </bgp> - </filter> -""" - -# merge peer bfd -CE_MERGE_PEER_BFD_HEADER = """ - <config> - <bgp xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0"> - <bgpcomm> - <bgpVrfs> - <bgpVrf> - <vrfName>%s</vrfName> - <bgpPeers> - <bgpPeer> - <peerAddr>%s</peerAddr> - <peerBfd operation="merge"> -""" -CE_MERGE_PEER_BFD_TAIL = """ - </peerBfd> - </bgpPeer> - </bgpPeers> - </bgpVrf> - </bgpVrfs> - </bgpcomm> - </bgp> - </config> -""" - -# delete peer bfd -CE_DELETE_PEER_BFD_HEADER = """ - <config> - <bgp xmlns="http://www.huawei.com/netconf/vrp" content-version="1.0" format-version="1.0"> - <bgpcomm> - <bgpVrfs> - <bgpVrf> - <vrfName>%s</vrfName> - <bgpPeers> - <bgpPeer> - <peerAddr>%s</peerAddr> - <peerBfd operation="delete"> -""" -CE_DELETE_PEER_BFD_TAIL = """ - </peerBfd> - </bgpPeer> - </bgpPeers> - </bgpVrf> - </bgpVrfs> - </bgpcomm> - </bgp> - </config> -""" - - -class BgpNeighbor(object): - """ Manages BGP peer 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_peer_args(self, **kwargs): - """ check_bgp_peer_args """ - - module = kwargs["module"] - result = dict() - 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='Error: The len of vrf_name %s is out of [1 - 31].' % vrf_name) - - peer_addr = module.params['peer_addr'] - if peer_addr: - if not check_ip_addr(ipaddr=peer_addr): - module.fail_json( - msg='Error: The peer_addr %s is invalid.' % peer_addr) - - need_cfg = True - - remote_as = module.params['remote_as'] - if remote_as: - if len(remote_as) > 11 or len(remote_as) < 1: - module.fail_json( - msg='Error: The len of remote_as %s is out of [1 - 11].' % remote_as) - - need_cfg = True - - result["need_cfg"] = need_cfg - return result - - def check_bgp_peer_other_args(self, **kwargs): - """ check_bgp_peer_other_args """ - - module = kwargs["module"] - result = dict() - need_cfg = False - - peerip = module.params['peer_addr'] - vrf_name = module.params['vrf_name'] - if vrf_name: - if len(vrf_name) > 31 or len(vrf_name) == 0: - module.fail_json( - msg='Error: The len of vrf_name %s is out of [1 - 31].' % vrf_name) - - description = module.params['description'] - if description: - if len(description) > 80 or len(description) < 1: - module.fail_json( - msg='Error: The len of description %s is out of [1 - 80].' % description) - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<description></description>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<description>(.*)</description>.*', recv_xml) - - if re_find: - result["description"] = re_find - if re_find[0] != description: - need_cfg = True - else: - need_cfg = True - - fake_as = module.params['fake_as'] - if fake_as: - if len(fake_as) > 11 or len(fake_as) < 1: - module.fail_json( - msg='Error: The len of fake_as %s is out of [1 - 11].' % fake_as) - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<fakeAs></fakeAs>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<fakeAs>(.*)</fakeAs>.*', recv_xml) - - if re_find: - result["fake_as"] = re_find - if re_find[0] != fake_as: - need_cfg = True - else: - need_cfg = True - - dual_as = module.params['dual_as'] - if dual_as != 'no_use': - if not fake_as: - module.fail_json(msg='fake_as must exist.') - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<dualAs></dualAs>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<dualAs>(.*)</dualAs>.*', recv_xml) - - if re_find: - result["dual_as"] = re_find - if re_find[0] != dual_as: - need_cfg = True - else: - need_cfg = True - - conventional = module.params['conventional'] - if conventional != 'no_use': - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<conventional></conventional>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<conventional>(.*)</conventional>.*', recv_xml) - - if re_find: - result["conventional"] = re_find - if re_find[0] != conventional: - need_cfg = True - else: - need_cfg = True - - route_refresh = module.params['route_refresh'] - if route_refresh != 'no_use': - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<routeRefresh></routeRefresh>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<routeRefresh>(.*)</routeRefresh>.*', recv_xml) - - if re_find: - result["route_refresh"] = re_find - if re_find[0] != route_refresh: - need_cfg = True - else: - need_cfg = True - - four_byte_as = module.params['four_byte_as'] - if four_byte_as != 'no_use': - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<fourByteAs></fourByteAs>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<fourByteAs>(.*)</fourByteAs>.*', recv_xml) - - if re_find: - result["four_byte_as"] = re_find - if re_find[0] != four_byte_as: - need_cfg = True - else: - need_cfg = True - - is_ignore = module.params['is_ignore'] - if is_ignore != 'no_use': - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<isIgnore></isIgnore>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<isIgnore>(.*)</isIgnore>.*', recv_xml) - - if re_find: - result["is_ignore"] = re_find - if re_find[0] != is_ignore: - need_cfg = True - else: - need_cfg = True - - local_if_name = module.params['local_if_name'] - if local_if_name: - if len(local_if_name) > 63 or len(local_if_name) < 1: - module.fail_json( - msg='Error: The len of local_if_name %s is out of [1 - 63].' % local_if_name) - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<localIfName></localIfName>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<localIfName>(.*)</localIfName>.*', recv_xml) - - if re_find: - result["local_if_name"] = re_find - if re_find[0].lower() != local_if_name.lower(): - need_cfg = True - else: - need_cfg = True - - ebgp_max_hop = module.params['ebgp_max_hop'] - if ebgp_max_hop: - if int(ebgp_max_hop) > 255 or int(ebgp_max_hop) < 1: - module.fail_json( - msg='Error: The value of ebgp_max_hop %s is out of [1 - 255].' % ebgp_max_hop) - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<ebgpMaxHop></ebgpMaxHop>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<ebgpMaxHop>(.*)</ebgpMaxHop>.*', recv_xml) - - if re_find: - result["ebgp_max_hop"] = re_find - if re_find[0] != ebgp_max_hop: - need_cfg = True - else: - need_cfg = True - - valid_ttl_hops = module.params['valid_ttl_hops'] - if valid_ttl_hops: - if int(valid_ttl_hops) > 255 or int(valid_ttl_hops) < 1: - module.fail_json( - msg='Error: The value of valid_ttl_hops %s is out of [1 - 255].' % valid_ttl_hops) - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<validTtlHops></validTtlHops>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<validTtlHops>(.*)</validTtlHops>.*', recv_xml) - - if re_find: - result["valid_ttl_hops"] = re_find - if re_find[0] != valid_ttl_hops: - need_cfg = True - else: - need_cfg = True - - connect_mode = module.params['connect_mode'] - if connect_mode: - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<connectMode></connectMode>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<connectMode>(.*)</connectMode>.*', recv_xml) - - if re_find: - result["connect_mode"] = re_find - if re_find[0] != connect_mode: - need_cfg = True - else: - need_cfg = True - - is_log_change = module.params['is_log_change'] - if is_log_change != 'no_use': - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<isLogChange></isLogChange>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<isLogChange>(.*)</isLogChange>.*', recv_xml) - - if re_find: - result["is_log_change"] = re_find - if re_find[0] != is_log_change: - need_cfg = True - else: - need_cfg = True - - pswd_type = module.params['pswd_type'] - if pswd_type: - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<pswdType></pswdType>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<pswdType>(.*)</pswdType>.*', recv_xml) - - if re_find: - result["pswd_type"] = re_find - if re_find[0] != pswd_type: - need_cfg = True - else: - need_cfg = True - - pswd_cipher_text = module.params['pswd_cipher_text'] - if pswd_cipher_text: - if len(pswd_cipher_text) > 255 or len(pswd_cipher_text) < 1: - module.fail_json( - msg='Error: The len of pswd_cipher_text %s is out of [1 - 255].' % pswd_cipher_text) - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<pswdCipherText></pswdCipherText>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<pswdCipherText>(.*)</pswdCipherText>.*', recv_xml) - - if re_find: - result["pswd_cipher_text"] = re_find - if re_find[0] != pswd_cipher_text: - need_cfg = True - else: - need_cfg = True - - keep_alive_time = module.params['keep_alive_time'] - if keep_alive_time: - if int(keep_alive_time) > 21845 or len(keep_alive_time) < 0: - module.fail_json( - msg='Error: The len of keep_alive_time %s is out of [0 - 21845].' % keep_alive_time) - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<keepAliveTime></keepAliveTime>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<keepAliveTime>(.*)</keepAliveTime>.*', recv_xml) - - if re_find: - result["keep_alive_time"] = re_find - if re_find[0] != keep_alive_time: - need_cfg = True - else: - need_cfg = True - - hold_time = module.params['hold_time'] - if hold_time: - if int(hold_time) != 0 and (int(hold_time) > 65535 or int(hold_time) < 3): - module.fail_json( - msg='Error: The value of hold_time %s is out of [0 or 3 - 65535].' % hold_time) - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<holdTime></holdTime>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<holdTime>(.*)</holdTime>.*', recv_xml) - - if re_find: - result["hold_time"] = re_find - if re_find[0] != hold_time: - need_cfg = True - else: - need_cfg = True - - min_hold_time = module.params['min_hold_time'] - if min_hold_time: - if int(min_hold_time) != 0 and (int(min_hold_time) > 65535 or int(min_hold_time) < 20): - module.fail_json( - msg='Error: The value of min_hold_time %s is out of [0 or 20 - 65535].' % min_hold_time) - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<minHoldTime></minHoldTime>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<minHoldTime>(.*)</minHoldTime>.*', 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 - - key_chain_name = module.params['key_chain_name'] - if key_chain_name: - if len(key_chain_name) > 47 or len(key_chain_name) < 1: - module.fail_json( - msg='Error: The len of key_chain_name %s is out of [1 - 47].' % key_chain_name) - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<keyChainName></keyChainName>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<keyChainName>(.*)</keyChainName>.*', recv_xml) - - if re_find: - result["key_chain_name"] = re_find - if re_find[0] != key_chain_name: - need_cfg = True - else: - need_cfg = True - - conn_retry_time = module.params['conn_retry_time'] - if conn_retry_time: - if int(conn_retry_time) > 65535 or int(conn_retry_time) < 1: - module.fail_json( - msg='Error: The value of conn_retry_time %s is out of [1 - 65535].' % conn_retry_time) - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<connRetryTime></connRetryTime>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<connRetryTime>(.*)</connRetryTime>.*', 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 - - tcp_mss = module.params['tcp_MSS'] - if tcp_mss: - if int(tcp_mss) > 4096 or int(tcp_mss) < 176: - module.fail_json( - msg='Error: The value of tcp_mss %s is out of [176 - 4096].' % tcp_mss) - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<tcpMSS></tcpMSS>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<tcpMSS>(.*)</tcpMSS>.*', recv_xml) - - if re_find: - result["tcp_MSS"] = re_find - if re_find[0] != tcp_mss: - need_cfg = True - else: - need_cfg = True - - mpls_local_ifnet_disable = module.params['mpls_local_ifnet_disable'] - if mpls_local_ifnet_disable != 'no_use': - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<mplsLocalIfnetDisable></mplsLocalIfnetDisable>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<mplsLocalIfnetDisable>(.*)</mplsLocalIfnetDisable>.*', recv_xml) - - if re_find: - result["mpls_local_ifnet_disable"] = re_find - if re_find[0] != mpls_local_ifnet_disable: - need_cfg = True - else: - need_cfg = True - - prepend_global_as = module.params['prepend_global_as'] - if prepend_global_as != 'no_use': - if not fake_as: - module.fail_json(msg='fake_as must exist.') - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<prependGlobalAs></prependGlobalAs>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<prependGlobalAs>(.*)</prependGlobalAs>.*', recv_xml) - - if re_find: - result["prepend_global_as"] = re_find - if re_find[0] != prepend_global_as: - need_cfg = True - else: - need_cfg = True - - prepend_fake_as = module.params['prepend_fake_as'] - if prepend_fake_as != 'no_use': - if not fake_as: - module.fail_json(msg='fake_as must exist.') - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<prependFakeAs></prependFakeAs>" + CE_GET_BGP_PEER_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<prependFakeAs>(.*)</prependFakeAs>.*', recv_xml) - - if re_find: - result["prepend_fake_as"] = re_find - if re_find[0] != prepend_fake_as: - need_cfg = True - else: - need_cfg = True - - result["need_cfg"] = need_cfg - return result - - def check_peer_bfd_merge_args(self, **kwargs): - """ check_peer_bfd_merge_args """ - - module = kwargs["module"] - result = dict() - need_cfg = False - - state = module.params['state'] - if state == "absent": - result["need_cfg"] = need_cfg - return result - - vrf_name = module.params['vrf_name'] - if vrf_name: - if len(vrf_name) > 31 or len(vrf_name) == 0: - module.fail_json( - msg='Error: The len of vrf_name %s is out of [1 - 31].' % vrf_name) - - peer_addr = module.params['peer_addr'] - - is_bfd_block = module.params['is_bfd_block'] - if is_bfd_block != 'no_use': - - conf_str = CE_GET_PEER_BFD_HEADER % ( - vrf_name, peer_addr) + "<isBfdBlock></isBfdBlock>" + CE_GET_PEER_BFD_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<isBfdBlock>(.*)</isBfdBlock>.*', recv_xml) - - if re_find: - result["is_bfd_block"] = re_find - if re_find[0] != is_bfd_block: - need_cfg = True - else: - need_cfg = True - - multiplier = module.params['multiplier'] - if multiplier: - if int(multiplier) > 50 or int(multiplier) < 3: - module.fail_json( - msg='Error: The value of multiplier %s is out of [3 - 50].' % multiplier) - - conf_str = CE_GET_PEER_BFD_HEADER % ( - vrf_name, peer_addr) + "<multiplier></multiplier>" + CE_GET_PEER_BFD_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<multiplier>(.*)</multiplier>.*', recv_xml) - - if re_find: - result["multiplier"] = re_find - if re_find[0] != multiplier: - need_cfg = True - else: - need_cfg = True - - is_bfd_enable = module.params['is_bfd_enable'] - if is_bfd_enable != 'no_use': - - conf_str = CE_GET_PEER_BFD_HEADER % ( - vrf_name, peer_addr) + "<isBfdEnable></isBfdEnable>" + CE_GET_PEER_BFD_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<isBfdEnable>(.*)</isBfdEnable>.*', recv_xml) - - if re_find: - result["is_bfd_enable"] = re_find - if re_find[0] != is_bfd_enable: - need_cfg = True - else: - need_cfg = True - - rx_interval = module.params['rx_interval'] - if rx_interval: - if int(rx_interval) > 1000 or int(rx_interval) < 50: - module.fail_json( - msg='Error: The value of rx_interval %s is out of [50 - 1000].' % rx_interval) - - conf_str = CE_GET_PEER_BFD_HEADER % ( - vrf_name, peer_addr) + "<rxInterval></rxInterval>" + CE_GET_PEER_BFD_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<rxInterval>(.*)</rxInterval>.*', recv_xml) - - if re_find: - result["rx_interval"] = re_find - if re_find[0] != rx_interval: - need_cfg = True - else: - need_cfg = True - - tx_interval = module.params['tx_interval'] - if tx_interval: - if int(tx_interval) > 1000 or int(tx_interval) < 50: - module.fail_json( - msg='Error: The value of tx_interval %s is out of [50 - 1000].' % tx_interval) - - conf_str = CE_GET_PEER_BFD_HEADER % ( - vrf_name, peer_addr) + "<txInterval></txInterval>" + CE_GET_PEER_BFD_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<txInterval>(.*)</txInterval>.*', recv_xml) - - if re_find: - result["tx_interval"] = re_find - if re_find[0] != tx_interval: - need_cfg = True - else: - need_cfg = True - - is_single_hop = module.params['is_single_hop'] - if is_single_hop != 'no_use': - - conf_str = CE_GET_PEER_BFD_HEADER % ( - vrf_name, peer_addr) + "<isSingleHop></isSingleHop>" + CE_GET_PEER_BFD_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - need_cfg = True - else: - re_find = re.findall( - r'.*<isSingleHop>(.*)</isSingleHop>.*', recv_xml) - - if re_find: - result["is_single_hop"] = re_find - if re_find[0] != is_single_hop: - need_cfg = True - else: - need_cfg = True - - result["need_cfg"] = need_cfg - return result - - def check_peer_bfd_delete_args(self, **kwargs): - """ check_peer_bfd_delete_args """ - - module = kwargs["module"] - result = dict() - need_cfg = False - - state = module.params['state'] - if state == "present": - result["need_cfg"] = need_cfg - return result - - vrf_name = module.params['vrf_name'] - if vrf_name: - if len(vrf_name) > 31 or len(vrf_name) == 0: - module.fail_json( - msg='Error: The len of vrf_name %s is out of [1 - 31].' % vrf_name) - - peer_addr = module.params['peer_addr'] - - is_bfd_block = module.params['is_bfd_block'] - if is_bfd_block != 'no_use': - - conf_str = CE_GET_PEER_BFD_HEADER % ( - vrf_name, peer_addr) + "<isBfdBlock></isBfdBlock>" + CE_GET_PEER_BFD_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - pass - else: - re_find = re.findall( - r'.*<isBfdBlock>(.*)</isBfdBlock>.*', recv_xml) - - if re_find: - result["is_bfd_block"] = re_find - if re_find[0] == is_bfd_block: - need_cfg = True - - multiplier = module.params['multiplier'] - if multiplier: - if int(multiplier) > 50 or int(multiplier) < 3: - module.fail_json( - msg='Error: The value of multiplier %s is out of [3 - 50].' % multiplier) - - conf_str = CE_GET_PEER_BFD_HEADER % ( - vrf_name, peer_addr) + "<multiplier></multiplier>" + CE_GET_PEER_BFD_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - pass - else: - re_find = re.findall( - r'.*<multiplier>(.*)</multiplier>.*', recv_xml) - - if re_find: - result["multiplier"] = re_find - if re_find[0] == multiplier: - need_cfg = True - - is_bfd_enable = module.params['is_bfd_enable'] - if is_bfd_enable != 'no_use': - - conf_str = CE_GET_PEER_BFD_HEADER % ( - vrf_name, peer_addr) + "<isBfdEnable></isBfdEnable>" + CE_GET_PEER_BFD_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - pass - else: - re_find = re.findall( - r'.*<isBfdEnable>(.*)</isBfdEnable>.*', recv_xml) - - if re_find: - result["is_bfd_enable"] = re_find - if re_find[0] == is_bfd_enable: - need_cfg = True - - rx_interval = module.params['rx_interval'] - if rx_interval: - if int(rx_interval) > 1000 or int(rx_interval) < 50: - module.fail_json( - msg='Error: The value of rx_interval %s is out of [50 - 1000].' % rx_interval) - - conf_str = CE_GET_PEER_BFD_HEADER % ( - vrf_name, peer_addr) + "<rxInterval></rxInterval>" + CE_GET_PEER_BFD_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - pass - else: - re_find = re.findall( - r'.*<rxInterval>(.*)</rxInterval>.*', recv_xml) - - if re_find: - result["rx_interval"] = re_find - if re_find[0] == rx_interval: - need_cfg = True - - tx_interval = module.params['tx_interval'] - if tx_interval: - if int(tx_interval) > 1000 or int(tx_interval) < 50: - module.fail_json( - msg='Error: The value of tx_interval %s is out of [50 - 1000].' % tx_interval) - - conf_str = CE_GET_PEER_BFD_HEADER % ( - vrf_name, peer_addr) + "<txInterval></txInterval>" + CE_GET_PEER_BFD_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - pass - else: - re_find = re.findall( - r'.*<txInterval>(.*)</txInterval>.*', recv_xml) - - if re_find: - result["tx_interval"] = re_find - if re_find[0] == tx_interval: - need_cfg = True - - is_single_hop = module.params['is_single_hop'] - if is_single_hop != 'no_use': - - conf_str = CE_GET_PEER_BFD_HEADER % ( - vrf_name, peer_addr) + "<isSingleHop></isSingleHop>" + CE_GET_PEER_BFD_TAIL - recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) - - if "<data/>" in recv_xml: - pass - else: - re_find = re.findall( - r'.*<isSingleHop>(.*)</isSingleHop>.*', recv_xml) - - if re_find: - result["is_single_hop"] = re_find - if re_find[0] == is_single_hop: - need_cfg = True - - result["need_cfg"] = need_cfg - return result - - def get_bgp_peer(self, **kwargs): - """ get_bgp_peer """ - - module = kwargs["module"] - peerip = module.params['peer_addr'] - vrf_name = module.params['vrf_name'] - if vrf_name: - if len(vrf_name) > 31 or len(vrf_name) == 0: - module.fail_json( - msg='Error: The len of vrf_name %s is out of [1 - 31].' % vrf_name) - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + \ - "<remoteAs></remoteAs>" + CE_GET_BGP_PEER_TAIL - - xml_str = self.netconf_get_config(module=module, conf_str=conf_str) - - result = list() - - if "<data/>" in xml_str: - return result - else: - re_find = re.findall( - r'.*<peerAddr>(.*)</peerAddr>.*\s.*<remoteAs>(.*)</remoteAs>.*', xml_str) - - if re_find: - return re_find - else: - return result - - def get_bgp_del_peer(self, **kwargs): - """ get_bgp_del_peer """ - - module = kwargs["module"] - peerip = module.params['peer_addr'] - vrf_name = module.params['vrf_name'] - if vrf_name: - if len(vrf_name) > 31 or len(vrf_name) == 0: - module.fail_json( - msg='Error: The len of vrf_name %s is out of [1 - 31].' % vrf_name) - - conf_str = CE_GET_BGP_PEER_HEADER % (vrf_name, peerip) + CE_GET_BGP_PEER_TAIL - - xml_str = self.netconf_get_config(module=module, conf_str=conf_str) - - result = list() - - if "<data/>" in xml_str: - return result - else: - re_find = re.findall( - r'.*<peerAddr>(.*)</peerAddr>.*', xml_str) - - if re_find: - return re_find - else: - return result - - def merge_bgp_peer(self, **kwargs): - """ merge_bgp_peer """ - - module = kwargs["module"] - vrf_name = module.params['vrf_name'] - peer_addr = module.params['peer_addr'] - remote_as = module.params['remote_as'] - - conf_str = CE_MERGE_BGP_PEER_HEADER % ( - vrf_name, peer_addr) + "<remoteAs>%s</remoteAs>" % remote_as + CE_MERGE_BGP_PEER_TAIL - - recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) - - if "<ok/>" not in recv_xml: - module.fail_json(msg='Error: Merge bgp peer failed.') - - cmds = [] - cmd = "peer %s as-number %s" % (peer_addr, remote_as) - cmds.append(cmd) - - return cmds - - def create_bgp_peer(self, **kwargs): - """ create_bgp_peer """ - - module = kwargs["module"] - - vrf_name = module.params['vrf_name'] - - peer_addr = module.params['peer_addr'] - remote_as = module.params['remote_as'] - - conf_str = CE_CREATE_BGP_PEER_HEADER % ( - vrf_name, peer_addr) + "<remoteAs>%s</remoteAs>" % remote_as + CE_CREATE_BGP_PEER_TAIL - - recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) - - if "<ok/>" not in recv_xml: - module.fail_json(msg='Error: Create bgp peer failed.') - - cmds = [] - cmd = "peer %s as-number %s" % (peer_addr, remote_as) - cmds.append(cmd) - - return cmds - - def delete_bgp_peer(self, **kwargs): - """ delete_bgp_peer """ - - module = kwargs["module"] - vrf_name = module.params['vrf_name'] - peer_addr = module.params['peer_addr'] - - conf_str = CE_DELETE_BGP_PEER_HEADER % ( - vrf_name, peer_addr) + CE_DELETE_BGP_PEER_TAIL - - recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) - - if "<ok/>" not in recv_xml: - module.fail_json(msg='Error: Delete bgp peer failed.') - - cmds = [] - cmd = "undo peer %s" % peer_addr - cmds.append(cmd) - - return cmds - - def merge_bgp_peer_other(self, **kwargs): - """ merge_bgp_peer """ - - module = kwargs["module"] - vrf_name = module.params['vrf_name'] - peer_addr = module.params['peer_addr'] - - conf_str = CE_MERGE_BGP_PEER_HEADER % (vrf_name, peer_addr) - - cmds = [] - - description = module.params['description'] - if description: - conf_str += "<description>%s</description>" % description - - cmd = "peer %s description %s" % (peer_addr, description) - cmds.append(cmd) - - fake_as = module.params['fake_as'] - if fake_as: - conf_str += "<fakeAs>%s</fakeAs>" % fake_as - - cmd = "peer %s local-as %s" % (peer_addr, fake_as) - cmds.append(cmd) - - dual_as = module.params['dual_as'] - if dual_as != 'no_use': - conf_str += "<dualAs>%s</dualAs>" % dual_as - - if dual_as == "true": - cmd = "peer %s local-as %s dual-as" % (peer_addr, fake_as) - else: - cmd = "peer %s local-as %s" % (peer_addr, fake_as) - cmds.append(cmd) - - conventional = module.params['conventional'] - if conventional != 'no_use': - conf_str += "<conventional>%s</conventional>" % conventional - if conventional == "true": - cmd = "peer %s capability-advertise conventional" % peer_addr - else: - cmd = "undo peer %s capability-advertise conventional" % peer_addr - cmds.append(cmd) - - route_refresh = module.params['route_refresh'] - if route_refresh != 'no_use': - conf_str += "<routeRefresh>%s</routeRefresh>" % route_refresh - - if route_refresh == "true": - cmd = "peer %s capability-advertise route-refresh" % peer_addr - else: - cmd = "undo peer %s capability-advertise route-refresh" % peer_addr - cmds.append(cmd) - - four_byte_as = module.params['four_byte_as'] - if four_byte_as != 'no_use': - conf_str += "<fourByteAs>%s</fourByteAs>" % four_byte_as - - if four_byte_as == "true": - cmd = "peer %s capability-advertise 4-byte-as" % peer_addr - else: - cmd = "undo peer %s capability-advertise 4-byte-as" % peer_addr - cmds.append(cmd) - - is_ignore = module.params['is_ignore'] - if is_ignore != 'no_use': - conf_str += "<isIgnore>%s</isIgnore>" % is_ignore - - if is_ignore == "true": - cmd = "peer %s ignore" % peer_addr - else: - cmd = "undo peer %s ignore" % peer_addr - cmds.append(cmd) - - local_if_name = module.params['local_if_name'] - if local_if_name: - conf_str += "<localIfName>%s</localIfName>" % local_if_name - - cmd = "peer %s connect-interface %s" % (peer_addr, local_if_name) - cmds.append(cmd) - - ebgp_max_hop = module.params['ebgp_max_hop'] - if ebgp_max_hop: - conf_str += "<ebgpMaxHop>%s</ebgpMaxHop>" % ebgp_max_hop - - cmd = "peer %s ebgp-max-hop %s" % (peer_addr, ebgp_max_hop) - cmds.append(cmd) - - valid_ttl_hops = module.params['valid_ttl_hops'] - if valid_ttl_hops: - conf_str += "<validTtlHops>%s</validTtlHops>" % valid_ttl_hops - - cmd = "peer %s valid-ttl-hops %s" % (peer_addr, valid_ttl_hops) - cmds.append(cmd) - - connect_mode = module.params['connect_mode'] - if connect_mode: - - if connect_mode == "listenOnly": - cmd = "peer %s listen-only" % peer_addr - cmds.append(cmd) - elif connect_mode == "connectOnly": - cmd = "peer %s connect-only" % peer_addr - cmds.append(cmd) - elif connect_mode == "both": - connect_mode = "null" - cmd = "peer %s listen-only" % peer_addr - cmds.append(cmd) - cmd = "peer %s connect-only" % peer_addr - cmds.append(cmd) - conf_str += "<connectMode>%s</connectMode>" % connect_mode - - is_log_change = module.params['is_log_change'] - if is_log_change != 'no_use': - conf_str += "<isLogChange>%s</isLogChange>" % is_log_change - - if is_log_change == "true": - cmd = "peer %s log-change" % peer_addr - else: - cmd = "undo peer %s log-change" % peer_addr - cmds.append(cmd) - - pswd_type = module.params['pswd_type'] - if pswd_type: - conf_str += "<pswdType>%s</pswdType>" % pswd_type - - pswd_cipher_text = module.params['pswd_cipher_text'] - if pswd_cipher_text: - conf_str += "<pswdCipherText>%s</pswdCipherText>" % pswd_cipher_text - - if pswd_type == "cipher": - cmd = "peer %s password cipher %s" % ( - peer_addr, pswd_cipher_text) - elif pswd_type == "simple": - cmd = "peer %s password simple %s" % ( - peer_addr, pswd_cipher_text) - cmds.append(cmd) - - keep_alive_time = module.params['keep_alive_time'] - if keep_alive_time: - conf_str += "<keepAliveTime>%s</keepAliveTime>" % keep_alive_time - - cmd = "peer %s timer keepalive %s" % (peer_addr, keep_alive_time) - cmds.append(cmd) - - hold_time = module.params['hold_time'] - if hold_time: - conf_str += "<holdTime>%s</holdTime>" % hold_time - - cmd = "peer %s timer hold %s" % (peer_addr, hold_time) - cmds.append(cmd) - - min_hold_time = module.params['min_hold_time'] - if min_hold_time: - conf_str += "<minHoldTime>%s</minHoldTime>" % min_hold_time - - cmd = "peer %s timer min-holdtime %s" % (peer_addr, min_hold_time) - cmds.append(cmd) - - key_chain_name = module.params['key_chain_name'] - if key_chain_name: - conf_str += "<keyChainName>%s</keyChainName>" % key_chain_name - - cmd = "peer %s keychain %s" % (peer_addr, key_chain_name) - cmds.append(cmd) - - conn_retry_time = module.params['conn_retry_time'] - if conn_retry_time: - conf_str += "<connRetryTime>%s</connRetryTime>" % conn_retry_time - - cmd = "peer %s timer connect-retry %s" % ( - peer_addr, conn_retry_time) - cmds.append(cmd) - - tcp_mss = module.params['tcp_MSS'] - if tcp_mss: - conf_str += "<tcpMSS>%s</tcpMSS>" % tcp_mss - - cmd = "peer %s tcp-mss %s" % (peer_addr, tcp_mss) - cmds.append(cmd) - - mpls_local_ifnet_disable = module.params['mpls_local_ifnet_disable'] - if mpls_local_ifnet_disable != 'no_use': - conf_str += "<mplsLocalIfnetDisable>%s</mplsLocalIfnetDisable>" % mpls_local_ifnet_disable - - if mpls_local_ifnet_disable == "false": - cmd = "undo peer %s mpls-local-ifnet disable" % peer_addr - else: - cmd = "peer %s mpls-local-ifnet disable" % peer_addr - cmds.append(cmd) - - prepend_global_as = module.params['prepend_global_as'] - if prepend_global_as != 'no_use': - conf_str += "<prependGlobalAs>%s</prependGlobalAs>" % prepend_global_as - - if prepend_global_as == "true": - cmd = "peer %s local-as %s prepend-global-as" % (peer_addr, fake_as) - else: - cmd = "undo peer %s local-as %s prepend-global-as" % (peer_addr, fake_as) - cmds.append(cmd) - - prepend_fake_as = module.params['prepend_fake_as'] - if prepend_fake_as != 'no_use': - conf_str += "<prependFakeAs>%s</prependFakeAs>" % prepend_fake_as - - if prepend_fake_as == "true": - cmd = "peer %s local-as %s prepend-local-as" % (peer_addr, fake_as) - else: - cmd = "undo peer %s local-as %s prepend-local-as" % (peer_addr, fake_as) - cmds.append(cmd) - - conf_str += CE_MERGE_BGP_PEER_TAIL - - recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) - - if "<ok/>" not in recv_xml: - module.fail_json(msg='Error: Merge bgp peer other failed.') - - return cmds - - def merge_peer_bfd(self, **kwargs): - """ merge_peer_bfd """ - - module = kwargs["module"] - vrf_name = module.params['vrf_name'] - peer_addr = module.params['peer_addr'] - - conf_str = CE_MERGE_PEER_BFD_HEADER % (vrf_name, peer_addr) - - cmds = [] - - is_bfd_block = module.params['is_bfd_block'] - if is_bfd_block != 'no_use': - conf_str += "<isBfdBlock>%s</isBfdBlock>" % is_bfd_block - - if is_bfd_block == "true": - cmd = "peer %s bfd block" % peer_addr - else: - cmd = "undo peer %s bfd block" % peer_addr - cmds.append(cmd) - - multiplier = module.params['multiplier'] - if multiplier: - conf_str += "<multiplier>%s</multiplier>" % multiplier - - cmd = "peer %s bfd detect-multiplier %s" % (peer_addr, multiplier) - cmds.append(cmd) - - is_bfd_enable = module.params['is_bfd_enable'] - if is_bfd_enable != 'no_use': - conf_str += "<isBfdEnable>%s</isBfdEnable>" % is_bfd_enable - - if is_bfd_enable == "true": - cmd = "peer %s bfd enable" % peer_addr - else: - cmd = "undo peer %s bfd enable" % peer_addr - cmds.append(cmd) - - rx_interval = module.params['rx_interval'] - if rx_interval: - conf_str += "<rxInterval>%s</rxInterval>" % rx_interval - - cmd = "peer %s bfd min-rx-interval %s" % (peer_addr, rx_interval) - cmds.append(cmd) - - tx_interval = module.params['tx_interval'] - if tx_interval: - conf_str += "<txInterval>%s</txInterval>" % tx_interval - - cmd = "peer %s bfd min-tx-interval %s" % (peer_addr, tx_interval) - cmds.append(cmd) - - is_single_hop = module.params['is_single_hop'] - if is_single_hop != 'no_use': - conf_str += "<isSingleHop>%s</isSingleHop>" % is_single_hop - - if is_single_hop == "true": - cmd = "peer %s bfd enable single-hop-prefer" % peer_addr - else: - cmd = "undo peer %s bfd enable single-hop-prefer" % peer_addr - cmds.append(cmd) - - conf_str += CE_MERGE_PEER_BFD_TAIL - - recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) - - if "<ok/>" not in recv_xml: - module.fail_json(msg='Error: Merge peer bfd failed.') - - return cmds - - def delete_peer_bfd(self, **kwargs): - """ delete_peer_bfd """ - - module = kwargs["module"] - vrf_name = module.params['vrf_name'] - peer_addr = module.params['peer_addr'] - - conf_str = CE_DELETE_PEER_BFD_HEADER % (vrf_name, peer_addr) - - cmds = [] - - is_bfd_block = module.params['is_bfd_block'] - if is_bfd_block != 'no_use': - conf_str += "<isBfdBlock>%s</isBfdBlock>" % is_bfd_block - - cmd = "undo peer %s bfd block" % peer_addr - cmds.append(cmd) - - multiplier = module.params['multiplier'] - if multiplier: - conf_str += "<multiplier>%s</multiplier>" % multiplier - - cmd = "undo peer %s bfd detect-multiplier %s" % ( - peer_addr, multiplier) - cmds.append(cmd) - - is_bfd_enable = module.params['is_bfd_enable'] - if is_bfd_enable != 'no_use': - conf_str += "<isBfdEnable>%s</isBfdEnable>" % is_bfd_enable - - cmd = "undo peer %s bfd enable" % peer_addr - cmds.append(cmd) - - rx_interval = module.params['rx_interval'] - if rx_interval: - conf_str += "<rxInterval>%s</rxInterval>" % rx_interval - - cmd = "undo peer %s bfd min-rx-interval %s" % ( - peer_addr, rx_interval) - cmds.append(cmd) - - tx_interval = module.params['tx_interval'] - if tx_interval: - conf_str += "<txInterval>%s</txInterval>" % tx_interval - - cmd = "undo peer %s bfd min-tx-interval %s" % ( - peer_addr, tx_interval) - cmds.append(cmd) - - is_single_hop = module.params['is_single_hop'] - if is_single_hop != 'no_use': - conf_str += "<isSingleHop>%s</isSingleHop>" % is_single_hop - - cmd = "undo peer %s bfd enable single-hop-prefer" % peer_addr - cmds.append(cmd) - - conf_str += CE_DELETE_PEER_BFD_TAIL - - recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) - - if "<ok/>" not in recv_xml: - module.fail_json(msg='Error: Delete peer bfd failed.') - - return cmds - - -def main(): - """ main """ - - argument_spec = dict( - state=dict(choices=['present', 'absent'], default='present'), - vrf_name=dict(type='str', required=True), - peer_addr=dict(type='str', required=True), - remote_as=dict(type='str', required=True), - description=dict(type='str'), - fake_as=dict(type='str'), - dual_as=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), - conventional=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), - route_refresh=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), - four_byte_as=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), - is_ignore=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), - local_if_name=dict(type='str'), - ebgp_max_hop=dict(type='str'), - valid_ttl_hops=dict(type='str'), - connect_mode=dict(choices=['listenOnly', 'connectOnly', 'both']), - is_log_change=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), - pswd_type=dict(choices=['null', 'cipher', 'simple']), - pswd_cipher_text=dict(type='str', no_log=True), - keep_alive_time=dict(type='str'), - hold_time=dict(type='str'), - min_hold_time=dict(type='str'), - key_chain_name=dict(type='str'), - conn_retry_time=dict(type='str'), - tcp_MSS=dict(type='str'), - mpls_local_ifnet_disable=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), - prepend_global_as=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), - prepend_fake_as=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), - is_bfd_block=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), - multiplier=dict(type='str'), - is_bfd_enable=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), - rx_interval=dict(type='str'), - tx_interval=dict(type='str'), - is_single_hop=dict(type='str', default='no_use', choices=['no_use', 'true', 'false'])) - - 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'] - vrf_name = module.params['vrf_name'] - peer_addr = module.params['peer_addr'] - remote_as = module.params['remote_as'] - description = module.params['description'] - fake_as = module.params['fake_as'] - dual_as = module.params['dual_as'] - conventional = module.params['conventional'] - route_refresh = module.params['route_refresh'] - four_byte_as = module.params['four_byte_as'] - is_ignore = module.params['is_ignore'] - local_if_name = module.params['local_if_name'] - ebgp_max_hop = module.params['ebgp_max_hop'] - valid_ttl_hops = module.params['valid_ttl_hops'] - connect_mode = module.params['connect_mode'] - is_log_change = module.params['is_log_change'] - pswd_type = module.params['pswd_type'] - pswd_cipher_text = module.params['pswd_cipher_text'] - keep_alive_time = module.params['keep_alive_time'] - hold_time = module.params['hold_time'] - min_hold_time = module.params['min_hold_time'] - key_chain_name = module.params['key_chain_name'] - conn_retry_time = module.params['conn_retry_time'] - tcp_mss = module.params['tcp_MSS'] - mpls_local_ifnet_disable = module.params['mpls_local_ifnet_disable'] - prepend_global_as = module.params['prepend_global_as'] - prepend_fake_as = module.params['prepend_fake_as'] - is_bfd_block = module.params['is_bfd_block'] - multiplier = module.params['multiplier'] - is_bfd_enable = module.params['is_bfd_enable'] - rx_interval = module.params['rx_interval'] - tx_interval = module.params['tx_interval'] - is_single_hop = module.params['is_single_hop'] - - ce_bgp_peer_obj = BgpNeighbor() - - # get proposed - proposed["state"] = state - if vrf_name: - proposed["vrf_name"] = vrf_name - if peer_addr: - proposed["peer_addr"] = peer_addr - if remote_as: - proposed["remote_as"] = remote_as - if description: - proposed["description"] = description - if fake_as: - proposed["fake_as"] = fake_as - if dual_as != 'no_use': - proposed["dual_as"] = dual_as - if conventional != 'no_use': - proposed["conventional"] = conventional - if route_refresh != 'no_use': - proposed["route_refresh"] = route_refresh - if four_byte_as != 'no_use': - proposed["four_byte_as"] = four_byte_as - if is_ignore != 'no_use': - proposed["is_ignore"] = is_ignore - if local_if_name: - proposed["local_if_name"] = local_if_name - if ebgp_max_hop: - proposed["ebgp_max_hop"] = ebgp_max_hop - if valid_ttl_hops: - proposed["valid_ttl_hops"] = valid_ttl_hops - if connect_mode: - proposed["connect_mode"] = connect_mode - if is_log_change != 'no_use': - proposed["is_log_change"] = is_log_change - if pswd_type: - proposed["pswd_type"] = pswd_type - if pswd_cipher_text: - proposed["pswd_cipher_text"] = pswd_cipher_text - if keep_alive_time: - proposed["keep_alive_time"] = keep_alive_time - if hold_time: - proposed["hold_time"] = hold_time - if min_hold_time: - proposed["min_hold_time"] = min_hold_time - if key_chain_name: - proposed["key_chain_name"] = key_chain_name - if conn_retry_time: - proposed["conn_retry_time"] = conn_retry_time - if tcp_mss: - proposed["tcp_MSS"] = tcp_mss - if mpls_local_ifnet_disable != 'no_use': - proposed["mpls_local_ifnet_disable"] = mpls_local_ifnet_disable - if prepend_global_as != 'no_use': - proposed["prepend_global_as"] = prepend_global_as - if prepend_fake_as != 'no_use': - proposed["prepend_fake_as"] = prepend_fake_as - if is_bfd_block != 'no_use': - proposed["is_bfd_block"] = is_bfd_block - if multiplier: - proposed["multiplier"] = multiplier - if is_bfd_enable != 'no_use': - proposed["is_bfd_enable"] = is_bfd_enable - if rx_interval: - proposed["rx_interval"] = rx_interval - if tx_interval: - proposed["tx_interval"] = tx_interval - if is_single_hop != 'no_use': - proposed["is_single_hop"] = is_single_hop - - if not ce_bgp_peer_obj: - module.fail_json(msg='Error: Init module failed.') - - need_bgp_peer_enable = ce_bgp_peer_obj.check_bgp_peer_args(module=module) - need_bgp_peer_other_rst = ce_bgp_peer_obj.check_bgp_peer_other_args( - module=module) - need_peer_bfd_merge_rst = ce_bgp_peer_obj.check_peer_bfd_merge_args( - module=module) - need_peer_bfd_del_rst = ce_bgp_peer_obj.check_peer_bfd_delete_args( - module=module) - - # bgp peer config - if need_bgp_peer_enable["need_cfg"]: - - if state == "present": - - if remote_as: - - bgp_peer_exist = ce_bgp_peer_obj.get_bgp_peer(module=module) - existing["bgp peer"] = bgp_peer_exist - - bgp_peer_new = (peer_addr, remote_as) - if len(bgp_peer_exist) == 0: - cmd = ce_bgp_peer_obj.create_bgp_peer(module=module) - changed = True - for item in cmd: - updates.append(item) - - elif bgp_peer_new in bgp_peer_exist: - pass - - else: - cmd = ce_bgp_peer_obj.merge_bgp_peer(module=module) - changed = True - for item in cmd: - updates.append(item) - - bgp_peer_end = ce_bgp_peer_obj.get_bgp_peer(module=module) - end_state["bgp peer"] = bgp_peer_end - - else: - - bgp_peer_exist = ce_bgp_peer_obj.get_bgp_del_peer(module=module) - existing["bgp peer"] = bgp_peer_exist - - bgp_peer_new = (peer_addr) - - if len(bgp_peer_exist) == 0: - pass - - elif bgp_peer_new in bgp_peer_exist: - cmd = ce_bgp_peer_obj.delete_bgp_peer(module=module) - changed = True - for item in cmd: - updates.append(item) - - bgp_peer_end = ce_bgp_peer_obj.get_bgp_del_peer(module=module) - end_state["bgp peer"] = bgp_peer_end - - # bgp peer other args - exist_tmp = dict() - for item in need_bgp_peer_other_rst: - if item != "need_cfg": - exist_tmp[item] = need_bgp_peer_other_rst[item] - if exist_tmp: - existing["bgp peer other"] = exist_tmp - - if need_bgp_peer_other_rst["need_cfg"]: - - if state == "present": - cmd = ce_bgp_peer_obj.merge_bgp_peer_other(module=module) - changed = True - for item in cmd: - updates.append(item) - - need_bgp_peer_other_rst = ce_bgp_peer_obj.check_bgp_peer_other_args( - module=module) - end_tmp = dict() - for item in need_bgp_peer_other_rst: - if item != "need_cfg": - end_tmp[item] = need_bgp_peer_other_rst[item] - if end_tmp: - end_state["bgp peer other"] = end_tmp - - # peer bfd args - if state == "present": - exist_tmp = dict() - for item in need_peer_bfd_merge_rst: - if item != "need_cfg": - exist_tmp[item] = need_peer_bfd_merge_rst[item] - if exist_tmp: - existing["peer bfd"] = exist_tmp - - if need_peer_bfd_merge_rst["need_cfg"]: - cmd = ce_bgp_peer_obj.merge_peer_bfd(module=module) - changed = True - for item in cmd: - updates.append(item) - - need_peer_bfd_merge_rst = ce_bgp_peer_obj.check_peer_bfd_merge_args( - module=module) - end_tmp = dict() - for item in need_peer_bfd_merge_rst: - if item != "need_cfg": - end_tmp[item] = need_peer_bfd_merge_rst[item] - if end_tmp: - end_state["peer bfd"] = end_tmp - else: - exist_tmp = dict() - for item in need_peer_bfd_del_rst: - if item != "need_cfg": - exist_tmp[item] = need_peer_bfd_del_rst[item] - if exist_tmp: - existing["peer bfd"] = exist_tmp - - # has already delete with bgp peer - - need_peer_bfd_del_rst = ce_bgp_peer_obj.check_peer_bfd_delete_args( - module=module) - end_tmp = dict() - for item in need_peer_bfd_del_rst: - if item != "need_cfg": - end_tmp[item] = need_peer_bfd_del_rst[item] - if end_tmp: - end_state["peer bfd"] = end_tmp - - 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() |