All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] toaster patchset
@ 2014-03-12 18:47 Alex DAMIAN
  2014-03-12 18:47 ` [PATCH 1/4] toaster: populate target image file table Alex DAMIAN
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Alex DAMIAN @ 2014-03-12 18:47 UTC (permalink / raw)
  To: bitbake-devel; +Cc: Amit Kumar Chaudhary, Alexandru DAMIAN, Ravi Chintakunta

From: Alexandru DAMIAN <alexandru.damian@intel.com>

This patchset consists on data collection improvement patches, and 
UI interface improvements.

Can you please pull in these changes ?

The following changes since commit fe8baaa2f533db7a1b7203476c675588923d8d45:

  runqueue: Improve sigchld handler (2014-03-12 05:55:59 -0700)

are available in the git repository at:

  git://git.yoctoproject.org/poky-contrib adamian/submission-12032014
  http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=submission-12032014

Amit Kumar Chaudhary (1):
  toaster: add errors and warnings listing

Cristiana Voicu (2):
  toaster: populate target image file table
  toaster: add license manifest path to database

Ravi Chintakunta (1):
  toaster: Add counters to filters

 lib/bb/ui/buildinfohelper.py                       | 27 +++++++
 lib/bb/ui/toasterui.py                             | 10 ++-
 lib/toaster/bldviewer/api.py                       |  1 +
 lib/toaster/bldviewer/views.py                     |  3 +-
 lib/toaster/toastergui/static/js/main.js           | 20 ++++++
 .../toastergui/templates/builddashboard.html       | 56 ++++++++++++++-
 .../toastergui/templates/filtersnippet.html        | 17 +++--
 lib/toaster/toastergui/views.py                    | 84 ++++++++++++----------
 8 files changed, 171 insertions(+), 47 deletions(-)

-- 
1.8.3.2



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/4] toaster: populate target image file table
  2014-03-12 18:47 [PATCH 0/4] toaster patchset Alex DAMIAN
@ 2014-03-12 18:47 ` Alex DAMIAN
  2014-03-12 18:47 ` [PATCH 2/4] toaster: add license manifest path to database Alex DAMIAN
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Alex DAMIAN @ 2014-03-12 18:47 UTC (permalink / raw)
  To: bitbake-devel; +Cc: Alexandru DAMIAN

From: Cristiana Voicu <cristiana.voicu@intel.com>

Using ImageFileSize Metadata event, the image output file and its
size are populated into target_image_file table.

	[YOCTO #5189]
	[YOCTO #5228]

Signed-off-by: Cristiana Voicu <cristiana.voicu@intel.com>
Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
---
 lib/bb/ui/buildinfohelper.py   | 13 +++++++++++++
 lib/bb/ui/toasterui.py         |  2 ++
 lib/toaster/bldviewer/api.py   |  1 +
 lib/toaster/bldviewer/views.py |  3 ++-
 4 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/lib/bb/ui/buildinfohelper.py b/lib/bb/ui/buildinfohelper.py
index f9b067f..1b17c1f 100644
--- a/lib/bb/ui/buildinfohelper.py
+++ b/lib/bb/ui/buildinfohelper.py
@@ -26,6 +26,7 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "toaster.toastermain.settings")
 
 import toaster.toastermain.settings as toaster_django_settings
 from toaster.orm.models import Build, Task, Recipe, Layer_Version, Layer, Target, LogMessage
+from toaster.orm.models import Target_Image_File
 from toaster.orm.models import Variable, VariableHistory
 from toaster.orm.models import Package, Package_File, Target_Installed_Package, Target_File
 from toaster.orm.models import Task_Dependency, Package_Dependency
@@ -344,6 +345,11 @@ class ORMWrapper(object):
         if (len(errormsg) > 0):
             raise Exception(errormsg)
 
+    def save_target_image_file_information(self, target_obj, file_name, file_size):
+        target_image_file = Target_Image_File.objects.create( target = target_obj,
+                            file_name = file_name,
+                            file_size = file_size)
+        target_image_file.save()
 
     def create_logmessage(self, log_information):
         assert 'build' in log_information
@@ -598,6 +604,13 @@ class BuildInfoHelper(object):
         # Save build configuration
         self.orm_wrapper.save_build_variables(build_obj, self.server.runCommand(["getAllKeysWithFlags", ["doc", "func"]])[0])
 
+    def update_target_image_file(self, event):
+        for t in self.internal_state['targets']:
+            if t.is_image == True:
+                output_files = list(event.data.viewkeys())
+                for output in output_files:
+                    if t.target in output:
+                        self.orm_wrapper.save_target_image_file_information(t, output, event.data[output])
 
     def update_build_information(self, event, errors, warnings, taskfailures):
         if 'build' in self.internal_state:
diff --git a/lib/bb/ui/toasterui.py b/lib/bb/ui/toasterui.py
index e469d93..04e0f99 100644
--- a/lib/bb/ui/toasterui.py
+++ b/lib/bb/ui/toasterui.py
@@ -241,6 +241,8 @@ def main(server, eventHandler, params ):
                     buildinfohelper.store_tasks_stats(event)
                 if event.type == "ImagePkgList":
                     buildinfohelper.store_target_package_data(event)
+                elif event.type == "ImageFileSize":
+                    buildinfohelper.update_target_image_file(event)
                 continue
 
             # ignore
diff --git a/lib/toaster/bldviewer/api.py b/lib/toaster/bldviewer/api.py
index 654864e..76d45c7 100644
--- a/lib/toaster/bldviewer/api.py
+++ b/lib/toaster/bldviewer/api.py
@@ -25,6 +25,7 @@ from django.conf.urls import patterns, include, url
 urlpatterns = patterns('bldviewer.views',
         url(r'^builds$', 'model_explorer',  {'model_name':'build'}, name='builds'),
         url(r'^targets$', 'model_explorer',  {'model_name':'target'}, name='targets'),
+        url(r'^target_image_file$', 'model_explorer',  {'model_name':'target_image_file'}, name='target_image_file'),
         url(r'^tasks$', 'model_explorer', {'model_name':'task'}, name='task'),
         url(r'^task_dependencies$', 'model_explorer',  {'model_name':'task_dependency'}, name='task_dependencies'),
         url(r'^packages$', 'model_explorer',  {'model_name':'package'}, name='package'),
diff --git a/lib/toaster/bldviewer/views.py b/lib/toaster/bldviewer/views.py
index 435bc8e..6f86379 100644
--- a/lib/toaster/bldviewer/views.py
+++ b/lib/toaster/bldviewer/views.py
@@ -25,7 +25,7 @@ from django.db.models import Q
 from django.shortcuts import render
 from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable, Target_Installed_Package
 from orm.models import Task_Dependency, Recipe_Dependency, Package, Package_File, Package_Dependency
-from orm.models import Target_Installed_Package, VariableHistory
+from orm.models import Target_Installed_Package, VariableHistory, Target_Image_File
 from django.views.decorators.cache import cache_control
 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 
@@ -159,6 +159,7 @@ def model_explorer(request, model_name):
     model_mapping = {
         'build': Build,
         'target': Target,
+        'target_image_file': Target_Image_File,
         'task': Task,
         'task_dependency': Task_Dependency,
         'package': Package,
-- 
1.8.3.2



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/4] toaster: add license manifest path to database
  2014-03-12 18:47 [PATCH 0/4] toaster patchset Alex DAMIAN
  2014-03-12 18:47 ` [PATCH 1/4] toaster: populate target image file table Alex DAMIAN
