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

# This task is needed to clear out any previous logfile
# size settings.
- name: Workaround to clear logging logfile size
  nxos_config:
    lines:
      - logging logfile test 1 size 4194304
    provider: "{{ connection }}"
  ignore_errors: yes

- name: Purge logging configuration first
  nxos_logging:
    purge: true
    provider: "{{ connection }}"

- name: Set up console logging
  nxos_logging: &clog
    dest: console
    dest_level: 0
    provider: "{{ connection }}"
    state: present
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"logging console 0" in result.commands'

- name: Set up console logging again (idempotent)
  nxos_logging: *clog
  register: result

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

- name: Set up console logging with level 2 (edge case)
  nxos_logging: &clog2
    dest: console
    dest_level: 2
    provider: "{{ connection }}"
    state: present
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"logging console 2" in result.commands'

- name: Set up console logging with level 2 (edge case) (idempotent)
  nxos_logging: *clog2
  register: result

- assert: *false

- name: Set Baud Rate to less than 38400
  nxos_config:
    lines:
      - speed 19200
    parents: line console
    provider: "{{ connection }}"

- name: Enable console logging with level 3 (will fail)
  nxos_logging: &con3
    dest: console
    dest_level: 3
    provider: "{{ connection }}"
  register: result
  ignore_errors: yes

- assert:
    that:
      - 'result.failed == true'

- name: Set Baud Rate to 38400
  nxos_config:
    lines:
      - speed 38400
    parents: line console
    provider: "{{ connection }}"

- name: Enable console logging with level 3 (will pass)
  nxos_logging: *con3
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"logging console 3" in result.commands'

- block:
  - name: Logfile logging with level
    nxos_logging: &llog
      dest: logfile
      name: test
      dest_level: 1
      provider: "{{ connection }}"
      state: present
    register: result

  - assert:
      that:
        - 'result.changed == true'
        - '"logging logfile test 1" in result.commands'
  

  - name: Logfile logging with level (idempotent)
    nxos_logging: *llog
    register: result

  - assert: *false

  when: platform is not search('N5K|N7K') and imagetag is not search("A8")

- name: Configure module with level
  nxos_logging: &molog
    dest: module
    dest_level: 2
    provider: "{{ connection }}"
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"logging module 2" in result.commands'

- name: Configure module with level (idempotent)
  nxos_logging: *molog
  register: result

- assert: *false

- name: Configure monitor with level
  nxos_logging: &mlog
    dest: monitor
    dest_level: 3
    provider: "{{ connection }}"
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"logging monitor 3" in result.commands'

- name: Configure monitor with level (idempotent)
  nxos_logging: *mlog
  register: result

- assert: *false

- name: Configure monitor with level 5 (edge case)
  nxos_logging: &mlog5
    dest: monitor
    dest_level: 5
    provider: "{{ connection }}"
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"logging monitor 5" in result.commands'

- name: Configure monitor with level 5 (edge case) (idempotent)
  nxos_logging: *mlog5
  register: result

- assert: *false

- name: Configure facility with level
  nxos_logging: &flog
    facility: daemon
    facility_level: 4
    provider: "{{ connection }}"
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"logging level daemon 4" in result.commands'

- name: Configure facility with level (idempotent)
  nxos_logging: *flog
  register: result

- assert: *false

- name: Configure Remote Logging
  nxos_logging: &rlog
    dest: server
    remote_server: test-syslogserver.com
    facility: auth
    facility_level: 1
    use_vrf: management
    state: present
    provider: "{{ connection }}"
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"logging server test-syslogserver.com 1 facility auth use-vrf management" in result.commands'

- name: Configure Remote Logging (idempotent)
  nxos_logging: *rlog
  register: result

- assert: *false

- name: Configure Source Interface for Logging
  nxos_logging: &srcint
    interface: mgmt0
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"logging source-interface mgmt 0" in result.commands'

- name: Configure Source Interface for Logging (idempotent)
  nxos_logging: *srcint
  register: result

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

- name: remove logging as collection tearDown
  nxos_logging: &agg
    aggregate:
      - { dest: console, dest_level: 3 }
      - { dest: module, dest_level: 2 }
      - { dest: monitor, dest_level: 5 }
      - { dest: logfile, dest_level: 1, name: test }
      - { facility: daemon, facility_level: 4 }
      - { dest: server, remote_server: test-syslogserver.com, facility: auth, facility_level: 1, use_vrf: management }
      - { interface: mgmt0 }
    provider: "{{ connection }}"
    state: absent
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"no logging logfile" in result.commands'
      - '"no logging level daemon 4" in result.commands'
      - '"no logging monitor" in result.commands'
      - '"no logging module" in result.commands'
      - '"no logging server test-syslogserver.com" in result.commands'
      - '"no logging source-interface" in result.commands'
  when: platform is not search('N5K|N7K') and imagetag is not search("A8")

