kolla-kubernetes/kolla_kubernetes/pathfinder.py

134 lines
4.6 KiB
Python

# 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.
import logging
import os
import sys
from kolla_kubernetes import exception
from oslo_config import cfg
CONF = cfg.CONF
LOG = logging.getLogger(__name__)
class PathFinder(object):
_find_cache = {}
@staticmethod
def find_installed_root():
# Full installs use this root path to locate ./share/kolla
# For system, resolves to /usr/local
# For virtualenv, resolves to /path/to/venv
return os.path.abspath(os.path.join(os.path.dirname(
os.path.realpath(sys.argv[0])), '../'))
@staticmethod
def find_development_root():
# Editable installs (aka. Development: pip install --editable .)
# use this root path to locate ../kolla
# For editable, resolves to /path/to/git/repo/kolla-kubernetes
return os.path.dirname(
os.path.dirname(os.path.abspath(__file__)))
@staticmethod
def find_kolla_dir():
return PathFinder._find(KOLLA_SEARCH_PATHS, None)
@staticmethod
def find_kolla_kubernetes_dir():
return PathFinder._find(KOLLA_KUBERNETES_SEARCH_PATHS, None)
@staticmethod
def find_config_file(filename):
search_paths = CONFIG_SEARCH_PATHS
for d in search_paths:
f = os.path.join(d, filename)
if os.path.isfile(f):
return f
raise exception.KollaFileNotFoundException(
"Unable to locate file=[{}] in search_paths=[{}]".format(
filename, ", ".join(search_paths))
)
@staticmethod
def find_config_files(service_name):
path = PathFinder.find_config_dir(service_name)
return PathFinder._list_dir_files(path)
@staticmethod
def find_config_dir(service_name):
return PathFinder._find(CONFIG_SEARCH_PATHS, service_name)
@staticmethod
def _find(search_paths, dir_or_file):
# check the cache first
cache_key = ("-".join(search_paths) + ":" +
(dir_or_file if dir_or_file is not None else ""))
if cache_key in PathFinder._find_cache:
return PathFinder._find_cache[cache_key]
# returns the first directory that exists
for path in search_paths:
p = path
if dir_or_file is not None:
p = os.path.join(path, dir_or_file)
if os.path.exists(p):
PathFinder._find_cache[cache_key] = p
return p
raise exception.KollaDirNotFoundException(
"Unable to locate {} directory in search_paths=[{}]".format(
dir_or_file, ", ".join(search_paths))
)
@staticmethod
def _list_dir_files(path):
paths = [os.path.join(path, fn) for fn in next(os.walk(path))[2]]
return paths
# prioritize directories to search for /etc files
CONFIG_SEARCH_PATHS = [
# Search installation paths first
'/etc/kolla',
'/etc/kolla-kubernetes',
# Then development paths
os.path.abspath(os.path.join(PathFinder.find_development_root(),
'../kolla/etc/kolla')),
os.path.abspath(os.path.join(PathFinder.find_development_root(),
'./etc/kolla-kubernetes')),
]
# prioritize directories to search for kolla sources
KOLLA_SEARCH_PATHS = [
# Search installation paths first
os.path.abspath(os.path.join(PathFinder.find_installed_root(),
'./share/kolla')),
'/usr/share/kolla',
# Then search development paths
os.path.abspath(os.path.join(PathFinder.find_development_root(),
'../kolla')),
os.path.abspath(os.path.join(PathFinder.find_development_root(),
'kolla')),
]
# prioritize directories to search for kolla-kubernetes sources
KOLLA_KUBERNETES_SEARCH_PATHS = [
# Search installation paths first
os.path.abspath(os.path.join(PathFinder.find_installed_root(),
'./share/kolla-kubernetes')),
'/usr/share/kolla-kubernetes',
# Then search development paths
os.path.abspath(os.path.join(PathFinder.find_development_root())),
]