@ 2014-03-12 18:47 ` Alex DAMIAN
  2014-03-12 18:47 ` [PATCH 3/4] toaster: Add counters to filters Alex DAMIAN
  2014-03-12 18:47 ` [PATCH 4/4] toaster: add errors and warnings listing Alex DAMIAN
  3 siblings, 0 replies; 5+ messages in thread
From: Alex DAMIAN @ 2014-03-12 18:47 UTC (permalink / raw)
  To: bitbake-devel

From: Cristiana Voicu <cristiana.voicu@intel.com>

Based on image_name, the target is obtained, and the path
is added to the database.

[YOCTO #5649]

Signed-off-by: Cristiana Voicu <cristiana.voicu@intel.com>
---
 lib/bb/ui/buildinfohelper.py | 14 ++++++++++++++
 lib/bb/ui/toasterui.py       |  8 +++++---
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/lib/bb/ui/buildinfohelper.py b/lib/bb/ui/buildinfohelper.py
index 1b17c1f..8f091e8 100644
--- a/lib/bb/ui/buildinfohelper.py
+++ b/lib/bb/ui/buildinfohelper.py
@@ -93,6 +93,10 @@ class ORMWrapper(object):
         build.outcome = outcome
         build.save()
 
+    def update_target_object(self, target, license_manifest_path):
+
+        target.license_manifest_path = license_manifest_path
+        target.save()
 
     def get_update_task_object(self, task_information, must_exist = False):
         assert 'build' in task_information
@@ -616,6 +620,16 @@ class BuildInfoHelper(object):
         if 'build' in self.internal_state:
             self.orm_wrapper.update_build_object(self.internal_state['build'], errors, warnings, taskfailures)
 
+
+    def store_license_manifest_path(self, event):
+        deploy_dir = event.data['deploy_dir_image']
+        image_name =  event.data['image_name']
+        path = deploy_dir + "/licenses/" + image_name + "/"
+        for target in self.internal_state['targets']:
+            if target.target in image_name:
+                self.orm_wrapper.update_target_object(target, path)
+
+
     def store_started_task(self, event):
         assert isinstance(event, (bb.runqueue.sceneQueueTaskStarted, bb.runqueue.runQueueTaskStarted, bb.runqueue.runQueueTaskSkipped))
         assert 'taskfile' in vars(event)
diff --git a/lib/bb/ui/toasterui.py b/lib/bb/ui/toasterui.py
index 04e0f99..b2c084c 100644
--- a/lib/bb/ui/toasterui.py
+++ b/lib/bb/ui/toasterui.py
@@ -235,14 +235,16 @@ def main(server, eventHandler, params ):
             if isinstance(event, bb.event.MetadataEvent):
                 if event.type == "SinglePackageInfo":
                     buildinfohelper.store_build_package_information(event)
-                if event.type == "LayerInfo":
+                elif event.type == "LayerInfo":
                     buildinfohelper.store_layer_info(event)
-                if event.type == "BuildStatsList":
+                elif event.type == "BuildStatsList":
                     buildinfohelper.store_tasks_stats(event)
-                if event.type == "ImagePkgList":
+                elif event.type == "ImagePkgList":
                     buildinfohelper.store_target_package_data(event)
                 elif event.type == "ImageFileSize":
                     buildinfohelper.update_target_image_file(event)
+                elif event.type == "LicenseManifestPath":
+                    buildinfohelper.store_license_manifest_path(event)
                 continue
 
             # ignore
-- 
1.8.3.2



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 3/4] toaster: Add counters to filters
  2014-03-12 18:47 [PATCH 0/4] toaster patchset Alex DAMIAN
  2014-03-12 18:47 ` [PATCH 1/4] toaster: populate target image file table Alex DAMIAN
  2014-03-12 18:47 ` [PATCH 2/4] toaster: add license manifest path to database Alex DAMIAN
@ 2014-03-12 18:47 ` Alex DAMIAN
  2014-03-12 18:47 ` [PATCH 4/4] toaster: add errors and warnings listing Alex DAMIAN
  3 siblings, 0 replies; 5+ messages in thread
From: Alex DAMIAN @ 2014-03-12 18:47 UTC (permalink / raw)
  To: bitbake-devel; +Cc: Alexandru DAMIAN, Ravi Chintakunta

From: Ravi Chintakunta <ravi.chintakunta@timesys.com>

Added count to filters in Build, Tasks and Config variables.

[YOCTO #5821]

Signed-off-by: Ravi Chintakunta <ravi.chintakunta@timesys.com>
Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com>
---
 .../toastergui/templates/filtersnippet.html        | 17 +++--
 lib/toaster/toastergui/views.py                    | 81 ++++++++++++----------
 2 files changed, 58 insertions(+), 40 deletions(-)

diff --git a/lib/toaster/toastergui/templates/filtersnippet.html b/lib/toaster/toastergui/templates/filtersnippet.html
index 2a23c27..e0e1181 100644
--- a/lib/toaster/toastergui/templates/filtersnippet.html
+++ b/lib/toaster/toastergui/templates/filtersnippet.html
@@ -4,16 +4,25 @@
         <input type="hidden" name="search" value="{{request.GET.search}}"/>
         <div class="modal-header">
             <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
-            <h3>Filter {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} by '{{tc.name}}'</h3>
+            {% if search_term %}
+                 <h3>Filter {{total_count}} {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} matching '{{search_term}}' by '{{tc.name}}'</h3>
+            {% else %}
+                <h3>Filter {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} by '{{tc.name}}'</h3>
+            {% endif %}
         </div>
         <div class="modal-body">
             <p>{{f.label}}</p>
             <label class="radio">
-                <input type="radio" name="filter" {%if request.GET.filter%}{{f.options|check_filter_status:request.GET.filter}} {%else%} checked {%endif%} value="">  All {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%}
+                <input type="radio" name="filter" {%if request.GET.filter%}{{f.options|check_filter_status:request.GET.filter}} {%else%} checked {%endif%} value="">  All {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} ({{total_count}})
             </label>
             {% for option in f.options %}
-                <label class="radio">
-                    <input type="radio" name="filter" {%if request.GET.filter == option.1 %}checked{%endif%}  value="{{option.1}}"> {{option.0}}
+                {% if option.2 %}
+                    <label class="radio">
+                        <input type="radio" name="filter" {%if request.GET.filter == option.1 %}checked{%endif%}  value="{{option.1}}"> {{option.0}} ({{option.2}})
+                {% else %}
+                    <label class="radio muted">
+                        <input type="radio" name="filter" disabled {%if request.GET.filter == option.1 %}checked{%endif%}  value="{{option.1}}"> {{option.0}} ({{option.2}})
+                {% endif %}
                 </label>
             {% endfor %}
         </div>
diff --git a/lib/toaster/toastergui/views.py b/lib/toaster/toastergui/views.py
index f8c8ccd..a499c30 100644
--- a/lib/toaster/toastergui/views.py
+++ b/lib/toaster/toastergui/views.py
@@ -207,8 +207,9 @@ def builds(request):
     # boilerplate code that takes a request for an object type and returns a queryset
     # for that object type. copypasta for all needed table searches
     (filter_string, search_term, ordering_string) = _search_tuple(request, Build)
-    queryset = Build.objects.exclude(outcome = Build.IN_PROGRESS)
-    queryset = _get_queryset(Build, queryset, filter_string, search_term, ordering_string)
+    queryset_all = Build.objects.exclude(outcome = Build.IN_PROGRESS)
+    queryset_with_search = _get_queryset(Build, queryset_all, None, search_term, ordering_string)
+    queryset = _get_queryset(Build, queryset_all, filter_string, search_term, ordering_string)
 
     # retrieve the objects that will be displayed in the table; builds a paginator and gets a page range to display
     build_info = _build_page_range(Paginator(queryset, request.GET.get('count', 10)),request.GET.get('page', 1))
@@ -235,6 +236,8 @@ def builds(request):
             # TODO: common objects for all table views, adapt as needed
                 'objects' : build_info,
                 'objectname' : "builds",
+                'search_term' : search_term,
+                'total_count' : queryset_with_search.count(),
             # Specifies the display of columns for the table, appearance in "Edit columns" box, toggling default show/hide, and specifying filters for columns
                 'tablecols' : [
                 {'name': 'Outcome ',                                                # column with a single filter
@@ -248,8 +251,8 @@ def builds(request):
                  'filter' : {'class' : 'outcome',
                              'label': 'Show:',
                              'options' : [
-                                         ('Successful builds', 'outcome:' + str(Build.SUCCEEDED)),  # this is the field search expression
-                                         ('Failed builds', 'outcome:'+ str(Build.FAILED)),
+                                         ('Successful builds', 'outcome:' + str(Build.SUCCEEDED), queryset_with_search.filter(outcome=str(Build.SUCCEEDED)).count()),  # this is the field search expression
+                                         ('Failed builds', 'outcome:'+ str(Build.FAILED), queryset_with_search.filter(outcome=str(Build.FAILED)).count()),
                                          ]
                             }
                 },
@@ -271,9 +274,9 @@ def builds(request):
                  'filter' : {'class' : 'started_on',
                              'label': 'Show:',
                              'options' : [
-                                         ("Today's builds" , 'started_on__gte:'+timezone.now().strftime("%Y-%m-%d")),
-                                         ("Yesterday's builds", 'started_on__gte:'+(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d")),
-                                         ("This week's builds", 'started_on__gte:'+(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d")),
+                                         ("Today's builds" , 'started_on__gte:'+timezone.now().strftime("%Y-%m-%d"), queryset_with_search.filter(started_on__gte=timezone.now().strftime("%Y-%m-%d")).count()),
+                                         ("Yesterday's builds", 'started_on__gte:'+(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d"), queryset_with_search.filter(started_on__gte=(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d")).count()),
+                                         ("This week's builds", 'started_on__gte:'+(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d"), queryset_with_search.filter(started_on__gte=(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d")).count()),
                                          ]
                             }
                 },
@@ -284,9 +287,9 @@ def builds(request):
                  'filter' : {'class' : 'completed_on', 
                              'label': 'Show:', 
                              'options' : [
-                                         ("Today's builds", 'completed_on__gte:'+timezone.now().strftime("%Y-%m-%d")),
-                                         ("Yesterday's builds", 'completed_on__gte:'+(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d")),
-                                         ("This week's builds", 'completed_on__gte:'+(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d")),
+                                         ("Today's builds", 'completed_on__gte:'+timezone.now().strftime("%Y-%m-%d"), queryset_with_search.filter(completed_on__gte=timezone.now().strftime("%Y-%m-%d")).count()),
+                                         ("Yesterday's builds", 'completed_on__gte:'+(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d"), queryset_with_search.filter(completed_on__gte=(timezone.now()-timedelta(hours=24)).strftime("%Y-%m-%d")).count()),
+                                         ("This week's builds", 'completed_on__gte:'+(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d"), queryset_with_search.filter(completed_on__gte=(timezone.now()-timedelta(days=7)).strftime("%Y-%m-%d")).count()),
                                          ]
                             }
                 },
@@ -295,8 +298,8 @@ def builds(request):
                  'filter' : {'class' : 'failed_tasks',
                              'label': 'Show:',
                              'options' : [
-                                         ('Builds with failed tasks', 'task_build__outcome:4'),
-                                         ('Builds without failed tasks', 'task_build__outcome:NOT4'),
+                                         ('Builds with failed tasks', 'task_build__outcome:4', queryset_with_search.filter(task_build__outcome=4).count()),
+                                         ('Builds without failed tasks', 'task_build__outcome:NOT4', queryset_with_search.filter(~Q(task_build__outcome=4)).count()),
                                          ]
                             }
                 },
@@ -307,8 +310,8 @@ def builds(request):
                  'filter' : {'class' : 'errors_no', 
                              'label': 'Show:', 
                              'options' : [
-                                         ('Builds with errors', 'errors_no__gte:1'),
-                                         ('Builds without errors', 'errors_no:0'),
+                                         ('Builds with errors', 'errors_no__gte:1', queryset_with_search.filter(errors_no__gte=1).count()),
+                                         ('Builds without errors', 'errors_no:0', queryset_with_search.filter(errors_no=0).count()),
                                          ]
                             }
                 },
@@ -319,8 +322,8 @@ def builds(request):
                  'filter' : {'class' : 'warnings_no', 
                              'label': 'Show:', 
                              'options' : [
-                                         ('Builds with warnings','warnings_no__gte:1'),
-                                         ('Builds without warnings','warnings_no:0'),
+                                         ('Builds with warnings','warnings_no__gte:1', queryset_with_search.filter(warnings_no__gte=1).count()),
+                                         ('Builds without warnings','warnings_no:0', queryset_with_search.filter(warnings_no=0).count()),
                                          ]
                             }
                 },
@@ -492,8 +495,9 @@ def tasks_common(request, build_id, variant):
     if retval:
         return _redirect_parameters( variant, request.GET, mandatory_parameters, build_id = build_id)
     (filter_string, search_term, ordering_string) = _search_tuple(request, Task)
-    queryset = Task.objects.filter(build=build_id, order__gt=0)
-    queryset = _get_queryset(Task, queryset, filter_string, search_term, ordering_string)
+    queryset_all = Task.objects.filter(build=build_id, order__gt=0)
+    queryset_with_search = _get_queryset(Task, queryset_all, None , search_term, ordering_string)
+    queryset = _get_queryset(Task, queryset_all, filter_string, search_term, ordering_string)
 
     tasks = _build_page_range(Paginator(queryset, request.GET.get('count', 100)),request.GET.get('page', 1))
 
@@ -537,8 +541,8 @@ def tasks_common(request, build_id, variant):
                    'class' : 'executed',
                    'label': 'Show:',
                    'options' : [
-                               ('Executed Tasks', 'task_executed:1'),
-                               ('Not Executed Tasks', 'task_executed:0'),
+                               ('Executed Tasks', 'task_executed:1', queryset_with_search.filter(task_executed=1).count()),
+                               ('Not Executed Tasks', 'task_executed:0', queryset_with_search.filter(task_executed=0).count()),
                                ]
                    }
 
@@ -553,12 +557,12 @@ def tasks_common(request, build_id, variant):
                    'class' : 'outcome',
                    'label': 'Show:',
                    'options' : [
-                               ('Succeeded Tasks', 'outcome:%d'%Task.OUTCOME_SUCCESS),
-                               ('Failed Tasks', 'outcome:%d'%Task.OUTCOME_FAILED),
-                               ('Cached Tasks', 'outcome:%d'%Task.OUTCOME_CACHED),
-                               ('Prebuilt Tasks', 'outcome:%d'%Task.OUTCOME_PREBUILT),
-                               ('Covered Tasks', 'outcome:%d'%Task.OUTCOME_COVERED),
-                               ('Empty Tasks', 'outcome:%d'%Task.OUTCOME_EMPTY),
+                               ('Succeeded Tasks', 'outcome:%d'%Task.OUTCOME_SUCCESS, queryset_with_search.filter(outcome=Task.OUTCOME_SUCCESS).count() ),
+                               ('Failed Tasks', 'outcome:%d'%Task.OUTCOME_FAILED, queryset_with_search.filter(outcome=Task.OUTCOME_FAILED).count()),
+                               ('Cached Tasks', 'outcome:%d'%Task.OUTCOME_CACHED, queryset_with_search.filter(outcome=Task.OUTCOME_CACHED).count()),
+                               ('Prebuilt Tasks', 'outcome:%d'%Task.OUTCOME_PREBUILT, queryset_with_search.filter(outcome=Task.OUTCOME_PREBUILT).count()),
+                               ('Covered Tasks', 'outcome:%d'%Task.OUTCOME_COVERED, queryset_with_search.filter(outcome=Task.OUTCOME_COVERED).count()),
+                               ('Empty Tasks', 'outcome:%d'%Task.OUTCOME_EMPTY, queryset_with_search.filter(outcome=Task.OUTCOME_NA).count()),
                                ]
                    }
 
@@ -580,10 +584,10 @@ def tasks_common(request, build_id, variant):
                    'class' : 'cache_attempt',
                    'label': 'Show:',
                    'options' : [
-                               ('Tasks with cache attempts', 'sstate_result:%d'%Task.SSTATE_NA),
-                               ("Tasks with 'File not in cache' attempts", 'sstate_result:%d'%Task.SSTATE_MISS),
-                               ("Tasks with 'Failed' cache attempts", 'sstate_result:%d'%Task.SSTATE_FAILED),
-                               ("Tasks with 'Succeeded' cache attempts", 'sstate_result:%d'%Task.SSTATE_RESTORED),
+                               ('Tasks with cache attempts', 'sstate_result:%d'%Task.SSTATE_NA, queryset_with_search.filter(sstate_result=Task.SSTATE_NA).count()),
+                               ("Tasks with 'File not in cache' attempts", 'sstate_result:%d'%Task.SSTATE_MISS,  queryset_with_search.filter(sstate_result=Task.SSTATE_MISS).count()),
+                               ("Tasks with 'Failed' cache attempts", 'sstate_result:%d'%Task.SSTATE_FAILED,  queryset_with_search.filter(sstate_result=Task.SSTATE_FAILED).count()),
+                               ("Tasks with 'Succeeded' cache attempts", 'sstate_result:%d'%Task.SSTATE_RESTORED,  queryset_with_search.filter(sstate_result=Task.SSTATE_RESTORED).count()),
                                ]
                    }
 
@@ -621,6 +625,8 @@ def tasks_common(request, build_id, variant):
                 'title': title_variant,
                 'build': Build.objects.filter(pk=build_id)[0],
                 'objects': tasks,
+                'search_term': search_term,
+                'total_count': queryset_with_search.count(),
                 'tablecols':[
                     tc_order,
                     tc_recipe,
@@ -784,6 +790,7 @@ def configvars(request, build_id):
 
     (filter_string, search_term, ordering_string) = _search_tuple(request, Variable)
     queryset = Variable.objects.filter(build=build_id).exclude(variable_name__istartswith='B_').exclude(variable_name__istartswith='do_')
+    queryset_with_search =  _get_queryset(Variable, queryset, None, search_term, ordering_string).distinct().exclude(variable_value='',vhistory__file_name__isnull=True)
     queryset = _get_queryset(Variable, queryset, filter_string, search_term, ordering_string)
     # remove duplicate records from multiple search hits in the VariableHistory table
     queryset = queryset.distinct()
@@ -811,6 +818,8 @@ def configvars(request, build_id):
                 'file_filter': file_filter,
                 'build': Build.objects.filter(pk=build_id)[0],
                 'objects' : variables,
+                'total_count':queryset_with_search.count(),
+                'search_term':search_term,
             # Specifies the display of columns for the table, appearance in "Edit columns" box, toggling default show/hide, and specifying filters for columns
                 'tablecols' : [
                 {'name': 'Variable ',
@@ -835,11 +844,11 @@ def configvars(request, build_id):
                     'class' : 'vhistory__file_name',
                     'label': 'Show:',
                     'options' : [
-                               ('Local configuration variables', 'vhistory__file_name__regex:conf/(local|bblayers).conf'),
-                               ('Machine configuration variables', 'vhistory__file_name__contains:conf/machine/'),
-                               ('Distro configuration variables', 'vhistory__file_name__contains:conf/distro/'),
-                               ('Layer configuration variables', 'vhistory__file_name__contains:conf/layer.conf'),
-                               ('bitbake.conf variables', 'vhistory__file_name__contains:/bitbake.conf'),
+                               ('Local configuration variables', 'vhistory__file_name__regex:conf/(local|bblayers).conf', queryset_with_search.filter(vhistory__file_name__contains='conf/local.conf').count()),
+                               ('Machine configuration variables', 'vhistory__file_name__contains:conf/machine/',queryset_with_search.filter(vhistory__file_name__contains='conf/machine').count()),
+                               ('Distro configuration variables', 'vhistory__file_name__contains:conf/distro/',queryset_with_search.filter(vhistory__file_name__contains='conf/distro').count()),
+                               ('Layer configuration variables', 'vhistory__file_name__contains:conf/layer.conf',queryset_with_search.filter(vhistory__file_name__contains='conf/layer.conf').count()),
+                               ('bitbake.conf variables', 'vhistory__file_name__contains:/bitbake.conf',queryset_with_search.filter(vhistory__file_name__contains='/bitbake.conf').count()),
                                ]
                              },
                 },
@@ -851,7 +860,7 @@ def configvars(request, build_id):
                     'class' : 'description',
                     'label': 'Show:',
                     'options' : [
-                               ('Variables with description', 'description__regex:.+'),
+                               ('Variables with description', 'description__regex:.+', queryset_with_search.filter(description__regex='.+').count()),
                                ]
                             },
                 },
-- 
1.8.3.2



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 4/4] toaster: add errors and warnings listing
  2014-03-12 18:47 [PATCH 0/4] toaster patchset Alex DAMIAN
                   ` (2 preceding siblings ...)
  2014-03-12 18:47 ` [PATCH 3/4] toaster: Add counters to filters Alex DAMIAN
@ 2014-03-12 18:47 ` Alex DAMIAN
  3 siblings, 0 replies; 5+ messages in thread
