#  Copyright (c) 2019 Red Hat, Inc.
#
#  This file is part of ARA Records Ansible.
#
#  ARA is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  (at your option) any later version.
#
#  ARA is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with ARA.  If not, see <http://www.gnu.org/licenses/>.

# This is a list of tasks instead of a playbook. They are meant to be included
# as post_tasks inside the same play context as our roles so they have access
# to the play and role variables.

- when: ara_api_install_method == "source"
  block:
    - name: Set defaults for Ansible package name and version
      set_fact:
        ara_tests_ansible_name: "{{ ara_tests_ansible_name | default('ansible') }}"
        ara_tests_ansible_version: "{{ ara_tests_ansible_version | default('latest') }}"

    # If a version is not explicitly set we want to make sure to
    # completely omit the version argument to pip, as it will be coming
    # from the long-form integration_ansible_name variable.  Additionally, if
    # the version is the special value "latest", then we also want to omit
    # any version number, but also set the package state to "latest".
    - name: Set Ansible version for installation
      set_fact:
        _install_ansible_version: "{{ ara_tests_ansible_version }}"
      when: ara_tests_ansible_version not in ("", "latest")

    - name: Set Ansible package state for installation
      set_fact:
        _install_ansible_state: latest
      when: ara_tests_ansible_version == "latest"

    - name: Install Ansible alongside ARA
      pip:
        name: "{{ ara_tests_ansible_name }}"
        version: "{{ _install_ansible_version | default(omit, True) }}"
        state: "{{ _install_ansible_state | default(omit, True) }}"
        virtualenv: "{{ ara_api_venv | bool | ternary(ara_api_venv_path, omit) }}"
        virtualenv_command: /usr/bin/python3 -m venv

- name: Install Ansible from distribution packages
  become: yes
  package:
    name: ansible
    state: present
  when: ara_api_install_method == "distribution"

- name: Get ARA plugins directory
  environment:
    PATH: "{{ path_with_virtualenv | default('/usr/bin:/usr/local/bin') }}"
  command: python3 -m ara.setup.plugins
  changed_when: false
  register: ara_setup_plugins

- name: Record Zuul metadata for ARA playbooks
  include_tasks: zuul_metadata.yaml
  when: zuul is defined

# These aren't in the same task (i.e, with loop) so we can tell individual test
# runs apart easily rather than keeping all the output bundled in a single task.
- environment:
    ANSIBLE_CALLBACK_PLUGINS: "{{ ara_setup_plugins.stdout }}/callback"
    ANSIBLE_ACTION_PLUGINS: "{{ ara_setup_plugins.stdout }}/action"
    ANSIBLE_LOOKUP_PLUGINS: "{{ ara_setup_plugins.stdout }}/lookup"
    ARA_SETTINGS: "{{ ara_api_settings }}"
    ARA_API_CLIENT: "{{ ara_api_client | default('offline') }}"
    ARA_API_SERVER: "{{ ara_api_server | default('http://127.0.0.1:8000') }}"
    ARA_DEFAULT_LABELS: "{{ _default_labels | join(', ') | default('default-label') }}"
    PATH: "{{ path_with_virtualenv | default('/usr/bin:/usr/local/bin') }}"
  vars:
    _test_root: "{{ ara_api_source_checkout }}/tests/integration"
  block:
    # smoke.yaml tests setting ara_playbook_name in one of three plays
    - name: Run smoke.yaml integration test
      command: "ansible-playbook -vvv {{ _test_root }}/smoke.yaml"

    - name: Run lookups.yaml integration test
      command: "ansible-playbook -vvv {{ _test_root }}/lookups.yaml"

    - name: Run hosts.yaml integration test
      command: "ansible-playbook -vvv {{ _test_root }}/hosts.yaml"

    - name: Run import.yaml integration test
      command: "ansible-playbook -vvv {{ _test_root }}/import.yaml"

    # Tests setting ara_playbook_name as an extra var
    - name: Run failed.yaml integration test
      command: >
        ansible-playbook -vvv {{ _test_root }}/failed.yaml -e ara_playbook_name="Failed playbook"
      ignore_errors: yes

    - name: Run incomplete.yaml integration test
      shell: |
        ansible-playbook -vvv {{ _test_root }}/incomplete.yaml &
        sleep 5
        kill $!
      args:
        executable: /bin/bash
      ignore_errors: yes

    - name: Generate static report
      command: ara-manage generate {{ ara_api_root_dir }}/server/static

- name: List static report files
  command: ls -alR {{ ara_api_root_dir }}/server/static
