blob: 25d50019ada27f12264e0c239ba1ff53b56d39ba [file] [log] [blame]
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
from liminal.core.util import dict_util
from liminal.core.util.dict_util import merge_dicts
__SERVICES = "services"
__TASKS = "tasks"
__BEFORE_TASKS = "before_tasks"
__AFTER_TASKS = "after_tasks"
def apply_variable_substitution(subliminal, superliminal, is_render_variables=False):
"""
if is_render_variables is True
Replace all {{variable.key}} in subliminal with variable.value variable in
subliminal.variables + superliminal.variables
else
merge subliminal.variables with superliminal.variables without replace
placeholders
"""
keyword = "variables"
merged_variables = dict_util.merge_dicts(subliminal.get(keyword, {}),
superliminal.get(keyword, {}), True)
if is_render_variables:
for k, v in merged_variables.items():
if isinstance(v, str) or (not isinstance(v, dict) and not isinstance(v, list)):
merged_variables[k] = dict_util.replace_placholders_in_string(str(v),
merged_variables)
merged_variables = dict_util.replace_placeholders(merged_variables, merged_variables)
return dict_util.replace_placeholders(subliminal, merged_variables)
else:
subliminal[keyword] = merged_variables
return subliminal
def apply_service_defaults(subliminal, superliminal):
""" Apply defaults services
:param subliminal: subliminal config
:param superliminal: superliminal config
:returns: enriched services with superliminal.service_defaults & subliminal.service_defaults
"""
keyword = "service_defaults"
superliminal_service_defaults = superliminal.get(keyword, {})
subliminal_service_defaults = subliminal.get(keyword, {})
merged_service_defaults = merge_dicts(subliminal_service_defaults,
superliminal_service_defaults,
recursive=True)
return [merge_dicts(service, merged_service_defaults, True) for service in
subliminal.get(__SERVICES, {})]
def apply_pipeline_defaults(subliminal, superliminal, pipeline):
"""Apply defaults values on given pipeline
:param subliminal: subliminal config
:param superliminal: superliminal config
:param pipeline: to apply defaults on
:returns: enriched pipeline with superliminal.pipeline_defaults & subliminal.pipeline_defaults
"""
keyword = "pipeline_defaults"
superliminal_pipe_defaults = superliminal.get(keyword, {}).copy()
subliminal_pipe_defaults = subliminal.get(keyword, {}).copy()
superliminal_before_tasks = superliminal_pipe_defaults.pop(__BEFORE_TASKS, [])
superliminal_after_tasks = superliminal_pipe_defaults.pop(__AFTER_TASKS, [])
merged_pipeline_defaults = merge_dicts(subliminal_pipe_defaults, superliminal_pipe_defaults,
True)
pipeline = merge_dicts(pipeline, merged_pipeline_defaults, True)
return apply_task_defaults(subliminal, superliminal, pipeline,
superliminal_before_tasks=superliminal_before_tasks,
superliminal_after_tasks=superliminal_after_tasks)
def apply_task_defaults(subliminal, superliminal, pipeline, superliminal_before_tasks,
superliminal_after_tasks):
"""Apply defaults task values on given pipeline
:param subliminal: subliminal config
:param superliminal: superliminal config
:param pipeline: where 'tasks' list can be found it
:param superliminal_before_tasks: superliminal before subtasks list
:param superliminal_after_tasks: superliminal after subtasks list
:returns: pipeline after enrich with superliminal.tasks and superliminal.task_defaults
and subliminal.task_defaults
"""
pipeline[__TASKS] = __apply_task_defaults(subliminal, superliminal, pipeline.get(__TASKS, []),
superliminal_before_tasks, superliminal_after_tasks)
return pipeline
def __apply_task_defaults(subliminal,
superliminal,
subliminal_tasks,
superliminal_before_tasks,
superliminal_after_tasks):
keyword = "task_defaults"
subliminal_tasks_defaults = subliminal.get(keyword, {})
superliminal_tasks_defaults = superliminal.get(keyword, {})
merged_task_defaults = merge_dicts(subliminal_tasks_defaults, superliminal_tasks_defaults,
recursive=True)
return __enrich_tasks(subliminal_tasks, superliminal_before_tasks, superliminal_after_tasks,
merged_task_defaults)
def __enrich_tasks(sub_tasks, super_before_tasks, super_after_tasks, task_defaults):
merged_tasks = super_before_tasks + sub_tasks + super_after_tasks
return [
merge_dicts(task, task_defaults.get(task.get('type', ''), {}), recursive=True)
for task in merged_tasks
]