# If install_ansible_version is not defined (note; not *empty*) it
# should be "latest"
- name: Set ansible default version to latest
  set_fact:
    install_ansible_version: latest
  when: install_ansible_version is not defined

# 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 install_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: '{{ install_ansible_version }}'
  when: install_ansible_version not in ('', 'latest')

- name: Set ansible package state for installation
  set_fact:
    _install_ansible_state: latest
  when: install_ansible_version == 'latest'

# Since Ansible 2.10 (~2020-08) the devel core package is split into
# "ansible-base".  The PyPi the package "ansible" has everything in it
# (the so called Ansible Community Distribution) but we specifically
# want to test against devel.  However, ARA still depends on the
# "ansible" package -- but we like ARA, because we can see the nested
# runs with it.  To to keep ARA but avoid it bringing in either an old
# version of Ansible, or the ACD, install a dummy package.
- name: Check if running devel branch
  set_fact:
    _install_ansible_from_devel: true
  when: '"github.com/ansible/ansible" in install_ansible_name'

# Since ~2020-11 ansible renamed "ansible-base" to "ansible-core".
# Unfortunately, ansible-base and ansible-core can not live happily
# together.  For testinfra, our tox role pre-installs the requirements
# from tox.ini (ansible-base) but then tries to install siblings (the
# checked out ansible tree, now trying to install the "ansible-core"
# package).  There is no working "ansible-core" package on PyPi, so
# for now we have to switch this out in the tox.ini for the -devel job
# to work.  We can remove this when "ansible-core" is published at an
# appropriate version on PyPi; at that point the checked-out tree can
# override the package in the testing tox venv.
- name: Override ansible-base tox install
  when: '"github.com/ansible/ansible" in install_ansible_name'
  lineinfile:
    path: /home/zuul/src/opendev.org/opendev/system-config/tox.ini
    regexp: '^  ansible-base # see install-ansible/tasks/main\.yaml$'
    line:   '  ansible-core'

- name: Setup Ansible stub for post 2.10 compat
  include_tasks: install_ansible_stub.yaml
  when: _install_ansible_from_devel is defined

# From Ansible 2.10 >= most of the fun stuff is in collections.  Clone
# our required collections here.  Note, in production, we use ACD
# which bundles most of this.
#
# TODO(ianw): we should add these to zuul and link the speculative
# copies into ansible, then we could test changes in the collections!
- name: Install Ansible collections
  include_tasks: install_ansible_collection.yaml
  when: _install_ansible_from_devel is defined
  loop:
    - namespace: ansible
      name: netcommon
      repo: ansible-collections/ansible.netcommon
    - namespace: ansible
      name: posix
      repo: ansible-collections/ansible.posix
    - namespace: community
      name: general
      repo: ansible-collections/community.general
    - namespace: community
      name: crypto
      repo: ansible-collections/community.crypto

- name: Ensure required Ansible build packages for non-wheel architectures
  apt:
    update_cache: yes
    name:
      - libffi-dev
      - libssl-dev
      - build-essential
  when: ansible_architecture == 'aarch64'

- name: Install ansible
  pip:
    name: '{{ install_ansible_name | default("ansible") }}'
    version: '{{ _install_ansible_version | default(omit) }}'
    state: '{{ _install_ansible_state | default(omit) }}'

- name: Ansible version check
  command: 'ansible-playbook --version'
  register: _ansible_version_check

- name: Sanity check Ansible version
  debug:
    msg: '{{ _ansible_version_check.stdout }}'

- name: Ansible cmd version check
  command: 'ansible --version'
  register: _ansible_version_check

- name: Sanity check Ansible version
  debug:
    msg: '{{ _ansible_version_check.stdout }}'

- name: Set up the ARA callback
  include_tasks: install_ara.yaml
  when: install_ansible_ara_enable

# For use by k8s_raw ansible module
# - name: Install openshift client
#   pip:
#     name: 'openshift'
# TODO(corvus): re-add this once kubernetes 9.0.0 is released

# Same version/state default swizzling as described above for
# openstacksdk
- name: Set openstacksdk default version to latest
  set_fact:
    install_ansible_openstacksdk_version: latest
  when: install_ansible_openstacksdk_version is not defined

- name: Set openstacksdk version for installation
  set_fact:
    _install_ansible_openstacksdk_version: '{{ install_ansible_openstacksdk_version }}'
  when: install_ansible_openstacksdk_version not in ('', 'latest')

- name: Set openstacksdk package state for installation
  set_fact:
    _install_openstacksdk_state: latest
  when: install_ansible_openstacksdk_version == 'latest'

- name: Install openstacksdk
  pip:
    name: '{{ install_ansible_openstacksdk_name | default("openstacksdk") }}'
    version: '{{ _install_ansible_openstacksdk_version | default(omit) }}'
    state: '{{ _install_openstacksdk_state | default(omit) }}'

# NOTE(ianw) 2021-03-03 stevedore < 3.3.0 has a bug where it creates a
# constantly expanding set of cache files in
# /root/.cache/python-endpoints when run under ansible in a /tmp
# directory (this happens via cloud-launcher and openstacksdk).
# Ensure the production host is updated, and drop a .disable file
# for good measure
- name: Ensure stevedore >= 3.3.0
  pip:
    name: 'stevedore>=3.3.0'
- name: Add stevedore cache dir
  file:
    path: /root/.cache/python-entrypoints/
    state: directory
    mode: 0700
- name: Add stevedore cache disable file
  file:
    path: /root/.cache/python-entrypoints/.disable
    state: touch
    mode: 0600

- name: Ensure /etc/ansible and /etc/ansible/hosts
  file:
    state: directory
    path: /etc/ansible/hosts

- name: Ensure /etc/ansible/inventory_plugins
  file:
    state: directory
    path: /etc/ansible/inventory_plugins

- name: Ensure /var/cache/ansible
  file:
    state: directory
    path: /var/cache/ansible
    owner: root
    group: root
    mode: 0770

- name: Ensure ansible log dir is writable
  file:
    path: /var/log/ansible
    state: directory
    owner: root
    group: root
    mode: 0775

- name: Copy ansible.cfg in to place
  template:
    src: ansible.cfg.j2
    dest: /etc/ansible/ansible.cfg

- name: Remove old inventory files
  file:
    path: '/etc/ansible/hosts/{{ item }}'
    state: absent
  loop:
    - openstack.yaml
    - groups.yaml

- name: Copy system-config roles into place
  copy:
    src: roles/
    dest: /etc/ansible/roles

- name: Copy disable-ansible utility script in place
  copy:
    src: disable-ansible
    dest: /usr/local/bin/disable-ansible
    mode: 0755
    owner: root
    group: root

- name: Copy yamlgroup inventory in place
  copy:
    src: inventory_plugins/yamlgroup.py
    dest: /etc/ansible/inventory_plugins/yamlgroup.py

- name: Setup log rotation
  include_role:
    name: logrotate
  vars:
    logrotate_file_name: /var/log/ansible/ansible.log

- name: Verify ansible install
  command: ansible --version