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

#############################################
#                WARNING                    #
#############################################
#
# This file is auto generated by the resource
#   module builder playbook.
#
# Do not edit this file manually.
#
# Changes to this file will be over written
#   by the resource module builder.
#
# Changes should be made in the model used to
#   generate this file or in the resource module
#   builder template.
#
#############################################

"""
The module file for eos_bgp_global
"""

from __future__ import absolute_import, division, print_function


__metaclass__ = type

DOCUMENTATION = """
module: eos_bgp_global
short_description: Manages BGP global resource module
description: This module configures and manages the attributes of BGP global on Arista
  EOS platforms.
version_added: 1.4.0
author: Gomathi Selvi Srinivasan (@GomathiselviS)
notes:
- Tested against Arista EOS 4.24.6F
- This module works with connection C(network_cli). See the L(EOS Platform Options,eos_platform_options).
options:
    config:
      description: A list of configurations for BGP global.
      type: dict
      suboptions:
        as_number:
          description: Autonomous system number.
          type: str
        aggregate_address:
          description: Configure aggregate address.
          type: list
          elements: dict
          suboptions:
            address:
              description: ipv4/ipv6 address prefix.
              type: str
            advertise_only:
              description: Advertise without installing the generated blackhole route in
                  FIB.
              type: bool
            as_set:
              description: Generate autonomous system set path information.
              type: bool
            attribute_map:
              description: Name of the route map used to set the attribute of the
                  aggregate route.
              type: str
            match_map:
              description: Name of the route map used to filter the contributors of the
                  aggregate route.
              type: str
            summary_only:
              description: Filters all more-specific routes from updates.
              type: bool
        bgp_params:
          description: BGP parameters.
          type: dict
          suboptions:
            additional_paths:
              description: BGP additional-paths commands
              type: str
              choices: ['install', 'send', 'receive']
            advertise_inactive:
              description: Advertise BGP routes even if they are inactive in RIB.
              type: bool
            allowas_in:
              description: Allow local-as in updates.
              type: dict
              suboptions:
                set:
                  description: When True, it is set.
                  type: bool
                count:
                  description: Number of local ASNs allowed in a BGP update.
                  type: int
            always_compare_med:
              description: BGP Always Compare MED
              type: bool
            asn:
              description: AS Number notation.
              type: str
              choices: ['asdot', 'asplain']
            auto_local_addr:
              description: Automatically determine the local address to be used
                         for the non-transport AF.
              type: bool
            bestpath:
              description: Select the bestpath selection algorithim for BGP routes.
              type: dict
              suboptions:
                as_path:
                  description: Select the bestpath selection based on as-path.
                  type: str
                  choices: ['ignore', 'multipath_relax']
                ecmp_fast:
                  description: Tie-break BGP paths in a ECMP group based on the order of arrival.
                  type: bool
                med:
                  description: MED attribute
                  type: dict
                  suboptions:
                    confed:
                      description: MED Confed.
                      type: bool
                    missing_as_worst:
                      description: MED missing-as-worst.
                      type: bool
                skip:
                  description: skip one of the tie breaking rules in the bestpath selection.
                  type: bool
                tie_break:
                  description: Configure the tie-break option for BGP bestpath selection.
                  choices: ['cluster_list_length', 'router_id']
                  type: str
            client_to_client:
              description: client to client configuration.
              type: bool
            cluster_id:
              description: Cluster ID of this router acting as a route reflector.
              type: str
            confederation:
              description: confederation.
              type: dict
              suboptions:
                identifier:
                  description: Confederation identifier.
                  type: str
                peers:
                  description: Confederation peers.
                  type: str
            control_plane_filter:
              description: Control plane filter for BGP.
              type: bool
            convergence:
              description: Bgp convergence parameters.
              type: dict
              suboptions:
                slow_peer:
                  description: Maximum amount of time to wait for slow peers to estabilsh session.
                  type: bool
                time:
                  description: time in secs
                  type: int
            default:
              description: Default neighbor configuration commands.
              type: str
              choices: ['ipv4_unicast', 'ipv6_unicast']
            enforce_first_as:
              description: Enforce the First AS for EBGP routes(default).
              type: bool
            host_routes:
              description: BGP host routes configuration.
              type: bool
            labeled_unicast:
              description: Labeled Unicast.
              type: str
              choices: ['ip', 'tunnel']
            listen:
              description: BGP listen.
              type: dict
              suboptions:
                limit:
                  description: Set limit on the number of dynamic BGP peers allowed.
                  type: int
                range:
                  description: Subnet Range to be associated with the peer group.
                  type: dict
                  suboptions:
                    address:
                      description: Address prefix
                      type: str
                    peer_group:
                      description: Name of peer group.
                      type: dict
                      suboptions:
                        name:
                          description: name.
                          type: str
                        peer_filter:
                          description: Name of peer filter.
                          type: str
                        remote_as:
                          description: Neighbor AS number
                          type: str
            log_neighbor_changes:
              description: Log neighbor up/down events.
              type: bool
            missing_policy:
              description: Missing policy override configuration commands.
              type: dict
              suboptions:
                direction:
                  description: Missing policy direction options.
                  type: str
                  choices: ['in', 'out']
                action:
                  description: Missing policy action options.
                  type: str
                  choices: ['deny', 'permit', 'deny-in-out']
            monitoring:
              description: Enable Bgp monitoring for all/specified stations.
              type: bool
            next_hop_unchanged:
              description: Preserve original nexthop while advertising routes to
                     eBGP peers.
              type: bool
            redistribute_internal:
              description: Redistribute internal BGP routes.
              type: bool
            route:
              description: Configure route-map for route installation.
              type: str
            route_reflector:
              description: Configure route reflector options
              type: dict
              suboptions:
                set:
                  description: When True route_reflector is set.
                  type: bool
                preserve:
                  description: preserve route attributes, overwriting route-map changes
                  type: bool
            transport:
              description: Configure transport port for TCP session
              type: int
        default_metric:
          description: Default metric.
          type: int
        distance:
          description: Define an administrative distance.
          type: dict
          suboptions:
            external:
              description: distance for external routes.
              type: int
            internal:
              description: distance for internal routes.
              type: int
            local:
              description: distance for local routes.
              type: int
        graceful_restart:
          description: Enable graceful restart mode.
          type: dict
          suboptions:
            set:
              description: When True, graceful restart is set.
              type: bool
            restart_time:
              description: Set the max time needed to restart and come back up.
              type: int
            stalepath_time:
              description: Set the max time to hold onto restarting peer stale paths.
              type: int
        graceful_restart_helper:
          description: Enable graceful restart helper mode.
          type: bool
        access_group:
          description: ip/ipv6 access list configuration.
          type: list
          elements: dict
          suboptions:
            afi:
              description: Specify ip/ipv6.
              type: str
              choices: ['ipv4', 'ipv6']
            acl_name:
              description: access list name.
              type: str
            direction:
              description: direction of packets.
              type: str
        maximum_paths:
          description: Maximum number of equal cost paths.
          type: dict
          suboptions:
            max_equal_cost_paths:
              description: Value for maximum number of equal cost paths.
              type: int
            max_installed_ecmp_paths:
              description: Value for maximum number of installed ECMP routes.
              type: int
        monitoring:
          description: BGP monitoring protocol configuration.
          type: dict
          suboptions:
            port:
              description: Configure the BGP monitoring protocol port number <1024-65535>.
              type: int
            received:
              description: BGP monitoring protocol received route selection.
              type: str
              choices: ['post_policy', 'pre_policy']
            station:
              description: BGP monitoring station configuration.
              type: str
            timestamp:
              description: BGP monitoring protocol Per-Peer Header timestamp behavior.
              type: str
              choices: ['none', 'send_time']
        neighbor:
          description: Configure routing for a network.
          type: list
          elements: dict
          suboptions:
            neighbor_address:
              type: str
              description: Neighbor address or peer group.
              aliases:
                - peer
            additional_paths:
              description: BGP additional-paths commands.
              type: str
              choices: ['send', 'receive']
            allowas_in:
              description: Allow local-as in updates.
              type: dict
              suboptions:
                set:
                  description: When True, it is set.
                  type: bool
                count:
                  description: Number of local ASNs allowed in a BGP update.
                  type: int
            auto_local_addr:
              description: Automatically determine the local address to be used
                             for the non-transport AF.
              type: bool
            bfd:
              description: Configure BFD fallover for this peer
              type: str
              choices: ['enable', 'c_bit']
            default_originate:
              description: Originate default route to this neighbor.
              type: dict
              suboptions:
                route_map:
                  description: Route map reference.
                  type: str
                always:
                  description: Always originate default route to this neighbor.
                  type: bool
            description:
              description: Text describing the neighbor.
              type: str
            dont_capability_negotiate:
              description: Donot perform Capability Negotiation with this
                             neighbor.
              type: bool
            ebgp_multihop:
              description: Allow BGP connections to indirectly connected
                             external peers.
              type: dict
              suboptions:
                ttl:
                  description: Time-to-live in the range 1-255 hops.
                  type: int
                set:
                  description: If True, ttl is not set.
                  type: bool
            enforce_first_as:
              description: Enforce the First AS for EBGP routes(default).
              type: bool
            export_localpref:
              description: Override localpref when exporting to an internal
                             peer.
              type: int
            fall_over:
              description: Configure BFD protocol options for this peer.
              type: bool
            graceful_restart:
              description: Enable graceful restart mode.
              type: bool
            graceful_restart_helper:
              description: Enable graceful restart helper mode.
              type: bool
            idle_restart_timer:
              description: Neighbor idle restart timer.
              type: int
            import_localpref:
              description: Override localpref when importing from an external
                             peer.
              type: int
            link_bandwidth:
              description: Enable link bandwidth community for routes to this
                             peer.
              type: dict
              suboptions:
                set:
                  description: If True, set link bandwidth
                  type: bool
                auto:
                  description: Enable link bandwidth auto generation for routes from this peer.
                  type: bool
                default:
                  description: Enable link bandwidth default generation for routes from this
                                peer.
                  type: str
                update_delay:
                  description: Delay outbound route updates.
                  type: int
            local_as:
              description: Configure local AS number advertised to peer.
              type: dict
              suboptions:
                as_number:
                  description: AS number.
                  type: str
                fallback:
                  description: Prefer router AS Number over local AS Number.
                  type: bool
            local_v6_addr:
              description: The local IPv6 address of the neighbor in A:B:C:D:E:F:G:H format.
              type: str
            maximum_accepted_routes:
              description: Maximum number of routes accepted from this peer.
              type: dict
              suboptions:
                count:
                  description: Maximum number of accepted routes (0 means unlimited).
                  type: int
                warning_limit:
                  description: Maximum number of accepted routes after which a warning is issued.
                               (0 means never warn)
                  type: int
            maximum_received_routes:
              description: Maximum number of routes received from this peer.
              type: dict
              suboptions:
                count:
                  description: Maximum number of routes (0 means unlimited).
                  type: int
                warning_limit:
                  description: Percentage of maximum-routes at which warning is to be issued.
                  type: dict
                  suboptions:
                    limit_count:
                      description: Number of routes at which to warn.
                      type: int
                    limit_percent:
                      description: Percentage of maximum number of routes at which to warn( 1-100).
                      type: int
                warning_only:
                  description: Only warn, no restart, if max route limit exceeded.
                  type: bool
            metric_out:
              description: MED value to advertise to peer.
              type: int
            monitoring:
              description: Enable BGP Monitoring Protocol for this peer.
              type: bool
            next_hop_self:
              description: Always advertise this router address as the BGP
                             next hop
              type: bool
            next_hop_unchanged:
              description: Preserve original nexthop while advertising routes to
                     eBGP peers.
              type: bool
            next_hop_v6_address:
              description: IPv6 next-hop address for the neighbor
              type: str
            out_delay:
              description: Delay outbound route updates.
              type: int
            encryption_password:
              description: Password to use in computation of MD5 hash.
              type: dict
              suboptions:
                type:
                  description: Encryption type.
                  type: int
                  choices: [0, 7]
                password:
                  description: password (up to 80 chars).
                  type: str
            remote_as:
              description: Neighbor Autonomous System.
              type: str
            remove_private_as:
              description: Remove private AS number from updates to this peer.
              type: dict
              suboptions:
                set:
                  description: If True, set remove_private_as.
                  type: bool
                all:
                  description: Remove private AS number.
                  type: bool
                replace_as:
                  description: Replace private AS number with local AS number.
                  type: bool
            peer_group:
              description: Name of the peer group.
              type: str

            prefix_list:
              description: Prefix list reference.
              type: dict
              suboptions:
                direction:
                  description: Configure an inbound/outbound prefix-list.
                  type: str
                  choices: ['in', 'out']
                name:
                  description: prefix list name.
                  type: str
            route_map:
              description: Route map reference.
              type: dict
              suboptions:
                direction:
                  description: Configure an inbound/outbound route-map.
                  type: str
                  choices: ['in', 'out']
                name:
                  description: Route map name.
                  type: str
            route_reflector_client:
              description: Configure peer as a route reflector client.
              type: bool
            route_to_peer:
              description: Use routing table information to reach the peer.
              type: bool
            send_community:
              description: Send community attribute to this neighbor.
              type: dict
              suboptions:
                set:
                  description: Enable send-community
                  type: bool
                community_attribute:
                  description: Type of community attributes to send to this neighbor.
                  type: str
                sub_attribute:
                  description: Attribute to be sent to the neighbor.
                  type: str
                  choices: ['extended', 'link-bandwidth', 'standard']
                link_bandwidth_attribute:
                  description: cumulative/aggregate attribute to be sent.
                  type: str
                  choices: ['aggregate', 'divide']
                speed:
                  description: Reference link speed in bits/second
                  type: str
                divide:
                  description: link-bandwidth divide attribute.
                  type: str
                  choices: ['equal', 'ratio']
            shutdown:
              description: Administratively shut down this neighbor.
              type: bool
            soft_recognition:
              description: Configure how to handle routes that fail import.
              type: str
              choices: ['all', 'None']
            timers:
              description: Timers.
              type: dict
              suboptions:
                keepalive:
                  description: Keep Alive Interval in secs.
                  type: int
                holdtime:
                  description: Hold time in secs.
                  type: int
            transport:
              description: Configure transport options for TCP session.
              type: dict
              suboptions:
                connection_mode:
                  description: Configure connection-mode for TCP session.
                  type: str
                remote_port:
                  description: Configure BGP peer TCP port to connect to.
                  type: int
            ttl:
              description: BGP ttl security check
              type: int
            update_source:
              description: Specify the local source interface for peer BGP
                             sessions.
              type: str
            weight:
              description: Weight to assign.
              type: int
          aliases:
            - neighbors
        network:
          description: Configure routing for a network.
          type: list
          elements: dict
          suboptions:
            address:
              description: address prefix.
              type: str
            route_map:
              description: Name of route map.
              type: str
          aliases:
            - networks
        redistribute:
          description: Redistribute routes in to BGP.
          type: list
          elements: dict
          suboptions:
            protocol:
              description: Routes to be redistributed.
              type: str
              choices: ['isis', 'ospfv3', 'ospf', 'attached-host', 'connected', 'rip', 'static']
            route_map:
              description: Route map reference.
              type: str
            isis_level:
              description: Applicable for isis routes. Specify isis route level.
              type: str
              choices: ['level-1', 'level-2', 'level-1-2']
            ospf_route:
              description: ospf route options.
              type: str
              choices: ['internal', 'external', 'nssa_external_1', 'nssa_external_2']
        router_id:
          description: Router id.
          type: str
        route_target:
          description: Route target.
          type: dict
          suboptions:
            action:
              description: Route action.
              type: str
              choices: ['both', 'import', 'export']
            target:
              description: Route Target.
              type: str
        shutdown:
          description: When True, shut down BGP.
          type: bool
        timers:
          description: Timers.
          type: dict
          suboptions:
            keepalive:
              description: Keep Alive Interval in secs.
              type: int
            holdtime:
              description: Hold time in secs.
              type: int
        ucmp:
          description: Configure unequal cost multipathing.
          type: dict
          suboptions:
            fec:
              description: Configure UCMP fec utilization threshold.
              type: dict
              suboptions:
                trigger:
                  description: UCMP fec utilization too high threshold.
                  type: int
                clear:
                  description: UCMP FEC utilization Clear thresholds.
                  type: int
            link_bandwidth:
              description: Configure link-bandwidth propagation delay.
              type: dict
              suboptions:
                mode:
                  description: UCMP link bandwidth mode
                  type: str
                  choices: ['encoding_weighted', 'recursive']
                update_delay:
                  description: Link Bandwidth Advertisement delay.
                  type: int
            mode:
              description: UCMP mode.
              type: dict
              suboptions:
                set:
                  description: If True, ucmp mode is set to 1.
                  type: bool
                nexthops:
                  description: Value for total number UCMP nexthops.
                  type: int
        update:
          description: Configure BGP update generation.
          type: dict
          suboptions:
            wait_for:
              description: wait for options before converge or synchronize.
              type: str
              choices: ['wait_for_convergence', 'wait_install']
            batch_size:
              description: batch size for FIB route acknowledgements.
              type: int
        vlan:
          description: Configure MAC VRF BGP for single VLAN support.
          type: int
        vlan_aware_bundle:
          description: Configure MAC VRF BGP for multiple VLAN support.
          type: str
        vrfs:
          description: Configure BGP in a VRF.
          type: list
          elements: dict
          suboptions:
            vrf:
             description: VRF name.
             type: str
            aggregate_address:
              description: Configure aggregate address.
              type: list
              elements: dict
              suboptions:
                address:
                  description: ipv4/ipv6 address prefix.
                  type: str
                advertise_only:
                  description: Advertise without installing the generated blackhole route in
                      FIB.
                  type: bool
                as_set:
                  description: Generate autonomous system set path information.
                  type: bool
                attribute_map:
                  description: Name of the route map used to set the attribute of the
                      aggregate route.
                  type: str
                match_map:
                  description: Name of the route map used to filter the contributors of the
                      aggregate route.
                  type: str
                summary_only:
                  description: Filters all more-specific routes from updates.
                  type: bool
            bgp_params:
              description: BGP parameters.
              type: dict
              suboptions:
                additional_paths:
                  description: BGP additional-paths commands
                  type: str
                  choices: ['install', 'send', 'receive']
                advertise_inactive:
                  description: Advertise BGP routes even if they are inactive in RIB.
                  type: bool
                allowas_in:
                  description: Allow local-as in updates.
                  type: dict
                  suboptions:
                    set:
                      description: When True, it is set.
                      type: bool
                    count:
                      description: Number of local ASNs allowed in a BGP update.
                      type: int
                always_compare_med:
                  description: BGP Always Compare MED
                  type: bool
                asn:
                  description: AS Number notation.
                  type: str
                  choices: ['asdot', 'asplain']
                auto_local_addr:
                  description: Automatically determine the local address to be used
                             for the non-transport AF.
                  type: bool
                bestpath:
                  description: Select the bestpath selection algorithim for BGP routes.
                  type: dict
                  suboptions:
                    as_path:
                      description: Select the bestpath selection based on as-path.
                      type: str
                      choices: ['ignore', 'multipath_relax']
                    ecmp_fast:
                      description: Tie-break BGP paths in a ECMP group based on the order of arrival.
                      type: bool
                    med:
                      description: MED attribute
                      type: dict
                      suboptions:
                        confed:
                          description: MED Confed.
                          type: bool
                        missing_as_worst:
                          description: MED missing-as-worst.
                          type: bool
                    skip:
                      description: skip one of the tie breaking rules in the bestpath selection.
                      type: bool
                    tie_break:
                      description: Configure the tie-break option for BGP bestpath selection.
                      choices: ['cluster_list_length', 'router_id']
                      type: str
                client_to_client:
                  description: client to client configuration.
                  type: bool
                cluster_id:
                  description: Cluster ID of this router acting as a route reflector.
                  type: str
                confederation:
                  description: confederation.
                  type: dict
                  suboptions:
                    identifier:
                      description: Confederation identifier.
                      type: str
                    peers:
                      description: Confederation peers.
                      type: str
                control_plane_filter:
                  description: Control plane filter for BGP.
                  type: bool
                convergence:
                  description: Bgp convergence parameters.
                  type: dict
                  suboptions:
                    slow_peer:
                      description: Maximum amount of time to wait for slow peers to estabilsh session.
                      type: bool
                    time:
                      description: time in secs
                      type: int
                default:
                  description: Default neighbor configuration commands.
                  type: str
                  choices: ['ipv4_unicast', 'ipv6_unicast']
                enforce_first_as:
                  description: Enforce the First AS for EBGP routes(default).
                  type: bool
                host_routes:
                  description: BGP host routes configuration.
                  type: bool
                labeled_unicast:
                  description: Labeled Unicast.
                  type: str
                  choices: ['ip', 'tunnel']
                listen:
                  description: BGP listen.
                  type: dict
                  suboptions:
                    limit:
                      description: Set limit on the number of dynamic BGP peers allowed.
                      type: int
                    range:
                      description: Subnet Range to be associated with the peer group.
                      type: dict
                      suboptions:
                        address:
                          description: Address prefix
                          type: str
                        peer_group:
                          description: Name of peer group.
                          type: dict
                          suboptions:
                            name:
                              description: name.
                              type: str
                            peer_filter:
                              description: Name of peer filter.
                              type: str
                            remote_as:
                              description: Neighbor AS number
                              type: str
                log_neighbor_changes:
                  description: Log neighbor up/down events.
                  type: bool
                missing_policy:
                  description: Missing policy override configuration commands.
                  type: dict
                  suboptions:
                    direction:
                      description: Missing policy direction options.
                      type: str
                      choices: ['in', 'out']
                    action:
                      description: Missing policy action options.
                      type: str
                      choices: ['deny', 'permit', 'deny-in-out']
                monitoring:
                  description: Enable Bgp monitoring for all/specified stations.
                  type: bool
                next_hop_unchanged:
                  description: Preserve original nexthop while advertising routes to
                         eBGP peers.
                  type: bool
                redistribute_internal:
                  description: Redistribute internal BGP routes.
                  type: bool
                route:
                  description: Configure route-map for route installation.
                  type: str
                route_reflector:
                  description: Configure route reflector options
                  type: dict
                  suboptions:
                    set:
                      description: When True route_reflector is set.
                      type: bool
                    preserve:
                      description: preserve route attributes, overwriting route-map changes
                      type: bool
                transport:
                  description: Configure transport port for TCP session
                  type: int
            default_metric:
              description: Default metric.
              type: int
            distance:
              description: Define an administrative distance.
              type: dict
              suboptions:
                external:
                  description: distance for external routes.
                  type: int
                internal:
                  description: distance for internal routes.
                  type: int
                local:
                  description: distance for local routes.
                  type: int
            graceful_restart:
              description: Enable graceful restart mode.
              type: dict
              suboptions:
                set:
                  description: When True, graceful restart is set.
                  type: bool
                restart_time:
                  description: Set the max time needed to restart and come back up.
                  type: int
                stalepath_time:
                  description: Set the max time to hold onto restarting peer stale paths.
                  type: int
            graceful_restart_helper:
              description: Enable graceful restart helper mode.
              type: bool
            access_group:
              description: ip/ipv6 access list configuration.
              type: list
              elements: dict
              suboptions:
                afi:
                  description: Specify ip/ipv6.
                  type: str
                  choices: ['ipv4', 'ipv6']
                acl_name:
                  description: access list name.
                  type: str
                direction:
                  description: direction of packets.
                  type: str
            maximum_paths:
              description: Maximum number of equal cost paths.
              type: dict
              suboptions:
                max_equal_cost_paths:
                  description: Value for maximum number of equal cost paths.
                  type: int
                max_installed_ecmp_paths:
                  description: Value for maximum number of installed ECMP routes.
                  type: int
            neighbor:
              description: Configure routing for a network.
              aliases:
                - neighbors
              type: list
              elements: dict
              suboptions:
                neighbor_address:
                  type: str
                  description: Neighbor address or peer group.
                  aliases: ["peer"]
                additional_paths:
                  description: BGP additional-paths commands.
                  type: str
                  choices: ['send', 'receive']
                allowas_in:
                  description: Allow local-as in updates.
                  type: dict
                  suboptions:
                    set:
                      description: When True, it is set.
                      type: bool
                    count:
                      description: Number of local ASNs allowed in a BGP update.
                      type: int
                auto_local_addr:
                  description: Automatically determine the local address to be used
                                 for the non-transport AF.
                  type: bool
                bfd:
                  description: Configure BFD fallover for this peer
                  type: str
                  choices: ['enable', 'c_bit']
                default_originate:
                  description: Originate default route to this neighbor.
                  type: dict
                  suboptions:
                    route_map:
                      description: Route map reference.
                      type: str
                    always:
                      description: Always originate default route to this neighbor.
                      type: bool
                description:
                  description: Text describing the neighbor.
                  type: str
                dont_capability_negotiate:
                  description: Donot perform Capability Negotiation with this
                                 neighbor.
                  type: bool
                ebgp_multihop:
                  description: Allow BGP connections to indirectly connected
                                 external peers.
                  type: dict
                  suboptions:
                    ttl:
                      description: Time-to-live in the range 1-255 hops.
                      type: int
                    set:
                      description: If True, ttl is not set.
                      type: bool
                enforce_first_as:
                  description: Enforce the First AS for EBGP routes(default).
                  type: bool
                export_localpref:
                  description: Override localpref when exporting to an internal
                                 peer.
                  type: int
                fall_over:
                  description: Configure BFD protocol options for this peer.
                  type: bool
                graceful_restart:
                  description: Enable graceful restart mode.
                  type: bool
                graceful_restart_helper:
                  description: Enable graceful restart helper mode.
                  type: bool
                idle_restart_timer:
                  description: Neighbor idle restart timer.
                  type: int
                import_localpref:
                  description: Override localpref when importing from an external
                                 peer.
                  type: int
                link_bandwidth:
                  description: Enable link bandwidth community for routes to this
                                 peer.
                  type: dict
                  suboptions:
                    set:
                      description: If True, set link bandwidth
                      type: bool
                    auto:
                      description: Enable link bandwidth auto generation for routes from this peer.
                      type: bool
                    default:
                      description: Enable link bandwidth default generation for routes from this
                                    peer.
                      type: str
                    update_delay:
                      description: Delay outbound route updates.
                      type: int
                local_as:
                  description: Configure local AS number advertised to peer.
                  type: dict
                  suboptions:
                    as_number:
                      description: AS number.
                      type: str
                    fallback:
                      description: Prefer router AS Number over local AS Number.
                      type: bool
                local_v6_addr:
                  description: The local IPv6 address of the neighbor in A:B:C:D:E:F:G:H format.
                  type: str
                maximum_accepted_routes:
                  description: Maximum number of routes accepted from this peer.
                  type: dict
                  suboptions:
                    count:
                      description: Maximum number of accepted routes (0 means unlimited).
                      type: int
                    warning_limit:
                      description: Maximum number of accepted routes after which a warning is issued.
                                   (0 means never warn)
                      type: int
                maximum_received_routes:
                  description: Maximum number of routes received from this peer.
                  type: dict
                  suboptions:
                    count:
                      description: Maximum number of routes (0 means unlimited).
                      type: int
                    warning_limit:
                      description: Percentage of maximum-routes at which warning is to be issued.
                      type: dict
                      suboptions:
                        limit_count:
                          description: Number of routes at which to warn.
                          type: int
                        limit_percent:
                          description: Percentage of maximum number of routes at which to warn( 1-100).
                          type: int
                    warning_only:
                      description: Only warn, no restart, if max route limit exceeded.
                      type: bool
                metric_out:
                  description: MED value to advertise to peer.
                  type: int
                monitoring:
                  description: Enable BGP Monitoring Protocol for this peer.
                  type: bool
                next_hop_self:
                  description: Always advertise this router address as the BGP
                                 next hop
                  type: bool
                next_hop_unchanged:
                  description: Preserve original nexthop while advertising routes to
                         eBGP peers.
                  type: bool
                next_hop_v6_address:
                  description: IPv6 next-hop address for the neighbor
                  type: str
                out_delay:
                  description: Delay outbound route updates.
                  type: int
                encryption_password:
                  description: Password to use in computation of MD5 hash.
                  type: dict
                  suboptions:
                    type:
                      description: Encryption type.
                      type: int
                      choices: [0, 7]
                    password:
                      description: password (up to 80 chars).
                      type: str
                remote_as:
                  description: Neighbor Autonomous System.
                  type: str
                remove_private_as:
                  description: Remove private AS number from updates to this peer.
                  type: dict
                  suboptions:
                    set:
                      description: If True, set remove_private_as.
                      type: bool
                    all:
                      description: Remove private AS number.
                      type: bool
                    replace_as:
                      description: Replace private AS number with local AS number.
                      type: bool
                peer_group:
                  description: Name of the peer group.
                  type: str

                prefix_list:
                  description: Prefix list reference.
                  type: dict
                  suboptions:
                    direction:
                      description: Configure an inbound/outbound prefix-list.
                      type: str
                      choices: ['in', 'out']
                    name:
                      description: prefix list name.
                      type: str
                route_map:
                  description: Route map reference.
                  type: dict
                  suboptions:
                    direction:
                      description: Configure an inbound/outbound route-map.
                      type: str
                      choices: ['in', 'out']
                    name:
                      description: Route map name.
                      type: str
                route_reflector_client:
                  description: Configure peer as a route reflector client.
                  type: bool
                route_to_peer:
                  description: Use routing table information to reach the peer.
                  type: bool
                send_community:
                  description: Send community attribute to this neighbor.
                  type: dict
                  suboptions:
                    community_attribute:
                      description: Type of community attributes to send to this neighbor.
                      type: str
                    sub_attribute:
                      description: Attribute to be sent to the neighbor.
                      type: str
                      choices: ['extended', 'link-bandwidth', 'standard']
                    link_bandwidth_attribute:
                      description: cumulative/aggregate attribute to be sent.
                      type: str
                      choices: ['aggregate', 'divide']
                    speed:
                      description: Reference link speed in bits/second
                      type: str
                    divide:
                      description: link-bandwidth divide attribute.
                      type: str
                      choices: ['equal', 'ratio']
                shutdown:
                  description: Administratively shut down this neighbor.
                  type: bool
                soft_recognition:
                  description: Configure how to handle routes that fail import.
                  type: str
                  choices: ['all', 'None']
                timers:
                  description: Timers.
                  type: dict
                  suboptions:
                    keepalive:
                      description: Keep Alive Interval in secs.
                      type: int
                    holdtime:
                      description: Hold time in secs.
                      type: int
                transport:
                  description: Configure transport options for TCP session.
                  type: dict
                  suboptions:
                    connection_mode:
                      description: Configure connection-mode for TCP session.
                      type: str
                    remote_port:
                      description: Configure BGP peer TCP port to connect to.
                      type: int
                ttl:
                  description: BGP ttl security check
                  type: int
                update_source:
                  description: Specify the local source interface for peer BGP
                                 sessions.
                  type: str
                weight:
                  description: Weight to assign.
                  type: int
            network:
              description: Configure routing for a network.
              aliases:
                - networks
              type: list
              elements: dict
              suboptions:
                address:
                  description: address prefix.
                  type: str
                route_map:
                  description: Name of route map.
                  type: str
            redistribute:
              description: Redistribute routes in to BGP.
              type: list
              elements: dict
              suboptions:
                protocol:
                  description: Routes to be redistributed.
                  type: str
                  choices: ['isis', 'ospfv3', 'ospf', 'attached-host', 'connected', 'rip', 'static']
                route_map:
                  description: Route map reference.
                  type: str
                isis_level:
                  description: Applicable for isis routes. Specify isis route level.
                  type: str
                  choices: ['level-1', 'level-2', 'level-1-2']
                ospf_route:
                  description: ospf route options.
                  type: str
                  choices: ['internal', 'external', 'nssa_external_1', 'nssa_external_2']
            route_target:
              description: Route target.
              type: dict
              suboptions:
                action:
                  description: Route action.
                  type: str
                  choices: ['both', 'import', 'export']
                type:
                  description: Type of address fmaily
                  type: str
                  choices: ['evpn', 'vpn-ipv4', 'vpn-ipv6']
                route_map:
                  description: Name of a route map.
                  type: str
                target:
                  description: Route Target.
                  type: str
                imported_route:
                  description: Export routes imported from the same Afi/Safi.
                  type: bool
            router_id:
              description: Router id.
              type: str
            shutdown:
              description: When True, shut down BGP.
              type: bool
            timers:
              description: Timers.
              type: dict
              suboptions:
                keepalive:
                  description: Keep Alive Interval in secs.
                  type: int
                holdtime:
                  description: Hold time in secs.
                  type: int
            ucmp:
              description: Configure unequal cost multipathing.
              type: dict
              suboptions:
                fec:
                  description: Configure UCMP fec utilization threshold.
                  type: dict
                  suboptions:
                    trigger:
                      description: UCMP fec utilization too high threshold.
                      type: int
                    clear:
                      description: UCMP FEC utilization Clear thresholds.
                      type: int
                link_bandwidth:
                  description: Configure link-bandwidth propagation delay.
                  type: dict
                  suboptions:
                    mode:
                      description: UCMP link bandwidth mode
                      type: str
                      choices: ['encoding_weighted', 'recursive', 'update_delay']
                    update_delay:
                      description: Link Bandwidth Advertisement delay.
                      type: int
                mode:
                  description: UCMP mode.
                  type: dict
                  suboptions:
                    set:
                      description: If True, ucmp mode is set to 1.
                      type: bool
                    nexthops:
                      description: Value for total number UCMP nexthops.
                      type: int
            update:
              description: Configure BGP update generation.
              type: dict
              suboptions:
                wait_for:
                  description: wait for options before converge or synchronize.
                  type: str
                  choices: ['wait_for_convergence', 'wait_install']
                batch_size:
                  description: batch size for FIB route acknowledgements.
                  type: int
    running_config:
      description:
      - This option is used only with state I(parsed).
      - The value of this option should be the output received from the EOS device by
        executing the command B(show running-config | section 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.
      - State I(purged) removes all the BGP configurations from the
        target device. Use caution with this state.('no router bgp <x>')
      - State I(deleted) only removes BGP attributes that this modules
        manages and does not negate the BGP process completely. Thereby, preserving
        address-family related configurations under BGP context.
      - Running states I(deleted) and I(replaced) will result in an error if there
        are address-family configuration lines present under vrf context that is
        is to be removed. Please use the  M(arista.eos.eos_bgp_address_family)
        module for prior cleanup.
      - Refer to examples for more details.
      type: str
      choices: [deleted, merged, purged, replaced, gathered, rendered, parsed]
      default: merged
"""
EXAMPLES = """
# Using merged
# Before state

# veos(config)#show running-config | section bgp
# veos(config)#

  - name: Merge provided configuration with device configuration
    arista.eos.eos_bgp_global:
      config:
        as_number: "100"
        bgp_params:
          host_routes: True
          convergence:
            slow_peer: True
            time: 6
          additional_paths: "send"
          log_neighbor_changes: True
        maximum_paths:
          max_equal_cost_paths: 55
        aggregate_address:
          - address: "1.2.1.0/24"
            as_set: true
            match_map: "match01"
          - address: "5.2.1.0/24"
            attribute_map: "attrmatch01"
            advertise_only: true
        redistribute:
          - protocol: "static"
            route_map: "map_static"
          - protocol: "attached-host"
        distance:
          internal: 50
        neighbor:
          - peer: "10.1.3.2"
            allowas_in:
              set: true
            default_originate:
              always: true
            dont_capability_negotiate: true
            export_localpref: 4000
            maximum_received_routes:
              count: 500
              warning_limit:
                limit_percent: 5
            next_hop_unchanged: true
            prefix_list:
              name: "prefix01"
              direction: "out"
          - neighbor_address: "peer1"
            fall_over: true
            link_bandwidth:
              update_delay: 5
            monitoring: True
            send_community:
              community_attribute: "extended"
              sub_attribute: "link-bandwidth"
              link_bandwidth_attribute: "aggregate"
              speed: "600"
        vlan: 5
      state: merged

# After State:
# veos(config)#show running-config | section bgp
# router bgp 100
#    bgp convergence slow-peer time 6
#    distance bgp 50 50 50
#    maximum-paths 55
#    bgp additional-paths send any
#    neighbor peer1 peer group
#    neighbor peer1 link-bandwidth update-delay 5
#    neighbor peer1 fall-over bfd
#    neighbor peer1 monitoring
#    neighbor peer1 send-community extended link-bandwidth aggregate 600
#    neighbor peer1 maximum-routes 12000
#    neighbor 10.1.3.2 export-localpref 4000
#    neighbor 10.1.3.2 next-hop-unchanged
#    neighbor 10.1.3.2 dont-capability-negotiate
#    neighbor 10.1.3.2 allowas-in 3
#    neighbor 10.1.3.2 default-originate always
#    neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent
#    aggregate-address 1.2.1.0/24 as-set match-map match01
#    aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only
#    redistribute static route-map map_static
#    redistribute attached-host
#    !
#    vlan 5
#    !
#    address-family ipv4
#       neighbor 10.1.3.2 prefix-list prefix01 out
# veos(config)#
#
# Module Execution:
#
# "after": {
#         "aggregate_address": [
#             {
#                 "address": "1.2.1.0/24",
#                 "as_set": true,
#                 "match_map": "match01"
#             },
#             {
#                 "address": "5.2.1.0/24",
#                 "advertise_only": true,
#                 "attribute_map": "attrmatch01"
#             }
#         ],
#         "as_number": "100",
#         "bgp_params": {
#             "additional_paths": "send",
#             "convergence": {
#                 "slow_peer": true,
#                 "time": 6
#             }
#         },
#         "distance": {
#             "external": 50,
#             "internal": 50,
#             "local": 50
#         },
#         "maximum_paths": {
#             "max_equal_cost_paths": 55
#         },
#         "neighbor": [
#             {
#                 "fall_over": true,
#                 "link_bandwidth": {
#                     "set": true,
#                     "update_delay": 5
#                 },
#                 "maximum_received_routes": {
#                     "count": 12000
#                 },
#                 "monitoring": true,
#                 "peer": "peer1",
#                 "peer_group": "peer1",
#                 "send_community": {
#                     "community_attribute": "extended",
#                     "link_bandwidth_attribute": "aggregate",
#                     "speed": "600",
#                     "sub_attribute": "link-bandwidth"
#                 }
#             },
#             {
#                 "allowas_in": {
#                     "count": 3
#                 },
#                 "default_originate": {
#                     "always": true
#                 },
#                 "dont_capability_negotiate": true,
#                 "export_localpref": 4000,
#                 "maximum_received_routes": {
#                     "count": 500,
#                     "warning_limit": {
#                         "limit_percent": 5
#                     }
#                 },
#                 "next_hop_unchanged": true,
#                 "peer": "10.1.3.2"
#             }
#         ],
#         "redistribute": [
#             {
#                 "protocol": "static",
#                 "route_map": "map_static"
#             },
#             {
#                 "protocol": "attached-host"
#             }
#         ],
#         "vlan": 5
#     },
#     "before": {},
#     "changed": true,
#     "commands": [
#         "router bgp 100",
#         "neighbor 10.1.3.2 allowas-in",
#         "neighbor 10.1.3.2 default-originate always",
#         "neighbor 10.1.3.2 dont-capability-negotiate",
#         "neighbor 10.1.3.2 export-localpref 4000",
#         "neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent",
#         "neighbor 10.1.3.2 next-hop-unchanged",
#         "neighbor 10.1.3.2 prefix-list prefix01 out",
#         "neighbor peer1 fall-over bfd",
#         "neighbor peer1 link-bandwidth update-delay 5",
#         "neighbor peer1 monitoring",
#         "neighbor peer1 send-community extended link-bandwidth aggregate 600",
#         "redistribute static route-map map_static",
#         "redistribute attached-host",
#         "aggregate-address 1.2.1.0/24 as-set match-map match01",
#         "aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only",
#         "bgp host-routes fib direct-install",
#         "bgp convergence slow-peer time 6",
#         "bgp additional-paths send any",
#         "bgp log-neighbor-changes",
#         "maximum-paths 55",
#         "distance bgp 50",
#         "vlan 5"
#     ],

# Using replaced:

# Before state:
# veos(config)#show running-config | section bgp
# router bgp 100
#    bgp convergence slow-peer time 6
#    distance bgp 50 50 50
#    maximum-paths 55
#    bgp additional-paths send any
#    neighbor peer1 peer group
#    neighbor peer1 link-bandwidth update-delay 5
#    neighbor peer1 fall-over bfd
#    neighbor peer1 monitoring
#    neighbor peer1 send-community extended link-bandwidth aggregate 600
#    neighbor peer1 maximum-routes 12000
#    neighbor 10.1.3.2 export-localpref 4000
#    neighbor 10.1.3.2 next-hop-unchanged
#    neighbor 10.1.3.2 dont-capability-negotiate
#    neighbor 10.1.3.2 allowas-in 3
#    neighbor 10.1.3.2 default-originate always
#    neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent
#    aggregate-address 1.2.1.0/24 as-set match-map match01
#    aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only
#    redistribute static route-map map_static
#    redistribute attached-host
#    !
#    vlan 5
#    !
#    address-family ipv4
#       neighbor 10.1.3.2 prefix-list prefix01 out
#    !
#    vrf vrf01
#       route-target import 54:11
#       neighbor 12.1.3.2 dont-capability-negotiate
#       neighbor 12.1.3.2 allowas-in 3
#       neighbor 12.1.3.2 default-originate always
#       neighbor 12.1.3.2 maximum-routes 12000
# veos(config)#

  - name: replace provided configuration with device configuration
    arista.eos.eos_bgp_global:
      config:
        as_number: "100"
        bgp_params:
          host_routes: True
          convergence:
            slow_peer: True
            time: 6
          additional_paths: "send"
          log_neighbor_changes: True
        vrfs:
          - vrf: "vrf01"
            maximum_paths:
              max_equal_cost_paths: 55
            aggregate_address:
              - address: "1.2.1.0/24"
                as_set: true
                match_map: "match01"
              - address: "5.2.1.0/24"
                attribute_map: "attrmatch01"
                advertise_only: true
            redistribute:
              - protocol: "static"
                route_map: "map_static"
              - protocol: "attached-host"
            distance:
              internal: 50
            neighbor:
              - neighbor_address: "10.1.3.2"
                allowas_in:
                  set: true
                default_originate:
                  always: true
                dont_capability_negotiate: true
                export_localpref: 4000
                maximum_received_routes:
                  count: 500
                  warning_limit:
                    limit_percent: 5
                next_hop_unchanged: true
                prefix_list:
                  name: "prefix01"
                  direction: "out"
              - neighbor_address: "peer1"
                fall_over: true
                link_bandwidth:
                  update_delay: 5
                monitoring: True
                send_community:
                  community_attribute: "extended"
                  sub_attribute: "link-bandwidth"
                  link_bandwidth_attribute: "aggregate"
                  speed: "600"
      state: replaced

# After State:

# veos(config)#show running-config | section bgp
# router bgp 100
#    bgp convergence slow-peer time 6
#    bgp additional-paths send any
#    !
#    vrf vrf01
#       distance bgp 50 50 50
#       maximum-paths 55
#       neighbor 10.1.3.2 export-localpref 4000
#       neighbor 10.1.3.2 next-hop-unchanged
#       neighbor 10.1.3.2 dont-capability-negotiate
#       neighbor 10.1.3.2 allowas-in 3
#       neighbor 10.1.3.2 default-originate always
#       neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent
#       aggregate-address 1.2.1.0/24 as-set match-map match01
#       aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only
#       redistribute static route-map map_static
#       redistribute attached-host
#       !
#       address-family ipv4
#          neighbor 10.1.3.2 prefix-list prefix01 out
# veos(config)#
#
#
# Module Execution:
#
# "after": {
#         "as_number": "100",
#         "bgp_params": {
#             "additional_paths": "send",
#             "convergence": {
#                 "slow_peer": true,
#                 "time": 6
#             }
#         },
#         "vrfs": [
#             {
#                 "aggregate_address": [
#                     {
#                         "address": "1.2.1.0/24",
#                         "as_set": true,
#                         "match_map": "match01"
#                     },
#                     {
#                         "address": "5.2.1.0/24",
#                         "advertise_only": true,
#                         "attribute_map": "attrmatch01"
#                     }
#                 ],
#                 "distance": {
#                     "external": 50,
#                     "internal": 50,
#                     "local": 50
#                 },
#                 "maximum_paths": {
#                     "max_equal_cost_paths": 55
#                 },
#                 "neighbor": [
#                     {
#                         "allowas_in": {
#                             "count": 3
#                         },
#                         "default_originate": {
#                             "always": true
#                         },
#                         "dont_capability_negotiate": true,
#                         "export_localpref": 4000,
#                         "maximum_received_routes": {
#                             "count": 500,
#                             "warning_limit": {
#                                 "limit_percent": 5
#                             }
#                         },
#                         "next_hop_unchanged": true,
#                         "peer": "10.1.3.2"
#                     }
#                 ],
#                 "redistribute": [
#                     {
#                         "protocol": "static",
#                         "route_map": "map_static"
#                     },
#                     {
#                         "protocol": "attached-host"
#                     }
#                 ],
#                 "vrf": "vrf01"
#             }
#         ]
#     },
#     "before": {
#         "aggregate_address": [
#             {
#                 "address": "1.2.1.0/24",
#                 "as_set": true,
#                 "match_map": "match01"
#             },
#             {
#                 "address": "5.2.1.0/24",
#                 "advertise_only": true,
#                 "attribute_map": "attrmatch01"
#             }
#         ],
#         "as_number": "100",
#         "bgp_params": {
#             "additional_paths": "send",
#             "convergence": {
#                 "slow_peer": true,
#                 "time": 6
#             }
#         },
#         "distance": {
#             "external": 50,
#             "internal": 50,
#             "local": 50
#         },
#         "maximum_paths": {
#             "max_equal_cost_paths": 55
#         },
#         "neighbor": [
#             {
#                 "fall_over": true,
#                 "link_bandwidth": {
#                     "set": true,
#                     "update_delay": 5
#                 },
#                 "maximum_received_routes": {
#                     "count": 12000
#                 },
#                 "monitoring": true,
#                 "peer": "peer1",
#                 "peer_group": "peer1",
#                 "send_community": {
#                     "community_attribute": "extended",
#                     "link_bandwidth_attribute": "aggregate",
#                     "speed": "600",
#                     "sub_attribute": "link-bandwidth"
#                 }
#             },
#             {
#                 "allowas_in": {
#                     "count": 3
#                 },
#                 "default_originate": {
#                     "always": true
#                 },
#                 "dont_capability_negotiate": true,
#                 "export_localpref": 4000,
#                 "maximum_received_routes": {
#                     "count": 500,
#                     "warning_limit": {
#                         "limit_percent": 5
#                     }
#                 },
#                 "next_hop_unchanged": true,
#                 "peer": "10.1.3.2"
#             }
#         ],
#         "redistribute": [
#             {
#                 "protocol": "static",
#                 "route_map": "map_static"
#             },
#             {
#                 "protocol": "attached-host"
#             }
#         ],
#         "vlan": 5,
#         "vrfs": [
#             {
#                 "neighbor": [
#                     {
#                         "allowas_in": {
#                             "count": 3
#                         },
#                         "default_originate": {
#                             "always": true
#                         },
#                         "dont_capability_negotiate": true,
#                         "maximum_received_routes": {
#                             "count": 12000
#                         },
#                         "peer": "12.1.3.2"
#                     }
#                 ],
#                 "route_target": {
#                     "action": "import",
#                     "target": "54:11"
#                 },
#                 "vrf": "vrf01"
#             }
#         ]
#     },
#     "changed": true,
#     "commands": [
#         "router bgp 100",
#         "vrf vrf01",
#         "no route-target import 54:11",
#         "neighbor 10.1.3.2 allowas-in",
#         "neighbor 10.1.3.2 default-originate always",
#         "neighbor 10.1.3.2 dont-capability-negotiate",
#         "neighbor 10.1.3.2 export-localpref 4000",
#         "neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent",
#         "neighbor 10.1.3.2 next-hop-unchanged",
#         "neighbor 10.1.3.2 prefix-list prefix01 out",
#         "neighbor peer1 fall-over bfd",
#         "neighbor peer1 link-bandwidth update-delay 5",
#         "neighbor peer1 monitoring",
#         "neighbor peer1 send-community extended link-bandwidth aggregate 600",
#         "no neighbor 12.1.3.2",
#         "redistribute static route-map map_static",
#         "redistribute attached-host",
#         "aggregate-address 1.2.1.0/24 as-set match-map match01",
#         "aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only",
#         "maximum-paths 55",
#         "distance bgp 50",
#         "exit",
#         "no neighbor peer1 peer group",
#         "no neighbor peer1 link-bandwidth update-delay 5",
#         "no neighbor peer1 fall-over bfd",
#         "no neighbor peer1 monitoring",
#         "no neighbor peer1 send-community extended link-bandwidth aggregate 600",
#         "no neighbor peer1 maximum-routes 12000",
#         "no neighbor 10.1.3.2",
#         "no redistribute static route-map map_static",
#         "no redistribute attached-host",
#         "no aggregate-address 1.2.1.0/24 as-set match-map match01",
#         "no aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only",
#         "bgp host-routes fib direct-install",
#         "bgp log-neighbor-changes",
#         "no distance bgp 50 50 50",
#         "no maximum-paths 55",
#         "no vlan 5"
#     ],
#

# Using replaced (in presence of address_family under vrf):
# Before State:

#veos(config)#show running-config | section bgp
# router bgp 100
#    bgp convergence slow-peer time 6
#    bgp additional-paths send any
#    !
#    vrf vrf01
#       distance bgp 50 50 50
#       maximum-paths 55
#       neighbor 10.1.3.2 export-localpref 4000
#       neighbor 10.1.3.2 next-hop-unchanged
#       neighbor 10.1.3.2 dont-capability-negotiate
#       neighbor 10.1.3.2 allowas-in 3
#       neighbor 10.1.3.2 default-originate always
#       neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent
#       aggregate-address 1.2.1.0/24 as-set match-map match01
#       aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only
#       redistribute static route-map map_static
#       redistribute attached-host
#       !
#       address-family ipv4
#          neighbor 10.1.3.2 prefix-list prefix01 out
#       !
#       address-family ipv6
#          redistribute dhcp
# veos(config)#

  - name:  Replace
    arista.eos.eos_bgp_global:
      config:
        as_number: "100"
        graceful_restart:
          set: True
        router_id: "1.1.1.1"
        timers:
          keepalive: 2
          holdtime: 5
        ucmp:
          mode:
            set: True
        vlan_aware_bundle: "bundle1 bundle2 bundle3"
      state: replaced

# Module Execution:

# fatal: [192.168.122.113]: FAILED! => {
#     "changed": false,
#     "invocation": {
#         "module_args": {
#             "config": {
#                 "access_group": null,
#                 "aggregate_address": null,
#                 "as_number": "100",
#                 "bgp_params": null,
#                 "default_metric": null,
#                 "distance": null,
#                 "graceful_restart": {
#                     "restart_time": null,
#                     "set": true,
#                     "stalepath_time": null
#                 },
#                 "graceful_restart_helper": null,
#                 "maximum_paths": null,
#                 "monitoring": null,
#                 "neighbor": null,
#                 "network": null,
#                 "redistribute": null,
#                 "route_target": null,
#                 "router_id": "1.1.1.1",
#                 "shutdown": null,
#                 "timers": {
#                     "holdtime": 5,
#                     "keepalive": 2
#                 },
#                 "ucmp": {
#                     "fec": null,
#                     "link_bandwidth": null,
#                     "mode": {
#                         "nexthops": null,
#                         "set": true
#                     }
#                 },
#                 "update": null,
#                 "vlan": null,
#                 "vlan_aware_bundle": "bundle1 bundle2 bundle3",
#                 "vrfs": null
#             },
#             "running_config": null,
#             "state": "replaced"
#         }
#     },
#     "msg": "Use the _bgp_af module to delete the address_family under vrf, before replacing/deleting the vrf."
# }

# Using deleted:

# Before state:

# veos(config)#show running-config | section bgp
# router bgp 100
#    bgp convergence slow-peer time 6
#    bgp additional-paths send any
#    !
#    vrf vrf01
#       distance bgp 50 50 50
#       maximum-paths 55
#       neighbor 10.1.3.2 export-localpref 4000
#       neighbor 10.1.3.2 next-hop-unchanged
#       neighbor 10.1.3.2 dont-capability-negotiate
#       neighbor 10.1.3.2 allowas-in 3
#       neighbor 10.1.3.2 default-originate always
#       neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent
#       aggregate-address 1.2.1.0/24 as-set match-map match01
#       aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only
#       redistribute static route-map map_static
#       redistribute attached-host
#       !

  - name: Delete configuration
    arista.eos.eos_bgp_global:
      config:
        as_number: "100"
      state: deleted

# After State:

# veos(config)#show running-config | section bgp
# router bgp 100
#
#
# Module Execution:
#
# "after": {
#         "as_number": "100"
#     },
#     "before": {
#         "as_number": "100",
#         "bgp_params": {
#             "additional_paths": "send",
#             "convergence": {
#                 "slow_peer": true,
#                 "time": 6
#             }
#         },
#         "vrfs": [
#             {
#                 "aggregate_address": [
#                     {
#                         "address": "1.2.1.0/24",
#                         "as_set": true,
#                         "match_map": "match01"
#                     },
#                     {
#                         "address": "5.2.1.0/24",
#                         "advertise_only": true,
#                         "attribute_map": "attrmatch01"
#                     }
#                 ],
#                 "distance": {
#                     "external": 50,
#                     "internal": 50,
#                     "local": 50
#                 },
#                 "maximum_paths": {
#                     "max_equal_cost_paths": 55
#                 },
#                 "neighbor": [
#                     {
#                         "allowas_in": {
#                             "count": 3
#                         },
#                         "default_originate": {
#                             "always": true
#                         },
#                         "dont_capability_negotiate": true,
#                         "export_localpref": 4000,
#                         "maximum_received_routes": {
#                             "count": 500,
#                             "warning_limit": {
#                                 "limit_percent": 5
#                             }
#                         },
#                         "next_hop_unchanged": true,
#                         "peer": "10.1.3.2"
#                     }
#                 ],
#                 "redistribute": [
#                     {
#                         "protocol": "static",
#                         "route_map": "map_static"
#                     },
#                     {
#                         "protocol": "attached-host"
#                     }
#                 ],
#                 "vrf": "vrf01"
#             }
#         ]
#     },
#     "changed": true,
#     "commands": [
#         "router bgp 100",
#         "no vrf vrf01",
#         "no bgp convergence slow-peer time 6",
#         "no bgp additional-paths send any"
#     ],
#

# Using purged:

# Before state:

# veos(config)#show running-config | section bgp
# router bgp 100
#    bgp convergence slow-peer time 6
#    distance bgp 50 50 50
#    maximum-paths 55
#    bgp additional-paths send any
#    neighbor peer1 peer group
#    neighbor peer1 link-bandwidth update-delay 5
#    neighbor peer1 fall-over bfd
#    neighbor peer1 monitoring
#    neighbor peer1 send-community extended link-bandwidth aggregate 600
#    neighbor peer1 maximum-routes 12000
#    neighbor 10.1.3.2 export-localpref 4000
#    neighbor 10.1.3.2 next-hop-unchanged
#    neighbor 10.1.3.2 dont-capability-negotiate
#    neighbor 10.1.3.2 allowas-in 3
#    neighbor 10.1.3.2 default-originate always
#    neighbor 10.1.3.2 maximum-routes 500 warning-limit 5 percent
#    aggregate-address 1.2.1.0/24 as-set match-map match01
#    aggregate-address 5.2.1.0/24 attribute-map attrmatch01 advertise-only
#    redistribute static route-map map_static
#    redistribute attached-host
#    !
#    vlan 5
#    !
#    address-family ipv4
#       neighbor 10.1.3.2 prefix-list prefix01 out
#    !
#    vrf vrf01
#       route-target import 54:11
#       neighbor 12.1.3.2 dont-capability-negotiate
#       neighbor 12.1.3.2 allowas-in 3
#       neighbor 12.1.3.2 default-originate always
#       neighbor 12.1.3.2 maximum-routes 12000
# veos(config)#

  - name: Purge configuration
    arista.eos.eos_bgp_global:
      config:
        as_number: "100"
      state: purged

# After State:

# veos(config)#show running-config | section bgp
# veos(config)#

# Module Execution:

# "after": {},
#     "before": {
#         "aggregate_address": [
#             {
#                 "address": "1.2.1.0/24",
#                 "as_set": true,
#                 "match_map": "match01"
#             },
#             {
#                 "address": "5.2.1.0/24",
#                 "advertise_only": true,
#                 "attribute_map": "attrmatch01"
#             }
#         ],
#         "as_number": "100",
#         "bgp_params": {
#             "additional_paths": "send",
#             "convergence": {
#                 "slow_peer": true,
#                 "time": 6
#             }
#         },
#         "distance": {
#             "external": 50,
#             "internal": 50,
#             "local": 50
#         },
#         "maximum_paths": {
#             "max_equal_cost_paths": 55
#         },
#         "neighbor": [
#             {
#                 "fall_over": true,
#                 "link_bandwidth": {
#                     "set": true,
#                     "update_delay": 5
#                 },
#                 "maximum_received_routes": {
#                     "count": 12000
#                 },
#                 "monitoring": true,
#                 "peer": "peer1",
#                 "peer_group": "peer1",
#                 "send_community": {
#                     "community_attribute": "extended",
#                     "link_bandwidth_attribute": "aggregate",
#                     "speed": "600",
#                     "sub_attribute": "link-bandwidth"
#                 }
#             },
#             {
#                 "allowas_in": {
#                     "count": 3
#                 },
#                 "default_originate": {
#                     "always": true
#                 },
#                 "dont_capability_negotiate": true,
#                 "export_localpref": 4000,
#                 "maximum_received_routes": {
#                     "count": 500,
#                     "warning_limit": {
#                         "limit_percent": 5
#                     }
#                 },
#                 "next_hop_unchanged": true,
#                 "peer": "10.1.3.2"
#             }
#         ],
#         "redistribute": [
#             {
#                 "protocol": "static",
#                 "route_map": "map_static"
#             },
#             {
#                 "protocol": "attached-host"
#             }
#         ],
#         "vlan": 5,
#         "vrfs": [
#             {
#                 "neighbor": [
#                     {
#                         "allowas_in": {
#                             "count": 3
#                         },
#                         "default_originate": {
#                             "always": true
#                         },
#                         "dont_capability_negotiate": true,
#                         "maximum_received_routes": {
#                             "count": 12000
#                         },
#                         "peer": "12.1.3.2"
#                     }
#                 ],
#                 "route_target": {
#                     "action": "import",
#                     "target": "54:11"
#                 },
#                 "vrf": "vrf01"
#             }
#         ]
#     },
#     "changed": true,
#     "commands": [
#         "no router bgp 100"
#     ],

"""

from ansible.module_utils.basic import AnsibleModule

from ansible_collections.arista.eos.plugins.module_utils.network.eos.argspec.bgp_global.bgp_global import (
    Bgp_globalArgs,
)
from ansible_collections.arista.eos.plugins.module_utils.network.eos.config.bgp_global.bgp_global import (
    Bgp_global,
)


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

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

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


if __name__ == "__main__":
    main()
