# Test code for the ACI modules
# Copyright: (c) 2018, Dag Wieers (@dagwieers) <dag@wieers.com>

# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)


# CLEAN ENVIRONMENT
- name: Remove firmware source
  aci_firmware_source: &source_absent
    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: info
    source: aci-msft-pkg-3.1.1i.zip
    state: absent


# ADD SOURCE
#- name: Add source (check_mode)
#  aci_firmware_source: &source_present
#    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: info
#    source: aci-msft-pkg-3.1.1i.zip
#    url: foobar.cisco.com/download/cisco/aci/aci-msft-pkg-3.1.1i.zip
#    url_protocol: http
#    state: present
#  check_mode: yes
#  register: cm_add_source
#
#- name: Add source (normal mode)
#  aci_firmware_source: *source_present
#  register: nm_add_source
#
#- name: Verify add_source
#  assert:
#    that:
#    - cm_add_source.changed == nm_add_source.changed == true
#    - 'cm_add_source.sent == nm_add_source.sent == {"firmwareOSource": {"attributes": {"name": "aci-msft-pkg-3.1.1i.zip", "proto": "http", "url": "foobar.cisco.com/download/cisco/aci/aci-msft-pkg-3.1.1i.zip"}}}'
#    - 'cm_add_source.proposed == nm_add_source.proposed == {"firmwareOSource": {"attributes": {"name": "aci-msft-pkg-3.1.1i.zip", "proto": "http", "url": "foobar.cisco.com/download/cisco/aci/aci-msft-pkg-3.1.1i.zip"}}}'
#    - cm_add_source.current == cm_add_source.previous == nm_add_source.previous == []
#    - nm_add_source.current.0.firmwareOSource.attributes.name == 'aci-msft-pkg-3.1.1i.zip'
#    - nm_add_source.current.0.firmwareOSource.attributes.proto == 'http'
#    - nm_add_source.current.0.firmwareOSource.attributes.url == 'foobar.cisco.com/download/cisco/aci/aci-msft-pkg-3.1.1i.zip'
#
#- name: Add source again (check_mode)
#  aci_firmware_source: *source_present
#  check_mode: yes
#  register: cm_add_source_again
#
#- name: Add source again (normal mode)
#  aci_firmware_source: *souce_present
#  register: nm_add_source_again
#
#- name: Verify add_source_again
#  assert:
#    that:
#    - cm_add_source_again.changed == nm_add_source_again.changed == false


# QUERY ALL SOURCES
- name: Query all sources (check_mode)
  aci_firmware_source: &source_query
    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) }}'
    state: query
  check_mode: yes
  register: cm_query_all_sources

- name: Query all sources (normal mode)
  aci_firmware_source: *source_query
  register: nm_query_all_sources

- name: Verify query_all_sources
  assert:
    that:
    - cm_query_all_sources.changed == nm_query_all_sources.changed == false
    - cm_query_all_sources == nm_query_all_sources
#    - nm_query_all_sources.current|length >= 1


# QUERY A SOURCE
#- name: Query our source (check_mode)
#  aci_firmware_source:
#    <<: *source_query
#    source: aci-msft-pkg-3.1.1i.zip
#  check_mode: yes
#  register: cm_query_source
#
#- name: Query our source (normal mode)
#  aci_firmware_source:
#    <<: *source_query
#    source: aci-msft-pkg-3.1.1i.zip
#  register: nm_query_source
#
#- name: Verify query_source
#  assert:
#    that:
#    - cm_query_source.changed == nm_query_source.changed == false
#    - cm_query_source == nm_query_source
#    - nm_query_source.current.0.infraRsDomP.attributes.dn == 'uni/infra/attentp-test_aep/rsdomP-[uni/phys-phys_dom]'
#    - nm_query_source.current.0.infraRsDomP.attributes.tCl == 'physDomP'
#    - nm_query_source.current.0.infraRsDomP.attributes.tDn == 'uni/phys-phys_dom'


# REMOVE SOURCE
#- name: Remove source (check_mode)
#  aci_firmware_source: *source_absent
#  check_mode: yes
#  register: cm_remove_source

#- name: Remove source (normal mode)
#  aci_firmware_source: *source_absent
#  register: nm_remove_source
#
#- name: Verify remove_source
#  assert:
#    that:
#    - cm_remove_source.changed == nm_remove_source.changed == true
#    - 'cm_remove_source.current == cm_remove_source.previous == nm_remove_source.previous == [{"infraRsDomP": {"attributes": {"dn": "uni/infra/attentp-test_aep/rsdomP-[uni/phys-phys_dom]", "tDn": "uni/phys-phys_dom"}}}]'
#    - nm_remove_source.current == []
#
#- name: Remove source again (check_mode)
#  aci_firmware_source: *source_absent
#  check_mode: yes
#  register: cm_remove_source_again
#
#- name: Remove source again (normal mode)
#  aci_firmware_source: *source_absent
#  register: nm_remove_source_again
#
#- name: Verify remove_source_again
#  assert:
#    that:
#    - cm_remove_source_again.changed == nm_remove_source_again.changed == false


# QUERY NON-EXISTING SOURCE
#- name: Query non-existing source (check_mode)
#  aci_firmware_source:
#    <<: *source_query
#    source: aci-msft-pkg-3.1.1i.zip
#  check_mode: yes
#  register: cm_query_non_source
#
#- name: Query non-existing source (normal mode)
#  aci_firmware_source:
#    <<: *source_query
#    source: aci-msft-pkg-3.1.1i.zip
#  register: nm_query_non_source
#
#- name: Verify query_non_source
#  assert:
#    that:
#    - cm_query_non_source.changed == nm_query_non_source.changed == false
#    - cm_query_non_source == nm_query_non_source
#    - nm_query_non_source.current == []


# PROVOKE ERRORS
- name: Error when required parameter is missing
  aci_firmware_source:
    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: info
    state: present
  ignore_errors: yes
  register: error_on_missing_required_param

- name: Verify error_on_missing_required_param
  assert:
    that:
    - error_on_missing_required_param.failed == true
    - 'error_on_missing_required_param.msg == "state is present but all of the following are missing: source, url"'