1#
2# BitBake Toaster Implementation
3#
4# Copyright (C) 2013-2017    Intel Corporation
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License version 2 as
8# published by the Free Software Foundation.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License along
16# with this program; if not, write to the Free Software Foundation, Inc.,
17# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
19from django.conf.urls import include, url
20from django.views.generic import RedirectView, TemplateView
21
22from django.http import HttpResponseBadRequest
23from toastergui import tables
24from toastergui import buildtables
25from toastergui import typeaheads
26from toastergui import api
27from toastergui import widgets
28from toastergui import views
29
30urlpatterns = [
31        # landing page
32        url(r'^landing/$', views.landing, name='landing'),
33
34        url(r'^builds/$',
35            tables.AllBuildsTable.as_view(template_name="builds-toastertable.html"),
36            name='all-builds'),
37
38        # build info navigation
39        url(r'^build/(?P<build_id>\d+)$', views.builddashboard, name="builddashboard"),
40        url(r'^build/(?P<build_id>\d+)/tasks/$',
41            buildtables.BuildTasksTable.as_view(
42                template_name="buildinfo-toastertable.html"),
43            name='tasks'),
44
45        url(r'^build/(?P<build_id>\d+)/task/(?P<task_id>\d+)$', views.task, name='task'),
46
47        url(r'^build/(?P<build_id>\d+)/recipes/$',
48            buildtables.BuiltRecipesTable.as_view(
49                template_name="buildinfo-toastertable.html"),
50            name='recipes'),
51
52        url(r'^build/(?P<build_id>\d+)/recipe/(?P<recipe_id>\d+)/active_tab/(?P<active_tab>\d{1})$', views.recipe, name='recipe'),
53
54        url(r'^build/(?P<build_id>\d+)/recipe/(?P<recipe_id>\d+)$', views.recipe, name='recipe'),
55        url(r'^build/(?P<build_id>\d+)/recipe_packages/(?P<recipe_id>\d+)$', views.recipe_packages, name='recipe_packages'),
56
57        url(r'^build/(?P<build_id>\d+)/packages/$',
58            buildtables.BuiltPackagesTable.as_view(
59                template_name="buildinfo-toastertable.html"),
60            name='packages'),
61
62        url(r'^build/(?P<build_id>\d+)/package/(?P<package_id>\d+)$', views.package_built_detail,
63                name='package_built_detail'),
64        url(r'^build/(?P<build_id>\d+)/package_built_dependencies/(?P<package_id>\d+)$',
65            views.package_built_dependencies, name='package_built_dependencies'),
66        url(r'^build/(?P<build_id>\d+)/package_included_detail/(?P<target_id>\d+)/(?P<package_id>\d+)$',
67            views.package_included_detail, name='package_included_detail'),
68        url(r'^build/(?P<build_id>\d+)/package_included_dependencies/(?P<target_id>\d+)/(?P<package_id>\d+)$',
69            views.package_included_dependencies, name='package_included_dependencies'),
70        url(r'^build/(?P<build_id>\d+)/package_included_reverse_dependencies/(?P<target_id>\d+)/(?P<package_id>\d+)$',
71            views.package_included_reverse_dependencies, name='package_included_reverse_dependencies'),
72
73        url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)$',
74            buildtables.InstalledPackagesTable.as_view(
75                template_name="target.html"),
76            name='target'),
77
78
79        url(r'^dentries/build/(?P<build_id>\d+)/target/(?P<target_id>\d+)$', views.xhr_dirinfo, name='dirinfo_ajax'),
80        url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/dirinfo$', views.dirinfo, name='dirinfo'),
81        url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/dirinfo_filepath/_(?P<file_path>(?:/[^/\n]+)*)$', views.dirinfo, name='dirinfo_filepath'),
82        url(r'^build/(?P<build_id>\d+)/configuration$', views.configuration, name='configuration'),
83        url(r'^build/(?P<build_id>\d+)/configvars$', views.configvars, name='configvars'),
84        url(r'^build/(?P<build_id>\d+)/buildtime$',
85            buildtables.BuildTimeTable.as_view(
86                template_name="buildinfo-toastertable.html"),
87            name='buildtime'),
88
89        url(r'^build/(?P<build_id>\d+)/cputime$',
90            buildtables.BuildCPUTimeTable.as_view(
91                template_name="buildinfo-toastertable.html"),
92            name='cputime'),
93
94        url(r'^build/(?P<build_id>\d+)/diskio$',
95            buildtables.BuildIOTable.as_view(
96                template_name="buildinfo-toastertable.html"),
97            name='diskio'),
98
99        # image information dir
100        url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/packagefile/(?P<packagefile_id>\d+)$',
101             views.image_information_dir, name='image_information_dir'),
102
103        # build download artifact
104        url(r'^build/(?P<build_id>\d+)/artifact/(?P<artifact_type>\w+)/id/(?P<artifact_id>\w+)', views.build_artifact, name="build_artifact"),
105
106        # project URLs
107        url(r'^newproject/$', views.newproject, name='newproject'),
108
109        url(r'^projects/$',
110            tables.ProjectsTable.as_view(template_name="projects-toastertable.html"),
111            name='all-projects'),
112
113        url(r'^project/(?P<pid>\d+)/$', views.project, name='project'),
114        url(r'^project/(?P<pid>\d+)/configuration$', views.projectconf, name='projectconf'),
115        url(r'^project/(?P<pid>\d+)/builds/$',
116            tables.ProjectBuildsTable.as_view(template_name="projectbuilds-toastertable.html"),
117            name='projectbuilds'),
118
119        url(r'^newproject_specific/(?P<pid>\d+)/$', views.newproject_specific, name='newproject_specific'),
120        url(r'^project_specific/(?P<pid>\d+)/$', views.project_specific, name='project_specific'),
121        url(r'^landing_specific/(?P<pid>\d+)/$', views.landing_specific, name='landing_specific'),
122        url(r'^landing_specific_cancel/(?P<pid>\d+)/$', views.landing_specific_cancel, name='landing_specific_cancel'),
123
124        # the import layer is a project-specific functionality;
125        url(r'^project/(?P<pid>\d+)/importlayer$', views.importlayer, name='importlayer'),
126
127        # the table pages that have been converted to ToasterTable widget
128        url(r'^project/(?P<pid>\d+)/machines/$',
129            tables.MachinesTable.as_view(template_name="generic-toastertable-page.html"),
130            name="projectmachines"),
131
132        url(r'^project/(?P<pid>\d+)/softwarerecipes/$',
133            tables.SoftwareRecipesTable.as_view(template_name="generic-toastertable-page.html"),
134            name="projectsoftwarerecipes"),
135
136        url(r'^project/(?P<pid>\d+)/images/$',
137            tables.ImageRecipesTable.as_view(template_name="generic-toastertable-page.html"), name="projectimagerecipes"),
138
139        url(r'^project/(?P<pid>\d+)/customimages/$',
140            tables.CustomImagesTable.as_view(template_name="generic-toastertable-page.html"), name="projectcustomimages"),
141
142        url(r'^project/(?P<pid>\d+)/newcustomimage/$',
143            tables.NewCustomImagesTable.as_view(template_name="newcustomimage.html"),
144            name="newcustomimage"),
145
146        url(r'^project/(?P<pid>\d+)/layers/$',
147            tables.LayersTable.as_view(template_name="generic-toastertable-page.html"),
148            name="projectlayers"),
149
150        url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)$',
151            views.layerdetails, name='layerdetails'),
152
153        url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)/recipes/$',
154            tables.LayerRecipesTable.as_view(template_name="generic-toastertable-page.html"),
155            { 'table_name': tables.LayerRecipesTable.__name__.lower(),
156              'title' : 'All recipes in layer' },
157             name=tables.LayerRecipesTable.__name__.lower()),
158
159        url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)/machines/$',
160            tables.LayerMachinesTable.as_view(template_name="generic-toastertable-page.html"),
161            { 'table_name': tables.LayerMachinesTable.__name__.lower(),
162              'title' : 'All machines in layer' },
163            name=tables.LayerMachinesTable.__name__.lower()),
164
165
166        url(r'^project/(?P<pid>\d+)/distros/$',
167            tables.DistrosTable.as_view(template_name="generic-toastertable-page.html"),
168            name="projectdistros"),
169
170
171        url(r'^project/(?P<pid>\d+)/customrecipe/(?P<custrecipeid>\d+)/selectpackages/$',
172            tables.SelectPackagesTable.as_view(), name="recipeselectpackages"),
173
174
175        url(r'^project/(?P<pid>\d+)/customrecipe/(?P<custrecipeid>\d+)$',
176            tables.SelectPackagesTable.as_view(template_name="customrecipe.html"),
177            name="customrecipe"),
178
179        url(r'^project/(?P<pid>\d+)/customrecipe/(?P<recipe_id>\d+)/download$',
180            views.customrecipe_download,
181            name="customrecipedownload"),
182
183        url(r'^project/(?P<pid>\d+)/recipe/(?P<recipe_id>\d+)$',
184            tables.PackagesTable.as_view(template_name="recipedetails.html"),
185            name="recipedetails"),
186
187        # typeahead api end points
188        url(r'^xhr_typeahead/(?P<pid>\d+)/layers$',
189            typeaheads.LayersTypeAhead.as_view(), name='xhr_layerstypeahead'),
190        url(r'^xhr_typeahead/(?P<pid>\d+)/machines$',
191            typeaheads.MachinesTypeAhead.as_view(), name='xhr_machinestypeahead'),
192        url(r'^xhr_typeahead/(?P<pid>\d+)/recipes$',
193            typeaheads.RecipesTypeAhead.as_view(), name='xhr_recipestypeahead'),
194        url(r'^xhr_typeahead/projects$',
195            typeaheads.ProjectsTypeAhead.as_view(), name='xhr_projectstypeahead'),
196        url(r'^xhr_typeahead/gitrev$',
197            typeaheads.GitRevisionTypeAhead.as_view(),
198            name='xhr_gitrevtypeahead'),
199
200        url(r'^xhr_typeahead/(?P<pid>\d+)/distros$',
201            typeaheads.DistrosTypeAhead.as_view(), name='xhr_distrostypeahead'),
202
203        url(r'^xhr_testreleasechange/(?P<pid>\d+)$', views.xhr_testreleasechange,
204            name='xhr_testreleasechange'),
205        url(r'^xhr_configvaredit/(?P<pid>\d+)$', views.xhr_configvaredit,
206            name='xhr_configvaredit'),
207
208        url(r'^xhr_layer/(?P<pid>\d+)/(?P<layerversion_id>\d+)$',
209            api.XhrLayer.as_view(),
210            name='xhr_layer'),
211
212        url(r'^xhr_layer/(?P<pid>\d+)$',
213            api.XhrLayer.as_view(),
214            name='xhr_layer'),
215
216        # JS Unit tests
217        url(r'^js-unit-tests/$', views.jsunittests, name='js-unit-tests'),
218
219        # image customisation functionality
220        url(r'^xhr_customrecipe/(?P<recipe_id>\d+)'
221            '/packages/(?P<package_id>\d+|)$',
222            api.XhrCustomRecipePackages.as_view(),
223            name='xhr_customrecipe_packages'),
224
225        url(r'^xhr_customrecipe/(?P<recipe_id>\d+)/packages/$',
226            api.XhrCustomRecipePackages.as_view(),
227            name='xhr_customrecipe_packages'),
228
229        url(r'^xhr_customrecipe/(?P<recipe_id>\d+)$',
230            api.XhrCustomRecipeId.as_view(),
231            name='xhr_customrecipe_id'),
232
233        url(r'^xhr_customrecipe/',
234            api.XhrCustomRecipe.as_view(),
235            name='xhr_customrecipe'),
236
237        url(r'^xhr_buildrequest/project/(?P<pid>\d+)$',
238            api.XhrBuildRequest.as_view(),
239            name='xhr_buildrequest'),
240
241        url(r'^xhr_projectupdate/project/(?P<pid>\d+)$',
242            api.XhrProjectUpdate.as_view(),
243            name='xhr_projectupdate'),
244
245        url(r'^xhr_setdefaultimage/project/(?P<pid>\d+)$',
246            api.XhrSetDefaultImageUrl.as_view(),
247            name='xhr_setdefaultimage'),
248
249        url(r'xhr_project/(?P<project_id>\d+)$',
250            api.XhrProject.as_view(),
251            name='xhr_project'),
252
253        url(r'xhr_build/(?P<build_id>\d+)$',
254            api.XhrBuild.as_view(),
255            name='xhr_build'),
256
257        url(r'^mostrecentbuilds$', widgets.MostRecentBuildsView.as_view(),
258            name='most_recent_builds'),
259
260        # JSON data for aggregators
261        url(r'^api/builds$', views.json_builds, name='json_builds'),
262        url(r'^api/building$', views.json_building, name='json_building'),
263        url(r'^api/build/(?P<build_id>\d+)$', views.json_build, name='json_build'),
264
265        # default redirection
266        url(r'^$', RedirectView.as_view(url='landing', permanent=True)),
267]
268