---
- name: ensure vlan pool does not exist for tests to kick off
  aci_encap_pool: &aci_pool_absent_static
    host: "{{ aci_hostname }}"
    username: "{{ aci_username }}"
    password: "{{ aci_password }}"
    validate_certs: '{{ aci_validate_certs | default(false) }}'
    use_ssl: '{{ aci_use_ssl | default(true) }}'
    use_proxy: '{{ aci_use_proxy | default(true) }}'
    output_level: debug
    state: absent
    pool: anstest
    pool_type: vlan
    pool_allocation_mode: static

- name: ensure vlan pool does not exist for tests to kick off
  aci_encap_pool: &aci_pool_absent_dynamic
    <<: *aci_pool_absent_static
    pool_allocation_mode: dynamic

- name: create static vlan pool - check mode works
  aci_encap_pool: &aci_pool_present_static
    <<: *aci_pool_absent_static
    state: present
    descr: Ansible Test
  check_mode: yes
  register: create_check_mode

- name: assertion test - present
  assert:
    that:
      - create_check_mode is changed
      - 'create_check_mode.sent == {"fvnsVlanInstP": {"attributes": {"allocMode": "static", "descr": "Ansible Test", "name": "anstest"}}}'

- name: create static vlan pool - creation works
  aci_encap_pool:
    <<: *aci_pool_present_static
  register: create_static

- name: assertion test - present
  assert:
    that:
      - create_static is changed
      - create_static.previous == []
      - create_static.sent == create_check_mode.sent

- name: create dynamic vlan pool - creation works
  aci_encap_pool: &aci_pool_present_dynamic
    <<: *aci_pool_absent_dynamic
    state: present
    descr: Ansible Test
  register: create_dynamic

- name: assertion test - present
  assert:
    that:
      - create_dynamic is changed
      - create_dynamic.previous == []
      - 'create_dynamic.sent == {"fvnsVlanInstP": {"attributes": {"allocMode": "dynamic", "descr": "Ansible Test", "name": "anstest"}}}'

- name: create static vlan pool again - idempotency works
  aci_encap_pool:
    <<: *aci_pool_present_static
  register: idempotent_static

- name: assertion test - present
  assert:
    that:
      - idempotent_static is not changed
      - 'idempotent_static.previous == [{"fvnsVlanInstP": {"attributes": {"allocMode": "static", "descr": "Ansible Test", "dn": "uni/infra/vlanns-[anstest]-static", "name": "anstest", "nameAlias": "", "ownerKey": "", "ownerTag": ""}}}]'
      - idempotent_static.sent == {}

- name: create dynamic vlan pool again - idempotency works
  aci_encap_pool:
    <<: *aci_pool_present_dynamic
  register: idempotent_dynamic

- name: assertion test - present
  assert:
    that:
      - idempotent_dynamic is not changed
      - 'idempotent_dynamic.previous == [{"fvnsVlanInstP": {"attributes": {"allocMode": "dynamic", "descr": "Ansible Test", "dn": "uni/infra/vlanns-[anstest]-dynamic", "name": "anstest", "nameAlias": "", "ownerKey": "", "ownerTag": ""}}}]'
      - idempotent_dynamic.sent == {}
 
- name: update static vlan pool - update works
  aci_encap_pool:
    <<: *aci_pool_present_static
    descr: Ansible Test Change
  register: update_static

- name: assertion test - present
  assert:
    that:
      - update_static is changed
      - 'update_static.sent == {"fvnsVlanInstP": {"attributes": {"descr": "Ansible Test Change"}}}'

- name: update dynamic vlan pool - update works
  aci_encap_pool:
    <<: *aci_pool_present_dynamic
    descr: Ansible Test Change
  register: update_dynamic

- name: assertion test - present
  assert:
    that:
      - update_dynamic is changed
      - 'update_dynamic.sent == {"fvnsVlanInstP": {"attributes": {"descr": "Ansible Test Change"}}}'

- name: missing param - failure message works
  aci_encap_pool:
    <<: *aci_pool_present_dynamic
    pool_allocation_mode: "{{ fake_var | default(omit) }}"
  ignore_errors: yes
  register: vlan_alloc_fail

- name: assertion test - present
  assert:
    that:
      - vlan_alloc_fail is failed
      - "vlan_alloc_fail.msg == 'ACI requires parameter \\'pool_allocation_mode\\' for \\'pool_type\\' of \\'vlan\\' and \\'vsan\\' when parameter \\'pool\\' is provided'"

