From 651e111d1f81fbcc46dba01d36c9cf01a297f48f Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Wed, 28 Mar 2018 12:40:47 -0700 Subject: [PATCH] Change the API code to use blueprint This includes in the JSON output. The only exception is when using functions from the recipes module. There are no plans to change that. --- src/pylorax/api/recipes.py | 2 +- src/pylorax/api/v0.py | 222 ++++++++++++++++++------------------- src/sbin/lorax-composer | 20 ++-- 3 files changed, 122 insertions(+), 122 deletions(-) diff --git a/src/pylorax/api/recipes.py b/src/pylorax/api/recipes.py index a7b2eb95..ed435c88 100644 --- a/src/pylorax/api/recipes.py +++ b/src/pylorax/api/recipes.py @@ -503,7 +503,7 @@ def revert_file(repo, branch, filename, commit): builder.insert(filename, blob_id, Git.FileMode.BLOB) (tree, sig, ref) = prepare_commit(repo, branch, builder) commit_hash = commit_id.to_string() - message = "Recipe %s reverted to commit %s" % (filename, commit_hash) + message = "%s reverted to commit %s" % (filename, commit_hash) return repo.create_commit(ref, sig, sig, "UTF-8", message, tree, [parent_commit]) def commit_recipe(repo, branch, recipe): diff --git a/src/pylorax/api/v0.py b/src/pylorax/api/v0.py index 92400cda..b2fc4898 100644 --- a/src/pylorax/api/v0.py +++ b/src/pylorax/api/v0.py @@ -952,8 +952,8 @@ def v0_api(api): return jsonify(status=False, error={"msg":str(e)}), 400 with api.config["GITLOCK"].lock: - recipes = take_limits(map(lambda f: f[:-5], list_branch_files(api.config["GITLOCK"].repo, branch)), offset, limit) - return jsonify(recipes=recipes, limit=limit, offset=offset, total=len(recipes)) + blueprints = take_limits(map(lambda f: f[:-5], list_branch_files(api.config["GITLOCK"].repo, branch)), offset, limit) + return jsonify(blueprints=blueprints, limit=limit, offset=offset, total=len(blueprints)) @api.route("/api/v0/blueprints/info/") @crossdomain(origin="*") @@ -961,55 +961,55 @@ def v0_api(api): """Return the contents of the blueprint, or a list of blueprints""" branch = request.args.get("branch", "master") out_fmt = request.args.get("format", "json") - recipes = [] + blueprints = [] changes = [] errors = [] - for recipe_name in [n.strip() for n in blueprint_names.split(",")]: + for blueprint_name in [n.strip() for n in blueprint_names.split(",")]: exceptions = [] # Get the workspace version (if it exists) try: with api.config["GITLOCK"].lock: - ws_recipe = workspace_read(api.config["GITLOCK"].repo, branch, recipe_name) + ws_blueprint = workspace_read(api.config["GITLOCK"].repo, branch, blueprint_name) except Exception as e: - ws_recipe = None + ws_blueprint = None exceptions.append(str(e)) - log.error("(v0_recipes_info) %s", str(e)) + log.error("(v0_blueprints_info) %s", str(e)) # Get the git version (if it exists) try: with api.config["GITLOCK"].lock: - git_recipe = read_recipe_commit(api.config["GITLOCK"].repo, branch, recipe_name) + git_blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) except Exception as e: - git_recipe = None + git_blueprint = None exceptions.append(str(e)) - log.error("(v0_recipes_info) %s", str(e)) + log.error("(v0_blueprints_info) %s", str(e)) - if not ws_recipe and not git_recipe: - # Neither recipe, return an error - errors.append({"recipe":recipe_name, "msg":", ".join(exceptions)}) - elif ws_recipe and not git_recipe: - # No git recipe, return the workspace recipe - changes.append({"name":recipe_name, "changed":True}) - recipes.append(ws_recipe) - elif not ws_recipe and git_recipe: - # No workspace recipe, no change, return the git recipe - changes.append({"name":recipe_name, "changed":False}) - recipes.append(git_recipe) + if not ws_blueprint and not git_blueprint: + # Neither blueprint, return an error + errors.append({"blueprint":blueprint_name, "msg":", ".join(exceptions)}) + elif ws_blueprint and not git_blueprint: + # No git blueprint, return the workspace blueprint + changes.append({"name":blueprint_name, "changed":True}) + blueprints.append(ws_blueprint) + elif not ws_blueprint and git_blueprint: + # No workspace blueprint, no change, return the git blueprint + changes.append({"name":blueprint_name, "changed":False}) + blueprints.append(git_blueprint) else: - # Both exist, maybe changed, return the workspace recipe - changes.append({"name":recipe_name, "changed":ws_recipe != git_recipe}) - recipes.append(ws_recipe) + # Both exist, maybe changed, return the workspace blueprint + changes.append({"name":blueprint_name, "changed":ws_blueprint != git_blueprint}) + blueprints.append(ws_blueprint) - # Sort all the results by case-insensitive recipe name + # Sort all the results by case-insensitive blueprint name changes = sorted(changes, key=lambda c: c["name"].lower()) - recipes = sorted(recipes, key=lambda r: r["name"].lower()) - errors = sorted(errors, key=lambda e: e["recipe"].lower()) + blueprints = sorted(blueprints, key=lambda r: r["name"].lower()) + errors = sorted(errors, key=lambda e: e["blueprint"].lower()) if out_fmt == "toml": - # With TOML output we just want to dump the raw recipe, skipping the rest. - return "\n\n".join([r.toml() for r in recipes]) + # With TOML output we just want to dump the raw blueprint, skipping the rest. + return "\n\n".join([r.toml() for r in blueprints]) else: - return jsonify(changes=changes, recipes=recipes, errors=errors) + return jsonify(changes=changes, blueprints=blueprints, errors=errors) @api.route("/api/v0/blueprints/changes/") @crossdomain(origin="*") @@ -1022,23 +1022,23 @@ def v0_api(api): except ValueError as e: return jsonify(status=False, error={"msg":str(e)}), 400 - recipes = [] + blueprints = [] errors = [] - for recipe_name in [n.strip() for n in blueprint_names.split(",")]: - filename = recipe_filename(recipe_name) + for blueprint_name in [n.strip() for n in blueprint_names.split(",")]: + filename = recipe_filename(blueprint_name) try: with api.config["GITLOCK"].lock: commits = take_limits(list_commits(api.config["GITLOCK"].repo, branch, filename), offset, limit) except Exception as e: - errors.append({"recipe":recipe_name, "msg":e}) - log.error("(v0_recipes_changes) %s", str(e)) + errors.append({"blueprint":blueprint_name, "msg":e}) + log.error("(v0_blueprints_changes) %s", str(e)) else: - recipes.append({"name":recipe_name, "changes":commits, "total":len(commits)}) + blueprints.append({"name":blueprint_name, "changes":commits, "total":len(commits)}) - recipes = sorted(recipes, key=lambda r: r["name"].lower()) - errors = sorted(errors, key=lambda e: e["recipe"].lower()) + blueprints = sorted(blueprints, key=lambda r: r["name"].lower()) + errors = sorted(errors, key=lambda e: e["blueprint"].lower()) - return jsonify(recipes=recipes, errors=errors, offset=offset, limit=limit) + return jsonify(blueprints=blueprints, errors=errors, offset=offset, limit=limit) @api.route("/api/v0/blueprints/new", methods=["POST"]) @crossdomain(origin="*") @@ -1047,18 +1047,18 @@ def v0_api(api): branch = request.args.get("branch", "master") try: if request.headers['Content-Type'] == "text/x-toml": - recipe = recipe_from_toml(request.data) + blueprint = recipe_from_toml(request.data) else: - recipe = recipe_from_dict(request.get_json(cache=False)) + blueprint = recipe_from_dict(request.get_json(cache=False)) with api.config["GITLOCK"].lock: - commit_recipe(api.config["GITLOCK"].repo, branch, recipe) + commit_recipe(api.config["GITLOCK"].repo, branch, blueprint) - # Read the recipe with new version and write it to the workspace - recipe = read_recipe_commit(api.config["GITLOCK"].repo, branch, recipe["name"]) - workspace_write(api.config["GITLOCK"].repo, branch, recipe) + # Read the blueprint with new version and write it to the workspace + blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint["name"]) + workspace_write(api.config["GITLOCK"].repo, branch, blueprint) except Exception as e: - log.error("(v0_recipes_new) %s", str(e)) + log.error("(v0_blueprints_new) %s", str(e)) return jsonify(status=False, error={"msg":str(e)}), 400 else: return jsonify(status=True) @@ -1072,7 +1072,7 @@ def v0_api(api): with api.config["GITLOCK"].lock: delete_recipe(api.config["GITLOCK"].repo, branch, blueprint_name) except Exception as e: - log.error("(v0_recipes_delete) %s", str(e)) + log.error("(v0_blueprints_delete) %s", str(e)) return jsonify(status=False, error={"msg":str(e)}), 400 else: return jsonify(status=True) @@ -1084,14 +1084,14 @@ def v0_api(api): branch = request.args.get("branch", "master") try: if request.headers['Content-Type'] == "text/x-toml": - recipe = recipe_from_toml(request.data) + blueprint = recipe_from_toml(request.data) else: - recipe = recipe_from_dict(request.get_json(cache=False)) + blueprint = recipe_from_dict(request.get_json(cache=False)) with api.config["GITLOCK"].lock: - workspace_write(api.config["GITLOCK"].repo, branch, recipe) + workspace_write(api.config["GITLOCK"].repo, branch, blueprint) except Exception as e: - log.error("(v0_recipes_workspace) %s", str(e)) + log.error("(v0_blueprints_workspace) %s", str(e)) return jsonify(status=False, error={"msg":str(e)}), 400 else: return jsonify(status=True) @@ -1105,7 +1105,7 @@ def v0_api(api): with api.config["GITLOCK"].lock: workspace_delete(api.config["GITLOCK"].repo, branch, blueprint_name) except Exception as e: - log.error("(v0_recipes_delete_workspace) %s", str(e)) + log.error("(v0_blueprints_delete_workspace) %s", str(e)) return jsonify(status=False, error={"msg":str(e)}), 400 else: return jsonify(status=True) @@ -1120,10 +1120,10 @@ def v0_api(api): revert_recipe(api.config["GITLOCK"].repo, branch, blueprint_name, commit) # Read the new recipe and write it to the workspace - recipe = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) - workspace_write(api.config["GITLOCK"].repo, branch, recipe) + blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) + workspace_write(api.config["GITLOCK"].repo, branch, blueprint) except Exception as e: - log.error("(v0_recipes_undo) %s", str(e)) + log.error("(v0_blueprints_undo) %s", str(e)) return jsonify(status=False, error={"msg":str(e)}), 400 else: return jsonify(status=True) @@ -1137,7 +1137,7 @@ def v0_api(api): with api.config["GITLOCK"].lock: tag_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) except Exception as e: - log.error("(v0_recipes_tag) %s", str(e)) + log.error("(v0_blueprints_tag) %s", str(e)) return jsonify(status=False, error={"msg":str(e)}), 400 else: return jsonify(status=True) @@ -1150,33 +1150,33 @@ def v0_api(api): try: if from_commit == "NEWEST": with api.config["GITLOCK"].lock: - old_recipe = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) + old_blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) else: with api.config["GITLOCK"].lock: - old_recipe = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name, from_commit) + old_blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name, from_commit) except Exception as e: - log.error("(v0_recipes_diff) %s", str(e)) + log.error("(v0_blueprints_diff) %s", str(e)) return jsonify(status=False, error={"msg":str(e)}), 400 try: if to_commit == "WORKSPACE": with api.config["GITLOCK"].lock: - new_recipe = workspace_read(api.config["GITLOCK"].repo, branch, blueprint_name) + new_blueprint = workspace_read(api.config["GITLOCK"].repo, branch, blueprint_name) # If there is no workspace, use the newest commit instead - if not new_recipe: + if not new_blueprint: with api.config["GITLOCK"].lock: - new_recipe = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) + new_blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) elif to_commit == "NEWEST": with api.config["GITLOCK"].lock: - new_recipe = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) + new_blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) else: with api.config["GITLOCK"].lock: - new_recipe = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name, to_commit) + new_blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name, to_commit) except Exception as e: - log.error("(v0_recipes_diff) %s", str(e)) + log.error("(v0_blueprints_diff) %s", str(e)) return jsonify(status=False, error={"msg":str(e)}), 400 - diff = recipe_diff(old_recipe, new_recipe) + diff = recipe_diff(old_blueprint, new_blueprint) return jsonify(diff=diff) @api.route("/api/v0/blueprints/freeze/") @@ -1185,96 +1185,96 @@ def v0_api(api): """Return the blueprint with the exact modules and packages selected by depsolve""" branch = request.args.get("branch", "master") out_fmt = request.args.get("format", "json") - recipes = [] + blueprints = [] errors = [] - for recipe_name in [n.strip() for n in sorted(blueprint_names.split(","), key=lambda n: n.lower())]: - # get the recipe + for blueprint_name in [n.strip() for n in sorted(blueprint_names.split(","), key=lambda n: n.lower())]: + # get the blueprint # Get the workspace version (if it exists) - recipe = None + blueprint = None try: with api.config["GITLOCK"].lock: - recipe = workspace_read(api.config["GITLOCK"].repo, branch, recipe_name) + blueprint = workspace_read(api.config["GITLOCK"].repo, branch, blueprint_name) except Exception: pass - if not recipe: + if not blueprint: # No workspace version, get the git version (if it exists) try: with api.config["GITLOCK"].lock: - recipe = read_recipe_commit(api.config["GITLOCK"].repo, branch, recipe_name) + blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) except Exception as e: - errors.append({"recipe":recipe_name, "msg":str(e)}) - log.error("(v0_recipes_freeze) %s", str(e)) + errors.append({"blueprint":blueprint_name, "msg":str(e)}) + log.error("(v0_blueprints_freeze) %s", str(e)) - # No recipe found, skip it. - if not recipe: - errors.append({"recipe":recipe_name, "msg":"Recipe not found"}) + # No blueprint found, skip it. + if not blueprint: + errors.append({"blueprint":blueprint_name, "msg":"blueprint not found"}) continue # Combine modules and packages and depsolve the list # TODO include the version/glob in the depsolving - module_names = recipe.module_names - package_names = recipe.package_names + module_names = blueprint.module_names + package_names = blueprint.package_names projects = sorted(set(module_names+package_names), key=lambda n: n.lower()) deps = [] try: with api.config["YUMLOCK"].lock: deps = projects_depsolve(api.config["YUMLOCK"].yb, projects) except ProjectsError as e: - errors.append({"recipe":recipe_name, "msg":str(e)}) - log.error("(v0_recipes_freeze) %s", str(e)) + errors.append({"blueprint":blueprint_name, "msg":str(e)}) + log.error("(v0_blueprints_freeze) %s", str(e)) - recipes.append({"recipe": recipe.freeze(deps)}) + blueprints.append({"blueprint": blueprint.freeze(deps)}) if out_fmt == "toml": - # With TOML output we just want to dump the raw recipe, skipping the rest. - return "\n\n".join([e["recipe"].toml() for e in recipes]) + # With TOML output we just want to dump the raw blueprint, skipping the rest. + return "\n\n".join([e["blueprint"].toml() for e in blueprints]) else: - return jsonify(recipes=recipes, errors=errors) + return jsonify(blueprints=blueprints, errors=errors) @api.route("/api/v0/blueprints/depsolve/") @crossdomain(origin="*") def v0_blueprints_depsolve(blueprint_names): """Return the dependencies for a blueprint""" branch = request.args.get("branch", "master") - recipes = [] + blueprints = [] errors = [] - for recipe_name in [n.strip() for n in sorted(blueprint_names.split(","), key=lambda n: n.lower())]: - # get the recipe + for blueprint_name in [n.strip() for n in sorted(blueprint_names.split(","), key=lambda n: n.lower())]: + # get the blueprint # Get the workspace version (if it exists) - recipe = None + blueprint = None try: with api.config["GITLOCK"].lock: - recipe = workspace_read(api.config["GITLOCK"].repo, branch, recipe_name) + blueprint = workspace_read(api.config["GITLOCK"].repo, branch, blueprint_name) except Exception: pass - if not recipe: + if not blueprint: # No workspace version, get the git version (if it exists) try: with api.config["GITLOCK"].lock: - recipe = read_recipe_commit(api.config["GITLOCK"].repo, branch, recipe_name) + blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) except Exception as e: - errors.append({"recipe":recipe_name, "msg":str(e)}) - log.error("(v0_recipes_depsolve) %s", str(e)) + errors.append({"blueprint":blueprint_name, "msg":str(e)}) + log.error("(v0_blueprints_depsolve) %s", str(e)) - # No recipe found, skip it. - if not recipe: - errors.append({"recipe":recipe_name, "msg":"Recipe not found"}) + # No blueprint found, skip it. + if not blueprint: + errors.append({"blueprint":blueprint_name, "msg":"blueprint not found"}) continue # Combine modules and packages and depsolve the list # TODO include the version/glob in the depsolving - module_names = map(lambda m: m["name"], recipe["modules"] or []) - package_names = map(lambda p: p["name"], recipe["packages"] or []) + module_names = map(lambda m: m["name"], blueprint["modules"] or []) + package_names = map(lambda p: p["name"], blueprint["packages"] or []) projects = sorted(set(module_names+package_names), key=lambda n: n.lower()) deps = [] try: with api.config["YUMLOCK"].lock: deps = projects_depsolve(api.config["YUMLOCK"].yb, projects) except ProjectsError as e: - errors.append({"recipe":recipe_name, "msg":str(e)}) - log.error("(v0_recipes_depsolve) %s", str(e)) + errors.append({"blueprint":blueprint_name, "msg":str(e)}) + log.error("(v0_blueprints_depsolve) %s", str(e)) # Get the NEVRA's of the modules and projects, add as "modules" modules = [] @@ -1283,9 +1283,9 @@ def v0_api(api): modules.append(dep) modules = sorted(modules, key=lambda m: m["name"].lower()) - recipes.append({"recipe":recipe, "dependencies":deps, "modules":modules}) + blueprints.append({"blueprint":blueprint, "dependencies":deps, "modules":modules}) - return jsonify(recipes=recipes, errors=errors) + return jsonify(blueprints=blueprints, errors=errors) @api.route("/api/v0/projects/list") @crossdomain(origin="*") @@ -1376,9 +1376,9 @@ def v0_api(api): """Start a compose The body of the post should have these fields: - recipe_name - The recipe name from /recipes/list/ - compose_type - The type of output to create, from /compose/types - branch - Optional, defaults to master, selects the git branch to use for the recipe. + blueprint_name - The blueprint name from /blueprints/list/ + compose_type - The type of output to create, from /compose/types + branch - Optional, defaults to master, selects the git branch to use for the blueprint. """ # Passing ?test=1 will generate a fake FAILED compose. # Passing ?test=2 will generate a fake FINISHED compose. @@ -1393,10 +1393,10 @@ def v0_api(api): if not compose: return jsonify(status=False, error={"msg":"Missing POST body"}), 400 - if "recipe_name" not in compose: - errors.append("No 'recipe_name' in the JSON request") + if "blueprint_name" not in compose: + errors.append("No 'blueprint_name' in the JSON request") else: - recipe_name = compose["recipe_name"] + blueprint_name = compose["blueprint_name"] if "branch" not in compose or not compose["branch"]: branch = "master" @@ -1413,7 +1413,7 @@ def v0_api(api): try: build_id = start_build(api.config["COMPOSER_CFG"], api.config["YUMLOCK"], api.config["GITLOCK"], - branch, recipe_name, compose_type, test_mode) + branch, blueprint_name, compose_type, test_mode) except Exception as e: return jsonify(status=False, error={"msg":str(e)}), 400 diff --git a/src/sbin/lorax-composer b/src/sbin/lorax-composer index 497b2512..da73e2f6 100755 --- a/src/sbin/lorax-composer +++ b/src/sbin/lorax-composer @@ -67,8 +67,8 @@ def get_parser(): help="Path to lorax-composer configuration file.") parser.add_argument( "--releasever", default=None, metavar="STRING", help="Release version to use for $releasever in yum repository urls" ) - parser.add_argument("RECIPES", metavar="RECIPES", - help="Path to the recipes") + parser.add_argument("BLUEPRINTS", metavar="BLUEPRINTS", + help="Path to the blueprints") return parser @@ -208,10 +208,10 @@ if __name__ == '__main__': server.config["COMPOSER_CFG"] = configure(conf_file=opts.config) # Make sure the git repo can be accessed by the API uid/gid - if os.path.exists(opts.RECIPES): - repodir_stat = os.stat(opts.RECIPES) + if os.path.exists(opts.BLUEPRINTS): + repodir_stat = os.stat(opts.BLUEPRINTS) if repodir_stat.st_gid != gid or repodir_stat.st_uid != uid: - subprocess.call(["chown", "-R", "%s:%s" % (opts.user, opts.group), opts.RECIPES]) + subprocess.call(["chown", "-R", "%s:%s" % (opts.user, opts.group), opts.BLUEPRINTS]) # If the user passed in a releasever set it in the configuration if opts.releasever: @@ -254,14 +254,14 @@ if __name__ == '__main__': server.config["YUMLOCK"] = YumLock(yb=yb, lock=Lock()) # Setup access to the git repo - server.config["REPO_DIR"] = opts.RECIPES + server.config["REPO_DIR"] = opts.BLUEPRINTS repo = open_or_create_repo(server.config["REPO_DIR"]) - server.config["GITLOCK"] = GitLock(repo=repo, lock=Lock(), dir=opts.RECIPES) + server.config["GITLOCK"] = GitLock(repo=repo, lock=Lock(), dir=opts.BLUEPRINTS) - # Import example recipes - commit_recipe_directory(server.config["GITLOCK"].repo, "master", opts.RECIPES) + # Import example blueprints + commit_recipe_directory(server.config["GITLOCK"].repo, "master", opts.BLUEPRINTS) - log.info("Starting %s on %s with recipes from %s", VERSION, opts.socket, opts.RECIPES) + log.info("Starting %s on %s with blueprints from %s", VERSION, opts.socket, opts.BLUEPRINTS) http_server = WSGIServer(listener, server, log=LogWrapper(server_log)) # The server writes directly to a file object, so point to our log directory http_server.serve_forever()