#!/usr/bin/python
#
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.
#

"""
The module file for iosxr_ospfv2
"""

from __future__ import absolute_import, division, print_function

__metaclass__ = type

DOCUMENTATION = """
module: iosxr_ospfv2
short_description: OSPFv2 resource module
description: This module manages global OSPFv2 configuration on devices running Cisco
  IOS-XR
version_added: 1.0.0
author:
- Rohit Thakur (@rohitthakur2590)
notes:
- Tested against IOS-XR 6.1.3
- This module works with connection C(network_cli). See L(the IOS-XR Platform Options,../network/user_guide/platform_iosxr.html)
options:
  config:
    description: A list of OSPFv2 process configuration
    type: dict
    suboptions:
      processes:
        description: A list of OSPFv2 instances configuration
        type: list
        elements: dict
        suboptions:
          address_family_unicast:
            description: Enable unicast topology for ipv4 address family
            type: bool
          adjacency_stagger:
            description: Stagger OSPFv2 adjacency bring up
            type: dict
            suboptions:
              min_adjacency:
                description: Initial number of neighbors to bring up per area (default
                  2)
                type: int
              max_adjacency:
                description: Maximum simultaneous neighbors to bring up
                type: int
              disable:
                description: Disable stagger OSPFv2 adjacency
                type: bool
          authentication:
            description: Enable authentication
            type: dict
            suboptions:
              keychain:
                description: Specify keychain name
                type: str
              message_digest:
                description: Use message-digest authentication
                type: dict
                suboptions:
                  set:
                    description: Specify message-digest selection
                    type: bool
                  keychain:
                    description: Specify keychain name
                    type: str
              no_auth:
                description: Use no authentication
                type: bool
          apply_weight:
            description: Enable weights configured under interfaces for load sharing
            type: dict
            suboptions:
              bandwidth:
                description: Reference bandwidth to use for calculation (Mbits/sec)
                type: int
              default_weight:
                description: Specify default weight value to use when it is not configured
                  under interface
                type: int
          areas:
            description: Configure OSPFv2 areas' properties
            type: list
            elements: dict
            suboptions:
              area_id:
                description: Area ID as IP address or integer
                type: str
                required: true
              authentication:
                description: Enable authentication
                type: dict
                suboptions:
                  keychain:
                    description: Specify keychain name
                    type: str
                  message_digest:
                    description: Use message-digest authentication
                    type: dict
                    suboptions:
                      keychain:
                        description: Specify keychain name
                        type: str
                  no_auth:
                    description: Use no authentication
                    type: bool
              authentication_key:
                description: Used to mention authentication password (key)
                type: dict
                suboptions:
                  password:
                    description: The OSPFv2 password (key)
                    type: str
                  clear:
                    description: Specifies an UNENCRYPTED password (key) will follow
                    type: str
                  encrypted:
                    description: Specifies an ENCRYPTED password (key) will follow
                    type: str
              default_cost:
                description: Set the summary default-cost of a NSSA/stub area. Stub's
                  advertised external route metric
                type: int
              cost:
                description: Interface cost
                type: int
              dead_interval:
                description: Interval after which a neighbor is declared dead
                type: int
              hello_interval:
                description: Time between HELLO packets
                type: int
              transmit_delay:
                description: Estimated time needed to send link-state update packet
                type: int
              mpls:
                description: Configure MPLS routing protocol parameters
                type: dict
                suboptions:
                  traffic_eng:
                    description: Configure an ospf area to run MPLS Traffic Engineering
                    type: bool
                  ldp:
                    description: Configure LDP parameters
                    type: dict
                    suboptions:
                      auto_config:
                        description: Enable LDP IGP interface auto-configuration
                        type: bool
                      sync:
                        description: Enable LDP IGP synchronization
                        type: bool
                      sync_igp_shortcuts:
                        description: LDP sync for igp-shortcut tunnels
                        type: bool
              mtu_ignore:
                description: Enable/Disable ignoring of MTU in DBD packets
                type: str
                choices:
                - enable
                - disable
              bfd:
                description: Configure BFD parameters
                type: dict
                suboptions:
                  fast_detect:
                    description: Configure fast detection
                    type: dict
                    suboptions:
                      set:
                        description: Enable fast detection only
                        type: bool
                      strict_mode:
                        description: Hold down neighbor session until BFD session is up
                        type: bool
                  minimum_interval:
                    description: Hello interval in milli-seconds
                    type: int
                  multiplier:
                    description: Detect multiplier
                    type: int
              nssa:
                description:
                - NSSA settings for the area
                type: dict
                suboptions:
                  set:
                    description: Configure area as NSSA
                    type: bool
                  default_information_originate:
                    description: Originate default Type 7 LSA
                    type: dict
                    suboptions:
                      metric:
                        description: OSPFv2 default metric
                        type: int
                      metric_type:
                        description: Metric type for default routes
                        type: int
                  no_redistribution:
                    description: Do not send redistributed LSAs into NSSA area
                    type: bool
                  no_summary:
                    description: Do not send summary LSAs into NSSA area
                    type: bool
                  translate:
                    description: Translate LSA
                    type: dict
                    suboptions:
                      type7:
                        description:
                        - Translate from Type 7 to Type 5
                        type: dict
                        suboptions:
                          always:
                            description:
                            - Always translate LSAs
                            type: bool
              ranges:
                description: Summarize routes matching address/mask (border routers
                  only)
                type: list
                elements: dict
                suboptions:
                  address:
                    description: IP in Prefix format (x.x.x.x/len)
                    type: str
                    required: true
                  advertise:
                    description: Advertise this range (default)
                    type: bool
                  not_advertise:
                    description: DoNotAdvertise this range
                    type: bool
              route_policy:
                description: Specify the route-policy to filter type 3 LSAs (list
                  can have one inbound and/or one outbound policy only)
                type: list
                elements: dict
                suboptions:
                  parameters:
                    description: Specify parameter values for the policy
                    type: list
                    elements: str
                  direction:
                    description: Specify inbound or outbound
                    type: str
                    choices:
                    - in
                    - out
              stub:
                description:
                - Settings for configuring the area as a stub
                type: dict
                suboptions:
                  set:
                    description:
                    - Configure the area as a stub
                    type: bool
                  no_summary:
                    description:
                    - Do not send summary LSA into stub area
                    type: bool
              virtual_link:
                description: Define a virtual link
                type: list
                elements: dict
                suboptions:
                  id:
                    description: Router-ID of virtual link neighbor (A.B.C.D)
                    type: str
                    required: true
                  authentication:
                    description: Enable authentication
                    type: dict
                    suboptions:
                      keychain:
                        description: Specify keychain name
                        type: str
                      message_digest:
                        description: Use message-digest authentication
                        type: dict
                        suboptions:
                          keychain:
                            description: Specify keychain name
                            type: str
                      no_auth:
                        description: Use no authentication
                        type: bool
                  authentication_key:
                    description: Used to mention authentication password (key)
                    type: dict
                    suboptions:
                      password:
                        description: The OSPFv2 password (key)
                        type: str
                      clear:
                        description: Specifies an UNENCRYPTED password (key) will
                          follow
                        type: str
                      encrypted:
                        description: Specifies an ENCRYPTED password (key) will follow
                        type: str
                  dead_interval:
                    description: Interval after which a neighbor is declared dead
                    type: int
                  hello_interval:
                    description: Time between HELLO packets
                    type: int
                  retransmit_interval:
                    description: Delay between LSA retransmissions
                    type: int
                  transmit_delay:
                    description: Link state transmit delay
                    type: int
                  message_digest_key:
                    description: Message digest authentication password (key)
                    type: dict
                    suboptions:
                      id:
                        description: Key ID (1-255)
                        type: int
                        required: true
                      md5:
                        description: Use MD5 Algorithm
                        type: dict
                        suboptions:
                          password:
                            description: The OSPFv2 password (key)
                            type: str
                          clear:
                            description: Specifies an UNENCRYPTED password (key) will
                              follow
                            type: bool
                          encrypted:
                            description: Specifies an ENCRYPTED password (key) will
                              follow
                            type: bool

          authentication_key:
            description: Used to mention authentication password (key)
            type: dict
            suboptions:
              password:
                description: The OSPFv2 password (key)
                type: str
              clear:
                description: Specifies an UNENCRYPTED password (key) will follow
                type: bool
              encrypted:
                description: Specifies an ENCRYPTED password (key) will follow
                type: bool
          auto_cost:
            description: Calculate OSPFv2 interface cost according to bandwidth
            type: dict
            suboptions:
              reference_bandwidth:
                description: Specify reference bandwidth in megabits per sec
                type: int
              disable:
                description: Assign OSPFv2 cost based on interface type
                type: bool
          bfd:
            description: Configure BFD parameters
            type: dict
            suboptions:
              fast_detect:
                description: Configure fast detection
                type: dict
                suboptions:
                  set:
                    description: Enable fast detection only
                    type: bool
                  strict_mode:
                    description: Hold down neighbor session until BFD session is up
                    type: bool
              minimum_interval:
                description: Hello interval in milli-seconds
                type: int
              multiplier:
                description: Detect multiplier
                type: int
          capability:
            description: Enable specific OSPFv2 feature
            type: dict
            suboptions:
              type7:
                description: NSSA capability
                type: str
              opaque:
                description: Configure opaque LSA
                type: dict
                suboptions:
                  disable:
                    description: Disable Opaque LSA capability
                    type: bool
                  set:
                    description: Enable opaque LSA
                    type: bool
          cost:
            description: Interface cost (1-65535)
            type: int
          database_filter:
            description: Filter OSPFv2 LSA during synchronization and flooding (all
              outgoing LSA). Enable/Disable filtering
            type: str
            choices: [enable, disable]
          dead_interval:
            description: Interval after which a neighbor is declared dead
            type: int
          default_information_originate:
            description: Distribute default route
            type: dict
            suboptions:
              always:
                description: Always advertise default route
                type: bool
              metric:
                description: OSPFv2 default metric
                type: int
              metric_type:
                description: OSPFv2 metric type for default routes
                type: int
              route_policy:
                description: Apply route-policy to default-information origination
                type: str
              set:
                description: Enable distribution of default route
                type: bool
          default_metric:
            description: Set metric of redistributed routes
            type: int
          demand_circuit:
            description: Enable/Disable OSPFv2 demand circuit
            type: str
            choices: [enable, disable]
          distance:
            description: Define an administrative distance
            type: dict
            suboptions:
              admin_distance:
                description: Administrative distance
                type: list
                elements: dict
                suboptions:
                  value:
                    description: Distance value
                    type: int
                  source:
                    description: Source IP address
                    type: str
                  wildcard:
                    description: IP wild card bits (A.B.C.D)
                    type: str
                  access_list:
                    description: Access list name
                    type: str
              ospf_distance:
                description: OSPFv2 administrative distance
                type: dict
                suboptions:
                  external:
                    description: Distance for external routes
                    type: int
                  inter_area:
                    description: Distance for inter-area routes
                    type: int
                  intra_area:
                    description: Distance for intra-area routes
                    type: int
          distribute_link_state:
            description: Enable Distribution of LSAs to external services
            type: dict
            suboptions:
              instance_id:
                description: Set distribution process instance identifier
                type: int
              throttle:
                description: Throttle time between successive LSA updates
                type: int
          distribute_bgp_ls:
            description: Enable Distribution of LSAs to external services
            type: dict
            suboptions:
              instance_id:
                description: Set distribution process instance identifier
                type: int
              throttle:
                description: Throttle time between successive LSA updates
                type: int
          distribute_list:
            description: Filter networks in routing updates (list can have one inbound
              and/or one outbound policy only)
            type: list
            elements: dict
            suboptions:
              access_list:
                description: Inbound/outbound access-list
                type: str
              direction:
                description: Filter incoming/outgoing routing updates
                type: str
                choices:
                - in
                - out
              outgoing_params:
                description: Specify additional parameters for outgoing updates only
                type: dict
                suboptions:
                  route_type:
                    description: Type of routes
                    type: str
                    choices:
                    - bgp
                    - connected
                    - dagr
                    - ospf
                    - static
                  id:
                    description:
                    - For BGP, specify AS number. 2-byte AS number (or) 4-byte AS
                      number in asdot (X.Y) format (or) 4-byte AS number in asplain
                      format
                    - For OSPF, specify OSPFv2 instance name
                    type: str
              route_policy:
                description: Route Policy to filter OSPFv2 prefixes (for incoming
                  updates only)
                type: str
          external_out:
            description: Enable/Disable advertisement of intra-area prefixes as external
            type: str
            choices:
            - enable
            - disable
          flood_reduction:
            description: Enable/Disable OSPFv2 Flood Reduction
            type: str
            choices:
            - enable
            - disable
          hello_interval:
            description: Time between HELLO packets (<1-65535> seconds)
            type: int
          ignore_lsa_mospf:
            description: Do not complain upon receiving MOSPFv2 Type 6 LSA
            type: bool
          link_down_fast_detect:
            description: Enable fast or early detection of link-down events
            type: bool
          log_adjacency_changes:
            description: Log adjacency state changes
            type: dict
            suboptions:
              set:
                description: Set log adjacency
                type: bool
              disable:
                description: Disable log adjacency changes
                type: bool
              detail:
                description: Log all state changes
                type: bool
          loopback_stub_network:
            description: Advertise loopback as a stub network
            type: str
            choices:
            - enable
            - disable
          max_lsa:
            description:
            - Feature to limit the number of non-self-originated LSAs
            type: dict
            suboptions:
              threshold:
                description:
                - Threshold value (%) at which to generate a warning message
                type: int
              ignore_count:
                description:
                - Set count on how many times adjacencies can be suppressed
                type: int
              ignore_time:
                description:
                - Set number of minutes during which all adjacencies are suppressed
                type: int
              reset_time:
                description:
                - Set number of minutes after which ignore-count is reset to zero
                type: int
              warning_only:
                description:
                - Log a warning message when limit is exceeded
                type: bool
          max_metric:
            description: Set maximum metric
            type: dict
            suboptions:
              router_lsa:
                description: Maximum metric in self-originated router-LSAs
                type: dict
                suboptions:
                  set:
                    description: Set router-lsa attribute
                    type: bool
                  external_lsa:
                    description: External LSA configuration
                    type: dict
                    suboptions:
                      set:
                        description: Set external-lsa attribute
                        type: bool
                      max_metric_value:
                        description: Set max metric value for external LSAs
                        type: int
                  include_stub:
                    description:
                    - Advertise Max metric for Stub links as well
                    type: bool
                  on_startup:
                    description:
                    - Effective only at startup
                    type: dict
                    suboptions:
                      set:
                        description:
                        - Set on-startup attribute
                        type: bool
                      wait_period:
                        description:
                        - Wait period in seconds after startup
                        type: int
                      wait_for_bgp_asn:
                        description:
                        - ASN of BGP to wait for
                        type: int
                  summary_lsa:
                    description:
                    - Summary LSAs configuration
                    type: dict
                    suboptions:
                      set:
                        description:
                        - Set summary-lsa attribute
                        type: bool
                      max_metric_value:
                        description:
                        - Max metric value for summary LSAs
                        type: int
          message_digest_key:
            description: Message digest authentication password (key)
            type: dict
            suboptions:
              id:
                description: Key ID
                type: int
                required: true
              md5:
                description: Use MD5 Algorithm
                type: dict
                required: true
                suboptions:
                  password:
                    description: The OSPFv2 password (key)
                    type: str
                  clear:
                    description: Specifies an UNENCRYPTED password (key) will follow
                    type: bool
                  encrypted:
                    description: Specifies an ENCRYPTED password (key) will follow
                    type: bool
          microloop_avoidance:
            description: Avoid microloops
            type: dict
            suboptions:
              protected:
                description: Avoid microloops for protected prefixes only)
                type: bool
              rib_update_delay:
                description: Delay to introduce between SPF and RIB updates
                type: int
              segment_routing:
                description: Enable segment routing microloop avoidance
                type: bool
          monitor_convergence:
            description: Enables OSPFv2 route convergence monitoring
            type: dict
            suboptions:
              prefix_list:
                description: Enables Individual Prefix Monitoring
                type: str
              track_external_routes:
                description: Enables Tracking External(Type-5/7) Prefix monitoring
                type: bool
              track_ip_frr:
                description: Enables Tracking IP-Frr Convergence
                type: bool
              track_summary_routes:
                description: Enables Tracking Summary(Inter-Area) Prefix monitoring
                type: bool
          mpls:
            description: Configure MPLS routing protocol parameters
            type: dict
            suboptions:
              traffic_eng:
                description: Routing protocol commands for MPLS Traffic Engineering
                type: dict
                suboptions:
                  autoroute_exclude:
                    description: Exclude IP address destinations from using TE tunnels
                    type: dict
                    suboptions:
                      route_policy:
                        description: Policy name
                        type: str
                      parameters:
                        description: Specify parameter values for the policy
                        type: list
                        elements: str
                  igp_intact:
                    description: Retain one or more IPv4 nexthops with tunnel nexthops
                    type: bool
                  ldp_sync_update:
                    description: Enable LDP sync induced metric propagation
                    type: bool
                  multicast_intact:
                    description: Publish multicast-intact paths to RIB
                    type: bool
                  router_id:
                    description: Traffic Engineering stable IP address for system
                    type: str
              ldp:
                description: Configure LDP parameters
                type: dict
                suboptions:
                  auto_config:
                    description: Enable LDP IGP interface auto-configuration
                    type: bool
                  sync:
                    description: Enable LDP IGP synchronization
                    type: bool
                  sync_igp_shortcuts:
                    description: LDP sync for igp-shortcut tunnels
                    type: bool
          mtu_ignore:
            description: Enable/Disable ignoring of MTU in DBD packets
            type: str
            choices:
            - enable
            - disable
          network:
            description: Network type
            type: dict
            suboptions:
              broadcast:
                description: Specify OSPFv2 broadcast multi-access network
                type: bool
              non_broadcast:
                description: Specify OSPFv2 NBMA network
                type: bool
              point_to_multipoint:
                description: Specify OSPFv2 point-to-multipoint network
                type: bool
              point_to_point:
                description: Specify OSPFv2 point-to-point network
                type: bool
          nsf:
            description: Non-stop forwarding
            type: dict
            suboptions:
              cisco:
                description: Cisco Non-stop forwarding
                type: dict
                suboptions:
                  enforce_global:
                    description: Cancel NSF restart when non-NSF-aware neighbors detected
                      for the whole OSPFv2 process
                    type: bool
                  set:
                    description: Enable Cisco NSF
                    type: bool
              flush_delay_time:
                description: Maximum time allowed for external route learning
                type: int
              ietf:
                description: IETF graceful restart
                type: dict
                suboptions:
                  helper_disable:
                    description: Disable router's helper support level
                    type: bool
                  set:
                    description: Only enable ietf option
                    type: bool
              interval:
                description: Minimum interval between NSF restarts (<90-3600> seconds)
                type: int
              lifetime:
                description: Maximum route lifetime following restart (<90-1800> seconds)
                type: int
          nsr:
            description: Enable NSR for all VRFs in this process. 'False' option to
              disable NSR for all VRFs in this process
            type: bool
          packet_size:
            description: Size of OSPFv2 packets to use. min=576 max=MTU bytes
            type: int
          passive:
            description: Enable/Disable passive
            type: str
            choices:
            - enable
            - disable
          prefix_suppression:
            description: Suppress advertisement of the prefixes
            type: dict
            suboptions:
              set:
                description: Set the suppression option
                type: bool
              secondary_address:
                description: Enable/Disable secondary address suppression
                type: bool
          priority:
            description: Router priority
            type: int
          process_id:
            description: The OSPFv2 Process ID
            type: str
            required: true
          protocol_shutdown:
            description: Protocol specific configuration
            type: dict
            suboptions:
              host_mode:
                description: Only traffic destined for this box allowed(cisco-support)
                type: bool
              on_reload:
                description: Shutdown post reload only
                type: bool
              set:
                description: Shutdown the OSPFv2 Protocol
                type: bool
              limit:
                description: High watermark for incoming priority events
                type: dict
                suboptions:
                  high:
                    description: Hello events are dropped when incoming event queue
                      exceeds this value
                    type: int
                  low:
                    description: DBD/LS Update/Req packets are dropped when incoming
                      event queue exceeds this value
                    type: int
                  medium:
                    description: LSA ACKs are dropped when incoming event queue exceeds
                      this value
                    type: int
          redistribute:
            description: Redistribute information from another routing Protocol
            type: dict
            suboptions:
              route_type:
                description: Route type to redistribute
                type: str
                choices: [application, bgp, connected, dagr, eigrp, isis, mobile,
                  ospf, rip, static, subscriber]
              id:
                description: OnePK application name for application routes (or) AS
                  number for bgp and eigrp (or) instance name for isis and ospf
                type: str
              level:
                description: ISIS levels
                choices: [1, 2, 12]
                type: int
              lsa_type_summary:
                description: LSA type 3 for redistributed routes
                type: bool
              match:
                description: Redistribution of routes. For OSPFv2 - external/internal/nssa-external
                  1/2. For EIGRP - external/internal
                type: str
              metric:
                description: Metric for redistributed routes
                type: int
              metric_type:
                description: OSPFv2 exterior metric type for redistributed routes
                type: int
                choices: [1, 2]
              route_policy:
                description: Apply route-policy to redistribution
                type: dict
                suboptions:
                  name:
                    description: Name of the policy
                    type: str
                  parameters:
                    description: Specify parameter values for the policy
                    type: list
                    elements: str
              nssa_only:
                description: Redistribute to NSSA areas only
                type: bool
              preserve_med:
                description: Preserve med of BGP routes
                type: bool
              tag:
                description: Set tag for routes redistributed into OSPFv2
                type: int
          retransmit_interval:
            description: Delay between LSA retransmissions
            type: int
          router_id:
            description: OSPFv2 router-id in IPv4 address format (A.B.C.D)
            type: str
          security_ttl:
            description: Enable security
            type: dict
            suboptions:
              set:
                description: Enable ttl security
                type: bool
              hops:
                description: Maximum number of IP hops allowed <1-254>
                type: int
          summary_in:
            description: Enable/Disable advertisement of external prefixes as inter-area
            type: str
            choices: [enable, disable]
          summary_prefix:
            description: Configure IP address summaries
            type: list
            elements: dict
            suboptions:
              prefix:
                description: IP summary address/mask (A.B.C.D/prefix)
                type: str
                required: true
              not_advertise:
                description: Suppress routes that match the specified prefix/mask
                  pair
                type: bool
              tag:
                description: Set tag
                type: int
          timers:
            description: Configure timer related constants
            type: dict
            suboptions:
              graceful_shutdown:
                description: Timers for graceful shutdown(cisco-support)
                type: dict
                suboptions:
                  initial_delay:
                    description: Delay before starting graceful shutdown
                    type: int
                  retain_routes:
                    description: Time to keep routes active after graceful shutdown
                    type: int
              lsa:
                description: OSPFv2 global LSA timers
                type: dict
                suboptions:
                  group_pacing:
                    description: OSPFv2 LSA group pacing timer. Interval between group
                      of LSA being refreshed or maxaged
                    type: int
                  min_arrival:
                    description: OSPFv2 MinLSArrival timer. The minimum interval in
                      millisec between accepting the same LSA
                    type: int
                  refresh:
                    description: OSPFv2 LSA refresh interval. How often self-originated
                      LSAs should be refreshed, in seconds
                    type: int
              throttle:
                description: OSPFv2 throttle timers
                type: dict
                suboptions:
                  lsa_all:
                    description: LSA throttle timers for all types of OSPFv2 LSAs
                    type: dict
                    suboptions:
                      initial_delay:
                        description: Delay to generate first occurance of LSA in milliseconds
                        type: int
                      min_delay:
                        description: Minimum delay between originating the same LSA
                          in milliseconds
                        type: int
                      max_delay:
                        description: Maximum delay between originating the same LSA
                          in milliseconds
                        type: int
                  spf:
                    description: OSPFv2 SPF throttle timers
                    type: dict
                    suboptions:
                      change_delay:
                        description: Delay between receiving a change to SPF calculation
                          in milliseconds
                        type: int
                      second_delay:
                        description: Delay between first and second SPF calculation
                          in milliseconds
                        type: int
                      max_wait:
                        description: Maximum wait time in milliseconds for SPF calculations
                        type: int
                  fast_reroute:
                    description: Fast-reroute throttle timer. Delay between end of
                      SPF and start of the fast-reroute computation in milliseconds
                    type: int
              pacing_flood:
                description: OSPFv2 flood pacing timer. Interval in msec to pace flooding
                  on all interfaces
                type: int
          transmit_delay:
            description: Estimated time needed to send link-state update packet
            type: int
          weight:
            description: Interface weight
            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 IOS-XR device
      by executing the command B(show running-config router ospf).
    - 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:
    - merged
    - replaced
    - deleted
    - parsed
    - gathered
    - rendered
    - overridden
    default: merged

"""

