bitbake: toaster: Remove old bldviewer application

The SimpleUI is obsolete and not maintained. It should be deleted as
there is no use to it.

[YOCTO #7709]

(Bitbake rev: 10b7c359613629bf6e3465234512990ba4742c48)

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Michael Wood 2015-05-12 15:29:45 +01:00 committed by Richard Purdie
parent c5a16235b8
commit ec8bd70b27
22 changed files with 0 additions and 7962 deletions

View File

@ -1,44 +0,0 @@
#
# ex:ts=4:sw=4:sts=4:et
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
#
# BitBake Toaster Implementation
#
# Copyright (C) 2013 Intel Corporation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
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_files$', 'model_explorer', {'model_name':'target_file'}, name='target_file'),
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'),
url(r'^package_dependencies$', 'model_explorer', {'model_name':'package_dependency'}, name='package_dependency'),
url(r'^target_packages$', 'model_explorer', {'model_name':'target_installed_package'}, name='target_packages'),
url(r'^target_installed_packages$', 'model_explorer', {'model_name':'target_installed_package'}, name='target_installed_package'),
url(r'^package_files$', 'model_explorer', {'model_name':'build_file'}, name='build_file'),
url(r'^layers$', 'model_explorer', {'model_name':'layer'}, name='layer'),
url(r'^layerversions$', 'model_explorer', {'model_name':'layerversion'}, name='layerversion'),
url(r'^recipes$', 'model_explorer', {'model_name':'recipe'}, name='recipe'),
url(r'^recipe_dependencies$', 'model_explorer', {'model_name':'recipe_dependency'}, name='recipe_dependencies'),
url(r'^variables$', 'model_explorer', {'model_name':'variable'}, name='variables'),
url(r'^variableshistory$', 'model_explorer', {'model_name':'variablehistory'}, name='variablehistory'),
url(r'^logmessages$', 'model_explorer', {'model_name':'logmessage'}, name='logmessages'),
)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -1,30 +0,0 @@
<!DOCTYPE html>
{% load static %}
<html>
<head>
<title>Toaster Simple Explorer</title>
<script src="{% static 'js/jquery-2.0.3.js' %}">
</script>
<script src="{% static 'js/bootstrap.js' %}">
</script>
<link href="{% static 'css/bootstrap.css' %}" rel="stylesheet" type="text/css">
</head>
<body style="height: 100%">
<div style="width:100%; height: 100%; position:absolute">
<div style="width: 100%; height: 3em" class="nav">
<ul class="nav nav-tabs">
<li><a href="{% url "simple-all-builds" %}">All Builds</a></li>
<li><a href="{% url "simple-all-layers" %}">All Layers</a></li>
</ul>
</div>
<div style="overflow-y:scroll; width: 100%; position: absolute; top: 3em; bottom:70px ">
{% block pagecontent %}
{% endblock %}
</div>
<div class="navbar" style="position: absolute; bottom: 0; width:100%"><br/>About Toaster | Yocto Project </div>
</div>
</body>
</html>

View File

@ -1,17 +0,0 @@
{% extends "simple_basetable.html" %}
{% block pagename %}
<ul class="nav nav-tabs" style="display: inline-block">
<li><a>Build {{build.target_set.all|join:"&nbsp;"}} at {{build.started_on}} : </a></li>
<li><a href="{% url "simple-task" build.id %}"> Tasks </a></li>
<li><a href="{% url "simple-bpackage" build.id %}"> Build Packages </a></li>
{% for t in build.target_set.all %}
{% if t.is_image %}
<li><a href="{% url "simple-tpackage" build.id t.pk %}"> Packages for {{t.target}} </a> </li>
{% endif %}
{% endfor %}
<li><a href="{% url "simple-configuration" build.id %}"> Configuration </a> </li>
</ul>
<h1>Toaster - Build {% block pagetitle %} {% endblock %}</h1>
{% endblock %}

View File

