From a14cc981f658e48a4b2c8b9b1d2f3e3ce19495a2 Mon Sep 17 00:00:00 2001 From: FrantiĊĦek Zatloukal Date: Apr 01 2020 13:31:10 +0000 Subject: Support handling bodhi pages for fedora-easy-karma --- diff --git a/oraculum/cli.py b/oraculum/cli.py index d27ec0f..a2bcc7e 100644 --- a/oraculum/cli.py +++ b/oraculum/cli.py @@ -69,7 +69,8 @@ def sync(): app.config['MAX_DB_AGE'] = 0 app.config['SKIP_CACHE_AGE_CHECK'] = False db_utils.refresh_data("get_actions", controllers.main.get_actions()) - #db_utils.refresh_data("api_v0_meetings", controllers.main.api_v0_meetings()) FIXME + db_utils.refresh_data("api_v1_landing_page", controllers.main.api_v1_landing_page()) + db_utils.refresh_data("api_v1_karma", controllers.main.api_v1_libkarma()) def main(): possible_commands = ['init_db', 'generate_config', 'upgrade_db', 'sync'] diff --git a/oraculum/controllers/main.py b/oraculum/controllers/main.py index 256eb75..0f9f8c1 100644 --- a/oraculum/controllers/main.py +++ b/oraculum/controllers/main.py @@ -19,7 +19,7 @@ from oraculum import app, cache, login_manager, oidc from oraculum.data_providers import PROVIDERS -from oraculum.utils import fedocal, schedule, blockerbugs, meetbot, db_utils +from oraculum.utils import fedocal, schedule, blockerbugs, meetbot, db_utils, libkarma from flask_login import UserMixin, login_required, \ login_user, logout_user, current_user @@ -47,10 +47,19 @@ class User(UserMixin): CACHE_TIMEOUT = 3600 # MAX_DB_AGE defined in oraculum.utils.db_utils +@app.route('/api/v1/libkarma') +def api_v1_libkarma(): + cached = db_utils.get_db_data("api_v1_libkarma") + if cached: + return cached + karma = libkarma.get_updates(schedule.current_stable(), schedule.current_devel(), app.logger) + db_utils.refresh_data("api_v1_libkarma", karma) + return karma + @app.route('/api/v1/landing_page') #@cache.cached(timeout=CACHE_TIMEOUT) -def api_v0_meetings(): - cached = db_utils.get_db_data("api_v0_meetings") +def api_v1_landing_page(): + cached = db_utils.get_db_data("api_v1_landing_page") if cached: return cached @@ -67,10 +76,10 @@ def api_v0_meetings(): 'blockerbugs': blockers, 'stable': stable, 'devel': devel, - } - json_resp = jsonify(resp) - db_utils.refresh_data("api_v0_meetings", resp) - return json_resp + } + + db_utils.refresh_data("api_v1_landing_page", resp) + return resp def get_actions(provider=None, tags=None): actions = [] diff --git a/oraculum/utils/libkarma.py b/oraculum/utils/libkarma.py new file mode 100644 index 0000000..82a9735 --- /dev/null +++ b/oraculum/utils/libkarma.py @@ -0,0 +1,55 @@ +import logging + +from bodhi.client.bindings import BodhiClient + +def query_bodhi(bodhi_client, release, pending=False, logger=None): + """Deal with querying bodhi and combining all relevant pages into a + single list of updates.""" + if not logger: + logger = logging.getLogger(__name__) + + query_args = {"release": "F" + str(release), + "rows_per_page": 20, + } + if pending: + query_args["request"] = "testing" + query_args["status"] = "pending" + else: + query_args["status"] = "testing" + + updates = [] + try: + # since bodhi has a query limit but multiple pages, get ALL of the + # updates before starting to process + result = bodhi_client.query(**query_args) + updates.extend(result['updates']) + while result.page < result.pages: + next_page = result['page'] + 1 + logger.debug("Fetching updates page {} of {}".format( + next_page, result['pages'])) + result = bodhi_client.query(page=next_page, **query_args) + logger.debug("Queried Bodhi page %s" % next_page) + updates.extend(result['updates']) + # There is no clear indication which Exceptions bc.query() might + # throw, therefore catch all (python-fedora-0.3.32.3-1.fc19) + except Exception as e: + logger.debug("Error while querying Bodhi: {0}".format(e)) + + return updates + +def get_updates(current_stable, current_devel, logger=None): + updates = {} + bc = BodhiClient(username="oraculum", + useragent="Fedora Easy Karma/GIT", + retries=3) + + releases = [(current_stable - 1), current_stable, current_devel] + for release in releases: + updates["F" + str(release)] = query_bodhi(bc, release, False, logger) + updates_pending = query_bodhi(bc, release, True, logger) + updates["F" + str(release)].extend(updates_pending) + + return updates + +if __name__ == "__main__": + import ipdb; ipdb.set_trace()