From 4c459c4bf478d92c604d3543a836528680e50f63 Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Mon, 20 Nov 2017 16:50:07 -0800 Subject: [PATCH] Add /projects/depsolve route --- src/pylorax/api/projects.py | 20 +++++++++++++++++++- src/pylorax/api/v0.py | 11 ++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/pylorax/api/projects.py b/src/pylorax/api/projects.py index 42806096..a9a775b7 100644 --- a/src/pylorax/api/projects.py +++ b/src/pylorax/api/projects.py @@ -73,6 +73,15 @@ def yaps_to_project_info(yaps): "builds": [build]} +def tm_to_dep(tm): + """Extract the info from a TransactionMember object""" + return {"name": tm.name, + "epoch": tm.epoch, + "version": tm.version, + "release": tm.release, + "arch": tm.arch} + + def projects_list(yb): """Return a list of projects @@ -113,7 +122,16 @@ def projects_depsolve(yb, project_names): :returns: ... :rtype: ... """ - pass + # TODO - Catch yum tracebacks here + + # This resets the transaction + yb.closeRpmDB() + for p in project_names: + yb.install(pattern=p) + (rc, msg) = yb.buildTransaction() + # If rc isn't 2 something went wrong, raise and error + yb.tsInfo.makelists() + return sorted(map(tm_to_dep, yb.tsInfo.installed + yb.tsInfo.depinstalled), key=lambda p: p["name"].lower()) def modules_list(yb): diff --git a/src/pylorax/api/v0.py b/src/pylorax/api/v0.py index c5a9bec5..7f05adea 100644 --- a/src/pylorax/api/v0.py +++ b/src/pylorax/api/v0.py @@ -24,7 +24,7 @@ from pykickstart.parser import KickstartParser from pykickstart.version import makeVersion, RHEL7 from pylorax.api.crossdomain import crossdomain -from pylorax.api.projects import projects_list, projects_info +from pylorax.api.projects import projects_list, projects_info, projects_depsolve from pylorax.api.recipes import list_branch_files, read_recipe_commit, recipe_filename, list_commits from pylorax.api.recipes import recipe_from_dict, recipe_from_toml, commit_recipe, delete_recipe, revert_recipe from pylorax.api.recipes import tag_recipe_commit, recipe_diff @@ -305,3 +305,12 @@ def v0_api(api): projects = projects_info(api.config["YUMLOCK"].yb, project_names.split(",")) return jsonify(projects=projects) + + @api.route("/api/v0/projects/depsolve/") + @crossdomain(origin="*") + def v0_projects_depsolve(project_names): + """Return detailed information about the listed projects""" + with api.config["YUMLOCK"].lock: + deps = projects_depsolve(api.config["YUMLOCK"].yb, project_names.split(",")) + + return jsonify(projects=deps)