# -*- coding: utf-8 -*-
import copy
import logging
import os
from ruamel.yaml import YAML
from freckles.adapters import FrecklesAdapter
from freckles.defaults import VARS_KEY
from freckles.frecklet.vars import VarsInventory
from freckles.utils.host_utils import FrecklesRunTarget
from frutils import dict_merge
log = logging.getLogger("freckles")
FRECKLES_ADAPTER_CONFIG_SCHEMA = {}
FRECKLES_ADAPTER_RUN_CONFIG_SCHEMA = {}
yaml = YAML()
[docs]class FrecklesAdapterFreckles(FrecklesAdapter):
def __init__(self, name, context):
super(FrecklesAdapterFreckles, self).__init__(
adapter_name=name,
context=context,
config_schema=FRECKLES_ADAPTER_CONFIG_SCHEMA,
run_config_schema=FRECKLES_ADAPTER_RUN_CONFIG_SCHEMA,
)
[docs] def get_resources_for_task(self, task):
pass
[docs] def get_folders_for_alias(self, alias):
return []
[docs] def get_supported_resource_types(self):
return []
[docs] def get_supported_task_types(self):
return ["frecklecutable"]
[docs] def prepare_execution_requirements(self, run_config, parent_task):
pass
def _run(
self,
tasklist,
run_vars,
run_config,
run_secrets,
run_env,
result_callback,
parent_task,
):
tl = copy.deepcopy(tasklist)
return self.run(
tasklist=tl,
run_vars=run_vars,
run_config=run_config,
run_secrets=run_secrets,
run_env=run_env,
result_callback=result_callback,
parent_task=parent_task,
)
[docs] def run(
self,
tasklist,
run_vars,
run_config,
run_secrets,
run_env,
result_callback,
parent_task,
):
run_elevated = run_config["elevated"]
result_list = []
for task_nr, task in enumerate(tasklist):
vars_dict = task[VARS_KEY]
frecklet_name = vars_dict["frecklet"]
frecklet = self.context.get_frecklet(frecklet_name=frecklet_name)
# f_type = task["type"] # always 'frecklecute' for now
elevated = vars_dict.get("elevated", None)
if elevated is None:
elevated = run_elevated
target = vars_dict.get("target", "localhost")
run_target = FrecklesRunTarget(context=self.context, target_string=target)
run_target.ssh_pass = vars_dict.get("ssh_pass", None)
run_target.become_pass = vars_dict.get("become_pass", None)
task_run_config = dict_merge(run_config, run_target.config, copy_dct=True)
fx = frecklet.create_frecklecutable(self.context)
vars = vars_dict.get(VARS_KEY, {})
run_env_task = copy.deepcopy(run_env)
env_dir = os.path.join(run_env_task["env_dir"], "task_{}".format(task_nr))
result = fx.run(
inventory=VarsInventory(vars),
run_config=task_run_config,
run_vars=run_vars,
parent_task=parent_task,
elevated=elevated,
env_dir=env_dir,
)
result_list.append(result)
return {"subtask_results": result_list}