---
- debug: msg="START connection={{ ansible_connection }} nxos_bgp_af sanity test"
- debug: msg="Using provider={{ connection.transport }}"
  when: ansible_connection == "local"

- set_fact: advertise_l2vpn_evpn="true"
  when: platform is search('N9K')

- name: "Enable feature BGP"
  nxos_feature:
    feature: bgp
    state: enabled
    provider: "{{ connection }}"
  ignore_errors: yes

- name: "Enable feature nv overlay"
  nxos_feature:
    feature: nv overlay
    state: enabled
    provider: "{{ connection }}"
  ignore_errors: yes

- name: "Setup"
  nxos_bgp: &remove
    asn: 65535
    state: absent
    provider: "{{ connection }}"
  ignore_errors: yes

- block:
  - name: "Enable nv overlay evpn"
    nxos_config:
      lines:
        - nv overlay evpn
      provider: "{{ connection }}"
    when: platform is search('N9K')

  - name: "Configure BGP_AF 1"
    nxos_bgp_af: &configure1
      asn: 65535
      vrf: testing
      afi: ipv4
      safi: unicast
      advertise_l2vpn_evpn: "{{advertise_l2vpn_evpn|default(omit)}}"
      state: present
      provider: "{{ connection }}"
    register: result

  - assert: &true
      that:
        - "result.changed == true"

  - name: "Check Idempotence"
    nxos_bgp_af: *configure1
    register: result

  - assert: &false
      that:
        - "result.changed == false"

  - name: "Remove BGP"
    nxos_bgp_af: &remove_af
      asn: 65535
      vrf: testing
      afi: ipv4
      safi: unicast
      state: absent
      provider: "{{ connection }}"
    register: result

  - assert: *true

  - name: "Configure BGP_AF 2"
    nxos_bgp_af: &configure2
      asn: 65535
      vrf: "{{ item }}"
      afi: ipv4
      safi: unicast
      dampening_state: True
      additional_paths_install: true
      additional_paths_receive: true
      additional_paths_selection: RouteMap
      additional_paths_send: true
      client_to_client: False
      default_information_originate: true
      state: present
      provider: "{{ connection }}"
    with_items: "{{ vrfs }}"
    register: result

  - assert: *true

  - name: "Check Idempotence"
    nxos_bgp_af: *configure2
    with_items: "{{ vrfs }}"
    register: result

  - assert: *false

  - name: "Configure BGP_AF def2"
    nxos_bgp_af: &configuredef2
      asn: 65535
      vrf: "{{ item }}"
      afi: ipv4
      safi: unicast
      dampening_state: False
      additional_paths_install: False
      additional_paths_receive: False
      additional_paths_selection: default
      additional_paths_send: False
      client_to_client: True
      default_information_originate: False
      state: present
      provider: "{{ connection }}"
    with_items: "{{ vrfs }}"
    register: result

  - assert: *true

  - name: "Check Idempotence"
    nxos_bgp_af: *configuredef2
    with_items: "{{ vrfs }}"
    register: result

  - assert: *false

  - name: "Remove BGP"
    nxos_bgp_af: &remove_af_vrf
      asn: 65535
      vrf: "{{ item }}"
      afi: ipv4
      safi: unicast
      state: absent
      provider: "{{ connection }}"
    with_items: "{{ vrfs }}"
    register: result

  - assert: *true

  - name: "Configure BGP_AF 3"
    nxos_bgp_af: &configure3
      asn: 65535
      vrf: "{{ item }}"
      afi: ipv4
      safi: unicast
      dampening_routemap: 'abcd'
      default_metric: 50
      distance_ebgp: 30
      distance_ibgp: 60
      distance_local: 90
      maximum_paths: 9
      maximum_paths_ibgp: 9
      next_hop_route_map: RouteMap
      suppress_inactive: true
      table_map: RouteMap
      table_map_filter: true
      state: present
      provider: "{{ connection }}"
    with_items: "{{ vrfs }}"
    register: result

  - assert: *true

  - name: "Check Idempotence"
    nxos_bgp_af: *configure3
    with_items: "{{ vrfs }}"
    register: result

  - assert: *false

  - name: "Configure BGP_AF def3"
    nxos_bgp_af: &configuredef3
      asn: 65535
      vrf: "{{ item }}"
      afi: ipv4
      safi: unicast
      dampening_routemap: default
      default_metric: default
      distance_ebgp: default
      distance_ibgp: default
      distance_local: default
      maximum_paths: default
      maximum_paths_ibgp: default
      next_hop_route_map: default
      suppress_inactive: False
      table_map: default
      table_map_filter: False
      state: present
      provider: "{{ connection }}"
    with_items: "{{ vrfs }}"
    register: result

  - assert: *true

  - name: "Check Idempotence"
    nxos_bgp_af: *configuredef3
    with_items: "{{ vrfs }}"
    register: result

  - assert: *false

  - name: "Remove BGP"
    nxos_bgp_af: *remove_af_vrf
    with_items: "{{ vrfs }}"
    register: result

  - assert: *true

  - name: "Configure BGP_AF 4"
    nxos_bgp_af: &configure4
      asn: 65535
      vrf: "{{ item }}"
      afi: ipv4
      safi: unicast
      dampen_igp_metric: 200
      dampening_half_time: 1
      dampening_max_suppress_time: 4
      dampening_reuse_time: 2
      dampening_suppress_time: 3
      inject_map: [['lax_inject_map', 'lax_exist_map'], ['nyc_inject_map', 'nyc_exist_map', 'copy-attributes'], ['fsd_inject_map', 'fsd_exist_map']]
      networks: [['10.0.0.0/16', 'routemap_LA'], ['192.168.1.1/32', 'Chicago'], ['192.168.2.0/24'], ['192.168.3.0/24', 'routemap_NYC']]
      redistribute: [['direct', 'rm_direct'], ['lisp', 'rm_lisp']]
      state: present
      provider: "{{ connection }}"
    with_items: "{{ vrfs }}"
    register: result

  - assert: *true

  - name: "Check Idempotence"
    nxos_bgp_af: *configure4
    with_items: "{{ vrfs }}"
    register: result

  - assert: *false

  - name: "Configure BGP_AF 5"
    nxos_bgp_af: &configure5
      asn: 65535
      vrf: "{{ item }}"
      afi: ipv4
      safi: unicast
      dampen_igp_metric: 300
      dampening_half_time: 10
      dampening_max_suppress_time: 40
      dampening_reuse_time: 20
      dampening_suppress_time: 30
      inject_map: [['fsd_inject_map', 'fsd_exist_map']]
      networks: [['192.168.2.0/24']]
      redistribute: [['lisp', 'rm_lisp']]
      state: present
      provider: "{{ connection }}"
    with_items: "{{ vrfs }}"
    register: result

  - assert: *true

  - name: "Check Idempotence"
    nxos_bgp_af: *configure5
    with_items: "{{ vrfs }}"
    register: result

  - assert: *false

  - name: "Configure BGP_AF def5"
    nxos_bgp_af: &configuredef5
      asn: 65535
      vrf: "{{ item }}"
      afi: ipv4
      safi: unicast
      dampen_igp_metric: default
      dampening_half_time: default
      dampening_max_suppress_time: default
      dampening_reuse_time: default
      dampening_suppress_time: default
      inject_map: default
      networks: default
      redistribute: default
      state: present
      provider: "{{ connection }}"
    with_items: "{{ vrfs }}"
    register: result

  - assert: *true

  - name: "Check Idempotence"
    nxos_bgp_af: *configuredef5
    with_items: "{{ vrfs }}"
    register: result

  - assert: *false

  - name: "Remove BGP"
    nxos_bgp_af: *remove_af_vrf
    with_items: "{{ vrfs }}"
    register: result

  - assert: *true

  - name: "Check Idempotence"
    nxos_bgp_af: *remove_af_vrf
    with_items: "{{ vrfs }}"
    register: result

  - assert: *false

  rescue:
  - name: "Cleanup BGP"
    nxos_bgp: *remove
    ignore_errors: yes

  always:
  - name: "Disable feature bgp"
    nxos_feature: &disable_bgp
      feature: bgp
      state: disabled
      provider: "{{ connection }}"

  - name: "Disable feature nv overlay"
    nxos_feature: &disable_nvoverlay
      feature: nv overlay
      state: disabled
      provider: "{{ connection }}"
    ignore_errors: yes

  # Some platforms will timeout if the
  # 'no nv overlay evpn' command is sent
  # too quickly following bgp disablement.
  - pause:
      seconds: 5

  - name: "Remove nv overlay evpn"
    nxos_config:
      lines:
        - no nv overlay evpn
      provider: "{{ connection }}"
    when: platform is search('N9K')

  - debug: msg="END connection={{ ansible_connection }} nxos_bgp_af sanity test"