EXAMPLES = """
# Using merged

# Before state:
# -------------
#
# RP/0/RP0/CPU0:anton#show running-config router ospf
# Thu Jun 11 15:54:44.569 UTC
# % No such configuration item(s)
#

- name: Merge provided OSPFv2 configuration with the existing configuration
  cisco.iosxr.iosxr_ospfv2:
    config:
      processes:
      - process_id: '27'
        areas:
        - area_id: '10'
          hello_interval: 2
          authentication:
            keychain: ansi11393
      - process_id: '26'
        adjacency_stagger:
          max_adjacency: 20
          min_adjacency: 10
      - process_id: '10'
        authentication:
          keychain: ansible_test1102
        areas:
        - area_id: '11'
          default_cost: 5
          cost: 11
        - area_id: 22
          default_cost: 6
      - process_id: '30'
        areas:
        - area_id: 11
          default_cost: 5
        - area_id: 22
          default_cost: 6

        cost: 2
        default_metric: 10
        transmit_delay: 2
        hello_interval: 1
        dead_interval: 2
        retransmit_interval: 2
        weight: 2
        packet_size: 577
        priority: 1
        router_id: 2.2.2.2
        demand_circuit: enable
        passive: disable
        summary_in: enable
        flood_reduction: disable
        mtu_ignore: enable
        external_out: disable
    state: merged

#
#
# ------------------------
# Module Execution Result
# ------------------------
#
#  "before": {}
#
#  "commands": [
#        "router ospf 30",
#        "cost 2",
#        "weight 2",
#        "passive disable",
#        "priority 1",
#        "flood-reduction disable",
#        "default-metric 10",
#        "router-id 2.2.2.2",
#        "demand-circuit enable",
#        "packet-size 577",
#        "transmit-delay 2",
#        "summary-in enable",
#        "external-out disable",
#        "dead-interval 2",
#        "hello-interval 1",
#        "retransmit-interval 2",
#        "mtu-ignore enable",
#        "area 11 default-cost 5",
#        "area 22 default-cost 6",
#        "router ospf 26",
#        "adjacency stagger 10 20",
#        "authentication message-digest keychain ansible1101pass",
#        "router ospf 27",
#        "area 10 authentication keychain ansi11393",
#        "area 10 hello-interval 2",
#        "router ospf 10",
#        "authentication keychain ansible_test1102",
#        "area 11 default-cost 5",
#        "area 11 cost 11",
#        "area 22 default-cost 6"
#    ]
#
#  "after": {
#        "processes": [
#            {
#                "areas": [
#                    {
#                        "area_id": "11",
#                        "cost": 11,
#                        "default_cost": 5
#                    },
#                    {
#                        "area_id": "22",
#                        "default_cost": 6
#                    }
#                ],
#                "authentication": {
#                    "keychain": "ansible_test1102"
#                },
#                "process_id": "10"
#            },
#            {
#                "adjacency_stagger": {
#                    "max_adjacency": 20,
#                    "min_adjacency": 10
#                },
#                "authentication": {
#                    "message_digest": {
#                        "keychain": "ansible1101pass"
#                    }
#                },
#                "process_id": "26"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "10",
#                        "authentication": {
#                            "keychain": "ansi11393"
#                        },
#                        "hello_interval": 2
#                    }
#                ],
#                "process_id": "27"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "11",
#                        "default_cost": 5
#                    },
#                    {
#                        "area_id": "22",
#                        "default_cost": 6
#                    }
#                ],
#                "cost": 2,
#                "dead_interval": 2,
#                "default_metric": 10,
#                "demand_circuit": "enable",
#                "external_out": "disable",
#                "flood_reduction": "disable",
#                "hello_interval": 1,
#                "mtu_ignore": "enable",
#                "packet_size": 577,
#                "passive": "disable",
#                "priority": 1,
#                "process_id": "30",
#                "retransmit_interval": 2,
#                "router_id": "2.2.2.2",
#                "summary_in": "enable",
#                "transmit_delay": 2,
#                "weight": 2
#            }
#        ]
#    }
#
#
# ------------
# After state
# ------------
#
# RP/0/RP0/CPU0:anton#show running-config router ospf
# Thu Jun 11 16:06:44.406 UTC
# router ospf 10
#  authentication keychain ansible_test1102
#  area 11
#   cost 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
# router ospf 26
#  authentication message-digest keychain ansible1101pass
#  adjacency stagger 10 20
# !
# router ospf 27
#  area 10
#  authentication keychain ansi11393
#   hello-interval 2
# !
# !
# router ospf 30
#  router-id 2.2.2.2
#  summary-in enable
#  external-out disable
#  cost 2
#  packet-size 577
#  weight 2
#  passive disable
#  priority 1
#  mtu-ignore enable
#  flood-reduction disable
#  dead-interval 2
#  retransmit-interval 2
#  demand-circuit enable
#  hello-interval 1
#  transmit-delay 2
#  default-metric 10
#  area 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
#


# Using replaced
#
# ------------
# Before state
# ------------
#
#
# RP/0/RP0/CPU0:anton#show running-config router ospf
# Thu Jun 11 16:06:44.406 UTC
# router ospf 10
#  authentication keychain ansible_test1102
#  area 11
#   cost 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
# router ospf 26
#  authentication message-digest keychain ansible1101pass
#  adjacency stagger 10 20
# !
# router ospf 27
#  area 10
#  authentication keychain ansi11393
#   hello-interval 2
# !
# !
# router ospf 30
#  router-id 2.2.2.2
#  summary-in enable
#  external-out disable
#  cost 2
#  packet-size 577
#  weight 2
#  passive disable
#  priority 1
#  mtu-ignore enable
#  flood-reduction disable
#  dead-interval 2
#  retransmit-interval 2
#  demand-circuit enable
#  hello-interval 1
#  transmit-delay 2
#  default-metric 10
#  area 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
#

- name: Replace OSPFv2 routes configurations from the device
  cisco.iosxr.iosxr_ospfv2:
    config:
      processes:
      - process_id: 27
        areas:
        - area_id: 10
          hello_interval: 2
        - area_id: 20
          cost: 2
          default_cost: 2
          authentication:
            keychain: ansi11393
      - process_id: 26
        adjacency_stagger:
          min_adjacency: 10
          max_adjacency: 20
    state: replaced

#
#
# ------------------------
# Module Execution Result
# ------------------------
#
#  "before": {
#        "processes": [
#            {
#                "areas": [
#                    {
#                        "area_id": "11",
#                        "cost": 11,
#                        "default_cost": 5
#                    },
#                    {
#                        "area_id": "22",
#                        "default_cost": 6
#                    }
#                ],
#                "authentication": {
#                    "keychain": "ansible_test1102"
#                },
#                "process_id": "10"
#            },
#            {
#                "adjacency_stagger": {
#                    "max_adjacency": 20,
#                    "min_adjacency": 10
#                },
#                "authentication": {
#                    "message_digest": {
#                        "keychain": "ansible1101pass"
#                    }
#                },
#                "process_id": "26"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "10",
#                        "authentication": {
#                            "keychain": "ansi11393"
#                        },
#                        "hello_interval": 2
#                    }
#                ],
#                "process_id": "27"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "11",
#                        "default_cost": 5
#                    },
#                    {
#                        "area_id": "22",
#                        "default_cost": 6
#                    }
#                ],
#                "cost": 2,
#                "dead_interval": 2,
#                "default_metric": 10,
#                "demand_circuit": "enable",
#                "external_out": "disable",
#                "flood_reduction": "disable",
#                "hello_interval": 1,
#                "mtu_ignore": "enable",
#                "packet_size": 577,
#                "passive": "disable",
#                "priority": 1,
#                "process_id": "30",
#                "retransmit_interval": 2,
#                "router_id": "2.2.2.2",
#                "summary_in": "enable",
#                "transmit_delay": 2,
#                "weight": 2
#            }
#        ]
#    }
#
#  "commands": [
#        "router ospf 27",
#        "no area 10 authentication keychain ansi11393",
#        "area 20 authentication keychain ansi11393",
#        "area 20 default-cost 2",
#        "area 20 cost 2"
#    ]
#
#  "after": {
#        "processes": [
#            {
#                "areas": [
#                    {
#                        "area_id": "11",
#                        "cost": 11,
#                        "default_cost": 5
#                    },
#                    {
#                        "area_id": "22",
#                        "default_cost": 6
#                    }
#                ],
#                "authentication": {
#                    "keychain": "ansible_test1102"
#                },
#                "process_id": "10"
#            },
#            {
#                "adjacency_stagger": {
#                    "max_adjacency": 20,
#                    "min_adjacency": 10
#                },
#                "authentication": {
#                    "message_digest": {
#                        "keychain": "ansible1101pass"
#                    }
#                },
#                "process_id": "26"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "10",
#                        "hello_interval": 2
#                    },
#                    {
#                        "area_id": "20",
#                        "authentication": {
#                            "keychain": "ansi11393"
#                        },
#                        "cost": 2,
#                        "default_cost": 2
#                    }
#                ],
#                "process_id": "27"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "11",
#                        "default_cost": 5
#                    },
#                    {
#                        "area_id": "22",
#                        "default_cost": 6
#                    }
#                ],
#                "cost": 2,
#                "dead_interval": 2,
#                "default_metric": 10,
#                "demand_circuit": "enable",
#                "external_out": "disable",
#                "flood_reduction": "disable",
#                "hello_interval": 1,
#                "mtu_ignore": "enable",
#                "packet_size": 577,
#                "passive": "disable",
#                "priority": 1,
#                "process_id": "30",
#                "retransmit_interval": 2,
#                "router_id": "2.2.2.2",
#                "summary_in": "enable",
#                "transmit_delay": 2,
#                "weight": 2
#            }
#        ]
#    }
#
#
# -----------
# After state
# -----------
#
# RP/0/RP0/CPU0:anton(config)#do show running-config router ospf
# Thu Jun 11 16:40:31.038 UTC
# router ospf 10
#  authentication keychain ansible_test1102
#  area 11
#   cost 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
# router ospf 26
#  authentication message-digest keychain ansible1101pass
#  adjacency stagger 10 20
# !
# router ospf 27
#  area 10
#   hello-interval 2
#  !
#  area 20
#   cost 2
#   authentication keychain ansi11393
#   default-cost 2
#  !
# !
# router ospf 30
#  router-id 2.2.2.2
#  summary-in enable
#  external-out disable
#  cost 2
#  packet-size 577
#  weight 2
#  passive disable
#  priority 1
#  mtu-ignore enable
#  flood-reduction disable
#  dead-interval 2
#  retransmit-interval 2
#  demand-circuit enable
#  hello-interval 1
#  transmit-delay 2
#  default-metric 10
#  area 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
#


# Using overridden
#
# ------------
# Before state
# ------------
#
#
# RP/0/RP0/CPU0:anton#show running-config router ospf
# Thu Jun 11 16:06:44.406 UTC
# router ospf 10
#  authentication keychain ansible_test1102
#  area 11
#   cost 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
# router ospf 26
#  authentication message-digest keychain ansible1101pass
#  adjacency stagger 10 20
# !
# router ospf 27
#  area 10
#  authentication keychain ansi11393
#   hello-interval 2
# !
# !
# router ospf 30
#  router-id 2.2.2.2
#  summary-in enable
#  external-out disable
#  cost 2
#  packet-size 577
#  weight 2
#  passive disable
#  priority 1
#  mtu-ignore enable
#  flood-reduction disable
#  dead-interval 2
#  retransmit-interval 2
#  demand-circuit enable
#  hello-interval 1
#  transmit-delay 2
#  default-metric 10
#  area 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
#

- name: Override existing OSPFv2 configurations from the device
  cisco.iosxr.iosxr_ospfv2:
    config:
      processes:
      - process_id: 27
        areas:
        - area_id: 10
          hello_interval: 2
          authentication:
            keychain: ansi11393
        - area_id: 20
          cost: 2
          default_cost: 2
          authentication:
            keychain: ansi11393
      - process_id: 26
        adjacency_stagger:
          min_adjacency: 10
          max_adjacency: 20
    state: overridden

#
#
# ------------------------
# Module Execution Result
# ------------------------
#
#  "before": {
#        "processes": [
#            {
#                "areas": [
#                    {
#                        "area_id": "11",
#                        "cost": 11,
#                        "default_cost": 5
#                    },
#                    {
#                        "area_id": "22",
#                        "default_cost": 6
#                    }
#                ],
#                "authentication": {
#                    "keychain": "ansible_test1102"
#                },
#                "process_id": "10"
#            },
#            {
#                "adjacency_stagger": {
#                    "max_adjacency": 20,
#                    "min_adjacency": 10
#                },
#                "authentication": {
#                    "message_digest": {
#                        "keychain": "ansible1101pass"
#                    }
#                },
#                "process_id": "26"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "10",
#                        "authentication": {
#                            "keychain": "ansi11393"
#                        },
#                        "hello_interval": 2
#                    }
#                ],
#                "process_id": "27"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "11",
#                        "default_cost": 5
#                    },
#                    {
#                        "area_id": "22",
#                        "default_cost": 6
#                    }
#                ],
#                "cost": 2,
#                "dead_interval": 2,
#                "default_metric": 10,
#                "demand_circuit": "enable",
#                "external_out": "disable",
#                "flood_reduction": "disable",
#                "hello_interval": 1,
#                "mtu_ignore": "enable",
#                "packet_size": 577,
#                "passive": "disable",
#                "priority": 1,
#                "process_id": "30",
#                "retransmit_interval": 2,
#                "router_id": "2.2.2.2",
#                "summary_in": "enable",
#                "transmit_delay": 2,
#                "weight": 2
#            }
#        ]
#    }
#
#  "commands": [
#        "router ospf 10",
#        "no authentication keychain ansible_test1102",
#        "no area 11 default-cost 5",
#        "no area 11 cost 11",
#        "no area 22 default-cost 6",
#        "router ospf 30",
#        "no cost 2",
#        "no weight 2",
#        "no passive disable",
#        "no priority 1",
#        "no flood-reduction disable",
#        "no default-metric 10",
#        "no router-id 2.2.2.2",
#        "no demand-circuit enable",
#        "no packet-size 577",
#        "no transmit-delay 2",
#        "no summary-in enable",
#        "no external-out disable",
#        "no dead-interval 2",
#        "no hello-interval 1",
#        "no retransmit-interval 2",
#        "no mtu-ignore enable",
#        "no area 11 default-cost 5",
#        "no area 22 default-cost 6",
#        "router ospf 27",
#        "area 20 authentication keychain ansi11393",
#        "area 20 default-cost 2",
#        "area 20 cost 2"
#    ]
#
#  "after": {
#        "processes": [
#            {
#                "process_id": "10"
#            },
#            {
#                "adjacency_stagger": {
#                    "max_adjacency": 20,
#                    "min_adjacency": 10
#                },
#                "authentication": {
#                    "message_digest": {
#                        "keychain": "ansible1101pass"
#                    }
#                },
#                "process_id": "26"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "10",
#                        "authentication": {
#                            "keychain": "ansi11393"
#                        },
#                        "hello_interval": 2
#                    },
#                    {
#                        "area_id": "20",
#                        "authentication": {
#                            "keychain": "ansi11393"
#                        },
#                        "cost": 2,
#                        "default_cost": 2
#                    }
#                ],
#                "process_id": "27"
#            },
#            {
#                "process_id": "30"
#            }
#        ]
#    }
#
#
# -----------
# After state
# -----------
#
# RP/0/RP0/CPU0:anton#show running-config router ospf
# Thu Jun 11 16:50:36.332 UTC
# router ospf 10
# !
# router ospf 26
#  authentication message-digest keychain ansible1101pass
#  adjacency stagger 10 20
# !
# router ospf 27
#  area 10
#   authentication keychain ansi11393
#   hello-interval 2
#  !
#  area 20
#   cost 2
#   authentication keychain ansi11393
#   default-cost 2
#  !
# !
# router ospf 30
# !
#


# Using deleted
#
# ------------
# Before state
# ------------
#
#
# RP/0/RP0/CPU0:anton#show running-config router ospf
# Thu Jun 11 16:06:44.406 UTC
# router ospf 10
#  authentication keychain ansible_test1102
#  area 11
#   cost 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
# router ospf 26
#  authentication message-digest keychain ansible1101pass
#  adjacency stagger 10 20
# !
# router ospf 27
#  area 10
#  authentication keychain ansi11393
#   hello-interval 2
# !
# !
# router ospf 30
#  router-id 2.2.2.2
#  summary-in enable
#  external-out disable
#  cost 2
#  packet-size 577
#  weight 2
#  passive disable
#  priority 1
#  mtu-ignore enable
#  flood-reduction disable
#  dead-interval 2
#  retransmit-interval 2
#  demand-circuit enable
#  hello-interval 1
#  transmit-delay 2
#  default-metric 10
#  area 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
#

- name: Deleted existing OSPFv2 configurations from the device
  cisco.iosxr.iosxr_ospfv2:
    config:
      processes:
      - process_id: '10'
      - process_id: '26'
      - process_id: '27'
      - process_id: '30'
    state: deleted

#
#
# ------------------------
# Module Execution Result
# ------------------------
#
#  "before": {
#        "processes": [
#            {
#                "areas": [
#                    {
#                        "area_id": "11",
#                        "cost": 11,
#                        "default_cost": 5
#                    },
#                    {
#                        "area_id": "22",
#                        "default_cost": 6
#                    }
#                ],
#                "authentication": {
#                    "keychain": "ansible_test1102"
#                },
#                "process_id": "10"
#            },
#            {
#                "adjacency_stagger": {
#                    "max_adjacency": 20,
#                    "min_adjacency": 10
#                },
#                "authentication": {
#                    "message_digest": {
#                        "keychain": "ansible1101pass"
#                    }
#                },
#                "process_id": "26"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "10",
#                        "authentication": {
#                            "keychain": "ansi11393"
#                        },
#                        "hello_interval": 2
#                    }
#                ],
#                "process_id": "27"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "11",
#                        "default_cost": 5
#                    },
#                    {
#                        "area_id": "22",
#                        "default_cost": 6
#                    }
#                ],
#                "cost": 2,
#                "dead_interval": 2,
#                "default_metric": 10,
#                "demand_circuit": "enable",
#                "external_out": "disable",
#                "flood_reduction": "disable",
#                "hello_interval": 1,
#                "mtu_ignore": "enable",
#                "packet_size": 577,
#                "passive": "disable",
#                "priority": 1,
#                "process_id": "30",
#                "retransmit_interval": 2,
#                "router_id": "2.2.2.2",
#                "summary_in": "enable",
#                "transmit_delay": 2,
#                "weight": 2
#            }
#        ]
#    },
#
#  "commands": [
#        "router ospf 10",
#        "no authentication keychain ansible_test1102",
#        "no area 11 default-cost 5",
#        "no area 11 cost 11",
#        "no area 22 default-cost 6",
#        "router ospf 26",
#        "no adjacency stagger 10 20",
#        "no authentication message-digest keychain ansible1101pass",
#        "router ospf 27",
#        "no area 10 authentication keychain ansi11393",
#        "no area 10 hello-interval 2",
#        "router ospf 30",
#        "no cost 2",
#        "no weight 2",
#        "no passive disable",
#        "no priority 1",
#        "no flood-reduction disable",
#        "no default-metric 10",
#        "no router-id 2.2.2.2",
#        "no demand-circuit enable",
#        "no packet-size 577",
#        "no transmit-delay 2",
#        "no summary-in enable",
#        "no external-out disable",
#        "no dead-interval 2",
#        "no hello-interval 1",
#        "no retransmit-interval 2",
#        "no mtu-ignore enable",
#        "no area 11 default-cost 5",
#        "no area 22 default-cost 6"
#    ]
#
#  "after": {
#        "processes": [
#            {
#                "process_id": "10"
#            },
#            {
#                "process_id": "26"
#            },
#            {
#                "process_id": "27"
#            },
#            {
#                "process_id": "30"
#            }
#        ]
#    }
#
#
# -----------
# After state
# -----------
#
# RP/0/RP0/CPU0:anton(config)#show running-config router ospf
# Thu Jun 11 17:07:34.218 UTC
# router ospf 10
# !
# router ospf 26
# !
# router ospf 27
# !
# router ospf 30
# !


# Using parsed
# parsed.cfg
# ------------
# Thu Jun 11 17:28:51.918 UTC
# router ospf 10
#  authentication keychain ansible_test1102
#  area 11
#   cost 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
# router ospf 26
#  authentication message-digest keychain ansible1101pass
#  adjacency stagger 10 20
# !
# router ospf 27
#  area 10
#   authentication keychain ansi11393
#   hello-interval 2
#  !
# !
# router ospf 30
#  router-id 2.2.2.2
#  summary-in enable
#  external-out disable
#  cost 2
#  packet-size 577
#  weight 2
#  passive disable
#  priority 1
#  mtu-ignore enable
#  flood-reduction disable
#  dead-interval 2
#  retransmit-interval 2
#  demand-circuit enable
#  hello-interval 1
#  transmit-delay 2
#  default-metric 10
#  area 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
- name: Parsed the device configuration to get output commands
  cisco.iosxr.iosxr_ospfv2:
    running_config: "{{ lookup('file', './parsed.cfg') }}"
    state: parsed
#
#
# -------------------------
# Module Execution Result
# -------------------------
#
#
# "parsed": {
#        "processes": [
#            {
#                "areas": [
#                    {
#                        "area_id": "11",
#                        "cost": 11,
#                        "default_cost": 5
#                    },
#                    {
#                        "area_id": "22",
#                        "default_cost": 6
#                    }
#                ],
#                "authentication": {
#                    "keychain": "ansible_test1102"
#                },
#                "process_id": "10"
#            },
#            {
#                "adjacency_stagger": {
#                    "max_adjacency": 20,
#                    "min_adjacency": 10
#                },
#                "authentication": {
#                    "message_digest": {
#                        "keychain": "ansible1101pass"
#                    }
#                },
#                "process_id": "26"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "10",
#                        "authentication": {
#                            "keychain": "ansi11393"
#                        },
#                        "hello_interval": 2
#                    }
#                ],
#                "process_id": "27"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "11",
#                        "default_cost": 5
#                    },
#                    {
#                        "area_id": "22",
#                        "default_cost": 6
#                    }
#                ],
#                "cost": 2,
#                "dead_interval": 2,
#                "default_metric": 10,
#                "demand_circuit": "enable",
#                "external_out": "disable",
#                "flood_reduction": "disable",
#                "hello_interval": 1,
#                "mtu_ignore": "enable",
#                "packet_size": 577,
#                "passive": "disable",
#                "priority": 1,
#                "process_id": "30",
#                "retransmit_interval": 2,
#                "router_id": "2.2.2.2",
#                "summary_in": "enable",
#                "transmit_delay": 2,
#                "weight": 2
#            }
#        ]
#    }



# Using rendered
#
#
- name: Render the commands for provided  configuration
  cisco.iosxr.iosxr_ospfv2:
    config:
      processes:
      - process_id: 27
        areas:
        - area_id: 10
          hello_interval: 2
          authentication:
            keychain: ansi11393
      - process_id: 26
        adjacency_stagger:
          min_adjacency: 10
          max_adjacency: 20
      - process_id: 10
        authentication:
          keychain: ansible_test1102
        areas:
        - area_id: 11
          default_cost: 5
          cost: 11
        - area_id: 22
          default_cost: 6
      - process_id: 30
        areas:
        - area_id: 11
          default_cost: 5
        - area_id: 22
          default_cost: 6

        cost: 2
        default_metric: 10
        transmit_delay: 2
        hello_interval: 1
        dead_interval: 2
        retransmit_interval: 2
        weight: 2
        packet_size: 577
        priority: 1
        router_id: 2.2.2.2
        demand_circuit: enable
        passive: disable
        summary_in: enable
        flood_reduction: disable
        mtu_ignore: enable
        external_out: disable
    state: rendered

#
#
# -------------------------
# Module Execution Result
# -------------------------
#
#
# "rendered": [
#        "router ospf 27",
#        "area 10 authentication keychain ansi11393",
#        "area 10 hello-interval 2",
#        "router ospf 26",
#        "adjacency stagger 10 20",
#        "authentication message-digest keychain ansible1101pass",
#        "router ospf 10",
#        "authentication keychain ansible_test1102",
#        "area 11 default-cost 5",
#        "area 11 cost 11",
#        "area 22 default-cost 6",
#        "router ospf 30",
#        "cost 2",
#        "weight 2",
#        "passive disable",
#        "priority 1",
#        "flood-reduction disable",
#        "default-metric 10",
#        "router-id 2.2.2.2",
#        "demand-circuit enable",
#        "packet-size 577",
#        "transmit-delay 2",
#        "summary-in enable",
#        "external-out disable",
#        "dead-interval 2",
#        "hello-interval 1",
#        "retransmit-interval 2",
#        "mtu-ignore enable",
#        "area 11 default-cost 5",
#        "area 22 default-cost 6"
#    ]


# Using gathered
#
# Before state:
# -------------
#
# RP/0/RP0/CPU0:anton#show running-config router ospf
# Thu Jun 11 16:06:44.406 UTC
# router ospf 10
#  authentication keychain ansible_test1102
#  area 11
#   cost 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
# router ospf 26
#  authentication message-digest keychain ansible1101pass
#  adjacency stagger 10 20
# !
# router ospf 27
#  area 10
#  authentication keychain ansi11393
#   hello-interval 2
# !
# !
# router ospf 30
#  router-id 2.2.2.2
#  summary-in enable
#  external-out disable
#  cost 2
#  packet-size 577
#  weight 2
#  passive disable
#  priority 1
#  mtu-ignore enable
#  flood-reduction disable
#  dead-interval 2
#  retransmit-interval 2
#  demand-circuit enable
#  hello-interval 1
#  transmit-delay 2
#  default-metric 10
#  area 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
#
- name: Gather ospfv2 routes configuration
  cisco.iosxr.iosxr_ospfv2:
    state: gathered
#
#
# -------------------------
# Module Execution Result
# -------------------------
#
#    "gathered": {
#        "processes": [
#            {
#                "areas": [
#                    {
#                        "area_id": "11",
#                        "cost": 11,
#                        "default_cost": 5
#                    },
#                    {
#                        "area_id": "22",
#                        "default_cost": 6
#                    }
#                ],
#                "authentication": {
#                    "keychain": "ansible_test1102"
#                },
#                "process_id": "10"
#            },
#            {
#                "adjacency_stagger": {
#                    "max_adjacency": 20,
#                    "min_adjacency": 10
#                },
#                "authentication": {
#                    "message_digest": {
#                        "keychain": "ansible1101pass"
#                    }
#                },
#                "process_id": "26"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "10",
#                        "authentication": {
#                            "keychain": "ansi11393"
#                        },
#                        "hello_interval": 2
#                    }
#                ],
#                "process_id": "27"
#            },
#            {
#                "areas": [
#                    {
#                        "area_id": "11",
#                        "default_cost": 5
#                    },
#                    {
#                        "area_id": "22",
#                        "default_cost": 6
#                    }
#                ],
#                "cost": 2,
#                "dead_interval": 2,
#                "default_metric": 10,
#                "demand_circuit": "enable",
#                "external_out": "disable",
#                "flood_reduction": "disable",
#                "hello_interval": 1,
#                "mtu_ignore": "enable",
#                "packet_size": 577,
#                "passive": "disable",
#                "priority": 1,
#                "process_id": "30",
#                "retransmit_interval": 2,
#                "router_id": "2.2.2.2",
#                "summary_in": "enable",
#                "transmit_delay": 2,
#                "weight": 2
#            }
#        ]
#    }
#
# After state:
# -------------
#
# RP/0/RP0/CPU0:anton#show running-config router ospf
# Thu Jun 11 16:06:44.406 UTC
# router ospf 10
#  authentication keychain ansible_test1102
#  area 11
#   cost 11
#   default-cost 5
#  !
#  area 22
#   default-cost 6
#  !
# !
# router ospf 26
#  authentication message-digest keychain ansible1101pass
#  adjacency stagger 10 20
# !
# router ospf 27
#  area 10
#  authentication keychain ansi11393
#   hello-interval 2
# !
# !
# router ospf 30
# router-id 2.2.2.2
# summary-in enable
# external-out disable
# cost 2
# packet-size 577
# weight 2
# passive disable
# priority 1
# mtu-ignore enable
# flood-reduction disable
# dead-interval 2
# retransmit-interval 2
# demand-circuit enable
# hello-interval 1
# transmit-delay 2
# default-metric 10
# area 11
#  default-cost 5
# !
# area 22
#  default-cost 6
# !
# !
#
#

"""
RETURN = """
before:
  description: The configuration prior to the model invocation.
  returned: always
  type: dict
  sample: >
    The configuration returned will always be in the same format
     of the parameters above.
after:
  description: The resulting configuration model invocation.
  returned: when changed
  type: dict
  sample: >
    The configuration returned will always be in the same format
     of the parameters above.
commands:
  description: The set of commands pushed to the remote device.
  returned: always
  type: list
  sample:
    - "router ospf 30"
    - "authentication message-digest keychain 'ansible1101pass'"
"""


from ansible.module_utils.basic import AnsibleModule
from ansible_collections.cisco.iosxr.plugins.module_utils.network.iosxr.argspec.ospfv2.ospfv2 import (
    Ospfv2Args,
)
from ansible_collections.cisco.iosxr.plugins.module_utils.network.iosxr.config.ospfv2.ospfv2 import (
    Ospfv2,
)


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

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


if __name__ == "__main__":
    main()
