Exemple #1
0
 def failure_lines(self, request, project, jm, pk=None):
     """
     Get a list of test failure lines for the job
     """
     job = jm.get_job(pk)
     if job:
         queryset = FailureLine.objects.filter(
             job_guid=job[0]['job_guid']
         ).prefetch_related(
             "matches", "matches__matcher"
         )
         failure_lines = [serializers.FailureLineNoStackSerializer(obj).data
                          for obj in queryset]
         return Response(failure_lines)
     return Response("No job with id: {0}".format(pk), status=HTTP_404_NOT_FOUND)
Exemple #2
0
 def failure_lines(self, request, project, pk=None):
     """
     Get a list of test failure lines for the job
     """
     try:
         job = Job.objects.get(repository__name=project,
                               id=pk)
         queryset = FailureLine.objects.filter(
             job_guid=job.guid).prefetch_related(
                 "matches", "matches__matcher"
             )
         failure_lines = [serializers.FailureLineNoStackSerializer(obj).data
                          for obj in queryset]
         return Response(failure_lines)
     except ObjectDoesNotExist:
         return Response("No job with id: {0}".format(pk), status=HTTP_404_NOT_FOUND)
Exemple #3
0
    def _update(self, data, user, many=True):
        by_project = defaultdict(list)

        ids = []
        failure_line_ids = set()
        classification_ids = set()

        for item in data:
            line_id = int(item.get("id"))
            if line_id is None:
                return "No failure line id provided", HTTP_400_BAD_REQUEST

            failure_line_ids.add(line_id)

            if "best_classification" not in item:
                return "No classification id provided", HTTP_400_BAD_REQUEST

            classification_id = item.get("best_classification")

            if classification_id is not None:
                classification_ids.add(classification_id)

            ids.append((line_id, classification_id))

        failure_lines = as_dict(
            FailureLine.objects.prefetch_related('classified_failures').filter(
                id__in=failure_line_ids), "id")

        if len(failure_lines) != len(failure_line_ids):
            missing = failure_line_ids - set(failure_lines.keys())
            return ("No failure line with id: {0}".format(", ".join(missing)),
                    HTTP_404_NOT_FOUND)

        classifications = as_dict(
            ClassifiedFailure.objects.filter(id__in=classification_ids), "id")

        if len(classifications) != len(classification_ids):
            missing = classification_ids - set(classifications.keys())
            return ("No classification with id: {0}".format(
                ", ".join(missing)), HTTP_404_NOT_FOUND)

        for line_id, classification_id in ids:
            failure_line = failure_lines[line_id]
            if classification_id is not None:
                classification = classifications[classification_id]
            else:
                classification = None

            by_project[failure_line.repository.name].append(
                failure_line.job_guid)

            failure_line.mark_best_classification_verified(classification)

        for project, job_guids in iteritems(by_project):
            for job in Job.objects.filter(guid__in=job_guids):
                job.update_after_verification(user)

        # Force failure line to be reloaded, including .classified_failures
        rv = FailureLine.objects.prefetch_related(
            'classified_failures').filter(id__in=failure_line_ids)

        if not many:
            rv = rv[0]

        return (serializers.FailureLineNoStackSerializer(rv, many=many).data,
                HTTP_200_OK)
Exemple #4
0
    def _update(self, data, email, many=True):
        by_project = defaultdict(list)

        ids = []
        failure_line_ids = set()
        classification_ids = set()

        for item in data:
            line_id = int(item.get("id"))
            if line_id is None:
                return "No failure line id provided", 400

            failure_line_ids.add(line_id)

            if "best_classification" not in item:
                return "No classification id provided", 400

            classification_id = item.get("best_classification")

            if classification_id is not None:
                classification_ids.add(classification_id)

            ids.append((line_id, classification_id))

        failure_lines = as_dict(
            FailureLine.objects.prefetch_related('classified_failures').filter(
                id__in=failure_line_ids), "id")

        if len(failure_lines) != len(failure_line_ids):
            missing = failure_line_ids - set(failure_lines.keys())
            return "No failure line with id: {0}".format(
                ", ".join(missing)), 404

        classifications = as_dict(
            ClassifiedFailure.objects.filter(id__in=classification_ids), "id")

        if len(classifications) != len(classification_ids):
            missing = classification_ids - set(classifications.keys())
            return "No classification with id: {0}".format(
                ", ".join(missing)), 404

        for line_id, classification_id in ids:
            failure_line = failure_lines[line_id]
            if classification_id is not None:
                classification = classifications[classification_id]
            else:
                classification = None

            by_project[failure_line.repository.name].append(
                failure_line.job_guid)

            failure_line.best_classification = classification
            failure_line.best_is_verified = True
            failure_line.save()

            if (classification is not None and classification
                    not in failure_line.classified_failures.all()):
                manual_detector = Matcher.objects.get(name="ManualDetector")
                match = FailureMatch(failure_line=failure_line,
                                     classified_failure=classification,
                                     matcher=manual_detector,
                                     score=1.0)
                match.save()

        for project, job_guids in by_project.iteritems():
            with JobsModel(project) as jm:
                jobs = jm.get_job_ids_by_guid(job_guids)
                for job in jobs.values():
                    jm.update_after_verification(job["id"], email)

        # Force failure line to be reloaded, including .classified_failures
        rv = FailureLine.objects.prefetch_related(
            'classified_failures').filter(id__in=failure_line_ids)

        if not many:
            rv = rv[0]

        return serializers.FailureLineNoStackSerializer(rv,
                                                        many=many).data, 200