# UNINSTALL 'python2-dnf'
#  The `dnf` module has the smarts to auto-install the relevant python
#  bindings.  To test, we will first uninstall python2-dnf (so that the tests
#  on python2 will require python2-dnf)
- name: check python2-dnf with rpm
  shell: rpm -q python2-dnf
  register: rpm_result
  ignore_errors: true

# Don't uninstall python2-dnf with the `dnf` module in case it needs to load
# some dnf python files after the package is uninstalled.
- name: uninstall python2-dnf with shell
  shell: dnf -y remove python2-dnf
  when: rpm_result|success

# UNINSTALL
#   With 'python2-dnf' uninstalled, the first call to 'dnf' should install
#   python2-dnf.
- name: uninstall sos
  dnf:
    name: sos
    state: removed
  register: dnf_result

- name: check sos with rpm
  shell: rpm -q sos
  failed_when: False
  register: rpm_result

- name: verify uninstallation of sos
  assert:
    that:
        - "not dnf_result.failed | default(False)"
        - "rpm_result.rc == 1"

# UNINSTALL AGAIN
- name: uninstall sos
  dnf:
    name: sos
    state: removed
  register: dnf_result

- name: verify no change on re-uninstall
  assert:
    that:
        - "not dnf_result.changed"

# INSTALL
- name: install sos
  dnf:
    name: sos
    state: present
  register: dnf_result

- name: check sos with rpm
  shell: rpm -q sos
  failed_when: False
  register: rpm_result

- name: verify installation of sos
  assert:
    that:
        - "not dnf_result.failed | default(False)"
        - "dnf_result.changed"
        - "rpm_result.rc == 0"

- name: verify dnf module outputs
  assert:
    that:
        - "'changed' in dnf_result"
        - "'results' in dnf_result"

# INSTALL AGAIN
- name: install sos again
  dnf:
    name: sos
    state: present
  register: dnf_result

- name: verify no change on second install
  assert:
    that:
        - "not dnf_result.changed"

# Multiple packages
- name: uninstall sos and sharutils
  dnf: name=sos,sharutils state=removed
  register: dnf_result

- name: check sos with rpm
  shell: rpm -q sos
  failed_when: False
  register: rpm_sos_result

- name: check sharutils with rpm
  shell: rpm -q sharutils
  failed_when: False
  register: rpm_sharutils_result

- name: verify packages installed
  assert:
    that:
        - "rpm_sos_result.rc != 0"
        - "rpm_sharutils_result.rc != 0"

- name: install sos and sharutils as comma separated
  dnf: name=sos,sharutils state=present
  register: dnf_result

- name: check sos with rpm
  shell: rpm -q sos
  failed_when: False
  register: rpm_sos_result

- name: check sharutils with rpm
  shell: rpm -q sharutils
  failed_when: False
  register: rpm_sharutils_result

- name: verify packages installed
  assert:
    that:
        - "not dnf_result.failed | default(False)"
        - "dnf_result.changed"
        - "rpm_sos_result.rc == 0"
        - "rpm_sharutils_result.rc == 0"

- name: uninstall sos and sharutils
  dnf: name=sos,sharutils state=removed
  register: dnf_result

- name: install sos and sharutils as list
  dnf:
    name:
      - sos
      - sharutils
    state: present
  register: dnf_result

- name: check sos with rpm
  shell: rpm -q sos
  failed_when: False
  register: rpm_sos_result

- name: check sharutils with rpm
  shell: rpm -q sharutils
  failed_when: False
  register: rpm_sharutils_result

- name: verify packages installed
  assert:
    that:
        - "not dnf_result.failed | default(False)"
        - "dnf_result.changed"
        - "rpm_sos_result.rc == 0"
        - "rpm_sharutils_result.rc == 0"

- name: uninstall sos and sharutils
  dnf:
    name: "sos,sharutils"
    state: removed
  register: dnf_result

- name: install sos and sharutils as comma separated with spaces
  dnf:
    name: "sos, sharutils"
    state: present
  register: dnf_result

- name: check sos with rpm
  shell: rpm -q sos
  failed_when: False
  register: rpm_sos_result

- name: check sos with rpm
  shell: rpm -q sharutils
  failed_when: False
  register: rpm_sharutils_result

- name: verify packages installed
  assert:
    that:
        - "not dnf_result.failed | default(False)"
        - "dnf_result.changed"
        - "rpm_sos_result.rc == 0"
        - "rpm_sharutils_result.rc == 0"

- name: uninstall sos and sharutils
  dnf:
    name:
      - sos
      - sharutils
    state: removed

- name: install non-existent rpm 
  dnf:
    name: "{{ item }}"
  with_items:
    - does-not-exist
  register: non_existent_rpm
  ignore_errors: True

- name: check non-existent rpm install failed
  assert:
    that:
      - non_existent_rpm|failed

