summaryrefslogtreecommitdiff
diff options
authorstanley31 <stanley.huang@canonical.com>2020-09-08 14:26:26 +0800
committerstanley31 <stanley.huang@canonical.com>2020-09-08 14:26:26 +0800
commit32af95c807c0b0e6e8a9c2a98863d3967ce22aed (patch)
treea221b6392e2fb0328d61071803f17ec8ffe54827
parentbeef0c9d8ecb3be587ed1e146776604524e8006b (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-xbin/check-oem-package-source.py166
-rw-r--r--jobs/misc/misc-generic.txt22
-rw-r--r--jobs/somerville/somerville-oem-meta.pxu3
-rw-r--r--jobs/stella/stella-oem-meta.pxu6
-rw-r--r--jobs/sutton/sutton-oem-meta.pxu3
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: