Example #1
0
    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
Example #2
0
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
Example #3
0
    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
Example #4
0
    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
Example #5
0
    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
Example #6
0
    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)