repo_buddy.py 4.0 KB
Newer Older
T
initail  
tracedeng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
# -*- coding: utf-8 -*-
import logging.config
import logging
import os
import argparse

import yaml


class RepoBuddy(object):
    def __init__(self, ignored_repos_path, community_path, *repos):
        """
        :param ignored_repos_path: 忽略的repo配置文件
        :param repos: 用户输入的仓库
        """
        self._input_repos = repos
        self._repo_buddy = {}   # 保存结果
        self._ignored_repos = self._load_ignore_repo(ignored_repos_path)
        logger.debug("ignored repos: {}".format(self._ignored_repos))
        self._community_repos = self._load_community_repo(community_path)    # 社区repos
        logger.debug("community repos: {}".format(self._community_repos))

    @staticmethod
    def _load_ignore_repo(conf_file):
        """
        加载不用触发门禁的任务
        :param conf_file:
        :return:
        """
        try:
            with open(conf_file, "r") as f:
                handler = yaml.safe_load(f)
                return handler.get("ignore", [])
        except IOError as e:
            logger.warning("{} not exist".format(conf_file))
            return []

    @staticmethod
    def _load_community_repo(community_path):
        """
        加载不用触发门禁的任务
        :param community_path:
        :return:
        """
        try:
            conf_file = os.path.join(community_path, "repository/src-openeuler.yaml")
            with open(conf_file, "r") as f:
                handler = yaml.safe_load(f)
                repos = {item["name"]: item["type"] for item in handler["repositories"]}
                logger.info("repos from community: {}".format(len(repos)))
                return repos
        except IOError as e:
            logger.warning("{} not exist".format(conf_file))
            return []

    def _is_valid_repo(self, repo):
        """
        仓库是否需要创建门禁
        :param repo:
        :return:
        """
        if repo in self._community_repos and repo not in self._ignored_repos:
            return True

        return False

    def buddy(self, strategy):
        """
        计算仓库关联的package及buddy
        :param strategy: 策略对象
        :return:
        """
        repos = self._community_repos if "all" in self._input_repos else self._input_repos
        valid_repos = [repo for repo in repos if self._is_valid_repo(repo)]

        if valid_repos:
            strategy.algorithm(*valid_repos)

            self._repo_buddy = {repo: {"repo": repo, "packages": strategy.get_packages_of_repo(repo),
                                   "buddy": strategy.get_buddy_of_repo(repo)} for repo in strategy}

    def save(self, output):
        """
        保存结果
        :param output:
        :return:
        """
        with open(output, "w") as f:
            yaml.safe_dump(self._repo_buddy, f)


if "__main__" == __name__:
    args = argparse.ArgumentParser()
    args.add_argument("-j", type=str, dest="jobs", help="jobs name, split by dot")
    args.add_argument("-o", type=str, dest="mapping_file", help="output file to save buddy info")
    args.add_argument("-m", type=str, dest="obs_meta_path", help="obs meta path")
    args.add_argument("-c", type=str, dest="community_path", help="community repo path")
    args = args.parse_args()

    not os.path.exists("log") and os.mkdir("log")
    logger_conf_path = os.path.realpath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../conf/logger.conf"))
    logging.config.fileConfig(logger_conf_path)
    logger = logging.getLogger("jobs")

    # import after log initial
    from src.proxy.requests_proxy import do_requests
    from src.proxy.gitee_proxy import GiteeProxy
    from src.jobs.obs_meta_strategy import ObsMetaStrategy

    ignore_repo_path = os.path.realpath(os.path.join(os.path.realpath(__file__), "../../conf/ignore_repo.yaml"))
    input_repos = [repo.strip() for repo in args.jobs.split(",")]

    buddy = RepoBuddy(ignore_repo_path, args.community_path, *input_repos)
    buddy.buddy(ObsMetaStrategy(args.obs_meta_path))
    buddy.save(args.mapping_file)