From 372058c19f1bdd17d280da4ff3b5090551a41450 Mon Sep 17 00:00:00 2001
From: Pierre Riteau <pierre@stackhpc.com>
Date: Thu, 27 Sep 2018 12:20:31 +0100
Subject: [PATCH] Allow installing extra packages inside the kolla-ansible
 virtualenv

It may be necessary to install extra Python packages inside the
kolla-ansible virtualenv, such as when required by Ansible plugins. For
example, using the hashi_vault lookup plugin requires the hvac Python
package to be installed.

This patch adds a kolla_ansible_venv_extra_requirements list variable
which contains Python package requirements to add to the kolla-ansible
requirements file. Its default value is an empty list.

Change-Id: Ie0541dc05e2ab94af230d0113a23c544755424c7
---
 ansible/group_vars/all/kolla                  |  3 +
 .../templates/requirements.txt.j2             |  5 ++
 ansible/roles/kolla-ansible/tests/main.yml    |  1 +
 .../kolla-ansible/tests/test-requirements.yml | 59 +++++++++++++++++++
 doc/source/configuration/kolla-ansible.rst    | 16 +++++
 etc/kayobe/kolla.yml                          |  3 +
 ...v_extra_requirements-4d4f70b024207ffb.yaml |  9 +++
 7 files changed, 96 insertions(+)
 create mode 100644 ansible/roles/kolla-ansible/tests/test-requirements.yml
 create mode 100644 releasenotes/notes/add-kolla_ansible_venv_extra_requirements-4d4f70b024207ffb.yaml

diff --git a/ansible/group_vars/all/kolla b/ansible/group_vars/all/kolla
index fc297eb1..a659cf52 100644
--- a/ansible/group_vars/all/kolla
+++ b/ansible/group_vars/all/kolla
@@ -40,6 +40,9 @@ kolla_ansible_source_version: "stable/queens"
 # Path to virtualenv in which to install kolla-ansible.
 kolla_ansible_venv: "{{ lookup('env', 'KOLLA_VENV_PATH') | default(lookup('env', 'PWD') ~ '/venvs/kolla-ansible', true) }}"
 
+# Extra requirements to install inside the kolla-ansible virtualenv.
+kolla_ansible_venv_extra_requirements: []
+
 # Path to Kolla-ansible configuration directory.
 kolla_config_path: "{{ lookup('env', 'KOLLA_CONFIG_PATH') | default('/etc/kolla', true) }}"
 
diff --git a/ansible/roles/kolla-ansible/templates/requirements.txt.j2 b/ansible/roles/kolla-ansible/templates/requirements.txt.j2
index c7633730..4868711d 100644
--- a/ansible/roles/kolla-ansible/templates/requirements.txt.j2
+++ b/ansible/roles/kolla-ansible/templates/requirements.txt.j2
@@ -8,3 +8,8 @@ kolla-ansible=={{ kolla_openstack_release }}
 # Limit the version of ansible used by kolla-ansible to avoid new releases from
 # breaking tested code. Changes to this limit should be tested.
 ansible<2.6
+{% if kolla_ansible_venv_extra_requirements is defined %}
+{% for item in kolla_ansible_venv_extra_requirements %}
+{{ item }}
+{% endfor %}
+{% endif %}
diff --git a/ansible/roles/kolla-ansible/tests/main.yml b/ansible/roles/kolla-ansible/tests/main.yml
index b3fa61a6..e387e8ba 100644
--- a/ansible/roles/kolla-ansible/tests/main.yml
+++ b/ansible/roles/kolla-ansible/tests/main.yml
@@ -10,6 +10,7 @@
 
 - include: test-defaults.yml
 - include: test-extras.yml
+- include: test-requirements.yml
 
 - hosts: localhost
   connection: local
