diff --git a/common/parser_config.py b/common/parser_config.py index d3ff9fdd58d5abaad4386286e75ef37172f0ac0a..5a37c52b3a1810cefa530d04fc3f72f14b79493c 100644 --- a/common/parser_config.py +++ b/common/parser_config.py @@ -69,6 +69,7 @@ class ParserConfigIni(object): self._init_obs_ignored_package() self._init_obs_include_project() self._init_kernel_branch() + self._init_release_maintenance_branch() def _init_branch_list(self): """ @@ -141,6 +142,20 @@ class ParserConfigIni(object): """ return self.obs_include_projects + def _init_release_maintenance_branch(self): + """ + init release maintenance branch list + return: None + """ + self.release_maintenance_branchs = self.config.get("release_maintenance_branch", "name").split(" ") + + def get_release_maintenance_branch(self): + """ + get release maintenance branchs + return: release maintenance branch list + """ + return self.release_maintenance_branchs + def _init_package_info_file(self): """ init package info file for store package which is not be updated diff --git a/config/config.ini b/config/config.ini index f032e06a885ef657dfb660f2dea6879328e20c53..a64f3c0523331788451dc407ff71cdb17187e902 100644 --- a/config/config.ini +++ b/config/config.ini @@ -128,3 +128,5 @@ name = kernel kata-containers runc openEuler-release openEuler-logos openEuler-i name = openEuler:Factory openEuler:Epol openEuler:Mainline bringInRely openEuler:BaseTools openEuler:C openEuler:Common_Languages_Dependent_Tools openEuler:Erlang openEuler:Golang openEuler:Java openEuler:KernelSpace openEuler:Lua openEuler:Meson openEuler:MultiLanguage openEuler:Nodejs openEuler:Ocaml openEuler:Testing:Perl openEuler:Python openEuler:Qt openEuler:Ruby [openEuler_kernel_branch] hck_branch = openEuler-22.09-HCK +[release_maintenance_branch] +name = master multi_version openEuler-20.03-LTS-SP1 openEuler-20.03-LTS-SP3 openEuler-22.03-LTS-Next openEuler-22.03-LTS openEuler-22.09 \ No newline at end of file diff --git a/core/meta_service_manager.py b/core/meta_service_manager.py new file mode 100644 index 0000000000000000000000000000000000000000..a82a2e06962502e342ae65807e17a6089526c5e0 --- /dev/null +++ b/core/meta_service_manager.py @@ -0,0 +1,223 @@ +#!/bin/env python3 +# -*- encoding=utf8 -*- +#****************************************************************************** +# Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. +# licensed under the Mulan PSL v2. +# You can use this software according to the terms and conditions of the Mulan PSL v2. +# You may obtain a copy of Mulan PSL v2 at: +# http://license.coscl.org.cn/MulanPSL2 +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR +# PURPOSE. +# See the Mulan PSL v2 for more details. +# Author: dongjie +# Create: 2022-09-04 +# ****************************************************************************** + +""" +align obs_meta pkg service and release_management yaml pkg +""" +import os +import re +import sys +import yaml +import shutil +import datetime +now_path = os.path.join(os.path.split(os.path.realpath(__file__))[0]) +sys.path.append(os.path.join(now_path, "..")) +from common.log_obs import log +from common.parser_config import ParserConfigIni + + + +class MetaServiceManager(object): + def __init__(self, **kwargs): + """ + giteeuser: gitee user name + giteeuserpwd: gitee password + branch: need check branchs + obs_meta_path: repo obs_meta path + release_management_path: repo release_management path + """ + self.kwargs = kwargs + self.giteeuser = self.kwargs['gitee_user'] + self.giteeuserpwd = self.kwargs['gitee_pwd'] + self.branch = self.kwargs['align_meta_service_branch'] + self.obs_meta_path = self.kwargs['obs_meta_path'] + self.release_management_path = self.kwargs['release_management_path'] + par = ParserConfigIni() + self.release_maintenance_branchs = par.get_release_maintenance_branch() + + def get_pkgs_from_yaml(self, branch): + """ + branch: branch name + return: branch pkgs dict + """ + all_branch_pkgs = [] + project_pkgs = {} + if os.path.exists(os.path.join(self.release_management_path, branch)): + standard_dirs = os.listdir(os.path.join(self.release_management_path, branch)) + for standard_dir in standard_dirs: + file_path = os.path.join(self.release_management_path, branch, standard_dir) + if not os.path.isdir(file_path) or standard_dir == 'delete': + standard_dirs.remove(standard_dir) + for c_dir in standard_dirs: + release_path = os.path.join(self.release_management_path, branch, c_dir, 'pckg-mgmt.yaml') + if os.path.exists(release_path): + with open(release_path, 'r', encoding='utf-8') as f: + result = yaml.load(f, Loader=yaml.FullLoader) + all_branch_pkgs.extend(result['packages']) + if branch == 'multi_version': + for pkg in all_branch_pkgs: + temp_key = '{}/{}'.format(pkg['destination_dir'], pkg['obs_to']) + project_pkgs.setdefault(temp_key, []).append(pkg['name']) + else: + for pkg in all_branch_pkgs: + project_pkgs.setdefault(pkg['obs_to'], []).append(pkg['name']) + else: + log.error("this branch {} not exist in repo release_management".format(branch)) + return project_pkgs + + def get_pkgs_from_meta(self, branch, project): + """ + branch: branch name + project: project name + return: none + """ + meta_pkglist = os.listdir(os.path.join(self.obs_meta_path, branch, project)) + if 'README.md' in meta_pkglist: + meta_pkglist.remove('README.md') + return meta_pkglist + + def compare_with_meta_yaml(self, branch, yaml_pkgs): + """ + branch: branch name + yaml_pkgs: branch pkgs info + return: none + """ + for project, yamlpkgs in yaml_pkgs.items(): + meta_pkglist = self.get_pkgs_from_meta(branch, project) + need_del_pkg = set(meta_pkglist) - set(yamlpkgs) + need_add_pkg = set(yamlpkgs) - set(meta_pkglist) + log.info("obs_meta {} {} redundant pkg:{}".format(branch, project, list(need_del_pkg))) + log.info("obs_meta {} {} lack pkg:{}".format(branch, project, list(need_add_pkg))) + self.add_pkg_to_meta(branch, project, need_add_pkg) + self.del_pkg_from_meta(branch, project, need_del_pkg) + + def add_pkg_to_meta(self, branch, project, add_pkgs): + """ + branch: branch name + project: project name + add_pkgs: need add pkgs list + return: none + """ + if add_pkgs: + if branch == 'multi_version': + branch = project.split('/')[0] + project_path = os.path.join(self.obs_meta_path, 'multi_version', project) + else: + project_path = os.path.join(self.obs_meta_path, branch, project) + for add_pkg in add_pkgs: + pkg_path = os.path.join(project_path, add_pkg) + pkg_service_path = os.path.join(pkg_path, "_service") + if not os.path.exists(pkg_path): + os.makedirs(pkg_path) + self._write_service_file(pkg_path, add_pkg, branch) + if os.path.exists(pkg_service_path): + log.info("add {} {} {} _service succeed!".format(branch, project, add_pkg)) + else: + log.error("add {} {} {} _service failed!".format(branch, project, add_pkg)) + + + + def del_pkg_from_meta(self, branch, project, del_pkgs): + """ + branch: branch name + project: project name + del_pkgs: need delete pkgs list + return: none + """ + if del_pkgs: + for del_pkg in del_pkgs: + if 'Multi-Version' in branch: + dir_name = '{}/{}'.format(branch, project) + pkg_path = os.path.join(self.obs_meta_path, 'multi_version', dir_name, del_pkg) + else: + pkg_path = os.path.join(self.obs_meta_path, branch, project, del_pkg) + if os.path.exists(pkg_path): + shutil.rmtree(pkg_path) + log.info("delete {} {} {} succeed!".format(branch, project, del_pkg)) + + def _write_service_file(self, filepath, package, pkg_branch): + ''' + write service file + ''' + if pkg_branch == 'master': + file_msg = """ + + git + git@gitee.com:src-openeuler/{}.git + * + * + master + +""".format(package) + else: + file_msg = """ + + repo + next/{}/{} + + """.format(pkg_branch, package) + try: + with open(os.path.join(filepath, '_service'), 'w') as f: + f.write(file_msg) + except Exception as e: + log.info(e) + + def align_meta_yaml(self, branch): + """ + branch: branch name + return: code of status + """ + project_pkgs = self.get_pkgs_from_yaml(branch) + self.compare_with_meta_yaml(branch, project_pkgs) + + def run(self): + """ + Function entry + """ + if self.branch == 'all': + need_align_branchs = self.release_maintenance_branchs + else: + need_align_branchs = self.branch.split(' ') + log.info("align meta service by release_management pckg-mgmt.yaml {}".format(need_align_branchs)) + for branch in need_align_branchs: + self.align_meta_yaml(branch) + ret = self._push_code(self.obs_meta_path) + return ret + + def _push_code(self, repo): + """ + push code to gitee repo + """ + if os.path.exists(repo): + os.chdir(repo) + cmd = "git status -s" + if os.popen(cmd).read(): + cmd = "git pull && git add -A && git commit -m \"synchronize with pckg-mgmt.yaml file contents\"" + if os.system(cmd) == 0: + cmd = "git push -f" + for i in range(5): + if os.system(cmd) == 0: + log.info("push code to gitee repo succeed!") + return 0 + else: + log.error("push code failed, try again...") + raise SystemExit("push code to gitee repo Failed!") + else: + log.info("No change, nothing to commit!") + return "nothing to push" + else: + log.error("%s not exist!" % repo) + return -1 \ No newline at end of file diff --git a/core/runner.py b/core/runner.py index 7a853484f8286aa8d0a2a2ab5a7ae4f95e2384e1..ab9bb0286032ed23168db680be23f20ea5edf2c1 100644 --- a/core/runner.py +++ b/core/runner.py @@ -30,6 +30,7 @@ from core.update_obs_repos import RPMManager from core.obs_mail_notice import ObsMailNotice from core.sync_pckg_mgmt import SyncPckgMgmt from core.check_release_management import CheckReleaseManagement +from core.meta_service_manager import MetaServiceManager import os class Runner(object): @@ -136,6 +137,15 @@ class Runner(object): check_mgmt = CheckReleaseManagement(**self.kwargs) check_mgmt.check_pckg_yaml() + def _align_meta_service(self): + """ + align meta pkg service + return: + """ + log.debug("align meta pkg service") + msm = MetaServiceManager(**self.kwargs) + msm.run() + def run(self): """ run main @@ -169,3 +179,5 @@ class Runner(object): self._pckg_mgmt() elif self.kwargs["check_pckg_mgmt"] == "true": self._check_release_mgmt() + elif self.kwargs["align_meta_service"] == "true": + self._align_meta_service() diff --git a/openeuler_obs.py b/openeuler_obs.py index 30328c086517064906edea932ba697f60dd90700..073e256dff466a7501ab27cb09cb38ef0d6601ac 100644 --- a/openeuler_obs.py +++ b/openeuler_obs.py @@ -113,6 +113,10 @@ par.add_argument("-a", "--ALL_", default=False, help="update all obs repo rpms", par.add_argument("-cmp", "--compare", default=False, help="compare rpm", required=False) par.add_argument("-cpm", "--check_pckg_mgmt", default=False, help="check if there are any problems with the commi for release-management", required=False) +par.add_argument("-ams", "--align_meta_service", default=False, + help="compare with repo obs_meta and release-management add or delete pkg", required=False) +par.add_argument("-amsb", "--align_meta_service_branch", default=None, + help="need compare with repo obs_meta and release-management pkgs branchs", required=False) args = par.parse_args() #apply @@ -158,7 +162,9 @@ kw = { "pckg_mgmt": args.pckg_mgmt, "release_management_path": args.remt, "check_pckg_mgmt": args.check_pckg_mgmt, - "compare": args.compare + "compare": args.compare, + "align_meta_service": args.align_meta_service, + "align_meta_service_branch": args.align_meta_service_branch } run = Runner(**kw)