| {% extends "basebuilddetailpage.html" %} |
| |
| {% load projecttags %} |
| {% load humanize %} |
| |
| {% block title %} {{task.recipe.name}}_{{task.recipe.version}} {{task.task_name}} - {{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}} - {{build.project.name}} - Toaster {% endblock %} |
| {% block localbreadcrumb %} |
| <li><a href="{% url 'tasks' build.pk %}">Tasks</a></li> |
| <li>{{task.recipe.name}}_{{task.recipe.version}} {{task.task_name}}</li> |
| {% endblock %} |
| |
| {% block pagedetailinfomain %} |
| |
| <div class="row"> |
| <div class="col-md-12"> |
| <div class="page-header build-data"> |
| <h1><a href="{%url 'recipe' build.pk task.recipe.pk %}">{{task.recipe.name}}_{{task.recipe.version}}</a> {{task.task_name}}</h1> |
| </div> |
| |
| {# Outcome section #} |
| <h2 {{ task|task_color:True }}> |
| {{task.get_outcome_display}} |
| <span class="glyphicon glyphicon-question-sign get-help" title="{{task.get_outcome_help}}"></i> |
| </h2> |
| {%if task.task_executed %} |
| {# executed tasks outcome #} |
| {% if task.logfile %} |
| <a class="btn btn-default btn-lg" |
| href="{% url 'build_artifact' build.id 'tasklogfile' task.pk %}"> |
| Download task log |
| </a> |
| {% endif %} |
| {# show stack trace for failed task #} |
| {% if task.outcome == task.OUTCOME_FAILED and log_head %} |
| <h3>Python stack trace</h3> |
| <div> |
| <pre style="min-height:160px;"> |
| <code>{{log_head}}</code><a id="full-trace-show" data-target="#fulltrace" data-toggle="collapse" class="btn btn-xs">...</a> |
| <div id="fulltrace" class="collapse" style="margin-top: -20px; height: 0px;"> |
| <code>{{log_body}}</code><br><a id="full-trace-hide" class="btn btn-xs collapsed" style="font-family:Helvetica Neue" data-target="#fulltrace" data-toggle="collapse">Collapse stack trace<i class="icon-caret-up"></i></a></div></pre> |
| </div> |
| {% endif %} |
| {% else %} |
| {# not executed tasks outcome #} |
| {% if task.outcome == task.OUTCOME_PREBUILT %} |
| {% if not showing_matches %} |
| <a class="btn btn-default" |
| href="javascript:reload_params({'show_matches' : 'true' |
| })">Match to tasks in previous builds <span class="glyphicon |
| glyphicon-question-sign get-help" title="This shows you a list of tasks from |
| previous builds with the same signature generated from the same inputs as used |
| in the prebuilt task. Any of them could be the task that generated the output |
| this prebuilt task is reusing"></span></a> |
| {% elif matching_tasks %} |
| <h3 class="details">Prebuilt task could be based on |
| <span class="glyphicon glyphicon-question-sign get-help" title="This |
| table shows a list of tasks from previous builds with the |
| same signature generated from the same inputs as used in the |
| prebuilt task. Any of them could be the task that generated the |
| output this prebuilt task is reusing"></span> |
| </h3> |
| <div class="table-responsive"> |
| <table class="table table-bordered table-hover"> |
| <thead> |
| <th> |
| <span class="glyphicon glyphicon-question-sign |
| get-help" title="The name of the recipe to which |
| each task applies"></span> |
| Recipe |
| </th> |
| <th> |
| <span class="glyphicon glyphicon-question-sign get-help" title="The name |
| of the task"></span> |
| Task |
| </th> |
| <th> |
| <span class="glyphicon glyphicon-question-sign get-help" title="This |
| value tells you if a task had to run (executed) in |
| order to generate the task output, or if the output was |
| provided by another task and therefore the task didn't need |
| to run (not executed)"></span> |
| Executed |
| </th> |
| <th> |
| <span class="glyphicon glyphicon-question-sign |
| get-help" title="This column tells you if |
| 'executed' tasks succeeded or failed. The column also |
| tells you why 'not executed' tasks did not need to |
| run"></span> |
| Outcome |
| </th> |
| <th> |
| <span class="glyphicon glyphicon-question-sign |
| get-help" title="The date and time the build |
| finished"></span> |
| Build completed on |
| </th> |
| </thead> |
| <tbody> |
| {% for match in matching_tasks %} |
| <tr {{ match|task_color }}> |
| <td> |
| {{match.recipe.name}} |
| </td> |
| <td> |
| <a href="{%url "task" match.build.pk match.pk%}">{{match.task_name}}</a> |
| {% if task.get_description %} |
| <span class="glyphicon |
| glyphicon-question-sign get-help |
| hover-help" |
| title="{{task.get_description}}"></span> |
| {% endif %} |
| </td> |
| <td> |
| {{match.get_executed_display}} |
| </td> |
| <td> |
| {{match.get_outcome_display}} |
| <span class="glyphicon glyphicon-question-sign |
| get-help hover-help" |
| title="{{match.get_outcome_help}}"></span> |
| </td> |
| <td> |
| {{match.build.completed_on|date:"d/m/y H:i"}} |
| </td> |
| </tr> |
| {% endfor %} |
| </tbody> |
| </table> |
| </div> |
| {% else %} |
| <p class="alert"> |
| <strong> We have found no tasks matching this prebuilt task</strong><br/> |
| The task you are looking for could belong to a build for which Toaster has no data. |
| </p> |
| {% endif %} |
| {% elif task.outcome == task.OUTCOME_COVERED %} |
| <dl class="dl-horizontal"> |
| <dt> |
| <span class="glyphicon glyphicon-question-sign get-help" title="The task(s) |
| providing the outcome of this task"></span> Task covered by |
| </dt> |
| <dd> |
| <ul class="list-unstyled"> |
| {% for t in covered_by %} |
| <li> |
| <a href="{%url 'task' t.build.pk t.pk%}" |
| class="task-info" |
| title="{{t.get_executed_display}} | {{t.get_outcome_display}}"> |
| {{t.recipe.name}}_{{t.recipe.version}} |
| {{t.task_name}} |
| </a> |
| </li> |
| {% endfor %} |
| </ul> |
| </dd> |
| </dl> |
| {%elif task.outcome == task.OUTCOME_CACHED%} |
| {% for t in task.get_related_setscene %} |
| {% if forloop.last %} |
| <a class="btn btn-default btn-lg" |
| href="{% url 'build_artifact' build.id "tasklogfile" t.pk %}"> |
| Download task log |
| </a> |
| {% endif %} |
| {% endfor %} |
| |
| {%elif task.outcome == task.OUTCOME_EMPTY%} |
| <div class="alert alert-info details"> |
| This task is empty because it has the <code>noexec</code> flag set to <code>1</code>, or the task function is empty |
| </div> |
| {% endif %} |
| {% endif %} |
| |
| {# Execution section #} |
| {% if task.task_executed %} |
| <h2> |
| Executed |
| <span class="glyphicon glyphicon-question-sign get-help" |
| title="'Executed' tasks are those that need to run in order to |
| generate the task output"></span> |
| {% else %} |
| <h2> |
| Not Executed |
| <span class="glyphicon glyphicon-question-sign get-help" title="'Not |
| executed' tasks don't need to run because their outcome is provided |
| by another task"></span> |
| {% endif %} |
| </h2> |
| |
| <dl class="dl-horizontal"> |
| <dt> |
| <span class="glyphicon glyphicon-question-sign get-help" title="To make builds more |
| efficient, the build system detects changes in the 'inputs' to a |
| given task by creating a 'task signature'. If the signature changes, |
| the build system assumes the inputs have changed and the task needs to be |
| rerun"></span> |
| Task inputs signature |
| </dt> |
| <dd> |
| {{task.sstate_checksum}} |
| </dd> |
| {% if task.sstate_result != task.SSTATE_NA %} |
| </dl> |
| <div class="alert alert-info">Attempting to restore output from sstate cache |
| <span class="glyphicon glyphicon-question-sign get-help |
| get-help-blue" title="The build system is searching for the |
| task output in your <code>sstate-cache</code> directory and |
| mirrors. If the build system finds the task output, it will reuse it |
| instead of building it from scratch by running the real task. Reusing the |
| task output makes the build faster"></span> |
| </div> |
| <dl class="dl-horizontal"> |
| <dt> |
| <span class="glyphicon glyphicon-question-sign get-help" title="The name of the |
| file searched for in your <code>sstate-cache</code> |
| directory and mirrors"></span> |
| File searched for |
| </dt> |
| <dd><code>{{task.path_to_sstate_obj}}</code></dd> |
| <dt> |
| <span class="glyphicon glyphicon-question-sign get-help" title="The locations |
| searched for the above file (i.e. your |
| <code>sstate-cache</code> directory and any mirrors you have |
| set up)"></span> |
| URI(s) searched |
| </dt> |
| <dd><ul class="list-unstyled">{% for uri in uri_list %}<li><code>{{uri}}</code></li>{% endfor %}</ul></dd> |
| </dl> |
| {% endif %} |
| {% if task.sstate_result == task.SSTATE_MISS %} |
| <div class="alert alert-info"> |
| <strong>File not in sstate cache.</strong> Running the real task instead. |
| </div> |
| {% elif task.sstate_result == task.SSTATE_FAILED%} |
| <div class="alert alert-warning"> |
| <strong>Failed</strong> to restore output from sstate cache. The file was found but could not be unpacked. |
| </div> |
| <dl class="dl-horizontal"> |
| <a href="{% url 'build_artifact' build.id "tasklogfile" task.pk %}" style="margin:15px;">Download log</a> |
| </dl> |
| <div class="alert alert-info"> |
| Running the real task instead. |
| </div> |
| {% elif task.sstate_result == task.SSTATE_RESTORED %} |
| <div class="alert alert-info"> |
| Output <strong>successfully restored</strong> from sstate cache. |
| </div> |
| {% endif %} |
| <dl class="dl-horizontal"> |
| <dt> |
| <span class="glyphicon glyphicon-question-sign get-help" title="The |
| running sequence of each task in the build"></span> |
| Task order |
| </dt> |
| <dd><a href="{%url "tasks" build.pk %}?page={{task_in_tasks_table_pg}}&limit=25#task-{{task.order}}">{{task.order}}</a></dd> |
| {% if task.task_executed %} |
| <dt> |
| <span class="glyphicon glyphicon-question-sign get-help" |
| title="Indicates if this task executes a Python or Shell |
| function(s)"></span> |
| Task script type |
| </dt> |
| <dd>{{task.get_script_type_display}}</dd> |
| {% endif %} |
| <!-- |
| <dt> |
| <i class="icon-question-sign get-help" title="The code executed by the task"></i> |
| Task executable output |
| </dt> |
| <dd><code>{{task.source_url}}</code></dd> |
| --> |
| <dt> |
| <span class="glyphicon glyphicon-question-sign get-help" title="Task dependency chain |
| (i.e. other tasks)"></span> |
| Dependencies |
| </dt> |
| <dd> |
| <ul class="list-unstyled"> |
| {% for dep in deps %} |
| <li><a href="{%url 'task' dep.build.pk dep.pk%}" class="task-info" title="{{dep.get_executed_display}} | {{dep.get_outcome_display}}">{{dep.recipe.name}}_{{dep.recipe.version}} <span class="task-name">{{dep.task_name}}</span></a></li> |
| {% empty %} |
| <li class="text-muted" style="margin-bottom: -10px;">This task has no dependencies</li> |
| {% endfor %} |
| </ul> |
| </dd> |
| <dt> |
| <span class="glyphicon glyphicon-question-sign get-help" title="Tasks that depend on this |
| task"></span> |
| Reverse dependencies |
| </dt> |
| <dd> |
| <ul class="list-unstyled"> |
| {% for dep in rdeps %} |
| <li><a href="{%url 'task' dep.build.pk dep.pk%}" class="task-info" title="{{dep.get_executed_display}} | {{dep.get_outcome_display}}">{{dep.recipe.name}}_{{dep.recipe.version}} <span class="task-name">{{dep.task_name}}</span></a></li> |
| {% empty %} |
| <li class="text-muted">This task has no reverse dependencies</li> |
| {% endfor %} |
| </ul> |
| </dl> |
| |
| {# Performance section - shown only for executed tasks #} |
| {%if task.elapsed_time or task.cpu_time_user or task.cpu_time_system or task.disk_io %} |
| <h2 class="details">Performance</h2> |
| {% endif %} |
| <dl class="dl-horizontal"> |
| {% if task.elapsed_time %} |
| <dt> |
| <span class="glyphicon glyphicon-question-sign get-help" title="How |
| long it took the task to finish in seconds"></span> |
| Time (secs) |
| </dt> |
| <dd>{{task.elapsed_time|format_none_and_zero|floatformat:2}}</dd> |
| {% endif %} |
| {% if task.cpu_time_user > 0 %} |
| <dt> |
| <span class="glyphicon glyphicon-question-sign get-help" title="Total amount of time |
| spent executing in user mode, in seconds. Note that this time |
| can be greater than the task time due to parallel |
| execution."></span> |
| User CPU time (secs) |
| </dt> |
| <dd>{{task.cpu_time_user|format_none_and_zero|floatformat:2}}</dd> |
| {% endif %} |
| {% if task.cpu_time_system > 0 %} |
| <dt> |
| <span class="glyphicon glyphicon-question-sign get-help" title="Total amount of time |
| spent executing in kernel mode, in seconds. Note that this time |
| can be greater than the task time due to parallel |
| execution."></span> |
| System CPU time (secs) |
| </dt> |
| <dd>{{task.cpu_time_system|format_none_and_zero|floatformat:2}}</dd> |
| {% endif %} |
| {% if task.disk_io > 0 %} |
| <dt> |
| <span class="glyphicon glyphicon-question-sign get-help" title="Number of bytes |
| written to and read from the disk during the task"></span> |
| Disk I/O (bytes) |
| </dt> |
| <dd>{{task.disk_io|format_none_and_zero|intcomma}}</dd> |
| {% endif %} |
| </dl> |
| |
| </div> |
| |
| {% endblock %} |
| |