@ -1,64 +0,0 @@
{% extends "simple_base.html" %}
{% block pagecontent %}
<script>
function showhideTableColumn(i, sh) {
if (sh)
$('td:nth-child('+i+'),th:nth-child('+i+')').show();
else
$('td:nth-child('+i+'),th:nth-child('+i+')').hide();
}
function filterTableRows(test) {
if (test.length > 0) {
var r = test.split(/[ ,]+/).map(function (e) { return new RegExp(e, 'i') });
$('tr.data').map( function (i, el) {
(! r.map(function (j) { return j.test($(el).html())}).reduce(function (c, p) { return c && p;} )) ? $(el).hide() : $(el).show();
});
} else
{
$('tr.data').show();
}
}
</script>
<div style="margin-bottom: 0.5em">
{% block pagename %}
{% endblock %}
<div align="left" style="display:inline-block; width: 40%; margin-left: 2em"> Filter: <input type="search" id="filterstring" style="width: 80%" onkeyup="filterTableRows($('#filterstring').val())" autocomplete="off">
</div>
{% if hideshowcols %}
<div align="right" style="display: inline-block; width: 40%">Show/Hide columns:
{% for i in hideshowcols %}
<span>{{i.name}} <input type="checkbox" id="ct{{i.name}}" onchange="showhideTableColumn({{i.order}}, $('#ct{{i.name}}').is(':checked'))" checked autocomplete="off"></span> |
{% endfor %}
</div>
{% endif %}
</div>
<div style="display: block; float:right; margin-left: auto; margin-right:5em"><span class="pagination" style="vertical-align: top; margin-right: 3em">Showing {{objects.start_index}} to {{objects.end_index}} out of {{objects.paginator.count}} entries.&nbsp;</span>
<ul class="pagination" style="display: block-inline">
{%if objects.has_previous %}
<li><a href="?page={{objects.previous_page_number}}">&laquo;</a></li>
{%else%}
<li class="disabled"><a href="#">&laquo;</a></li>
{%endif%}
{% for i in objects.page_range %}
<li{%if i == objects.number %} class="active" {%endif%}><a href="?page={{i}}">{{i}}</a></li>
{% endfor %}
{%if objects.has_next%}
<li><a href="?page={{objects.next_page_number}}">&raquo;</a></li>
{%else%}
<li class="disabled"><a href="#">&raquo;</a></li>
{%endif%}
</ul>
</div>
<table class="table table-striped table-condensed" style="width:95%">
{% block pagetable %}
{% endblock %}
</table>
</div>
{% endblock %}

View File

@ -1,24 +0,0 @@
{% extends "simple_basebuildpage.html" %}
{% block pagetitle %}Files for package {{objects.0.bpackage.name}} {% endblock %}
{% block pagetable %}
{% if not objects %}
<p>No files were recorded for this package!</p>
{% else %}
<tr>
<th>Name</th>
<th>Size (Bytes)</th>
</tr>
{% for file in objects %}
<tr class="data">
<td>{{file.path}}</td>
<td>{{file.size}}</td>
{% endfor %}
{% endif %}
{% endblock %}

View File

@ -1,44 +0,0 @@
{% extends "simple_basebuildpage.html" %}
{% block pagetitle %}Packages{% endblock %}
{% block pagetable %}
{% if not objects %}
<p>No packages were recorded for this target!</p>
{% else %}
<tr>
<th>Name</th>
<th>Version</th>
<th>Recipe</th>
<th>Summary</th>
<th>Section</th>
<th>Description</th>
<th>Size on host disk (Bytes)</th>
<th>License</th>
<th>Dependencies List (all)</th>
</tr>
{% for package in objects %}
<tr class="data">
<td><a name="#{{package.name}}" href="{% url "simple-bfile" build.pk package.pk %}">{{package.name}} ({{package.filelist_bpackage.count}} files)</a></td>
<td>{{package.version}}-{{package.revision}}</td>
<td>{%if package.recipe%}<a href="{% url "simple-layer_versions_recipes" package.recipe.layer_version_id %}#{{package.recipe.name}}">{{package.recipe.name}}</a>{{package.package_name}}</a>{%endif%}</td>
<td>{{package.summary}}</td>
<td>{{package.section}}</td>
<td>{{package.description}}</td>
<td>{{package.size}}</td>
<td>{{package.license}}</td>
<td>
<div style="height: 3em; overflow:auto">
{% for bpd in package.package_dependencies_source.all %}
{{bpd.dep_type}}: {{bpd.depends_on.name}} <br/>
{% endfor %}
</div>
</td>
{% endfor %}
{% endif %}
{% endblock %}

View File