- assert:
    that:
      - 'result.changed == true'
      - '"no logging level daemon 4" in result.commands'
      - '"no logging monitor" in result.commands'
      - '"no logging module" in result.commands'
      - '"no logging server test-syslogserver.com" in result.commands'
      - '"no logging source-interface" in result.commands'
  when: platform is search('N5K|N7K') or imagetag is search("A8")

- name: remove aggregate logging (idempotent)
  nxos_logging: *agg
  register: result

- assert: *false

- block:
  - name: Configure Logging message
    nxos_logging: &logm
      interface_message: add-interface-description
      state: present
      provider: "{{ connection }}"
    register: result

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

  - name: Configure Logging message (idempotent)
    nxos_logging: *logm
    register: result

  - assert: *false

  - name: Remove Logging message
    nxos_logging:
      interface_message: add-interface-description
      state: absent
      provider: "{{ connection }}"
    register: result

  - assert: *true
  when: platform is not search('N5K') and imagetag is not search("A8")


- name: Logfile logging with level and size
  nxos_logging: &llogs
    dest: logfile
    name: test
    dest_level: 1
    file_size: 16384
    provider: "{{ connection }}"
    state: present
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"logging logfile test 1 size 16384" in result.commands'

- name: Logfile logging with level and size (idempotent)
  nxos_logging: *llogs
  register: result

- assert: *false

- name: Remove logfile logging with level and size
  nxos_logging:
    dest: logfile
    name: test
    dest_level: 1
    file_size: 16384
    provider: "{{ connection }}"
    state: absent
  register: result

- assert: *true

- name: Set up logging event link enable
  nxos_logging: &logle
    event: link-enable
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"logging event link-status enable" in result.commands'

- name: Set up logging event link enable again (idempotent)
  nxos_logging: *logle
  register: result

- assert: *false

- name: Remove logging event link enable
  nxos_logging: &rlogle
    event: link-enable
    state: absent
  register: result

- assert: *true

- name: Remove logging event link enable again (idempotent)
  nxos_logging: *rlogle
  register: result

- assert: *false

- name: Set up logging event link default
  nxos_logging: &logld
    event: link-default
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"logging event link-status default" in result.commands'

- name: Set up logging event link default again (idempotent)
  nxos_logging: *logld
  register: result

- assert: *false

- name: Remove logging event link default
  nxos_logging: &rlogld
    event: link-default
    state: absent
  register: result

- assert: *true

- name: Remove logging event link default again (idempotent)
  nxos_logging: *rlogld
  register: result

- assert: *false

- name: Set up logging event trunk enable
  nxos_logging: &logte
    event: trunk-enable
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"logging event trunk-status enable" in result.commands'

- name: Set up logging event trunk enable again (idempotent)
  nxos_logging: *logte
  register: result

- assert: *false

- name: Remove logging event trunk enable
  nxos_logging: &rlogte
    event: trunk-enable
    state: absent
  register: result

- assert: *true

- name: Remove logging event trunk enable again (idempotent)
  nxos_logging: *rlogte
  register: result

- assert: *false
- name: Set up logging event trunk default
  nxos_logging: &logtd
    event: trunk-default
  register: result

- assert:
    that:
      - 'result.changed == true'
      - '"logging event trunk-status default" in result.commands'

- name: Set up logging event trunk default again (idempotent)
  nxos_logging: *logtd
  register: result

- assert: *false

- name: Remove logging event trunk default
  nxos_logging: &rlogtd
    event: trunk-default
    state: absent
  register: result

- assert: *true

- name: Remove logging event trunk default again (idempotent)
  nxos_logging: *rlogtd
  register: result

- assert: *false

- name: Set up Logging Timestamp
  nxos_logging: &ltms
    timestamp: microseconds
    provider: "{{ connection }}"
    state: present
  register: result

- assert: *true

- name: Set up Logging Timestamp (idempotent)
  nxos_logging: *ltms
  register: result

- assert: *false

- name: Remove Logging Timestamp
  nxos_logging:
    timestamp: microseconds
    state: absent
  register: result

- assert: *true

- name: Set up Facility ethpm Link UP Error

  nxos_logging: &felue
    facility: ethpm
    facility_link_status: link-up-error
    provider: "{{ connection }}"
    state: present
  register: result

- assert: *true

- name: Set up Facility ethpm Link UP Error (idempotent)
  nxos_logging: *felue
  register: result

- assert: *false

- name: Remove Facility ethpm Link UP Error
  nxos_logging:
    facility: ethpm
    facility_link_status: link-up-error
    state: absent
  register: result

- assert: *true

- name: Set up Facility ethpm Link DOWN Error

  nxos_logging: &felde
    facility: ethpm
    facility_link_status: link-down-error
    provider: "{{ connection }}"
    state: present
  register: result

- assert: *true

- name: Set up Facility ethpm Link DOWN Error (idempotent)
  nxos_logging: *felde
  register: result

- assert: *false

- name: Remove Facility ethpm Link DOWN Error
  nxos_logging:
    facility: ethpm
    facility_link_status: link-down-error
    state: absent
  register: result

- assert: *true

- debug: msg="END connection={{ ansible_connection }} nxos_logging basic test"