- name: missing param - failure message works
  aci_encap_pool:
    <<: *aci_pool_present_dynamic
    pool: "{{ fake_var | default(omit) }}"
  ignore_errors: yes
  register: vlan_pool_fail

- name: assertion test - present
  assert:
    that:
      - vlan_pool_fail is failed
      - 'vlan_pool_fail.msg == "state is present but all of the following are missing: pool"'
 
- name: missing param - failure message works
  aci_encap_pool:
    <<: *aci_pool_present_dynamic
    pool_type: "{{ fake_var | default(omit) }}"
  ignore_errors: yes
  register: vlan_pool_type_fail

- name: assertion test - present
  assert:
    that:
      - vlan_pool_type_fail is failed
      - 'vlan_pool_type_fail.msg == "missing required arguments: pool_type"'

- name: get all vlan pools - get class works
  aci_encap_pool:
    <<: *aci_pool_absent_static
    state: query
    pool: "{{ fake_var | default(omit) }}"
    pool_allocation_mode: "{{ fake_var | default(omit) }}"
  register: get_all_pools

- name: assertion test - query
  assert:
    that:
      - get_all_pools is not changed
      - get_all_pools.method == "GET"
      - get_all_pools.current | length > 1

- name: get created static vlan pool - get mo works
  aci_encap_pool:
    <<: *aci_pool_absent_static
    state: query
  register: get_static_pool

- name: assertion test - query
  assert:
    that:
      - get_static_pool is not changed
      - get_static_pool.method == "GET"
      - get_static_pool.current | length == 1
      - get_static_pool.current.0.fvnsVlanInstP.attributes.allocMode == "static"
      - get_static_pool.current.0.fvnsVlanInstP.attributes.name == "anstest"

- name: get created dynamic vlan pool - get mo works
  aci_encap_pool:
    <<: *aci_pool_absent_dynamic
    state: query
  register: get_dynamic_pool

- name: assertion test - query
  assert:
    that:
      - get_dynamic_pool is not changed
      - get_dynamic_pool.method == "GET"
      - get_dynamic_pool.current | length == 1
      - get_dynamic_pool.current.0.fvnsVlanInstP.attributes.allocMode == "dynamic"
      - get_dynamic_pool.current.0.fvnsVlanInstP.attributes.name == "anstest"

- name: get created dynamic vlan pool - get mo works
  aci_encap_pool:
    <<: *aci_pool_absent_dynamic
    state: query
    pool_type: "{{ fake_var | default(omit) }}"
  ignore_errors: yes
  register: vlan_query_pool_type_fail

- name: assertion test - query
  assert:
    that:
      - vlan_query_pool_type_fail is failed
      - 'vlan_query_pool_type_fail.msg == "missing required arguments: pool_type"'

- name: delete static vlan pool - deletion works
  aci_encap_pool:
    <<: *aci_pool_absent_static
  register: delete_static

- name: assertion test - absent
  assert:
    that:
      - delete_static is changed
      - delete_static.method == "DELETE"
      - delete_static.previous.0.fvnsVlanInstP.attributes.allocMode == "static"
      - delete_static.previous.0.fvnsVlanInstP.attributes.name == "anstest"

- name: delete dynamic vlan pool - check mode works
  aci_encap_pool:
    <<: *aci_pool_absent_dynamic
  check_mode: yes
  register: delete_check_mode

- name: assertion test - absent
  assert:
    that:
      - delete_check_mode is changed

- name: delete dynamic vlan pool - deletion works
  aci_encap_pool:
    <<: *aci_pool_absent_dynamic
  register: delete_dynamic

- name: assertion test - absent
  assert:
    that:
      - delete_dynamic is changed
      - delete_dynamic.method == "DELETE"
      - delete_dynamic.previous.0.fvnsVlanInstP.attributes.allocMode == "dynamic"
      - delete_dynamic.previous.0.fvnsVlanInstP.attributes.name == "anstest"

- name: delete static vlan pool again - idempotency works
  aci_encap_pool:
    <<: *aci_pool_absent_static
  register: idempotent_delete_static

- name: assertion test - absent
  assert:
    that:
      - idempotent_delete_static is not changed
      - idempotent_delete_static.previous == []

- name: delete dynamic vlan pool again - idempotency works
  aci_encap_pool:
    <<: *aci_pool_absent_dynamic
  register: idempotent_delete_dynamic

- name: assertion test - absent
  assert:
    that:
      - idempotent_delete_dynamic is not changed
      - idempotent_delete_dynamic.previous == []