diff --git a/ansible/roles/kolla-ansible/tests/test-requirements.yml b/ansible/roles/kolla-ansible/tests/test-requirements.yml
new file mode 100644
index 00000000..a6063a07
--- /dev/null
+++ b/ansible/roles/kolla-ansible/tests/test-requirements.yml
@@ -0,0 +1,59 @@
+---
+- hosts: localhost
+  connection: local
+  tasks:
+    - name: Create a temporary directory
+      tempfile:
+        state: directory
+      register: tempfile_result
+
+    - block:
+        - name: Test the kolla-ansible role with extra Python requirements
+          include_role:
+            name: ../../kolla-ansible
+          vars:
+            kolla_ansible_source_path: "{{ temp_path }}/src"
+            kolla_ansible_ctl_install_type: "source"
+            kolla_ansible_source_url: "http://github.com/openstack/kolla-ansible"
+            kolla_ansible_source_version: "master"
+            kolla_ansible_venv: "{{ temp_path }}/venv"
+            kolla_ansible_venv_extra_requirements:
+              - "hvac"
+            kolla_config_path: "{{ temp_path }}/etc/kolla"
+            kolla_node_custom_config_path: "{{ temp_path }}/etc/kolla/config"
+            kolla_ansible_passwords_path: "{{ temp_path }}/passwords.yml"
+            # Required config.
+            kolla_base_distro: "fake-distro"
+            kolla_install_type: "fake-install-type"
+            kolla_docker_namespace: "fake-namespace"
+            kolla_openstack_release: "fake-release"
+            kolla_internal_vip_address: "10.0.0.1"
+            kolla_internal_fqdn: "fake.internal.fqdn"
+            kolla_external_vip_address: "10.0.0.2"
+            kolla_external_fqdn: "fake.external.fqdn"
+            kolla_enable_tls_external: False
+            kolla_enable_grafana: False
+            kolla_external_fqdn_cert: "fake-cert"
+            kolla_openstack_logging_debug: False
+
+        - name: List Python packages installed in virtualenv
+          command: "{{ temp_path }}/venv/bin/pip list"
+          register: kolla_ansible_venv_pip_list
+          changed_when: False
+
+        - name: Verify extra requirements are installed in virtualenv
+          assert:
+            that:
+              - "'hvac' in kolla_ansible_venv_pip_list.stdout"
+
+      always:
+        - name: Ensure the temporary directory is removed
+          file:
+            path: "{{ temp_path }}"
+            state: absent
+      rescue:
+        - name: Flag that a failure occurred
+          set_fact:
+            test_failures: "{{ test_failures | default(0) | int + 1 }}"
+      vars:
+        temp_path: "{{ tempfile_result.path }}"
diff --git a/doc/source/configuration/kolla-ansible.rst b/doc/source/configuration/kolla-ansible.rst
index 00aa627d..8106ca29 100644
--- a/doc/source/configuration/kolla-ansible.rst
+++ b/doc/source/configuration/kolla-ansible.rst
@@ -27,6 +27,22 @@ kolla-ansible is installed and executed.
                           the kolla-ansible virtualenv will be created.
    ====================== ================================================== ============================
 
+Extra Python packages can be installed inside the kolla-ansible virtualenv,
+such as when required by Ansible plugins, using the
+``kolla_ansible_venv_extra_requirements`` list variable in
+``$KAYOBE_CONFIG_PATH/kolla.yml``. For example, to use the `hashi_vault Ansible
+lookup plugin
+<https://docs.ansible.com/ansible/devel/plugins/lookup/hashi_vault.html>`_, its
+``hvac`` dependency can be installed using:
+
+.. code-block:: yaml
+   :caption: ``$KAYOBE_CONFIG_PATH/kolla.yml``
+
+   ---
+   # Extra requirements to install inside the kolla-ansible virtualenv.
+   kolla_ansible_venv_extra_requirements:
+     - "hvac"
+
 Remote Execution Environment
 ============================
 
diff --git a/etc/kayobe/kolla.yml b/etc/kayobe/kolla.yml
index f89aca1e..1a3e29e7 100644
--- a/etc/kayobe/kolla.yml
+++ b/etc/kayobe/kolla.yml
@@ -42,6 +42,9 @@
 # Path to virtualenv in which to install kolla-ansible.
 #kolla_ansible_venv:
 
+# Extra requirements to install inside the kolla-ansible virtualenv.
+#kolla_ansible_venv_extra_requirements:
+
 # Path to Kolla-ansible configuration directory.
 #kolla_config_path:
 
diff --git a/releasenotes/notes/add-kolla_ansible_venv_extra_requirements-4d4f70b024207ffb.yaml b/releasenotes/notes/add-kolla_ansible_venv_extra_requirements-4d4f70b024207ffb.yaml
new file mode 100644
index 00000000..4e4b435b
--- /dev/null
+++ b/releasenotes/notes/add-kolla_ansible_venv_extra_requirements-4d4f70b024207ffb.yaml
@@ -0,0 +1,9 @@
+---
+features:
+  - |
+    Adds support for installing extra Python packages inside the kolla-ansible
+    virtualenv, such as when required by Ansible plugins. A list of extra
+    requirements can be configured via the
+    ``kolla_ansible_venv_extra_requirements`` variable in
+    ``$KAYOBE_CONFIG_PATH/kolla.yml``. No extra packages are installed by
+    default.
-- 
GitLab