Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : master
---------------------------------------------------------------
commit 94066f820d45e9d4f1666d33eba19064b30d26b3
Author: Miroslav Suchý <msuchy(a)redhat.com>
Date: Fri Mar 7 17:14:59 2014 +0100
api: cancel build
and add "copr-cli cancel" command
Also add api call to fetch details of build (I did not use it at then end, but when I
code it, I will leave it there)
---------------------------------------------------------------
copr_cli/main.py | 15 +++++
copr_cli/subcommands.py | 17 ++++++
coprs_frontend/coprs/logic/builds_logic.py | 4 +-
coprs_frontend/coprs/templates/api.html | 62 ++++++++++++++++++++++
coprs_frontend/coprs/views/api_ns/api_general.py | 48 ++++++++++++++++-
5 files changed, 143 insertions(+), 3 deletions(-)
diff --git a/copr_cli/main.py b/copr_cli/main.py
index 96775f5..f20cf18 100644
--- a/copr_cli/main.py
+++ b/copr_cli/main.py
@@ -47,6 +47,14 @@ def action_list(args):
def action_status(args):
subcommands.status(args.build_id)
+def action_cancel(args):
+ """ Method called when the 'cancel' action has been selected
by the
+ user.
+
+ :param args: argparse arguments provided by the user
+
+ """
+ subcommands.cancel(args.build_id)
def setup_parser():
"""
@@ -114,6 +122,13 @@ def setup_parser():
help="Build ID")
parser_build.set_defaults(func=action_status)
+ # create the parser for the "cancel" command
+ parser_build = subparsers.add_parser("cancel",
+ help="Cancel build specified by its ID")
+ parser_build.add_argument("build_id",
+ help="Build ID")
+ parser_build.set_defaults(func=action_cancel)
+
return parser
diff --git a/copr_cli/subcommands.py b/copr_cli/subcommands.py
index 7d8d574..5b99e80 100644
--- a/copr_cli/subcommands.py
+++ b/copr_cli/subcommands.py
@@ -183,6 +183,23 @@ def status(build_id):
(ret, value) = _fetch_status(build_id)
print(value)
+def cancel(build_id):
+ """ Cancel specified build_id """
+ user = get_user()
+ copr_api_url = get_api_url()
+ #/coprs/rhscl/nodejs010/cancel_build/4060/
+ URL = "{0}/coprs/cancel_build/{1}/".format(
+ copr_api_url,
+ build_id)
+ req = requests.get(URL, auth=(user["login"], user["token"]))
+ output = _get_data(req, user)
+ if output is None:
+ return (False, "Error occurred.")
+ elif "status" in output:
+ return (True, output["status"])
+ else:
+ return (False, output["error"])
+
def build(copr, pkgs, memory, timeout, wait=True, result=None):
""" Build a new package into a given copr.
diff --git a/coprs_frontend/coprs/logic/builds_logic.py
b/coprs_frontend/coprs/logic/builds_logic.py
index 44d0ead..a6e234c 100644
--- a/coprs_frontend/coprs/logic/builds_logic.py
+++ b/coprs_frontend/coprs/logic/builds_logic.py
@@ -139,14 +139,14 @@ class BuildsLogic(object):
@classmethod
def cancel_build(cls, user, build):
- if not (user.can_build_in(build.copr):
+ if not (user.can_build_in(build.copr)):
raise exceptions.InsufficientRightsException(
"You are not allowed to cancel this build.")
build.canceled = True
@classmethod
def delete_build(cls, user, build):
- if not (user.can_build_in(build.copr):
+ if not (user.can_build_in(build.copr)):
raise exceptions.InsufficientRightsException(
"You are not allowed to delete this build.")
diff --git a/coprs_frontend/coprs/templates/api.html
b/coprs_frontend/coprs/templates/api.html
index 1df4fb3..c711768 100644
--- a/coprs_frontend/coprs/templates/api.html
+++ b/coprs_frontend/coprs/templates/api.html
@@ -235,6 +235,68 @@ copr_url =
http://copr.fedoraproject.org
}
</pre>
+ <h3>Query build detail</h3>
+
+ <h4>URL:</h4>
+ <pre
style="font-size:120%">/api/copr/build_detail/<build_id>/</pre>
+
+ <h4>URL parameters:</h4>
+ <ul>
+ <li><b>build_id</b> – Build ID returned by the
<span style="font-style:italic">new_build</span> call</li>
+ </ul>
+
+ <h4>Result</h4>
+ <ul>
+ <li><b>status</b> – Status of the build, one of
+ <ul>
+ <li>pending</li>
+ <li>running</li>
+ <li>failed</li>
+ <li>succeeded</li>
+ <li>canceled</li>
+ </ul>
+ </li>
+ <li><b>owner</b> – Name of the owner.
+ </li>
+ <li><b>project</b> – Name of the project.
+ </li>
+ </ul>
+
+ <h4>Example result</h4>
+ <pre>
+ {
+ "status": "pending",
+ "owner": "msuchy",
+ "project": "myproject",
+ "output": "ok"
+ }
+ </pre>
+
+ <h3>Cancel build</h3>
+
+ <p><span style="font-style:italic">Login
required</span></p>
+
+ <h4>URL:</h4>
+ <pre
style="font-size:120%">/api/copr/cancel_build/<build_id>/</pre>
+
+ <h4>URL parameters:</h4>
+ <ul>
+ <li><b>build_id</b> – Build ID returned by the
<span style="font-style:italic">new_build</span> call</li>
+ </ul>
+
+ <h4>Result</h4>
+ <ul>
+ <li><b>status</b> – Status of the task.
+ </ul>
+
+ <h4>Example result</h4>
+ <pre>
+ {
+ "status": "Build canceled",
+ "output": "ok"
+ }
+ </pre>
+
<h3>Copr Modification</h3>
<p><span style="font-style:italic">Login
required</span></p>
diff --git a/coprs_frontend/coprs/views/api_ns/api_general.py
b/coprs_frontend/coprs/views/api_ns/api_general.py
index cc41fdd..f792977 100644
--- a/coprs_frontend/coprs/views/api_ns/api_general.py
+++ b/coprs_frontend/coprs/views/api_ns/api_general.py
@@ -251,6 +251,52 @@ def build_status(build_id):
jsonout.status_code = httpcode
return jsonout
+(a)api_ns.route("/coprs/build_detail/<build_id>/",
methods=["GET"])
+def build_detail(build_id):
+ if build_id.isdigit():
+ build = builds_logic.BuildsLogic.get(build_id).first()
+ else:
+ build = None
+
+ if build:
+ httpcode = 200
+ output = {"output": "ok",
+ "owner": build.copr.owner.name,
+ "project": build.copr.name,
+ "status": build.state}
+ else:
+ output = {"output": "notok", "error": "Invalid
build"}
+ httpcode = 404
+
+ jsonout = flask.jsonify(output)
+ jsonout.status_code = httpcode
+ return jsonout
+
+(a)api_ns.route("/coprs/cancel_build/<build_id>/",
methods=["POST"])
+@api_login_required
+def cancel_build(build_id):
+ if build_id.isdigit():
+ build = builds_logic.BuildsLogic.get(build_id).first()
+ else:
+ build = None
+
+ if build:
+ try:
+ builds_logic.BuildsLogic.cancel_build(flask.g.user, build)
+ except InsufficientRightsException as e:
+ output = {'output': 'notok', 'error': str(e)}
+ httpcode = 500
+ else:
+ db.session.commit()
+ httpcode = 200
+ output = {'output': 'ok', status: "Build
canceled"}
+ else:
+ output = {"output": "notok", "error": "Invalid
build"}
+ httpcode = 404
+ jsonout = flask.jsonify(output)
+ jsonout.status_code = httpcode
+ return jsonout
+
@api_ns.route('/coprs/<username>/<coprname>/modify/',
methods=["POST"])
@api_login_required
def copr_modify(username, coprname):
@@ -361,7 +407,7 @@ def api_coprs_search_by_project(project=None):
output = {"output": "ok", "users": []}
for repo in repos:
output["repos"].append({"username": repo.owner,
- "coprname"; repo.name,
+ "coprname": repo.name,
"description": repo.description})
else:
output = {"output": "notok", "error": "Invalid
request"}