#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright 2021 Red Hat
# GNU General Public License v3.0+
# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

"""
The module file for iosxr_bgp_address_family
"""

from __future__ import absolute_import, division, print_function

__metaclass__ = type

DOCUMENTATION = """
module: iosxr_bgp_address_family
short_description: Manages BGP Address Family resource module.
description:
- This module configures and manages the attributes of BGP address family on Cisco IOS-XR platforms.
version_added: 2.0.0
author: <NAME> (@amhatre)
notes:
- This module works with connection C(network_cli).
options:
    config:
      description: A list of configurations for BGP address family.
      type: dict
      suboptions:
        as_number:
          description: Autonomous system number.
          type: str
        address_family:
          description: Enable address family and enter its config mode
          type: list
          elements: dict
          suboptions:
            afi:
              description: address family.
              type: str
              choices: ['ipv4', 'ipv6', 'l2vpn', 'link-state', 'vpnv4', 'vpnv6']
            safi:
              description: Address Family modifier
              type: str
              choices: [ 'flowspec', 'mdt', 'multicast', 'mvpn', 'rt-filter', 'tunnel', 'unicast', 'evpn', 'mspw', 'vpls-vpws', 'link-state' ]
            vrf:
              description: VRF name.
              type: str
            additional_paths: &additional_paths
              description: BGP additional-paths commands
              type: str
              choices: [ 'send', 'receive' ]
            advertise_best_external: &advertise
              description: Advertise best-external path.
              type: bool
            aggregate_address:
              description: Configure BGP aggregate entries.
              type: list
              elements: dict
              suboptions:
                value:
                  type: str
                  description: IPv4 Aggregate address and mask or masklength.
                as_set:
                  type: bool
                  description: Generate AS set path information.
                as_confed_set:
                  type: bool
                  description: Generate AS confed set path information.
                summary_only:
                  type: bool
                  description: Filter more specific routes from updates.
                route_policy:
                  description: Policy to condition advertisement, suppression, and attributes.
                  type: str
            allocate_label:
              type: dict
              description: Allocate labels.
              suboptions:
                all:
                  type: bool
                  description:  Allocate labels for all prefixes.
                route_policy:
                  description: Use a route policy to select prefixes for label allocation.
                  type: str
            as_path_loopcheck_out_disable:
              type: bool
              description: Configure AS Path loop checking for outbound updates.
            bgp:
              type: dict
              description: BGP Commands.
              suboptions:
                attribute_download: &attribute_download
                  type: bool
                  description: Configure attribute download for this address-family.
                bestpath:
                  type: dict
                  description: Change default route selection criteria.
                  suboptions:
                    origin_as:
                      description: BGP origin-AS knobs.
                      type: dict
                      suboptions:
                        use:
                          description: BGP origin-AS knobs.
                          type: dict
                          suboptions:
                            validity:
                              description: BGP bestpath selection will use origin-AS validity
                              type: bool
                        allow:
                          description: BGP origin-AS knobs.
                          type: dict
                          suboptions:
                            invalid:
                              description: BGP bestpath selection will allow 'invalid' origin-AS
                              type: bool
                client_to_client:
                  type: dict
                  description: Configure client to client route reflection.
                  suboptions:
                    reflection:
                      type: dict
                      description: disable client to client reflection of cluster id.
                      suboptions:
                        cluster_id_disable:
                          type: dict
                          description: ID of Cluster for which reflection is to be disabled.
                          suboptions:
                            cluster_id:
                              type: str
                              description: ID of Cluster for which reflection is to be disabled.
                            disable:
                              type: bool
                              description: disable cluster id.
                        disable:
                          type: bool
                          description: disable reflection.
                dampening:
                  type: dict
                  description: Enable route-flap dampening
                  suboptions:
                    set:
                      type: bool
                      description: Enable dampening.
                    value:
                      type: int
                      description: Half-life time for the penalty
                    route_policy:
                      description: Route policy to specify criteria for dampening.
                      type: str
                label_delay:
                  type: dict
                  description: Specify delay for batching label processing
                  suboptions:
                    delay_second_parts:
                      type: int
                      description: Delay, seconds part <0-10>.
                    delay_ms_parts:
                      type: int
                      description: milliseconds part <0-999>.
                import_delay:
                  type: dict
                  description: Specify delay for batching import processing.
                  suboptions:
                    delay_second_parts:
                      type: int
                      description: Delay, seconds part <0-10>.
                    delay_ms_parts:
                      type: int
                      description: milliseconds part <0-999>.
                origin_as:
                  description: BGP origin-AS knobs.
                  type: dict
                  suboptions:
                    validation:
                      description: BGP origin-AS validation knobs.
                      type: dict
                      suboptions:
                        disable:
                          description: Disable RPKI origin-AS validation.
                          type: bool
                        signal:
                          description: Signal origin-AS validity towards peers.
                          type: dict
                          suboptions:
                            ibgp:
                              description: Signal origin-AS validity towards iBGP peers
                              type: bool
                scan_time:
                  description: Configure background scanner interval for this address-family Example- <5-3600>.
                  type: int
            default_martian_check_disable:
              type: bool
              description: Martian check default
            distance: &distance
              type: dict
              description: Define an administrative distance.
              suboptions:
                routes_external_to_as:
                  type: int
                  description: Distance for routes external to the AS <1-255>.
                routes_internal_to_as:
                  type: int
                  description: Distance for routes internal to the AS <1-255>.
                local_routes:
                  type: int
                  description: Distance for local routes <1-255>.
            dynamic_med:
              type: int
              description: Dynamic MED Interval.
            maximum_paths:
              type: dict
              description: Forward packets over multiple paths.
              suboptions:
                ibgp:
                  type: dict
                  description: iBGP-multipath.
                  suboptions:
                    max_path_value:
                      type: int
                      description: <2-64>  Number of paths (limit includes backup path).
                    order_igp_metric:
                      description: Order candidate multipaths for selection as per configured number(cisco-support).
                      type: bool
                    selective_order_igp_metric:
                      description: Allow multipaths only from marked neighbors
                      type: bool
                    unequal_cost:
                      type: dict
                      description: Allow multipaths to have different BGP nexthop IGP metrics.
                      suboptions:
                        set:
                          type: bool
                          description: set unequal_cost.
                        order_igp_metric:
                          description: Order candidate multipaths for selection as per configured number(cisco-support).
                          type: bool
                        selective_order_igp_metric:
                          description: Allow multipaths only from marked neighbors
                          type: bool
                ebgp:
                  type: dict
                  description: ebgp-multipath.
                  suboptions:
                    max_path_value:
                      type: int
                      description: <2-64>  Number of paths (limit includes backup path).
                    order_igp_metric:
                      description: Order candidate multipaths for selection as per configured number(cisco-support).
                      type: bool
                    selective_order_igp_metric:
                      description: Allow multipaths only from marked neighbors
                      type: bool
                eibgp:
                  type: dict
                  description: eiBGP-multipath.
                  suboptions:
                    max_path_value:
                      type: int
                      description: <2-64>  Number of paths (limit includes backup path).
                    order_igp_metric:
                      description: Order candidate multipaths for selection as per configured number(cisco-support).
                      type: bool
                    selective_order_igp_metric:
                      description: Allow multipaths only from marked neighbors
                      type: bool
            networks:
              type: list
              description: Specify a network to announce via BGP.
              elements: dict
              suboptions:
                network:
                  type: str
                  description: Specify a network to announce via BGP.
                backdoor_route_policy:
                  type: str
                  description: Specify a BGP backdoor route.
                route_policy:
                  type: str
                  description: Route-policy to modify the attributes.
            nexthop:
              type: dict
              description: Nexthop
              suboptions:
                resolution_prefix_length_minimum:
                  type: int
                  description: Set minimum prefix-length for nexthop resolution.
                  choices: [0,32]
                route_policy:
                  type: str
                  description: Policy to filter out nexthop notification.
                trigger_delay_critical:
                  description: For critical notification
                  type: int
                trigger_delay_non_critical:
                  type: int
                  description: For non critical notification.
            optimal_route_reflection:
              type: dict
              description: Configure optimal-route-reflection group.
              suboptions:
                group_name:
                  type: str
                  description: ORR group name - maximum 32 characters.
                primary_address:
                  type: str
                  description: IPv4 primary address.
                secondary_address:
                  type: str
                  description: IPv4 secondary address
            permanent_network_route_policy:
              type: str
              description: Name of the policy.
            retain_local_label:
              type: int
              description: Label retention time in minutes <3-60>.
            table_policy:
              type: str
              description: Configure policy for installation of routes to RIB.
            update:
              type: dict
              description: BGP Update generation configuration.
              suboptions:
                limit:
                  type: dict
                  description: Update limit.
                  suboptions:
                    sub_group:
                      type: dict
                      description: Update limit for address-family.
                      suboptions:
                        ibgp:
                          type: int
                          description: Update limit for iBGP sub-groups<1-512.
                        ebgp:
                          type: int
                          description: Update limit for eBGP sub-groups<1-512.
                    address_family:
                      type: int
                      description: Update limit for sub-groups.
                wait_install:
                  type: bool
                  description: Wait for route install.
            redistribute:
              type: list
              elements: dict
              description: Redistribute information from another routing protocol.
              suboptions:
                protocol:
                  description: Specifies the protocol for configuring redistribute information.
                  type: str
                  choices:
                    - ospf
                    - application
                    - eigrp
                    - isis
                    - static
                    - connected
                    - lisp
                    - mobile
                    - rip
                    - subscriber
                  required: true
                id:
                  type: str
                  description:
                    - Identifier for the routing protocol for configuring redistribute
                      information. Example-application name, eigrp/is-is instance name, ospf tag
                    - Valid for protocols 'ospf', 'eigrp', 'isis' and 'application'.
                metric:
                  description:
                    - Specifies the metric for redistributed routes.
                  type: int
                route_policy:
                    description:
                      - Specifies the route policy reference.
                    type: str
                internal:
                  type: bool
                  description: Redistribute EIGRP internal routes.applicable for eigrp.
                external:
                  type: bool
                  description: Redistribute EIGRP external routes.applicable for eigrp.
                level:
                  type: str
                  description:
                    - Redistribute routes from the specified ISIS levels.
                    - Redistribute ISIS level 1 routes
                    - Redistribute ISIS level 1 inter-area routes
                    - Redistribute ISIS level 2 ISIS routes
                  choices: [ '1', '2', '1-inter-area' ]
                nssa_external:
                  type: bool
                  description: Redistribute OSPF NSSA external routes.applicable for ospf.
                external_ospf:
                    type: int
                    description: Redistribute OSPF external routes.applicable for ospf.
                    choices: [ 1, 2 ]
            inter_as_install:
              type: bool
              description: Install remote mvpn routes in default vrf.This is applicable for mvpn afi.
            segmented_multicast:
              type: bool
              description:  Enable segmented multicast.This is applicable for mvpn afi.
            global_table_multicast:
              type: bool
              description: Enable global table multicast.
            vrf_all_conf:
              type: dict
              description: configuration is for all vrfs and its applicable for afi vpn6 and modifier unicast.
              suboptions:
                source_rt_import_policy:
                  type: bool
                  description: Source import route-targets from import-policy.
                table_policy:
                  type: str
                  description: Configure policy for installation of routes to RIB.
                label_mode:
                  type: dict
                  description: Label-related configuration.
                  suboptions:
                    per_ce: &per_ce
                      type: bool
                      description: Set per CE label mode
                    per_vrf: &per_vrf
                      type: bool
                      description: Set per VRF label mode.
                    route_policy: &route_policy
                      type: str
                      description: Use a route policy to select prefixes for label allocation mode.
            weight: &wt
              type: dict
              description: Define or modify weight.
              suboptions:
                reset_on_import_disable:
                  type: bool
                  description: disable reset_on_import.
                reset_on_import:
                  type: bool
                  description: set reset_on_import.
            allow_vpn_default_originate:
              type: bool
              description: Allow sending default originate route to VPN neighbor.
            label_mode:
              type: dict
              description: label configuration.
              suboptions:
                per_ce: *per_ce
                per_vrf: *per_vrf
                route_policy: *route_policy
                per_prefix:
                  type: bool
                  description: Set per perfix label mode.
            mvpn_single_forwarder_selection_all:
              type: bool
              description: Enable single forwarder selection  for all
            mvpn_single_forwarder_selection_highest_ip_address:
              type: bool
              description: Enable single forwarder selection  for PE with highest ip address.
            route_target_download:
              description: Route target RIB installation.
              type: bool
    running_config:
      description:
      - This option is used only with state I(parsed).
      - The value of this option should be the output received from the Iosxr device by
        executing the command B(show running-config router bgp).
      - The state I(parsed) reads the configuration from C(running_config) option and
        transforms it into Ansible structured data as per the resource module's argspec
        and the value is then returned in the I(parsed) key within the result.
      type: str
    state:
      description:
      - The state the configuration should be left in.
      type: str
      choices: [deleted, merged, overridden, replaced, gathered, rendered, parsed]
      default: merged
"""
EXAMPLES = """
# Using merged
# Before state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 192.0.2.1
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
- name: Merge the provided configuration with the existing running configuration
  cisco.iosxr.iosxr_bgp_address_family:
    state: merged
    config:
      as_number: "65536"
      address_family:
        - afi: "ipv4"
          safi: "unicast"
          vrf: vrf1
          dynamic_med: 9
          redistribute:
            - protocol: connected
              metric: 10
        - afi: "ipv4"
          safi: "unicast"
          dynamic_med: 10
          redistribute:
            - protocol: application
              id: test1
              metric: 10
          bgp:
            scan_time: 20
            attribute_download: true
          advertise_best_external: true
          allocate_label:
            all: true
# Task output
# -------------
# commands:
# - router bgp 65536
# - address-family ipv4 unicast
# - advertise best-external
# - allocate-label all
# - bgp attribute-download
# - bgp scan-time 20
# - dynamic-med interval 10
# - redistribute application test1 metric 10
# - vrf vrf1
# - address-family ipv4 unicast
# - dynamic-med interval 9
# - redistribute connected metric 10
#
#
# after:
#   as_number: "65536"
#   address_family:
#     - afi: "ipv4"
#       safi: "unicast"
#       vrf: vrf1
#       dynamic_med: 9
#       redistribute:
#         - protocol: connected
#           metric: 10
#     - afi: "ipv4"
#       safi: "unicast"
#       dynamic_med: 10
#       redistribute:
#         - protocol: application
#           id: "test1"
#           metric: 10
#       bgp:
#         scan_time: 20
#         attribute_download: true
#       advertise_best_external: true
#       allocate_label:
#         all: true
#
# After state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family ipv4 unicast
#    advertise best-external
#    allocate-label all
#    bgp attribute-download
#    bgp scan-time 20
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#   address-family ipv4 unicast
#     dynamic-med interval 9
#     redistribute connected metric 10
#
# Using replaced
# Before state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family ipv4 unicast
#    advertise best-external
#    allocate-label all
#    bgp attribute-download
#    bgp scan-time 20
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#   address-family ipv4 unicast
#     dynamic-med interval 9
#     redistribute connected metric 10
#
#
- name: Replace the provided configuration with the existing running configuration
  cisco.iosxr.iosxr_bgp_address_family:
    state: replaced
    config:
      as_number: "65536"
      address_family:
        - afi: "ipv4"
          safi: "unicast"
          vrf: vrf1
          dynamic_med: 10
# Task output
# -------------
# commands:
# - router bgp 65536
# - vrf vrf1
# - address-family ipv4 unicast
# - dynamic-med interval 10
# - no redistribute connected metric 10
#
# after:
#   as_number: "65536"
#   address_family:
#     - afi: "ipv4"
#       safi: "unicast"
#       vrf: vrf1
#       dynamic_med: 10
#     - afi: "ipv4"
#       safi: "unicast"
#       dynamic_med: 10
#       redistribute:
#         - protocol: application
#           id: "test1"
#           metric: 10
#       bgp:
#         scan_time: 20
#         attribute_download: true
#       advertise_best_external: true
#       allocate_label:
#         all: true
# After state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family ipv4 unicast
#    advertise best-external
#    allocate-label all
#    bgp attribute-download
#    bgp scan-time 20
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#   address-family ipv4 unicast
#     dynamic-med interval 10
#
#
# Using overridden
# Before state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family ipv4 unicast
#    advertise best-external
#    allocate-label all
#    bgp attribute-download
#    bgp scan-time 20
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#   address-family ipv4 unicast
#     dynamic-med interval 9
#     redistribute connected metric 10
#
#
- name: Override the provided configuration with the existing running configuration
  cisco.iosxr.iosxr_bgp_address_family:
    state: overridden
    config:
      as_number: "65536"
      address_family:
        - afi: "ipv4"
          safi: "unicast"
          vrf: vrf1
          dynamic_med: 10

# Task output
# -------------
# commands:
# - router bgp 65536
# - no address-family ipv4 unicast
# - vrf vrf1
# - address-family ipv4 unicast
# - dynamic-med interval 10
# - no redistribute connected metric 10
#
#
# after:
#   as_number: "65536"
#   address_family:
#     - afi: "ipv4"
#       safi: "unicast"
#       vrf: vrf1
#       dynamic_med: 10
#
# After state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#   address-family ipv4 unicast
#     dynamic-med interval 10
#
#
# Using deleted
# Before state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family ipv4 unicast
#    advertise best-external
#    allocate-label all
#    bgp attribute-download
#    bgp scan-time 20
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#   address-family ipv4 unicast
#     dynamic-med interval 9
#     redistribute connected metric 10
#
#
- name: Delete the provided configuration
  cisco.iosxr.iosxr_bgp_address_family:
    state: deleted
    config:

# Task output
# -------------
# commands:
# - router bgp 65536
# - no address-family ipv4 unicast
# - vrf vrf1
# - no address-family ipv4 unicast
#
#
# after:
#   as_number: "65536"
#
#
# After state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#
# Using rendered
# -------------
#
- name: rendered state example
  cisco.iosxr.iosxr_bgp_address_family:
    state: rendered
    config:
      as_number: "65536"
      address_family:
        - afi: "ipv4"
          safi: "unicast"
          vrf: vrf1
          dynamic_med: 9
          redistribute:
            - protocol: connected
              metric: 10
        - afi: "ipv4"
          safi: "unicast"
          dynamic_med: 10
          redistribute:
            - protocol: application
              id: test1
              metric: 10
          bgp:
            scan_time: 20
            attribute_download: true
          advertise_best_external: true
          allocate_label:
            all: true
# Task output
# -------------
# commands:
# - router bgp 65536
# - address-family ipv4 unicast
# - advertise best-external
# - allocate-label all
# - bgp attribute-download
# - bgp scan-time 20
# - dynamic-med interval 10
# - redistribute application test1 metric 10
# - vrf vrf1
# - address-family ipv4 unicast
# - dynamic-med interval 9
# - redistribute connected metric 10
#
# Using gathered
# -------------
- name: Merge the provided configuration with the existing running configuration
  cisco.iosxr.iosxr_bgp_address_family:
    state: gathered
    config:
      as_number: "65536"
      address_family:
        - afi: "ipv4"
          safi: "unicast"
          vrf: vrf1
          dynamic_med: 9
          redistribute:
            - protocol: connected
              metric: 10
        - afi: "ipv4"
          safi: "unicast"
          dynamic_med: 10
          redistribute:
            - protocol: application
              id: test1
              metric: 10
          bgp:
            scan_time: 20
            attribute_download: true
          advertise_best_external: true
          allocate_label:
            all: true
# gathered:
#   as_number: "65536"
#   address_family:
#     - afi: "ipv4"
#       safi: "unicast"
#       vrf: vrf1
#       dynamic_med: 9
#       redistribute:
#         - protocol: connected
#           metric: 10
#     - afi: "ipv4"
#       safi: "unicast"
#       dynamic_med: 10
#       redistribute:
#         - protocol: application
#           id: "test1"
#           metric: 10
#       bgp:
#         scan_time: 20
#         attribute_download: true
#       advertise_best_external: true
#       allocate_label:
#         all: true
#
# Using parsed
#
#parsed.cfg
#------------
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family ipv4 unicast
#    advertise best-external
#    allocate-label all
#    bgp attribute-download
#    bgp scan-time 20
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#   address-family ipv4 unicast
#     dynamic-med interval 9
#     redistribute connected metric 10
#
- name: Parse externally provided BGP neighbor AF config
  cisco.iosxr.iosxr_bgp_address_family:
    running_config: "{{ lookup('file', 'parsed.cfg') }}"
    state: parsed

# Task output (redacted)
# -----------------------
# parsed:
#   as_number: "65536"
#   address_family:
#     - afi: "ipv4"
#       safi: "unicast"
#       vrf: vrf1
#       dynamic_med: 9
#       redistribute:
#         - protocol: connected
#           metric: 10
#     - afi: "ipv4"
#       safi: "unicast"
#       dynamic_med: 10
#       redistribute:
#         - protocol: application
#           id: "test1"
#           metric: 10
#       bgp:
#         scan_time: 20
#         attribute_download: true
#       advertise_best_external: true
#       allocate_label:
#         all: true
"""

