1{% extends "basebuilddetailpage.html" %}
2
3{% load projecttags %}
4{% load humanize %}
5
6{% 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 %}
7{% block localbreadcrumb %}
8<li><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
9<li>{{task.recipe.name}}_{{task.recipe.version}} {{task.task_name}}</li>
10{% endblock %}
11
12{% block pagedetailinfomain %}
13
14<div class="row">
15  <div class="col-md-12">
16    <div class="page-header build-data">
17        <h1><a href="{%url 'recipe' build.pk task.recipe.pk %}">{{task.recipe.name}}_{{task.recipe.version}}</a> {{task.task_name}}</h1>
18    </div>
19
20{# Outcome section #}
21<h2 {{ task|task_color:True }}>
22    {{task.get_outcome_display}}
23    <span class="glyphicon glyphicon-question-sign get-help" title="{{task.get_outcome_help}}"></i>
24</h2>
25{%if task.task_executed %}
26    {# executed tasks outcome #}
27    {% if task.logfile %}
28            <a class="btn btn-default btn-lg"
29               href="{% url 'build_artifact' build.id 'tasklogfile' task.pk %}">
30              Download task log
31            </a>
32    {% endif %}
33        {# show stack trace for failed task #}
34        {% if task.outcome == task.OUTCOME_FAILED and log_head %}
35            <h3>Python stack trace</h3>
36            <div>
37                <pre style="min-height:160px;">
38                    <code>{{log_head}}</code><a id="full-trace-show" data-target="#fulltrace" data-toggle="collapse" class="btn btn-xs">...</a>
39                    <div id="fulltrace" class="collapse" style="margin-top: -20px; height: 0px;">
40                        <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>
41            </div>
42        {% endif %}
43{% else %}
44{# not executed tasks outcome #}
45    {% if task.outcome == task.OUTCOME_PREBUILT %}
46        {% if not showing_matches %}
47            <a class="btn btn-default"
48                href="javascript:reload_params({'show_matches' : 'true'
49        })">Match to tasks in previous builds <span class="glyphicon
50glyphicon-question-sign get-help" title="This shows you a list of tasks from
51previous builds with the same signature generated from the same inputs as used
52in the prebuilt task. Any of them could be the task that generated the output
53this prebuilt task is reusing"></span></a>
54        {% elif matching_tasks %}
55            <h3 class="details">Prebuilt task could be based on
56                <span class="glyphicon glyphicon-question-sign get-help" title="This
57                    table shows a list of tasks from previous builds with the
58                same signature generated from the same inputs as used in the
59            prebuilt task. Any of them could be the task that generated the
60        output this prebuilt task is reusing"></span>
61            </h3>
62        <div class="table-responsive">
63            <table class="table table-bordered table-hover">
64                <thead>
65                    <th>
66                        <span class="glyphicon glyphicon-question-sign
67                            get-help" title="The name of the recipe to which
68                        each task applies"></span>
69                        Recipe
70                    </th>
71                    <th>
72                        <span class="glyphicon glyphicon-question-sign get-help" title="The name
73                            of the task"></span>
74                        Task
75                    </th>
76                    <th>
77                        <span class="glyphicon glyphicon-question-sign get-help" title="This
78                            value tells you if a task had to run (executed) in
79                        order to generate the task output, or if the output was
80                    provided by another task and therefore the task didn't need
81                to run (not executed)"></span>
82                        Executed
83                    </th>
84                    <th>
85                        <span class="glyphicon glyphicon-question-sign
86                            get-help" title="This column tells you if
87                        'executed' tasks succeeded or failed. The column also
88                    tells you why 'not executed' tasks did not need to
89                run"></span>
90                        Outcome
91                    </th>
92                    <th>
93                        <span class="glyphicon glyphicon-question-sign
94                            get-help" title="The date and time the build
95                        finished"></span>
96                        Build completed on
97                    </th>
98                </thead>
99                <tbody>
100                    {% for match in matching_tasks %}
101                        <tr {{ match|task_color }}>
102                            <td>
103                                {{match.recipe.name}}
104                            </td>
105                            <td>
106                                <a href="{%url "task" match.build.pk match.pk%}">{{match.task_name}}</a>
107                                {% if task.get_description %}
108                                    <span class="glyphicon
109                                        glyphicon-question-sign get-help
110                                    hover-help"
111                                title="{{task.get_description}}"></span>
112                                {% endif %}
113                            </td>
114                            <td>
115                                {{match.get_executed_display}}
116                            </td>
117                            <td>
118                                {{match.get_outcome_display}}
119                                <span class="glyphicon glyphicon-question-sign
120                                get-help hover-help"
121                            title="{{match.get_outcome_help}}"></span>
122                            </td>
123                            <td>
124                                {{match.build.completed_on|date:"d/m/y H:i"}}
125                            </td>
126                        </tr>
127                    {% endfor %}
128                </tbody>
129            </table>
130        </div>
131        {% else %}
132            <p class="alert">
133                <strong> We have found no tasks matching this prebuilt task</strong><br/>
134                The task you are looking for could belong to a build for which Toaster has no data.
135            </p>
136        {% endif %}
137    {% elif task.outcome == task.OUTCOME_COVERED %}
138        <dl class="dl-horizontal">
139            <dt>
140                <span class="glyphicon glyphicon-question-sign get-help" title="The task(s)
141                    providing the outcome of this task"></span> Task covered by
142            </dt>
143            <dd>
144                <ul class="list-unstyled">
145                  {% for t in covered_by %}
146                    <li>
147                      <a href="{%url 'task' t.build.pk t.pk%}"
148                         class="task-info"
149                        title="{{t.get_executed_display}} | {{t.get_outcome_display}}">
150                        {{t.recipe.name}}_{{t.recipe.version}}
151                        {{t.task_name}}
152                      </a>
153                    </li>
154                  {% endfor %}
155                </ul>
156            </dd>
157        </dl>
158    {%elif task.outcome == task.OUTCOME_CACHED%}
159            {% for t in task.get_related_setscene %}
160                {% if forloop.last %}
161                    <a class="btn btn-default btn-lg"
162                       href="{% url 'build_artifact' build.id "tasklogfile" t.pk %}">
163                      Download task log
164                    </a>
165                {% endif %}
166            {% endfor %}
167
168    {%elif task.outcome == task.OUTCOME_EMPTY%}
169        <div class="alert alert-info details">
170            This task is empty because it has the <code>noexec</code> flag set to <code>1</code>, or the task function is empty
171        </div>
172    {% endif %}
173{% endif %}
174
175{# Execution section #}
176    {% if task.task_executed %}
177    <h2>
178        Executed
179        <span class="glyphicon glyphicon-question-sign get-help"
180            title="'Executed' tasks are those that need to run in order to
181        generate the task output"></span>
182    {% else %}
183    <h2>
184        Not Executed
185        <span class="glyphicon glyphicon-question-sign get-help" title="'Not
186            executed' tasks don't need to run because their outcome is provided
187        by another task"></span>
188    {% endif %}
189    </h2>
190
191<dl class="dl-horizontal">
192    <dt>
193        <span class="glyphicon glyphicon-question-sign get-help" title="To make builds more
194            efficient, the build system detects changes in the 'inputs' to a
195        given task by creating a 'task signature'. If the signature changes,
196    the build system assumes the inputs have changed and the task needs to be
197rerun"></span>
198        Task inputs signature
199    </dt>
200    <dd>
201        {{task.sstate_checksum}}
202    </dd>
203    {% if task.sstate_result != task.SSTATE_NA %}
204  </dl>
205        <div class="alert alert-info">Attempting to restore output from sstate cache
206            <span class="glyphicon glyphicon-question-sign get-help
207                get-help-blue" title="The build system is searching for the
208                task output in your <code>sstate-cache</code> directory and
209                mirrors. If the build system finds the task output, it will reuse it
210                instead of building it from scratch by running the real task. Reusing the
211                task output makes the build faster"></span>
212        </div>
213        <dl class="dl-horizontal">
214            <dt>
215                <span class="glyphicon glyphicon-question-sign get-help" title="The name of the
216                    file searched for in your <code>sstate-cache</code>
217                    directory and mirrors"></span>
218                File searched for
219            </dt>
220            <dd><code>{{task.path_to_sstate_obj}}</code></dd>
221            <dt>
222                <span class="glyphicon glyphicon-question-sign get-help" title="The locations
223                    searched for the above file (i.e. your
224                    <code>sstate-cache</code> directory and any mirrors you have
225                    set up)"></span>
226                URI(s) searched
227            </dt>
228            <dd><ul class="list-unstyled">{% for uri in uri_list %}<li><code>{{uri}}</code></li>{% endfor %}</ul></dd>
229        </dl>
230    {% endif %}
231    {% if task.sstate_result == task.SSTATE_MISS %}
232        <div class="alert alert-info">
233            <strong>File not in sstate cache.</strong> Running the real task instead.
234        </div>
235    {% elif task.sstate_result == task.SSTATE_FAILED%}
236        <div class="alert alert-warning">
237            <strong>Failed</strong> to restore output from sstate cache. The file was found but could not be unpacked.
238        </div>
239        <dl class="dl-horizontal">
240            <a href="{% url 'build_artifact' build.id "tasklogfile" task.pk %}" style="margin:15px;">Download log</a>
241        </dl>
242        <div class="alert alert-info">
243            Running the real task instead.
244        </div>
245    {% elif task.sstate_result == task.SSTATE_RESTORED %}
246        <div class="alert alert-info">
247            Output <strong>successfully restored</strong> from sstate cache.
248        </div>
249    {% endif %}
250    <dl class="dl-horizontal">
251    <dt>
252        <span class="glyphicon glyphicon-question-sign get-help" title="The
253            running sequence of each task in the build"></span>
254        Task order
255    </dt>
256    <dd><a href="{%url "tasks" build.pk %}?page={{task_in_tasks_table_pg}}&limit=25#task-{{task.order}}">{{task.order}}</a></dd>
257    {% if task.task_executed %}
258        <dt>
259            <span class="glyphicon glyphicon-question-sign get-help"
260                title="Indicates if this task executes a Python or Shell
261            function(s)"></span>
262            Task script type
263        </dt>
264        <dd>{{task.get_script_type_display}}</dd>
265    {% endif %}
266<!--
267    <dt>
268        <i class="icon-question-sign get-help" title="The code executed by the task"></i>
269        Task executable output
270    </dt>
271    <dd><code>{{task.source_url}}</code></dd>
272-->
273    <dt>
274        <span class="glyphicon glyphicon-question-sign get-help" title="Task dependency chain
275            (i.e. other tasks)"></span>
276        Dependencies
277    </dt>
278    <dd>
279        <ul class="list-unstyled">
280        {% for dep in deps %}
281            <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>
282        {% empty %}
283            <li class="text-muted" style="margin-bottom: -10px;">This task has no dependencies</li>
284        {% endfor %}
285        </ul>
286    </dd>
287    <dt>
288        <span class="glyphicon glyphicon-question-sign get-help" title="Tasks that depend on this
289            task"></span>
290        Reverse dependencies
291    </dt>
292    <dd>
293        <ul class="list-unstyled">
294        {% for dep in rdeps %}
295            <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>
296        {% empty %}
297            <li class="text-muted">This task has no reverse dependencies</li>
298        {% endfor %}
299        </ul>
300</dl>
301
302{# Performance section - shown only for executed tasks #}
303{%if task.elapsed_time or task.cpu_time_user or task.cpu_time_system or task.disk_io %}
304    <h2 class="details">Performance</h2>
305{% endif %}
306    <dl class="dl-horizontal">
307        {% if task.elapsed_time %}
308        <dt>
309            <span class="glyphicon glyphicon-question-sign get-help" title="How
310                long it took the task to finish in seconds"></span>
311            Time (secs)
312        </dt>
313        <dd>{{task.elapsed_time|format_none_and_zero|floatformat:2}}</dd>
314        {% endif %}
315        {% if task.cpu_time_user > 0 %}
316        <dt>
317            <span class="glyphicon glyphicon-question-sign get-help" title="Total amount of time
318                spent executing in user mode, in seconds. Note that this time
319            can be greater than the task time due to parallel
320        execution."></span>
321            User CPU time (secs)
322        </dt>
323        <dd>{{task.cpu_time_user|format_none_and_zero|floatformat:2}}</dd>
324        {% endif %}
325        {% if task.cpu_time_system > 0 %}
326        <dt>
327            <span class="glyphicon glyphicon-question-sign get-help" title="Total amount of time
328                spent executing in kernel mode, in seconds. Note that this time
329            can be greater than the task time due to parallel
330        execution."></span>
331            System CPU time (secs)
332        </dt>
333        <dd>{{task.cpu_time_system|format_none_and_zero|floatformat:2}}</dd>
334        {% endif %}
335        {% if task.disk_io > 0 %}
336        <dt>
337            <span class="glyphicon glyphicon-question-sign get-help" title="Number of bytes
338                written to and read from the disk during the task"></span>
339            Disk I/O (bytes)
340        </dt>
341        <dd>{{task.disk_io|format_none_and_zero|intcomma}}</dd>
342        {% endif %}
343    </dl>
344
345</div>
346
347{% endblock %}
348
349