From 22a6765f5e0ddae1527faaaeeff0260f5996a9e7 Mon Sep 17 00:00:00 2001
From: Michal Arbet <michal.arbet@ultimum.io>
Date: Thu, 8 Apr 2021 00:36:14 +0200
Subject: [PATCH] Support editable installation in all cases

An editable installation allows changes to be made to the source code
directly, and have those changes applied immediately without having to
reinstall.

    pip install -e /path/to/kolla-ansible

Above is currently working only in virtualenv, but there is no reason to
not allow in all cases. This is usefull for example when user is
building his own docker container with editable kolla-ansible installed
from git without virtualenv.

Change-Id: I185f7c09c3f026fd6926a26001393f066ff1860d
---
 tools/kolla-ansible | 34 ++++++++++++++++++++++++++--------
 1 file changed, 26 insertions(+), 8 deletions(-)

diff --git a/tools/kolla-ansible b/tools/kolla-ansible
index 215bcf0ee4..014e190037 100755
--- a/tools/kolla-ansible
+++ b/tools/kolla-ansible
@@ -22,6 +22,7 @@ function check_environment_coherence {
     local ansible_python_cmdline
     # NOTE(yoctozepto): may have multiple parts
     ansible_python_cmdline=${ansible_shebang_line#\#\!}
+    ansible_python_version=$($ansible_python_cmdline -c 'import sys; print(str(sys.version_info[0])+"."+str(sys.version_info[1]))')
 
     if ! $ansible_python_cmdline --version &>/dev/null; then
         echo "ERROR: Ansible Python is not functional." >&2
@@ -66,21 +67,38 @@ function check_environment_coherence {
 
 function find_base_dir {
     local dir_name
+    local python_dir
     dir_name=$(dirname "$0")
     # NOTE(yoctozepto): Fix the case where dir_name is a symlink and VIRTUAL_ENV might not be. This
     # happens with pyenv-virtualenv, see https://bugs.launchpad.net/kolla-ansible/+bug/1903887
     dir_name=$(readlink -e "$dir_name")
+    python_dir="python${ansible_python_version}"
     if [ -z "$SNAP" ]; then
         if [[ ${dir_name} == "/usr/bin" ]]; then
-            BASEDIR=/usr/share/kolla-ansible
-        elif [[ ${dir_name} == "/usr/local/bin" ]]; then
-            BASEDIR=/usr/local/share/kolla-ansible
-        elif [[ ${dir_name} == ~/.local/bin ]]; then
-            BASEDIR=~/.local/share/kolla-ansible
-        elif [[ -n ${VIRTUAL_ENV} ]] && [[ ${dir_name} == "$(readlink -e "${VIRTUAL_ENV}/bin")" ]]; then
-            if test -f ${VIRTUAL_ENV}/lib/python*/site-packages/kolla-ansible.egg-link; then
+            if test -f /usr/lib/${python_dir}/*-packages/kolla-ansible.egg-link; then
                 # Editable install.
-                BASEDIR="$(head -n1 ${VIRTUAL_ENV}/lib/python*/site-packages/kolla-ansible.egg-link)"
+                BASEDIR="$(head -n1 /usr/lib/${python_dir}/*-packages/kolla-ansible.egg-link)"
+            else
+                BASEDIR=/usr/share/kolla-ansible
+            fi
+        elif [[ ${dir_name} == "/usr/local/bin" ]]; then
+            if test -f /usr/local/lib/${python_dir}/*-packages/kolla-ansible.egg-link; then
+                # Editable install.
+                BASEDIR="$(head -n1 /usr/local/lib/${python_dir}/*-packages/kolla-ansible.egg-link)"
+            else
+                BASEDIR=/usr/local/share/kolla-ansible
+            fi
+        elif [[ ${dir_name} == ~/.local/bin ]]; then
+            if test -f ~/.local/lib/${python_dir}/*-packages/kolla-ansible.egg-link; then
+                # Editable install.
+                BASEDIR="$(head -n1 ~/.local/lib/${python_dir}/*-packages/kolla-ansible.egg-link)"
+            else
+                BASEDIR=~/.local/share/kolla-ansible
+            fi
+        elif [[ -n ${VIRTUAL_ENV} ]] && [[ ${dir_name} == "$(readlink -e "${VIRTUAL_ENV}/bin")" ]]; then
+            if test -f ${VIRTUAL_ENV}/lib/${python_dir}/site-packages/kolla-ansible.egg-link; then
+                # Editable install.
+                BASEDIR="$(head -n1 ${VIRTUAL_ENV}/lib/${python_dir}/*-packages/kolla-ansible.egg-link)"
             else
                 BASEDIR="${VIRTUAL_ENV}/share/kolla-ansible"
             fi