diff options
author | stanley31 <stanley.huang@canonical.com> | 2020-09-08 14:26:26 +0800 |
---|---|---|
committer | stanley31 <stanley.huang@canonical.com> | 2020-09-08 14:26:26 +0800 |
commit | 32af95c807c0b0e6e8a9c2a98863d3967ce22aed (patch) | |
tree | a221b6392e2fb0328d61071803f17ec8ffe54827 | |
parent | beef0c9d8ecb3be587ed1e146776604524e8006b (diff) |
Add new test cases to verify project/series meta
- Add two new test cases to verify project/series meta - Change the comparison rule to equal for manifest and OEM archive - Extend the script to get project/series meta - Fixed scripts bugs.
-rwxr-xr-x | bin/check-oem-package-source.py | 166 | ||||
-rw-r--r-- | jobs/misc/misc-generic.txt | 22 | ||||
-rw-r--r-- | jobs/somerville/somerville-oem-meta.pxu | 3 | ||||
-rw-r--r-- | jobs/stella/stella-oem-meta.pxu | 6 | ||||
-rw-r--r-- | jobs/sutton/sutton-oem-meta.pxu | 3 |
5 files changed, 132 insertions, 68 deletions
diff --git a/bin/check-oem-package-source.py b/bin/check-oem-package-source.py index 94e7f31..e2cabe9 100755 --- a/bin/check-oem-package-source.py +++ b/bin/check-oem-package-source.py @@ -4,10 +4,19 @@ import subprocess, re, json, copy DEFAULT_OEM_URL = r"http://\w*\.archive.canonical.com" DEFAULT_UBUNTU_URL = r"http://[\w.-]+/ubuntu" +OEM_URL_PATTERN = { + "oem-somerville": "http://dell.archive.canonical.com", + "oem-sutton": "http://lenovo.archive.canonical.com", + "oem-stella": "http://hp.archive.canonical.com", + "default": r"http://\w*\.archive.canonical.com" +} +OEM_DELL_URL = "http://dell.archive.canonical.com" +OEM_LENOVO_URL = "http://lenovo.archive.canonical.com" +OEM_HP_URL = "http://hp.archive.canonical.com" DEFAULT_SOURCE_DIR = "/etc/apt/sources.list.d/" UNSUPPORTED_CODENAME = ["bionic", "xenial", "trusty"] -OEM_KEY = "OEM_Version" -UBUNTU_KEY = "Ubuntu_Version" +OEM_KEY = "OEM_VersionInfo" +UBUNTU_KEY = "Ubuntu_VersionInfo" SHELL_ENV = os.environ SHELL_ENV.update({"LANG": "en_us.utf-8"}) @@ -61,8 +70,9 @@ def _get_code_name(): return codename -def gen_oem_meta_name(project, platform, factory): - oem_metaname = None +def gen_oem_meta_name(project, platform, factory, meta_type): + #oem_metaname = None + project_code = platform_code = None if project in ["oem-sutton", "oem-stella"]: # laptop platform format: sutton-newell-ace @@ -73,28 +83,39 @@ def gen_oem_meta_name(project, platform, factory): print("Unexpected platform format: ", platform, file=sys.stderr) sys.exit(1) # Look into /etc/apt/sources.list.d/ - pattern = r"^(oem-{}-\S*)-meta)\.list$".format(platform[0].replace("-", ".", 1)) + pattern = r"^(oem-{})-(\S*)-meta\.list$".format(platform[0].replace("-", ".", 1)) files = os.listdir(DEFAULT_SOURCE_DIR) for filename in files: + if filename.find("factory") != -1: + continue result = re.search(pattern, filename) if result: - oem_metaname = result.groups()[0] + project_code = result.groups()[0] + platform_code = result.groups()[1] break elif project in ["oem-somerville"]: # Replace "fossa-" for somerville - platform = platform.replace("fossa-", "") - oem_metaname = "{}-{}".format(project, platform) + platform_code = platform.replace("fossa-", "") + project_code = project else: print("Unknown project name: ", project, file=sys.stderr) sys.exit(1) + if platform_code: + if meta_type == "platform": + oem_metaname = "{}{}-{}-meta".format( + project_code, "-factory" if factory else "", platform_code) + elif meta_type == "project": + oem_metaname = "{}{}-meta".format( + project_code, "-factory" if factory else "") + else: + oem_metaname = None + else: + oem_metaname = None + if not oem_metaname: print("Failed to generate oem-meta name", file=sys.stderr) sys.exit(1) - else: - if factory: - oem_metaname = oem_metaname.replace(project, project + "-factory") - oem_metaname += "-meta" return oem_metaname @@ -166,7 +187,7 @@ def get_package_info(package_name, oem_url=None, ubuntu_url=None): command = "apt-cache policy {}".format(package_name) ret_code, output = issue_cmd(command) - if ret_code == 0: + if ret_code == 0 and output: # To collect package name result = re.search(main_pkg_name_filter, output) pkg_name = result.groups()[0] if result else None @@ -193,32 +214,6 @@ def get_package_info(package_name, oem_url=None, ubuntu_url=None): return package_info -def check_version_rule(_current_ver, _oem_ver, _ubuntu_ver): - - def _compare_version(ver_a, ver_b, operator): - command = "dpkg --compare-versions {ver1} {op} {ver2}".format( - ver1=ver_a, ver2=ver_b, op=operator) - ret_code, output = issue_cmd(command) - return True if ret_code == 0 else False - - if not _current_ver or re.search("[Nn]one", _current_ver) or not _oem_ver: - print("Unable to compare the version.\n\tInstalled version: {}\n\tOEM version: {}".format( - _current_ver, _oem_ver)) - oem_validate = False - else: - # The OEM-meta version in manifest should be less or equal to the version in OEM archive - oem_validate = _compare_version(_current_ver, _oem_ver, "le") - - if not _oem_ver or not _ubuntu_ver: - print("Unable to compare the version.\n\tOEM version: {}\n\tUbuntu version: {}".format( - _oem_ver, _ubuntu_ver)) - ubuntu_validate = False - else: - # The OEM-meta version in OEM archive should be great or equal to the version in Ubuntu archiver - ubuntu_validate = _compare_version(_oem_ver, _ubuntu_ver, "ge") - - return all([oem_validate, ubuntu_validate]) - def check_source_list_content(source_list_file, meta_name, codename, uri=""): result = False @@ -226,13 +221,13 @@ def check_source_list_content(source_list_file, meta_name, codename, uri=""): # To defined correct uri for different project # If meta_name start with unknown project name, uses default. if meta_name.startswith("oem-somerville"): - uri = "http://dell.archive.canonical.com" + uri = OEM_DELL_URL repo_comp = re.search(r"oem-([\w\d-]*)-meta", meta_name).groups()[0] elif meta_name.startswith("oem-sutton"): - uri = "http://lenovo.archive.canonical.com" + uri = OEM_LENOVO_URL repo_comp = meta_name.split("-")[1] elif meta_name.startswith("oem-stella"): - uri = "http://hp.archive.canonical.com" + uri = OEM_HP_URL repo_comp = meta_name.split("-")[1] else: uri = uri or DEFAULT_OEM_URL @@ -252,9 +247,7 @@ def check_source_list_content(source_list_file, meta_name, codename, uri=""): validate_source_cmd = 'grep "^deb {uri}/ {dist} {comp}$"'.format( uri=uri, dist=codename, comp=repo_comp) - - ret_code, output = issue_cmd(" ".join([validate_source_cmd, - source_list_file])) + ret_code, output = issue_cmd(" ".join([validate_source_cmd, source_list_file])) if ret_code == 0: result = True else: @@ -283,17 +276,14 @@ def _get_package_source_file(meta_name): return filename -def check_meta_version(version_infos): +def check_meta_version(package, version_infos, check_stock): # OEM-Meta package should be named as "oem-${project_name}-${platform_name}-meta" # list all available packages from apt repositories - # What meta packages should be list in ? # > apt-cache pkgnames - # The OEM-Meta package should be available from apt repositories # Collect the version information for meta package # > apt-cache policy $meta-package-name - # Output: Example # oem-somerville-three-eyed-raven-meta: # Installed: 20.04ubuntu4 # Candidate: 20.04ubuntu4 @@ -310,16 +300,53 @@ def check_meta_version(version_infos): # Compare the version between OEM archive, stock ubuntu archive and current image. # Uses dpkg utitlity to compare version # > dpkg --compare-versions ${a_version} ${b_version} + def _compare_version(ver_a, ver_b, operator): + command = "dpkg --compare-versions {ver1} {op} {ver2}".format( + ver1=ver_a, ver2=ver_b, op=operator) + ret_code, output = issue_cmd(command) + return True if ret_code == 0 else False + cmp_result = False - oem_ver = version_infos.get(OEM_KEY, {}) - ubuntu_ver = version_infos.get(UBUNTU_KEY, {}) + oem_ver = version_infos.get(OEM_KEY, {}).get("version", "") + real_oem_url = version_infos.get(OEM_KEY, {}).get("url", "") + oem_url_mapping = [OEM_URL_PATTERN.get(key) for key in OEM_URL_PATTERN.keys() if package.startswith(key)] + oem_url_mapping = oem_url_mapping[0] if len(oem_url_mapping) > 0 else "" current_ver = version_infos.get("Installed", "") - cmp_result = check_version_rule(current_ver, oem_ver.get("version", ""), - ubuntu_ver.get("version", "")) + + if current_ver == "" or re.search("[Nn]one", current_ver): + print("The {} package is not installed!".format(package), file=sys.stderr) + else: + if oem_ver: + # The OEM-meta version in manifest should be less or equal to the version in OEM archive + oem_ver_check = _compare_version(current_ver, oem_ver, "eq") + print("## Version in manifest equal to OEM archive:\t\t{} ##".format( + "Passed" if oem_ver_check else "Failed"), + file=sys.stdout if oem_ver_check else sys.stderr) + oem_url_check = re.search(oem_url_mapping, real_oem_url) or False + print("## Package comes from correct OEM archive:\t\t{} ##".format( + "Passed" if oem_url_check else "Failed"), + file=sys.stdout if oem_url_check else sys.stderr) + else: + oem_ver_check = oem_url_check = False + print("## Package not available in OEM archive!", file=sys.stderr) + + # The OEM-meta version in OEM archive should be great or equal to the version in Ubuntu archive + if check_stock: + ubuntu_ver = version_infos.get(UBUNTU_KEY, {}).get("version", "") + if ubuntu_ver: + ubuntu_check = _compare_version(ubuntu_ver, oem_ver, "le") + print("## Version in Stock archive is less or equal to OEM archive:\t\t{} ##".format( + "Passed" if oem_ver_check else "Failed"), + file=sys.stdout if ubuntu_check else sys.stderr) + else: + ubuntu_check = False + print("## Package not available in Ubuntu archive!", file=sys.stderr) + else: + ubuntu_check = True - print("## Compare Version:\t\t{} ##".format( - "Passed" if cmp_result else "Failed")) + if oem_ver_check and oem_url_check and ubuntu_check: + cmp_result = True return cmp_result @@ -330,11 +357,21 @@ def _register_arguments(): "\nFor focal and later.") parser = argparse.ArgumentParser( description=description, formatter_class=argparse.RawTextHelpFormatter) - parser.add_argument("--check-factory", action="store_true", default=False) - parser.add_argument("--meta", type=str, default="") - parser.add_argument("--no-check-version", action="store_true", default=False) - parser.add_argument("--no-check-content", action="store_true", default=False) - parser.add_argument("--source-file", type=str, default="") + + parser.add_argument("--meta", type=str, + default="", help="OEM package name. If not specified, generated OEM platform meta package from system.") + parser.add_argument("--gen-meta-type", choices=["platform", "project"], + default= "platform", help="The OEM platform meta type.") + parser.add_argument("--factory-meta", action="store_true", + default=False, help="Check OEM Factory Platform meta package") + parser.add_argument("--no-check-version", action="store_true", + default=False, help="Not to check the package metadata.") + parser.add_argument("--check-stock", action="store_false", + default=False, help="To check the package in stock archive is less than OEM archive.") + parser.add_argument("--no-check-content", action="store_true", + default=False, help="Not to check the content in source list.") + parser.add_argument("--source-file", type=str, + default="", help="Source List file. If not specified, check OEM platform meta source list in /etc/apt/sources.list.d/") return parser.parse_args() @@ -344,7 +381,8 @@ def main(): codename = _get_code_name() if args.meta == "": project, platform = _get_platform_name() - oem_metaname = gen_oem_meta_name(project, platform, args.check_factory) + oem_metaname = gen_oem_meta_name(project, platform, args.factory_meta, + args.gen_meta_type) else: # User need to provided a package name oem_metaname = args.meta @@ -355,8 +393,8 @@ def main(): source_file = args.source_file or _get_package_source_file(oem_metaname) if source_file: - check_result = check_source_list_content( - source_file, oem_metaname, codename) + check_result = check_source_list_content(source_file, oem_metaname, + codename) results.append(check_result) if not args.no_check_version and codename not in UNSUPPORTED_CODENAME: @@ -370,7 +408,7 @@ def main(): print("Unable to get OEM metadata: {}".format(oem_metaname), file=sys.stderr) else: - cmp_result = check_meta_version(meta_pkg_info) + cmp_result = check_meta_version(oem_metaname, meta_pkg_info, args.check_stock) else: print("{} package is not exists.".format(oem_metaname), file=sys.stderr) results.append(cmp_result) diff --git a/jobs/misc/misc-generic.txt b/jobs/misc/misc-generic.txt index fb41de9..a5f31c6 100644 --- a/jobs/misc/misc-generic.txt +++ b/jobs/misc/misc-generic.txt @@ -41,6 +41,22 @@ _description: For some packages which may have license or patent issues, this case checks if they are installed. plugin: shell +id: misc/generic/check-oem-project-meta +command: check-oem-package-source.py --gen-meta-type project --no-check-content +_summary: Check OEM Project mata exists in manifest and OEM archive +_description: + To validate the OEM project meta in manifest and the version same as in OEM archive. + This test cases only supported in focal and later. + +plugin: shell +id: misc/generic/check-oem-project-factory-meta +command: check-oem-package-source.py --gen-meta-type project --factory-meta --no-check-content +_summary: Check OEM Project factory mata exists in manifest and OEM archive +_description: + To validate the OEM platform meta in manifest and the version same as in OEM archive. + This test cases only supported in focal and later. + +plugin: shell id: misc/generic/check-oem-platform-meta command: check-oem-package-source.py _summary: Check OEM Platform mata exists in manifest, OEM and Ubuntu archive @@ -50,10 +66,10 @@ _description: plugin: shell id: misc/generic/check-oem-platform-factory-meta -command: check-oem-package-source.py --check-factory --no-check-version -_summary: Check OEM Platform factory mata exists in manifest, OEM and Ubuntu archive +command: check-oem-package-source.py --factory-meta --no-check-content +_summary: Check OEM Platform factory mata exists in manifest and OEM archive _description: - To validate the OEM platform factory meta in manifest, OEM archive and Ubuntu archive. + To validate the OEM platform factory meta in manifest and the version same as in OEM archive. id: misc/generic/stock_ubuntu_platform_meta user: root diff --git a/jobs/somerville/somerville-oem-meta.pxu b/jobs/somerville/somerville-oem-meta.pxu index 1fc0034..7714fc9 100644 --- a/jobs/somerville/somerville-oem-meta.pxu +++ b/jobs/somerville/somerville-oem-meta.pxu @@ -1,9 +1,12 @@ unit: test plan id: somerville-oem-meta +category_overrides: apply "somerville" to .* _name: Somerville OEM meta test _description: Somerville OEM Meta file test include: somerville/platform-meta-test + misc/generic/check-oem-project-meta + misc/generic/check-oem-project-factory-meta misc/generic/check-oem-platform-meta misc/generic/check-oem-platform-factory-meta nested_part: diff --git a/jobs/stella/stella-oem-meta.pxu b/jobs/stella/stella-oem-meta.pxu index 436fcf5..6b07b1a 100644 --- a/jobs/stella/stella-oem-meta.pxu +++ b/jobs/stella/stella-oem-meta.pxu @@ -1,9 +1,13 @@ unit: test plan id: stella-oem-meta +category_overrides: apply "stella" to .* _name: Stella OEM meta test _description: Stella OEM meta test include: - stella/sourcelist/.*-repository$ + # Mark below test case first, but need to confirm is it needed for beaver + # stella/sourcelist/.*-repository$ + misc/generic/check-oem-project-meta + misc/generic/check-oem-project-factory-meta misc/generic/check-oem-platform-meta misc/generic/check-oem-platform-factory-meta nested_part: diff --git a/jobs/sutton/sutton-oem-meta.pxu b/jobs/sutton/sutton-oem-meta.pxu index 5c1eb5e..5eb01a7 100644 --- a/jobs/sutton/sutton-oem-meta.pxu +++ b/jobs/sutton/sutton-oem-meta.pxu @@ -1,11 +1,14 @@ unit: test plan id: sutton-oem-meta +category_overrides: apply "sutton" to .* _name: Sutton OEM meta test _description: Sutton OEM meta test include: com.canonical.ce::sutton/sourceslist/focal-oem com.canonical.ce::sutton/sourceslist/security com.canonical.ce::sutton/sourceslist/meta + misc/generic/check-oem-project-meta + misc/generic/check-oem-project-factory-meta misc/generic/check-oem-platform-meta misc/generic/check-oem-platform-factory-meta nested_part: |