diff options
author | Elliot Smith <elliot.smith@intel.com> | 2016-07-12 15:54:50 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-07-19 08:56:45 +0100 |
commit | f6bba0ff254d5ed3163151d4b938f3a43c9acb0a (patch) | |
tree | c2f255b6b6f12607eaaf94dab53f93efc1a2b828 /lib | |
parent | 44375d0c2a88e0070b8067c9285b89c54eaf3152 (diff) | |
download | bitbake-contrib-f6bba0ff254d5ed3163151d4b938f3a43c9acb0a.tar.gz |
toaster: use has_images() methods to display images correctly
In the build dashboard, we had issues with showing images correctly,
as we were using the is_image property of targets to determine
whether a target would have image files. This property can
be set to True if a target refers to an image recipe
(e.g. "core-image-minimal"), even if the task used in the build
didn't produce any image files.
By adding has_images() methods to the Target and Build objects,
which count associated Target_Image_File objects,
we can correctly determine whether a target has image files
associated with it, and if any of the targets for a build has
image files. This means that we can screen out the left-hand
"Images" menu options for builds which contained image-related
targets (e.g. "core-image-minimal") but which didn't produce
any images (e.g. "rootfs" task).
[YOCTO #9500]
[YOCTO #9784]
Signed-off-by: Elliot Smith <elliot.smith@intel.com>
Signed-off-by: bavery <brian.avery@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/toaster/orm/models.py | 28 | ||||
-rw-r--r-- | lib/toaster/toastergui/templates/basebuildpage.html | 8 | ||||
-rwxr-xr-x | lib/toaster/toastergui/views.py | 9 |
3 files changed, 33 insertions, 12 deletions
diff --git a/lib/toaster/orm/models.py b/lib/toaster/orm/models.py index 61f6a2072..0443a4589 100644 --- a/lib/toaster/orm/models.py +++ b/lib/toaster/orm/models.py @@ -436,17 +436,32 @@ class Build(models.Model): eta += ((eta - self.started_on)*(100-completeper))/completeper return eta + def has_images(self): + """ + Returns True if at least one of the targets for this build has an + image file associated with it, False otherwise + """ + targets = Target.objects.filter(build_id=self.id) + has_images = False + for target in targets: + if target.has_images(): + has_images = True + break + return has_images + def get_image_file_extensions(self): """ - Get list of file name extensions for images produced by this build; + Get string of file name extensions for images produced by this build; note that this is the actual list of extensions stored on Target objects for this build, and not the value of IMAGE_FSTYPES. + + Returns comma-separated string, e.g. "vmdk, ext4" """ extensions = [] targets = Target.objects.filter(build_id = self.id) for target in targets: - if (not target.is_image): + if not target.is_image: continue target_image_files = Target_Image_File.objects.filter( @@ -739,6 +754,12 @@ class Target(models.Model): sdk_file.target = self sdk_file.save() + def has_images(self): + """ + Returns True if this target has one or more image files attached to it. + """ + return self.target_image_file_set.all().count() > 0 + # kernel artifacts for a target: bzImage and modules* class TargetKernelFile(models.Model): target = models.ForeignKey(Target) @@ -775,6 +796,9 @@ class Target_Image_File(models.Model): @property def suffix(self): + """ + Suffix for image file, minus leading "." + """ for suffix in Target_Image_File.SUFFIXES: if self.file_name.endswith(suffix): return suffix diff --git a/lib/toaster/toastergui/templates/basebuildpage.html b/lib/toaster/toastergui/templates/basebuildpage.html index 856259a69..e9927ebba 100644 --- a/lib/toaster/toastergui/templates/basebuildpage.html +++ b/lib/toaster/toastergui/templates/basebuildpage.html @@ -33,7 +33,7 @@ $("#build-menu li a").each(function(){ /* Set the page active state in the Build menu */ - var currentUrl = window.location.href.split('?')[0]; + var currentUrl = window.location.href.split('?')[0]; if (currentUrl === $(this).prop("href")){ $(this).parent().addClass("active"); } else { @@ -62,11 +62,13 @@ {% endif %} > <a href="{% url 'builddashboard' build.pk %}">Build summary</a> </li> - {% if build.target_set.all.0.is_image and build.outcome == 0 %} + {% if build.has_images and build.outcome == build.SUCCEEDED %} <li class="nav-header">Images</li> {% block nav-target %} {% for t in build.get_sorted_target_list %} - <li id="menu-{{t.target}}"><a href="{% url 'target' build.pk t.pk %}">{{t.target}}</a><li> + {% if t.has_images %} + <li id="menu-{{t.target}}"><a href="{% url 'target' build.pk t.pk %}">{{t.target}}</a><li> + {% endif %} {% endfor %} {% endblock %} {% endif %} diff --git a/lib/toaster/toastergui/views.py b/lib/toaster/toastergui/views.py index a82a261e0..02caf54d5 100755 --- a/lib/toaster/toastergui/views.py +++ b/lib/toaster/toastergui/views.py @@ -471,19 +471,14 @@ def builddashboard( request, build_id ): recipeCount = Recipe.objects.filter( layer_version__id__in = layerVersionId ).count( ); tgts = Target.objects.filter( build_id = build_id ).order_by( 'target' ); - ## # set up custom target list with computed package and image data - # - targets = [ ] ntargets = 0 - hasImages = False + targetHasNoImages = False for t in tgts: elem = { } elem[ 'target' ] = t - if t.is_image: - hasImages = True npkg = 0 pkgsz = 0 package = None @@ -533,7 +528,7 @@ def builddashboard( request, build_id ): context = { 'build' : build, 'project' : build.project, - 'hasImages' : hasImages, + 'hasImages' : build.has_images(), 'ntargets' : ntargets, 'targets' : targets, 'recipecount' : recipeCount, |