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        # the import layer is a project-specific functionality;
120        url(r'^project/(?P<pid>\d+)/importlayer$', views.importlayer, name='importlayer'),
121
122        # the table pages that have been converted to ToasterTable widget
123        url(r'^project/(?P<pid>\d+)/machines/$',
124            tables.MachinesTable.as_view(template_name="generic-toastertable-page.html"),
125            name="projectmachines"),
126
127        url(r'^project/(?P<pid>\d+)/softwarerecipes/$',
128            tables.SoftwareRecipesTable.as_view(template_name="generic-toastertable-page.html"),
129            name="projectsoftwarerecipes"),
130
131        url(r'^project/(?P<pid>\d+)/images/$',
132            tables.ImageRecipesTable.as_view(template_name="generic-toastertable-page.html"), name="projectimagerecipes"),
133
134        url(r'^project/(?P<pid>\d+)/customimages/$',
135            tables.CustomImagesTable.as_view(template_name="generic-toastertable-page.html"), name="projectcustomimages"),
136
137        url(r'^project/(?P<pid>\d+)/newcustomimage/$',
138            tables.NewCustomImagesTable.as_view(template_name="newcustomimage.html"),
139            name="newcustomimage"),
140
141        url(r'^project/(?P<pid>\d+)/layers/$',
142            tables.LayersTable.as_view(template_name="generic-toastertable-page.html"),
143            name="projectlayers"),
144
145        url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)$',
146            views.layerdetails, name='layerdetails'),
147
148        url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)/recipes/$',
149            tables.LayerRecipesTable.as_view(template_name="generic-toastertable-page.html"),
150            { 'table_name': tables.LayerRecipesTable.__name__.lower(),
151              'title' : 'All recipes in layer' },
152             name=tables.LayerRecipesTable.__name__.lower()),
153
154        url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)/machines/$',
155            tables.LayerMachinesTable.as_view(template_name="generic-toastertable-page.html"),
156            { 'table_name': tables.LayerMachinesTable.__name__.lower(),
157              'title' : 'All machines in layer' },
158            name=tables.LayerMachinesTable.__name__.lower()),
159
160
161        url(r'^project/(?P<pid>\d+)/distros/$',
162            tables.DistrosTable.as_view(template_name="generic-toastertable-page.html"),
163            name="projectdistros"),
164
165
166        url(r'^project/(?P<pid>\d+)/customrecipe/(?P<custrecipeid>\d+)/selectpackages/$',
167            tables.SelectPackagesTable.as_view(), name="recipeselectpackages"),
168
169
170        url(r'^project/(?P<pid>\d+)/customrecipe/(?P<custrecipeid>\d+)$',
171            tables.SelectPackagesTable.as_view(template_name="customrecipe.html"),
172            name="customrecipe"),
173
174        url(r'^project/(?P<pid>\d+)/customrecipe/(?P<recipe_id>\d+)/download$',
175            views.customrecipe_download,
176            name="customrecipedownload"),
177
178        url(r'^project/(?P<pid>\d+)/recipe/(?P<recipe_id>\d+)$',
179            tables.PackagesTable.as_view(template_name="recipedetails.html"),
180            name="recipedetails"),
181
182        # typeahead api end points
183        url(r'^xhr_typeahead/(?P<pid>\d+)/layers$',
184            typeaheads.LayersTypeAhead.as_view(), name='xhr_layerstypeahead'),
185        url(r'^xhr_typeahead/(?P<pid>\d+)/machines$',
186            typeaheads.MachinesTypeAhead.as_view(), name='xhr_machinestypeahead'),
187        url(r'^xhr_typeahead/(?P<pid>\d+)/recipes$',
188            typeaheads.RecipesTypeAhead.as_view(), name='xhr_recipestypeahead'),
189        url(r'^xhr_typeahead/projects$',
190            typeaheads.ProjectsTypeAhead.as_view(), name='xhr_projectstypeahead'),
191        url(r'^xhr_typeahead/gitrev$',
192            typeaheads.GitRevisionTypeAhead.as_view(),
193            name='xhr_gitrevtypeahead'),
194
195        url(r'^xhr_typeahead/(?P<pid>\d+)/distros$',
196            typeaheads.DistrosTypeAhead.as_view(), name='xhr_distrostypeahead'),
197
198        url(r'^xhr_testreleasechange/(?P<pid>\d+)$', views.xhr_testreleasechange,
199            name='xhr_testreleasechange'),
200        url(r'^xhr_configvaredit/(?P<pid>\d+)$', views.xhr_configvaredit,
201            name='xhr_configvaredit'),
202
203        url(r'^xhr_layer/(?P<pid>\d+)/(?P<layerversion_id>\d+)$',
204            api.XhrLayer.as_view(),
205            name='xhr_layer'),
206
207        url(r'^xhr_layer/(?P<pid>\d+)$',
208            api.XhrLayer.as_view(),
209            name='xhr_layer'),
210
211        # JS Unit tests
212        url(r'^js-unit-tests/$', views.jsunittests, name='js-unit-tests'),
213
214        # image customisation functionality
215        url(r'^xhr_customrecipe/(?P<recipe_id>\d+)'
216            '/packages/(?P<package_id>\d+|)$',
217            api.XhrCustomRecipePackages.as_view(),
218            name='xhr_customrecipe_packages'),
219
220        url(r'^xhr_customrecipe/(?P<recipe_id>\d+)/packages/$',
221            api.XhrCustomRecipePackages.as_view(),
222            name='xhr_customrecipe_packages'),
223
224        url(r'^xhr_customrecipe/(?P<recipe_id>\d+)$',
225            api.XhrCustomRecipeId.as_view(),
226            name='xhr_customrecipe_id'),
227
228        url(r'^xhr_customrecipe/',
229            api.XhrCustomRecipe.as_view(),
230            name='xhr_customrecipe'),
231
232        url(r'^xhr_buildrequest/project/(?P<pid>\d+)$',
233            api.XhrBuildRequest.as_view(),
234            name='xhr_buildrequest'),
235
236        url(r'xhr_project/(?P<project_id>\d+)$',
237            api.XhrProject.as_view(),
238            name='xhr_project'),
239
240        url(r'xhr_build/(?P<build_id>\d+)$',
241            api.XhrBuild.as_view(),
242            name='xhr_build'),
243
244        url(r'^mostrecentbuilds$', widgets.MostRecentBuildsView.as_view(),
245            name='most_recent_builds'),
246
247        # JSON data for aggregators
248        url(r'^api/builds$', views.json_builds, name='json_builds'),
249        url(r'^api/building$', views.json_building, name='json_building'),
250        url(r'^api/build/(?P<build_id>\d+)$', views.json_build, name='json_build'),
251
252        # default redirection
253        url(r'^$', RedirectView.as_view(url='landing', permanent=True)),
254]
255