# SPDX-License-Identifier: BSD-3-Clause
---
- name: Install dependencies for integration tests
  hosts: all
  vars:
    rpmdependencies:
      - python3-pytest

  tasks:
    - name: Install rpm dependencies
      package:
        state: present
        name: "{{ rpmdependencies }}"
        use: "{{ (__network_is_ostree | d(false)) |
          ternary('ansible.posix.rhel_rpm_ostree', omit) }}"

# Import needed in order to install initscripts dependencies on the remote
# system.
- name: Import the playbook '../tests_default_initscripts.yml'
  import_playbook: "../tests_default_initscripts.yml"

# Import needed in order to install Network Manager dependencies on the remote
# system.
- name: Import the playbook '../tests_default_nm.yml'
  import_playbook: "../tests_default_nm.yml"


- name: Run Pytest tests
  hosts: all
  tasks:
    - name: Run Pytest tests
      block:
        - name: Create tempdir for code to test
          tempfile:
            state: directory
            prefix: lsrtest_
          register: _rundir

        - name: Get tempfile for tar
          tempfile:
            prefix: lsrtest_
            suffix: ".tar"
          register: temptar
          delegate_to: localhost

        - name: Include the task '../tasks/get_modules_and_utils_paths.yml'
          include_tasks: ../tasks/get_modules_and_utils_paths.yml

        - name: Get tests directory
          set_fact:
            tests_directory: "{{ lookup('first_found', params) }}"
          vars:
            params:
              files:
                - tests
                - network
              paths:
                - "../.."

        # TODO: using tar and copying the file is a workaround for the
        # synchronize module that does not work in test-harness. Related issue:
        # https://github.com/linux-system-roles/test-harness/issues/102
        #
        - name: Create Tar file
          command: >
            tar -cvf {{ temptar.path }} --exclude "*.pyc"
                --exclude "__pycache__"
                -C {{ tests_directory | realpath | dirname }}
                {{ tests_directory | basename }}
                -C {{ modules_parent_and_dir.stdout_lines[0] }}
                {{ modules_parent_and_dir.stdout_lines[1] }}
                -C {{ module_utils_parent_and_dir.stdout_lines[0] }}
                {{ module_utils_parent_and_dir.stdout_lines[1] }}
          # noqa command-instead-of-module
          delegate_to: localhost
          changed_when: false

        - name: Copy testrepo.tar to the remote system
          copy:
            src: "{{ temptar.path }}"
            dest: "{{ _rundir.path }}"
            mode: preserve

        - name: Untar testrepo.tar
          unarchive:
            src: "{{ _rundir.path }}/{{ temptar.path | basename }}"
            dest: "{{ _rundir.path }}"
            remote_src: true

        - name: "Create subdirectory './ansible' under '{{ _rundir.path }}'"
          file:
            state: directory
            path: "{{ _rundir.path }}/ansible"
            mode: "0755"

        - name: Move module_utils to ansible directory
          shell: |
            if [ -d {{ _rundir.path }}/module_utils ]; then
              mv {{ _rundir.path }}/module_utils {{ _rundir.path }}/ansible
            fi
          changed_when: false

        - name: Fake out python module directories, primarily for python2
          shell: |
            for dir in $(find {{ _rundir.path }} -type d -print); do
              if [ ! -f "$dir/__init__.py" ]; then
                touch "$dir/__init__.py"
              fi
            done
          changed_when: false

        - name: Set _lsr_python_path
          set_fact:
            _lsr_python_path: "{{
                  _rundir.path ~ '/' ~
                  modules_parent_and_dir.stdout_lines[1] ~ ':' ~ _rundir.path
            }}"

        - name: Show _lsr_python_path
          debug:
            msg: path {{ _lsr_python_path }}

        - name: "List the files in {{ _rundir.path }}"
          command: ls -alrtFR {{ _rundir.path }}
          changed_when: false

        - name: Run pytest with nm provider
          block:
            - name: Run pytest with nm
              command: >
                pytest-3
                {{ _rundir.path }}/{{ tests_directory | basename }}/integration/
                --provider=nm
              register: playbook_run
              environment:
                PYTHONPATH: "{{ _lsr_python_path }}"
              changed_when: false
          always:
            - name: Debug stdout_lines of the running playbook with nm
              debug:
                var: playbook_run.stdout_lines

        - name: Run pytest with initscripts provider
          block:
            - name: Install network-scripts when running pytest with initscripts
              package:
                name: network-scripts
                state: present
                use: "{{ (__network_is_ostree | d(false)) |
                  ternary('ansible.posix.rhel_rpm_ostree', omit) }}"
            - name: Run pytest with initscripts
              command: >
                pytest-3
                {{ _rundir.path }}/{{ tests_directory | basename }}/integration/
                --provider=initscripts
              register: playbook_run
              environment:
                PYTHONPATH: "{{ _lsr_python_path }}"
              changed_when: false
          always:
            - name: Debug stdout_lines of the running playbook with initscripts
              debug:
                var: playbook_run.stdout_lines
      always:
        - name: Remove local tar file
          file:
            state: absent
            path: "{{ temptar.path }}"
          delegate_to: localhost

        - name: Remove tempdir
          file:
            state: absent
            path: "{{ _rundir.path }}"
