fuel-ccp/fuel_ccp/common/utils.py

112 lines
3.7 KiB
Python

import logging
import os
import pkg_resources
import yaml
import fuel_ccp
from fuel_ccp.common import jinja_utils
from fuel_ccp import config
from fuel_ccp import kubernetes
CONF = config.CONF
LOG = logging.getLogger(__name__)
def get_ingress_host(ingress_name):
return '.'.join((
ingress_name, CONF.kubernetes.namespace, CONF.configs.ingress.domain))
def get_ingress_domains(components=None):
components_map = get_deploy_components_info()
components = components or components_map.keys()
domains = []
for component in components:
service = components_map[component]["service_content"]["service"]
for port in service.get("ports", []):
if port.get("ingress"):
domains.append(get_ingress_host(port.get("ingress")))
return domains
def get_resource_path(path):
return pkg_resources.resource_filename(fuel_ccp.version_info.package, path)
def get_config_paths():
components = [d['name'] for d in CONF.repositories.repos]
paths = []
# Order does matter. At first we add global defaults.
for conf_path in ("resources/defaults.yaml", "resources/globals.yaml"):
paths.append(get_resource_path(conf_path))
# After we add component defaults.
for component in components:
paths.append(os.path.join(CONF.repositories.path, component,
"service/files/defaults.yaml"))
return paths
def address(service, port=None, external=False):
addr = None
if external:
if not port:
raise RuntimeError('Port config is required for external address')
if CONF.configs.ingress.enabled and port.get('ingress'):
addr = get_ingress_host(port['ingress'])
elif port.get('node'):
addr = '%s:%s' % (CONF.configs.k8s_external_ip, port['node'])
if addr is None:
addr = '%s.%s' % (service, CONF.kubernetes.namespace)
if port:
addr = '%s:%s' % (addr, port['cont'])
return addr
def get_deploy_components_info(rendering_context=None):
if rendering_context is None:
rendering_context = CONF.configs._dict
components_map = {}
for component_ref in CONF.repositories.repos:
component_name = component_ref['name']
service_dir = os.path.join(CONF.repositories.path,
component_name,
'service')
if not os.path.isdir(service_dir):
continue
REPO_NAME_PREFIX = "fuel-ccp-"
if component_name.startswith(REPO_NAME_PREFIX):
component_name = component_name[len(REPO_NAME_PREFIX):]
for service_file in os.listdir(service_dir):
if service_file.endswith('.yaml'):
LOG.debug("Rendering service definition: %s", service_file)
content = jinja_utils.jinja_render(
os.path.join(service_dir, service_file), rendering_context,
functions=[address]
)
LOG.debug("Parse service definition: %s", service_file)
service_definition = yaml.load(content)
service_name = service_definition['service']['name']
components_map[service_name] = {
'component_name': component_name,
'service_dir': service_dir,
'service_content': service_definition
}
return components_map
def get_deployed_components():
"""Returns set of deployed components."""
deployed_deployments = kubernetes.list_cluster_deployments()
deployed_components = set(
kubernetes.get_object_names(deployed_deployments)
)
return deployed_components