---
- debug: msg="START connection={{ ansible_connection }} ios_l2_interface sanity test"

- name: "Setup interface"
  ios_config: &default
    lines:
      - "default interface {{ test_interface }}"
    provider: "{{ cli }}"

- name: set trunk encapsulation type
  ios_config:
    lines:
      - switchport trunk encapsulation dot1q
    parents:
      - "interface {{ test_interface }}"
    provider: "{{ cli }}"

- name: "Setup vlans"
  ios_vlan:
    aggregate:
      - vlan_id: 5
      - vlan_id: 6
      - vlan_id: 7
      - vlan_id: 8
      - vlan_id: 9
      - vlan_id: 10
      - vlan_id: 20
    provider: "{{ cli }}"

- block:
  - name: Ensure interface is in its default switchport state
    ios_l2_interface: &def_swi
      name: "{{ test_interface }}"
      state: unconfigured
      provider: "{{ cli }}"

  - name: Ensure interface is configured for access vlan 20
    ios_l2_interface: &acc_vl
      name: "{{ test_interface }}"
      mode: access
      access_vlan: 20
      provider: "{{ cli }}"
    register: result

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

  - name: "access vlan Idempotence"
    ios_l2_interface: *acc_vl
    register: result

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

  - name: Ensure interface only has vlans 5-10 as trunk vlans
    ios_l2_interface: &tr_vl
      name: "{{ test_interface }}"
      mode: trunk
      native_vlan: 10
      trunk_allowed_vlans: 5-10
      provider: "{{ cli }}"
    register: result

  - assert: *true

  - name: "trunk vlan Idempotence"
    ios_l2_interface: *tr_vl
    register: result

  - assert: *false

  - name: Ensure interface is a trunk port and ensure 2-50 are being tagged (doesn't mean others aren't also being tagged)
    ios_l2_interface: &tag
      name: "{{ test_interface }}"
      mode: trunk
      native_vlan: 10
      trunk_vlans: 2-50
      provider: "{{ cli }}"
    register: result

  - assert: *true

  - name: "tag vlan Idempotence"
    ios_l2_interface: *tag
    register: result

  - assert: *false

  - name: Remove full trunk vlan range 2-50
    ios_l2_interface: &no_tag
      name: "{{ test_interface }}"
      mode: trunk
      trunk_vlans: 2-50
      state: absent
      provider: "{{ cli }}"
    register: result

  - assert: *true

  - name: Check Idempotence Remove full trunk vlan range 2-50
    ios_l2_interface: *no_tag
    register: result

  - assert: *false

  - name: Reconfigure interface trunk port and ensure 2-50 are being tagged
    ios_l2_interface: *tag
    register: result

  - assert: *true

  - name: Check Idempotence Reconfigure interface trunk port and ensure 2-50 are being tagged
    ios_l2_interface: *tag
    register: result

  - assert: *false

  - name: Remove partial trunk vlan range 30-4094 are removed
    ios_l2_interface: &partial
      name: "{{ test_interface }}"
      mode: trunk
      trunk_vlans: 30-4094
      state: absent
      provider: "{{ cli }}"
    register: result

  - assert: *true

  - name: Check Idempotence Remove partial trunk vlan range 30-4094 are removed
    ios_l2_interface: *partial
    register: result

  - assert: *false

  - name: put interface default state
    ios_l2_interface: *def_swi
    register: result

  - assert: *true

  - name: "default state idempotence"
    ios_l2_interface: *def_swi
    register: result

  - assert: *false

  always:
    - name: "remove vlans"
      ios_vlan:
        aggregate:
          - vlan_id: 5
          - vlan_id: 6
          - vlan_id: 7
          - vlan_id: 8
          - vlan_id: 9
          - vlan_id: 10
          - vlan_id: 20
        state: absent
        provider: "{{ cli }}"
      ignore_errors: yes

    - name: "default interface"
      ios_config: *default
      ignore_errors: yes

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