Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : master
---------------------------------------------------------------
commit 117db82f93be38dc3db8930049bf424df1100705
Author: Adam Samalik <asamalik(a)redhat.com>
Date: Mon Aug 31 17:56:08 2015 +0200
[frontend] [dist-git] provide build failure details
---------------------------------------------------------------
dist-git/dist_git/dist_git_importer.py | 14 ++++++++++--
.../{5845661bb37d_foo.py => 3b4cfc666d14_.py} | 16 +++++++-------
frontend/coprs_frontend/coprs/helpers.py | 10 +++++++++
frontend/coprs_frontend/coprs/models.py | 6 +++++
.../templates/coprs/detail/_describe_failure.html | 21 ++++++++++++++++++++
.../coprs/templates/coprs/detail/build.html | 4 ++-
.../coprs/views/backend_ns/backend_general.py | 7 ++++++
7 files changed, 66 insertions(+), 12 deletions(-)
diff --git a/dist-git/dist_git/dist_git_importer.py
b/dist-git/dist_git/dist_git_importer.py
index 701e030..4bdcca9 100755
--- a/dist-git/dist_git/dist_git_importer.py
+++ b/dist-git/dist_git/dist_git_importer.py
@@ -236,13 +236,21 @@ class DistGitImporter(object):
log.debug("sending a response - success")
self.post_back(task.get_dict_for_frontend())
- except (PackageImportException, PackageDownloadException,
PackageQueryException):
+ except PackageImportException:
log.exception("send a response - failure during import of:
{}".format(task.package_url))
- self.post_back_safe({"task_id": task.task_id, "error":
"error"})
+ self.post_back_safe({"task_id": task.task_id, "error":
"git_import_failed"})
+
+ except PackageDownloadException:
+ log.exception("send a response - failure during download of:
{}".format(task.package_url))
+ self.post_back_safe({"task_id": task.task_id, "error":
"srpm_download_failed"})
+
+ except PackageQueryException:
+ log.exception("send a response - failure during query of:
{}".format(task.package_url))
+ self.post_back_safe({"task_id": task.task_id, "error":
"srpm_query_failed"})
except Exception:
log.exception("Unexpected error during package import")
- self.post_back_safe({"task_id": task.task_id, "error":
"error"})
+ self.post_back_safe({"task_id": task.task_id, "error":
"unknown_error"})
finally:
shutil.rmtree(tmp_root, ignore_errors=True)
diff --git a/frontend/coprs_frontend/alembic/versions/5845661bb37d_foo.py
b/frontend/coprs_frontend/alembic/versions/3b4cfc666d14_.py
similarity index 52%
copy from frontend/coprs_frontend/alembic/versions/5845661bb37d_foo.py
copy to frontend/coprs_frontend/alembic/versions/3b4cfc666d14_.py
index f37869f..b58e0d2 100644
--- a/frontend/coprs_frontend/alembic/versions/5845661bb37d_foo.py
+++ b/frontend/coprs_frontend/alembic/versions/3b4cfc666d14_.py
@@ -1,14 +1,14 @@
-"""add playgroung column
+"""empty message
-Revision ID: 5845661bb37d
-Revises: 498884ac47db
-Create Date: 2014-04-04 11:25:36.216132
+Revision ID: 3b4cfc666d14
+Revises: 22fde92cb568
+Create Date: 2015-08-31 17:17:52.396183
"""
# revision identifiers, used by Alembic.
-revision = '5845661bb37d'
-down_revision = '498884ac47db'
+revision = '3b4cfc666d14'
+down_revision = '22fde92cb568'
from alembic import op
import sqlalchemy as sa
@@ -16,11 +16,11 @@ import sqlalchemy as sa
def upgrade():
### commands auto generated by Alembic - please adjust! ###
- op.add_column('copr', sa.Column('playground', sa.Boolean(),
nullable=True))
+ op.add_column('build', sa.Column('fail_type', sa.Integer(),
default=0))
### end Alembic commands ###
def downgrade():
### commands auto generated by Alembic - please adjust! ###
- op.drop_column('copr', 'playground')
+ op.drop_column('build', 'fail_type')
### end Alembic commands ###
diff --git a/frontend/coprs_frontend/coprs/helpers.py
b/frontend/coprs_frontend/coprs/helpers.py
index 7d253af..f3406b4 100644
--- a/frontend/coprs_frontend/coprs/helpers.py
+++ b/frontend/coprs_frontend/coprs/helpers.py
@@ -97,6 +97,16 @@ class BuildSourceEnum(object):
"srpm_upload": 2} # pkg, tmp
+class FailTypeEnum(object):
+ __metaclass__ = EnumType
+ vals = {"unset": 0,
+ "unknown_error": 1,
+ "build_error": 2,
+ "git_import_failed": 3,
+ "srpm_download_failed": 4,
+ "srpm_query_failed": 5}
+
+
class Paginator(object):
def __init__(self, query, total_count, page=1,
diff --git a/frontend/coprs_frontend/coprs/models.py
b/frontend/coprs_frontend/coprs/models.py
index 00a3a32..b6044e9 100644
--- a/frontend/coprs_frontend/coprs/models.py
+++ b/frontend/coprs_frontend/coprs/models.py
@@ -349,6 +349,8 @@ class Build(db.Model, helpers.Serializer):
source_type = db.Column(db.Integer,
default=helpers.BuildSourceEnum("unset"))
# Source of the build: description in json, example: git link, srpm url, etc.
source_json = db.Column(db.Text)
+ # Type of failure: type identifier
+ fail_type = db.Column(db.Integer, default=helpers.FailTypeEnum("unset"))
# relations
user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
@@ -361,6 +363,10 @@ class Build(db.Model, helpers.Serializer):
chroots = association_proxy("build_chroots", "mock_chroot")
@property
+ def fail_type_test(self):
+ return helpers.FailTypeEnum(self.fail_type)
+
+ @property
def is_older_results_naming_used(self):
# we have changed result directory naming together with transition to dist-git
# that's why we use so strange criterion
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/_describe_failure.html
b/frontend/coprs_frontend/coprs/templates/coprs/detail/_describe_failure.html
new file mode 100644
index 0000000..f8dfefe
--- /dev/null
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/_describe_failure.html
@@ -0,0 +1,21 @@
+{% macro describe_failure(build) %}
+{% if build.fail_type %}
+ <dt>Build State:</dt>
+ <dd><span class="build-failed">failed</span></dd>
+
+ <dt>State Description:</dt>
+ <dd>
+ {% if build.fail_type_text == "unknown_error" %}
+ Unknown error.
+ {% elif build.fail_type_text == "build_error" %}
+ Build error. See logs of individual chroots for more information.
+ {% elif build.fail_type_text == "git_import_failed" %}
+ Importing SRPM into Dist Git failed.
+ {% elif build.fail_type_text == "srpm_download_failed" %}
+ Could not download the SRPM. Probably bad URL.
+ {% elif build.fail_type_text == "srpm_query_failed" %}
+ RPM query failed. The file is probably not a SRPM.
+ {% endif %}
+ </dd>
+{% endif %}
+{% endmacro %}
diff --git a/frontend/coprs_frontend/coprs/templates/coprs/detail/build.html
b/frontend/coprs_frontend/coprs/templates/coprs/detail/build.html
index 68e65f2..171f4a0 100644
--- a/frontend/coprs_frontend/coprs/templates/coprs/detail/build.html
+++ b/frontend/coprs_frontend/coprs/templates/coprs/detail/build.html
@@ -1,6 +1,7 @@
{% extends "coprs/detail.html" %}
{% from "coprs/detail/_builds_forms.html" import copr_build_cancel_form,
copr_build_repeat_form, copr_build_delete_form %}
{% from "coprs/detail/_describe_source.html" import describe_source %}
+{% from "coprs/detail/_describe_failure.html" import describe_failure %}
{% from "_helpers.html" import chroot_to_os_logo %}
{% block title %}Build {{ build.id }} in {{ build.copr.owner.name }}/{{ build.copr.name
}}{% endblock %}
{%block project_breadcrumb %}
@@ -90,7 +91,8 @@
<h3> Build Results </h3>
<dl class="dl-horizontal">
- <dt> Built Packages:</dt>
+ {{ describe_failure(build) }}
+ <dt> Built Packages:</dt>
{% if build.built_packages %}
{% for pkg in build.built_packages.split("\n"): %}
<dd>{{ pkg }}</dd>
diff --git a/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
b/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
index bfd22da..64b30d7 100644
--- a/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
+++ b/frontend/coprs_frontend/coprs/views/backend_ns/backend_general.py
@@ -88,6 +88,13 @@ def dist_git_upload_completed():
# Failed?
elif "error" in flask.request.json:
+ error_type = flask.request.json["error"]
+
+ try:
+ build.fail_type = helpers.FailTypeEnum(error_type)
+ except KeyError:
+ build.fail_type = helpers.FailTypeEnum("unknown_error")
+
for ch in build_chroots:
ch.status = helpers.StatusEnum("failed")