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

- block:
  # N9K(v9.2+) specific attrs
  - set_fact: global_mcast_group_L2="225.1.1.2"
  - set_fact: def_global_mcast_group_L2="default"

  # Layer 3 Tenant Routed Multicast (TRM) dependency.
  # global_mcast_group_l3 / global_ingress_replication_bgp have a dependency on TRM.
  # TRM requires specific 92/93/95 chassis and -EX/-FX line cards.
  - block:
    - set_fact: global_mcast_group_L3="225.1.1.1"
    - set_fact: def_global_mcast_group_L3="default"
    - set_fact: global_ingress_replication_bgp="true"
    - set_fact: def_global_ingress_replication_bgp="false"
    when: false # Manually change this to true when correct h/w is present

  - name: "TCAM resource check for global_suppress_arp"
    # GSA requires tcam resources. Skip these attrs when arp-ether size is 0.
    # Note: TCAM changes require a switch reload.
    # Sample Input: "Ingress ARP-Ether ACL [arp-ether] size =  256"
    nxos_command:
      commands:
        - command: show hardware access-list tcam region | incl arp-ether | sed 's/.*size = *//'
          output: text
    connection: network_cli
    register: tcam_state
  - block:
    - set_fact: global_suppress_arp="true"
    - set_fact: def_global_suppress_arp="false"
    when: "tcam_state.stdout[0]|int > 0"

  when:  platform is search('N9K') and (major_version is version('9.2', 'ge'))

- block:
  - name: "Apply N7K specific setup config"
    include: targets/nxos_vxlan_vtep/tasks/platform/n7k/setup.yaml
    when: platform is match('N7K')

  - name: "Enable feature nv overlay"
    nxos_config:
      commands:
        - feature nv overlay
        - nv overlay evpn
      match: none
      provider: "{{ connection }}"

  - block:
    - name: "Enable feature ngmvpn"
      nxos_config:
        commands:
          - feature ngmvpn
        match: none
        provider: "{{ connection }}"
    when: global_mcast_group_L3 is defined

  - block:
    - name: configure vxlan_vtep
      nxos_vxlan_vtep: &configure9
        interface: nve1
        description: "abcd"
        host_reachability: true
        source_interface: Loopback0
        source_interface_hold_down_time: 30
        global_ingress_replication_bgp: "{{ global_ingress_replication_bgp|default(omit) }}"
        global_suppress_arp: "{{ global_suppress_arp|default(omit) }}"
        global_mcast_group_L3: "{{ global_mcast_group_L3|default(omit) }}"
        shutdown: false
        provider: "{{ connection }}"
      register: result

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

    - name: "Conf Idempotence"
      nxos_vxlan_vtep: *configure9
      register: result

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

    - name: reset vxlan_vtep
      nxos_vxlan_vtep: &def9
        interface: nve1
        description: default
        host_reachability: false
        source_interface_hold_down_time: default
        source_interface: default
        global_ingress_replication_bgp: "{{ def_global_ingress_replication_bgp|default(omit) }}"
        global_suppress_arp: "{{ def_global_suppress_arp|default(omit) }}"
        global_mcast_group_L3: "{{ def_global_mcast_group_L3|default(omit) }}"
        shutdown: true
        provider: "{{ connection }}"
      register: result

    - assert: *true

    - name: "reset Idempotence"
      nxos_vxlan_vtep: *def9
      register: result

    - assert: *false

    - name: configure global mcast L2
      nxos_vxlan_vtep: &gml2
        interface: nve1
        host_reachability: true
        global_mcast_group_L2: "{{ global_mcast_group_L2|default(omit) }}"
        provider: "{{ connection }}"
      register: result

    - assert: *true

    - name: "Conf Idempotence"
      nxos_vxlan_vtep: *gml2
      register: result

    - assert: *false

    - name: reset global mcast L2
      nxos_vxlan_vtep: &rgml2
        interface: nve1
        host_reachability: false
        global_mcast_group_L2: "{{ def_global_mcast_group_L2|default(omit) }}"
        provider: "{{ connection }}"
      register: result

    - assert: *true

    - name: "reset Idempotence"
      nxos_vxlan_vtep: *rgml2
      register: result

    - assert: *false

    when: (platform is search('N9K'))

  - block:
    - name: configure vxlan_vtep
      nxos_vxlan_vtep: &configure7
        interface: nve1
        description: default
        host_reachability: true
        source_interface: Loopback0
        shutdown: false
        provider: "{{ connection }}"
      register: result

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

    - name: "Conf Idempotence"
      nxos_vxlan_vtep: *configure7
      register: result

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

    - name: reset vxlan_vtep
      nxos_vxlan_vtep: &def7
        interface: nve1
        description: default
        host_reachability: false
        source_interface: default
        shutdown: true
        provider: "{{ connection }}"
      register: result

    - assert: *true

    - name: "reset Idempotence"
      nxos_vxlan_vtep: *def7
      register: result

    - assert: *false

    when: (platform is search('N7K'))

  - name: remove vxlan_vtep
    nxos_vxlan_vtep: &remove
      interface: nve1
      description: default
      host_reachability: true
      source_interface: Loopback0
      source_interface_hold_down_time: 30
      shutdown: true
      provider: "{{ connection }}"
      state: absent
    register: result

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

  - name: "Remove Idempotence"
    nxos_vxlan_vtep: *remove
    register: result

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

  when: (platform is search("N7K|N9K"))

  always:
  - name: "Apply N7K specific cleanup config"
    include: targets/nxos_vxlan_vtep/tasks/platform/n7k/cleanup.yaml
    when: platform is match('N7K')

  - name: "Disable nv overlay evpn"
    nxos_config:
      commands:
        - no nv overlay evpn
      match: none
      provider: "{{ connection }}"
    ignore_errors: yes

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

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