Skip to content

Commit

Permalink
feat: add documentaton tree details full endpoint
Browse files Browse the repository at this point in the history
Part of #86
Close #810
  • Loading branch information
Francisco2002 committed Feb 6, 2025
1 parent e513c27 commit 179121a
Show file tree
Hide file tree
Showing 3 changed files with 195 additions and 62 deletions.
13 changes: 12 additions & 1 deletion backend/kernelCI_app/typeModels/treeDetails.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
BuildHistoryItem,
DetailsFilters,
Summary,
CommonDetailsBootsResponse,
CommonDetailsTestsResponse,
)
from kernelCI_app.typeModels.treeListing import BaseCheckouts
from pydantic import BaseModel
Expand Down Expand Up @@ -40,6 +42,15 @@ class TreeDetailsBuildsResponse(BaseModel):


class TreeQueryParameters(BaseModel):
origin: str = "maestro"
origin: str
git_url: str
git_branch: str


class TreeDetailsFullResponse(
TreeDetailsBuildsResponse,
CommonDetailsBootsResponse,
CommonDetailsTestsResponse,
SummaryResponse
):
pass
139 changes: 78 additions & 61 deletions backend/kernelCI_app/views/treeDetailsView.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
from typing import List
from django.http import JsonResponse
from http import HTTPStatus
from django.views import View
from kernelCI_app.helpers.errorHandling import create_error_response
from rest_framework.views import APIView
from rest_framework.response import Response
from kernelCI_app.helpers.filters import (
FilterParams,
)
from drf_spectacular.utils import extend_schema
from pydantic import ValidationError
from kernelCI_app.helpers.errorHandling import create_api_error_response
from kernelCI_app.helpers.treeDetails import (
call_based_on_compatible_and_misc_platform,
decide_if_is_boot_filtered_out,
Expand Down Expand Up @@ -33,9 +35,13 @@
from kernelCI_app.viewCommon import create_details_build_summary

from kernelCI_app.typeModels.issues import Issue, IssueDict
from kernelCI_app.typeModels.treeDetails import (
TreeDetailsFullResponse,
TreeQueryParameters
)


class TreeDetails(View):
class TreeDetails(APIView):
def __init__(self):
self.processedTests = set()
self.filters = None
Expand Down Expand Up @@ -159,75 +165,86 @@ def _sanitize_rows(self, rows):
self.build_summary = create_details_build_summary(self.builds)
self.build_issues = convert_issues_dict_to_list(self.processed_build_issues)

@extend_schema(
responses=TreeDetailsFullResponse,
parameters=[TreeQueryParameters],
methods=["GET"]
)
def get(self, request, commit_hash: str | None):
rows = get_tree_details_data(request, commit_hash)

self.filters = FilterParams(request)

if len(rows) == 0:
return create_error_response(
return create_api_error_response(
error_message="Tree not found", status_code=HTTPStatus.OK
)

self._sanitize_rows(rows)

return JsonResponse(
{
"builds": self.builds,
"boots": self.bootHistory,
"tests": self.testHistory,
"summary": {
"builds": {
"status": self.build_summary["builds"],
"architectures": self.build_summary["architectures"],
"configs": self.build_summary["configs"],
"issues": self.build_issues,
"unknown_issues": self.failed_builds_with_unknown_issues,
},
"boots": {
"status": self.bootStatusSummary,
"architectures": list(self.bootArchSummary.values()),
"configs": self.bootConfigs,
"issues": self.bootIssues,
"unknown_issues": self.failedBootsWithUnknownIssues,
"environment_compatible": self.bootEnvironmentCompatible,
"environment_misc": self.bootEnvironmentMisc,
"fail_reasons": self.bootFailReasons,
"failed_platforms": list(self.bootPlatformsFailing),
},
"tests": {
"status": self.testStatusSummary,
"architectures": list(self.test_arch_summary.values()),
"configs": self.test_configs,
"issues": self.testIssues,
"unknown_issues": self.failedTestsWithUnknownIssues,
"environment_compatible": self.testEnvironmentCompatible,
"environment_misc": self.testEnvironmentMisc,
"fail_reasons": self.testFailReasons,
"failed_platforms": list(self.testPlatformsWithErrors),
},
result = {
"builds": self.builds,
"boots": self.bootHistory,
"tests": self.testHistory,
"summary": {
"builds": {
"status": self.build_summary["builds"],
"architectures": self.build_summary["architectures"],
"configs": self.build_summary["configs"],
"issues": self.build_issues,
"unknown_issues": self.failed_builds_with_unknown_issues,
},
"boots": {
"status": self.bootStatusSummary,
"architectures": list(self.bootArchSummary.values()),
"configs": self.bootConfigs,
"issues": self.bootIssues,
"unknown_issues": self.failedBootsWithUnknownIssues,
"environment_compatible": self.bootEnvironmentCompatible,
"environment_misc": self.bootEnvironmentMisc,
"fail_reasons": self.bootFailReasons,
"failed_platforms": list(self.bootPlatformsFailing),
},
"tests": {
"status": self.testStatusSummary,
"architectures": list(self.test_arch_summary.values()),
"configs": self.test_configs,
"issues": self.testIssues,
"unknown_issues": self.failedTestsWithUnknownIssues,
"environment_compatible": self.testEnvironmentCompatible,
"environment_misc": self.testEnvironmentMisc,
"fail_reasons": self.testFailReasons,
"failed_platforms": list(self.testPlatformsWithErrors),
},
},
"common": {
"hardware": list(self.hardwareUsed),
"tree_url": self.tree_url,
"git_commit_tags": self.git_commit_tags,
},
"filters": {
"all": {
"configs": list(self.global_configs),
"architectures": list(self.global_architectures),
"compilers": list(self.global_compilers),
},
"builds": {
"issues": list(self.unfiltered_build_issues),
},
"common": {
"hardware": list(self.hardwareUsed),
"tree_url": self.tree_url,
"git_commit_tags": self.git_commit_tags,
"boots": {
"issues": list(self.unfiltered_boot_issues),
},
"filters": {
"all": {
"configs": list(self.global_configs),
"architectures": list(self.global_architectures),
"compilers": list(self.global_compilers),
},
"builds": {
"issues": list(self.unfiltered_build_issues),
},
"boots": {
"issues": list(self.unfiltered_boot_issues),
},
"tests": {
"issues": list(self.unfiltered_test_issues),
},
"tests": {
"issues": list(self.unfiltered_test_issues),
},
},
safe=False,
)
}

try:
valid_response = TreeDetailsFullResponse(**result)
except ValidationError as e:
return create_api_error_response(
error_message=e.json(), status_code=HTTPStatus.INTERNAL_SERVER_ERROR
)

return Response(valid_response.model_dump())
105 changes: 105 additions & 0 deletions backend/schema.yml
Original file line number Diff line number Diff line change
Expand Up @@ -598,6 +598,28 @@ paths:
responses:
'200':
description: No response body
/api/tree/{commit_hash}/full:
get:
operationId: tree_full_retrieve
parameters:
- in: path
name: commit_hash
schema:
type: string
required: true
tags:
- tree
security:
- cookieAuth: []
- basicAuth: []
- {}
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/TreeDetailsFullResponse'
description: ''
/api/tree/{commit_hash}/summary:
get:
operationId: tree_summary_retrieve
Expand Down Expand Up @@ -660,6 +682,39 @@ paths:
schema:
$ref: '#/components/schemas/CommonDetailsTestsResponse'
description: ''
/api/tree/{tree_name}/{branch}:
get:
operationId: tree_retrieve_2
parameters:
- in: path
name: branch
schema:
type: string
required: true
- in: query
name: origin
schema:
default: maestro
title: Origin
type: string
- in: path
name: tree_name
schema:
type: string
required: true
tags:
- tree
security:
- cookieAuth: []
- basicAuth: []
- {}
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/TreeLatestResponse'
description: ''
components:
schemas:
BuildArchitectures:
Expand Down Expand Up @@ -2102,6 +2157,56 @@ components:
- builds
title: TreeDetailsBuildsResponse
type: object
TreeDetailsFullResponse:
properties:
common:
$ref: '#/components/schemas/TreeCommon'
summary:
$ref: '#/components/schemas/Summary'
filters:
$ref: '#/components/schemas/DetailsFilters'
tests:
items:
$ref: '#/components/schemas/TestHistoryItem'
title: Tests
type: array
boots:
items:
$ref: '#/components/schemas/TestHistoryItem'
title: Boots
type: array
builds:
items:
$ref: '#/components/schemas/BuildHistoryItem'
title: Builds
type: array
required:
- common
- summary
- filters
- tests
- boots
- builds
title: TreeDetailsFullResponse
type: object
TreeLatestResponse:
properties:
git_repository_url:
$ref: '#/components/schemas/Checkout__GitRepositoryUrl'
git_commit_hash:
$ref: '#/components/schemas/Checkout__GitCommitHash'
git_commit_name:
$ref: '#/components/schemas/Checkout__GitCommitName'
api_url:
title: Api Url
type: string
required:
- git_repository_url
- git_commit_hash
- git_commit_name
- api_url
title: TreeLatestResponse
type: object
TreeListingFastResponse:
items:
$ref: '#/components/schemas/CheckoutFast'
Expand Down

0 comments on commit 179121a

Please sign in to comment.