diff options
Diffstat (limited to 'bitbake/lib/toaster/toastergui/api.py')
-rw-r--r-- | bitbake/lib/toaster/toastergui/api.py | 101 |
1 files changed, 98 insertions, 3 deletions
diff --git a/bitbake/lib/toaster/toastergui/api.py b/bitbake/lib/toaster/toastergui/api.py index 4851047bfa..5be633ed11 100644 --- a/bitbake/lib/toaster/toastergui/api.py +++ b/bitbake/lib/toaster/toastergui/api.py | |||
@@ -20,6 +20,7 @@ | |||
20 | 20 | ||
21 | import re | 21 | import re |
22 | import logging | 22 | import logging |
23 | import json | ||
23 | from collections import Counter | 24 | from collections import Counter |
24 | 25 | ||
25 | from orm.models import Project, ProjectTarget, Build, Layer_Version | 26 | from orm.models import Project, ProjectTarget, Build, Layer_Version |
@@ -136,14 +137,17 @@ class XhrBuildRequest(View): | |||
136 | 137 | ||
137 | 138 | ||
138 | class XhrLayer(View): | 139 | class XhrLayer(View): |
139 | """ Get and Update Layer information """ | 140 | """ Delete, Get, Add and Update Layer information |
141 | |||
142 | Methods: POST DELETE PUT | ||
143 | """ | ||
140 | 144 | ||
141 | def post(self, request, *args, **kwargs): | 145 | def post(self, request, *args, **kwargs): |
142 | """ | 146 | """ |
143 | Update a layer | 147 | Update a layer |
144 | 148 | ||
145 | Entry point: /xhr_layer/<layerversion_id> | ||
146 | Method: POST | 149 | Method: POST |
150 | Entry point: /xhr_layer/<layerversion_id> | ||
147 | 151 | ||
148 | Args: | 152 | Args: |
149 | vcs_url, dirpath, commit, up_branch, summary, description, | 153 | vcs_url, dirpath, commit, up_branch, summary, description, |
@@ -201,9 +205,100 @@ class XhrLayer(View): | |||
201 | return error_response("Could not update layer version entry: %s" | 205 | return error_response("Could not update layer version entry: %s" |
202 | % e) | 206 | % e) |
203 | 207 | ||
204 | return JsonResponse({"error": "ok"}) | 208 | return error_response("ok") |
209 | |||
210 | def put(self, request, *args, **kwargs): | ||
211 | """ Add a new layer | ||
212 | |||
213 | Method: PUT | ||
214 | Entry point: /xhr_layer/ | ||
215 | Args: | ||
216 | project_id, name, | ||
217 | [vcs_url, dir_path, git_ref], [local_source_dir], [layer_deps | ||
218 | (csv)] | ||
219 | |||
220 | """ | ||
221 | try: | ||
222 | project = Project.objects.get(pk=kwargs['pid']) | ||
223 | |||
224 | layer_data = json.loads(request.body.decode('utf-8')) | ||
225 | |||
226 | # We require a unique layer name as otherwise the lists of layers | ||
227 | # becomes very confusing | ||
228 | existing_layers = \ | ||
229 | project.get_all_compatible_layer_versions().values_list( | ||
230 | "layer__name", | ||
231 | flat=True) | ||
232 | |||
233 | add_to_project = False | ||
234 | layer_deps_added = [] | ||
235 | if 'add_to_project' in layer_data: | ||
236 | add_to_project = True | ||
237 | |||
238 | if layer_data['name'] in existing_layers: | ||
239 | return JsonResponse({"error": "layer-name-exists"}) | ||
240 | |||
241 | layer = Layer.objects.create(name=layer_data['name']) | ||
242 | |||
243 | layer_version = Layer_Version.objects.create( | ||
244 | layer=layer, | ||
245 | project=project, | ||
246 | layer_source=LayerSource.TYPE_IMPORTED) | ||
247 | |||
248 | # Local layer | ||
249 | if 'local_source_dir' in layer_data: | ||
250 | layer.local_source_dir = layer_data['local_source_dir'] | ||
251 | # git layer | ||
252 | elif 'vcs_url' in layer_data: | ||
253 | layer.vcs_url = layer_data['vcs_url'] | ||
254 | layer_version.dirpath = layer_data['dir_path'] | ||
255 | layer_version.commit = layer_data['get_ref'] | ||
256 | layer_version.branch = layer_data['get_ref'] | ||
257 | |||
258 | layer.save() | ||
259 | layer_version.save() | ||
260 | |||
261 | if add_to_project: | ||
262 | ProjectLayer.objects.get_or_create( | ||
263 | layercommit=layer_version, project=project) | ||
264 | |||
265 | # Add the layer dependencies | ||
266 | if 'layer_deps' in layer_data: | ||
267 | for layer_dep_id in layer_data['layer_deps'].split(","): | ||
268 | layer_dep = Layer_Version.objects.get(pk=layer_dep_id) | ||
269 | LayerVersionDependency.objects.get_or_create( | ||
270 | layer_version=layer_version, depends_on=layer_dep) | ||
271 | |||
272 | # Add layer deps to the project if specified | ||
273 | if add_to_project: | ||
274 | created, pl = ProjectLayer.objects.get_or_create( | ||
275 | layercommit=layer_dep, project=project) | ||
276 | layer_deps_added.append( | ||
277 | {'name': layer_dep.layer.name, | ||
278 | 'layerdetailurl': | ||
279 | layer_dep.get_detailspage_url(project.pk)}) | ||
280 | |||
281 | except Layer_Version.DoesNotExist: | ||
282 | return error_response("layer-dep-not-found") | ||
283 | except Project.DoesNotExist: | ||
284 | return error_response("project-not-found") | ||
285 | except KeyError: | ||
286 | return error_response("incorrect-parameters") | ||
287 | |||
288 | return JsonResponse({'error': "ok", | ||
289 | 'imported_layer': { | ||
290 | 'name': layer.name, | ||
291 | 'layerdetailurl': | ||
292 | layer_version.get_detailspage_url()}, | ||
293 | 'deps_added': layer_deps_added}) | ||
205 | 294 | ||
206 | def delete(self, request, *args, **kwargs): | 295 | def delete(self, request, *args, **kwargs): |
296 | """ Delete an imported layer | ||
297 | |||
298 | Method: DELETE | ||
299 | Entry point: /xhr_layer/<layerversion_id> | ||
300 | |||
301 | """ | ||
207 | try: | 302 | try: |
208 | # We currently only allow Imported layers to be deleted | 303 | # We currently only allow Imported layers to be deleted |
209 | layer_version = Layer_Version.objects.get( | 304 | layer_version = Layer_Version.objects.get( |