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

# Flag used to test the track feature.  Some platforms
# don't support it so this flag will be toggled accordingly.
- set_fact: test_track_feature="true"

- name: configure track
  nxos_config:
    lines:
      - track 1 ip sla 1
    provider: "{{ connection }}"
  register: cmd_result
  ignore_errors: yes

- debug: msg="cmd result {{ cmd_result }}"

- set_fact: test_track_feature="false"
  when: cmd_result.failed

- debug: msg="Test Track Feature {{ test_track_feature }}"

- name: Setup and teardown, remove test routes if present
  nxos_static_route: &setup_teardown
    aggregate:
      - { prefix: "192.168.1.164/32", next_hop: "192.0.2.3" }
      - { prefix: "192.168.20.64/24", next_hop: "192.0.2.3" }
      - { prefix: "192.168.22.64/24", next_hop: "192.0.2.3" }
      - { prefix: "192.168.24.64/24", next_hop: "192.0.2.3" }
    vrf: "{{ item }}"
    provider: "{{ connection }}"
    state: absent
  with_items: "{{ vrfs }}"
  ignore_errors: yes

- name: Setup noise routes to ensure testing while non-test routes present
  nxos_static_route:
    prefix: "192.168.1.164/32"
    next_hop: "192.0.2.3"
    vrf: "{{ item }}"
    provider: "{{ connection }}"
    state: present
  with_items: "{{ vrfs }}"

- block:
  - name: create static route
    nxos_static_route: &configure_static
      prefix: "192.168.20.64/24"
      next_hop: "192.0.2.3"
      route_name: testing
      pref: 100
      tag: 5500
      vrf: "{{ item }}"
      provider: "{{ connection }}"
    with_items: "{{ vrfs }}"
    register: result

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

  - name: "Conf static Idempotence"
    nxos_static_route: *configure_static
    with_items: "{{ vrfs }}"
    register: result

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

  - name: change static route
    nxos_static_route: &change_static
      prefix: "192.168.20.64/24"
      next_hop: "192.0.2.3"
      route_name: default
      pref: 10
      tag: default
      vrf: "{{ item }}"
      provider: "{{ connection }}"
    with_items: "{{ vrfs }}"
    register: result

  - assert: *true

  - name: "Change Idempotence"
    nxos_static_route: *change_static
    with_items: "{{ vrfs }}"
    register: result

  - assert: *false

  - name: configure static route with track
    nxos_static_route: &config_static_track
      prefix: "192.168.20.64/24"
      next_hop: "192.0.2.3"
      route_name: default
      pref: 10
      tag: default
      track: 1
      vrf: "{{ item }}"
      provider: "{{ connection }}"
    with_items: "{{ vrfs }}"
    register: result
    when: test_track_feature

  - assert: *true
    when: test_track_feature

  - name: "Config track Idempotence"
    nxos_static_route: *config_static_track
    with_items: "{{ vrfs }}"
    register: result
    when: test_track_feature

  - assert: *false
    when: test_track_feature

  - name: configure static route with not configured track
    nxos_static_route:
      prefix: "192.168.20.64/24"
      next_hop: "192.0.2.3"
      route_name: default
      pref: 10
      tag: default
      track: 2
      vrf: "{{ item }}"
      provider: "{{ connection }}"
    with_items: "{{ vrfs }}"
    register: result
    ignore_errors: yes
    when: test_track_feature

  - assert:
      that:
        - "result.failed == True"
    when: test_track_feature

  - name: remove static route
    nxos_static_route: &remove_static
      prefix: "192.168.20.64/24"
      next_hop: "192.0.2.3"
      route_name: testing
      pref: 100
      vrf: "{{ item }}"
      provider: "{{ connection }}"
      state: absent
    with_items: "{{ vrfs }}"
    register: result

  - assert: *true

  - name: "Remove Idempotence"
    nxos_static_route: *remove_static
    with_items: "{{ vrfs }}"
    register: result

  - assert: *false

  - name: configure static route(aggregate)
    nxos_static_route: &conf_agg
      aggregate:
        - { prefix: "192.168.22.64/24", next_hop: "192.0.2.3" }
        - { prefix: "192.168.24.64/24", next_hop: "192.0.2.3" }
      provider: "{{ connection }}"
    register: result

  - assert: *true

  - name: configure static route aggregate(Idempotence)
    nxos_static_route: *conf_agg
    register: result

  - assert: *false

  - name: remove static route aggregate
    nxos_static_route: &remove_agg
      aggregate:
        - { prefix: "192.168.22.64/24", next_hop: "192.0.2.3" }
        - { prefix: "192.168.24.64/24", next_hop: "192.0.2.3" }
      provider: "{{ connection }}"
      state: absent
    register: result

  - assert: *true

  - name: remove static route aggregate(Idempotence)
    nxos_static_route: *remove_agg
    register: result

  - assert: *false

  always:
  - name: remove track
    nxos_config:
      lines:
        - no track 1
      provider: "{{ connection }}"
    ignore_errors: yes
    when: test_track_feature

  - name: teardown test routes
    nxos_static_route: *setup_teardown
    with_items: "{{ vrfs }}"
    ignore_errors: yes

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