mirror of
https://pagure.io/fedora-qa/os-autoinst-distri-fedora.git
synced 2024-11-04 23:24:21 +00:00
8674e29a8e
In the "installed package is newer than the one in the update" case, also be OK (soft fail) if the update is obsolete, not just if it's stable. Signed-off-by: Adam Williamson <awilliam@redhat.com>
97 lines
3.5 KiB
Python
97 lines
3.5 KiB
Python
#!/usr/bin/python3
|
|
|
|
"""This script does a version comparison between the versions of packages
|
|
from the update under test and the installed versions of the same-named
|
|
packages, for whichever packages from the update are installed. It expects
|
|
input data that's generated in advisory_check_nonmatching_packages and
|
|
advisory_get_installed_packages; you can run it manually against
|
|
updatepkgs.txt and installedupdatepkgs.txt logs from a completed test run
|
|
if you need to test it or something."""
|
|
|
|
# no, pylint, global scope variable names in a script like this aren't
|
|
# really "constants"
|
|
# pylint:disable=invalid-name
|
|
|
|
import json
|
|
import sys
|
|
from urllib.request import urlopen
|
|
|
|
import rpm # pylint:disable=import-error
|
|
|
|
def printver(pname, pepoch, pversion, prelease):
|
|
"""Print a NEVR in the typical human-readable format."""
|
|
return f"{pname}-{pepoch}:{pversion}-{prelease}"
|
|
|
|
try:
|
|
updfname = sys.argv[1]
|
|
instfname = sys.argv[2]
|
|
except IndexError:
|
|
sys.exit("Must specify two input filenames!")
|
|
try:
|
|
updalias = sys.argv[3]
|
|
except IndexError:
|
|
updalias = None
|
|
|
|
|
|
updpkgs = {}
|
|
with open(updfname, "r", encoding="utf-8") as ufh:
|
|
for uline in ufh.readlines():
|
|
(_, name, epoch, version, release) = uline.strip().split(" ")
|
|
updpkgs[name] = (epoch, version, release)
|
|
|
|
problems = []
|
|
warnings = []
|
|
post = set()
|
|
ret = 0
|
|
updstableobs = None
|
|
with open(instfname, "r", encoding="utf-8") as ifh:
|
|
for iline in ifh.readlines():
|
|
(_, name, epoch, version, release) = iline.strip().split(" ")
|
|
res = rpm.labelCompare((epoch, version, release), (updpkgs[name]))
|
|
if res == 0:
|
|
continue
|
|
instver = printver(name, epoch, version, release)
|
|
updver = printver(name, *updpkgs[name])
|
|
if res < 0:
|
|
problems.append(f"Installed: {instver} is older than update: {updver}.")
|
|
post.add("Installed older than update usually means there is a dependency problem preventing the update version being installed.")
|
|
post.add("Check /var/log/dnf.log, and search for the string 'Problem'.")
|
|
else:
|
|
msg = f"Installed: {instver} is newer than update: {updver}"
|
|
if not updalias:
|
|
problems.append(f"{msg} and this is not an update test, please check if this is a problem")
|
|
continue
|
|
# check if the update is stable
|
|
if updstableobs is None:
|
|
try:
|
|
url = f"https://bodhi.fedoraproject.org/updates/{updalias}"
|
|
resp = json.loads(urlopen(url).read().decode("utf8")) # pylint:disable=consider-using-with
|
|
updstableobs = (resp.get("update", {}).get("status", "") in ("stable", "obsolete"))
|
|
except: # pylint:disable=bare-except
|
|
problems.append(f"{msg} and Bodhi is unreachable.")
|
|
continue
|
|
if updstableobs:
|
|
warnings.append(f"{msg} and update is stable or obsolete, this is probably OK.")
|
|
else:
|
|
problems.append(f"{msg} and update is not stable or obsolete.")
|
|
post.add("Installed newer than update and update not stable or obsolete means older version could be pushed over newer if update goes stable.")
|
|
|
|
if warnings:
|
|
print("WARNINGS")
|
|
for warning in warnings:
|
|
print(warning)
|
|
ret = 2
|
|
|
|
if problems:
|
|
print("PROBLEMS")
|
|
for problem in problems:
|
|
print(problem)
|
|
ret = 3
|
|
|
|
if post:
|
|
print("INVESTIGATION TIPS")
|
|
for postmsg in post:
|
|
print(postmsg)
|
|
|
|
sys.exit(ret)
|