@ -1,43 +0,0 @@
{% extends "simple_basetable.html" %}
{% block pagename %}
<h1>Toaster - Builds</h1>
{% endblock %}
{% block pagetable %}
{% load simple_projecttags %}
<tr>
<th>Outcome</th>
<th>Started On</th>
<th>Completed On</th>
<th>Target</th>
<th>Machine</th>
<th>Time</th>
<th>Errors</th>
<th>Warnings</th>
<th>Output</th>
<th>Log</th>
<th>Bitbake Version</th>
<th>Build Name</th>
</tr>
{% for build in objects %}
<tr class="data">
<td><a href="{% url "simple-configuration" build.id %}">{{build.get_outcome_display}}</a></td>
<td>{{build.started_on}}</td>
<td>{{build.completed_on}}</td>
<td>{% for t in build.target_set.all %}{%if t.is_image %}<a href="{% url "simple-tpackage" build.id t.id %}">{% endif %}{{t.target}}{% if t.is_image %}</a>{% endif %}<br/>{% endfor %}</td>
<td>{{build.machine}}</td>
<td>{% time_difference build.started_on build.completed_on %}</td>
<td>{{build.errors_no}}:{% if build.errors_no %}{% for error in logs %}{% if error.build == build %}{% if error.level == 2 %}<p>{{error.message}}</p>{% endif %}{% endif %}{% endfor %}{% else %}None{% endif %}</td>
<td>{{build.warnings_no}}:{% if build.warnings_no %}{% for warning in logs %}{% if warning.build == build %}{% if warning.level == 1 %}<p>{{warning.message}}</p>{% endif %}{% endif %}{% endfor %}{% else %}None{% endif %}</td>
<td>TBD: determine image file list</td>
<td>{{build.cooker_log_path}}</td>
<td>{{build.bitbake_version}}</td>
<td>{{build.build_name}}</td>
</tr>
{% endfor %}
{% endblock %}

View File

@ -1,22 +0,0 @@
{% extends "simple_basebuildpage.html" %}
{% block pagetitle %}Configuration{% endblock %}
{% block pagetable %}
<tr>
<th>Name</th>
<th>Description</th>
<th>Definition history</th>
<th>Value</th>
</tr>
{% for variable in objects %}
<tr class="data">
<td>{{variable.variable_name}}</td>
<td>{% if variable.description %}{{variable.description}}{% endif %}</td>
<td>{% for vh in variable.variablehistory_set.all %}{{vh.operation}} in {{vh.file_name}}:{{vh.line_number}}<br/>{%endfor%}</td>
<td>{{variable.variable_value}}</td>
{% endfor %}
{% endblock %}

View File

@ -1,34 +0,0 @@
{% extends "simple_basetable.html" %}
{% block pagename %}
<h1>Toaster - Layers</h1>
{% endblock %}
{% block pagetable %}
{% load simple_projecttags %}
<tr>
<th>Name</th>
<th>Local Path</th>
<th>Layer Index URL</th>
<th>Known Versions</th>
</tr>
{% for layer in objects %}
<tr class="data">
<td>{{layer.name}}</td>
<td>{{layer.local_path}}</td>
<td><a href='{{layer.layer_index_url}}'>{{layer.layer_index_url}}</a></td>
<td><table>
{% for lv in layer.versions %}
<tr><td>
<a href="{% url "simple-layer_versions_recipes" lv.id %}">({{lv.priority}}){{lv.branch}}:{{lv.commit}} ({{lv.count}} recipes)</a>
</td></tr>
{% endfor %}
</table></td>
</tr>
{% endfor %}
{% endblock %}

View File

@ -1,36 +0,0 @@
{% extends "simple_basebuildpage.html" %}
{% block pagetable %}
{% if not objects %}
<p>No packages were recorded for this target!</p>
{% else %}
<tr>
<th>Name</th>
<th>Version</th>
<th>Size (Bytes)</th>
<th>Recipe</th>
<th>Depends on</th>
</tr>
{% for package in objects %}
<tr class="data">
<td><a name="#{{package.name}}">{{package.name}}</a></td>
<td>{{package.version}}</td>
<td>{{package.size}}</td>
<td>{%if package.recipe %}<a name="{{package.recipe.name}}.{{package.package_name}}">
<a href="{% url "simple-layer_versions_recipes" package.recipe.layer_version_id %}#{{package.recipe.name}}">{{package.recipe.name}}</a>{{package.package_name}}</a>{%endif%}</td>
<td>
<div style="height: 4em; overflow:auto">
{% for d in package.package_dependencies_source.all %}
<a href="#{{d.name}}">{{d.depends_on.name}}</a><br/>
{% endfor %}
</div>
</td>
{% endfor %}
{% endif %}
{% endblock %}

View File