# Install in installroot='/'.  This should be identical to default
- name: install sos in /
  dnf: name=sos state=present installroot='/'
  register: dnf_result

- name: check sos with rpm in /
  shell: rpm -q sos --root=/
  failed_when: False
  register: rpm_result

- name: verify installation of sos in /
  assert:
    that:
        - "not dnf_result.failed | default(False)"
        - "dnf_result.changed"
        - "rpm_result.rc == 0"

- name: verify dnf module outputs in /
  assert:
    that:
        - "'changed' in dnf_result"
        - "'results' in dnf_result"

- name: uninstall sos in /
  dnf: name=sos installroot='/'
  register: dnf_result

# GROUP INSTALL
# Using 'Books and Guides' because it is only 5 packages and a 7.3 M download on Fedora 26.
# It also doesn't install anything that will tamper with our Python environment.
- name: install Books and Guides group
  dnf:
    name: "@Books and Guides"
    state: present
  register: dnf_result

- name: verify installation of the group
  assert:
    that:
        - "not dnf_result.failed | default(False)"
        - "dnf_result.changed"

- name: verify dnf module outputs
  assert:
    that:
        - "'changed' in dnf_result"
        - "'results' in dnf_result"

- name: install the group again
  dnf:
    name: "@Books and Guides"
    state: present
  register: dnf_result

- name: verify nothing changed
  assert:
    that:
        - "not dnf_result.changed"

- name: verify dnf module outputs
  assert:
    that:
        - "'changed' in dnf_result"
        - "'msg' in dnf_result"

- name: install the group again but also with a package that is not yet installed
  dnf:
    name:
      - "@Books and Guides"
      - bc
    state: present
  register: dnf_result

- name: verify bc is installed
  assert:
    that:
        - "dnf_result.changed"

- name: verify dnf module outputs
  assert:
    that:
        - "'changed' in dnf_result"
        - "'results' in dnf_result"

- name: try to install the group again, with --check to check 'changed'
  dnf:
    name: "@Books and Guides"
    state: present
  check_mode: yes
  register: dnf_result

- name: verify nothing changed
  assert:
    that:
        - "not dnf_result.changed"

- name: verify dnf module outputs
  assert:
    that:
        - "'changed' in dnf_result"
        - "'msg' in dnf_result"

# cleanup until https://github.com/ansible/ansible/issues/27377 is resolved
- shell: dnf -y group install "Books and Guides" && dnf -y group remove "Books and Guides"

# GROUP UPGRADE - this will go to the same method as group install
# but through group_update - it is its invocation we're testing here
# see commit 119c9e5d6eb572c4a4800fbe8136095f9063c37b
- name: install latest Books and Guides
  dnf:
    name: "@Books and Guides"
    state: latest
  register: dnf_result

- name: verify installation of the group
  assert:
    that:
        - "not dnf_result.failed | default(False)"
        - "dnf_result.changed"

- name: verify dnf module outputs
  assert:
    that:
        - "'changed' in dnf_result"
        - "'results' in dnf_result"

# cleanup until https://github.com/ansible/ansible/issues/27377 is resolved
- shell: dnf -y group install "Books and Guides" && dnf -y group remove "Books and Guides"

- name: try to install non existing group
  dnf:
    name: "@non-existing-group"
    state: present
  register: dnf_result
  ignore_errors: True

- name: verify installation of the non existing group failed
  assert:
    that:
        - "not dnf_result.changed"
        - "dnf_result|failed"

- name: verify dnf module outputs
  assert:
    that:
        - "'changed' in dnf_result"
        - "'msg' in dnf_result"

- name: try to install non existing file
  dnf:
    name: /tmp/non-existing-1.0.0.fc26.noarch.rpm
    state: present
  register: dnf_result
  ignore_errors: yes

- name: verify installation failed
  assert:
    that:
        - "dnf_result|failed"
        - "not dnf_result.changed"

- name: verify dnf module outputs
  assert:
    that:
        - "'changed' in dnf_result"
        - "'msg' in dnf_result"

- name: try to install from non existing url
  dnf:
    name: http://non-existing.com/non-existing-1.0.0.fc26.noarch.rpm
    state: present
  register: dnf_result
  ignore_errors: yes

- name: verify installation failed
  assert:
    that:
        - "dnf_result|failed"
        - "not dnf_result.changed"

- name: verify dnf module outputs
  assert:
    that:
        - "'changed' in dnf_result"
        - "'msg' in dnf_result"

# ENVIRONMENT UPGRADE
# see commit de299ef77c03a64a8f515033a79ac6b7db1bc710
- name: install Web Server environment
  dnf:
    name: "@Web Server"
    state: latest
  register: dnf_result

- name: verify installation of the environment
  assert:
    that:
        - "not dnf_result.failed | default(False)"
        - "dnf_result.changed"

- name: verify dnf module outputs
  assert:
    that:
        - "'changed' in dnf_result"
        - "'results' in dnf_result"
