def create_meta_descs(self, meta_base): result = [] for desc in self.create_task_descs(): meta_copy = copy.deepcopy(meta_base) meta_copy[FRECK_SUDO_KEY] = self.get_task_become() if self.get_extra_roles(): meta_copy[FRECK_META_ROLES_KEY] = self.get_extra_roles() dict_merge(meta_copy, desc) for key in self.config.keys(): if key in self.get_valid_keys(): meta_copy[FRECK_VARS_KEY][key] = self.config[key] result.append(meta_copy) return result
def create_playbook_dict(playbook_items, host_group=FRECKLES_DEFAULT_GROUP_NAME): """Assembles the dictionary to create the playbook from.""" temp_root = {} temp_root["hosts"] = host_group temp_root["gather_facts"] = True roles = [] for p in playbook_items: role_dict = copy.deepcopy(p[FRECK_META_ROLE_DICT_KEY]) id = p[FRECK_ID_KEY] role_dict[FRECK_ID_KEY] = id become = p.get(FRECK_SUDO_KEY, FRECK_DEFAULT_SUDO) role_dict[FRECK_SUDO_KEY] = become vars = p[FRECK_VARS_KEY] dict_merge(role_dict, vars) roles.append(role_dict) temp_root["roles"] = roles return temp_root
def create_run_item(self, freck_meta, develop=False): if freck_meta.get(ANSIBLE_ROLE_PROCESSED, False): return freck_meta role = self.get_role(freck_meta) item_name = self.get_item_name(freck_meta) desc = self.get_desc(freck_meta) sudo = self.get_sudo(freck_meta) additional_roles = self.get_additional_roles(freck_meta) if additional_roles: dict_merge(additional_roles, freck_meta.get(FRECK_META_ROLES_KEY, {})) else: additional_roles = freck_meta.get(FRECK_META_ROLES_KEY, {}) additional_vars = self.get_additional_vars(freck_meta) if additional_vars: dict_merge(additional_vars, freck_meta.get(FRECK_VARS_KEY, {})) else: additional_vars = freck_meta.get(FRECK_VARS_KEY, {}) unique_task_id = self.get_unique_task_id(freck_meta) if not unique_task_id: unique_task_id = freck_meta.get(UNIQUE_TASK_ID_KEY, False) freck_meta = AbstractRole.create_role_dict( role, item_name=item_name, desc=desc, sudo=sudo, additional_roles=additional_roles, additional_vars=additional_vars, unique_task_id=unique_task_id) return freck_meta
def create_role_dict(role, item_name=None, desc=None, sudo=True, additional_roles={}, additional_vars={}, unique_task_id=False): freck_meta = {} freck_meta[FRECK_META_ROLE_KEY] = role if not item_name: item_name = role freck_meta[FRECK_ITEM_NAME_KEY] = item_name if not desc: desc = "applying role" freck_meta[FRECK_DESC_KEY] = desc freck_meta[FRECK_META_ROLE_DICT_KEY] = {"role": role} freck_meta[FRECK_SUDO_KEY] = sudo if additional_roles: roles = freck_meta.get(FRECK_META_ROLES_KEY, {}) dict_merge(additional_roles, roles) freck_meta[FRECK_META_ROLES_KEY] = additional_roles if additional_vars: vars = freck_meta.get(FRECK_VARS_KEY, {}) dict_merge(additional_vars, vars) freck_meta[FRECK_VARS_KEY] = additional_vars freck_meta[FRECK_NAME_KEY] = ANSIBLE_ROLE_TYPE freck_meta[ANSIBLE_ROLE_PROCESSED] = True if unique_task_id: freck_meta[UNIQUE_TASK_ID_KEY] = unique_task_id return freck_meta
def create_run_item(self, freck_meta, develop=False): global GENERATED_ROLE_ID_COUNTER freck_name = self.get_task_name( freck_meta) or freck_meta[FRECK_NAME_KEY] freck_desc = self.get_task_desc( freck_meta) or freck_meta[FRECK_DESC_KEY] task_name = self.get_task_name(freck_meta) or freck_meta[TASK_NAME_KEY] become = self.get_task_become(freck_meta) or freck_meta[FRECK_SUDO_KEY] vars = self.get_task_vars(freck_meta) if vars: dict_merge(vars, freck_meta.get(FRECK_VARS_KEY, {})) else: vars = freck_meta.get(FRECK_VARS_KEY, {}) item_name = freck_meta.get( FRECK_DETAIL_KEY, False) or self.get_item_name( freck_meta) or freck_meta[FRECK_ITEM_NAME_KEY] or task_name template_keys = self.get_task_template_keys( freck_meta) or freck_meta.get(TASK_TEMPLATE_KEYS, False) or vars.keys() template_keys.extend(vars.keys()) final_keys = set(template_keys) task = { "name": freck_desc, "type": task_name, "task": { "vars": { "role_{0:04d}_task_{1:06d}".format( GENERATED_ROLE_ID_COUNTER, 1): list(final_keys) }, "become": become } } role_name = "{}_{}_{}".format(GENERATED_ROLE_NAME_PREFIX, task_name, GENERATED_ROLE_ID_COUNTER) add_roles = self.get_additional_roles(freck_meta) if add_roles: add_roles.update(freck_meta.get(FRECK_META_ROLES_KEY, {})) else: add_roles = freck_meta.get(FRECK_META_ROLES_KEY, {}) template_keys = sets.Set(template_keys) result = {} result[FRECK_NAME_KEY] = freck_name result[FRECK_DESC_KEY] = freck_desc result[TASK_NAME_KEY] = task_name result[FRECK_SUDO_KEY] = become result[FRECK_VARS_KEY] = vars result[TASK_TEMPLATE_KEYS] = template_keys result[FRECK_META_TASKS_KEY] = {role_name: [task]} result[FRECK_META_ROLE_DICT_KEY] = {"role": role_name} result[FRECK_META_ROLES_KEY] = add_roles result[FRECK_ITEM_NAME_KEY] = item_name GENERATED_ROLE_ID_COUNTER = GENERATED_ROLE_ID_COUNTER + 1 return result
def process_leaf(self, leaf, supported_runners=[FRECKLES_DEFAULT_RUNNER], debug=False): config = leaf[FRECK_VARS_KEY] freck_meta = leaf[FRECK_META_KEY] ignore_list = config.get(INSTALL_IGNORE_KEY, []) # check whether there are non-dotfile apps to isntall package_mgrs = Set() if config.get(USE_DOTFILES_KEY, False) and config.get( DOTFILES_KEY, False): dotfiles = parse_dotfiles_item(config[DOTFILES_KEY]) apps_dotfiles = create_dotfiles_dict(dotfiles, default_details=config) for app, details in apps_dotfiles.iteritems(): if not details.get(PKG_MGR_KEY, False): dotfiles_dir = details.get(DOTFILES_DIR_KEY, False) if dotfiles_dir: # if the folder contains a file called .nix.frkl or .no_install.frkl or .conda.frkl than that can determine the pkg mgr too, and it'd override the path pkg_mgr = get_pkg_mgr_from_marker_file(dotfiles_dir) if pkg_mgr: details[PKG_MGR_KEY] = pkg_mgr else: apps_dotfiles = {} apps_packages = create_apps_dict(config.get(PACKAGES_KEY, {}), default_details=config) priority_source = config.get(PRIORITY_SOURCE_KEY, PRIORITY_SOURCE_DEFAULT) if priority_source != PACKAGES_KEY and priority_source != DOTFILES_KEY: raise FrecklesConfigError( "priority source key needs to either be '{}' or '{}', but is: {}" .format(PACKAGES_KEY, DOTFILES_KEY, priority_source), PRIORITY_SOURCE_KEY, priority_source) apps = {} if priority_source == PACKAGES_KEY: dict_merge(apps, apps_dotfiles) dict_merge(apps, apps_packages) else: dict_merge(apps, apps_packages) dict_merge(apps, apps_dotfiles) configs = [] for app, details in apps.iteritems(): if app in ignore_list: continue meta = {} if PKG_MGR_KEY not in details.keys( ) or details[PKG_MGR_KEY] == 'default': meta[PKG_MGR_KEY] = get_default_pkg_mgr() if not meta.get(PKG_MGR_KEY, False): raise FrecklesConfigError( "Can't find default package manager for: {}".format( get_os_family())) else: meta[PKG_MGR_KEY] = details[PKG_MGR_KEY] if meta[PKG_MGR_KEY] == "no_install": continue sudo = get_pkg_mgr_sudo(meta[PKG_MGR_KEY]) meta[FRECK_SUDO_KEY] = sudo meta[FRECK_DESC_KEY] = "{} -> install".format(meta[PKG_MGR_KEY]) package_mgrs.add(meta[PKG_MGR_KEY]) pkg_mgr_obj = False for mgr in PKG_MGRS: if meta[PKG_MGR_KEY] == mgr.get_alias(): pkg_mgr_obj = mgr(app, details) if not pkg_mgr_obj: raise FrecklesConfigError( "No handler defined for package manager '{}'".format( meta[PKG_MGR_KEY]), PKG_MGR_KEY, meta[PKG_MGR_KEY]) pkg_mgr_obj.validate_config() descs = pkg_mgr_obj.create_meta_descs(meta) configs.extend(descs) pkg_mgr = meta[PKG_MGR_KEY] if config.get( ENSURE_PACKAGE_MANAGER_KEY, PKG_MGRS_COMMANDS[pkg_mgr].get(ENSURE_PACKAGE_MANAGER_KEY, False)): for pkg_mgr in package_mgrs: pkg_mgr_cls = None for mgr in PKG_MGRS: if pkg_mgr == mgr.get_alias(): pkg_mgr_cls = mgr if not pkg_mgr_cls: raise FrecklesConfigError( "No handler defined for package manager '{}'".format( pkg_mgr), PKG_MGR_KEY, pkg_mgr) if hasattr(pkg_mgr_cls, "install_pkg_mgr") and callable( getattr(pkg_mgr_cls, "install_pkg_mgr")): extra_config = pkg_mgr_cls.install_pkg_mgr() else: continue if config.get("add_path", False): extra_config.setdefault(FRECK_VARS_KEY, {})["add_path"] = True # pprint.pprint(extra_config) extra_config[FRECK_PRIORITY_KEY] = 10 # extra_config[FRECK_NEW_RUN_AFTER_THIS_KEY] = True configs.append(extra_config) if config.get(UPDATE_PACKAGE_CACHE_KEY, UPDATE_PACKAGE_CACHE_DEFAULT): for pkg_mgr in package_mgrs: if PKG_MGRS_COMMANDS.get(pkg_mgr).get("update", False): extra_config = Update.create_update_meta(pkg_mgr) extra_config[FRECK_PRIORITY_KEY] = 100 configs.append(extra_config) if config.get(UPGRADE_PACKAGES_KEY, UPGRADE_PACKAGES_DEFAULT): if PKG_MGRS_COMMANDS.get(pkg_mgr).get("upgrade", False): extra_config = Upgrade.create_upgrade_meta(pkg_mgr) extra_config[FRECK_PRIORITY_KEY] = 500 configs.append(extra_config) return (FRECKLES_ANSIBLE_RUNNER, configs)