from ansible.module_utils.basic import AnsibleModule
from ansible_collections.cisco.iosxr.plugins.module_utils.network.iosxr.argspec.bgp_address_family.bgp_address_family import (
    Bgp_address_familyArgs,
)
from ansible_collections.cisco.iosxr.plugins.module_utils.network.iosxr.config.bgp_address_family.bgp_address_family import (
    Bgp_address_family,
)


def main():
    """
    Main entry point for module execution

    :returns: the result form module invocation
    """
    module = AnsibleModule(
        argument_spec=Bgp_address_familyArgs.argument_spec,
        mutually_exclusive=[["config", "running_config"]],
        required_if=[
            ["state", "merged", ["config"]],
            ["state", "replaced", ["config"]],
            ["state", "overridden", ["config"]],
            ["state", "rendered", ["config"]],
            ["state", "parsed", ["running_config"]],
        ],
        supports_check_mode=True,
    )

    result = Bgp_address_family(module).execute_module()
    module.exit_json(**result)


if __name__ == "__main__":
    main()

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright 2021 Red Hat
# GNU General Public License v3.0+
# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

"""
The module file for iosxr_bgp_address_family
"""

from __future__ import absolute_import, division, print_function

__metaclass__ = type

DOCUMENTATION = """
module: iosxr_bgp_address_family
short_description: Manages BGP Address Family resource module.
description:
- This module configures and manages the attributes of BGP address family on Cisco IOS-XR platforms.
version_added: 2.0.0
author: <NAME> (@amhatre)
notes:
- This module works with connection C(network_cli).
options:
    config:
      description: A list of configurations for BGP address family.
      type: dict
      suboptions:
        as_number:
          description: Autonomous system number.
          type: str
        address_family:
          description: Enable address family and enter its config mode
          type: list
          elements: dict
          suboptions:
            afi:
              description: address family.
              type: str
              choices: ['ipv4', 'ipv6', 'l2vpn', 'link-state', 'vpnv4', 'vpnv6']
            safi:
              description: Address Family modifier
              type: str
              choices: [ 'flowspec', 'mdt', 'multicast', 'mvpn', 'rt-filter', 'tunnel', 'unicast', 'evpn', 'mspw', 'vpls-vpws', 'link-state' ]
            vrf:
              description: VRF name.
              type: str
            additional_paths: &additional_paths
              description: BGP additional-paths commands
              type: str
              choices: [ 'send', 'receive' ]
            advertise_best_external: &advertise
              description: Advertise best-external path.
              type: bool
            aggregate_address:
              description: Configure BGP aggregate entries.
              type: list
              elements: dict
              suboptions:
                value:
                  type: str
                  description: IPv4 Aggregate address and mask or masklength.
                as_set:
                  type: bool
                  description: Generate AS set path information.
                as_confed_set:
                  type: bool
                  description: Generate AS confed set path information.
                summary_only:
                  type: bool
                  description: Filter more specific routes from updates.
                route_policy:
                  description: Policy to condition advertisement, suppression, and attributes.
                  type: str
            allocate_label:
              type: dict
              description: Allocate labels.
              suboptions:
                all:
                  type: bool
                  description:  Allocate labels for all prefixes.
                route_policy:
                  description: Use a route policy to select prefixes for label allocation.
                  type: str
            as_path_loopcheck_out_disable:
              type: bool
              description: Configure AS Path loop checking for outbound updates.
            bgp:
              type: dict
              description: BGP Commands.
              suboptions:
                attribute_download: &attribute_download
                  type: bool
                  description: Configure attribute download for this address-family.
                bestpath:
                  type: dict
                  description: Change default route selection criteria.
                  suboptions:
                    origin_as:
                      description: BGP origin-AS knobs.
                      type: dict
                      suboptions:
                        use:
                          description: BGP origin-AS knobs.
                          type: dict
                          suboptions:
                            validity:
                              description: BGP bestpath selection will use origin-AS validity
                              type: bool
                        allow:
                          description: BGP origin-AS knobs.
                          type: dict
                          suboptions:
                            invalid:
                              description: BGP bestpath selection will allow 'invalid' origin-AS
                              type: bool
                client_to_client:
                  type: dict
                  description: Configure client to client route reflection.
                  suboptions:
                    reflection:
                      type: dict
                      description: disable client to client reflection of cluster id.
                      suboptions:
                        cluster_id_disable:
                          type: dict
                          description: ID of Cluster for which reflection is to be disabled.
                          suboptions:
                            cluster_id:
                              type: str
                              description: ID of Cluster for which reflection is to be disabled.
                            disable:
                              type: bool
                              description: disable cluster id.
                        disable:
                          type: bool
                          description: disable reflection.
                dampening:
                  type: dict
                  description: Enable route-flap dampening
                  suboptions:
                    set:
                      type: bool
                      description: Enable dampening.
                    value:
                      type: int
                      description: Half-life time for the penalty
                    route_policy:
                      description: Route policy to specify criteria for dampening.
                      type: str
                label_delay:
                  type: dict
                  description: Specify delay for batching label processing
                  suboptions:
                    delay_second_parts:
                      type: int
                      description: Delay, seconds part <0-10>.
                    delay_ms_parts:
                      type: int
                      description: milliseconds part <0-999>.
                import_delay:
                  type: dict
                  description: Specify delay for batching import processing.
                  suboptions:
                    delay_second_parts:
                      type: int
                      description: Delay, seconds part <0-10>.
                    delay_ms_parts:
                      type: int
                      description: milliseconds part <0-999>.
                origin_as:
                  description: BGP origin-AS knobs.
                  type: dict
                  suboptions:
                    validation:
                      description: BGP origin-AS validation knobs.
                      type: dict
                      suboptions:
                        disable:
                          description: Disable RPKI origin-AS validation.
                          type: bool
                        signal:
                          description: Signal origin-AS validity towards peers.
                          type: dict
                          suboptions:
                            ibgp:
                              description: Signal origin-AS validity towards iBGP peers
                              type: bool
                scan_time:
                  description: Configure background scanner interval for this address-family Example- <5-3600>.
                  type: int
            default_martian_check_disable:
              type: bool
              description: Martian check default
            distance: &distance
              type: dict
              description: Define an administrative distance.
              suboptions:
                routes_external_to_as:
                  type: int
                  description: Distance for routes external to the AS <1-255>.
                routes_internal_to_as:
                  type: int
                  description: Distance for routes internal to the AS <1-255>.
                local_routes:
                  type: int
                  description: Distance for local routes <1-255>.
            dynamic_med:
              type: int
              description: Dynamic MED Interval.
            maximum_paths:
              type: dict
              description: Forward packets over multiple paths.
              suboptions:
                ibgp:
                  type: dict
                  description: iBGP-multipath.
                  suboptions:
                    max_path_value:
                      type: int
                      description: <2-64>  Number of paths (limit includes backup path).
                    order_igp_metric:
                      description: Order candidate multipaths for selection as per configured number(cisco-support).
                      type: bool
                    selective_order_igp_metric:
                      description: Allow multipaths only from marked neighbors
                      type: bool
                    unequal_cost:
                      type: dict
                      description: Allow multipaths to have different BGP nexthop IGP metrics.
                      suboptions:
                        set:
                          type: bool
                          description: set unequal_cost.
                        order_igp_metric:
                          description: Order candidate multipaths for selection as per configured number(cisco-support).
                          type: bool
                        selective_order_igp_metric:
                          description: Allow multipaths only from marked neighbors
                          type: bool
                ebgp:
                  type: dict
                  description: ebgp-multipath.
                  suboptions:
                    max_path_value:
                      type: int
                      description: <2-64>  Number of paths (limit includes backup path).
                    order_igp_metric:
                      description: Order candidate multipaths for selection as per configured number(cisco-support).
                      type: bool
                    selective_order_igp_metric:
                      description: Allow multipaths only from marked neighbors
                      type: bool
                eibgp:
                  type: dict
                  description: eiBGP-multipath.
                  suboptions:
                    max_path_value:
                      type: int
                      description: <2-64>  Number of paths (limit includes backup path).
                    order_igp_metric:
                      description: Order candidate multipaths for selection as per configured number(cisco-support).
                      type: bool
                    selective_order_igp_metric:
                      description: Allow multipaths only from marked neighbors
                      type: bool
            networks:
              type: list
              description: Specify a network to announce via BGP.
              elements: dict
              suboptions:
                network:
                  type: str
                  description: Specify a network to announce via BGP.
                backdoor_route_policy:
                  type: str
                  description: Specify a BGP backdoor route.
                route_policy:
                  type: str
                  description: Route-policy to modify the attributes.
            nexthop:
              type: dict
              description: Nexthop
              suboptions:
                resolution_prefix_length_minimum:
                  type: int
                  description: Set minimum prefix-length for nexthop resolution.
                  choices: [0,32]
                route_policy:
                  type: str
                  description: Policy to filter out nexthop notification.
                trigger_delay_critical:
                  description: For critical notification
                  type: int
                trigger_delay_non_critical:
                  type: int
                  description: For non critical notification.
            optimal_route_reflection:
              type: dict
              description: Configure optimal-route-reflection group.
              suboptions:
                group_name:
                  type: str
                  description: ORR group name - maximum 32 characters.
                primary_address:
                  type: str
                  description: IPv4 primary address.
                secondary_address:
                  type: str
                  description: IPv4 secondary address
            permanent_network_route_policy:
              type: str
              description: Name of the policy.
            retain_local_label:
              type: int
              description: Label retention time in minutes <3-60>.
            table_policy:
              type: str
              description: Configure policy for installation of routes to RIB.
            update:
              type: dict
              description: BGP Update generation configuration.
              suboptions:
                limit:
                  type: dict
                  description: Update limit.
                  suboptions:
                    sub_group:
                      type: dict
                      description: Update limit for address-family.
                      suboptions:
                        ibgp:
                          type: int
                          description: Update limit for iBGP sub-groups<1-512.
                        ebgp:
                          type: int
                          description: Update limit for eBGP sub-groups<1-512.
                    address_family:
                      type: int
                      description: Update limit for sub-groups.
                wait_install:
                  type: bool
                  description: Wait for route install.
            redistribute:
              type: list
              elements: dict
              description: Redistribute information from another routing protocol.
              suboptions:
                protocol:
                  description: Specifies the protocol for configuring redistribute information.
                  type: str
                  choices:
                    - ospf
                    - application
                    - eigrp
                    - isis
                    - static
                    - connected
                    - lisp
                    - mobile
                    - rip
                    - subscriber
                  required: true
                id:
                  type: str
                  description:
                    - Identifier for the routing protocol for configuring redistribute
                      information. Example-application name, eigrp/is-is instance name, ospf tag
                    - Valid for protocols 'ospf', 'eigrp', 'isis' and 'application'.
                metric:
                  description:
                    - Specifies the metric for redistributed routes.
                  type: int
                route_policy:
                    description:
                      - Specifies the route policy reference.
                    type: str
                internal:
                  type: bool
                  description: Redistribute EIGRP internal routes.applicable for eigrp.
                external:
                  type: bool
                  description: Redistribute EIGRP external routes.applicable for eigrp.
                level:
                  type: str
                  description:
                    - Redistribute routes from the specified ISIS levels.
                    - Redistribute ISIS level 1 routes
                    - Redistribute ISIS level 1 inter-area routes
                    - Redistribute ISIS level 2 ISIS routes
                  choices: [ '1', '2', '1-inter-area' ]
                nssa_external:
                  type: bool
                  description: Redistribute OSPF NSSA external routes.applicable for ospf.
                external_ospf:
                    type: int
                    description: Redistribute OSPF external routes.applicable for ospf.
                    choices: [ 1, 2 ]
            inter_as_install:
              type: bool
              description: Install remote mvpn routes in default vrf.This is applicable for mvpn afi.
            segmented_multicast:
              type: bool
              description:  Enable segmented multicast.This is applicable for mvpn afi.
            global_table_multicast:
              type: bool
              description: Enable global table multicast.
            vrf_all_conf:
              type: dict
              description: configuration is for all vrfs and its applicable for afi vpn6 and modifier unicast.
              suboptions:
                source_rt_import_policy:
                  type: bool
                  description: Source import route-targets from import-policy.
                table_policy:
                  type: str
                  description: Configure policy for installation of routes to RIB.
                label_mode:
                  type: dict
                  description: Label-related configuration.
                  suboptions:
                    per_ce: &per_ce
                      type: bool
                      description: Set per CE label mode
                    per_vrf: &per_vrf
                      type: bool
                      description: Set per VRF label mode.
                    route_policy: &route_policy
                      type: str
                      description: Use a route policy to select prefixes for label allocation mode.
            weight: &wt
              type: dict
              description: Define or modify weight.
              suboptions:
                reset_on_import_disable:
                  type: bool
                  description: disable reset_on_import.
                reset_on_import:
                  type: bool
                  description: set reset_on_import.
            allow_vpn_default_originate:
              type: bool
              description: Allow sending default originate route to VPN neighbor.
            label_mode:
              type: dict
              description: label configuration.
              suboptions:
                per_ce: *per_ce
                per_vrf: *per_vrf
                route_policy: *route_policy
                per_prefix:
                  type: bool
                  description: Set per perfix label mode.
            mvpn_single_forwarder_selection_all:
              type: bool
              description: Enable single forwarder selection  for all
            mvpn_single_forwarder_selection_highest_ip_address:
              type: bool
              description: Enable single forwarder selection  for PE with highest ip address.
            route_target_download:
              description: Route target RIB installation.
              type: bool
    running_config:
      description:
      - This option is used only with state I(parsed).
      - The value of this option should be the output received from the Iosxr device by
        executing the command B(show running-config router bgp).
      - The state I(parsed) reads the configuration from C(running_config) option and
        transforms it into Ansible structured data as per the resource module's argspec
        and the value is then returned in the I(parsed) key within the result.
      type: str
    state:
      description:
      - The state the configuration should be left in.
      type: str
      choices: [deleted, merged, overridden, replaced, gathered, rendered, parsed]
      default: merged
"""
EXAMPLES = """
# Using merged
# Before state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 192.0.2.1
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
- name: Merge the provided configuration with the existing running configuration
  cisco.iosxr.iosxr_bgp_address_family:
    state: merged
    config:
      as_number: "65536"
      address_family:
        - afi: "ipv4"
          safi: "unicast"
          vrf: vrf1
          dynamic_med: 9
          redistribute:
            - protocol: connected
              metric: 10
        - afi: "ipv4"
          safi: "unicast"
          dynamic_med: 10
          redistribute:
            - protocol: application
              id: test1
              metric: 10
          bgp:
            scan_time: 20
            attribute_download: true
          advertise_best_external: true
          allocate_label:
            all: true
# Task output
# -------------
# commands:
# - router bgp 65536
# - address-family ipv4 unicast
# - advertise best-external
# - allocate-label all
# - bgp attribute-download
# - bgp scan-time 20
# - dynamic-med interval 10
# - redistribute application test1 metric 10
# - vrf vrf1
# - address-family ipv4 unicast
# - dynamic-med interval 9
# - redistribute connected metric 10
#
#
# after:
#   as_number: "65536"
#   address_family:
#     - afi: "ipv4"
#       safi: "unicast"
#       vrf: vrf1
#       dynamic_med: 9
#       redistribute:
#         - protocol: connected
#           metric: 10
#     - afi: "ipv4"
#       safi: "unicast"
#       dynamic_med: 10
#       redistribute:
#         - protocol: application
#           id: "test1"
#           metric: 10
#       bgp:
#         scan_time: 20
#         attribute_download: true
#       advertise_best_external: true
#       allocate_label:
#         all: true
#
# After state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family ipv4 unicast
#    advertise best-external
#    allocate-label all
#    bgp attribute-download
#    bgp scan-time 20
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#   address-family ipv4 unicast
#     dynamic-med interval 9
#     redistribute connected metric 10
#
# Using replaced
# Before state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family ipv4 unicast
#    advertise best-external
#    allocate-label all
#    bgp attribute-download
#    bgp scan-time 20
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#   address-family ipv4 unicast
#     dynamic-med interval 9
#     redistribute connected metric 10
#
#
- name: Replace the provided configuration with the existing running configuration
  cisco.iosxr.iosxr_bgp_address_family:
    state: replaced
    config:
      as_number: "65536"
      address_family:
        - afi: "ipv4"
          safi: "unicast"
          vrf: vrf1
          dynamic_med: 10
# Task output
# -------------
# commands:
# - router bgp 65536
# - vrf vrf1
# - address-family ipv4 unicast
# - dynamic-med interval 10
# - no redistribute connected metric 10
#
# after:
#   as_number: "65536"
#   address_family:
#     - afi: "ipv4"
#       safi: "unicast"
#       vrf: vrf1
#       dynamic_med: 10
#     - afi: "ipv4"
#       safi: "unicast"
#       dynamic_med: 10
#       redistribute:
#         - protocol: application
#           id: "test1"
#           metric: 10
#       bgp:
#         scan_time: 20
#         attribute_download: true
#       advertise_best_external: true
#       allocate_label:
#         all: true
# After state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family ipv4 unicast
#    advertise best-external
#    allocate-label all
#    bgp attribute-download
#    bgp scan-time 20
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#   address-family ipv4 unicast
#     dynamic-med interval 10
#
#
# Using overridden
# Before state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family ipv4 unicast
#    advertise best-external
#    allocate-label all
#    bgp attribute-download
#    bgp scan-time 20
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#   address-family ipv4 unicast
#     dynamic-med interval 9
#     redistribute connected metric 10
#
#
- name: Override the provided configuration with the existing running configuration
  cisco.iosxr.iosxr_bgp_address_family:
    state: overridden
    config:
      as_number: "65536"
      address_family:
        - afi: "ipv4"
          safi: "unicast"
          vrf: vrf1
          dynamic_med: 10

# Task output
# -------------
# commands:
# - router bgp 65536
# - no address-family ipv4 unicast
# - vrf vrf1
# - address-family ipv4 unicast
# - dynamic-med interval 10
# - no redistribute connected metric 10
#
#
# after:
#   as_number: "65536"
#   address_family:
#     - afi: "ipv4"
#       safi: "unicast"
#       vrf: vrf1
#       dynamic_med: 10
#
# After state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#   address-family ipv4 unicast
#     dynamic-med interval 10
#
#
# Using deleted
# Before state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family ipv4 unicast
#    advertise best-external
#    allocate-label all
#    bgp attribute-download
#    bgp scan-time 20
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#   address-family ipv4 unicast
#     dynamic-med interval 9
#     redistribute connected metric 10
#
#
- name: Delete the provided configuration
  cisco.iosxr.iosxr_bgp_address_family:
    state: deleted
    config:

# Task output
# -------------
# commands:
# - router bgp 65536
# - no address-family ipv4 unicast
# - vrf vrf1
# - no address-family ipv4 unicast
#
#
# after:
#   as_number: "65536"
#
#
# After state:
# -------------
# RP/0/0/CPU0:iosxr-02#show running-config router bgp
# Sat Feb 20 03:49:43.618 UTC
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#
# Using rendered
# -------------
#
- name: rendered state example
  cisco.iosxr.iosxr_bgp_address_family:
    state: rendered
    config:
      as_number: "65536"
      address_family:
        - afi: "ipv4"
          safi: "unicast"
          vrf: vrf1
          dynamic_med: 9
          redistribute:
            - protocol: connected
              metric: 10
        - afi: "ipv4"
          safi: "unicast"
          dynamic_med: 10
          redistribute:
            - protocol: application
              id: test1
              metric: 10
          bgp:
            scan_time: 20
            attribute_download: true
          advertise_best_external: true
          allocate_label:
            all: true
# Task output
# -------------
# commands:
# - router bgp 65536
# - address-family ipv4 unicast
# - advertise best-external
# - allocate-label all
# - bgp attribute-download
# - bgp scan-time 20
# - dynamic-med interval 10
# - redistribute application test1 metric 10
# - vrf vrf1
# - address-family ipv4 unicast
# - dynamic-med interval 9
# - redistribute connected metric 10
#
# Using gathered
# -------------
- name: Merge the provided configuration with the existing running configuration
  cisco.iosxr.iosxr_bgp_address_family:
    state: gathered
    config:
      as_number: "65536"
      address_family:
        - afi: "ipv4"
          safi: "unicast"
          vrf: vrf1
          dynamic_med: 9
          redistribute:
            - protocol: connected
              metric: 10
        - afi: "ipv4"
          safi: "unicast"
          dynamic_med: 10
          redistribute:
            - protocol: application
              id: test1
              metric: 10
          bgp:
            scan_time: 20
            attribute_download: true
          advertise_best_external: true
          allocate_label:
            all: true
# gathered:
#   as_number: "65536"
#   address_family:
#     - afi: "ipv4"
#       safi: "unicast"
#       vrf: vrf1
#       dynamic_med: 9
#       redistribute:
#         - protocol: connected
#           metric: 10
#     - afi: "ipv4"
#       safi: "unicast"
#       dynamic_med: 10
#       redistribute:
#         - protocol: application
#           id: "test1"
#           metric: 10
#       bgp:
#         scan_time: 20
#         attribute_download: true
#       advertise_best_external: true
#       allocate_label:
#         all: true
#
# Using parsed
#
#parsed.cfg
#------------
# router bgp 65536
#  bgp router-id 172.16.17.32
#  address-family ipv4 unicast
#    advertise best-external
#    allocate-label all
#    bgp attribute-download
#    bgp scan-time 20
#  address-family vpnv4 unicast
#  vrf vrf1
#   rd auto
#   address-family ipv4 unicast
#     dynamic-med interval 9
#     redistribute connected metric 10
#
- name: Parse externally provided BGP neighbor AF config
  cisco.iosxr.iosxr_bgp_address_family:
    running_config: "{{ lookup('file', 'parsed.cfg') }}"
    state: parsed

# Task output (redacted)
# -----------------------
# parsed:
#   as_number: "65536"
#   address_family:
#     - afi: "ipv4"
#       safi: "unicast"
#       vrf: vrf1
#       dynamic_med: 9
#       redistribute:
#         - protocol: connected
#           metric: 10
#     - afi: "ipv4"
#       safi: "unicast"
#       dynamic_med: 10
#       redistribute:
#         - protocol: application
#           id: "test1"
#           metric: 10
#       bgp:
#         scan_time: 20
#         attribute_download: true
#       advertise_best_external: true
#       allocate_label:
#         all: true
"""