From: Alex DAMIAN @ 2014-03-12 18:47 UTC (permalink / raw)
  To: bitbake-devel; +Cc: Amit Kumar Chaudhary

From: Amit Kumar Chaudhary <amit@floatingpondtech.com>

Add the errors and warnings listing to the build
dashboard page.

Signed-off-by: Amit Kumar Chaudhary <amit@floatingpondtech.com>
---
 lib/toaster/toastergui/static/js/main.js           | 20 ++++++++
 .../toastergui/templates/builddashboard.html       | 56 +++++++++++++++++++++-
 lib/toaster/toastergui/views.py                    |  3 +-
 3 files changed, 76 insertions(+), 3 deletions(-)

diff --git a/lib/toaster/toastergui/static/js/main.js b/lib/toaster/toastergui/static/js/main.js
index c80f716..07aba3d 100644
--- a/lib/toaster/toastergui/static/js/main.js
+++ b/lib/toaster/toastergui/static/js/main.js
@@ -91,3 +91,23 @@ $(document).ready(function() {
     });
 
 });
+
+$(document).ready(function() {
+    //toggle the errors and warnings sections
+    $('.show-errors').click(function() {
+        $('#collapse-errors').addClass('in');
+    });
+    $('.toggle-errors').click(function() {
+        $('#collapse-errors').toggleClass('in');
+    });
+    $('.show-warnings').click(function() {
+        $('#collapse-warnings').addClass('in');
+    });
+    $('.toggle-warnings').click(function() {
+        $('#collapse-warnings').toggleClass('in');
+    });
+    //show warnings section when requested from the previous page
+    if (location.href.search('#warnings') > -1) {
+        $('#collapse-warnings').addClass('in');
+    }
+});
diff --git a/lib/toaster/toastergui/templates/builddashboard.html b/lib/toaster/toastergui/templates/builddashboard.html
index b6506c7..763a28d 100644
--- a/lib/toaster/toastergui/templates/builddashboard.html
+++ b/lib/toaster/toastergui/templates/builddashboard.html
@@ -18,10 +18,10 @@
   <div class="alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}">
     <div class="row-fluid lead">
             <span class="pull-left"><strong>{%if build.outcome == build.SUCCEEDED%}Completed{%elif build.outcome == build.FAILED%}Failed{%else%}{%endif%}</strong> {{build.completed_on|date:"d/m/y H:i"}} with </span>{%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}{% if  build.errors_no %}
