mirror of https://github.com/sipwise/repoapi.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
5.2 KiB
144 lines
5.2 KiB
# Copyright (C) 2017-2022 The Sipwise Team - http://sipwise.com
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by the Free
|
|
# Software Foundation, either version 3 of the License, or (at your option)
|
|
# any later version.
|
|
#
|
|
# 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, see <http://www.gnu.org/licenses/>.
|
|
import django_filters
|
|
from django.forms.models import model_to_dict
|
|
from django.http import JsonResponse
|
|
from django.shortcuts import get_object_or_404
|
|
from rest_framework import generics
|
|
from rest_framework.parsers import JSONParser
|
|
from rest_framework.permissions import DjangoModelPermissions
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
from rest_framework_api_key.permissions import HasAPIKey
|
|
from rest_framework_yaml.parsers import YAMLParser
|
|
|
|
from . import models
|
|
from . import serializers
|
|
from . import tasks
|
|
from . import utils
|
|
from repoapi.serializers import JenkinsBuildInfoSerializer as JBISerializer
|
|
|
|
|
|
class BuildReleaseFilter(django_filters.FilterSet):
|
|
class Meta:
|
|
model = models.BuildRelease
|
|
fields = ["release", "start_date"]
|
|
order_by = [
|
|
"-start_date",
|
|
]
|
|
|
|
|
|
class BuildReleaseList(generics.ListCreateAPIView):
|
|
permission_classes = [HasAPIKey | DjangoModelPermissions]
|
|
queryset = models.BuildRelease.objects.all().order_by("id")
|
|
serializer_class = serializers.BuildReleaseSerializer
|
|
filter_class = BuildReleaseFilter
|
|
|
|
|
|
class BuildReleaseCleanup(APIView):
|
|
permission_classes = [HasAPIKey | DjangoModelPermissions]
|
|
|
|
def delete(self, request, version, format=None):
|
|
if not version.startswith("release-trunk-"):
|
|
return JsonResponse(
|
|
{"error": f"{version} can not be removed"}, status=403
|
|
)
|
|
qs = models.BuildRelease.objects.filter(release=version).order_by(
|
|
"-start_date"
|
|
)
|
|
build = qs.first()
|
|
if not build or build.done:
|
|
return JsonResponse({}, status=200)
|
|
res = model_to_dict(build)
|
|
build.delete()
|
|
return JsonResponse(res, status=202)
|
|
|
|
|
|
class BuildReleaseDetail(generics.RetrieveDestroyAPIView):
|
|
permission_classes = [HasAPIKey | DjangoModelPermissions]
|
|
queryset = models.BuildRelease.objects.all().order_by("id")
|
|
serializer_class = serializers.BuildReleaseSerializer
|
|
|
|
def perform_destroy(self, instance):
|
|
models.BuildRelease.objects.jbi(instance.uuid).delete()
|
|
instance.delete()
|
|
|
|
def patch(self, request, *args, **kwargs):
|
|
action = request.data.get("action")
|
|
if action is None:
|
|
return JsonResponse({"error": "No action"}, status=400)
|
|
instance = self.get_object()
|
|
if action == "refresh":
|
|
instance.refresh_projects()
|
|
serializer = self.get_serializer(instance)
|
|
return Response(serializer.data)
|
|
elif action == "resume":
|
|
instance.resume()
|
|
serializer = self.get_serializer(instance)
|
|
return Response(serializer.data)
|
|
return JsonResponse({"error": "Action unknown"}, status=400)
|
|
|
|
|
|
class BuildProject(APIView):
|
|
permission_classes = [HasAPIKey | DjangoModelPermissions]
|
|
queryset = models.BuildRelease.objects.all().order_by("id")
|
|
|
|
def post(self, request, release_uuid, project):
|
|
br = get_object_or_404(models.BuildRelease, uuid=release_uuid)
|
|
res = tasks.build_project.delay(br.id, project)
|
|
return JsonResponse({"url": "/flower/task/%s" % res.id}, status=201)
|
|
|
|
|
|
class ReleaseJobs(APIView):
|
|
def get(self, request, release_uuid, format=None):
|
|
br = get_object_or_404(models.BuildRelease, uuid=release_uuid)
|
|
res = models.BuildRelease.objects.release_jobs(br.uuid)
|
|
if res is None:
|
|
return Response([])
|
|
return Response(res)
|
|
|
|
|
|
class ReleaseJobsFull(APIView):
|
|
def get(self, request, release_uuid, format=None):
|
|
br = get_object_or_404(models.BuildRelease, uuid=release_uuid)
|
|
res = models.BuildRelease.objects.release_jobs_full(br.uuid)
|
|
if res is None:
|
|
return Response([])
|
|
return Response(res)
|
|
|
|
|
|
class ReleaseJobsUUID(APIView):
|
|
def get(self, request, release_uuid, job, format=None):
|
|
br = get_object_or_404(models.BuildRelease, uuid=release_uuid)
|
|
jbis = models.BuildRelease.objects.release_jobs_uuids(br.uuid, job)
|
|
if jbis is None:
|
|
return Response([])
|
|
res = list()
|
|
for jbi in jbis:
|
|
serializer = JBISerializer(jbi, context={"request": request})
|
|
res.append(serializer.data)
|
|
return Response(res)
|
|
|
|
|
|
class CheckConfig(APIView):
|
|
parser_classes = [YAMLParser, JSONParser]
|
|
|
|
def post(self, request, format=None):
|
|
try:
|
|
utils.ReleaseConfig("fake", config=request.data)
|
|
return JsonResponse({"result": "All ok"}, status=200)
|
|
except Exception as e:
|
|
return JsonResponse({"error": f"{e}"}, status=406)
|