#!/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 nxos_ospfv2
"""

from __future__ import absolute_import, division, print_function


__metaclass__ = type


DOCUMENTATION = """
module: nxos_ospfv2
short_description: OSPFv2 resource module
description:
- This module manages OSPFv2 configuration on devices running Cisco NX-OS.
version_added: 1.0.0
notes:
- Tested against NX-OS 7.0(3)I5(1).
- Unsupported for Cisco MDS
- This module works with connection C(network_cli) and C(httpapi).
author: Nilashish Chakraborty (@NilashishC)
options:
  running_config:
    description:
    - This option is used only with state I(parsed).
    - The value of this option should be the output received from the NX-OS device
      by executing the command B(show running-config | section "^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
  config:
    description: A list of OSPF process configuration.
    type: dict
    suboptions:
      processes:
        description:
        - A list of OSPF instances' configurations.
        type: list
        elements: dict
        suboptions:
          areas:
            description:
            - Configure properties of OSPF Areas.
            type: list
            elements: dict
            suboptions:
              area_id:
                description:
                - The Area ID in IP Address format.
                type: str
                required: true
              authentication:
                description:
                - Authentication settings for the Area.
                type: dict
                suboptions:
                  set:
                    description:
                    - Set authentication for the area.
                    type: bool
                  message_digest:
                    description:
                    - Use message-digest authentication.
                    type: bool
              default_cost:
                description:
                - Specify the default cost for default summary LSA.
                type: int
              filter_list:
                description:
                - Filter prefixes between OSPF areas.
                type: list
                elements: dict
                suboptions:
                  route_map:
                    description:
                    - The Route-map name.
                    type: str
                    required: true
                  direction:
                    description:
                    - The direction to apply the route map.
                    type: str
                    choices: [in, out]
                    required: true
              nssa:
                description:
                - NSSA settings for the area.
                type: dict
                suboptions:
                  set:
                    description:
                    - Configure area as NSSA.
                    type: bool
                  default_information_originate:
                    description:
                    - Originate Type-7 default LSA into NSSA area.
                    type: bool
                  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
                          never:
                            description:
                            - Never translate LSAs
                            type: bool
                          supress_fa:
                            description:
                            - Suppress forwarding address in translated LSAs.
                            type: bool
              ranges:
                description:
                - Configure an address range for the area.
                type: list
                elements: dict
                suboptions:
                  prefix:
                    description:
                    - IP in Prefix format (x.x.x.x/len)
                    type: str
                    required: true
                  cost:
                    description:
                    - Cost to use for the range.
                    type: int
                  not_advertise:
                    description:
                    - Suppress advertising the specified range.
                    type: bool
              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:
                    - Prevent ABR from sending summary LSAs into stub area.
                    type: bool
          auto_cost:
            description:
            - Calculate OSPF cost according to bandwidth.
            type: dict
            suboptions:
              reference_bandwidth:
                description:
                - Reference bandwidth used to assign OSPF cost.
                type: int
                required: true
              unit:
                description:
                - Specify in which unit the reference bandwidth is specified.
                type: str
                required: true
                choices: [Gbps, Mbps]
          bfd:
            description:
            - Enable BFD on all OSPF interfaces.
            type: bool
          default_information:
            description:
            - Control distribution of default routes.
            type: dict
            suboptions:
              originate:
                description:
                - Distribute a default route.
                type: dict
                suboptions:
                  set:
                    description:
                    - Enable distribution of default route.
                    type: bool
                  always:
                    description:
                    - Always advertise a default route.
                    type: bool
                  route_map:
                    description:
                    - Policy to control distribution of default routes
                    type: str
          default_metric:
            description:
            - Specify default metric for redistributed routes.
            type: int
          distance:
            description:
            - Configure the OSPF administrative distance.
            type: int
          flush_routes:
            description:
            - Flush routes on a non-graceful controlled restart.
            type: bool
          graceful_restart:
            description:
            - Configure graceful restart.
            type: dict
            suboptions:
              set:
                description:
                - Enable graceful-restart.
                type: bool
              grace_period:
                description:
                - Configure maximum interval to restart gracefully.
                type: int
              helper_disable:
                description:
                - Enable/Disable helper mode.
                type: bool
          isolate:
            description:
            - Isolate this router from OSPF perspective.
            type: bool
          log_adjacency_changes:
            description:
            - Log changes in adjacency state.
            type: dict
            suboptions:
              log:
                description:
                - Enable/disable logging changes in adjacency state.
                type: bool
              detail:
                description:
                - Notify all state changes.
                type: bool
          max_lsa:
            description:
            - Feature to limit the number of non-self-originated LSAs.
            type: dict
            suboptions:
              max_non_self_generated_lsa:
                description:
                - Set the maximum number of non self-generated LSAs.
                type: int
                required: true
              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 time 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:
            - Maximize the cost metric.
            type: dict
            suboptions:
              router_lsa:
                description:
                - Router LSA configuration.
                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
          maximum_paths:
            description:
            - Maximum paths per destination.
            type: int
          mpls:
            description:
            - OSPF MPLS configuration settings.
            type: dict
            suboptions:
              traffic_eng:
                description:
                - OSPF MPLS Traffic Engineering commands.
                type: dict
                suboptions:
                  areas:
                    description:
                    - List of Area IDs.
                    type: list
                    elements: dict
                    suboptions:
                      area_id:
                        description:
                        - Area Id in ip address format.
                        type: str
                  multicast_intact:
                    description:
                    - MPLS TE multicast support.
                    type: bool
                  router_id:
                    description:
                    - Router ID associated with TE.
                    type: str
          name_lookup:
            description:
            - Display OSPF router ids as DNS names.
            type: bool
          passive_interface:
            description:
            - Suppress routing updates on the interface.
            type: dict
            suboptions:
              default:
                description:
                - Interfaces passive by default.
                type: bool
          process_id:
            description:
            - The OSPF process tag.
            type: str
            required: true
          redistribute:
            description:
            - Redistribute information from another routing protocol.
            type: list
            elements: dict
            suboptions:
              protocol:
                description:
                - The name of the protocol.
                type: str
                choices: [bgp, direct, eigrp, isis, lisp, ospf, rip, static]
                required: true
              id:
                description:
                - The identifier for the protocol specified.
                type: str
              route_map:
                description:
                - The route map policy to constrain redistribution.
                type: str
                required: true
          rfc1583compatibility:
            description:
            - Configure 1583 compatibility for external path preferences.
            type: bool
          router_id:
            description:
            - Set OSPF process router-id.
            type: str
          shutdown:
            description:
            - Shutdown the OSPF protocol instance.
            type: bool
          summary_address:
            description:
            - Configure route summarization for redistribution.
            type: list
            elements: dict
            suboptions:
              prefix:
                description:
                - IP prefix in format x.x.x.x/ml.
                type: str
                required: true
              not_advertise:
                description:
                - Suppress advertising the specified summary.
                type: bool
              tag:
                description:
                - A 32-bit tag value.
                type: int
          table_map:
            description:
            - Policy for filtering/modifying OSPF routes before sending them to RIB.
            type: dict
            suboptions:
              name:
                description:
                - The Route Map name.
                type: str
                required: true
              filter:
                description:
                - Block the OSPF routes from being sent to RIB.
                type: bool
          timers:
            description:
            - Configure timer related constants.
            type: dict
            suboptions:
              lsa_arrival:
                description:
                - Mimimum interval between arrival of a LSA.
                type: int
              lsa_group_pacing:
                description:
                - LSA group refresh/maxage interval.
                type: int
              throttle:
                description:
                - Configure throttle related constants.
                type: dict
                suboptions:
                  lsa:
                    description:
                    - Set rate-limiting for LSA generation.
                    type: dict
                    suboptions:
                      start_interval:
                        description:
                        - The start interval.
                        type: int
                      hold_interval:
                        description:
                        - The hold interval.
                        type: int
                      max_interval:
                        description:
                        - The max interval.
                        type: int
                  spf:
                    description:
                    - Set OSPF SPF timers.
                    type: dict
                    suboptions:
                      initial_spf_delay:
                        description:
                        - Initial SPF schedule delay in milliseconds.
                        type: int
                      min_hold_time:
                        description:
                        - Minimum hold time between SPF calculations.
                        type: int
                      max_wait_time:
                        description:
                        - Maximum wait time between SPF calculations.
                        type: int
          vrfs:
            description:
            - Configure VRF specific OSPF settings.
            type: list
            elements: dict
            suboptions:
              areas:
                description:
                - Configure properties of OSPF Areas.
                type: list
                elements: dict
                suboptions:
                  area_id:
                    description:
                    - The Area ID in IP Address format.
                    type: str
                    required: true
                  authentication:
                    description:
                    - Authentication settings for the Area.
                    type: dict
                    suboptions:
                      set:
                        description:
                        - Set authentication for the area.
                        type: bool
                      message_digest:
                        description:
                        - Use message-digest authentication.
                        type: bool
                  default_cost:
                    description:
                    - Specify the default cost for default summary LSA.
                    type: int
                  filter_list:
                    description:
                    - Filter prefixes between OSPF areas.
                    type: list
                    elements: dict
                    suboptions:
                      route_map:
                        description:
                        - The Route-map name.
                        type: str
                        required: true
                      direction:
                        description:
                        - The direction to apply the route map.
                        type: str
                        choices: [in, out]
                        required: true
                  nssa:
                    description:
                    - NSSA settings for the area.
                    type: dict
                    suboptions:
                      set:
                        description:
                        - Configure area as NSSA.
                        type: bool
                      default_information_originate:
                        description:
                        - Originate Type-7 default LSA into NSSA area.
                        type: bool
                      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
                              never:
                                description:
                                - Never translate LSAs
                                type: bool
                              supress_fa:
                                description:
                                - Suppress forwarding address in translated LSAs.
                                type: bool
                  ranges:
                    description:
                    - Configure an address range for the area.
                    type: list
                    elements: dict
                    suboptions:
                      prefix:
                        description:
                        - IP in Prefix format (x.x.x.x/len)
                        type: str
                        required: true
                      cost:
                        description:
                        - Cost to use for the range.
                        type: int
                      not_advertise:
                        description:
                        - Suppress advertising the specified range.
                        type: bool
                  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:
                        - Prevent ABR from sending summary LSAs into stub area.
                        type: bool
              auto_cost:
                description:
                - Calculate OSPF cost according to bandwidth.
                type: dict
                suboptions:
                  reference_bandwidth:
                    description:
                    - Reference bandwidth used to assign OSPF cost.
                    type: int
                    required: true
                  unit:
                    description:
                    - Specify in which unit the reference bandwidth is specified.
                    type: str
                    required: True
                    choices: [Gbps, Mbps]
              bfd:
                description:
                - Enable BFD on all OSPF interfaces.
                type: bool
              default_information:
                description:
                - Control distribution of default routes.
                type: dict
                suboptions:
                  originate:
                    description:
                    - Distribute a default route.
                    type: dict
                    suboptions:
                      set:
                        description:
                        - Enable distribution of default route.
                        type: bool
                      always:
                        description:
                        - Always advertise a default route.
                        type: bool
                      route_map:
                        description:
                        - Policy to control distribution of default routes
                        type: str
              default_metric:
                description:
                - Specify default metric for redistributed routes.
                type: int
              distance:
                description:
                - Configure the OSPF administrative distance.
                type: int
              down_bit_ignore:
                description:
                - Configure a PE router to ignore the DN bit for network summary,
                  external and NSSA external LSA.
                type: bool
              capability:
                description:
                - OSPF capability settings.
                type: dict
                suboptions:
                  vrf_lite:
                    description:
                    - Enable VRF-lite capability settings.
                    type: dict
                    suboptions:
                      set:
                        description:
                        - Enable VRF-lite support.
                        type: bool
                      evpn:
                        description:
                        - Ethernet VPN.
                        type: bool
              graceful_restart:
                description:
                - Configure graceful restart.
                type: dict
                suboptions:
                  set:
                    description:
                    - Enable graceful-restart.
                    type: bool
                  grace_period:
                    description:
                    - Configure maximum interval to restart gracefully.
                    type: int
                  helper_disable:
                    description:
                    - Enable/Disable helper mode.
                    type: bool
              log_adjacency_changes:
                description:
                - Log changes in adjacency state.
                type: dict
                suboptions:
                  log:
                    description:
                    - Enable/disable logging changes in adjacency state.
                    type: bool
                  detail:
                    description:
                    - Notify all state changes.
                    type: bool
              max_lsa:
                description:
                - Feature to limit the number of non-self-originated LSAs.
                type: dict
                suboptions:
                  max_non_self_generated_lsa:
                    description:
                    - Set the maximum number of non self-generated LSAs.
                    type: int
                    required: true
                  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 time 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:
                - Maximize the cost metric.
                type: dict
                suboptions:
                  router_lsa:
                    description:
                    - Router LSA configuration.
                    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
              maximum_paths:
                description:
                - Maximum paths per destination.
                type: int
              name_lookup:
                description:
                - Display OSPF router ids as DNS names.
                type: bool
              passive_interface:
                description:
                - Suppress routing updates on the interface.
                type: dict
                suboptions:
                  default:
                    description:
                    - Interfaces passive by default.
                    type: bool
              redistribute:
                description:
                - Redistribute information from another routing protocol.
                type: list
                elements: dict
                suboptions:
                  protocol:
                    description:
                    - The name of the protocol.
                    type: str
                    choices: [bgp, direct, eigrp, isis, lisp, ospf, rip, static]
                    required: true
                  id:
                    description:
                    - The identifier for the protocol specified.
                    type: str
                  route_map:
                    description:
                    - The route map policy to constrain redistribution.
                    type: str
                    required: true
              rfc1583compatibility:
                description:
                - Configure 1583 compatibility for external path preferences.
                type: bool
              router_id:
                description:
                - Set OSPF process router-id.
                type: str
              shutdown:
                description:
                - Shutdown the OSPF protocol instance.
                type: bool
              summary_address:
                description:
                - Configure route summarization for redistribution.
                type: list
                elements: dict
                suboptions:
                  prefix:
                    description:
                    - IP prefix in format x.x.x.x/ml.
                    type: str
                    required: true
                  not_advertise:
                    description:
                    - Suppress advertising the specified summary.
                    type: bool
                  tag:
                    description:
                    - A 32-bit tag value.
                    type: int
              table_map:
                description:
                - Policy for filtering/modifying OSPF routes before sending them to
                  RIB.
                type: dict
                suboptions:
                  name:
                    description:
                    - The Route Map name.
                    type: str
                    required: true
                  filter:
                    description:
                    - Block the OSPF routes from being sent to RIB.
                    type: bool
              timers:
                description:
                - Configure timer related constants.
                type: dict
                suboptions:
                  lsa_arrival:
                    description:
                    - Mimimum interval between arrival of a LSA.
                    type: int
                  lsa_group_pacing:
                    description:
                    - LSA group refresh/maxage interval.
                    type: int
                  throttle:
                    description:
                    - Configure throttle related constants.
                    type: dict
                    suboptions:
                      lsa:
                        description:
                        - Set rate-limiting for LSA generation.
                        type: dict
                        suboptions:
                          start_interval:
                            description:
                            - The start interval.
                            type: int
                          hold_interval:
                            description:
                            - The hold interval.
                            type: int
                          max_interval:
                            description:
                            - The max interval.
                            type: int
                      spf:
                        description:
                        - Set OSPF SPF timers.
                        type: dict
                        suboptions:
                          initial_spf_delay:
                            description:
                            - Initial SPF schedule delay in milliseconds.
                            type: int
                          min_hold_time:
                            description:
                            - Minimum hold time between SPF calculations.
                            type: int
                          max_wait_time:
                            description:
                            - Maximum wait time between SPF calculations.
                            type: int
              vrf:
                description:
                - Name/Identifier of the VRF.
                type: str
                required: true
  state:
    description:
    - The state the configuration should be left in.
    type: str
    choices:
    - merged
    - replaced
    - overridden
    - deleted
    - gathered
    - parsed
    - rendered
    default: merged

"""
EXAMPLES = """
# Using merged

# Before state:
# -------------
# nxos-9k-rdo# sh running-config | section "^router ospf .*"
# nxos-9k-rdo#

- name: Merge the provided configuration with the existing running configuration
  cisco.nxos.nxos_ospfv2:
    config:
      processes:
      - process_id: 100
        router_id: 203.0.113.20
      - process_id: 102
        router_id: 198.51.100.1
        areas:
        - area_id: 0.0.0.100
          filter_list:
          - route_map: rmap_1
            direction: in
          - route_map: rmap_2
            direction: out
          ranges:
          - prefix: 198.51.100.64/27
            not_advertise: true
          - prefix: 198.51.100.96/27
            cost: 120
        - area_id: 0.0.0.101
          authentication:
            message_digest: true
        redistribute:
        - protocol: eigrp
          id: 120
          route_map: rmap_1
        - protocol: direct
          route_map: ospf102-direct-connect
        vrfs:
        - vrf: zone1
          router_id: 198.51.100.129
          redistribute:
          - protocol: static
            route_map: zone1-static-connect
          summary_address:
          - prefix: 198.51.100.128/27
            tag: 121
          - prefix: 198.51.100.160/27
          areas:
          - area_id: 0.0.0.102
            nssa:
              default_information_originate: true
              no_summary: true
          - area_id: 0.0.0.103
            nssa:
              no_summary: true
              translate:
                type7:
                  always: true
        - vrf: zone2
          auto_cost:
            reference_bandwidth: 45
            unit: Gbps
    state: merged

# Task output
# -------------
# before: {}
#
# commands:
#  - router ospf 102
#  - router-id 198.51.100.1
#  - redistribute eigrp 120 route-map rmap_1
#  - redistribute direct route-map ospf102-direct-connect
#  - area 0.0.0.100 filter-list route-map rmap_1 in
#  - area 0.0.0.100 filter-list route-map rmap_2 out
#  - area 0.0.0.100 range 198.51.100.64/27 not-advertise
#  - area 0.0.0.100 range 198.51.100.96/27 cost 120
#  - area 0.0.0.101 authentication message-digest
#  - vrf zone1
#  - router-id 198.51.100.129
#  - summary-address 198.51.100.128/27 tag 121
#  - summary-address 198.51.100.160/27
#  - redistribute static route-map zone1-static-connect
#  - area 0.0.0.102 nssa no-summary default-information-originate
#  - area 0.0.0.103 nssa no-summary
#  - area 0.0.0.103 nssa translate type7 always
#  - vrf zone2
#  - auto-cost reference-bandwidth 45 Gbps
#  - router ospf 100
#  - router-id 203.0.113.20
#
# after:
#    processes:
#    - process_id: "100"
#      router_id: 203.0.113.20
#    - areas:
#      - area_id: 0.0.0.100
#        filter_list:
#        - direction: out
#          route_map: rmap_2
#        - direction: in
#          route_map: rmap_1
#        ranges:
#        - not_advertise: true
#          prefix: 198.51.100.64/27
#        - cost: 120
#          prefix: 198.51.100.96/27
#      - area_id: 0.0.0.101
#        authentication:
#          message_digest: true
#      process_id: "102"
#      redistribute:
#      - protocol: direct
#        route_map: ospf102-direct-connect
#      - id: "120"
#        protocol: eigrp
#        route_map: rmap_1
#      router_id: 198.51.100.1
#      vrfs:
#      - areas:
#        - area_id: 0.0.0.102
#          nssa:
#            default_information_originate: true
#            no_summary: true
#        - area_id: 0.0.0.103
#          nssa:
#            no_summary: true
#            translate:
#              type7:
#                always: true
#        redistribute:
#        - protocol: static
#          route_map: zone1-static-connect
#        router_id: 198.51.100.129
#        vrf: zone1
#      - auto_cost:
#          reference_bandwidth: 45
#          unit: Gbps
#        vrf: zone2
#

# After state:
# ------------
# nxos-9k-rdo# sh running-config | section "^router ospf .*"
# router ospf 100
#   router-id 203.0.113.20
# router ospf 102
#   router-id 198.51.100.1
#   redistribute direct route-map ospf102-direct-connect
#   redistribute eigrp 120 route-map rmap_1
#   area 0.0.0.100 filter-list route-map rmap_2 out
#   area 0.0.0.100 filter-list route-map rmap_1 in
#   area 0.0.0.100 range 198.51.100.64/27 not-advertise
#   area 0.0.0.100 range 198.51.100.96/27 cost 120
#   area 0.0.0.101 authentication message-digest
#   vrf zone1
#     router-id 198.51.100.129
#     area 0.0.0.102 nssa no-summary default-information-originate
#     area 0.0.0.103 nssa no-summary
#     area 0.0.0.103 nssa translate type7 always
#     redistribute static route-map zone1-static-connect
#     summary-address 198.51.100.128/27 tag 121
#     summary-address 198.51.100.160/27
#   vrf zone2
#     auto-cost reference-bandwidth 45 Gbps

# Using replaced

# Before state:
# ------------
# nxos-9k-rdo# sh running-config | section "^router ospf .*"
# router ospf 100
#   router-id 203.0.113.20
# router ospf 102
#   router-id 198.51.100.1
#   redistribute direct route-map ospf102-direct-connect
#   redistribute eigrp 120 route-map rmap_1
#   area 0.0.0.100 filter-list route-map rmap_2 out
#   area 0.0.0.100 filter-list route-map rmap_1 in
#   area 0.0.0.100 range 198.51.100.64/27 not-advertise
#   area 0.0.0.100 range 198.51.100.96/27 cost 120
#   area 0.0.0.101 authentication message-digest
#   vrf zone1
#     router-id 198.51.100.129
#     area 0.0.0.102 nssa no-summary default-information-originate
#     area 0.0.0.103 nssa no-summary
#     area 0.0.0.103 nssa translate type7 always
#     redistribute static route-map zone1-static-connect
#     summary-address 198.51.100.128/27 tag 121
#     summary-address 198.51.100.160/27
#   vrf zone2
#     auto-cost reference-bandwidth 45 Gbps

- name: Replace device configurations of listed OSPF processes with provided configurations
  cisco.nxos.nxos_ospfv2:
    config:
      processes:
      - process_id: 102
        router_id: 198.51.100.1
        areas:
        - area_id: 0.0.0.100
          filter_list:
          - route_map: rmap_8
            direction: in
          ranges:
          - prefix: 198.51.100.64/27
            not_advertise: true
        - area_id: 0.0.0.101
          stub:
            no_summary: true
        redistribute:
        - protocol: eigrp
          id: 130
          route_map: rmap_1
        - protocol: direct
          route_map: ospf102-direct-connect
        vrfs:
        - vrf: zone1
          router_id: 198.51.100.129
          redistribute:
          - protocol: bgp
            id: 65563
            route_map: zone1-bgp-connect
          areas:
          - area_id: 0.0.0.102
            nssa:
              default_information_originate: true
              no_summary: true
    state: replaced

# Task output
# -------------
# before:
#    processes:
#    - process_id: "100"
#      router_id: 203.0.113.20
#    - areas:
#      - area_id: 0.0.0.100
#        filter_list:
#        - direction: out
#          route_map: rmap_2
#        - direction: in
#          route_map: rmap_1
#        ranges:
#        - not_advertise: true
#          prefix: 198.51.100.64/27
#        - cost: 120
#          prefix: 198.51.100.96/27
#      - area_id: 0.0.0.101
#        authentication:
#          message_digest: true
#      process_id: "102"
#      redistribute:
#      - protocol: direct
#        route_map: ospf102-direct-connect
#      - id: "120"
#        protocol: eigrp
#        route_map: rmap_1
#      router_id: 198.51.100.1
#      vrfs:
#      - areas:
#        - area_id: 0.0.0.102
#          nssa:
#            default_information_originate: true
#            no_summary: true
#        - area_id: 0.0.0.103
#          nssa:
#            no_summary: true
#            translate:
#              type7:
#                always: true
#        redistribute:
#        - protocol: static
#          route_map: zone1-static-connect
#        router_id: 198.51.100.129
#        vrf: zone1
#      - auto_cost:
#          reference_bandwidth: 45
#          unit: Gbps
#        vrf: zone2
#
#  commands:
#  - router ospf 102
#  - redistribute eigrp 130 route-map rmap_1
#  - no redistribute eigrp 120 route-map rmap_1
#  - area 0.0.0.100 filter-list route-map rmap_8 in
#  - no area 0.0.0.100 filter-list route-map rmap_2 out
#  - no area 0.0.0.100 range 198.51.100.96/27
#  - no area 0.0.0.101 authentication
#  - area 0.0.0.101 stub no-summary
#  - vrf zone1
#  - no summary-address 198.51.100.128/27 tag 121
#  - no summary-address 198.51.100.160/27
#  - redistribute bgp 65563 route-map zone1-bgp-connect
#  - no redistribute static route-map zone1-static-connect
#  - no area 0.0.0.103 nssa
#  - no area 0.0.0.103 nssa translate type7 always
#  - no vrf zone2
#
# after:
#    processes:
#    - process_id: "100"
#      router_id: 203.0.113.20
#    - areas:
#      - area_id: 0.0.0.101
#        stub:
#          no_summary: true
#      - area_id: 0.0.0.100
#        filter_list:
#        - direction: in
#          route_map: rmap_8
#        ranges:
#        - not_advertise: true
#          prefix: 198.51.100.64/27
#      process_id: "102"
#      redistribute:
#      - protocol: direct
#        route_map: ospf102-direct-connect
#      - id: "130"
#        protocol: eigrp
#        route_map: rmap_1
#      router_id: 198.51.100.1
#      vrfs:
#      - areas:
#        - area_id: 0.0.0.102
#          nssa:
#            default_information_originate: true
#            no_summary: true
#        redistribute:
#        - id: "65563"
#          protocol: bgp
#          route_map: zone1-bgp-connect
#        router_id: 198.51.100.129
#        vrf: zone1

# After state:
# ------------
# nxos-9k-rdo# sh running-config | section "^router ospf .*"
# router ospf 100
#   router-id 203.0.113.20
# router ospf 102
#   router-id 198.51.100.1
#   area 0.0.0.101 stub no-summary
#   redistribute direct route-map ospf102-direct-connect
#   redistribute eigrp 130 route-map rmap_1
#   area 0.0.0.100 filter-list route-map rmap_8 in
#   area 0.0.0.100 range 198.51.100.64/27 not-advertise
#   vrf zone1
#     router-id 198.51.100.129
#     area 0.0.0.102 nssa no-summary default-information-originate
#     redistribute bgp 65563 route-map zone1-bgp-connect

# Using overridden

# Before state:
# ------------
# nxos-9k-rdo# sh running-config | section "^router ospf .*"
# router ospf 100
#   router-id 203.0.113.20
# router ospf 102
#   router-id 198.51.100.1
#   redistribute direct route-map ospf102-direct-connect
#   redistribute eigrp 120 route-map rmap_1
#   area 0.0.0.100 filter-list route-map rmap_2 out
#   area 0.0.0.100 filter-list route-map rmap_1 in
#   area 0.0.0.100 range 198.51.100.64/27 not-advertise
#   area 0.0.0.100 range 198.51.100.96/27 cost 120
#   area 0.0.0.101 authentication message-digest
#   vrf zone1
#     router-id 198.51.100.129
#     area 0.0.0.102 nssa no-summary default-information-originate
#     area 0.0.0.103 nssa no-summary
#     area 0.0.0.103 nssa translate type7 always
#     redistribute static route-map zone1-static-connect
#     summary-address 198.51.100.128/27 tag 121
#     summary-address 198.51.100.160/27
#   vrf zone2
#     auto-cost reference-bandwidth 45 Gbps

- name: Override all OSPF configuration with provided configuration
  cisco.nxos.nxos_ospfv2:
    config:
      processes:
      - process_id: 104
        router_id: 203.0.113.20
      - process_id: 102
        router_id: 198.51.100.1
        shutdown: true
    state: overridden

# Task output
# -------------
# before:
#    processes:
#    - process_id: "100"
#      router_id: 203.0.113.20
#    - areas:
#      - area_id: 0.0.0.100
#        filter_list:
#        - direction: out
#          route_map: rmap_2
#        - direction: in
#          route_map: rmap_1
#        ranges:
#        - not_advertise: true
#          prefix: 198.51.100.64/27
#        - cost: 120
#          prefix: 198.51.100.96/27
#      - area_id: 0.0.0.101
#        authentication:
#          message_digest: true
#      process_id: "102"
#      redistribute:
#      - protocol: direct
#        route_map: ospf102-direct-connect
#      - id: "120"
#        protocol: eigrp
#        route_map: rmap_1
#      router_id: 198.51.100.1
#      vrfs:
#      - areas:
#        - area_id: 0.0.0.102
#          nssa:
#            default_information_originate: true
#            no_summary: true
#        - area_id: 0.0.0.103
#          nssa:
#            no_summary: true
#            translate:
#              type7:
#                always: true
#        redistribute:
#        - protocol: static
#          route_map: zone1-static-connect
#        router_id: 198.51.100.129
#        vrf: zone1
#      - auto_cost:
#          reference_bandwidth: 45
#          unit: Gbps
#        vrf: zone2
#
# commands:
#  - no router ospf 100
#  - router ospf 104
#  - router-id 203.0.113.20
#  - router ospf 102
#  - shutdown
#  - no redistribute direct route-map ospf102-direct-connect
#  - no redistribute eigrp 120 route-map rmap_1
#  - no area 0.0.0.100 filter-list route-map rmap_2 out
#  - no area 0.0.0.100 filter-list route-map rmap_1 in
#  - no area 0.0.0.100 range 198.51.100.64/27
#  - no area 0.0.0.100 range 198.51.100.96/27
#  - no area 0.0.0.101 authentication
#  - no vrf zone1
#  - no vrf zone2
#
# after:
#    processes:
#    - process_id: "102"
#      router_id: 198.51.100.1
#      shutdown: true
#    - process_id: "104"
#      router_id: 203.0.113.20

# After state:
# ------------
# nxos-9k-rdo# sh running-config | section "^router ospf .*"
# router ospf 102
#   router-id 198.51.100.1
#   shutdown
# router ospf 104
#   router-id 203.0.113.20

# Using deleted to delete a single OSPF process

# Before state:
# ------------
# nxos-9k-rdo# sh running-config | section "^router ospf .*"
# router ospf 100
#   router-id 203.0.113.20
# router ospf 102
#   router-id 198.51.100.1
#   redistribute direct route-map ospf102-direct-connect
#   redistribute eigrp 120 route-map rmap_1
#   area 0.0.0.100 filter-list route-map rmap_2 out
#   area 0.0.0.100 filter-list route-map rmap_1 in
#   area 0.0.0.100 range 198.51.100.64/27 not-advertise
#   area 0.0.0.100 range 198.51.100.96/27 cost 120
#   area 0.0.0.101 authentication message-digest
#   vrf zone1
#     router-id 198.51.100.129
#     area 0.0.0.102 nssa no-summary default-information-originate
#     area 0.0.0.103 nssa no-summary
#     area 0.0.0.103 nssa translate type7 always
#     redistribute static route-map zone1-static-connect
#     summary-address 198.51.100.128/27 tag 121
#     summary-address 198.51.100.160/27
#   vrf zone2
#     auto-cost reference-bandwidth 45 Gbps

- name: Delete a single OSPF process
  cisco.nxos.nxos_ospfv2:
    config:
      processes:
      - process_id: 102
    state: deleted

# Task output
# -------------
# before:
#    processes:
#    - process_id: "100"
#      router_id: 203.0.113.20
#    - areas:
#      - area_id: 0.0.0.100
#        filter_list:
#        - direction: out
#          route_map: rmap_2
#        - direction: in
#          route_map: rmap_1
#        ranges:
#        - not_advertise: true
#          prefix: 198.51.100.64/27
#        - cost: 120
#          prefix: 198.51.100.96/27
#      - area_id: 0.0.0.101
#        authentication:
#          message_digest: true
#      process_id: "102"
#      redistribute:
#      - protocol: direct
#        route_map: ospf102-direct-connect
#      - id: "120"
#        protocol: eigrp
#        route_map: rmap_1
#      router_id: 198.51.100.1
#      vrfs:
#      - areas:
#        - area_id: 0.0.0.102
#          nssa:
#            default_information_originate: true
#            no_summary: true
#        - area_id: 0.0.0.103
#          nssa:
#            no_summary: true
#            translate:
#              type7:
#                always: true
#        redistribute:
#        - protocol: static
#          route_map: zone1-static-connect
#        router_id: 198.51.100.129
#        vrf: zone1
#      - auto_cost:
#          reference_bandwidth: 45
#          unit: Gbps
#        vrf: zone2
#
# commands:
#  - no router ospf 102
#
# after:
#   processes:
#   - process_id: "100"
#     router_id: 203.0.113.20

# After state:
# ------------
# nxos-9k-rdo# sh running-config | section "^router ospf .*"
# router ospf 100
#   router-id 203.0.113.20

# Using deleted all OSPF processes from the device

# Before state:
# ------------
# nxos-9k-rdo# sh running-config | section "^router ospf .*"
# router ospf 100
#   router-id 203.0.113.20
# router ospf 102
#   router-id 198.51.100.1
#   redistribute direct route-map ospf102-direct-connect
#   redistribute eigrp 120 route-map rmap_1
#   area 0.0.0.100 filter-list route-map rmap_2 out
#   area 0.0.0.100 filter-list route-map rmap_1 in
#   area 0.0.0.100 range 198.51.100.64/27 not-advertise
#   area 0.0.0.100 range 198.51.100.96/27 cost 120
#   area 0.0.0.101 authentication message-digest
#   vrf zone1
#     router-id 198.51.100.129
#     area 0.0.0.102 nssa no-summary default-information-originate
#     area 0.0.0.103 nssa no-summary
#     area 0.0.0.103 nssa translate type7 always
#     redistribute static route-map zone1-static-connect
#     summary-address 198.51.100.128/27 tag 121
#     summary-address 198.51.100.160/27
#   vrf zone2
#     auto-cost reference-bandwidth 45 Gbps

- name: Delete all OSPF processes from the device
  cisco.nxos.nxos_ospfv2:
    state: deleted

# Task output
# -------------
# before:
#    processes:
#    - process_id: "100"
#      router_id: 203.0.113.20
#    - areas:
#      - area_id: 0.0.0.100
#        filter_list:
#        - direction: out
#          route_map: rmap_2
#        - direction: in
#          route_map: rmap_1
#        ranges:
#        - not_advertise: true
#          prefix: 198.51.100.64/27
#        - cost: 120
#          prefix: 198.51.100.96/27
#      - area_id: 0.0.0.101
#        authentication:
#          message_digest: true
#      process_id: "102"
#      redistribute:
#      - protocol: direct
#        route_map: ospf102-direct-connect
#      - id: "120"
#        protocol: eigrp
#        route_map: rmap_1
#      router_id: 198.51.100.1
#      vrfs:
#      - areas:
#        - area_id: 0.0.0.102
#          nssa:
#            default_information_originate: true
#            no_summary: true
#        - area_id: 0.0.0.103
#          nssa:
#            no_summary: true
#            translate:
#              type7:
#                always: true
#        redistribute:
#        - protocol: static
#          route_map: zone1-static-connect
#        router_id: 198.51.100.129
#        vrf: zone1
#      - auto_cost:
#          reference_bandwidth: 45
#          unit: Gbps
#        vrf: zone2
#
# commands:
#  - no router ospf 100
#  - no router ospf 102
#
#  after: {}

# After state:
# ------------
# nxos-9k-rdo# sh running-config | section "^router ospf .*"
# nxos-9k-rdo#

# Using rendered

- name: Render platform specific configuration lines (without connecting to the device)
  cisco.nxos.nxos_ospfv2:
    config:
      processes:
      - process_id: 100
        router_id: 203.0.113.20
      - process_id: 102
        router_id: 198.51.100.1
        areas:
        - area_id: 0.0.0.100
          filter_list:
          - route_map: rmap_1
            direction: in
          - route_map: rmap_2
            direction: out
          ranges:
          - prefix: 198.51.100.64/27
            not_advertise: true
          - prefix: 198.51.100.96/27
            cost: 120
        - area_id: 0.0.0.101
          authentication:
            message_digest: true
        redistribute:
        - protocol: eigrp
          id: 120
          route_map: rmap_1
        - protocol: direct
          route_map: ospf102-direct-connect
        vrfs:
        - vrf: zone1
          router_id: 198.51.100.129
          redistribute:
          - protocol: static
            route_map: zone1-static-connect
          summary_address:
          - prefix: 198.51.100.128/27
            tag: 121
          - prefix: 198.51.100.160/27
          areas:
          - area_id: 0.0.0.102
            nssa:
              default_information_originate: true
              no_summary: true
          - area_id: 0.0.0.103
            nssa:
              no_summary: true
              translate:
                type7:
                  always: true
        - vrf: zone2
          auto_cost:
            reference_bandwidth: 45
            unit: Gbps
    state: rendered

# Task Output (redacted)
# -----------------------
# rendered:
#  - router ospf 100
#  - router-id 203.0.113.20
#  - router ospf 102
#  - router-id 198.51.100.1
#  - redistribute eigrp 120 route-map rmap_1
#  - redistribute direct route-map ospf102-direct-connect
#  - area 0.0.0.100 filter-list route-map rmap_1 in
#  - area 0.0.0.100 filter-list route-map rmap_2 out
#  - area 0.0.0.100 range 198.51.100.64/27 not-advertise
#  - area 0.0.0.100 range 198.51.100.96/27 cost 120
#  - area 0.0.0.101 authentication message-digest
#  - vrf zone1
#  - router-id 198.51.100.129
#  - summary-address 198.51.100.128/27 tag 121
#  - summary-address 198.51.100.160/27
#  - redistribute static route-map zone1-static-connect
#  - area 0.0.0.102 nssa no-summary default-information-originate
#  - area 0.0.0.103 nssa no-summary
#  - area 0.0.0.103 nssa translate type7 always
#  - vrf zone2
#  - auto-cost reference-bandwidth 45 Gbps

# Using parsed

# parsed.cfg
# ------------
# router ospf 100
#   router-id 192.0.100.1
#   area 0.0.0.101 nssa no-summary no-redistribution
#   area 0.0.0.102 stub no-summary
#   redistribute direct route-map ospf-direct-connect
#   redistribute eigrp 120 route-map rmap_1
#   area 0.0.0.100 filter-list route-map rmap_2 out
#   area 0.0.0.100 filter-list route-map rmap_1 in
#   area 0.0.0.100 range 192.0.2.0/24 not-advertise
#   area 0.0.0.100 range 192.0.3.0/24 cost 120
#   area 0.0.0.100 authentication message-digest
#   vrf zone1
#     router-id 192.0.100.2
#     area 0.0.100.1 nssa no-summary no-redistribution
#     redistribute static route-map zone1-direct-connect
#     summary-address 10.0.0.0/24 tag 120
#     summary-address 11.0.0.0/24 not-advertise
#   vrf zone2
#     auto-cost reference-bandwidth 45 Gbps
#     down-bit-ignore
#     capability vrf-lite evpn
#     shutdown
# router ospf 102
#   router-id 198.54.100.1
#   shutdown
#   vrf zone2
#     summary-address 192.0.8.0/24 tag 120
#   vrf zone4
#     shutdown

- name: Parse externally provided OSPFv2 config
  cisco.nxos.nxos_ospfv2:
    running_config: "{{ lookup('file', 'ospfv2.cfg') }}"
    state: parsed

# Task output (redacted)
# -----------------------
# parsed:
#   processes:
#   - process_id: "100"
#     areas:
#       - area_id: 0.0.0.101
#         nssa:
#           no_redistribution: true
#           no_summary: true
#       - area_id: 0.0.0.102
#         stub:
#           no_summary: true
#       - area_id: 0.0.0.100
#         authentication:
#           message_digest: true
#         filter_list:
#           - direction: out
#             route_map: rmap_2
#           - direction: in
#             route_map: rmap_1
#         ranges:
#           - not_advertise: true
#             prefix: 192.0.2.0/24
#           - cost: 120
#             prefix: 192.0.3.0/24
#     redistribute:
#       - protocol: direct
#         route_map: ospf-direct-connect
#       - id: "120"
#         protocol: eigrp
#         route_map: rmap_1
#     router_id: 192.0.100.1
#     vrfs:
#       - vrf: zone1
#         areas:
#           - area_id: 0.0.100.1
#             nssa:
#               no_redistribution: true
#               no_summary: true
#         redistribute:
#           - protocol: static
#             route_map: zone1-direct-connect
#         router_id: 192.0.100.2
#         summary_address:
#           - prefix: 10.0.0.0/24
#             tag: 120
#           - not_advertise: true
#             prefix: 11.0.0.0/24
#       - vrf: zone2
#         auto_cost:
#           reference_bandwidth: 45
#           unit: Gbps
#         capability:
#           vrf_lite:
#             evpn: true
#         down_bit_ignore: true
#         shutdown: true
#   - process_id: "102"
#     router_id: 198.54.100.1
#     shutdown: true
#     vrfs:
#       - vrf: zone2
#         summary_address:
#           - prefix: 192.0.8.0/24
#             tag: 120
#       - vrf: zone4
#         shutdown: true

# Using gathered

- name: Gather OSPFv2 facts using gathered
  cisco.nxos.nxos_ospfv2:
    state: gathered

# Task output (redacted)
# -----------------------
#  gathered:
#    processes:
#      - process_id: "102"
#        areas:
#          - area_id: 0.0.0.101
#            stub:
#              no_summary: true
#          - area_id: 0.0.0.100
#            filter_list:
#              - direction: in
#                route_map: rmap_8
#            ranges:
#              - not_advertise: true
#                prefix: 198.51.100.64/27
#        redistribute:
#          - protocol: direct
#            route_map: ospf102-direct-connect
#          - id: "130"
#            protocol: eigrp
#            route_map: rmap_1
#        router_id: 198.51.100.1
#        vrfs:
#          - vrf: zone1
#            areas:
#              - area_id: 0.0.0.102
#                nssa:
#                  default_information_originate: true
#                  no_summary: true
#            redistribute:
#             - id: "65563"
#               protocol: bgp
#               route_map: zone1-bgp-connect
#            router_id: 198.51.100.129
#
"""
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 102"
    - "router-id 198.54.100.1"
    - "router ospf 100"
    - "router-id 192.0.100.1"
    - "redistribute eigrp 120 route-map rmap_1"
    - "redistribute direct route-map ospf-direct-connect"
    - "area 0.0.0.100 filter-list route-map rmap_1 in"
    - "area 0.0.0.100 filter-list route-map rmap_2 out"
    - "area 0.0.0.100 range 192.0.2.0/24 not-advertise"
    - "area 0.0.0.100 range 192.0.3.0/24 cost 120"
    - "vrf zone1"
    - "router-id 192.0.100.2"
    - "summary-address 10.0.0.0/24 tag 121"
    - "summary-address 11.0.0.0/24"
    - "redistribute static route-map zone1-direct-connect"
    - "vrf zone2"
    - "auto-cost reference-bandwidth 45 Gbps"
    - "capability vrf-lite evpn"
"""


from ansible.module_utils.basic import AnsibleModule

from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.argspec.ospfv2.ospfv2 import (
    Ospfv2Args,
)
from ansible_collections.cisco.nxos.plugins.module_utils.network.nxos.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",)),
    ]
    module = AnsibleModule(
        argument_spec=Ospfv2Args.argument_spec,
        required_if=required_if,
        supports_check_mode=True,
    )

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


if __name__ == "__main__":
    main()