-            <span class="span2"><i class="icon-minus-sign red"></i><strong><a href="{%url 'builddashboard' build.pk%}" class="error"> {{build.errors_no}} error{{build.errors_no|pluralize}}</a></strong></span>
+            <span class="span2"><i class="icon-minus-sign red"></i><strong><a href="#errors" class="error"> {{build.errors_no}} error{{build.errors_no|pluralize}}</a></strong></span>
 {% endif %}
 {% if  build.warnings_no %}
-            <span class="span2"><i class="icon-warning-sign yellow"></i><strong><a href="{%url 'builddashboard' build.pk%}" class="warning"> {{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a></strong></span>
+            <span class="span2"><i class="icon-warning-sign yellow"></i><strong><a href="#warnings" class="warning"> {{build.warnings_no}} warning{{build.warnings_no|pluralize}}</a></strong></span>
 {% endif %}
             <span class="pull-right">Build time: <a href="build-time.html">{{ build.timespent|sectohms }}</a></span>
 {%endif%}
@@ -29,6 +29,32 @@
   </div>
 </div>
 
+{% if build.errors_no %}
+<div class="accordion span10 pull-right" id="errors">
+  <div class="accordion-group">
+    <div class="accordion-heading">
+      <a class="accordion-toggle error toggle-errors">
+         <h2 id="error-toggle">
+           <i class="icon-minus-sign"></i>
+           {{build.errors_no}} error{{build.errors_no|pluralize}}
+         </h2>
+      </a>
+    </div>
+    <div class="accordion-body collapse in" id="collapse-errors">
+      <div class="accordion-inner">
+        <div class="span10">
+          {% for error in logmessages %}{% if error.level == 2 %}
+            <div class="alert alert-error">
+              <pre>{{error.message}}</pre>
+            </div>
+          {% endif %}{% endfor %}
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+{% endif %}
+
 {%if build.outcome == build.SUCCEEDED%}
 <!-- built images -->
 <div class="row-fluid span10 pull-right">
@@ -71,4 +97,30 @@
     </div>
 </div>
 
+{% if build.warnings_no %}
+<div class="accordion span10 pull-right" id="warnings">
+  <div class="accordion-group">
+    <div class="accordion-heading">
+      <a class="accordion-toggle warning toggle-warnings">
+        <h2 id="warning-toggle">
+          <i class="icon-warning-sign"></i>
+          {{build.warnings_no}} warning{{build.warnings_no|pluralize}}
+        </h2>
+      </a>
+    </div>
+    <div class="accordion-body collapse" id="collapse-warnings">
+      <div class="accordion-inner">
+        <div class="span10">
+          {% for warning in logmessages %}{% if warning.level == 1 %}
+            <div class="alert alert-warning">
+              <pre>{{warning.message}}</pre>
+            </div>
+          {% endif %}{% endfor %}
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+{% endif %}
+
 {% endblock %}
diff --git a/lib/toaster/toastergui/views.py b/lib/toaster/toastergui/views.py
index a499c30..7f61ade 100644
--- a/lib/toaster/toastergui/views.py
+++ b/lib/toaster/toastergui/views.py
@@ -356,7 +356,8 @@ def builddashboard(request, build_id):
         return redirect(builds)
     context = {
             'build' : Build.objects.filter(pk=build_id)[0],
-            'recipecount' : Recipe.objects.filter(layer_version__id__in=Layer_Version.objects.filter(build=build_id)).count()
+            'recipecount' : Recipe.objects.filter(layer_version__id__in=Layer_Version.objects.filter(build=build_id)).count(),
+            'logmessages' : LogMessage.objects.filter(build=build_id),
     }
     return render(request, template, context)
 
-- 
1.8.3.2



^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-03-12 18:47 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-03-12 18:47 [PATCH 0/4] toaster patchset Alex DAMIAN
2014-03-12 18:47 ` [PATCH 1/4] toaster: populate target image file table Alex DAMIAN
2014-03-12 18:47 ` [PATCH 2/4] toaster: add license manifest path to database Alex DAMIAN
2014-03-12 18:47 ` [PATCH 3/4] toaster: Add counters to filters Alex DAMIAN
2014-03-12 18:47 ` [PATCH 4/4] toaster: add errors and warnings listing Alex DAMIAN

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.