From 661657f55d089e587a0b7b09bba19bffc4bae350 Mon Sep 17 00:00:00 2001 From: FrantiĊĦek Zatloukal Date: Jun 23 2020 08:22:15 +0000 Subject: Adapt to new orphans.json format --- diff --git a/oraculum/controllers/packager_dashboard.py b/oraculum/controllers/packager_dashboard.py index 6f49dbd..71fb242 100644 --- a/oraculum/controllers/packager_dashboard.py +++ b/oraculum/controllers/packager_dashboard.py @@ -58,7 +58,7 @@ def dashboard_user_data_static(user): 'packages': packages["combined"], 'group_packages': packages["group"], 'primary_packages': packages["primary"], - 'orphans': dashboard.get_orphans(packages["combined"], CACHE.get('orphans_json')), + 'orphans': dashboard.get_orphans(packages["combined"]), 'fails_to_install': dashboard.get_health_check_user_data(packages["combined"]), 'updates': dashboard.get_updates(packages["combined"], CACHE.get('bodhi_updates')), 'overrides': dashboard.get_user_overrides(packages["combined"], CACHE.get('bodhi_overrides')), diff --git a/oraculum/utils/dashboard.py b/oraculum/utils/dashboard.py index 13612f9..1479530 100644 --- a/oraculum/utils/dashboard.py +++ b/oraculum/utils/dashboard.py @@ -140,22 +140,89 @@ def process_override(override): "release": release_from_nevra(override["nvr"]) } +def orphan_reason(package, reason_tree=[]): + """ + TODO: WIP + Returns chain of dependencies that caused the package to depend on something orphaned + """ + orphans_json = CACHE.get('orphans_json') + for p in orphans_json["affected_packages"][package]: + if p not in reason_tree: + reason_tree.append(p) + reason_tree = orphan_reason(p, reason_tree=reason_tree) + return reason_tree + +def is_directly_orphaned(package): + """ + Returns True if a package itself is orphaned + """ + orphans_json = CACHE.get('orphans_json') + if package in orphans_json["status_change"]: + return True + return False -def get_orphans(packages, orphans_json): +def filter_indirectly_orphaned(packages): + """ + Filters list containing orphaned and depending on orphaned packages to contain only directly orphaned packages """ - Returns dict of dictionaries (all packages), where orphaned package has orphaned == True + ret = [] + for package in packages: + if is_directly_orphaned(package): + ret.append(package) + return ret + + +def orphan_since_earliest(reason_tree): + """ + Returns the oldest time from reason_tree + """ + orphans_json = CACHE.get('orphans_json') + times = [] + for reason in reason_tree: + try: + times.append(orphans_json["status_change"][reason]) + except KeyError: + continue + return min(times) + +def get_orphans(packages): + """ + Returns dict of dictionaries (all packages): { + "orphaned": directly orphaned package has orphaned == True, + "depends_on_orphaned": Package that depends on something orphaned (even indirectly), + "problematic_since": oldest time when something in the chain was orphaned + } + Example of orphans_json: { + "affected_packages": { + "package_a": [package_b, package_c,...], + "package_b": [package_c, package_d,...], + ... + }, + "status_change": { + "package_a": "time", + "package_b": "time", + ... + } + } """ + orphans_json = CACHE.get('orphans_json') orphans = {} for package in packages: orphans[package] = { "orphaned": False, - "orphaned_since": None + "depends_on_orphaned": False, + "reason_tree": [], + "problematic_since": None } - if package in orphans_json: + if package in orphans_json["affected_packages"]: + reason = orphan_reason(package) orphans[package] = { - "orphaned": True, - "orphaned_since": orphans_json[package] + "orphaned": is_directly_orphaned(package), + "depends_on_orphaned": True if len(orphans_json["affected_packages"]) != 0 else False, + "reason_tree": filter_indirectly_orphaned(reason), + "problematic_since": None } + orphans[package]["problematic_since"] = orphan_since_earliest(reason) return orphans