Merge "Improve detection of base path"
This commit is contained in:
commit
01f04e500d
@ -118,3 +118,25 @@ configuration files may be encrypted. Since encryption can make working with
|
|||||||
Kayobe difficult, it is recommended to follow `best practice
|
Kayobe difficult, it is recommended to follow `best practice
|
||||||
<http://docs.ansible.com/ansible/playbooks_best_practices.html#best-practices-for-variables-and-vaults>`_,
|
<http://docs.ansible.com/ansible/playbooks_best_practices.html#best-practices-for-variables-and-vaults>`_,
|
||||||
adding a layer of indirection and using encryption only where necessary.
|
adding a layer of indirection and using encryption only where necessary.
|
||||||
|
|
||||||
|
Location of data files
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
Kayobe needs to know where to find any files not contained within its python package;
|
||||||
|
this includes its Ansible playbooks and any other files it needs for runtime operation.
|
||||||
|
These files are known collectively as 'data files'.
|
||||||
|
|
||||||
|
Kayobe will attempt to detect the location of its data files automatically. However, if
|
||||||
|
you have installed kayobe to a non-standard location this auto-detection may fail.
|
||||||
|
It is possible to manually override the path using the environment variable:
|
||||||
|
``KAYOBE_DATA_FILES_PATH``. This should be set to a path with the following structure::
|
||||||
|
|
||||||
|
requirements.yml
|
||||||
|
ansible/
|
||||||
|
roles/
|
||||||
|
...
|
||||||
|
...
|
||||||
|
|
||||||
|
Where ``ansible`` is the ``ansible`` directory from the source checkout and ``...``
|
||||||
|
is an elided representation of any files and subdirectories contained within
|
||||||
|
that directory.
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
@ -132,3 +133,9 @@ key2: value2
|
|||||||
value = "string to escape"
|
value = "string to escape"
|
||||||
expected = "{{'c3RyaW5nIHRvIGVzY2FwZQ==' | b64decode }}"
|
expected = "{{'c3RyaW5nIHRvIGVzY2FwZQ==' | b64decode }}"
|
||||||
self.assertEqual(expected, utils.escape_jinja(value))
|
self.assertEqual(expected, utils.escape_jinja(value))
|
||||||
|
|
||||||
|
def test_detect_install_prefix(self):
|
||||||
|
path = "/tmp/test/local/lib/python2.7/dist-packages"
|
||||||
|
expected = os.path.normpath("/tmp/test/local/")
|
||||||
|
result = utils._detect_install_prefix(path)
|
||||||
|
self.assertEqual(expected, os.path.normpath(result))
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
import base64
|
import base64
|
||||||
import glob
|
import glob
|
||||||
|
import itertools
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import six
|
import six
|
||||||
@ -25,13 +26,33 @@ import yaml
|
|||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
_BASE_PATH = os.path.join(sys.prefix, "share", "kayobe")
|
|
||||||
|
|
||||||
|
|
||||||
def get_data_files_path(*relative_path):
|
def get_data_files_path(*relative_path):
|
||||||
"""Given a relative path to a data file, return the absolute path"""
|
"""Given a relative path to a data file, return the absolute path"""
|
||||||
# Detect editable pip install / python setup.py develop and use a path
|
# Detect editable pip install / python setup.py develop and use a path
|
||||||
# relative to the source directory
|
# relative to the source directory
|
||||||
|
return os.path.join(_get_base_path(), *relative_path)
|
||||||
|
|
||||||
|
|
||||||
|
def _detect_install_prefix(path):
|
||||||
|
script_path = os.path.realpath(path)
|
||||||
|
script_path = os.path.normpath(script_path)
|
||||||
|
components = script_path.split(os.sep)
|
||||||
|
# use heuristic: anything before 'lib' in path is the prefix
|
||||||
|
if 'lib' not in components:
|
||||||
|
return None
|
||||||
|
prefix = itertools.takewhile(
|
||||||
|
lambda x: x != "lib",
|
||||||
|
components
|
||||||
|
)
|
||||||
|
prefix_path = os.sep.join(prefix)
|
||||||
|
return prefix_path
|
||||||
|
|
||||||
|
|
||||||
|
def _get_base_path():
|
||||||
|
override = os.environ.get("KAYOBE_DATA_FILES_PATH")
|
||||||
|
if override:
|
||||||
|
return os.path.join(override)
|
||||||
egg_glob = os.path.join(
|
egg_glob = os.path.join(
|
||||||
sys.prefix, 'lib*', 'python*', '*-packages', 'kayobe.egg-link'
|
sys.prefix, 'lib*', 'python*', '*-packages', 'kayobe.egg-link'
|
||||||
)
|
)
|
||||||
@ -39,8 +60,14 @@ def get_data_files_path(*relative_path):
|
|||||||
if egg_link:
|
if egg_link:
|
||||||
with open(egg_link[0], "r") as f:
|
with open(egg_link[0], "r") as f:
|
||||||
realpath = f.readline().strip()
|
realpath = f.readline().strip()
|
||||||
return os.path.join(realpath, *relative_path)
|
return os.path.join(realpath)
|
||||||
return os.path.join(_BASE_PATH, *relative_path)
|
|
||||||
|
prefix = _detect_install_prefix(__file__)
|
||||||
|
if prefix:
|
||||||
|
return os.path.join(prefix, "share", "kayobe")
|
||||||
|
|
||||||
|
# Assume uninstalled
|
||||||
|
return os.path.join(os.path.realpath(__file__), "..")
|
||||||
|
|
||||||
|
|
||||||
def yum_install(packages):
|
def yum_install(packages):
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
fixes:
|
||||||
|
- |
|
||||||
|
Fixes the detection of kayobe's data files on Ubuntu when not installing into a
|
||||||
|
virtualenv, see `Story 2005510 <https://storyboard.openstack.org/#!/story/2005510>`_
|
||||||
|
for details.
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Added the ``KAYOBE_DATA_FILES_PATH`` environment variable to override the
|
||||||
|
auto-detection of the data files path. See the `documentation <https://docs.openstack.org/kayobe/latest/configuration/kayobe.html#location-of-data-files>`_ for more details.
|
Loading…
x
Reference in New Issue
Block a user