#!/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 . # ANSIBLE_METADATA = {'metadata_version': '1.1', 'status': ['preview'], 'supported_by': 'community'} DOCUMENTATION = ''' --- module: ce_bgp_af version_added: "2.4" short_description: Manages BGP Address-family configuration on HUAWEI CloudEngine switches. description: - Manages BGP Address-family 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. The value is a string of 1 to 31 case-sensitive characters. required: true af_type: description: - Address family type of a BGP instance. required: true choices: ['ipv4uni','ipv4multi', 'ipv4vpn', 'ipv6uni', 'ipv6vpn', 'evpn'] max_load_ibgp_num: description: - Specify the maximum number of equal-cost IBGP routes. The value is an integer ranging from 1 to 65535. ibgp_ecmp_nexthop_changed: description: - If the value is true, the next hop of an advertised route is changed to the advertiser itself in IBGP load-balancing scenarios. If the value is false, the next hop of an advertised route is not changed to the advertiser itself in IBGP load-balancing scenarios. choices: ['no_use','true','false'] default: no_use max_load_ebgp_num: description: - Specify the maximum number of equal-cost EBGP routes. The value is an integer ranging from 1 to 65535. ebgp_ecmp_nexthop_changed: description: - If the value is true, the next hop of an advertised route is changed to the advertiser itself in EBGP load-balancing scenarios. If the value is false, the next hop of an advertised route is not changed to the advertiser itself in EBGP load-balancing scenarios. choices: ['no_use','true','false'] default: no_use maximum_load_balance: description: - Specify the maximum number of equal-cost routes in the BGP routing table. The value is an integer ranging from 1 to 65535. ecmp_nexthop_changed: description: - If the value is true, the next hop of an advertised route is changed to the advertiser itself in BGP load-balancing scenarios. If the value is false, the next hop of an advertised route is not changed to the advertiser itself in BGP load-balancing scenarios. choices: ['no_use','true','false'] default: no_use default_local_pref: description: - Set the Local-Preference attribute. The value is an integer. The value is an integer ranging from 0 to 4294967295. default_med: description: - Specify the Multi-Exit-Discriminator (MED) of BGP routes. The value is an integer ranging from 0 to 4294967295. default_rt_import_enable: description: - If the value is true, importing default routes to the BGP routing table is allowed. If the value is false, importing default routes to the BGP routing table is not allowed. choices: ['no_use','true','false'] default: no_use router_id: description: - ID of a router that is in IPv4 address format. The value is a string of 0 to 255 characters. The value is in dotted decimal notation. vrf_rid_auto_sel: description: - If the value is true, VPN BGP instances are enabled to automatically select router IDs. If the value is false, VPN BGP instances are disabled from automatically selecting router IDs. choices: ['no_use','true','false'] default: no_use nexthop_third_party: description: - If the value is true, the third-party next hop function is enabled. If the value is false, the third-party next hop function is disabled. choices: ['no_use','true','false'] default: no_use summary_automatic: description: - If the value is true, automatic aggregation is enabled for locally imported routes. If the value is false, automatic aggregation is disabled for locally imported routes. choices: ['no_use','true','false'] default: no_use auto_frr_enable: description: - If the value is true, BGP auto FRR is enabled. If the value is false, BGP auto FRR is disabled. choices: ['no_use','true','false'] default: no_use load_balancing_as_path_ignore: description: - Load balancing as path ignore. choices: ['no_use','true','false'] default: no_use rib_only_enable: description: - If the value is true, BGP routes cannot be advertised to the IP routing table. If the value is false, Routes preferred by BGP are advertised to the IP routing table. choices: ['no_use','true','false'] default: no_use rib_only_policy_name: description: - Specify the name of a routing policy. The value is a string of 1 to 40 characters. active_route_advertise: description: - If the value is true, BGP is enabled to advertise only optimal routes in the RM to peers. If the value is false, BGP is not enabled to advertise only optimal routes in the RM to peers. choices: ['no_use','true','false'] default: no_use as_path_neglect: description: - If the value is true, the AS path attribute is ignored when BGP selects an optimal route. If the value is false, the AS path attribute is not ignored when BGP selects an optimal route. An AS path with a smaller length has a higher priority. choices: ['no_use','true','false'] default: no_use med_none_as_maximum: description: - If the value is true, when BGP selects an optimal route, the system uses 4294967295 as the MED value of a route if the route's attribute does not carry a MED value. If the value is false, the system uses 0 as the MED value of a route if the route's attribute does not carry a MED value. choices: ['no_use','true','false'] default: no_use router_id_neglect: description: - If the value is true, the router ID attribute is ignored when BGP selects the optimal route. If the value is false, the router ID attribute is not ignored when BGP selects the optimal route. choices: ['no_use','true','false'] default: no_use igp_metric_ignore: description: - If the value is true, the metrics of next-hop IGP routes are not compared when BGP selects an optimal route. If the value is false, the metrics of next-hop IGP routes are not compared when BGP selects an optimal route. A route with a smaller metric has a higher priority. choices: ['no_use','true','false'] default: no_use always_compare_med: description: - If the value is true, the MEDs of routes learned from peers in different autonomous systems are compared when BGP selects an optimal route. If the value is false, the MEDs of routes learned from peers in different autonomous systems are not compared when BGP selects an optimal route. choices: ['no_use','true','false'] default: no_use determin_med: description: - If the value is true, BGP deterministic-MED is enabled. If the value is false, BGP deterministic-MED is disabled. choices: ['no_use','true','false'] default: no_use preference_external: description: - Set the protocol priority of EBGP routes. The value is an integer ranging from 1 to 255. preference_internal: description: - Set the protocol priority of IBGP routes. The value is an integer ranging from 1 to 255. preference_local: description: - Set the protocol priority of a local BGP route. The value is an integer ranging from 1 to 255. prefrence_policy_name: description: - Set a routing policy to filter routes so that a configured priority is applied to the routes that match the specified policy. The value is a string of 1 to 40 characters. reflect_between_client: description: - If the value is true, route reflection is enabled between clients. If the value is false, route reflection is disabled between clients. choices: ['no_use','true','false'] default: no_use reflector_cluster_id: description: - Set a cluster ID. Configuring multiple RRs in a cluster can enhance the stability of the network. The value is an integer ranging from 1 to 4294967295. reflector_cluster_ipv4: description: - Set a cluster ipv4 address. The value is expressed in the format of an IPv4 address. rr_filter_number: description: - Set the number of the extended community filter supported by an RR group. The value is a string of 1 to 51 characters. policy_vpn_target: description: - If the value is true, VPN-Target filtering function is performed for received VPN routes. If the value is false, VPN-Target filtering function is not performed for received VPN routes. choices: ['no_use','true','false'] default: no_use next_hop_sel_depend_type: description: - Next hop select depend type. choices: ['default','dependTunnel', 'dependIp'] default: default nhp_relay_route_policy_name: description: - Specify the name of a route-policy for route iteration. The value is a string of 1 to 40 characters. ebgp_if_sensitive: description: - If the value is true, after the fast EBGP interface awareness function is enabled, EBGP sessions on an interface are deleted immediately when the interface goes Down. If the value is false, after the fast EBGP interface awareness function is enabled, EBGP sessions on an interface are not deleted immediately when the interface goes Down. choices: ['no_use','true','false'] default: no_use reflect_chg_path: description: - If the value is true, the route reflector is enabled to modify route path attributes based on an export policy. If the value is false, the route reflector is disabled from modifying route path attributes based on an export policy. choices: ['no_use','true','false'] default: no_use add_path_sel_num: description: - Number of Add-Path routes. The value is an integer ranging from 2 to 64. route_sel_delay: description: - Route selection delay. The value is an integer ranging from 0 to 3600. allow_invalid_as: description: - Allow routes with BGP origin AS validation result Invalid to be selected. If the value is true, invalid routes can participate in route selection. If the value is false, invalid routes cannot participate in route selection. choices: ['no_use','true','false'] default: no_use policy_ext_comm_enable: description: - If the value is true, modifying extended community attributes is allowed. If the value is false, modifying extended community attributes is not allowed. choices: ['no_use','true','false'] default: no_use supernet_uni_adv: description: - If the value is true, the function to advertise supernetwork unicast routes is enabled. If the value is false, the function to advertise supernetwork unicast routes is disabled. choices: ['no_use','true','false'] default: no_use supernet_label_adv: description: - If the value is true, the function to advertise supernetwork label is enabled. If the value is false, the function to advertise supernetwork label is disabled. choices: ['no_use','true','false'] default: no_use ingress_lsp_policy_name: description: - Ingress lsp policy name. originator_prior: description: - Originator prior. choices: ['no_use','true','false'] default: no_use lowest_priority: description: - If the value is true, enable reduce priority to advertise route. If the value is false, disable reduce priority to advertise route. choices: ['no_use','true','false'] default: no_use relay_delay_enable: description: - If the value is true, relay delay enable. If the value is false, relay delay disable. choices: ['no_use','true','false'] default: no_use import_protocol: description: - Routing protocol from which routes can be imported. choices: ['direct', 'ospf', 'isis', 'static', 'rip', 'ospfv3', 'ripng'] import_process_id: description: - Process ID of an imported routing protocol. The value is an integer ranging from 0 to 4294967295. network_address: description: - Specify the IP address advertised by BGP. The value is a string of 0 to 255 characters. mask_len: description: - Specify the mask length of an IP address. The value is an integer ranging from 0 to 128. ''' EXAMPLES = ''' - name: CloudEngine BGP address family 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 Address_Family" ce_bgp_af: state: present vrf_name: js af_type: ipv4uni provider: "{{ cli }}" - name: "Undo BGP Address_Family" ce_bgp_af: state: absent vrf_name: js af_type: ipv4uni provider: "{{ cli }}" - name: "Config import route" ce_bgp_af: state: present vrf_name: js af_type: ipv4uni import_protocol: ospf import_process_id: 123 provider: "{{ cli }}" - name: "Undo import route" ce_bgp_af: state: absent vrf_name: js af_type: ipv4uni import_protocol: ospf import_process_id: 123 provider: "{{ cli }}" - name: "Config network route" ce_bgp_af: state: present vrf_name: js af_type: ipv4uni network_address: 1.1.1.1 mask_len: 24 provider: "{{ cli }}" - name: "Undo network route" ce_bgp_af: state: absent vrf_name: js af_type: ipv4uni network_address: 1.1.1.1 mask_len: 24 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: {"af_type": "ipv4uni", "state": "present", "vrf_name": "js"} existing: description: k/v pairs of existing aaa server returned: always type: dict sample: {} end_state: description: k/v pairs of aaa params after module execution returned: always type: dict sample: {"af_type": "ipv4uni", "vrf_name": "js"} updates: description: command sent to the device returned: always type: list sample: ["ipv4-family vpn-instance js"] ''' 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 address family CE_GET_BGP_ADDRESS_FAMILY_HEADER = """ %s %s """ CE_GET_BGP_ADDRESS_FAMILY_TAIL = """ """ # merge bgp address family CE_MERGE_BGP_ADDRESS_FAMILY_HEADER = """ %s %s """ CE_MERGE_BGP_ADDRESS_FAMILY_TAIL = """ """ # create bgp address family CE_CREATE_BGP_ADDRESS_FAMILY_HEADER = """ %s %s """ CE_CREATE_BGP_ADDRESS_FAMILY_TAIL = """ """ # delete bgp address family CE_DELETE_BGP_ADDRESS_FAMILY_HEADER = """ %s %s """ CE_DELETE_BGP_ADDRESS_FAMILY_TAIL = """ """ # get bgp import route CE_GET_BGP_IMPORT_AND_NETWORK_ROUTE = """ %s %s """ # merge bgp import route CE_MERGE_BGP_IMPORT_ROUTE_HEADER = """ %s %s %s %s """ CE_MERGE_BGP_IMPORT_ROUTE_TAIL = """ """ # create bgp import route CE_CREATE_BGP_IMPORT_ROUTE = """ %s %s %s %s """ # delete bgp import route CE_DELETE_BGP_IMPORT_ROUTE = """ %s %s %s %s """ # get bgp network route CE_GET_BGP_NETWORK_ROUTE_HEADER = """ %s %s """ CE_GET_BGP_NETWORK_ROUTE_TAIL = """ """ # merge bgp network route CE_MERGE_BGP_NETWORK_ROUTE_HEADER = """ %s %s %s %s """ CE_MERGE_BGP_NETWORK_ROUTE_TAIL = """ """ # create bgp network route CE_CREATE_BGP_NETWORK_ROUTE = """ %s %s %s %s """ # delete bgp network route CE_DELETE_BGP_NETWORK_ROUTE = """ %s %s %s %s """ # bgp import and network route header CE_BGP_IMPORT_NETWORK_ROUTE_HEADER = """ %s %s """ CE_BGP_IMPORT_NETWORK_ROUTE_TAIL = """ """ CE_BGP_MERGE_IMPORT_UNIT = """ %s %s """ CE_BGP_CREATE_IMPORT_UNIT = """ %s %s """ CE_BGP_DELETE_IMPORT_UNIT = """ %s %s """ CE_BGP_MERGE_NETWORK_UNIT = """ %s %s """ CE_BGP_CREATE_NETWORK_UNIT = """ %s %s """ CE_BGP_DELETE_NETWORK_UNIT = """ %s %s """ class BgpAf(object): """ Manages BGP Address-family 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_af_args(self, **kwargs): """ check_bgp_af_args """ module = kwargs["module"] result = dict() need_cfg = False vrf_name = module.params['vrf_name'] af_type = module.params['af_type'] 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) else: module.fail_json(msg='Error: Please input vrf_name.') state = module.params['state'] af_type = module.params['af_type'] conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["af_type"] = re_find result["vrf_name"] = vrf_name if re_find[0] != af_type: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["af_type"] = re_find result["vrf_name"] = vrf_name if re_find[0] == af_type: need_cfg = True result["need_cfg"] = need_cfg return result def check_bgp_af_other_can_del(self, **kwargs): """ check_bgp_af_other_can_del """ module = kwargs["module"] result = dict() need_cfg = False state = module.params['state'] vrf_name = module.params['vrf_name'] af_type = module.params['af_type'] router_id = module.params['router_id'] if router_id: if len(router_id) > 255: module.fail_json( msg='Error: The len of router_id %s is out of [0 - 255].' % router_id) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: if re_find[0] != router_id: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: if re_find[0] == router_id: need_cfg = True else: pass determin_med = module.params['determin_med'] if determin_med != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: if re_find[0] != determin_med: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: if re_find[0] == determin_med: need_cfg = True else: pass ebgp_if_sensitive = module.params['ebgp_if_sensitive'] if ebgp_if_sensitive != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: if re_find[0] != ebgp_if_sensitive: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: if re_find[0] == ebgp_if_sensitive: need_cfg = True else: pass relay_delay_enable = module.params['relay_delay_enable'] if relay_delay_enable != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if state == "present": if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: if re_find[0] != relay_delay_enable: need_cfg = True else: need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: if re_find[0] == relay_delay_enable: need_cfg = True else: pass result["need_cfg"] = need_cfg return result def check_bgp_af_other_args(self, **kwargs): """ check_bgp_af_other_args """ module = kwargs["module"] result = dict() need_cfg = False vrf_name = module.params['vrf_name'] af_type = module.params['af_type'] max_load_ibgp_num = module.params['max_load_ibgp_num'] if max_load_ibgp_num: if int(max_load_ibgp_num) > 65535 or int(max_load_ibgp_num) < 1: module.fail_json( msg='Error: The value of max_load_ibgp_num %s is out of [1 - 65535].' % max_load_ibgp_num) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["max_load_ibgp_num"] = re_find result["vrf_name"] = vrf_name if re_find[0] != max_load_ibgp_num: need_cfg = True else: need_cfg = True ibgp_ecmp_nexthop_changed = module.params['ibgp_ecmp_nexthop_changed'] if ibgp_ecmp_nexthop_changed != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["ibgp_ecmp_nexthop_changed"] = re_find result["vrf_name"] = vrf_name if re_find[0] != ibgp_ecmp_nexthop_changed: need_cfg = True else: need_cfg = True max_load_ebgp_num = module.params['max_load_ebgp_num'] if max_load_ebgp_num: if int(max_load_ebgp_num) > 65535 or int(max_load_ebgp_num) < 1: module.fail_json( msg='Error: The value of max_load_ebgp_num %s is out of [1 - 65535].' % max_load_ebgp_num) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["max_load_ebgp_num"] = re_find result["vrf_name"] = vrf_name if re_find[0] != max_load_ebgp_num: need_cfg = True else: need_cfg = True ebgp_ecmp_nexthop_changed = module.params['ebgp_ecmp_nexthop_changed'] if ebgp_ecmp_nexthop_changed != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["ebgp_ecmp_nexthop_changed"] = re_find result["vrf_name"] = vrf_name if re_find[0] != ebgp_ecmp_nexthop_changed: need_cfg = True else: need_cfg = True maximum_load_balance = module.params['maximum_load_balance'] if maximum_load_balance: if int(maximum_load_balance) > 65535 or int(maximum_load_balance) < 1: module.fail_json( msg='Error: The value of maximum_load_balance %s is out of [1 - 65535].' % maximum_load_balance) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["maximum_load_balance"] = re_find result["vrf_name"] = vrf_name if re_find[0] != maximum_load_balance: need_cfg = True else: need_cfg = True ecmp_nexthop_changed = module.params['ecmp_nexthop_changed'] if ecmp_nexthop_changed != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["ecmp_nexthop_changed"] = re_find result["vrf_name"] = vrf_name if re_find[0] != ecmp_nexthop_changed: need_cfg = True else: need_cfg = True default_local_pref = module.params['default_local_pref'] if default_local_pref: if int(default_local_pref) < 0: module.fail_json( msg='Error: The value of default_local_pref %s is out of [0 - 4294967295].' % default_local_pref) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["default_local_pref"] = re_find result["vrf_name"] = vrf_name if re_find[0] != default_local_pref: need_cfg = True else: need_cfg = True default_med = module.params['default_med'] if default_med: if int(default_med) < 0: module.fail_json( msg='Error: The value of default_med %s is out of [0 - 4294967295].' % default_med) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["default_med"] = re_find result["vrf_name"] = vrf_name if re_find[0] != default_med: need_cfg = True else: need_cfg = True default_rt_import_enable = module.params['default_rt_import_enable'] if default_rt_import_enable != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["default_rt_import_enable"] = re_find result["vrf_name"] = vrf_name if re_find[0] != default_rt_import_enable: need_cfg = True else: need_cfg = True router_id = module.params['router_id'] if router_id: if len(router_id) > 255: module.fail_json( msg='Error: The len of router_id %s is out of [0 - 255].' % router_id) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["router_id"] = re_find result["vrf_name"] = vrf_name if re_find[0] != router_id: need_cfg = True else: need_cfg = True vrf_rid_auto_sel = module.params['vrf_rid_auto_sel'] if vrf_rid_auto_sel != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["vrf_rid_auto_sel"] = re_find result["vrf_name"] = vrf_name if re_find[0] != vrf_rid_auto_sel: need_cfg = True else: need_cfg = True nexthop_third_party = module.params['nexthop_third_party'] if nexthop_third_party != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["nexthop_third_party"] = re_find result["vrf_name"] = vrf_name if re_find[0] != nexthop_third_party: need_cfg = True else: need_cfg = True summary_automatic = module.params['summary_automatic'] if summary_automatic != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["summary_automatic"] = re_find result["vrf_name"] = vrf_name if re_find[0] != summary_automatic: need_cfg = True else: need_cfg = True auto_frr_enable = module.params['auto_frr_enable'] if auto_frr_enable != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["auto_frr_enable"] = re_find result["vrf_name"] = vrf_name if re_find[0] != auto_frr_enable: need_cfg = True else: need_cfg = True load_balancing_as_path_ignore = module.params['load_balancing_as_path_ignore'] if load_balancing_as_path_ignore != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + \ CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["load_balancing_as_path_ignore"] = re_find result["vrf_name"] = vrf_name if re_find[0] != load_balancing_as_path_ignore: need_cfg = True else: need_cfg = True rib_only_enable = module.params['rib_only_enable'] if rib_only_enable != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["rib_only_enable"] = re_find result["vrf_name"] = vrf_name if re_find[0] != rib_only_enable: need_cfg = True else: need_cfg = True rib_only_policy_name = module.params['rib_only_policy_name'] if rib_only_policy_name: if len(rib_only_policy_name) > 40 or len(rib_only_policy_name) < 1: module.fail_json( msg='Error: The len of rib_only_policy_name %s is out of [1 - 40].' % rib_only_policy_name) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["rib_only_policy_name"] = re_find result["vrf_name"] = vrf_name if re_find[0] != rib_only_policy_name: need_cfg = True else: need_cfg = True active_route_advertise = module.params['active_route_advertise'] if active_route_advertise != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["active_route_advertise"] = re_find result["vrf_name"] = vrf_name if re_find[0] != active_route_advertise: need_cfg = True else: need_cfg = True as_path_neglect = module.params['as_path_neglect'] if as_path_neglect != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["as_path_neglect"] = re_find result["vrf_name"] = vrf_name if re_find[0] != as_path_neglect: need_cfg = True else: need_cfg = True med_none_as_maximum = module.params['med_none_as_maximum'] if med_none_as_maximum != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["med_none_as_maximum"] = re_find result["vrf_name"] = vrf_name if re_find[0] != med_none_as_maximum: need_cfg = True else: need_cfg = True router_id_neglect = module.params['router_id_neglect'] if router_id_neglect != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["router_id_neglect"] = re_find result["vrf_name"] = vrf_name if re_find[0] != router_id_neglect: need_cfg = True else: need_cfg = True igp_metric_ignore = module.params['igp_metric_ignore'] if igp_metric_ignore != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["igp_metric_ignore"] = re_find result["vrf_name"] = vrf_name if re_find[0] != igp_metric_ignore: need_cfg = True else: need_cfg = True always_compare_med = module.params['always_compare_med'] if always_compare_med != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["always_compare_med"] = re_find result["vrf_name"] = vrf_name if re_find[0] != always_compare_med: need_cfg = True else: need_cfg = True determin_med = module.params['determin_med'] if determin_med != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["determin_med"] = re_find result["vrf_name"] = vrf_name if re_find[0] != determin_med: need_cfg = True else: need_cfg = True preference_external = module.params['preference_external'] if preference_external: if int(preference_external) > 255 or int(preference_external) < 1: module.fail_json( msg='Error: The value of preference_external %s is out of [1 - 255].' % preference_external) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["preference_external"] = re_find result["vrf_name"] = vrf_name if re_find[0] != preference_external: need_cfg = True else: need_cfg = True preference_internal = module.params['preference_internal'] if preference_internal: if int(preference_internal) > 255 or int(preference_internal) < 1: module.fail_json( msg='Error: The value of preference_internal %s is out of [1 - 255].' % preference_internal) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["preference_internal"] = re_find result["vrf_name"] = vrf_name if re_find[0] != preference_internal: need_cfg = True else: need_cfg = True preference_local = module.params['preference_local'] if preference_local: if int(preference_local) > 255 or int(preference_local) < 1: module.fail_json( msg='Error: The value of preference_local %s is out of [1 - 255].' % preference_local) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["preference_local"] = re_find result["vrf_name"] = vrf_name if re_find[0] != preference_local: need_cfg = True else: need_cfg = True prefrence_policy_name = module.params['prefrence_policy_name'] if prefrence_policy_name: if len(prefrence_policy_name) > 40 or len(prefrence_policy_name) < 1: module.fail_json( msg='Error: The len of prefrence_policy_name %s is out of [1 - 40].' % prefrence_policy_name) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["prefrence_policy_name"] = re_find result["vrf_name"] = vrf_name if re_find[0] != prefrence_policy_name: need_cfg = True else: need_cfg = True reflect_between_client = module.params['reflect_between_client'] if reflect_between_client != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["reflect_between_client"] = re_find result["vrf_name"] = vrf_name if re_find[0] != reflect_between_client: need_cfg = True else: need_cfg = True reflector_cluster_id = module.params['reflector_cluster_id'] if reflector_cluster_id: if int(reflector_cluster_id) < 0: module.fail_json( msg='Error: The value of reflector_cluster_id %s is out of ' '[1 - 4294967295].' % reflector_cluster_id) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["reflector_cluster_id"] = re_find result["vrf_name"] = vrf_name if re_find[0] != reflector_cluster_id: need_cfg = True else: need_cfg = True reflector_cluster_ipv4 = module.params['reflector_cluster_ipv4'] if reflector_cluster_ipv4: if len(reflector_cluster_ipv4) > 255: module.fail_json( msg='Error: The len of reflector_cluster_ipv4 %s is out of [0 - 255].' % reflector_cluster_ipv4) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["reflector_cluster_ipv4"] = re_find result["vrf_name"] = vrf_name if re_find[0] != reflector_cluster_ipv4: need_cfg = True else: need_cfg = True rr_filter_number = module.params['rr_filter_number'] if rr_filter_number: if len(rr_filter_number) > 51 or len(rr_filter_number) < 1: module.fail_json( msg='Error: The len of rr_filter_number %s is out of [1 - 51].' % rr_filter_number) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["rr_filter_number"] = re_find result["vrf_name"] = vrf_name if re_find[0] != rr_filter_number: need_cfg = True else: need_cfg = True policy_vpn_target = module.params['policy_vpn_target'] if policy_vpn_target != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["policy_vpn_target"] = re_find result["vrf_name"] = vrf_name if re_find[0] != policy_vpn_target: need_cfg = True else: need_cfg = True next_hop_sel_depend_type = module.params['next_hop_sel_depend_type'] if next_hop_sel_depend_type: conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["next_hop_sel_depend_type"] = re_find result["vrf_name"] = vrf_name if re_find[0] != next_hop_sel_depend_type: need_cfg = True else: need_cfg = True nhp_relay_route_policy_name = module.params[ 'nhp_relay_route_policy_name'] if nhp_relay_route_policy_name: if len(nhp_relay_route_policy_name) > 40 or len(nhp_relay_route_policy_name) < 1: module.fail_json( msg='Error: The len of nhp_relay_route_policy_name %s is ' 'out of [1 - 40].' % nhp_relay_route_policy_name) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + \ CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["nhp_relay_route_policy_name"] = re_find result["vrf_name"] = vrf_name if re_find[0] != nhp_relay_route_policy_name: need_cfg = True else: need_cfg = True ebgp_if_sensitive = module.params['ebgp_if_sensitive'] if ebgp_if_sensitive != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["ebgp_if_sensitive"] = re_find result["vrf_name"] = vrf_name if re_find[0] != ebgp_if_sensitive: need_cfg = True else: need_cfg = True reflect_chg_path = module.params['reflect_chg_path'] if reflect_chg_path != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["reflect_chg_path"] = re_find result["vrf_name"] = vrf_name if re_find[0] != reflect_chg_path: need_cfg = True else: need_cfg = True add_path_sel_num = module.params['add_path_sel_num'] if add_path_sel_num: if int(add_path_sel_num) > 64 or int(add_path_sel_num) < 2: module.fail_json( msg='Error: The value of add_path_sel_num %s is out of [2 - 64].' % add_path_sel_num) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["add_path_sel_num"] = re_find result["vrf_name"] = vrf_name if re_find[0] != add_path_sel_num: need_cfg = True else: need_cfg = True route_sel_delay = module.params['route_sel_delay'] if route_sel_delay: if int(route_sel_delay) > 3600 or int(route_sel_delay) < 0: module.fail_json( msg='Error: The value of route_sel_delay %s is out of [0 - 3600].' % route_sel_delay) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["route_sel_delay"] = re_find result["vrf_name"] = vrf_name if re_find[0] != route_sel_delay: need_cfg = True else: need_cfg = True allow_invalid_as = module.params['allow_invalid_as'] if allow_invalid_as != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["allow_invalid_as"] = re_find result["vrf_name"] = vrf_name if re_find[0] != allow_invalid_as: need_cfg = True else: need_cfg = True policy_ext_comm_enable = module.params['policy_ext_comm_enable'] if policy_ext_comm_enable != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["policy_ext_comm_enable"] = re_find result["vrf_name"] = vrf_name if re_find[0] != policy_ext_comm_enable: need_cfg = True else: need_cfg = True supernet_uni_adv = module.params['supernet_uni_adv'] if supernet_uni_adv != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["supernet_uni_adv"] = re_find result["vrf_name"] = vrf_name if re_find[0] != supernet_uni_adv: need_cfg = True else: need_cfg = True supernet_label_adv = module.params['supernet_label_adv'] if supernet_label_adv != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["supernet_label_adv"] = re_find result["vrf_name"] = vrf_name if re_find[0] != supernet_label_adv: need_cfg = True else: need_cfg = True ingress_lsp_policy_name = module.params['ingress_lsp_policy_name'] if ingress_lsp_policy_name: if len(ingress_lsp_policy_name) > 40 or len(ingress_lsp_policy_name) < 1: module.fail_json( msg='Error: The len of ingress_lsp_policy_name %s is out of [1 - 40].' % ingress_lsp_policy_name) conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["ingress_lsp_policy_name"] = re_find result["vrf_name"] = vrf_name if re_find[0] != ingress_lsp_policy_name: need_cfg = True else: need_cfg = True originator_prior = module.params['originator_prior'] if originator_prior != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["originator_prior"] = re_find result["vrf_name"] = vrf_name if re_find[0] != originator_prior: need_cfg = True else: need_cfg = True lowest_priority = module.params['lowest_priority'] if lowest_priority != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["lowest_priority"] = re_find result["vrf_name"] = vrf_name if re_find[0] != lowest_priority: need_cfg = True else: need_cfg = True relay_delay_enable = module.params['relay_delay_enable'] if relay_delay_enable != 'no_use': conf_str = CE_GET_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) + \ "" + CE_GET_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if "" in recv_xml: need_cfg = True else: re_find = re.findall( r'.*(.*).*', recv_xml) if re_find: result["relay_delay_enable"] = re_find result["vrf_name"] = vrf_name if re_find[0] != relay_delay_enable: need_cfg = True else: need_cfg = True result["need_cfg"] = need_cfg return result def check_bgp_import_network_route(self, **kwargs): """ check_bgp_import_network_route """ module = kwargs["module"] result = dict() import_need_cfg = False network_need_cfg = False vrf_name = module.params['vrf_name'] state = module.params['state'] af_type = module.params['af_type'] import_protocol = module.params['import_protocol'] import_process_id = module.params['import_process_id'] if import_protocol and (import_protocol != "direct" and import_protocol != "static"): if not import_process_id: module.fail_json( msg='Error: Please input import_protocol and import_process_id value at the same time.') else: if int(import_process_id) < 0: module.fail_json( msg='Error: The value of import_process_id %s is out of [0 - 4294967295].' % import_process_id) if import_process_id: if not import_protocol: module.fail_json( msg='Error: Please input import_protocol and import_process_id value at the same time.') network_address = module.params['network_address'] mask_len = module.params['mask_len'] if network_address: if not mask_len: module.fail_json( msg='Error: Please input network_address and mask_len value at the same time.') if mask_len: if not network_address: module.fail_json( msg='Error: Please input network_address and mask_len value at the same time.') conf_str = CE_GET_BGP_IMPORT_AND_NETWORK_ROUTE % (vrf_name, af_type) recv_xml = self.netconf_get_config(module=module, conf_str=conf_str) if import_protocol: if import_protocol == "direct" or import_protocol == "static": import_process_id = "0" else: if not import_process_id or import_process_id == "0": module.fail_json( msg='Error: Please input import_process_id not 0 when import_protocol is ' '[ospf, isis, rip, ospfv3, ripng].') bgp_import_route_new = (import_protocol, import_process_id) if state == "present": if "" in recv_xml: import_need_cfg = True else: re_find = re.findall( r'.*(.*).*\s.*(.*).*', recv_xml) if re_find: result["bgp_import_route"] = re_find result["vrf_name"] = vrf_name if bgp_import_route_new not in re_find: import_need_cfg = True else: import_need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*\s.*(.*).*', recv_xml) if re_find: result["bgp_import_route"] = re_find result["vrf_name"] = vrf_name if bgp_import_route_new in re_find: import_need_cfg = True if network_address and mask_len: bgp_network_route_new = (network_address, mask_len) if not check_ip_addr(ipaddr=network_address): module.fail_json( msg='Error: The network_address %s is invalid.' % network_address) if len(mask_len) > 128: module.fail_json( msg='Error: The len of mask_len %s is out of [0 - 128].' % mask_len) if state == "present": if "" in recv_xml: network_need_cfg = True else: re_find = re.findall( r'.*(.*).*\s.*(.*).*', recv_xml) if re_find: result["bgp_network_route"] = re_find result["vrf_name"] = vrf_name if bgp_network_route_new not in re_find: network_need_cfg = True else: network_need_cfg = True else: if "" in recv_xml: pass else: re_find = re.findall( r'.*(.*).*\s.*(.*).*', recv_xml) if re_find: result["bgp_network_route"] = re_find result["vrf_name"] = vrf_name if bgp_network_route_new in re_find: network_need_cfg = True result["import_need_cfg"] = import_need_cfg result["network_need_cfg"] = network_need_cfg return result def merge_bgp_af(self, **kwargs): """ merge_bgp_af """ module = kwargs["module"] vrf_name = module.params['vrf_name'] af_type = module.params['af_type'] conf_str = CE_MERGE_BGP_ADDRESS_FAMILY_HEADER % ( vrf_name, af_type) + CE_MERGE_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Merge bgp address family failed.') cmds = [] cmd = "ipv4-family vpn-instance %s" % vrf_name if af_type == "ipv4multi": cmd = "ipv4-family multicast" elif af_type == "ipv4vpn": cmd = "ipv4-family vpnv4" elif af_type == "ipv6uni": cmd = "ipv6-family vpn-instance %s" % vrf_name if vrf_name == "_public_": cmd = "ipv6-family unicast" elif af_type == "ipv6vpn": cmd = "ipv6-family vpnv6" elif af_type == "evpn": cmd = "l2vpn-family evpn" cmds.append(cmd) return cmds def create_bgp_af(self, **kwargs): """ create_bgp_af """ module = kwargs["module"] vrf_name = module.params['vrf_name'] af_type = module.params['af_type'] conf_str = CE_CREATE_BGP_ADDRESS_FAMILY_HEADER % ( vrf_name, af_type) + CE_CREATE_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Create bgp address family failed.') cmds = [] cmd = "ipv4-family vpn-instance %s" % vrf_name if af_type == "ipv4multi": cmd = "ipv4-family multicast" elif af_type == "ipv4vpn": cmd = "ipv4-family vpnv4" elif af_type == "ipv6uni": cmd = "ipv6-family vpn-instance %s" % vrf_name if vrf_name == "_public_": cmd = "ipv6-family unicast" elif af_type == "ipv6vpn": cmd = "ipv6-family vpnv6" elif af_type == "evpn": cmd = "l2vpn-family evpn" cmds.append(cmd) return cmds def delete_bgp_af(self, **kwargs): """ delete_bgp_af """ module = kwargs["module"] vrf_name = module.params['vrf_name'] af_type = module.params['af_type'] conf_str = CE_DELETE_BGP_ADDRESS_FAMILY_HEADER % ( vrf_name, af_type) + CE_DELETE_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Delete bgp address family failed.') cmds = [] cmd = "undo ipv4-family vpn-instance %s" % vrf_name if af_type == "ipv4multi": cmd = "undo ipv4-family multicast" elif af_type == "ipv4vpn": cmd = "undo ipv4-family vpnv4" elif af_type == "ipv6uni": cmd = "undo ipv6-family vpn-instance %s" % vrf_name if vrf_name == "_public_": cmd = "undo ipv6-family unicast" elif af_type == "ipv6vpn": cmd = "undo ipv6-family vpnv6" elif af_type == "evpn": cmd = "l2vpn-family evpn" cmds.append(cmd) return cmds def merge_bgp_af_other(self, **kwargs): """ merge_bgp_af_other """ module = kwargs["module"] vrf_name = module.params['vrf_name'] af_type = module.params['af_type'] conf_str = CE_MERGE_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) cmds = [] max_load_ibgp_num = module.params['max_load_ibgp_num'] if max_load_ibgp_num: conf_str += "%s" % max_load_ibgp_num cmd = "maximum load-balancing ibgp %s" % max_load_ibgp_num cmds.append(cmd) ibgp_ecmp_nexthop_changed = module.params['ibgp_ecmp_nexthop_changed'] if ibgp_ecmp_nexthop_changed != 'no_use': conf_str += "%s" % ibgp_ecmp_nexthop_changed if ibgp_ecmp_nexthop_changed == "true": cmd = "maximum load-balancing ibgp %s ecmp-nexthop-changed" % max_load_ibgp_num cmds.append(cmd) else: cmd = "undo maximum load-balancing ibgp %s ecmp-nexthop-changed" % max_load_ibgp_num cmds.append(cmd) max_load_ebgp_num = module.params['max_load_ebgp_num'] if max_load_ebgp_num: conf_str += "%s" % max_load_ebgp_num cmd = "maximum load-balancing ebgp %s" % max_load_ebgp_num cmds.append(cmd) ebgp_ecmp_nexthop_changed = module.params['ebgp_ecmp_nexthop_changed'] if ebgp_ecmp_nexthop_changed != 'no_use': conf_str += "%s" % ebgp_ecmp_nexthop_changed if ebgp_ecmp_nexthop_changed == "true": cmd = "maximum load-balancing ebgp %s ecmp-nexthop-changed" % max_load_ebgp_num else: cmd = "undo maximum load-balancing ebgp %s ecmp-nexthop-changed" % max_load_ebgp_num cmds.append(cmd) maximum_load_balance = module.params['maximum_load_balance'] if maximum_load_balance: conf_str += "%s" % maximum_load_balance cmd = "maximum load-balancing %s" % maximum_load_balance cmds.append(cmd) ecmp_nexthop_changed = module.params['ecmp_nexthop_changed'] if ecmp_nexthop_changed != 'no_use': conf_str += "%s" % ecmp_nexthop_changed if ecmp_nexthop_changed == "true": cmd = "maximum load-balancing %s ecmp-nexthop-changed" % maximum_load_balance else: cmd = "undo maximum load-balancing %s ecmp-nexthop-changed" % maximum_load_balance cmds.append(cmd) default_local_pref = module.params['default_local_pref'] if default_local_pref: conf_str += "%s" % default_local_pref cmd = "default local-preference %s" % default_local_pref cmds.append(cmd) default_med = module.params['default_med'] if default_med: conf_str += "%s" % default_med cmd = "default med %s" % default_med cmds.append(cmd) default_rt_import_enable = module.params['default_rt_import_enable'] if default_rt_import_enable != 'no_use': conf_str += "%s" % default_rt_import_enable if default_rt_import_enable == "true": cmd = "default-route imported" else: cmd = "undo default-route imported" cmds.append(cmd) router_id = module.params['router_id'] if router_id: conf_str += "%s" % router_id cmd = "router-id %s" % router_id cmds.append(cmd) vrf_rid_auto_sel = module.params['vrf_rid_auto_sel'] if vrf_rid_auto_sel != 'no_use': conf_str += "%s" % vrf_rid_auto_sel family = "ipv4-family" if af_type == "ipv6uni": family = "ipv6-family" if vrf_rid_auto_sel == "true": cmd = "%s vpn-instance %s" % (family, vrf_name) cmds.append(cmd) cmd = "router-id auto-select" cmds.append(cmd) else: cmd = "%s vpn-instance %s" % (family, vrf_name) cmds.append(cmd) cmd = "undo router-id auto-select" cmds.append(cmd) nexthop_third_party = module.params['nexthop_third_party'] if nexthop_third_party != 'no_use': conf_str += "%s" % nexthop_third_party if nexthop_third_party == "true": cmd = "nexthop third-party" else: cmd = "undo nexthop third-party" cmds.append(cmd) summary_automatic = module.params['summary_automatic'] if summary_automatic != 'no_use': conf_str += "%s" % summary_automatic if summary_automatic == "true": cmd = "summary automatic" else: cmd = "undo summary automatic" cmds.append(cmd) auto_frr_enable = module.params['auto_frr_enable'] if auto_frr_enable != 'no_use': conf_str += "%s" % auto_frr_enable if auto_frr_enable == "true": cmd = "auto-frr" else: cmd = "undo auto-frr" cmds.append(cmd) load_balancing_as_path_ignore = module.params[ 'load_balancing_as_path_ignore'] if load_balancing_as_path_ignore != 'no_use': conf_str += "%s" % load_balancing_as_path_ignore if load_balancing_as_path_ignore == "true": cmd = "load-balancing as-path-ignore" else: cmd = "undo load-balancing as-path-ignore" cmds.append(cmd) rib_only_enable = module.params['rib_only_enable'] if rib_only_enable != 'no_use': conf_str += "%s" % rib_only_enable if rib_only_enable == "true": cmd = "routing-table rib-only" else: cmd = "undo routing-table rib-only" cmds.append(cmd) rib_only_policy_name = module.params['rib_only_policy_name'] if rib_only_policy_name and rib_only_enable == "true": conf_str += "%s" % rib_only_policy_name cmd = "routing-table rib-only route-policy %s" % rib_only_policy_name cmds.append(cmd) active_route_advertise = module.params['active_route_advertise'] if active_route_advertise != 'no_use': conf_str += "%s" % active_route_advertise if active_route_advertise == "true": cmd = "active-route-advertise" else: cmd = "undo active-route-advertise" cmds.append(cmd) as_path_neglect = module.params['as_path_neglect'] if as_path_neglect != 'no_use': conf_str += "%s" % as_path_neglect if as_path_neglect == "true": cmd = "bestroute as-path-ignore" else: cmd = "undo bestroute as-path-ignore" cmds.append(cmd) med_none_as_maximum = module.params['med_none_as_maximum'] if med_none_as_maximum != 'no_use': conf_str += "%s" % med_none_as_maximum if med_none_as_maximum == "true": cmd = "bestroute med-none-as-maximum" else: cmd = "undo bestroute med-none-as-maximum" cmds.append(cmd) router_id_neglect = module.params['router_id_neglect'] if router_id_neglect != 'no_use': conf_str += "%s" % router_id_neglect if router_id_neglect == "true": cmd = "bestroute router-id-ignore" else: cmd = "undo bestroute router-id-ignore" cmds.append(cmd) igp_metric_ignore = module.params['igp_metric_ignore'] if igp_metric_ignore != 'no_use': conf_str += "%s" % igp_metric_ignore if igp_metric_ignore == "true": cmd = "bestroute igp-metric-ignore" cmds.append(cmd) else: cmd = "undo bestroute igp-metric-ignore" cmds.append(cmd) always_compare_med = module.params['always_compare_med'] if always_compare_med != 'no_use': conf_str += "%s" % always_compare_med if always_compare_med == "true": cmd = "compare-different-as-med" cmds.append(cmd) else: cmd = "undo compare-different-as-med" cmds.append(cmd) determin_med = module.params['determin_med'] if determin_med != 'no_use': conf_str += "%s" % determin_med if determin_med == "true": cmd = "deterministic-med" cmds.append(cmd) else: cmd = "undo deterministic-med" cmds.append(cmd) preference_external = module.params['preference_external'] preference_internal = module.params['preference_internal'] preference_local = module.params['preference_local'] if any([preference_external, preference_internal, preference_local]): preference_external = preference_external or "255" preference_internal = preference_internal or "255" preference_local = preference_local or "255" conf_str += "%s" % preference_external conf_str += "%s" % preference_internal conf_str += "%s" % preference_local cmd = "preference %s %s %s" % ( preference_external, preference_internal, preference_local) cmds.append(cmd) prefrence_policy_name = module.params['prefrence_policy_name'] if prefrence_policy_name: conf_str += "%s" % prefrence_policy_name cmd = "preference route-policy %s" % prefrence_policy_name cmds.append(cmd) reflect_between_client = module.params['reflect_between_client'] if reflect_between_client != 'no_use': conf_str += "%s" % reflect_between_client if reflect_between_client == "true": cmd = "reflect between-clients" else: cmd = "undo reflect between-clients" cmds.append(cmd) reflector_cluster_id = module.params['reflector_cluster_id'] if reflector_cluster_id: conf_str += "%s" % reflector_cluster_id cmd = "reflector cluster-id %s" % reflector_cluster_id cmds.append(cmd) reflector_cluster_ipv4 = module.params['reflector_cluster_ipv4'] if reflector_cluster_ipv4: conf_str += "%s" % reflector_cluster_ipv4 cmd = "reflector cluster-id %s" % reflector_cluster_ipv4 cmds.append(cmd) rr_filter_number = module.params['rr_filter_number'] if rr_filter_number: conf_str += "%s" % rr_filter_number cmd = 'rr-filter %s' % rr_filter_number cmds.append(cmd) policy_vpn_target = module.params['policy_vpn_target'] if policy_vpn_target != 'no_use': conf_str += "%s" % policy_vpn_target if policy_vpn_target == 'true': cmd = 'policy vpn-target' else: cmd = 'undo policy vpn-target' cmds.append(cmd) next_hop_sel_depend_type = module.params['next_hop_sel_depend_type'] if next_hop_sel_depend_type: conf_str += "%s" % next_hop_sel_depend_type nhp_relay_route_policy_name = module.params[ 'nhp_relay_route_policy_name'] if nhp_relay_route_policy_name: conf_str += "%s" % nhp_relay_route_policy_name cmd = "nexthop recursive-lookup route-policy %s" % nhp_relay_route_policy_name cmds.append(cmd) ebgp_if_sensitive = module.params['ebgp_if_sensitive'] if ebgp_if_sensitive != 'no_use': conf_str += "%s" % ebgp_if_sensitive if ebgp_if_sensitive == "true": cmd = "ebgp-interface-sensitive" else: cmd = "undo ebgp-interface-sensitive" cmds.append(cmd) reflect_chg_path = module.params['reflect_chg_path'] if reflect_chg_path != 'no_use': conf_str += "%s" % reflect_chg_path if reflect_chg_path == "true": cmd = "reflect change-path-attribute" else: cmd = "undo reflect change-path-attribute" cmds.append(cmd) add_path_sel_num = module.params['add_path_sel_num'] if add_path_sel_num: conf_str += "%s" % add_path_sel_num cmd = "bestroute add-path path-number %s" % add_path_sel_num cmds.append(cmd) route_sel_delay = module.params['route_sel_delay'] if route_sel_delay: conf_str += "%s" % route_sel_delay cmd = "route-select delay %s" % route_sel_delay cmds.append(cmd) allow_invalid_as = module.params['allow_invalid_as'] if allow_invalid_as != 'no_use': conf_str += "%s" % allow_invalid_as policy_ext_comm_enable = module.params['policy_ext_comm_enable'] if policy_ext_comm_enable != 'no_use': conf_str += "%s" % policy_ext_comm_enable if policy_ext_comm_enable == "true": cmd = "ext-community-change enable" else: cmd = "undo ext-community-change enable" cmds.append(cmd) supernet_uni_adv = module.params['supernet_uni_adv'] if supernet_uni_adv != 'no_use': conf_str += "%s" % supernet_uni_adv if supernet_uni_adv == "true": cmd = "supernet unicast advertise enable" else: cmd = "undo supernet unicast advertise enable" cmds.append(cmd) supernet_label_adv = module.params['supernet_label_adv'] if supernet_label_adv != 'no_use': conf_str += "%s" % supernet_label_adv if supernet_label_adv == "true": cmd = "supernet label-route advertise enable" else: cmd = "undo supernet label-route advertise enable" cmds.append(cmd) ingress_lsp_policy_name = module.params['ingress_lsp_policy_name'] if ingress_lsp_policy_name: conf_str += "%s" % ingress_lsp_policy_name cmd = "ingress-lsp trigger route-policy %s" % ingress_lsp_policy_name cmds.append(cmd) originator_prior = module.params['originator_prior'] if originator_prior != 'no_use': conf_str += "%s" % originator_prior if originator_prior == "true": cmd = "bestroute routerid-prior-clusterlist" else: cmd = "undo bestroute routerid-prior-clusterlist" cmds.append(cmd) lowest_priority = module.params['lowest_priority'] if lowest_priority != 'no_use': conf_str += "%s" % lowest_priority if lowest_priority == "true": cmd = "advertise lowest-priority on-startup" else: cmd = "undo advertise lowest-priority on-startup" cmds.append(cmd) relay_delay_enable = module.params['relay_delay_enable'] if relay_delay_enable != 'no_use': conf_str += "%s" % relay_delay_enable if relay_delay_enable == "true": cmd = "nexthop recursive-lookup restrain enable" else: cmd = "nexthop recursive-lookup restrain disable" cmds.append(cmd) conf_str += CE_MERGE_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json( msg='Error: Merge bgp address family other agrus failed.') return cmds def delete_bgp_af_other(self, **kwargs): """ delete_bgp_af_other """ module = kwargs["module"] vrf_name = module.params['vrf_name'] af_type = module.params['af_type'] conf_str = CE_MERGE_BGP_ADDRESS_FAMILY_HEADER % (vrf_name, af_type) cmds = [] router_id = module.params['router_id'] if router_id: conf_str += "" cmd = "undo router-id %s" % router_id cmds.append(cmd) determin_med = module.params['determin_med'] if determin_med != 'no_use': conf_str += "" cmd = "undo deterministic-med" cmds.append(cmd) ebgp_if_sensitive = module.params['ebgp_if_sensitive'] if ebgp_if_sensitive != 'no_use': conf_str += "" cmd = "undo ebgp-interface-sensitive" cmds.append(cmd) relay_delay_enable = module.params['relay_delay_enable'] if relay_delay_enable != 'no_use': conf_str += "" conf_str += CE_MERGE_BGP_ADDRESS_FAMILY_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json( msg='Error: Merge bgp address family other agrus failed.') return cmds def merge_bgp_import_route(self, **kwargs): """ merge_bgp_import_route """ module = kwargs["module"] vrf_name = module.params['vrf_name'] af_type = module.params['af_type'] import_protocol = module.params['import_protocol'] import_process_id = module.params['import_process_id'] if import_protocol == "direct" or import_protocol == "static": import_process_id = "0" conf_str = CE_MERGE_BGP_IMPORT_ROUTE_HEADER % ( vrf_name, af_type, import_protocol, import_process_id) + CE_MERGE_BGP_IMPORT_ROUTE_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Merge bgp import route failed.') cmds = [] cmd = "import-route %s %s" % (import_protocol, import_process_id) if import_protocol == "direct" or import_protocol == "static": cmd = "import-route %s" % import_protocol cmds.append(cmd) return cmds def create_bgp_import_route(self, **kwargs): """ create_bgp_import_route """ module = kwargs["module"] vrf_name = module.params['vrf_name'] af_type = module.params['af_type'] import_protocol = module.params['import_protocol'] import_process_id = module.params['import_process_id'] if import_protocol == "direct" or import_protocol == "static": import_process_id = "0" conf_str = CE_CREATE_BGP_IMPORT_ROUTE % ( vrf_name, af_type, import_protocol, import_process_id) recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Create bgp import route failed.') cmds = [] cmd = "import-route %s %s" % (import_protocol, import_process_id) if import_protocol == "direct" or import_protocol == "static": cmd = "import-route %s" % import_protocol cmds.append(cmd) return cmds def delete_bgp_import_route(self, **kwargs): """ delete_bgp_import_route """ module = kwargs["module"] vrf_name = module.params['vrf_name'] af_type = module.params['af_type'] import_protocol = module.params['import_protocol'] import_process_id = module.params['import_process_id'] if import_protocol == "direct" or import_protocol == "static": import_process_id = "0" conf_str = CE_DELETE_BGP_IMPORT_ROUTE % ( vrf_name, af_type, import_protocol, import_process_id) recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Delete bgp import route failed.') cmds = [] cmd = "undo import-route %s %s" % (import_protocol, import_process_id) if import_protocol == "direct" or import_protocol == "static": cmd = "undo import-route %s" % import_protocol cmds.append(cmd) return cmds def merge_bgp_network_route(self, **kwargs): """ merge_bgp_network_route """ module = kwargs["module"] vrf_name = module.params['vrf_name'] af_type = module.params['af_type'] network_address = module.params['network_address'] mask_len = module.params['mask_len'] conf_str = CE_MERGE_BGP_NETWORK_ROUTE_HEADER % ( vrf_name, af_type, network_address, mask_len) + CE_MERGE_BGP_NETWORK_ROUTE_TAIL recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Merge bgp network route failed.') cmds = [] cmd = "network %s %s" % (network_address, mask_len) cmds.append(cmd) return cmds def create_bgp_network_route(self, **kwargs): """ create_bgp_network_route """ module = kwargs["module"] vrf_name = module.params['vrf_name'] af_type = module.params['af_type'] network_address = module.params['network_address'] mask_len = module.params['mask_len'] conf_str = CE_CREATE_BGP_NETWORK_ROUTE % ( vrf_name, af_type, network_address, mask_len) recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Create bgp network route failed.') cmds = [] cmd = "network %s %s" % (network_address, mask_len) cmds.append(cmd) return cmds def delete_bgp_network_route(self, **kwargs): """ delete_bgp_network_route """ module = kwargs["module"] vrf_name = module.params['vrf_name'] af_type = module.params['af_type'] network_address = module.params['network_address'] mask_len = module.params['mask_len'] conf_str = CE_DELETE_BGP_NETWORK_ROUTE % ( vrf_name, af_type, network_address, mask_len) recv_xml = self.netconf_set_config(module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json(msg='Error: Delete bgp network route failed.') cmds = [] cmd = "undo network %s %s" % (network_address, mask_len) cmds.append(cmd) return cmds def main(): """ main """ argument_spec = dict( state=dict(choices=['present', 'absent'], default='present'), vrf_name=dict(type='str', required=True), af_type=dict(choices=['ipv4uni', 'ipv4multi', 'ipv4vpn', 'ipv6uni', 'ipv6vpn', 'evpn'], required=True), max_load_ibgp_num=dict(type='str'), ibgp_ecmp_nexthop_changed=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), max_load_ebgp_num=dict(type='str'), ebgp_ecmp_nexthop_changed=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), maximum_load_balance=dict(type='str'), ecmp_nexthop_changed=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), default_local_pref=dict(type='str'), default_med=dict(type='str'), default_rt_import_enable=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), router_id=dict(type='str'), vrf_rid_auto_sel=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), nexthop_third_party=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), summary_automatic=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), auto_frr_enable=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), load_balancing_as_path_ignore=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), rib_only_enable=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), rib_only_policy_name=dict(type='str'), active_route_advertise=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), as_path_neglect=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), med_none_as_maximum=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), router_id_neglect=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), igp_metric_ignore=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), always_compare_med=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), determin_med=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), preference_external=dict(type='str'), preference_internal=dict(type='str'), preference_local=dict(type='str'), prefrence_policy_name=dict(type='str'), reflect_between_client=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), reflector_cluster_id=dict(type='str'), reflector_cluster_ipv4=dict(type='str'), rr_filter_number=dict(type='str'), policy_vpn_target=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), next_hop_sel_depend_type=dict( choices=['default', 'dependTunnel', 'dependIp']), nhp_relay_route_policy_name=dict(type='str'), ebgp_if_sensitive=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), reflect_chg_path=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), add_path_sel_num=dict(type='str'), route_sel_delay=dict(type='str'), allow_invalid_as=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), policy_ext_comm_enable=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), supernet_uni_adv=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), supernet_label_adv=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), ingress_lsp_policy_name=dict(type='str'), originator_prior=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), lowest_priority=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), relay_delay_enable=dict(type='str', default='no_use', choices=['no_use', 'true', 'false']), import_protocol=dict( choices=['direct', 'ospf', 'isis', 'static', 'rip', 'ospfv3', 'ripng']), import_process_id=dict(type='str'), network_address=dict(type='str'), mask_len=dict(type='str')) 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'] af_type = module.params['af_type'] max_load_ibgp_num = module.params['max_load_ibgp_num'] ibgp_ecmp_nexthop_changed = module.params['ibgp_ecmp_nexthop_changed'] max_load_ebgp_num = module.params['max_load_ebgp_num'] ebgp_ecmp_nexthop_changed = module.params['ebgp_ecmp_nexthop_changed'] maximum_load_balance = module.params['maximum_load_balance'] ecmp_nexthop_changed = module.params['ecmp_nexthop_changed'] default_local_pref = module.params['default_local_pref'] default_med = module.params['default_med'] default_rt_import_enable = module.params['default_rt_import_enable'] router_id = module.params['router_id'] vrf_rid_auto_sel = module.params['vrf_rid_auto_sel'] nexthop_third_party = module.params['nexthop_third_party'] summary_automatic = module.params['summary_automatic'] auto_frr_enable = module.params['auto_frr_enable'] load_balancing_as_path_ignore = module.params[ 'load_balancing_as_path_ignore'] rib_only_enable = module.params['rib_only_enable'] rib_only_policy_name = module.params['rib_only_policy_name'] active_route_advertise = module.params['active_route_advertise'] as_path_neglect = module.params['as_path_neglect'] med_none_as_maximum = module.params['med_none_as_maximum'] router_id_neglect = module.params['router_id_neglect'] igp_metric_ignore = module.params['igp_metric_ignore'] always_compare_med = module.params['always_compare_med'] determin_med = module.params['determin_med'] preference_external = module.params['preference_external'] preference_internal = module.params['preference_internal'] preference_local = module.params['preference_local'] prefrence_policy_name = module.params['prefrence_policy_name'] reflect_between_client = module.params['reflect_between_client'] reflector_cluster_id = module.params['reflector_cluster_id'] reflector_cluster_ipv4 = module.params['reflector_cluster_ipv4'] rr_filter_number = module.params['rr_filter_number'] policy_vpn_target = module.params['policy_vpn_target'] next_hop_sel_depend_type = module.params['next_hop_sel_depend_type'] nhp_relay_route_policy_name = module.params['nhp_relay_route_policy_name'] ebgp_if_sensitive = module.params['ebgp_if_sensitive'] reflect_chg_path = module.params['reflect_chg_path'] add_path_sel_num = module.params['add_path_sel_num'] route_sel_delay = module.params['route_sel_delay'] allow_invalid_as = module.params['allow_invalid_as'] policy_ext_comm_enable = module.params['policy_ext_comm_enable'] supernet_uni_adv = module.params['supernet_uni_adv'] supernet_label_adv = module.params['supernet_label_adv'] ingress_lsp_policy_name = module.params['ingress_lsp_policy_name'] originator_prior = module.params['originator_prior'] lowest_priority = module.params['lowest_priority'] relay_delay_enable = module.params['relay_delay_enable'] import_protocol = module.params['import_protocol'] import_process_id = module.params['import_process_id'] network_address = module.params['network_address'] mask_len = module.params['mask_len'] ce_bgp_af_obj = BgpAf() if not ce_bgp_af_obj: module.fail_json(msg='Error: Init module failed.') # get proposed proposed["state"] = state if vrf_name: proposed["vrf_name"] = vrf_name if af_type: proposed["af_type"] = af_type if max_load_ibgp_num: proposed["max_load_ibgp_num"] = max_load_ibgp_num if ibgp_ecmp_nexthop_changed != 'no_use': proposed["ibgp_ecmp_nexthop_changed"] = ibgp_ecmp_nexthop_changed if max_load_ebgp_num: proposed["max_load_ebgp_num"] = max_load_ebgp_num if ebgp_ecmp_nexthop_changed != 'no_use': proposed["ebgp_ecmp_nexthop_changed"] = ebgp_ecmp_nexthop_changed if maximum_load_balance: proposed["maximum_load_balance"] = maximum_load_balance if ecmp_nexthop_changed != 'no_use': proposed["ecmp_nexthop_changed"] = ecmp_nexthop_changed if default_local_pref: proposed["default_local_pref"] = default_local_pref if default_med: proposed["default_med"] = default_med if default_rt_import_enable != 'no_use': proposed["default_rt_import_enable"] = default_rt_import_enable if router_id: proposed["router_id"] = router_id if vrf_rid_auto_sel != 'no_use': proposed["vrf_rid_auto_sel"] = vrf_rid_auto_sel if nexthop_third_party != 'no_use': proposed["nexthop_third_party"] = nexthop_third_party if summary_automatic != 'no_use': proposed["summary_automatic"] = summary_automatic if auto_frr_enable != 'no_use': proposed["auto_frr_enable"] = auto_frr_enable if load_balancing_as_path_ignore != 'no_use': proposed["load_balancing_as_path_ignore"] = load_balancing_as_path_ignore if rib_only_enable != 'no_use': proposed["rib_only_enable"] = rib_only_enable if rib_only_policy_name: proposed["rib_only_policy_name"] = rib_only_policy_name if active_route_advertise != 'no_use': proposed["active_route_advertise"] = active_route_advertise if as_path_neglect != 'no_use': proposed["as_path_neglect"] = as_path_neglect if med_none_as_maximum != 'no_use': proposed["med_none_as_maximum"] = med_none_as_maximum if router_id_neglect != 'no_use': proposed["router_id_neglect"] = router_id_neglect if igp_metric_ignore != 'no_use': proposed["igp_metric_ignore"] = igp_metric_ignore if always_compare_med != 'no_use': proposed["always_compare_med"] = always_compare_med if determin_med != 'no_use': proposed["determin_med"] = determin_med if preference_external: proposed["preference_external"] = preference_external if preference_internal: proposed["preference_internal"] = preference_internal if preference_local: proposed["preference_local"] = preference_local if prefrence_policy_name: proposed["prefrence_policy_name"] = prefrence_policy_name if reflect_between_client != 'no_use': proposed["reflect_between_client"] = reflect_between_client if reflector_cluster_id: proposed["reflector_cluster_id"] = reflector_cluster_id if reflector_cluster_ipv4: proposed["reflector_cluster_ipv4"] = reflector_cluster_ipv4 if rr_filter_number: proposed["rr_filter_number"] = rr_filter_number if policy_vpn_target != 'no_use': proposed["policy_vpn_target"] = policy_vpn_target if next_hop_sel_depend_type: proposed["next_hop_sel_depend_type"] = next_hop_sel_depend_type if nhp_relay_route_policy_name: proposed["nhp_relay_route_policy_name"] = nhp_relay_route_policy_name if ebgp_if_sensitive != 'no_use': proposed["ebgp_if_sensitive"] = ebgp_if_sensitive if reflect_chg_path != 'no_use': proposed["reflect_chg_path"] = reflect_chg_path if add_path_sel_num: proposed["add_path_sel_num"] = add_path_sel_num if route_sel_delay: proposed["route_sel_delay"] = route_sel_delay if allow_invalid_as != 'no_use': proposed["allow_invalid_as"] = allow_invalid_as if policy_ext_comm_enable != 'no_use': proposed["policy_ext_comm_enable"] = policy_ext_comm_enable if supernet_uni_adv != 'no_use': proposed["supernet_uni_adv"] = supernet_uni_adv if supernet_label_adv != 'no_use': proposed["supernet_label_adv"] = supernet_label_adv if ingress_lsp_policy_name: proposed["ingress_lsp_policy_name"] = ingress_lsp_policy_name if originator_prior != 'no_use': proposed["originator_prior"] = originator_prior if lowest_priority != 'no_use': proposed["lowest_priority"] = lowest_priority if relay_delay_enable != 'no_use': proposed["relay_delay_enable"] = relay_delay_enable if import_protocol: proposed["import_protocol"] = import_protocol if import_process_id: proposed["import_process_id"] = import_process_id if network_address: proposed["network_address"] = network_address if mask_len: proposed["mask_len"] = mask_len bgp_af_rst = ce_bgp_af_obj.check_bgp_af_args(module=module) bgp_af_other_rst = ce_bgp_af_obj.check_bgp_af_other_args(module=module) bgp_af_other_can_del_rst = ce_bgp_af_obj.check_bgp_af_other_can_del( module=module) bgp_import_network_route_rst = ce_bgp_af_obj.check_bgp_import_network_route( module=module) # state exist bgp address family config exist_tmp = dict() for item in bgp_af_rst: if item != "need_cfg": exist_tmp[item] = bgp_af_rst[item] if exist_tmp: existing["bgp af"] = exist_tmp # state exist bgp address family other config exist_tmp = dict() for item in bgp_af_other_rst: if item != "need_cfg": exist_tmp[item] = bgp_af_other_rst[item] if exist_tmp: existing["bgp af other"] = exist_tmp # state exist bgp import route config exist_tmp = dict() for item in bgp_import_network_route_rst: if item != "need_cfg": exist_tmp[item] = bgp_import_network_route_rst[item] if exist_tmp: existing["bgp import & network route"] = exist_tmp if state == "present": if bgp_af_rst["need_cfg"] and bgp_import_network_route_rst["import_need_cfg"] and \ bgp_import_network_route_rst["network_need_cfg"]: changed = True if "af_type" in bgp_af_rst.keys(): conf_str = CE_MERGE_BGP_ADDRESS_FAMILY_HEADER % ( vrf_name, af_type) else: conf_str = CE_CREATE_BGP_ADDRESS_FAMILY_HEADER % ( vrf_name, af_type) if "bgp_import_route" in bgp_import_network_route_rst.keys(): conf_str += CE_BGP_MERGE_IMPORT_UNIT % ( import_protocol, import_process_id) else: conf_str += CE_BGP_CREATE_IMPORT_UNIT % ( import_protocol, import_process_id) if "bgp_network_route" in bgp_import_network_route_rst.keys(): conf_str += CE_BGP_MERGE_NETWORK_UNIT % ( network_address, mask_len) else: conf_str += CE_BGP_CREATE_NETWORK_UNIT % ( network_address, mask_len) conf_str += CE_MERGE_BGP_ADDRESS_FAMILY_TAIL recv_xml = ce_bgp_af_obj.netconf_set_config( module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json( msg='Error: Present bgp af_type import and network route failed.') cmd = "import-route %s %s" % (import_protocol, import_process_id) updates.append(cmd) cmd = "network %s %s" % (network_address, mask_len) updates.append(cmd) elif bgp_import_network_route_rst["import_need_cfg"] and bgp_import_network_route_rst["network_need_cfg"]: changed = True conf_str = CE_BGP_IMPORT_NETWORK_ROUTE_HEADER % (vrf_name, af_type) if "bgp_import_route" in bgp_import_network_route_rst.keys(): conf_str += CE_BGP_MERGE_IMPORT_UNIT % ( import_protocol, import_process_id) else: conf_str += CE_BGP_CREATE_IMPORT_UNIT % ( import_protocol, import_process_id) if "bgp_network_route" in bgp_import_network_route_rst.keys(): conf_str += CE_BGP_MERGE_NETWORK_UNIT % ( network_address, mask_len) else: conf_str += CE_BGP_CREATE_NETWORK_UNIT % ( network_address, mask_len) conf_str += CE_BGP_IMPORT_NETWORK_ROUTE_TAIL recv_xml = ce_bgp_af_obj.netconf_set_config( module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json( msg='Error: Present bgp import and network route failed.') cmd = "import-route %s %s" % (import_protocol, import_process_id) updates.append(cmd) cmd = "network %s %s" % (network_address, mask_len) updates.append(cmd) else: if bgp_af_rst["need_cfg"]: if "af_type" in bgp_af_rst.keys(): cmd = ce_bgp_af_obj.merge_bgp_af(module=module) changed = True for item in cmd: updates.append(item) else: cmd = ce_bgp_af_obj.create_bgp_af(module=module) changed = True for item in cmd: updates.append(item) if bgp_af_other_rst["need_cfg"]: cmd = ce_bgp_af_obj.merge_bgp_af_other(module=module) changed = True for item in cmd: updates.append(item) if bgp_import_network_route_rst["import_need_cfg"]: if "bgp_import_route" in bgp_import_network_route_rst.keys(): cmd = ce_bgp_af_obj.merge_bgp_import_route(module=module) changed = True for item in cmd: updates.append(item) else: cmd = ce_bgp_af_obj.create_bgp_import_route(module=module) changed = True for item in cmd: updates.append(item) if bgp_import_network_route_rst["network_need_cfg"]: if "bgp_network_route" in bgp_import_network_route_rst.keys(): cmd = ce_bgp_af_obj.merge_bgp_network_route(module=module) changed = True for item in cmd: updates.append(item) else: cmd = ce_bgp_af_obj.create_bgp_network_route(module=module) changed = True for item in cmd: updates.append(item) else: if bgp_import_network_route_rst["import_need_cfg"] and bgp_import_network_route_rst["network_need_cfg"]: changed = True conf_str = CE_BGP_IMPORT_NETWORK_ROUTE_HEADER % (vrf_name, af_type) conf_str += CE_BGP_DELETE_IMPORT_UNIT % ( import_protocol, import_process_id) conf_str += CE_BGP_DELETE_NETWORK_UNIT % ( network_address, mask_len) conf_str += CE_BGP_IMPORT_NETWORK_ROUTE_TAIL recv_xml = ce_bgp_af_obj.netconf_set_config( module=module, conf_str=conf_str) if "" not in recv_xml: module.fail_json( msg='Error: Absent bgp import and network route failed.') cmd = "undo import-route %s %s" % (import_protocol, import_process_id) updates.append(cmd) cmd = "undo network %s %s" % (network_address, mask_len) updates.append(cmd) else: if bgp_import_network_route_rst["import_need_cfg"]: cmd = ce_bgp_af_obj.delete_bgp_import_route(module=module) changed = True for item in cmd: updates.append(item) if bgp_import_network_route_rst["network_need_cfg"]: cmd = ce_bgp_af_obj.delete_bgp_network_route(module=module) changed = True for item in cmd: updates.append(item) if bgp_af_other_can_del_rst["need_cfg"]: cmd = ce_bgp_af_obj.delete_bgp_af_other(module=module) changed = True for item in cmd: updates.append(item) if bgp_af_rst["need_cfg"] and not bgp_af_other_can_del_rst["need_cfg"]: cmd = ce_bgp_af_obj.delete_bgp_af(module=module) changed = True for item in cmd: updates.append(item) if bgp_af_other_rst["need_cfg"]: pass # state end bgp address family config bgp_af_rst = ce_bgp_af_obj.check_bgp_af_args(module=module) end_tmp = dict() for item in bgp_af_rst: if item != "need_cfg": end_tmp[item] = bgp_af_rst[item] if end_tmp: end_state["bgp af"] = end_tmp # state end bgp address family other config bgp_af_other_rst = ce_bgp_af_obj.check_bgp_af_other_args(module=module) end_tmp = dict() for item in bgp_af_other_rst: if item != "need_cfg": end_tmp[item] = bgp_af_other_rst[item] if end_tmp: end_state["bgp af other"] = end_tmp # state end bgp import route config bgp_import_network_route_rst = ce_bgp_af_obj.check_bgp_import_network_route( module=module) end_tmp = dict() for item in bgp_import_network_route_rst: if item != "need_cfg": end_tmp[item] = bgp_import_network_route_rst[item] if end_tmp: end_state["bgp import & network route"] = end_tmp if end_state == existing: changed = False updates = list() results = dict() results['proposed'] = proposed results['existing'] = existing results['changed'] = changed results['end_state'] = end_state results['updates'] = updates module.exit_json(**results) if __name__ == '__main__': main()