# Test code for the Meraki Organization module
# Copyright: (c) 2018, Kevin Breit (@kbreit)

# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
---
- block:
  - name: Test an API key is provided
    fail:
      msg: Please define an API key
    when: auth_key is not defined
    
  - name: Use an invalid domain
    meraki_organization:
      auth_key: '{{ auth_key }}'
      host: marrrraki.com
      state: present
      org_name: IntTestOrg
      output_level: debug
    delegate_to: localhost
    register: invalid_domain
    ignore_errors: yes
    
  - name: Disable HTTP
    meraki_organization:
      auth_key: '{{ auth_key }}'
      use_https: false
      state: query
      output_level: debug
    delegate_to: localhost
    register: http
    ignore_errors: yes

  - name: Connection assertions
    assert:
      that:
        - '"Failed to connect to" in invalid_domain.msg'
        - '"http" in http.url'

  - name: Create network
    meraki_network:
      auth_key: '{{ auth_key }}'
      org_name: '{{test_org_name}}'
      net_name: TestNetAppliance
      state: present
      type: appliance
    delegate_to: localhost

  - name: Query firewall rules
    meraki_mx_l3_firewall:
      auth_key: '{{ auth_key }}'
      org_name: '{{test_org_name}}'
      net_name: TestNetAppliance
      state: query
    delegate_to: localhost
    register: query

  - assert:
      that:
        - query.data|length == 1

  - name: Set one firewall rule
    meraki_mx_l3_firewall:
      auth_key: '{{ auth_key }}'
      org_name: '{{test_org_name}}'
      net_name: TestNetAppliance
      state: present
      rules:
        - comment: Deny to documentation address
          src_port: any
          src_cidr: any
          dest_port: 80,443
          dest_cidr: 192.0.1.1/32
          protocol: tcp
          policy: deny
    delegate_to: localhost
    register: create_one

  - debug:
      var: create_one

  - assert:
      that:
        - create_one.data|length == 2
        - create_one.data.0.dest_cidr == '192.0.1.1/32'
        - create_one.data.0.protocol == 'tcp'
        - create_one.data.0.policy == 'deny'
        - create_one.changed == True
        - create_one.data is defined

  - name: Check for idempotency
    meraki_mx_l3_firewall:
      auth_key: '{{ auth_key }}'
      org_name: '{{test_org_name}}'
      net_name: TestNetAppliance
      state: present
      rules:
        - comment: Deny to documentation address
          src_port: any
          src_cidr: any
          dest_port: 80,443
          dest_cidr: 192.0.1.1/32
          protocol: tcp
          policy: deny
    delegate_to: localhost
    register: create_one_idempotent

  - debug:
      msg: '{{create_one_idempotent}}'

  - assert:
      that:
        - create_one_idempotent.changed == False
        - create_one_idempotent.data is defined

  - name: Create syslog in network
    meraki_syslog:
      auth_key: '{{ auth_key }}'
      org_name: '{{test_org_name}}'
      net_name: TestNetAppliance
      state: present
      servers:
        - host: 192.0.2.10
          port: 514
          roles:
            - Appliance event log
            - Flows
    delegate_to: localhost

  - name: Enable syslog for default rule
    meraki_mx_l3_firewall:
      auth_key: '{{ auth_key }}'
      org_name: '{{test_org_name}}'
      net_name: TestNetAppliance
      state: present
      rules:
        - comment: Deny to documentation address
          src_port: any
          src_cidr: any
          dest_port: 80,443
          dest_cidr: 192.0.1.1/32
          protocol: tcp
          policy: deny        
      syslog_default_rule: yes
    delegate_to: localhost
    register: default_syslog

  - debug:
      msg: '{{default_syslog}}'

  - assert:
      that:
        - default_syslog.data is defined

  - name: Query firewall rules
    meraki_mx_l3_firewall:
      auth_key: '{{ auth_key }}'
      org_name: '{{test_org_name}}'
      net_name: TestNetAppliance
      state: query
    delegate_to: localhost
    register: query

  - debug:
      msg: '{{query.data.1}}'

  - assert:
      that:
        - query.data.1.syslog_enabled == True
        - default_syslog.changed == True

  - name: Disable syslog for default rule
    meraki_mx_l3_firewall:
      auth_key: '{{ auth_key }}'
      org_name: '{{test_org_name}}'
      net_name: TestNetAppliance
      state: present
      rules:
        - comment: Deny to documentation address
          src_port: any
          src_cidr: any
          dest_port: 80,443
          dest_cidr: 192.0.1.1/32
          protocol: tcp
          policy: deny        
      syslog_default_rule: no
    delegate_to: localhost
    register: disable_syslog

  - debug:
      msg: '{{disable_syslog}}'

  - assert:
      that:
        - disable_syslog.data is defined

  - name: Query firewall rules
    meraki_mx_l3_firewall:
      auth_key: '{{ auth_key }}'
      org_name: '{{test_org_name}}'
      net_name: TestNetAppliance
      state: query
    delegate_to: localhost
    register: query

  - debug:
      msg: '{{query.data.1}}'

  - assert:
      that:
        - query.data.1.syslog_enabled == False
        - disable_syslog.changed == True

  always:
  - name: Delete all firewall rules
    meraki_mx_l3_firewall:
      auth_key: '{{ auth_key }}'
      org_name: '{{test_org_name}}'
      net_name: TestNetAppliance
      state: present
      rules: []
    delegate_to: localhost
    register: delete_all

  - name: Delete network
    meraki_network:
      auth_key: '{{ auth_key }}'
      org_name: '{{test_org_name}}'
      net_name: TestNetAppliance
      state: absent
    delegate_to: localhost
