/home/zuul/src/opendev.org/openstack/openstack-ansible/playbooks/utility-install.yml
---
# Copyright 2014, Rackspace US, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

- name: Setup the utility location(s)
  hosts: utility_all
  user: root
  gather_facts: "{{ osa_gather_facts | default(True) }}"
  environment: "{{ deployment_environment_variables | default({}) }}"
  vars_files:
    - "defaults/repo_packages/openstack_services.yml"
    - "defaults/{{ install_method }}_install.yml"
  vars:
    utility_upper_constraints_url: "{{ requirements_git_url | default('https://opendev.org/openstack/requirements/raw/' ~ requirements_git_install_branch | default('master') ~ '/upper-constraints.txt') }}"
  tags:
    - utility
  handlers:
    - name: Create openstack client bash_completion script
      shell: >-
        openstack complete > /etc/bash_completion.d/openstack_client
      args:
        executable: /bin/bash
      listen:
        - "venv changed"
  pre_tasks:
    - include_tasks: "common-tasks/os-{{ container_tech | default('lxc') }}-container-setup.yml"
      when: not is_metal

    - include_tasks: common-tasks/os-log-dir-setup.yml
      vars:
        log_dirs:
          - src: "/openstack/log/{{ inventory_hostname }}-utility"
            dest: "/var/log/utility"

    - include_tasks: common-tasks/unbound-clients.yml
      when:
        - hostvars['localhost']['resolvconf_enabled'] | bool

    - name: Create log directory (not is_metal)
      file:
        dest: "/var/log/utility"
        state: "directory"
        force: "yes"
      when: not is_metal | bool

  roles:
    - role: "galera_client"
    - role: "openstack_openrc"
      tags:
        - openrc

  post_tasks:
    - name: Add OpenStack client to distro packages
      set_fact:
        utility_distro_packages: "{{ (utility_distro_packages | default([])) + _utility_distro_openstack_clients_packages[utility_distro_openstack_clients_python_version|int] }}"
      when: install_method == "distro"

    - name: Install distro packages
      package:
        name: "{{ utility_distro_packages | default([]) }}"
        state: "{{ utility_package_state }}"
        update_cache: "{{ (ansible_pkg_mgr in ['apt', 'zypper']) | ternary('yes', omit) }}"
        cache_valid_time: "{{ (ansible_pkg_mgr == 'apt') | ternary(cache_timeout, omit) }}"
      register: install_packages
      until: install_packages is success
      retries: 5
      delay: 2

    - name: Distribute private ssh key
      copy:
        content: "{{ utility_ssh_private_key }}"
        dest: /root/.ssh/id_rsa
        mode: 0600
        owner: root
        group: root
      when: utility_ssh_private_key is defined

    - name: Install openstack clients (source-based install)
      when:
        - install_method == "source"
      block:
        - name: Get list of repo packages
          uri:
            url: "{{ utility_upper_constraints_url }}"
            return_content: yes
          register: _abs_reqs
          run_once: true
          tags:
            - always

        - name: Derive the list of openstack clients
          set_fact:
            _openstack_client_list: >-
              {%- set package_list = [] %}
              {%- for l in _abs_reqs.content.split('\n') %}
              {%-   if (l is match('^python-.*client==.*$')) or
                       (l is match('^(aodh|gnocchi)client==.*$')) or
                       (l is match('^osc-placement==.*$'))
              %}
              {%-     set _ = package_list.append(l | regex_replace('==.*$', '')) %}
              {%-   endif %}
              {%- endfor %}
              {{- package_list }}
          run_once: true
          tags:
            - always

        - name: Install the python venv
          include_role:
            name: "python_venv_build"
          vars:
            venv_python_executable: "{{ utility_venv_python_executable | default(openstack_venv_python_executable) }}"
            venv_install_destination_path: "{{ utility_venv_bin | dirname }}"
            venv_pip_install_args: "{{ pip_install_options | default('') }}"
            venv_build_constraints:
              - "--constraint {{ utility_upper_constraints_url }}"
            venv_pip_packages: "{{ _openstack_client_list | union(utility_pip_packages) }}"

        - name: Create symlinks for openstack clients
          shell: |
            {% set _bin_name = item | regex_replace('^(?:python-)?(\w*)(?:client)$', '\\1') %}
            set -e
            return_code=0
            if [[ -e "{{ utility_venv_bin }}/{{ _bin_name }}" && ! -L "/usr/local/bin/{{ _bin_name }}" ]]; then
              ln -sfn {{ utility_venv_bin }}/{{ _bin_name }} /usr/local/bin/{{ _bin_name }}
              return_code=2
            fi
            exit ${return_code}
          args:
            executable: /bin/bash
          with_items: "{{ _openstack_client_list }}"
          register: _client_symlink
          changed_when: _client_symlink.rc == 2
          failed_when: _client_symlink.rc not in [0,2]
          notify: "Create openstack client bash_completion script"