@ -1,50 +0,0 @@
{% extends "simple_basetable.html" %}
{% block pagename %}
<ul class="nav nav-tabs" style="display: inline-block">
<li><a>Layer {{layer_version.layer.name}}&nbsp;:&nbsp;{{layer_version.branch}}&nbsp;:&nbsp;{{layer_version.commit}}&nbsp;:&nbsp;{{layer_version.priority}}</a></li>
</ul>
<h1>Toaster - Recipes for a Layer</h1>
{% endblock %}
{% block pagetable %}
{% load simple_projecttags %}
<tr>
</tr>
<th>Name</th>
<th>Version</th>
<th>Summary</th>
<th>Description</th>
<th>Section</th>
<th>License</th>
<th>Homepage</th>
<th>Bugtracker</th>
<th>File_path</th>
<th style="width: 30em">Recipe Dependency</th>
{% for recipe in objects %}
<tr class="data">
<td><a name="{{recipe.name}}">{{recipe.name}}</a></td>
<td>{{recipe.version}}</td>
<td>{{recipe.summary}}</td>
<td>{{recipe.description}}</td>
<td>{{recipe.section}}</td>
<td>{{recipe.license}}</td>
<td>{{recipe.homepage}}</td>
<td>{{recipe.bugtracker}}</td>
<td>{{recipe.file_path}}</td>
<td>
<div style="height: 5em; overflow:auto">
{% for rr in recipe.r_dependencies_recipe.all %}
<a href="#{{rr.depends_on.name}}">{{rr.depends_on.name}}</a><br/>
{% endfor %}
</div>
</td>
</tr>
{% endfor %}
{% endblock %}

View File

@ -1,71 +0,0 @@
{% extends "simple_basebuildpage.html" %}
{% block pagetitle %}Tasks{% endblock %}
{% block pagetable %}
{% if not objects %}
<p>No tasks were executed in this build!</p>
{% else %}
<tr>
<th>Order</th>
<th>Task</th>
<th>Recipe Version</th>
<th>Task Type</th>
<th>Checksum</th>
<th>Outcome</th>
<th>Message</th>
<th>Time</th>
<th>CPU usage</th>
<th>Disk I/O</th>
<th>Script type</th>
<th>Filesystem</th>
<th>Depends</th>
</tr>
{% for task in objects %}
<tr class="data">
<td>{{task.order}}</td>
<td><a name="{{task.recipe.name}}.{{task.task_name}}">
<a href="{% url "simple-layer_versions_recipes" task.recipe.layer_version_id %}#{{task.recipe.name}}">{{task.recipe.name}}</a>.{{task.task_name}}</a></td>
<td>{{task.recipe.version}}</td>
{% if task.task_executed %}
<td>Executed</td>
{% else %}
<td>Not Executed</td>
{% endif %}
<td>{{task.sstate_checksum}}</td>
<td>{{task.get_outcome_display}}{% if task.provider %}</br>(by <a href="#{{task.provider.recipe.name}}.{{task.provider.task_name}}">{{task.provider.recipe.name}}.{{task.provider.task_name}}</a>){% endif %}
{% if task.outcome == task.OUTCOME_CACHED %}{% for t in task.get_related_setscene %}
<br/>({{t.task_name}} {{t.get_outcome_display}})
{% endfor %}{%endif%}
</td>
<td><p>{{task.message}}</td>
<td>{{task.elapsed_time}}</td>
<td>{{task.cpu_usage}}</td>
<td>{{task.disk_io}}</td>
<td>{{task.get_script_type_display}}</td>
<td> <table>
<tr><td> Recipe</td><td><a target="_fileview" href="file:///{{task.recipe.file_path}}">{{task.recipe.file_path}}</a></td></tr>
<tr><td> Source</td><td><a target="_fileview" href="file:///{{task.file_name}}">{{task.file_name}}:{{task.line_number}}</a></td></tr>
<tr><td> Workdir</td><td><a target="_fileview" href="file:///{{task.work_directory}}">{{task.work_directory}}</a></td></tr>
<tr><td> Log</td><td><a target="_fileview" href="file:///{{task.logfile}}">{{task.logfile}}</a><br/></td></tr>
</table>
</td>
<td>
<div style="height: 3em; overflow:auto">
{% for tt in task.task_dependencies_task.all %}
<a href="#{{tt.depends_on.recipe.name}}.{{tt.depends_on.task_name}}">
{{tt.depends_on.recipe.name}}.{{tt.depends_on.task_name}}</a><br/>
{% endfor %}
</div>
</td>
</tr>
{% endfor %}
{% endif %}
{% endblock %}

View File

@ -1,29 +0,0 @@
#
# ex:ts=4:sw=4:sts=4:et
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
#
# BitBake Toaster Implementation
#
# Copyright (C) 2013 Intel Corporation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
from datetime import datetime
from django import template
register = template.Library()
@register.simple_tag
def time_difference(start_time, end_time):
return end_time - start_time

View File