from ansible.module_utils.basic import AnsibleModule
from ansible_collections.cisco.iosxr.plugins.module_utils.network.iosxr.argspec.bgp_address_family.bgp_address_family import (
    Bgp_address_familyArgs,
)
from ansible_collections.cisco.iosxr.plugins.module_utils.network.iosxr.config.bgp_address_family.bgp_address_family import (
    Bgp_address_family,
)


def main():
    """
    Main entry point for module execution

    :returns: the result form module invocation
    """
    module = AnsibleModule(
        argument_spec=Bgp_address_familyArgs.argument_spec,
        mutually_exclusive=[["config", "running_config"]],
        required_if=[
            ["state", "merged", ["config"]],
            ["state", "replaced", ["config"]],
            ["state", "overridden", ["config"]],
            ["state", "rendered", ["config"]],
            ["state", "parsed", ["running_config"]],
        ],
        supports_check_mode=True,
    )

    result = Bgp_address_family(module).execute_module()
    module.exit_json(**result)


if __name__ == "__main__":
    main()

#!/usr/bin/python # -*- coding: utf-8 -*- # Copyright 2021 Red Hat # GNU General Public License v3.0+ # (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) The module file for iosxr_bgp_address_family module: iosxr_bgp_address_family short_description: Manages BGP Address Family resource module. description: - This module configures and manages the attributes of BGP address family on Cisco IOS-XR platforms. version_added: 2.0.0 author: <NAME> (@amhatre) notes: - This module works with connection C(network_cli). options:     config:       description: A list of configurations for BGP address family.       type: dict       suboptions:         as_number:           description: Autonomous system number.           type: str         address_family:           description: Enable address family and enter its config mode           type: list           elements: dict           suboptions:             afi:               description: address family.               type: str               choices: ['ipv4', 'ipv6', 'l2vpn', 'link-state', 'vpnv4', 'vpnv6']             safi:               description: Address Family modifier               type: str               choices: [ 'flowspec', 'mdt', 'multicast', 'mvpn', 'rt-filter', 'tunnel', 'unicast', 'evpn', 'mspw', 'vpls-vpws', 'link-state' ]             vrf:               description: VRF name.               type: str             additional_paths: &additional_paths               description: BGP additional-paths commands               type: str               choices: [ 'send', 'receive' ]             advertise_best_external: &advertise               description: Advertise best-external path.               type: bool             aggregate_address:               description: Configure BGP aggregate entries.               type: list               elements: dict               suboptions:                 value:                   type: str                   description: IPv4 Aggregate address and mask or masklength.                 as_set:                   type: bool                   description: Generate AS set path information.                 as_confed_set:                   type: bool                   description: Generate AS confed set path information.                 summary_only:                   type: bool                   description: Filter more specific routes from updates.                 route_policy:                   description: Policy to condition advertisement, suppression, and attributes.                   type: str             allocate_label:               type: dict               description: Allocate labels.               suboptions:                 all:                   type: bool                   description:  Allocate labels for all prefixes.                 route_policy:                   description: Use a route policy to select prefixes for label allocation.                   type: str             as_path_loopcheck_out_disable:               type: bool               description: Configure AS Path loop checking for outbound updates.             bgp:               type: dict               description: BGP Commands.               suboptions:                 attribute_download: &attribute_download                   type: bool                   description: Configure attribute download for this address-family.                 bestpath:                   type: dict                   description: Change default route selection criteria.                   suboptions:                     origin_as:                       description: BGP origin-AS knobs.                       type: dict                       suboptions:                         use:                           description: BGP origin-AS knobs.                           type: dict                           suboptions:                             validity:                               description: BGP bestpath selection will use origin-AS validity                               type: bool                         allow:                           description: BGP origin-AS knobs.                           type: dict                           suboptions:                             invalid:                               description: BGP bestpath selection will allow 'invalid' origin-AS                               type: bool                 client_to_client:                   type: dict                   description: Configure client to client route reflection.                   suboptions:                     reflection:                       type: dict                       description: disable client to client reflection of cluster id.                       suboptions:                         cluster_id_disable:                           type: dict                           description: ID of Cluster for which reflection is to be disabled.                           suboptions:                             cluster_id:                               type: str                               description: ID of Cluster for which reflection is to be disabled.                             disable:                               type: bool                               description: disable cluster id.                         disable:                           type: bool                           description: disable reflection.                 dampening:                   type: dict                   description: Enable route-flap dampening                   suboptions:                     set:                       type: bool                       description: Enable dampening.                     value:                       type: int                       description: Half-life time for the penalty                     route_policy:                       description: Route policy to specify criteria for dampening.                       type: str                 label_delay:                   type: dict                   description: Specify delay for batching label processing                   suboptions:                     delay_second_parts:                       type: int                       description: Delay, seconds part <0-10>.                     delay_ms_parts:                       type: int                       description: milliseconds part <0-999>.                 import_delay:                   type: dict                   description: Specify delay for batching import processing.                   suboptions:                     delay_second_parts:                       type: int                       description: Delay, seconds part <0-10>.                     delay_ms_parts:                       type: int                       description: milliseconds part <0-999>.                 origin_as:                   description: BGP origin-AS knobs.                   type: dict                   suboptions:                     validation:                       description: BGP origin-AS validation knobs.                       type: dict                       suboptions:                         disable:                           description: Disable RPKI origin-AS validation.                           type: bool                         signal:                           description: Signal origin-AS validity towards peers.                           type: dict                           suboptions:                             ibgp:                               description: Signal origin-AS validity towards iBGP peers                               type: bool                 scan_time:                   description: Configure background scanner interval for this address-family Example- <5-3600>.                   type: int             default_martian_check_disable:               type: bool               description: Martian check default             distance: &distance               type: dict               description: Define an administrative distance.               suboptions:                 routes_external_to_as:                   type: int                   description: Distance for routes external to the AS <1-255>.                 routes_internal_to_as:                   type: int                   description: Distance for routes internal to the AS <1-255>.                 local_routes:                   type: int                   description: Distance for local routes <1-255>.             dynamic_med:               type: int               description: Dynamic MED Interval.             maximum_paths:               type: dict               description: Forward packets over multiple paths.               suboptions:                 ibgp:                   type: dict                   description: iBGP-multipath.                   suboptions:                     max_path_value:                       type: int                       description: <2-64>  Number of paths (limit includes backup path).                     order_igp_metric:                       description: Order candidate multipaths for selection as per configured number(cisco-support).                       type: bool                     selective_order_igp_metric:                       description: Allow multipaths only from marked neighbors                       type: bool                     unequal_cost:                       type: dict                       description: Allow multipaths to have different BGP nexthop IGP metrics.                       suboptions:                         set:                           type: bool                           description: set unequal_cost.                         order_igp_metric:                           description: Order candidate multipaths for selection as per configured number(cisco-support).                           type: bool                         selective_order_igp_metric:                           description: Allow multipaths only from marked neighbors                           type: bool                 ebgp:                   type: dict                   description: ebgp-multipath.                   suboptions:                     max_path_value:                       type: int                       description: <2-64>  Number of paths (limit includes backup path).                     order_igp_metric:                       description: Order candidate multipaths for selection as per configured number(cisco-support).                       type: bool                     selective_order_igp_metric:                       description: Allow multipaths only from marked neighbors                       type: bool                 eibgp:                   type: dict                   description: eiBGP-multipath.                   suboptions:                     max_path_value:                       type: int                       description: <2-64>  Number of paths (limit includes backup path).                     order_igp_metric:                       description: Order candidate multipaths for selection as per configured number(cisco-support).                       type: bool                     selective_order_igp_metric:                       description: Allow multipaths only from marked neighbors                       type: bool             networks:               type: list               description: Specify a network to announce via BGP.               elements: dict               suboptions:                 network:                   type: str                   description: Specify a network to announce via BGP.                 backdoor_route_policy:                   type: str                   description: Specify a BGP backdoor route.                 route_policy:                   type: str                   description: Route-policy to modify the attributes.             nexthop:               type: dict               description: Nexthop               suboptions:                 resolution_prefix_length_minimum:                   type: int                   description: Set minimum prefix-length for nexthop resolution.                   choices: [0,32]                 route_policy:                   type: str                   description: Policy to filter out nexthop notification.                 trigger_delay_critical:                   description: For critical notification                   type: int                 trigger_delay_non_critical:                   type: int                   description: For non critical notification.             optimal_route_reflection:               type: dict               description: Configure optimal-route-reflection group.               suboptions:                 group_name:                   type: str                   description: ORR group name - maximum 32 characters.                 primary_address:                   type: str                   description: IPv4 primary address.                 secondary_address:                   type: str                   description: IPv4 secondary address             permanent_network_route_policy:               type: str               description: Name of the policy.             retain_local_label:               type: int               description: Label retention time in minutes <3-60>.             table_policy:               type: str               description: Configure policy for installation of routes to RIB.             update:               type: dict               description: BGP Update generation configuration.               suboptions:                 limit:                   type: dict                   description: Update limit.                   suboptions:                     sub_group:                       type: dict                       description: Update limit for address-family.                       suboptions:                         ibgp:                           type: int                           description: Update limit for iBGP sub-groups<1-512.                         ebgp:                           type: int                           description: Update limit for eBGP sub-groups<1-512.                     address_family:                       type: int                       description: Update limit for sub-groups.                 wait_install:                   type: bool                   description: Wait for route install.             redistribute:               type: list               elements: dict               description: Redistribute information from another routing protocol.               suboptions:                 protocol:                   description: Specifies the protocol for configuring redistribute information.                   type: str                   choices:                     - ospf                     - application                     - eigrp                     - isis                     - static                     - connected                     - lisp                     - mobile                     - rip                     - subscriber                   required: true                 id:                   type: str                   description:                     - Identifier for the routing protocol for configuring redistribute                       information. Example-application name, eigrp/is-is instance name, ospf tag                     - Valid for protocols 'ospf', 'eigrp', 'isis' and 'application'.                 metric:                   description:                     - Specifies the metric for redistributed routes.                   type: int                 route_policy:                     description:                       - Specifies the route policy reference.                     type: str                 internal:                   type: bool                   description: Redistribute EIGRP internal routes.applicable for eigrp.                 external:                   type: bool                   description: Redistribute EIGRP external routes.applicable for eigrp.                 level:                   type: str                   description:                     - Redistribute routes from the specified ISIS levels.                     - Redistribute ISIS level 1 routes                     - Redistribute ISIS level 1 inter-area routes                     - Redistribute ISIS level 2 ISIS routes                   choices: [ '1', '2', '1-inter-area' ]                 nssa_external:                   type: bool                   description: Redistribute OSPF NSSA external routes.applicable for ospf.                 external_ospf:                     type: int                     description: Redistribute OSPF external routes.applicable for ospf.                     choices: [ 1, 2 ]             inter_as_install:               type: bool               description: Install remote mvpn routes in default vrf.This is applicable for mvpn afi.             segmented_multicast:               type: bool               description:  Enable segmented multicast.This is applicable for mvpn afi.             global_table_multicast:               type: bool               description: Enable global table multicast.             vrf_all_conf:               type: dict               description: configuration is for all vrfs and its applicable for afi vpn6 and modifier unicast.               suboptions:                 source_rt_import_policy:                   type: bool                   description: Source import route-targets from import-policy.                 table_policy:                   type: str                   description: Configure policy for installation of routes to RIB.                 label_mode:                   type: dict                   description: Label-related configuration.                   suboptions:                     per_ce: &per_ce                       type: bool                       description: Set per CE label mode                     per_vrf: &per_vrf                       type: bool                       description: Set per VRF label mode.                     route_policy: &route_policy                       type: str                       description: Use a route policy to select prefixes for label allocation mode.             weight: &wt               type: dict               description: Define or modify weight.               suboptions:                 reset_on_import_disable:                   type: bool                   description: disable reset_on_import.                 reset_on_import:                   type: bool                   description: set reset_on_import.             allow_vpn_default_originate:               type: bool               description: Allow sending default originate route to VPN neighbor.             label_mode:               type: dict               description: label configuration.               suboptions:                 per_ce: *per_ce                 per_vrf: *per_vrf                 route_policy: *route_policy                 per_prefix:                   type: bool                   description: Set per perfix label mode.             mvpn_single_forwarder_selection_all:               type: bool               description: Enable single forwarder selection  for all             mvpn_single_forwarder_selection_highest_ip_address:               type: bool               description: Enable single forwarder selection  for PE with highest ip address.             route_target_download:               description: Route target RIB installation.               type: bool     running_config:       description:       - This option is used only with state I(parsed).       - The value of this option should be the output received from the Iosxr device by         executing the command B(show running-config router bgp).       - The state I(parsed) reads the configuration from C(running_config) option and         transforms it into Ansible structured data as per the resource module's argspec         and the value is then returned in the I(parsed) key within the result.       type: str     state:       description:       - The state the configuration should be left in.       type: str       choices: [deleted, merged, overridden, replaced, gathered, rendered, parsed]       default: merged # Using merged # Before state: # ------------- # RP/0/0/CPU0:iosxr-02#show running-config router bgp # Sat Feb 20 03:49:43.618 UTC # router bgp 65536 #  bgp router-id 192.0.2.1 #  address-family vpnv4 unicast #  vrf vrf1 #   rd auto - name: Merge the provided configuration with the existing running configuration   cisco.iosxr.iosxr_bgp_address_family:     state: merged     config:       as_number: "65536"       address_family:         - afi: "ipv4"           safi: "unicast"           vrf: vrf1           dynamic_med: 9           redistribute:             - protocol: connected               metric: 10         - afi: "ipv4"           safi: "unicast"           dynamic_med: 10           redistribute:             - protocol: application               id: test1               metric: 10           bgp:             scan_time: 20             attribute_download: true           advertise_best_external: true           allocate_label:             all: true # Task output # ------------- # commands: # - router bgp 65536 # - address-family ipv4 unicast # - advertise best-external # - allocate-label all # - bgp attribute-download # - bgp scan-time 20 # - dynamic-med interval 10 # - redistribute application test1 metric 10 # - vrf vrf1 # - address-family ipv4 unicast # - dynamic-med interval 9 # - redistribute connected metric 10 # # # after: #   as_number: "65536" #   address_family: #     - afi: "ipv4" #       safi: "unicast" #       vrf: vrf1 #       dynamic_med: 9 #       redistribute: #         - protocol: connected #           metric: 10 #     - afi: "ipv4" #       safi: "unicast" #       dynamic_med: 10 #       redistribute: #         - protocol: application #           id: "test1" #           metric: 10 #       bgp: #         scan_time: 20 #         attribute_download: true #       advertise_best_external: true #       allocate_label: #         all: true # # After state: # ------------- # RP/0/0/CPU0:iosxr-02#show running-config router bgp # Sat Feb 20 03:49:43.618 UTC # router bgp 65536 #  bgp router-id 172.16.17.32 #  address-family ipv4 unicast #    advertise best-external #    allocate-label all #    bgp attribute-download #    bgp scan-time 20 #  address-family vpnv4 unicast #  vrf vrf1 #   rd auto #   address-family ipv4 unicast #     dynamic-med interval 9 #     redistribute connected metric 10 # # Using replaced # Before state: # ------------- # RP/0/0/CPU0:iosxr-02#show running-config router bgp # Sat Feb 20 03:49:43.618 UTC # router bgp 65536 #  bgp router-id 172.16.17.32 #  address-family ipv4 unicast #    advertise best-external #    allocate-label all #    bgp attribute-download #    bgp scan-time 20 #  address-family vpnv4 unicast #  vrf vrf1 #   rd auto #   address-family ipv4 unicast #     dynamic-med interval 9 #     redistribute connected metric 10 # # - name: Replace the provided configuration with the existing running configuration   cisco.iosxr.iosxr_bgp_address_family:     state: replaced     config:       as_number: "65536"       address_family:         - afi: "ipv4"           safi: "unicast"           vrf: vrf1           dynamic_med: 10 # Task output # ------------- # commands: # - router bgp 65536 # - vrf vrf1 # - address-family ipv4 unicast # - dynamic-med interval 10 # - no redistribute connected metric 10 # # after: #   as_number: "65536" #   address_family: #     - afi: "ipv4" #       safi: "unicast" #       vrf: vrf1 #       dynamic_med: 10 #     - afi: "ipv4" #       safi: "unicast" #       dynamic_med: 10 #       redistribute: #         - protocol: application #           id: "test1" #           metric: 10 #       bgp: #         scan_time: 20 #         attribute_download: true #       advertise_best_external: true #       allocate_label: #         all: true # After state: # ------------- # RP/0/0/CPU0:iosxr-02#show running-config router bgp # Sat Feb 20 03:49:43.618 UTC # router bgp 65536 #  bgp router-id 172.16.17.32 #  address-family ipv4 unicast #    advertise best-external #    allocate-label all #    bgp attribute-download #    bgp scan-time 20 #  address-family vpnv4 unicast #  vrf vrf1 #   rd auto #   address-family ipv4 unicast #     dynamic-med interval 10 # # # Using overridden # Before state: # ------------- # RP/0/0/CPU0:iosxr-02#show running-config router bgp # Sat Feb 20 03:49:43.618 UTC # router bgp 65536 #  bgp router-id 172.16.17.32 #  address-family ipv4 unicast #    advertise best-external #    allocate-label all #    bgp attribute-download #    bgp scan-time 20 #  address-family vpnv4 unicast #  vrf vrf1 #   rd auto #   address-family ipv4 unicast #     dynamic-med interval 9 #     redistribute connected metric 10 # # - name: Override the provided configuration with the existing running configuration   cisco.iosxr.iosxr_bgp_address_family:     state: overridden     config:       as_number: "65536"       address_family:         - afi: "ipv4"           safi: "unicast"           vrf: vrf1           dynamic_med: 10  # Task output # ------------- # commands: # - router bgp 65536 # - no address-family ipv4 unicast # - vrf vrf1 # - address-family ipv4 unicast # - dynamic-med interval 10 # - no redistribute connected metric 10 # # # after: #   as_number: "65536" #   address_family: #     - afi: "ipv4" #       safi: "unicast" #       vrf: vrf1 #       dynamic_med: 10 # # After state: # ------------- # RP/0/0/CPU0:iosxr-02#show running-config router bgp # Sat Feb 20 03:49:43.618 UTC # router bgp 65536 #  bgp router-id 172.16.17.32 #  address-family vpnv4 unicast #  vrf vrf1 #   rd auto #   address-family ipv4 unicast #     dynamic-med interval 10 # # # Using deleted # Before state: # ------------- # RP/0/0/CPU0:iosxr-02#show running-config router bgp # Sat Feb 20 03:49:43.618 UTC # router bgp 65536 #  bgp router-id 172.16.17.32 #  address-family ipv4 unicast #    advertise best-external #    allocate-label all #    bgp attribute-download #    bgp scan-time 20 #  address-family vpnv4 unicast #  vrf vrf1 #   rd auto #   address-family ipv4 unicast #     dynamic-med interval 9 #     redistribute connected metric 10 # # - name: Delete the provided configuration   cisco.iosxr.iosxr_bgp_address_family:     state: deleted     config:  # Task output # ------------- # commands: # - router bgp 65536 # - no address-family ipv4 unicast # - vrf vrf1 # - no address-family ipv4 unicast # # # after: #   as_number: "65536" # # # After state: # ------------- # RP/0/0/CPU0:iosxr-02#show running-config router bgp # Sat Feb 20 03:49:43.618 UTC # router bgp 65536 #  bgp router-id 172.16.17.32 #  address-family vpnv4 unicast #  vrf vrf1 #   rd auto # # Using rendered # ------------- # - name: rendered state example   cisco.iosxr.iosxr_bgp_address_family:     state: rendered     config:       as_number: "65536"       address_family:         - afi: "ipv4"           safi: "unicast"           vrf: vrf1           dynamic_med: 9           redistribute:             - protocol: connected               metric: 10         - afi: "ipv4"           safi: "unicast"           dynamic_med: 10           redistribute:             - protocol: application               id: test1               metric: 10           bgp:             scan_time: 20             attribute_download: true           advertise_best_external: true           allocate_label:             all: true # Task output # ------------- # commands: # - router bgp 65536 # - address-family ipv4 unicast # - advertise best-external # - allocate-label all # - bgp attribute-download # - bgp scan-time 20 # - dynamic-med interval 10 # - redistribute application test1 metric 10 # - vrf vrf1 # - address-family ipv4 unicast # - dynamic-med interval 9 # - redistribute connected metric 10 # # Using gathered # ------------- - name: Merge the provided configuration with the existing running configuration   cisco.iosxr.iosxr_bgp_address_family:     state: gathered     config:       as_number: "65536"       address_family:         - afi: "ipv4"           safi: "unicast"           vrf: vrf1           dynamic_med: 9           redistribute:             - protocol: connected               metric: 10         - afi: "ipv4"           safi: "unicast"           dynamic_med: 10           redistribute:             - protocol: application               id: test1               metric: 10           bgp:             scan_time: 20             attribute_download: true           advertise_best_external: true           allocate_label:             all: true # gathered: #   as_number: "65536" #   address_family: #     - afi: "ipv4" #       safi: "unicast" #       vrf: vrf1 #       dynamic_med: 9 #       redistribute: #         - protocol: connected #           metric: 10 #     - afi: "ipv4" #       safi: "unicast" #       dynamic_med: 10 #       redistribute: #         - protocol: application #           id: "test1" #           metric: 10 #       bgp: #         scan_time: 20 #         attribute_download: true #       advertise_best_external: true #       allocate_label: #         all: true # # Using parsed # #parsed.cfg #------------ # router bgp 65536 #  bgp router-id 172.16.17.32 #  address-family ipv4 unicast #    advertise best-external #    allocate-label all #    bgp attribute-download #    bgp scan-time 20 #  address-family vpnv4 unicast #  vrf vrf1 #   rd auto #   address-family ipv4 unicast #     dynamic-med interval 9 #     redistribute connected metric 10 # - name: Parse externally provided BGP neighbor AF config   cisco.iosxr.iosxr_bgp_address_family:     running_config: "{{ lookup('file', 'parsed.cfg') }}"     state: parsed  # Task output (redacted) # ----------------------- # parsed: #   as_number: "65536" #   address_family: #     - afi: "ipv4" #       safi: "unicast" #       vrf: vrf1 #       dynamic_med: 9 #       redistribute: #         - protocol: connected #           metric: 10 #     - afi: "ipv4" #       safi: "unicast" #       dynamic_med: 10 #       redistribute: #         - protocol: application #           id: "test1" #           metric: 10 #       bgp: #         scan_time: 20 #         attribute_download: true #       advertise_best_external: true #       allocate_label: #         all: true Main entry point for module execution      :returns: the result form module invocation