From 7e80e501fb05021d4f4b6793462c488445cb4d89 Mon Sep 17 00:00:00 2001 From: Michael Wood Date: Fri, 9 Dec 2016 16:52:45 +0000 Subject: bitbake: toaster: api Add layer Add api Add layer adding REST api and remove old views method. (Bitbake rev: 0c8e41d2217fd568a84e857d1be230fcfd4bb5c7) Signed-off-by: Michael Wood Signed-off-by: Richard Purdie --- bitbake/lib/toaster/toastergui/api.py | 101 +++++++++++++++++- .../toaster/toastergui/templates/importlayer.html | 2 +- bitbake/lib/toaster/toastergui/urls.py | 6 +- bitbake/lib/toaster/toastergui/views.py | 115 --------------------- 4 files changed, 103 insertions(+), 121 deletions(-) (limited to 'bitbake') 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 @@ import re import logging +import json from collections import Counter from orm.models import Project, ProjectTarget, Build, Layer_Version @@ -136,14 +137,17 @@ class XhrBuildRequest(View): class XhrLayer(View): - """ Get and Update Layer information """ + """ Delete, Get, Add and Update Layer information + + Methods: POST DELETE PUT + """ def post(self, request, *args, **kwargs): """ Update a layer - Entry point: /xhr_layer/ Method: POST + Entry point: /xhr_layer/ Args: vcs_url, dirpath, commit, up_branch, summary, description, @@ -201,9 +205,100 @@ class XhrLayer(View): return error_response("Could not update layer version entry: %s" % e) - return JsonResponse({"error": "ok"}) + return error_response("ok") + + def put(self, request, *args, **kwargs): + """ Add a new layer + + Method: PUT + Entry point: /xhr_layer/ + Args: + project_id, name, + [vcs_url, dir_path, git_ref], [local_source_dir], [layer_deps + (csv)] + + """ + try: + project = Project.objects.get(pk=kwargs['pid']) + + layer_data = json.loads(request.body.decode('utf-8')) + + # We require a unique layer name as otherwise the lists of layers + # becomes very confusing + existing_layers = \ + project.get_all_compatible_layer_versions().values_list( + "layer__name", + flat=True) + + add_to_project = False + layer_deps_added = [] + if 'add_to_project' in layer_data: + add_to_project = True + + if layer_data['name'] in existing_layers: + return JsonResponse({"error": "layer-name-exists"}) + + layer = Layer.objects.create(name=layer_data['name']) + + layer_version = Layer_Version.objects.create( + layer=layer, + project=project, + layer_source=LayerSource.TYPE_IMPORTED) + + # Local layer + if 'local_source_dir' in layer_data: + layer.local_source_dir = layer_data['local_source_dir'] + # git layer + elif 'vcs_url' in layer_data: + layer.vcs_url = layer_data['vcs_url'] + layer_version.dirpath = layer_data['dir_path'] + layer_version.commit = layer_data['get_ref'] + layer_version.branch = layer_data['get_ref'] + + layer.save() + layer_version.save() + + if add_to_project: + ProjectLayer.objects.get_or_create( + layercommit=layer_version, project=project) + + # Add the layer dependencies + if 'layer_deps' in layer_data: + for layer_dep_id in layer_data['layer_deps'].split(","): + layer_dep = Layer_Version.objects.get(pk=layer_dep_id) + LayerVersionDependency.objects.get_or_create( + layer_version=layer_version, depends_on=layer_dep) + + # Add layer deps to the project if specified + if add_to_project: + created, pl = ProjectLayer.objects.get_or_create( + layercommit=layer_dep, project=project) + layer_deps_added.append( + {'name': layer_dep.layer.name, + 'layerdetailurl': + layer_dep.get_detailspage_url(project.pk)}) + + except Layer_Version.DoesNotExist: + return error_response("layer-dep-not-found") + except Project.DoesNotExist: + return error_response("project-not-found") + except KeyError: + return error_response("incorrect-parameters") + + return JsonResponse({'error': "ok", + 'imported_layer': { + 'name': layer.name, + 'layerdetailurl': + layer_version.get_detailspage_url()}, + 'deps_added': layer_deps_added}) def delete(self, request, *args, **kwargs): + """ Delete an imported layer + + Method: DELETE + Entry point: /xhr_layer/ + + """ try: # We currently only allow Imported layers to be deleted layer_version = Layer_Version.objects.get( diff --git a/bitbake/lib/toaster/toastergui/templates/importlayer.html b/bitbake/lib/toaster/toastergui/templates/importlayer.html index 1f426969af..bd507b5677 100644 --- a/bitbake/lib/toaster/toastergui/templates/importlayer.html +++ b/bitbake/lib/toaster/toastergui/templates/importlayer.html @@ -13,7 +13,7 @@