@ -1,345 +0,0 @@
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
from django.test import TestCase
from django.test.client import Client
from django.db.models import Count, Q
from orm.models import Target, Recipe, Recipe_Dependency, Layer_Version, Target_Installed_Package
from orm.models import Build, Task, Layer, Package, Package_File, LogMessage, Variable, VariableHistory
import json, os, re, urllib, shlex
class Tests(TestCase):
# fixtures = ['orm_views_testdata.json']
def setUp(self):
raise Exception("The %s test data is not longer valid, tests disabled" % __name__)
def test_builds(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/builds')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
for item in json.loads(response['list']):
fields = item['fields']
self.assertTrue(fields["machine"] == "qemux86")
self.assertTrue(fields["distro"] == "poky")
self.assertTrue(fields["image_fstypes"] == "tar.bz2 ext3")
self.assertTrue(fields["bitbake_version"] == "1.21.1")
self.assertTrue("1.5+snapshot-" in fields["distro_version"])
self.assertEqual(fields["outcome"], 0)
self.assertEqual(fields["errors_no"], 0)
log_path = "/tmp/log/cooker/qemux86/"
self.assertTrue(log_path in fields["cooker_log_path"])
self.assertTrue(".log" in fields["cooker_log_path"])
def test_targets(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/targets')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
for item in json.loads(response['list']):
fields = item['fields']
self.assertTrue(fields["is_image"] == True)
self.assertTrue(fields["target"] == "core-image-minimal")
def test_tasks(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/tasks')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
recipe_id = self.get_recipes_id("pseudo-native")
print recipe_id
for item in json.loads(response['list']):
fields = item['fields']
if fields["build"] == 1 and fields["task_name"] == "do_populate_lic_setscene" and fields["recipe"] == recipe_id and fields["task_executed"] == True:
self.assertTrue(fields["message"] == "recipe pseudo-native-1.5.1-r4: task do_populate_lic_setscene: Succeeded")
self.assertTrue(fields["cpu_usage"] == "6.3")
self.assertTrue(fields["disk_io"] == 124)
self.assertTrue(fields["script_type"] == 2)
self.assertTrue(fields["path_to_sstate_obj"] == "")
self.assertTrue(fields["elapsed_time"] == "0.103494")
self.assertTrue("tmp/work/i686-linux/pseudo-native/1.5.1-r4/temp/log.do_populate_lic_setscene.5867" in fields["logfile"])
self.assertTrue(fields["sstate_result"] == 0)
self.assertTrue(fields["outcome"] == 0)
if fields["build"] == 1 and fields["task_name"] == "do_populate_lic" and fields["recipe"] == recipe_id and fields["task_executed"] == True:
self.assertTrue(fields["cpu_usage"] == None)
self.assertTrue(fields["disk_io"] == None)
self.assertTrue(fields["script_type"] == 2)
self.assertTrue(fields["path_to_sstate_obj"] == "")
self.assertTrue(fields["elapsed_time"] == "0")
self.assertTrue(fields["logfile"], None)
self.assertTrue(fields["sstate_result"] == 3)
self.assertTrue(fields["outcome"] == 2)
def test_layers(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/layers')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
for item in json.loads(response['list']):
fields = item['fields']
if fields["name"] == "meta-yocto-bsp":
self.assertTrue(fields["local_path"].endswith("meta-yocto-bsp"))
self.assertTrue(fields["layer_index_url"] == "http://layers.openembedded.org/layerindex/layer/meta-yocto-bsp/")
elif fields["name"] == "meta":
self.assertTrue(fields["local_path"].endswith("/meta"))
self.assertTrue(fields["layer_index_url"] == "http://layers.openembedded.org/layerindex/layer/openembedded-core/")
elif fields["name"] == "meta-yocto":
self.assertTrue(fields["local_path"].endswith("/meta-yocto"))
self.assertTrue(fields["layer_index_url"] == "http://layers.openembedded.org/layerindex/layer/meta-yocto/")
def test_layerversions(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/layerversions')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
layer_id = self.get_layer_id("meta")
find = False
for item in json.loads(response['list']):
fields = item['fields']
if fields["layer"] == layer_id:
find = True
self.assertTrue(fields["build"] == 1)
self.assertTrue(fields["priority"] == 5)
self.assertTrue(fields["branch"] == "master")
self.assertTrue(find == True)
def test_recipes(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/recipes')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
find = False
for item in json.loads(response['list']):
fields = item['fields']
if fields["name"] == "busybox":
find = True
self.assertTrue(fields["version"] == "1.21.1-r0")
self.assertTrue(fields["license"] == "GPLv2 & bzip2")
self.assertTrue(fields["file_path"].endswith("/meta/recipes-core/busybox/busybox_1.21.1.bb"))
self.assertTrue(fields["summary"] == "Tiny versions of many common UNIX utilities in a single small executable.")
self.assertTrue(fields["description"] == "BusyBox combines tiny versions of many common UNIX utilities into a single small executable. It provides minimalist replacements for most of the utilities you usually find in GNU fileutils, shellutils, etc. The utilities in BusyBox generally have fewer options than their full-featured GNU cousins; however, the options that are included provide the expected functionality and behave very much like their GNU counterparts. BusyBox provides a fairly complete POSIX environment for any small or embedded system.")
self.assertTrue(fields["bugtracker"] == "https://bugs.busybox.net/")
self.assertTrue(fields["homepage"] == "http://www.busybox.net")
self.assertTrue(fields["section"] == "base")
self.assertTrue(find == True)
def test_task_dependencies(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/task_dependencies')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
ids = self.get_task_id()
do_install = ids["do_install"]
do_compile = ids["do_compile"]
entry = False
for item in json.loads(response['list']):
fields = item['fields']
if fields["task"] == do_install and fields["depends_on"] == do_compile:
entry = True
self.assertTrue(entry == True)
def test_target_installed_package(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/target_installed_packages')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
package = self.get_package_id("udev-utils")
find = False
for item in json.loads(response['list']):
fields = item['fields']
if fields["package"] == package:
self.assertTrue(fields["target"], 1)
find = True
self.assertTrue(find, True)
def test_packages(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/packages')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(response['count'] > 0)
for item in json.loads(response['list']):
fields = item['fields']
if fields["name"] == "base-files-dev":
self.assertTrue(fields["license"] == "GPLv2")
self.assertTrue(fields["description"] == "The base-files package creates the basic system directory structure and provides a small set of key configuration files for the system. This package contains symbolic links, header files, and related items necessary for software development.")
self.assertTrue(fields["summary"] == "Miscellaneous files for the base system. - Development files")
self.assertTrue(fields["version"] == "3.0.14")
self.assertTrue(fields["build"] == 1)
self.assertTrue(fields["section"] == "devel")
self.assertTrue(fields["revision"] == "r73")
self.assertTrue(fields["size"] == 0)
self.assertTrue(fields["installed_size"] == 0)
self.assertTrue(self.get_recipe_name(fields["recipe"]) == "base-files")
def test_package_dependencies(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/package_dependencies')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
build_package = self.get_package_id("busybox")
build_package_id = self.get_package_id("busybox-syslog")
entry = False
for item in json.loads(response['list']):
fields = item['fields']
self.assertTrue(fields["target"] == 1)
if fields["package"] == build_package and fields["dep_type"] == 7 and fields["depends_on"] == build_package_id:
entry = True
self.assertTrue(entry == True)
def test_recipe_dependencies(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/recipe_dependencies')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
depends_on = self.get_recipes_id("autoconf-native")
recipe = self.get_recipes_id("ncurses")
entry = False
for item in json.loads(response['list']):
fields = item['fields']
if fields["recipe"] == recipe and fields["depends_on"] == depends_on and fields["dep_type"] == 0:
entry = True
self.assertTrue(entry == True)
def test_package_files(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/package_files')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
build_package = self.get_package_id("base-files")
entry = False
for item in json.loads(response['list']):
fields = item['fields']
if fields["path"] == "/etc/motd" and fields["package"] == build_package and fields["size"] == 0:
entry = True
self.assertTrue(entry == True)
def test_Variable(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/variables')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
for item in json.loads(response['list']):
fields = item['fields']
self.assertTrue(fields["build"] == 1)
if fields["variable_name"] == "USRBINPATH":
self.assertTrue(fields["variable_value"] == "/usr/bin")
self.assertTrue(fields["changed"] == False)
self.assertTrue(fields["description"] == "")
if fields["variable_name"] == "PREFERRED_PROVIDER_virtual/libx11":
self.assertTrue(fields["variable_value"] == "libx11")
self.assertTrue(fields["changed"] == False)
self.assertTrue(fields["description"] == "If multiple recipes provide an item, this variable determines which recipe should be given preference.")
if fields["variable_name"] == "base_libdir_nativesdk":
self.assertTrue(fields["variable_value"] == "/lib")
def test_VariableHistory(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/variableshistory')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
variable_id = self.get_variable_id("STAGING_INCDIR_NATIVE")
find = False
for item in json.loads(response['list']):
fields = item['fields']
if fields["variable"] == variable_id:
find = True
self.assertTrue(fields["file_name"] == "conf/bitbake.conf")
self.assertTrue(fields["operation"] == "set")
self.assertTrue(fields["line_number"] == 358)
self.assertTrue(find == True)
def get_task_id(self):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/tasks')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
for item in json.loads(response['list']):
fields = item['fields']
if fields["recipe"] == 7 and fields["task_name"] == "do_install":
do_install = item["pk"]
if fields["recipe"] == 7 and fields["task_name"] == "do_compile":
do_compile = item["pk"]
result = {}
result["do_install"] = do_install
result["do_compile"] = do_compile
return result
def get_recipes_id(self, value):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/recipes')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
for item in json.loads(response['list']):
fields = item['fields']
if fields["name"] == value:
return item["pk"]
return None
def get_recipe_name(self, value):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/recipes')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
for item in json.loads(response['list']):
fields = item['fields']
if item["pk"] == value:
return fields["name"]
return None
def get_layer_id(self, value):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/layers')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
for item in json.loads(response['list']):
fields = item['fields']
if fields["name"] == value:
return item["pk"]
return None
def get_package_id(self, field):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/packages')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(response['count'] > 0)
for item in json.loads(response['list']):
fields = item['fields']
if fields["name"] == field:
return item["pk"]
return None
def get_variable_id(self, field):
client = Client()
resp = client.get('http://localhost:8000/api/1.0/variables')
self.assertEqual(resp.status_code, 200)
response = json.loads(resp.content)
self.assertTrue(len(json.loads(response['list'])) > 0)
for item in json.loads(response['list']):
fields = item['fields']
if fields["variable_name"] == field:
return item["pk"]
return None

View File

@ -1,35 +0,0 @@
#
# ex:ts=4:sw=4:sts=4:et
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
#
# BitBake Toaster Implementation
#
# Copyright (C) 2013 Intel Corporation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
from django.conf.urls import patterns, include, url
from django.views.generic import RedirectView
urlpatterns = patterns('bldviewer.views',
url(r'^builds/$', 'build', name='simple-all-builds'),
url(r'^build/(?P<build_id>\d+)/task/$', 'task', name='simple-task'),
url(r'^build/(?P<build_id>\d+)/packages/$', 'bpackage', name='simple-bpackage'),
url(r'^build/(?P<build_id>\d+)/package/(?P<package_id>\d+)/files/$', 'bfile', name='simple-bfile'),
url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/packages/$', 'tpackage', name='simple-tpackage'),
url(r'^build/(?P<build_id>\d+)/configuration/$', 'configuration', name='simple-configuration'),
url(r'^layers/$', 'layer', name='simple-all-layers'),
url(r'^layerversions/(?P<layerversion_id>\d+)/recipes/.*$', 'layer_versions_recipes', name='simple-layer_versions_recipes'),
url(r'^$', RedirectView.as_view( url= 'builds/')),
)

View File

@ -1,287 +0,0 @@
#
# ex:ts=4:sw=4:sts=4:et
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
#
# BitBake Toaster Implementation
#
# Copyright (C) 2013 Intel Corporation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import operator
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, Target_Image_File, Target_File
from django.views.decorators.cache import cache_control
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def _build_page_range(paginator, index = 1):
try:
page = paginator.page(index)
except PageNotAnInteger:
page = paginator.page(1)
except EmptyPage:
page = paginator.page(paginator.num_pages)
page.page_range = [page.number]
crt_range = 0
for i in range(1,5):
if (page.number + i) <= paginator.num_pages:
page.page_range = page.page_range + [ page.number + i]
crt_range +=1
if (page.number - i) > 0:
page.page_range = [page.number -i] + page.page_range
crt_range +=1
if crt_range == 4:
break
return page
@cache_control(no_store=True)
def build(request):
template = 'simple_build.html'
logs = LogMessage.objects.all()
build_info = _build_page_range(Paginator(Build.objects.order_by("-id"), 10),request.GET.get('page', 1))
context = {'objects': build_info, 'logs': logs ,
'hideshowcols' : [
{'name': 'Output', 'order':10},
{'name': 'Log', 'order':11},
]}
return render(request, template, context)
def _find_task_revdep(task):
tp = []
for p in Task_Dependency.objects.filter(depends_on=task):
tp.append(p.task);
return tp
def _find_task_provider(task):
task_revdeps = _find_task_revdep(task)
for tr in task_revdeps:
if tr.outcome != Task.OUTCOME_COVERED:
return tr
for tr in task_revdeps:
trc = _find_task_provider(tr)
if trc is not None:
return trc
return None
def task(request, build_id):
template = 'simple_task.html'
tasks = _build_page_range(Paginator(Task.objects.filter(build=build_id, order__gt=0), 100),request.GET.get('page', 1))
for t in tasks:
if t.outcome == Task.OUTCOME_COVERED:
t.provider = _find_task_provider(t)
context = {'build': Build.objects.filter(pk=build_id)[0], 'objects': tasks}
return render(request, template, context)
def configuration(request, build_id):
template = 'simple_configuration.html'
variables = _build_page_range(Paginator(Variable.objects.filter(build=build_id), 50), request.GET.get('page', 1))
context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : variables}
return render(request, template, context)
def bpackage(request, build_id):
template = 'simple_bpackage.html'
packages = Package.objects.filter(build = build_id)
context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : packages}
return render(request, template, context)
def bfile(request, build_id, package_id):
template = 'simple_bfile.html'
files = Package_File.objects.filter(package = package_id)
context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : files}
return render(request, template, context)
def tpackage(request, build_id, target_id):
template = 'simple_package.html'
packages = map(lambda x: x.package, list(Target_Installed_Package.objects.filter(target=target_id)))
context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : packages}
return render(request, template, context)
def layer(request):
template = 'simple_layer.html'
layer_info = Layer.objects.all()
for li in layer_info:
li.versions = Layer_Version.objects.filter(layer = li)
for liv in li.versions:
liv.count = Recipe.objects.filter(layer_version__id = liv.id).count()
context = {'objects': layer_info}
return render(request, template, context)
def layer_versions_recipes(request, layerversion_id):
template = 'simple_recipe.html'
recipes = Recipe.objects.filter(layer_version__id = layerversion_id)
context = {'objects': recipes,
'layer_version' : Layer_Version.objects.filter( id = layerversion_id )[0]
}
return render(request, template, context)
#### API
import json
from django.core import serializers
from django.http import HttpResponse, HttpResponseBadRequest
def model_explorer(request, model_name):
DESCENDING = 'desc'
response_data = {}
model_mapping = {
'build': Build,
'target': Target,
'target_file': Target_File,
'target_image_file': Target_Image_File,
'task': Task,
'task_dependency': Task_Dependency,
'package': Package,
'layer': Layer,
'layerversion': Layer_Version,
'recipe': Recipe,
'recipe_dependency': Recipe_Dependency,
'package': Package,
'package_dependency': Package_Dependency,
'target_installed_package': Target_Installed_Package,
'build_file': Package_File,
'variable': Variable,
'variablehistory': VariableHistory,
'logmessage': LogMessage,
}
if model_name not in model_mapping.keys():
return HttpResponseBadRequest()
model = model_mapping[model_name]
try:
limit = int(request.GET.get('limit', 0))
except ValueError:
limit = 0
try:
offset = int(request.GET.get('offset', 0))
except ValueError:
offset = 0
ordering_string, invalid = _validate_input(request.GET.get('orderby', ''),
model)
if invalid:
return HttpResponseBadRequest()
filter_string, invalid = _validate_input(request.GET.get('filter', ''),
model)
if invalid:
return HttpResponseBadRequest()
search_term = request.GET.get('search', '')
if filter_string:
filter_terms = _get_filtering_terms(filter_string)
try:
queryset = model.objects.filter(**filter_terms)
except ValueError:
queryset = []
else:
queryset = model.objects.all()
if search_term:
queryset = _get_search_results(search_term, queryset, model)
if ordering_string and queryset:
column, order = ordering_string.split(':')
if order.lower() == DESCENDING:
queryset = queryset.order_by('-' + column)
else:
queryset = queryset.order_by(column)
if offset and limit:
queryset = queryset[offset:(offset+limit)]
elif offset:
queryset = queryset[offset:]
elif limit:
queryset = queryset[:limit]
if queryset:
response_data['count'] = queryset.count()
else:
response_data['count'] = 0
response_data['list'] = serializers.serialize('json', queryset)
return HttpResponse(json.dumps(response_data),
content_type='application/json')
def _get_filtering_terms(filter_string):
search_terms = filter_string.split(":")
keys = search_terms[0].split(',')
values = search_terms[1].split(',')
return dict(zip(keys, values))
def _validate_input(input, model):
invalid = 0
if input:
input_list = input.split(":")
# Check we have only one colon
if len(input_list) != 2:
invalid = 1
return None, invalid
# Check we have an equal number of terms both sides of the colon
if len(input_list[0].split(',')) != len(input_list[1].split(',')):
invalid = 1
return None, invalid
# Check we are looking for a valid field
valid_fields = model._meta.get_all_field_names()
for field in input_list[0].split(','):
if field not in valid_fields:
invalid = 1
return None, invalid
return input, invalid
def _get_search_results(search_term, queryset, model):
search_objects = []
for st in search_term.split(" "):
q_map = map(lambda x: Q(**{x+'__icontains': st}),
model.search_allowed_fields)
search_objects.append(reduce(operator.or_, q_map))
search_object = reduce(operator.and_, search_objects)
queryset = queryset.filter(search_object)
return queryset

View File

@ -32,8 +32,6 @@ from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# the api-s are not auto-discoverable
url(r'^api/1.0/', include('bldviewer.api')),
# Examples:
# url(r'^toaster/', include('toaster.foo.urls')),