1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00
community.general/plugins/modules/network/cloudengine/ce_bgp_neighbor.py
Ansible Core Team aebc1b03fd Initial commit
2020-03-09 09:11:07 +00:00

2051 lines
72 KiB
Python

#!/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
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_collections.community.general.plugins.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()